# Changer les pages de groupe par défaut en /messages

**URL:** https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123
**Category:** Support
**Created:** [Décembre 14, 2021, 11:50 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123 "2021-12-14T23:50:29Z")
**Posts on this page:** 16
**Page:** 1

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Décembre 14, 2021, 11:50 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/1 "2021-12-14T23:50:29Z")

</div>

Salut,

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.

---

<div class="post-metadata">

### Author: ![Johani](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/johani/32/176920_2.png) [@Johani](https://meta.discourse.org/u/Johani)
#### Post date: [Décembre 15, 2021, 2:47 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/2 "2021-12-15T02:47:41Z")

</div>

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

```xml

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

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Décembre 15, 2021, 2:57 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/3 "2021-12-15T02:57:40Z")

</div>

Génial - c’est incroyable !!! Ça fonctionne à merveille. Merci.

* * *

_plus tard…_

J’ai un problème de suivi pour lequel j’ai besoin d’un peu d’aide, désolé !

Plusieurs de mes groupes affichent toujours `/g/group-slug/messages` alors qu’ils n’en ont pas.  
\u003e

 ![image](https://global.discourse-cdn.com/meta/original/3X/7/b/7bac9a79c89740b9983b0d7fff78c6642afbf671.png)

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](https://meta.discourse.org/t/32566?silent=true) 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) ?

---

<div class="post-metadata">

### Author: ![Johani](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/johani/32/176920_2.png) [@Johani](https://meta.discourse.org/u/Johani)
#### Post date: [Décembre 15, 2021, 7:25 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/4 "2021-12-15T07:25:50Z")

</div>

Vous n’avez qu’à exécuter cette ligne dans la console Rails. Elle devrait mettre à jour tous les groupes.

```plaintext
Group.refresh_has_messages!

```

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Décembre 15, 2021, 7:29 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/5 "2021-12-15T07:29:20Z")

</div>

> [@Johani](#):
>
> `Group.refresh_has_messages!`

Ça a fonctionné pour tous sauf deux — merci. Pour ces deux derniers têtus, je pense que je vais devoir les supprimer et les recréer !

En faisant cela, j’ai découvert la raison — ce qui constitue un petit #Contribute > Bug.

Lors de la conversion des messages privés de groupe en sujets, les informations de l’invité sont conservées. Bien que cela soit pratique si le sujet est reconverti, cela signifie qu’ils sont comptés à tort lorsque `Group.refresh_has_messages!` est exécuté.

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Décembre 17, 2021, 12:02 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/6 "2021-12-17T00:02:15Z")

</div>

> [@Johani](#):
>
> La façon la plus simple de faire cela est d’intercepter le clic sur cet élément et de faire votre travail là-bas.

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

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Janvier 5, 2022, 4:13 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/7 "2022-01-05T04:13:51Z")

</div>

> [@nathank](#):
>
> Est-il possible de détourner également les liens que l’on obtient en cliquant sur un groupe @mentionné puis en cliquant sur le groupe ? Je pense que ce sont les deux seules façons d’accéder aux groupes sans recourir à des URL.

@Johani, est-ce faisable ? J’ai jeté un œil et c’est clairement au-dessus de mes compétences.

---

<div class="post-metadata">

### Author: ![Johani](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/johani/32/176920_2.png) [@Johani](https://meta.discourse.org/u/Johani)
#### Post date: [Janvier 6, 2022, 2:17 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/8 "2022-01-06T02:17:05Z")

</div>

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.

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

```

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Janvier 6, 2022, 2:28 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/9 "2022-01-06T02:28:38Z")

</div>

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.

 ![Screenshot 2022-01-06 15.25.38](https://global.discourse-cdn.com/meta/original/3X/2/2/22eae4e600b31af740f4d87846388b0e1adbbcc1.png)

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)

---

<div class="post-metadata">

### Author: ![Johani](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/johani/32/176920_2.png) [@Johani](https://meta.discourse.org/u/Johani)
#### Post date: [Janvier 6, 2022, 3:26 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/10 "2022-01-06T03:26:59Z")

</div>

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 :

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

```

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

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Janvier 6, 2022, 4:21 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/11 "2022-01-06T04:21:09Z")

</div>

🥳 nous y sommes ! Ça marche du tonnerre, même sur mobile.

Merci Joe pour ta persévérance incroyable. Je ferais mieux de tenir ma part du marché et de me mettre au travail sur ce #Customization > Theme component, non ?

_plus tard…_  
Le voici :

> [@Atteindre le composant Messages de groupe](https://meta.discourse.org/t/land-on-group-messages-component/214097):
>
> Ce composant de thème redirige les liens vers les groupes afin qu’ils aboutissent aux messages de groupe plutôt qu’aux membres du groupe. Le cas d’utilisation est lorsque votre forum utilise beaucoup les groupes, mais que vous ne souhaitez pas configurer une catégorie individuelle pour les communications privées pour chacun d’eux. La page /g/group-slug/messages peut fonctionner comme une liste de sujets pour ces groupes sans aucune autre intervention de l’administrateur. Malheureusement, ces p…

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Février 1, 2022, 2:17 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/12 "2022-02-01T02:17:02Z")

</div>

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](https://thepavilion.io/t/groups-widget/4881) 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 :

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

```

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.

```plaintext
      if (group.is_group_user && group.has_messages) {
        groupURL = `${groupURL}/messages/`;
      }

```

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Février 3, 2022, 2:39 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/13 "2022-02-03T02:39:41Z")

</div>

Laissez tomber !!! @keegan a réglé le problème :

> <https://github.com/paviliondev/layouts-groups-widget/commit/9f2a9995ad41972e93347d2403f7e0960bff4c90>

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [Mars 5, 2022, 2:40 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/14 "2022-03-05T02:40:05Z")

</div>

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

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Mars 30, 2022, 8:28 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/15 "2022-03-30T20:28:44Z")

</div>

> [@Johani](#):
>
> Vous n’avez qu’à exécuter cette ligne dans la console Rails. Elle devrait mettre à jour tous les groupes.
> 
> ```plaintext
> Group.refresh_has_messages!
> 
> ```

Pour certains groupes où il y a des «&nbsp;fantômes de messages&nbsp;», 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)&nbsp;:

```plaintext
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&nbsp;!).

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

```

Si cela ne fonctionne pas ou si cela se rétablit, vous devrez peut-être également nettoyer les tables `topic_groups` et `topic_allowed_groups`&nbsp;:

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

```

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [Avril 30, 2022, 8:00 UTC](https://meta.discourse.org/t/change-the-default-group-pages-to-messages/212123/17 "2022-04-30T20:00:13Z")

</div>

Ce sujet a été automatiquement fermé après 30 jours. De nouvelles réponses ne sont plus autorisées.
