تغيير صفحات المجموعة الافتراضية إلى /messages

مرحباً،

عند الوصول إلى المجموعات من صفحة /g، هل هناك طريقة لجعل عنوان URL للمجموعة الذي تشير إليه هو /g/group-slug/messages بدلاً من /g/group-slug/members؟

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

أعلم أنه يمكنني القيام بذلك عن طريق رابط مباشر، ولكني أريده أن يكون من صفحة /g?type=my التي تتميز بالديناميكية والتركيز على المستخدم.

4 إعجابات

إنها ليست روابط عادية. يتم التعامل معها باستخدام مكون Ember link-to، وهناك بعض التوجيه المتضمن.

أسهل طريقة للقيام بذلك هي اختطاف النقر على هذا العنصر والقيام بعملك هناك. هذا يذهب في common > header من سمة


  type="text/x-handlebars"
  data-template-name="/connectors/group-index-box-after/link-to-group-inbox"
></script>

<script type="text/discourse-plugin" version="0.8">
  const DiscourseURL = require("discourse/lib/url").default;
  api.registerConnectorClass('group-index-box-after', 'link-to-group-inbox', {
    setupComponent(args) {
      const group = args.model;

       if (group.is_group_user && group.has_messages) {
         const groupLink = document.querySelector(`.group-box.${group.name}`);
         const newHref = `/g/${group.name}/messages`;

         // updates browser title and handle new tab
         groupLink.href = newHref;

         // redirect the link
         groupLink.addEventListener("click", (event) => {
            DiscourseURL.routeTo(newHref);
            event.preventDefault();
         }, {once: true})
       }
     }
  });
</script>

إذا كان المستخدم عضوًا في المجموعة وكانت المجموعة تحتوي على رسائل، فسيتم إعادة توجيهه إلى صندوق الوارد. وإلا، فسيعود إلى الصفحة الافتراضية /members.

7 إعجابات

رائع - هذا مذهل!!! إنه يعمل بشكل رائع. شكراً لك.


لاحقاً…

لدي مشكلة متابعة أحتاج فيها إلى القليل من المساعدة، آسف!

لا تزال العديد من مجموعاتي تعرض /g/group-slug/messages على الرغم من عدم وجود أي منها.

عند الفحص الدقيق، كانت لديهم رسائل في الماضي، تم تحويلها إلى مواضيع أو حذفها. يكشف مستكشف البيانات أن هذه المجموعات لديها True في has_messages في جدول المجموعات.

لقد حاولت تغييرها لهذه المجموعات عبر Rails ولكني لا أستطيع تحقيق ذلك:

[2] pry(main)> Group.find_by_name(“group-slug”).has_messages
=> true
[3] pry(main)> Group.find_by_name(“group-slug”).has_messages = false
=> false
[4] pry(main)> Group.find_by_name(“group-slug”).has_messages
=> true

أي اقتراحات بخلاف حذف المجموعات وإعادة إنشائها (وهو ما لست متحمساً جداً لفعله)؟

3 إعجابات

تحتاج فقط إلى تشغيل هذا السطر في وحدة تحكم rails. يجب أن يقوم بتحديث جميع المجموعات.

Group.refresh_has_messages!
إعجاب واحد (1)

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

عند القيام بذلك، اكتشفت السبب - وهو #خطأ بسيط.

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

إعجابَين (2)

هل من الممكن أيضًا اعتراض الروابط التي تحصل عليها عند النقر على مجموعة تم ذكرها (@mentioned) ثم النقر للانتقال إلى المجموعة؟ أعتقد أن هذه هي الطريقتان الوحيدتان للوصول إلى المجموعات دون اللجوء إلى عناوين URL.

ما أبحث عنه الآن (جشع، أليس كذلك؟) هو في الواقع جعل جميع الروابط إلى المجموعات تتصرف بنفس الطريقة التي تجعل بها الكود الخاص بك تلك الموجودة في صفحة /g.

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

@Johani، هل هذا ممكن؟ لقد بحثت قليلاً، ومن الواضح أنه يتجاوز قدراتي بكثير.

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

