تحسين التنقل للعلامات (المنظمة)

مرحبًا بالجميع،

أحاول ضمان ظهور الوسوم بشكل أكثر تنظيماً في شريط التنقل، خاصة لأولئك منا الذين يعتمدون على Parent > Children. لدينا ما يزيد قليلاً عن 40 وسمًا، لذا فإن التنقل المنظم للوسوم (وهو، تنبيه من منصة، مُستغَل بشكل قاصر جدًا من قبل العديد من المنتديات، بينما يتفوق فيه Discourse!) أمر حيوي للغاية.

بما أنه من غير المنطقي إضافة قوائم متعددة فوق شريط تنقل Discourse الأصلي، فإن اقتراحي (أعتقد؟) ليس شيئًا دراميًا للغاية. قمت بتصميم نموذج أولي غير احترافي لهذه الفكرة…

إذا كان شيء مشابه لهذا موجودًا، فلا يمكنني العثور عليه. أقرب ما وجدته هو المكون الخاص بـ @Johani، لكنه للأسف غير منظم.

على أي حال، سأقدّر أي ملاحظات، حتى لو كانت “هذا لا معنى له” أو “استغرق مني 10 ثوانٍ فقط للعثور على هذا على GitHub، يا مبتدئ.”

شكرًا لكم!

إعجابَين (2)

نظرًا لعدد وسوم parent > child التي قد تحتويها بعض المواقع، فلن تتسع جميعها هناك.

على سبيل المثال: انظر إلى وسوم ميتا

https://meta.discourse.org/tags

إعجابَين (2)

أتفهم ذلك—وأود القول إن مثال ‘meta’ الذي يمشي على أطراف الأصابع ليس أفضل طريقة لاستخدام الوسوم، وليس لأن هناك ممارسة مثالية واضحة للوسوم. لكن حتى كخيار فقط لأولئك منا الذين يمتلكون مفردات مضبوطة حول الوسوم ويعتمدون عليها بشكل كبير (أكثر بكثير من الفئات)، فقد يكون هذا مفيدًا. مثال كان مجرد ذلك… أشك في أن الآخرين قد يكون لديهم فكرة أفضل!

إعجابَين (2)

لماذا لا تستخدم صفحة الوسوم ببساطة؟ يمكنك تسليط الضوء على رابط تلك الصفحة بطرق مختلفة. تدعم الصفحة نفسها الترتيب حسب المجموعات افتراضيًا.

ثم يمكنك إضافة أنماط مخصصة، إما للوسوم:

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

إعجابَين (2)

نعم، أحببنا صفحة الوسوم—وأنا أقدّر مرونتها. إنها رائعة. لكن صفحة الوسوم ليست موجودة في كل مكان، في حين أن القائمة ستوفر تنقلًا ديناميكيًا وشاملًا، تمامًا كما تفعل مع الفئات.

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

ومع ذلك، ربما لم تكونوا مستعدين لهذا بعد. لكن أطفالكم سيحبونه بالتأكيد. :wink:

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

سأكون سعيدًا إذا وجدت حلاً أكثر ديناميكية! لكنني أعتقد أنه سيتطلب قدرًا كبيرًا من البرمجة إذا كنت تريد شيئًا لا تحتاج إلى صيانته يدويًا. حتى ذلك الحين، سأقوم فقط بجعل رابط صفحة الوسوم أكثر شيوعًا :wink:

Screenshot from 2021-10-22 21-57-26

الجانب الآخر الذي يجعل الوسوم أكثر سهولة في الاستخدام من تجربتي هو وجود لافتات وسوم مناسبة. لقد قمت بإنشاء مكون بسيط كإضافة لمكون لافتات الوسوم يتيح لك إضافة وصف للوسوم: https://github.com/nolosb/discourse-tag-banners-descriptions

3 إعجابات

اتجاه مختلف قليلاً: لقد جعلت عرض الوسوم في المواضيع وقوائم المواضيع يعرض التسلسل الهرمي على شكل خرائط مسار: «الأب > الابن» بدلاً من «الابن، الأب».

كان حلّي مخصصًا للموقع إلى حد ما ومعقدًا بعض الشيء، لكن النتيجة النهائية مُرضية.

أكبر عائق أمام ما قمت به، وما ترغب في القيام به، هو أن منصة Discourse لا تحمّل مجموعات الوسوم مسبقًا، لذا فهي غير متاحة عند الحاجة إليها دون إجراء طلب إلى واجهة برمجة التطبيقات (API). أعتقد أنه ينبغي عليها ذلك، تمامًا كما يتم تحميل هيكل التصنيفات مسبقًا.

3 إعجابات

المشكلة هنا هي محدودية المساحة وليست محدودية تقنية.

كما هو موضح هنا

تخيل تجربتك كمستخدم؛ إذا فتحت قائمة على موقع ويب، ستبدو هكذا.

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

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

إذن، كيف تفعل ذلك؟

إليك الكود:

<script type="text/discourse-plugin" version="0.8">
const MAX_TAGS_TO_SHOW = 20;
const Category = require("discourse/models/category").default;
const siteSettings = api.container.lookup("site-settings:main");
const tagStyle = siteSettings.tag_style;

