Ändern Sie die Standard-Gruppenseiten zu /messages

Hallo,

Wenn ich von der /g-Seite auf Gruppen zugreife, gibt es eine Möglichkeit, dass die Gruppen-URL, auf die sie verweist, /g/group-slug/messages anstelle von /g/group-slug/members lautet?

Wir haben mehrere Gruppen, die für Gruppen-Nachrichten verwendet werden. Es wäre hilfreich, den Leuten einen Klick weniger zu ersparen, um die Nachrichten für ihre Gruppe zu erreichen. Dies ist für uns wichtiger als die Ansicht der Gruppenmitglieder.

Ich weiß, dass ich dies über einen direkten Link tun kann, aber ich möchte, dass es von der /g?type=my-Seite kommt, die glücklicherweise dynamisch und benutzerzentriert ist.

4 „Gefällt mir“

Es handelt sich nicht um normale Links. Sie werden mit einer Ember-Komponente link-to gehandhabt, und es ist ein wenig Routing damit verbunden.

Der einfachste Weg, dies zu tun, ist, den Klick auf dieses Element abzufangen und dort Ihre Arbeit zu erledigen. Dies kommt in den common > header eines Themas.


  data-template-name="/connectors/group-index-box-after/link-to-group-inbox"

<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`;

         // aktualisiert den Browsertitel und behandelt neue Tabs
         groupLink.href = newHref;

         // leitet den Link weiter
         groupLink.addEventListener("click", (event) => {
            DiscourseURL.routeTo(newHref);
            event.preventDefault();
         }, {once: true})
       }
     }
  });
</script>

Wenn der Benutzer Mitglied der Gruppe ist und die Gruppe Nachrichten hat, wird er zur Inbox weitergeleitet. Andernfalls wird auf die Standardseite /members zurückgefallen.

7 „Gefällt mir“

Wow – das ist erstaunlich!!! Es funktioniert wunderbar. Danke.


später…

Ich habe ein Folgeproblem, bei dem ich ein wenig Hilfe brauche, sorry!

Mehrere meiner Gruppen zeigen immer noch /g/group-slug/messages an, obwohl sie keine haben.
\u003e

Bei näherer Betrachtung hatten sie in der Vergangenheit Nachrichten, die in Themen umgewandelt oder gelöscht wurden. Data Explorer zeigt, dass diese Gruppen in der Tabelle „Groups“ den Wert True für has_messages haben.

Ich habe versucht, dies für diese Gruppen über Rails zu ändern, aber es scheint mir nicht zu gelingen:
\u003e[2] pry(main)\u003e Group.find_by_name("group-slug").has_messages
=\u003e true
[3] pry(main)\u003e Group.find_by_name("group-slug").has_messages = false
=\u003e false
[4] pry(main)\u003e Group.find_by_name("group-slug").has_messages
=\u003e true

Irgendwelche Vorschläge, außer die Gruppen zu löschen und neu zu erstellen (was ich nicht besonders gerne tun würde)?

3 „Gefällt mir“

Sie müssen nur diese Zeile in der Rails-Konsole ausführen. Sie sollte alle Gruppen aktualisieren.

Group.refresh_has_messages!
1 „Gefällt mir“

Das hat für alle bis auf zwei funktioniert – danke. Diese letzten hartnäckigen zwei werde ich wohl einfach löschen und neu erstellen müssen!

Als ich das tat, entdeckte ich den Grund – was ein kleiner Bug ist.

Beim Konvertieren von „Group Private Messages“ in „Topics“ werden die Informationen des Eingeladenen beibehalten. Das ist zwar schön, wenn das „Topic“ zurückkonvertiert wird, bedeutet aber, dass sie fälschlicherweise gezählt werden, wenn Group.refresh_has_messages! ausgeführt wird.

2 „Gefällt mir“

Ist es möglich, auch die Links abzufangen, die Sie erhalten, wenn Sie auf eine @erwähnte Gruppe klicken und dann zur Gruppe durchklicken? Ich denke, das sind die einzigen beiden Möglichkeiten, zu Gruppen zu gelangen, ohne auf URLs zurückzugreifen.

Was ich jetzt suche (gierig, nicht wahr?) ist eigentlich, dass alle Links zu den Gruppen sich genauso verhalten, wie Ihr Code dies für die Seiten /g tut.

1 „Gefällt mir“

@Johani, ist das machbar? Ich habe mich umgesehen und es ist eindeutig weit über meine Bezahlung hinaus.

Sicher, Sie können so etwas im Header-Tab Ihres Themes/Komponenten versuchen. Ich habe einige Kommentare im Snippet hinterlassen, falls Sie mitverfolgen möchten. Sie können diese löschen, sobald Sie bereit sind, es zu verwenden.

Es gelten die gleichen Regeln. Wenn der Benutzer Mitglied der Gruppe ist und die Gruppe Nachrichten hat, navigiert Discourse zur Gruppennachrichtenzentrale. Andernfalls landet der Benutzer im Mitgliederverzeichnis.

<script type="text/discourse-plugin" version="0.8">
  // Teil 1: Ändern Sie den Pfad für die Links in den Gruppenkarten. Dies stellt sicher, dass der Linktitel widerspiegelt, wohin er führt, und behandelt das Öffnen des Links in einem neuen Tab.
  const discourseComputed = require("discourse-common/utils/decorators").default;
  
  api.modifyClass("component:group-card-contents", {
    // Die Eigenschaft groupPath wird verwendet, um die href für die Gruppenlinks
    // in der Gruppenkarte zu generieren. Lassen Sie uns diese modifizieren
    @discourseComputed("group")
    groupPath(group) {
      // Holen Sie sich den Standardwert aus dem Kern
      let groupURL = this._super(...arguments);

      // Wenn der Benutzer unsere Anforderung erfüllt, modifizieren Sie die URL, damit sie zur Nachrichtenzentrale führt
      if (group.is_group_user && group.has_messages) {
        groupURL = `${groupURL}/messages/`;
      }

      // Geben Sie entweder den Standard- oder den modifizierten Wert zurück
      return groupURL;
    }
  });

  // Teil 2: Ändern Sie das In-App-Routing. Dies stellt sicher, dass die normale In-App-Navigation
  // korrekt gehandhabt wird und der Benutzer zur Gruppennachrichtenzentrale geleitet wird, wenn er die
  // Anforderungen erfüllt
  
  const DiscourseURL = require("discourse/lib/url").default;
  const { groupPath } = require("discourse/lib/url");
  const { action } = require("@ember/object");

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

    // showGroup ist hier eine Aktion, die zum User-Card-Controller gehört.
    // Dies wird aufgerufen, wenn Sie auf den Gruppennamen / Avatar innerhalb von Gruppenkarten klicken
    @action
    showGroup(group) {
      // Rufen Sie super auf, um sicherzustellen, dass der Code aus dem Kern zuerst geladen wird
      this._super(...arguments);

      // groupPath ist eine integrierte Discourse-URL-Hilfsfunktion
      let groupURL = groupPath(group.name);

      // Wenn der Benutzer die Anforderungen erfüllt, modifizieren Sie die URL
      if (group.is_group_user && group.has_messages) {
        groupURL = `${groupURL}/messages/`;
      }

      // Rufen Sie routeTo() entweder mit der Standard- oder der modifizierten groupURL auf
      DiscourseURL.routeTo(groupURL);
    }
  });
</script>
2 „Gefällt mir“

Du bist großartig! Es funktioniert hervorragend für alle Fälle, die die Karten verwenden.

Es gibt nun eine Art von Link, die ungerichtet bleibt: die der Gruppe, wenn sie sich in einer Gruppen-Privatnachricht befindet. Dies ist tatsächlich sehr praktisch, um von einer Gruppen-Nachricht zur Gruppe (und damit zum Posteingang) zu navigieren.

Können wir das deiner Meinung nach auch noch einfangen?

(Übrigens werde ich das in ein TC packen und ein Thema dafür erstellen, sobald wir fertig sind, damit es für andere sehr zugänglich ist)

2 „Gefällt mir“

Diese Links verwenden einen etwas anderen Serialisierer – da dort nicht alle Gruppendaten benötigt werden.

Sie können jedoch eine gefilterte Liste der Gruppen des aktuellen Benutzers bei der ersten Seitenansicht speichern und diese als Referenz zur Überprüfung der Mitgliedschaft verwenden. Diese Informationen sind bereits in der anfänglichen Nutzlast verfügbar, sodass kein Mehraufwand in Bezug auf zusätzliche Anfragen oder Ähnliches entsteht. Etwas wie dieses

<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>

Behalten Sie diesen Ausschnitt in seinen eigenen Skript-Tags und fügen Sie ihn zusammen mit den anderen Ausschnitten zur Kopfzeile hinzu. Sie behalten ihn getrennt, da er schnell abbricht, wenn der Benutzer nicht angemeldet ist.

1 „Gefällt mir“

:partying_face: Wir sind angekommen! Es funktioniert hervorragend, auch auf Mobilgeräten.

Danke Joe für deine unglaubliche Ausdauer. Ich sollte meinerseits mein Wort halten und mit der Arbeit an dieser Theme component beginnen, oder?

später…
Hier ist sie:

1 „Gefällt mir“

Ich habe noch eine Sache, bei der ich Hilfe brauche, um das vollständig abzuschließen. Es ist ein bisschen unverschämt zu fragen, ich weiß.

Ich versuche jetzt, Pavilion zu modifizieren, damit es dieses Verhalten auch unterstützt, indem ich die einfache Logik aus Ihren drei großartigen Snippets verwende. Ich bekomme es jedoch aufgrund meiner Unfähigkeit mit JavaScript einfach nicht zum Laufen. Das versuche ich zu modifizieren:

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`);
  },
});

Wie wende ich das Folgende auf das letzte click(){etc}-Bit an? Ich habe alles versucht, was mir einfiel, aber es ist mir nicht gelungen. Ich habe am Ende nur den Link komplett kaputt gemacht.

      if (group.is_group_user && group.has_messages) {
        groupURL = `${groupURL}/messages/`;
      }
1 „Gefällt mir“

Schon gut!!! @keegan hat es gelöst:

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

Bei einigen Gruppen, bei denen es „Nachrichten-Geister“ gibt, funktioniert dies nicht. Diese Gruppen können durch diese Abfrage identifiziert werden (vorausgesetzt, die Nachrichtenübermittlung wurde in den Gruppeneinstellungen für Interaktionen eingeschränkt):

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

Sie können die groups-Tabelle bearbeiten, um dies ebenfalls zurückzusetzen (natürlich in der Rails-Konsole, zuerst sichern!).

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

Wenn dies nicht funktioniert oder rückgängig gemacht wird, müssen Sie möglicherweise auch die Tabellen topic_groups und topic_allowed_groups bereinigen:

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

Dieses Thema wurde nach 30 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr möglich.