Cambia le pagine del gruppo predefinite in /messages

Ciao,

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.

4 Mi Piace

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.

7 Mi Piace

Wow - è fantastico!!! Funziona alla grande. Grazie.


più tardi…

Ho un problema successivo con cui ho bisogno di un piccolo aiuto, mi dispiace!

Diversi dei miei gruppi mostrano ancora /g/group-slug/messages nonostante non ne abbiano alcuno.
\u003e

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

3 Mi Piace

Devi solo eseguire questa riga nella console di Rails. Dovrebbe aggiornare tutti i gruppi.

Group.refresh_has_messages!
1 Mi Piace

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

2 Mi Piace

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

1 Mi Piace

@Johani, è fattibile? Ho dato un’occhiata e chiaramente è ben al di sopra delle mie competenze.

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>
2 Mi Piace

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.

Pensi che possiamo catturarlo anche noi nella rete?

(A proposito, lo impacchetterò in un TC e farò un argomento al riguardo una volta finito, in modo che sia molto accessibile per gli altri)

2 Mi Piace

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:

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

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.

1 Mi Piace

:partying_face: siamo arrivati! Funziona benissimo, anche su mobile.

Grazie Joe per la tua incredibile perseveranza. Meglio che mantenga la mia parte dell’accordo e mi metta al lavoro su quel Theme component, eh?

più tardi…
Eccolo qui:

1 Mi Piace

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:

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

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/`;
      }
1 Mi Piace

Non importa!!! @keegan l’ha risolto:

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

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!).

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

Se questo non funziona o si ripristina, potresti anche dover pulire le tabelle topic_groups e topic_allowed_groups:

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

Questo argomento è stato chiuso automaticamente dopo 30 giorni. Non sono più consentite nuove risposte.