Come cambiare il link associato a un pulsante nel pannello del menu utente

Invece che il pulsante evidenziato punti a u/miles/summary, preferirei che puntasse a u/miles/activity. Come posso farlo? Ho cercato online (sembra che sia necessario modificare l’attributo data-url con JavaScript, ma l’unico modo che ho visto per farlo è ottenere prima l’ID dell’elemento, che questo elemento non ha.)

Dovresti riaprire il widget pertinente in un componente del tema, qualcosa del genere:

api.reopenWidget("user-menu-links", {
  profileGlyph() {
    return {
      title: Titles["profile"],
      className: "user-preferences-link menu-link",
      id: QuickAccess.PROFILE,
      icon: "user",
      action: UserMenuAction.QUICK_ACCESS,
      actionParam: QuickAccess.PROFILE,
      data: { url: `${this.attrs.path}/activity` },
      role: "tab",
      tabAttrs: this._tabAttrs(QuickAccess.PROFILE),
    };
  },
})

Grazie! Ha senso, penso.
Una cosa però: sto inserendo questo in </head> ma ricevo l’errore: SyntaxError: unknown: Unexpected token, expected "," (28:6)

<script type="text/discourse-plugin" version="0.8">    
    api.reopenWidget("user-menu-links", {
      profileGlyph() {
        return {
          title: Titles["profile"],
          className: "user-preferences-link menu-link",
          id: QuickAccess.PROFILE,
          icon: "user",
          action: UserMenuAction.QUICK_ACCESS,
          actionParam: QuickAccess.PROFILE,
          data: { url: `${this.attrs.path}/activity` },
          role: "tab",
          tabAttrs: this._tabAttrs(QuickAccess.PROFILE),
        };
      },
    }
</script>

Sopra mancava una parentesi chiusa, aggiornato

Nessun errore ora, ma… Ora fa sì che il menu a tendina user-menu-links non si apra nemmeno. Hai idea del perché?

Cosa hai fatto per debuggarlo?

Controllare la console JavaScript nel browser è sempre un buon punto di partenza.

Se dai un’occhiata, ci sono tre problemi evidenti (alla fine).

La soluzione è piuttosto semplice in questo caso: devi solo fornire le costanti mancanti:

      const UserMenuAction = {
        QUICK_ACCESS: "quickAccess",
      };

      const QuickAccess = {
        BOOKMARKS: "bookmarks",
        MESSAGES: "messages",
        NOTIFICATIONS: "notifications",
        PROFILE: "profile",
      };
      
      const Titles = {
        bookmarks: "user.bookmarks",
        messages: "user.private_messages",
        notifications: "user.notifications",
        profile: "user.preferences",
      };

Una volta aggiunte queste (dal codice sorgente originale), funziona :tada:

(Ma vedi l’ottimizzazione di Faizaan qui sotto che rende superflue queste costanti, il che è ancora meglio :slight_smile: )

Più semplicemente

<script type="text/discourse-plugin" version="0.8">    
api.reopenWidget("user-menu-links", {
  profileGlyph() {
   const glyph = this._super(...arguments);
   glyph['data'] = { url: `${this.attrs.path}/activity` };
   return glyph;
  },
}

Non testato comunque :wink:

Sì, molto meglio ed evita la necessità di costanti: bella ottimizzazione! :slight_smile:

In realtà, puoi andare anche oltre ed ometterlo:

      api.reopenWidget("user-menu-links", {
        profileGlyph() {
         const glyph = this._super();
         glyph['data'] = { url: `${this.attrs.path}/activity` };
         return glyph;
        }
      });

Poiché non ci sono argomenti.

Grazie ragazzi! Funziona perfettamente. Sto imparando molto anche sull’editing di Discourse!