Navigazione migliore per i tag (strutturati)

Ciao a tutti,

Sto cercando di garantire che i tag ottengano una visibilità più strutturata nella navigazione, specialmente per coloro che fanno affidamento su Parent > Children. Abbiamo poco più di 40 tag, quindi una navigazione strutturata per i tag (che, ve lo dico io, sono gravemente sottoutilizzati da così tanti forum, mentre Discourse eccelle!) è piuttosto vitale.

Dato che è assurdo aggiungere più menu sopra la navigazione nativa di Discourse, la mia proposta (penso?) non è nulla di troppo drammatico. Ho creato una bozza brutta come idea…

Se esiste qualcosa di simile, non riesco a trovarlo. Il componente di @Johani è il più vicino, ma purtroppo non è strutturato.

Comunque, apprezzerei qualsiasi feedback, anche se fosse “Non ha senso” o “Ci ho messo 10 secondi a trovarlo su GitHub, novellino.”

Grazie!

2 Mi Piace

Con la quantità di tag genitore > figlio che alcuni siti possono avere, non tutti potranno essere inseriti lì.

Per esempio: guarda i tag di meta

https://meta.discourse.org/tags

2 Mi Piace

Sono d’accordo con questo: sostengo che l’esempio di meta di [tip-toeing] non sia il modo migliore per utilizzare i tag, anche se non esiste una best practice ovvia in merito. Tuttavia, anche solo come opzione per coloro di noi che hanno un vocabolario controllato sui tag e si affidano pesantemente ad essi (molto più che alle categorie), questo potrebbe essere utile. Il mio esempio era puramente questo… sospetto che altri possano avere un’idea migliore!

2 Mi Piace

Perché non usare semplicemente la pagina dei tag? Potresti evidenziare il link a quella pagina in vari modi. La pagina stessa supporta di default l’organizzazione per gruppi.

Potresti poi aggiungere stili personalizzati, sia per i tag:

oppure stilizzare il layout dell’intera pagina per ottenere una presentazione più specifica.

2 Mi Piace

Sì, adoro la pagina dei tag e la sua flessibilità. È fantastica. Ma la pagina dei tag non è onnipresente, mentre un menu fornirebbe una navigazione dinamica e sempre visibile, proprio come fa per le categorie.

Immagino che, come me, ci siano alcuni di noi che si affidano molto di più ai tag rispetto alle categorie. Potrebbe sembrare controintuitivo, ma ha senso in certi contesti. Anche l’esempio dell’auto usato nel post Tags trarrebbe vantaggio da qualcosa di simile. Se è rivolto agli appassionati di auto, ad esempio, potrebbero preferire saltare tra i tag (“Ford vs Ferrari”), piuttosto che tra le categorie.

D’altra parte, forse voi non siete ancora pronti per questo. Ma i vostri figli ne andranno pazzi. :wink:

1 Mi Piace

Sarei felice se trovassi una soluzione più dinamica! Ma immagino che comporterebbe una quantità significativa di codifica se vuoi qualcosa che non debba essere mantenuto manualmente. Fino ad allora, mi limiterei a rendere il link alla pagina dei tag più onnipresente :wink:

Screenshot from 2021-10-22 21-57-26

L’altro aspetto che rende i tag molto più user-friendly, nella mia esperienza, sono i banner dei tag ben fatti. Ho creato un componente semplice come add-on al componente tag-banners che ti permette di aggiungere descrizioni ai tag: https://github.com/nolosb/discourse-tag-banners-descriptions

3 Mi Piace

Una direzione leggermente diversa: ho modificato il rendering dei tag negli argomenti e nelle liste degli argomenti per mostrare la gerarchia a forma di crumb: “genitore > figlio” invece di “figlio, genitore”.

La mia soluzione era piuttosto specifica del sito e un po’ macchinosa, ma il risultato finale è soddisfacente.

Il principale ostacolo a ciò che ho fatto, e a ciò che vuoi fare, è che Discourse non precarica i gruppi di tag, quindi non sono disponibili quando necessario senza effettuare una richiesta API. Penso che dovrebbe farlo, allo stesso modo in cui viene precaricata la struttura delle categorie.

3 Mi Piace

Il problema qui è legato a uno spazio limitato e non a una limitazione tecnica.

come notato qui

Immagina la tua esperienza come utente: se apri un menu su un sito web, appare così.

Saresti sopraffatto, per dirla in modo leggero. Soprattutto perché quel menu non ha una funzione di ricerca per aiutarti a restringere i risultati.

Quindi, cerchiamo di trovare un punto di mezzo tra ciò che vuoi fare e ciò che gli utenti vogliono sperimentare. Come facciamo? Mostriamo un numero limitato di gruppi di tag e indichiamo che ce ne sono altri da vedere. Quindi, qualcosa del genere:

Allora, come si fa?

Ecco il codice:

<script type="text/discourse-plugin" version="0.8">
const MAX_TAGS_TO_SHOW = 20;
const Category = require("discourse/models/category").default;
const siteSettings = api.container.lookup("site-settings:main");
const tagStyle = siteSettings.tag_style;

