Enable tagging only in some categories

This is looking good @neil. One thing that would be good relating to this would be the simple option to ‘enable tags in category’ option in the category modal.

In my use case I only want tags (and specific tags at that) to be able to be used in specific categories. E.g. in those categories where I don’t want tags enabled I wouldn’t want the tag input field to be shown to users. Is this doable?

4 إعجابات

It’s probably doable, but I have to focus on completing some other tag features first. Will have to come back around to this one later.

9 إعجابات

I would love to only enable tags in certain categories as well - bookmarking this thread to keep an eye on the discussion moving forward

I think this is currently possible in the way that you can define tag-groups and you can configure category setting in order to use that tag-group.

do you mean something else?

3 إعجابات

Another feature that would make sense related to this:

If tag filter is enabled, yet only certain categories have tags availble using the ‘Tags that can only be used in this category’ in category settings, I believe the homepage (both the main category, latest and top) pages should have the tag filter disabled by default.

I.e. only when digging down into the categories/sub-categories with tags allowed should the tag filter be shown (showing the respective tags available).

Otherwise from the homepage (whether that be categories or latest), you’ll get a whole bunch of tags in the filter, often without context as they only have context when filtered inside their respective categories.

Does this make sense?

إعجاب واحد (1)

Keen to test this out. Am I able to grab some code somewhere for this? Cheers.

أتفق بنسبة 100%. في مثالنا، لدينا قسم وثائقي مع مجموعة وسوم مخصصة. أريد إظهار قائمة الوسوم المنسدلة هنا، مع عرض الوسوم المخصصة فقط. وهذا يعمل.

لكنني لا أريد أن تكون نفس الوسوم متاحة في القائمة المنسدلة على مستوى “الأحدث” و"الأفضل" العام لكل الفئات. هذا يزيل ميزة تخصيص مجموعات الوسوم لفئات معينة، حسب رأيي، ويُسبب ارتباكًا على المستوى الرئيسي.

يجب أن تظهر فقط الوسوم العالمية غير المخصصة لأي مجموعة وسوم مرتبطة بفئة معينة في قائمة الوسوم المنسدلة على المستوى الرئيسي.

في إعدادات مجموعة الوسوم، يجب أن يكون هناك شيء مثل:

[ ] اقتصار هذه المجموعة من الوسوم على الفئات المخصصة فقط، ولا تظهرها في القوائم المنسدلة على المستوى العلوي

إعجاب واحد (1)

هذا شيء أود أن أراه أيضًا.

في منتداي الأول (المستورد)، كنت بحاجة إلى فئة إعلانات مبوبة.

بما أن Discourse لا يحتوي على شيء مثل “مجلد” يحتوي على فئات كما هو الحال في محركات أخرى مثل vbulletin أو phpbb، فقد كانت لدي ثلاث خيارات أساسية:

  1. فئة إعلانات واحدة لكل من إعلانات “الشراء” و"البيع"، حيث يضيف المستخدمون بأنفسهم بادئة [شراء] أو [بيع] لعنوان الموضوع (مثل 2000…)
  2. فئة إعلانات واحدة حيث يمكن للمستخدمين استخدام وسوم “شراء” أو “بيع”. هذا الخيار هو الأكثر ملاءمة على الإطلاق، لكننا لم نكن نستخدم الوسوم في أي فئة أخرى، وكان المستخدمون سيرون حقل الوسم في المحرر لأي فئة، مما قد يكون مربكًا.
  3. وجود فئتي إعلانات في المستوى الأعلى: “شراء” و"بيع". هذا هو الخيار الذي اخترناه؛

أقوم الآن باستيراد منتدى آخر أكبر، ولدي نفس “المشكلة” تمامًا، باستثناء أنني سأحتاج إلى وسوم لفئتين بدلاً من واحدة: فئة إعلانات مبوبة، وفئة “لغات أخرى” تحتوي فقط على منشورات بلغات أجنبية ستستخدم وسمًا محددًا للغة التي كُتبت بها، مثل “العبرية”، “الدنماركية”، إلخ.