const getNumberOfTags = (tags, categoryTagsGroups) => {
  let count = 0;
  count = tags.length;
  for (const categoryTagsGroup of categoryTagsGroups) {
    count = count + categoryTagsGroup.tags.length;
  }
  return count;
};

fetch("/tags.json")
  .then(response => response.json())
  .then(data => {
    try {
      const tags = data.tags;
      const hasCategoryTagGroups = data.extras?.categories;

      if (hasCategoryTagGroups) {
        const categoryTagsGroups = data.extras.categories;
        let moreCount = getNumberOfTags(tags, categoryTagsGroups);
        let visibleCount = 0;

        const content = [];
        for (const categoryTagsGroup of categoryTagsGroups) {
          const category = Category.findById(categoryTagsGroup.id);
          const name = category.name;
          const childTags = categoryTagsGroup.tags;
          const childTagNodes = [];

          childTags.forEach((tag, index) => {
            if (visibleCount <= MAX_TAGS_TO_SHOW) {
              childTagNodes.push(
                api.h(
                  "li.tag-link-item",
                  api.h(
                    `a.discourse-tag.tag-link.${tagStyle}`,
                    { href: `/tag/${tag.text}` },
                    tag.text
                  )
                )
              );
              moreCount--;
              visibleCount++;
            }
          });

          if (childTagNodes.length) {
            content.push([
              api.h("li.heading", api.h("span", name)),
              childTagNodes
            ]);
          }
        }

        api.decorateWidget("menu-links:after", helper => {
          if (helper.attrs.name !== "general-links") return;
          return api.h("div.clearfix", [
            api.h("ul.tag-links", [
              api.h("a.categories-link", { href: "/tags" }, [
                "وسوم ",
                moreCount ? `(${moreCount} المزيد)...` : ""
              ]),
              content
            ]),
            api.h("hr")
          ]);
        });
      }
    } catch (error) {
      console.error("هناك مشكلة في مكون سمة وسوم قائمة الهامبرغر");
      console.error(error);
    }
  })
  .catch(console.error);

</script>

يتم وضع هذا في تبويب header من سمتك. يمكنك تغيير

const MAX_TAGS_TO_SHOW = 20;

في الأعلى إلى عدد الوسوم التي تريد عرضها.

ثم كل ما تحتاج إلى إضافته هو بعض CSS لتنسيق الروابط. إليك شيئًا أساسيًا لتبدأ به.

.tag-links {
  .heading {
    padding: 0.25em 0.5em;
  }
  .tag-link-item {
    background-color: transparent;
    display: inline-flex;
    align-items: center;
    padding: 0.25em 0.5em;
    width: 50%;
    box-sizing: border-box;
    .tag-link {
      display: inline-flex;
      width: 100%;
      &:hover {
        color: var(--primary);
      }
    }
  }
}

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

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

لذا، دعنا نخفيها بشيء مثل هذا.

.panel-body {
  .category-links,
  .categories-separator,
  .widget-link[href="/tags"] {
    display: none;
  }
}

أخيرًا، كما هو موضح هنا:

لا يتم تمرير هذه البيانات إلى العميل افتراضيًا إلا إذا قمت بزيارة /tags، لذا فإن الكود أعلاه يضيف طلبًا إضافيًا على الصفحة الرئيسية (يعمل مرة واحدة فقط لكل زيارة). تحاول ديسكورد إبقاء الأشياء بسيطة جدًا، لذا، ما لم تكن البيانات ضرورية، فلن يتم تحميلها افتراضيًا.

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

7 إعجابات

شكرًا لك، جو، هذا رائع!

بضع نقاط سريعة … لقد لاحظت أن ردك الأصلي استخرج البيانات حسب مجموعة الوسوم (بدلاً من الوسوم الفرعية). هل هناك سبب لذلك؟ لم أتمكن من إظهار الوسوم الفرعية، لكنني نجحت باستخدام ردك الأولي مع مجموعة الوسوم.

المشكلة الوحيدة هي أن الوسوم غير مرئية للمستخدمين غير المسجلين. أفترض أن هذا يتعلق بـ API؟ هل هناك طريقة لتجاوز ذلك؟

بخلاف ذلك، هذا نعمة كبيرة — يمكنني بالتأكيد رؤية آخرين يستخدمون هذا الكود. شكرًا جزيلاً لك!

إعجابَين (2)

لقد أنشأت مكونًا للسمات من شأنه أن يجعل هذا الأمر أسهل قليلاً. يمكنك الاختيار بين

  1. مجموعات الوسوم المتداخلة
  2. وسوم الفئات المسموح بها المتداخلة
  3. وسوم عليا مسطحة

مزيد من التفاصيل هنا

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

أرشّح جو ليكون القديس الراعي لمنصة Discourse.

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

هاهاها، كنت مشغولًا بإنشاء واحد أيضًا لدورة التدريب الخاصة بي.

للأسف.

شكرًا على أي حال

إعجابَين (2)