<script type="text/discourse-plugin" version="0.8">
  // الجزء الأول: تعديل المسار للروابط في بطاقات المجموعات. هذا يضمن أن
  // عنوان الرابط يعكس المكان الذي يؤدي إليه ويتعامل مع فتح الرابط في علامة تبويب جديدة.
  const discourseComputed = require("discourse-common/utils/decorators").default;
  
  api.modifyClass("component:group-card-contents", {
    // خاصية groupPath تُستخدم لإنشاء href لروابط المجموعة
    // في بطاقة المجموعة. دعنا نعدلها
    @discourseComputed("group")
    groupPath(group) {
      // الحصول على القيمة الافتراضية من النواة
      let groupURL = this._super(...arguments);

      // إذا كان المستخدم يطابق متطلباتنا، قم بتعديل عنوان URL بحيث يؤدي إلى صندوق الوارد
      if (group.is_group_user && group.has_messages) {
        groupURL = `${groupURL}/messages/`;
      }

      // إرجاع القيمة الافتراضية أو المعدلة
      return groupURL;
    }
  });

  // الجزء الثاني: تعديل التوجيه داخل التطبيق. هذا يضمن أن التنقل العادي داخل التطبيق
  // يتم التعامل معه بشكل صحيح ويوجه المستخدم إلى صندوق الوارد للمجموعة إذا استوفى
  // المتطلبات
  
  const DiscourseURL = require("discourse/lib/url").default;
  const { groupPath } = require("discourse/lib/url");
  const { action } = require("@ember/object");

  api.modifyClass("controller:user-card", {

    // showGroup هنا هو إجراء ينتمي إلى وحدة تحكم user-card.
    // هذا هو ما يتم استدعاؤه عند النقر على اسم المجموعة / الصورة الرمزية داخل بطاقات المجموعات
    @action
    showGroup(group) {
      // استدعاء super للتأكد من تحميل الكود من النواة أولاً
      this._super(...arguments);

      // group path هي وظيفة مساعدة لعنوان URL مدمجة في Discourse
      let groupURL = groupPath(group.name);

      // إذا كان المستخدم يطابق المتطلبات، قم بتعديل عنوان URL
      if (group.is_group_user && group.has_messages) {
        groupURL = `${groupURL}/messages/`;
      }

      // استدعاء routeTo() إما بعنوان URL الافتراضي للمجموعة أو المعدل
      DiscourseURL.routeTo(groupURL);
    }
  });
</script>

إعجابَين (2)

أنت مذهل! إنه يعمل بشكل رائع مع أي حالة تستخدم البطاقات.

هناك الآن نوع واحد من الروابط لا يزال غير موجه: وهو المجموعة عند وجودها في رسالة خاصة جماعية. هذا مفيد جدًا للتنقل إلى المجموعة (وبالتالي إلى صندوق الوارد) من رسالة جماعية.

هل يمكننا التقاط ذلك في الشبكة أيضًا، هل تعتقد؟

(بالمناسبة، سأقوم بتعبئة هذا في TC وإنشاء موضوع له بمجرد الانتهاء حتى يكون متاحًا بسهولة للآخرين)

إعجابَين (2)

تستخدم هذه الروابط مُسلسِلًا مختلفًا قليلاً - لأنه لا يلزم وجود كل بيانات المجموعة هناك.

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

<script type="text/discourse-plugin" version="0.8">
  const user = api.getCurrentUser();

  if (!user) {
    return;
  }

  const userGroups = user.groups.map(group => group.name);

  api.reopenWidget("pm-map-user-group", {
    transform(attrs) {

      const group = attrs.group;
      const isGroupUser = Object.values(userGroups).includes(group.name);

      // {href: "/g/foo"};
      let groupURL = this._super(...arguments);

      if (isGroupUser && group.has_messages) {
        groupURL.href = `${groupURL.href}/messages/`;
      }

      return groupURL;
    }
  });
</script>

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

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

:partying_face: لقد وصلنا! إنه يعمل بشكل رائع، وكذلك على الهاتف المحمول.

شكرًا جو على مثابرتك المذهلة. من الأفضل أن أفي بجانبي من الصفقة وأبدأ العمل على هذا #theme-component، أليس كذلك؟

بعد فترة…
ها هو ذا:

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

لدي شيء أخير أحتاج مساعدة فيه لإكماله تمامًا. أعرف أن هذا طلب جريء.

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

createWidget('layouts-group-link', {
  tagName: 'li.layouts-group-link',
  buildKey: (attrs) => `layouts-group-link-${attrs.id}`,

  getGroupTitle(group) {
    return h('span.group-title', group.name);
  },

  isOwner(group) {
    if (group.owner) {
      return h('span.group-owner-icon', iconNode('shield-alt'));
    }
  },

  html(attrs) {
    const contents = [this.getGroupTitle(attrs), this.isOwner(attrs)];
    return contents;
  },

  click() {
      DiscourseURL.routeTo(`/g/${this.attrs.name}/messages`);
  },
});

كيف أطبق الجزء أدناه على ذلك؟ لقد جربت كل ما يمكنني التفكير فيه في آخر جزء click(){etc} ولكنني فشلت. لقد انتهى بي الأمر إلى كسر الرابط تمامًا.

      if (group.is_group_user && group.has_messages) {
        groupURL = `${groupURL}/messages/`;
      }
إعجاب واحد (1)

لا مشكلة!!! @keegan قام بحلها:

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.

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

SELECT id, name, has_messages, messageable_level
From groups
Where messageable_level < 10
AND messageable_level <> 3
AND has_messages = true
ORDER by id

يمكنك اختراق جدول groups لإجبار هذا على إعادة التعيين أيضًا (في وحدة تحكم Rails بالطبع، قم بعمل نسخة احتياطية أولاً!).

Group.where(id: XXX).update_all(has_messages: false)

إذا لم ينجح هذا أو عاد، فقد تحتاج أيضًا إلى تنظيف جدولي topic_groups و topic_allowed_groups:

TopicGroup.where(group_id: XXX).destroy_all
TopicAllowedGroup.where(group_id: XXX).destroy_all

تم إغلاق هذا الموضوع تلقائيًا بعد 30 يومًا. لم يعد يُسمح بالردود الجديدة.