ومرة أخرى، لا نحتاج إلى وسوم لأي فئة أخرى.

أحتاج إلى محدد الوسوم في شريط تنقل قائمة المواضيع لكلتا الفئتين، ولكن ليس للفئات الأخرى.
يمكنني بسهولة إخفاؤه عند الحاجة باستخدام قليل من CSS، لكن المشكلة الرئيسية هي إدخال الوسم في المحرر، الذي لا يمكن عرضه أو إخفاؤه حسب الرغبة…

أعتقد أنه في هذه المرحلة، أفضل طريقة هي تجاوز طريقة tagValidation في المحرر.
في كل مرة يتم فيها اختيار فئة في المحرر، سيتم إخفاء أو إظهار إدخال الوسم بناءً على الفئة المحددة.

عندما يتم إخفاء حقول الوسوم، سيبدو الأمر كالتالي، مع وجود مساحة فارغة:

كما يمكن أن يؤدي ذلك محتملًا إلى كسر التخطيط إذا استخدمنا إضافات أو مكونات سمة تحتوي على حقول محرر مخصصة، مثل إضافة الموقع.

أنا أحاول الطريقة التي فكرت فيها كحل بديل.

إخفاء محدد الوسوم في قائمة المواضيع باستخدام CSS:


(يجب أن تستهدف كل فئة قابلة للوسوم باستخدام محدد CSS الخاص بك)

body:not(.category-other-languages):not(.category-trading-post) {
    .category-breadcrumb .tag-drop {
        display: none;
    }
}

إظهار وإخفاء محدد الوسوم في المؤلف باستخدام JS:

<script type="text/discourse-plugin" version="0.8.23">
    // إظهار محدد الوسوم في المؤلف فقط عند الضرورة
    const discourseComputed = require("discourse-common/utils/decorators").default;
    const EmberObject = require("@ember/object").default;
    function toggleTagChooser(display = "hide") {
        if (display == "show") {
            document.getElementsByClassName("mini-tag-chooser")[0].style.display = "block";
            document.getElementsByClassName("reply-area")[0].classList.add("with-tags");
            return;
        }
        // التحقق من وجود محدد الوسوم
        let tagChoser = document.getElementsByClassName("mini-tag-chooser");
        if(tagChoser.length > 0) {
            tagChoser[0].style.display = "none";
            document.getElementsByClassName("reply-area")[0].classList.remove("with-tags");
        }
        return;
    }
    api.modifyClass('controller:composer', {
        @discourseComputed("model.category", "model.tags", "lastValidatedAt")
        tagValidation(category, tags, lastValidatedAt) {
            // كود مخصص لإظهار وإخفاء محدد الوسوم
            toggleTagChooser("hide");
            if(category != null) {
                if (
                    category.allow_global_tags == true ||
                    category.allowed_tag_groups.length > 0 ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("show");
                }
            }
            // نهاية الكود المخصص
            const tagsArray = tags || [];
            if (this.site.can_tag_topics && !this.currentUser.staff && category) {
                // category.minimumRequiredTags يدمج بين minimum_required_tags و required_tag_groups
                if (category.minimumRequiredTags > tagsArray.length) {
                    return EmberObject.create({
                        failed: true,
                        reason: I18n.t("composer.error.tags_missing", {
                            count: category.minimumRequiredTags,
                        }),
                        lastShownAt: lastValidatedAt,
                    });
                }
            }
        }
    });
</script>
إعجاب واحد (1)

هذا بالضبط ما كنت أبحث عنه. رائع.

من الخطأ بشكل خاص في كود النواة الحالي إظهار مربع اختيار الوسوم عندما لا توجد وسوم ليقوم المستخدم باختيارها لفئة معينة. يحل الكود الأخير هذه المشكلة في تجربة المستخدم. ينبغي أن يكون هذا هو الوضع الافتراضي في النواة @team

