Accedendo ai gruppi dalla pagina /g, c’è un modo per far sì che l’URL del gruppo a cui punta sia /g/group-slug/messages invece di /g/group-slug/members?
Abbiamo diversi gruppi che vengono utilizzati per i messaggi di gruppo. Sarebbe utile dare alle persone un clic in meno per raggiungere i messaggi del loro gruppo. Questo è più importante per noi della visualizzazione dei membri del gruppo.
So che posso farlo tramite un link diretto, ma voglio che provenga dalla pagina /g?type=my che è utilmente dinamica e incentrata sull’utente.
Non sono link normali. Sono gestiti con un componente Ember link-to e c’è un po’ di routing coinvolto.
Il modo più semplice per farlo è intercettare il click su quell’elemento e fare il tuo lavoro lì. Questo va nel common > header di un tema
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`;
// aggiorna il titolo del browser e gestisce la nuova scheda
groupLink.href = newHref;
// reindirizza il link
groupLink.addEventListener("click", (event) => {
DiscourseURL.routeTo(newHref);
event.preventDefault();
}, {once: true})
}
}
});
</script>
Se l’utente è membro del gruppo e il gruppo ha messaggi, verrà reindirizzato alla posta in arrivo. Altrimenti, tornerà alla pagina predefinita /members.
Ispezionando più da vicino, in passato hanno avuto messaggi, che sono stati convertiti in Argomenti o eliminati. Data Explorer rivela che questi gruppi hanno True in has_messages nella tabella Groups.
Ho provato a cambiarlo per questi gruppi tramite Rails ma non riesco a ottenerlo:
\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
Qualsiasi suggerimento, a parte eliminare i gruppi e ricrearli (cosa che non mi entusiasma molto)?
Questo ha funzionato per tutti tranne due, grazie. Quei due ostinati alla fine li eliminerò e li ricreerò!
Facendo ciò, ho scoperto il motivo, che è un Bug minore.
Quando si convertono i messaggi privati di gruppo in argomenti, le informazioni dell’invitato vengono mantenute. Sebbene questo sia utile se l’argomento viene riconvertito, significa che vengono conteggiati erroneamente quando viene eseguito Group.refresh_has_messages!.
È possibile intercettare anche i link che si ottengono quando si fa clic su un gruppo @menzionato e poi si fa clic per accedere al gruppo? Penso che questi siano gli unici due modi per accedere ai gruppi senza ricorrere agli URL.
Quello che sto cercando ora (sono avido, vero?) è in realtà far sì che tutti i link ai gruppi si comportino allo stesso modo di quelli della pagina /g che il tuo codice gestisce.
Certamente, puoi provare qualcosa di simile nella scheda header del tuo tema/componente. Ho lasciato alcuni commenti nello snippet se vuoi seguirli. Puoi eliminarli una volta che sei pronto per usarlo.
Valgono le stesse regole. Se l’utente è membro del gruppo e il gruppo ha messaggi, Discourse navigherà alla casella di posta del gruppo. Altrimenti, l’utente atterrerà nella directory dei membri.
<script type="text/discourse-plugin" version="0.8">
// Parte 1: modifica il percorso per i link nelle schede dei gruppi. Questo assicura che il titolo
// del link rifletta dove porta e gestisca l'apertura del link in una nuova scheda.
const discourseComputed = require("discourse-common/utils/decorators").default;
api.modifyClass("component:group-card-contents", {
// La proprietà groupPath viene utilizzata per generare l'href per i link dei gruppi
// nella scheda del gruppo. Modifichiamola
@discourseComputed("group")
groupPath(group) {
// ottieni il valore predefinito dal core
let groupURL = this._super(...arguments);
// se l'utente corrisponde al nostro requisito, modifica l'url in modo che vada alla casella di posta
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
// restituisci il valore predefinito o modificato
return groupURL;
}
});
// Parte 2: modifica il routing in-app. Questo assicura che la normale navigazione in-app sia
// gestita correttamente e porti l'utente alla casella di posta del gruppo se soddisfa i
// requisiti
const DiscourseURL = require("discourse/lib/url").default;
const { groupPath } = require("discourse/lib/url");
const { action } = require("@ember/object");
api.modifyClass("controller:user-card", {
// showGroup qui è un'azione che appartiene al controller user-card.
// Questo è ciò che viene chiamato quando fai clic sul nome/avatar del gruppo all'interno delle schede dei gruppi
@action
showGroup(group) {
// chiama super per assicurarti che il codice dal core venga caricato prima
this._super(...arguments);
// group path è una funzione di aiuto per gli url di Discourse integrata
let groupURL = groupPath(group.name);
// se l'utente corrisponde ai requisiti, modifica l'url
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
// chiama routeTo() con l'url del gruppo predefinito o modificato
DiscourseURL.routeTo(groupURL);
}
});
</script>
Sei fantastico! Funziona benissimo per qualsiasi caso che utilizzi le schede.
Ora c’è un tipo di link che rimane non diretto: quello del gruppo quando si trova in un messaggio privato di gruppo. Questo è in realtà molto utile per navigare verso il gruppo (e quindi nella casella di posta) da un messaggio di gruppo.
Quei link utilizzano un serializzatore leggermente diverso, poiché non tutti i dati del gruppo sono necessari lì.
Tuttavia, puoi memorizzare un elenco filtrato dei gruppi dell’utente corrente nella visualizzazione iniziale della pagina e utilizzarli come riferimento per verificare l’appartenenza. Queste informazioni sono già disponibili nel payload iniziale, quindi non c’è alcun sovraccarico in termini di richieste aggiuntive o altro. Qualcosa del genere:
Mantieni questo snippet nei suoi tag script e aggiungilo all’header insieme agli altri snippet. Lo tieni separato perché esegue un controllo rapido se l’utente non è connesso.
Ho ancora una cosa con cui ho bisogno di una mano per completare questo. È un po’ sfacciato chiedere, lo so.
Sto ora cercando di modificare Pavilion in modo che possa supportare anche questo comportamento, utilizzando la semplice logica dei tuoi tre fantastici snippet. Tuttavia, non riesco a farlo funzionare a causa della mia inettitudine con javascript. Questo è ciò che sto cercando di modificare:
Come applico la parte sottostante a questo? Ho provato tutto ciò che mi è venuto in mente all’ultima parte click(){ecc} ma ho fallito. Finisco solo per rompere completamente il link.
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
Per alcuni gruppi in cui ci sono ‘fantasmi di messaggi’, questo non funziona. Questi gruppi possono essere identificati da questa query (a condizione che la messaggistica sia stata limitata nelle impostazioni di interazione del gruppo):
SELECT id, name, has_messages, messageable_level
From groups
Where messageable_level < 10
AND messageable_level <> 3
AND has_messages = true
ORDER by id
Puoi modificare la tabella groups per forzare anche il ripristino (nella console di Rails, ovviamente, fai prima un backup!).