Lorsque vous accédez aux groupes depuis la page /g, est-il possible que l’URL du groupe pointe vers /g/group-slug/messages au lieu de /g/group-slug/members ?
Nous avons plusieurs groupes qui sont utilisés pour les messages de groupe. Il serait utile de faire un clic de moins pour que les utilisateurs accèdent aux messages de leur groupe. C’est plus important pour nous que la vue des membres du groupe.
Je sais que je peux le faire via un lien direct, mais je veux que cela provienne de la page /g?type=my qui est heureusement dynamique et centrée sur l’utilisateur.
Ce ne sont pas des liens ordinaires. Ils sont gérés avec un composant Ember link-to, et il y a un peu de routage impliqué.
La façon la plus simple de faire cela est d’intercepter le clic sur cet élément et de faire votre travail là. Ceci va dans le common > header d’un thème
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`;
// met à jour le titre du navigateur et gère le nouvel onglet
groupLink.href = newHref;
// redirige le lien
groupLink.addEventListener("click", (event) => {
DiscourseURL.routeTo(newHref);
event.preventDefault();
}, {once: true})
}
}
});
</script>
Si l’utilisateur est membre du groupe et que le groupe a des messages, il sera redirigé vers la boîte de réception. Sinon, il reviendra à la page par défaut /members.
En y regardant de plus près, ils ont eu des messages par le passé, qui ont été convertis en Sujets ou supprimés. Data Explorer révèle que ces groupes ont True dans has_messages dans la table Groups.
J’ai essayé de le changer pour ces groupes via Rails mais je n’arrive pas à y parvenir :
\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
Des suggestions à part supprimer les groupes et les recréer (ce que je ne suis pas très enthousiaste à faire) ?
Cela a fonctionné pour tous sauf deux – merci. Je pense que je vais devoir supprimer et recréer ces deux derniers récalcitrants !
En faisant cela, j’ai découvert la raison – qui est un Bug mineur.
Lors de la conversion des messages privés de groupe en sujets, les informations de l’invité sont conservées. Bien que ce soit bien si le sujet est reconverti, cela signifie qu’ils sont comptés à tort lorsque Group.refresh_has_messages! est exécuté.
Est-il possible d’intercepter également les liens que vous obtenez lorsque vous cliquez sur un groupe @mentionné, puis que vous cliquez pour accéder au groupe ? Je pense que ce sont les deux seules façons d’accéder aux groupes sans recourir aux URL.
Ce que je recherche maintenant (avide, n’est-ce pas ?) est en fait d’avoir tous les liens vers les groupes se comporter de la même manière que votre code le fait pour ceux de la page /g.
Bien sûr, vous pouvez essayer quelque chose comme ceci dans l’onglet d’en-tête de votre thème/composant. J’ai laissé quelques commentaires dans l’extrait si vous souhaitez suivre. Vous pouvez les supprimer une fois que vous êtes prêt à l’utiliser.
Les mêmes règles s’appliquent. Si l’utilisateur est membre du groupe et que le groupe a des messages, Discourse naviguera vers la boîte de réception du groupe. Sinon, l’utilisateur atterrira sur le répertoire des membres.
<script type="text/discourse-plugin" version="0.8">
// Partie 1 : modifier le chemin des liens dans les cartes de groupe. Cela garantit que le titre du lien
// reflète où il mène et gère l'ouverture du lien dans un nouvel onglet.
const discourseComputed = require("discourse-common/utils/decorators").default;
api.modifyClass("component:group-card-contents", {
// La propriété groupPath est utilisée pour générer le href des liens de groupe
// dans la carte de groupe. Modifions-la
@discourseComputed("group")
groupPath(group) {
// obtenir la valeur par défaut du cœur
let groupURL = this._super(...arguments);
// si l'utilisateur correspond à notre exigence, modifier l'url pour qu'elle pointe vers la boîte de réception
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
// retourner la valeur par défaut ou modifiée
return groupURL;
}
});
// Partie 2 : modifier le routage dans l'application. Cela garantit que la navigation normale dans l'application est
// gérée correctement et dirige l'utilisateur vers la boîte de réception du groupe s'il remplit les
// conditions requises
const DiscourseURL = require("discourse/lib/url").default;
const { groupPath } = require("discourse/lib/url");
const { action } = require("@ember/object");
api.modifyClass("controller:user-card", {
// showGroup est ici une action qui appartient au contrôleur user-card.
// C'est ce qui est appelé lorsque vous cliquez sur le nom/avatar du groupe à l'intérieur des cartes de groupe
@action
showGroup(group) {
// appeler super pour s'assurer que le code du cœur est chargé en premier
this._super(...arguments);
// group path est une fonction d'aide d'URL Discourse intégrée
let groupURL = groupPath(group.name);
// si l'utilisateur correspond aux exigences, modifier l'url
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
// appeler routeTo() avec l'url de groupe par défaut ou modifiée
DiscourseURL.routeTo(groupURL);
}
});
</script>
Vous êtes incroyable ! Cela fonctionne très bien pour tous les cas qui utilisent les cartes.
Il existe maintenant un type de lien qui reste non dirigé : celui du groupe lorsqu’il s’agit d’un message privé de groupe. C’est en fait très pratique pour naviguer vers le groupe (et donc vers la boîte de réception) à partir d’un message de groupe.
Pensez-vous que nous puissions l’attraper aussi dans le réseau ?
(Au fait, je vais empaqueter cela dans un TC et créer un sujet à ce sujet une fois que nous aurons terminé, afin que ce soit très accessible pour les autres)
Ces liens utilisent un sérialiseur légèrement différent, car toutes les données du groupe ne sont pas nécessaires ici.
Néanmoins, vous pouvez stocker une liste filtrée des groupes de l’utilisateur actuel lors de la visualisation initiale de la page et les utiliser comme référence pour vérifier l’appartenance. Ces informations sont déjà disponibles dans la charge utile initiale, il n’y a donc pas de surcharge en termes de requêtes supplémentaires ou quoi que ce soit de ce genre. Quelque chose comme ceci :
Conservez cet extrait dans ses propres balises script et ajoutez-le à l’en-tête avec les autres extraits. Vous le gardez séparé car il s’arrête rapidement si l’utilisateur n’est pas connecté.
J’ai encore une chose pour laquelle j’ai besoin d’aide afin de terminer ceci. C’est un peu culotté de demander, je sais.
J’essaie maintenant de modifier Pavilion afin qu’il puisse également prendre en charge ce comportement, en utilisant la logique simple de vos trois excellents extraits. Cependant, je n’arrive pas à le faire fonctionner en raison de mon incompétence en javascript. Voici ce que j’essaie de modifier :
Comment puis-je appliquer le passage ci-dessous à cela ? J’ai essayé tout ce à quoi j’ai pu penser pour le dernier click(){etc} mais j’ai échoué. Je finis par casser complètement le lien.
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
Pour certains groupes où il y a des « fantômes de messages », cela ne fonctionne pas. Ces groupes peuvent être identifiés par cette requête (à condition que la messagerie ait été restreinte dans les paramètres d’interaction du groupe) :
SELECT id, name, has_messages, messageable_level
From groups
Where messageable_level < 10
AND messageable_level <> 3
AND has_messages = true
ORDER by id
Vous pouvez modifier la table groups pour forcer la réinitialisation également (dans la console Rails bien sûr, sauvegardez d’abord !).