بالإضافة إلى ذلك، يجب أن يكون هناك نصان قياسيان لقائمة الوسوم المنسدلة:

“وسوم اختيارية”

ونص آخر في حال كانت الوسوم إلزامية ( ومتاحة للمستخدم ) لفئة معينة

“اختر وسومًا على الأقل X”

إعجاب واحد (1)

من خلال إنشاء مجموعة وسوم، يمكنك جعل استخدام أحد مجموعة من الوسوم (“شراء” أو “بيع”) إلزاميًا لجميع المنشورات في فئة معينة.

إعجاب واحد (1)

لا يزال مربع اختيار الوسوم يظهر مع عبارة “وسوم اختيارية” في المحرر لفئة تحتوي على مجموعة وسوم إلزامية، كما يظهر في الفئات التي لا تتوفر فيها وسوم للمستخدم في فئة أخرى. هذا الأمر مربك من منظور تجربة المستخدم، حيث يضطر المستخدم إلى النقر على نافذة الخطأ المنبثقة لفهم ما هو مطلوب.

إعجاب واحد (1)

أنا أعرف، أريد فقط إخفاء ميزة الوسوم بطريقة ما في الفئات التي لا تتوفر فيها الوسوم، كما يشرح @Terrapop.

عند تعطيل الوسوم في إعدادات الموقع، يظهر منتقي الفئات في نفس سطر عنوان الموضوع:

مع الحل البديل الخاص بي، هناك بعض الهدر في المساحة لأن منتقي الفئات يظهر دائمًا تحت عنوان الموضوع:

من جهة، قد يكون تغيير موقع منتقي الفئات عند اختيار فئة بناءً على ما إذا كانت تتطلب وسومًا أمرًا خاطئًا من حيث تجربة المستخدم. ومن جهة أخرى، نادرًا ما نستخدم منتقي الفئات أكثر من مرة واحدة.

إعجاب واحد (1)

لستُ قلقًا جدًا بشأن إهدار المساحة، لكنني اكتشفتُ “مشكلة” أخرى في كود JS الجميل الخاص بك عمومًا. ربما يمكنك الاطلاع على هذا؟

لدينا مجموعات وسوم مخصصة “للطاقم فقط” (مثل الوسوم المخفية ووسوم النظام) ومجموعات وسوم إلزامية للمستخدمين حسب الفئة. وكلاهما مرتبطان عبر خيار “تقييد هذه المجموعات إلى هذه الفئة”.

الآن، يتحقق هذا الكود فقط مما إذا كانت الفئة تسمح بالوسوم أو إذا كان طول tag_groups أكبر من 0 أو إذا كان عدد allowed_tags أكبر من 0، لكن للأسف هذا صحيح دائمًا لأن لدينا مجموعات وسوم مخصصة للطاقم فقط ضمن المجموعات المقيدة أيضًا.

هل يمكن تعديل الكود ليأخذ في الاعتبار سياق المستخدم، وهل تتوفر وسوم فعلية لهذا المستخدم المحدد؟

 if(category != null) {
                if (
                    category.allow_global_tags == true ||
                    category.allowed_tag_groups.length > 0 ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("visible");
                }
            }

يجب أن يكون من الممكن عدّ العناصر العامة فقط في مصفوفة category.allowed_tag_groups.length للمستخدمين غير المنتمين للطاقم (أو هل تتوفر في المصفوفة الأسماء فقط وليس الحالات؟):

public_category.allowed_tag_groups = [public_tag_group.name, staff_only_tag_group.name]
private_category.allowed_tag_groups = [private_tag_group.name, staff_only_tag_group.name]

حسنًا، تحديث:

في حالتنا، سنقوم بفحص الأسماء في allowed_tag_groups واستبعادها من المصفوفة إذا لم يكن currentUser من الطاقم. لكن هذا حل مؤقت غير نظيف، إذ لا أعرف كيف يمكن إضافة سياق المستخدم هنا (أو حتى إذا كان ذلك ممكنًا في ضوء كود النواة الحالي، لا أعتقد ذلك).

             var non_staff_tag_groups = category.allowed_tag_groups.filter(filterHidden);
                function filterHidden(value) {
                  if(value.toLowerCase().indexOf("hidden") === -1 && value.toLowerCase().indexOf("system") === -1) return value;
                }
                if (
                    category.allow_global_tags == true ||
                    (category.allowed_tag_groups.length > 0 && this.currentUser.staff) ||
                    (non_staff_tag_groups.length > 0 && !this.currentUser.staff) ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("visible");
                }
            }

لكن هذا حيلة غير نظيفة؛ فالقائمة المنسدلة الكاملة للوسوم في المحرر يجب أن تكون أكثر سياقية عبر كود النواة، ويجب أن تأخذ في الاعتبار جميع الحالات المذكورة أعلاه.

إعجابَين (2)

عذرًا، يبدو أنني لم أر رسالتك في عام 2020!

على أي حال، تعطل الكود الخاص بي بعد تحديث حديث لـ Discourse. إليك تحديث يعمل (لا يتغير CSS على الرغم من ذلك):

استهدف فئات الفئات التي تريد إخفاء محدد العلامات عليها:

body:not(.category-other-languages):not(.category-trading-post) {
    .category-breadcrumb .tag-drop {
        display: none;
    }
}

البرنامج النصي الذي سيقوم بتبديل محدد العلامات ديناميكيًا:


    // إظهار منتقي العلامات في المنشئ فقط عند الضرورة
    const discourseComputed = require("discourse-common/utils/decorators").default;
    const EmberObject = require("@ember/object").default;
    function toggleTagChooser(display = "hide") {
        if (display == "show") {
            document.getElementsByClassName("mini-tag-chooser")[0].style.display = "block";
            document.getElementsByClassName("reply-area")[0].classList.add("with-tags");
            return;
        }
        // التحقق من وجود منتقي العلامات
        let tagChoser = document.getElementsByClassName("mini-tag-chooser");
        if(tagChoser.length > 0) {
            tagChoser[0].style.display = "none";
            document.getElementsByClassName("reply-area")[0].classList.remove("with-tags");
        }
        return;
    }
    api.modifyClass('controller:composer', {
        @discourseComputed("model.category", "model.tags", "lastValidatedAt")
        tagValidation(category, tags, lastValidatedAt) {
            // كود مخصص لتبديل منتقي العلامات
            toggleTagChooser("hide");
            if(category != null) {
                if (
                    category.allow_global_tags == true ||
                    category.allowed_tag_groups.length > 0 ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("show");
                }
            }
            // نهاية الكود المخصص
            const tagsArray = tags || [];
            if (this.site.can_tag_topics && !this.currentUser.staff && category) {
                // category.minimumRequiredTags يدمج كلاً من minimum_required_tags و required_tag_groups
                if (category.minimumRequiredTags > tagsArray.length) {
                    return EmberObject.create({
                        failed: true,
                        reason: I18n.t("composer.error.tags_missing", {
                            count: category.minimumRequiredTags,
                        }),
                        lastShownAt: lastValidatedAt,
                    });
                }
            }
        }
    });

بخصوص ذلك… لقد مرت 6 سنوات يا صاح :sweat_smile:

أعتقد أن وظيفة مجموعات العلامات هذه الأيام تمنحك تجربة قريبة.
ستقوم بربط مجموعة علامات بمجموعة من الفئات ثم منع إنشاء علامات جديدة.
لست متأكدًا من pr-welcome هنا، وإزالته، يجب تحديد التغيير المطلوب بشكل صحيح. هذا أعتقد أنه يطلب مربع اختيار في إعدادات الفئة، ولكن حتى هذا يحتاج إلى الكثير من التفكير، هل هو محدد افتراضيًا، هل الإعداد الإضافي مربك ببساطة للكثير من الناس؟