const getNumberOfTags = (tags, categoryTagsGroups) => {
  let count = 0;
  count = tags.length;
  for (const categoryTagsGroup of categoryTagsGroups) {
    count = count + categoryTagsGroup.tags.length;
  }
  return count;
};

fetch("/tags.json")
  .then(response => response.json())
  .then(data => {
    try {
      const tags = data.tags;
      const hasCategoryTagGroups = data.extras?.categories;

      if (hasCategoryTagGroups) {
        const categoryTagsGroups = data.extras.categories;
        let moreCount = getNumberOfTags(tags, categoryTagsGroups);
        let visibleCount = 0;

        const content = [];
        for (const categoryTagsGroup of categoryTagsGroups) {
          const category = Category.findById(categoryTagsGroup.id);
          const name = category.name;
          const childTags = categoryTagsGroup.tags;
          const childTagNodes = [];

          childTags.forEach((tag, index) => {
            if (visibleCount <= MAX_TAGS_TO_SHOW) {
              childTagNodes.push(
                api.h(
                  "li.tag-link-item",
                  api.h(
                    `a.discourse-tag.tag-link.${tagStyle}`,
                    { href: `/tag/${tag.text}` },
                    tag.text
                  )
                )
              );
              moreCount--;
              visibleCount++;
            }
          });

          if (childTagNodes.length) {
            content.push([
              api.h("li.heading", api.h("span", name)),
              childTagNodes
            ]);
          }
        }

        api.decorateWidget("menu-links:after", helper => {
          if (helper.attrs.name !== "general-links") return;
          return api.h("div.clearfix", [
            api.h("ul.tag-links", [
              api.h("a.categories-link", { href: "/tags" }, [
                "Tag ",
                moreCount ? `(${moreCount} altri)...` : ""
              ]),
              content
            ]),
            api.h("hr")
          ]);
        });
      }
    } catch (error) {
      console.error("C'è un problema nel componente del tema dei tag a hamburger");
      console.error(error);
    }
  })
  .catch(console.error);

</script>

Questo va inserito nella scheda header del tuo tema. Puoi modificare

const MAX_TAGS_TO_SHOW = 20;

in alto con il numero di tag che desideri mostrare.

Poi tutto ciò che devi aggiungere è un po’ di CSS per stilizzare i link. Ecco qualcosa di base per iniziare.

.tag-links {
  .heading {
    padding: 0.25em 0.5em;
  }
  .tag-link-item {
    background-color: transparent;
    display: inline-flex;
    align-items: center;
    padding: 0.25em 0.5em;
    width: 50%;
    box-sizing: border-box;
    .tag-link {
      display: inline-flex;
      width: 100%;
      &:hover {
        color: var(--primary);
      }
    }
  }
}

Nota che il JavaScript sopra rispetterà lo stile dei tag impostato nelle impostazioni del tuo sito. Inoltre, se il tuo sito si affida molto ai tag, probabilmente non hai bisogno di avere le categorie visibili in quel menu. Nasconderle aiuterebbe a ridurre la confusione dell’utente.

Inoltre, se aggiungi una sezione tag espansa, allora questo link diventa ridondante.

Quindi, nascondiamoli con qualcosa del genere.

.panel-body {
  .category-links,
  .categories-separator,
  .widget-link[href="/tags"] {
    display: none;
  }
}

Infine, come notato qui:

Questi dati non vengono passati al client per impostazione predefinita a meno che non si visiti /tags, quindi il codice sopra aggiunge una richiesta aggiuntiva sulla home page (viene eseguita solo una volta per visita). Discourse cerca di mantenere le cose molto semplici, quindi, a meno che i dati non siano necessari, non li caricherà per impostazione predefinita.

Non vedo che questo venga aggiunto al core di Discourse a breve. Quindi una richiesta extra è praticamente l’unica opzione qui, a meno che tu non voglia scrivere un plugin che viene eseguito sul server.

7 Mi Piace

Grazie, Joe, è fantastico!

Alcune cose veloci… Ho notato che la tua risposta originale recuperava i dati per gruppo di tag (invece che per tag figlio). C’è un motivo per questo? Non sono riuscito a far apparire i tag figli, ma ho avuto fortuna con la tua risposta iniziale usando il gruppo di tag.

L’unico problema è che i tag non sono visibili agli utenti non registrati. Immagino che sia legato all’API? C’è un modo per aggirarlo?

Altrimenti, è una benedizione divina: posso certamente vedere altri utilizzare questo codice. Grazie mille!

2 Mi Piace

Ho creato un componente tema che dovrebbe rendere tutto un po’ più semplice. Puoi scegliere tra:

  1. gruppi di tag nidificati
  2. tag di categoria consentiti nidificati
  3. tag principali piatti

Maggiori dettagli qui

1 Mi Piace

Nominò Joe come Santo Patrono di Discourse.

1 Mi Piace

hahaha, stavo anche io creandone uno per il mio corso di formazione.

peccato.

ti ringrazio comunque

2 Mi Piace