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.
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.
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)?
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.
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.
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>
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.
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
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.
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:
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/`;
}
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!).
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: