Mejor navegación para etiquetas (estructuradas)

Hola a todos,

Estoy intentando asegurar que las etiquetas tengan una visibilidad más estructurada en la navegación, especialmente para aquellos de nosotros que dependemos de Padre > Hijos. Tenemos poco más de 40 etiquetas, por lo que la navegación estructurada para etiquetas (que, aviso de plataforma, están lamentablemente subutilizadas por tantos foros, y ¡de las que Discourse destaca!) es bastante vital.

Dado que es absurdo agregar múltiples menús encima de la navegación nativa de Discourse, mi propuesta (¿creo?) no es nada demasiado dramático. Lo simulé de manera fea como una idea…

Si algo así existe, no puedo encontrarlo. El componente de @Johani es lo más cercano, pero desafortunadamente no está estructurado.

De todos modos, me encantaría cualquier retroalimentación, incluso si es “Esto no tiene sentido” o “Me tomó 10 segundos localizar esto en GitHub, novato”.

¡Gracias!

2 Me gusta

con la cantidad de etiquetas parent > child que algunos sitios pueden tener, no todas cabrán allí.

por ejemplo: mira las etiquetas de meta

https://meta.discourse.org/tags

2 Me gusta

Coincido con eso: argumentaría que el ejemplo de [tip-toeing] meta no es la mejor manera de usar las etiquetas, aunque no exista ninguna práctica obvia en cuanto al uso de etiquetas. Pero incluso como una opción para aquellos de nosotros que tenemos un vocabulario controlado alrededor de las etiquetas y dependemos mucho de ellas (mucho más que de las categorías), esto podría ser útil. Mi ejemplo fue puramente eso… ¡Sospecho que otros podrían tener una mejor idea!

2 Me gusta

¿Por qué no usar simplemente la página de etiquetas? Podrías resaltar el enlace a esa página de varias maneras. La página en sí misma admite la estructuración por grupos de forma predeterminada.

Luego, podrías agregar estilos personalizados, ya sea para las etiquetas:

O estilizar la disposición de toda la página para obtener una presentación más específica.

2 Me gusta

Sí, me encanta la página de etiquetas y su flexibilidad. Es genial. Pero la página de etiquetas no es ubicua, mientras que un menú proporcionaría una navegación dinámica y omnipresente, como lo hace para las categorías.

Sospecho que, al igual que yo, hay algunos de nosotros que confiamos mucho más en las etiquetas que en las categorías. Eso podría parecer contraintuitivo, pero tiene sentido en ciertos contextos. Incluso el ejemplo del automóvil utilizado en la publicación Etiquetas se beneficiaría de algo así. Si es para entusiastas de los automóviles, por ejemplo, podrían preferir saltar entre etiquetas (“Ford vs Ferrari”), en lugar de categorías.

Por otro lado, quizás ustedes aún no están listos para esto. Pero a sus hijos les encantará. :wink:

1 me gusta

¡Me encantaría que encontrases una solución más dinámica! Pero supongo que implicaría una cantidad considerable de programación si quieres algo que no tengas que mantener manualmente. Mientras tanto, simplemente haría que el enlace a la página de etiquetas sea más omnipresente :wink:

Captura de pantalla de 2021-10-22 21-57-26

El otro aspecto que hace que las etiquetas sean mucho más amigables para el usuario, en mi experiencia, son los banners de etiquetas adecuados. Creé un componente sencillo como complemento al componente de banners de etiquetas que permite agregar descripciones a las etiquetas: https://github.com/nolosb/discourse-tag-banners-descriptions

3 Me gusta

Una dirección ligeramente diferente: he hecho que la renderización de etiquetas en los temas y en las listas de temas muestre la jerarquía estilo migas de pan: “padre > hijo” en lugar de “hijo, padre”.

Mi solución fue algo específica del sitio y bastante truculenta, pero el resultado final es agradable.

El mayor obstáculo para lo que hice, y para lo que quieres hacer, es que Discourse no precarga los grupos de etiquetas, por lo que no están disponibles cuando los necesitas sin hacer una solicitud a la API. Creo que debería hacerlo, de la misma manera que se precarga la estructura de categorías.

3 Me gusta

El problema aquí es una limitación de espacio y no una limitación técnica.

como se indica aquí

Imagina tu experiencia como usuario; si abres un menú en un sitio web, se ve así.

Te sentirías abrumado, por decir lo menos. Especialmente porque ese menú no tiene una función de búsqueda para ayudarte a reducir los resultados.

Así que, intentemos encontrar un punto medio entre lo que quieres hacer y lo que los usuarios quieren experimentar. ¿Cómo lo hacemos? Mostramos un número limitado de grupos de etiquetas e indicamos que hay más para ver. Entonces, algo como esto:

Entonces, ¿cómo se hace eso?

Aquí está el código:

<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" }, [
                "Etiquetas ",
                moreCount ? `(${moreCount} más)...` : ""
              ]),
              content
            ]),
            api.h("hr")
          ]);
        });
      }
    } catch (error) {
      console.error("Hay un problema en el componente del tema de etiquetas de menú hamburguesa");
      console.error(error);
    }
  })
  .catch(console.error);

</script>

Esto va en la pestaña header de tu tema. Puedes cambiar

const MAX_TAGS_TO_SHOW = 20;

en la parte superior por el número de etiquetas que deseas mostrar.

Luego, todo lo que necesitas agregar es un poco de CSS para dar estilo a los enlaces. Aquí hay algo básico para comenzar.

.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);
      }
    }
  }
}

Ten en cuenta que el JavaScript anterior respetará el estilo de etiqueta establecido en la configuración de tu sitio. Además, si tu sitio depende mucho de las etiquetas, probablemente no necesites tener las categorías visibles en ese menú. Ocultarlas ayudaría a reducir la confusión del usuario.

Además, si agregas una sección de etiquetas expandida, entonces este enlace se vuelve redundante.

Así que, ocultémoslos con algo como esto.

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

Finalmente, como se indica aquí:

Estos datos no se pasan al cliente de forma predeterminada a menos que visites /tags, por lo que el código anterior agrega una solicitud adicional en la página de inicio (se ejecuta solo una vez por visita). Discourse intenta mantener las cosas muy simples, por lo que, a menos que los datos sean necesarios, no los cargará de forma predeterminada.

No veo que esto se agregue al núcleo de Discourse en un futuro cercano. Por lo tanto, una solicitud adicional es prácticamente tu única opción aquí a menos que quieras escribir un plugin que se ejecute en el servidor.

7 Me gusta

¡Gracias, Joe, esto es fantástico!

Un par de cosas rápidas… Vi que tu respuesta original recuperaba los datos por grupo de etiquetas (en lugar de por etiquetas hijas). ¿Hay alguna razón para eso? No pude hacer que las etiquetas hijas aparecieran, pero tuve éxito con tu respuesta inicial usando el grupo de etiquetas.

El único problema es que las etiquetas no son visibles para los usuarios no registrados. ¿Asumo que esto está relacionado con la API? ¿Hay alguna forma de evitarlo?

De lo contrario, esto es un regalo de Dios; puedo ver claramente que otros usarán este código. ¡Muchas gracias!

2 Me gusta

He creado un componente de tema que debería hacer esto un poco más fácil. Puedes elegir entre

  1. grupos de etiquetas anidados
  2. etiquetas de categoría permitidas anidadas
  3. etiquetas principales planas

Más detalles aquí

1 me gusta

Nombro a Joe como el Santo Patrono de Discourse.

1 me gusta

jajaja, yo también estaba ocupado creando uno para mi curso de entrenamiento.

maldita sea.

gracias de todos modos

2 Me gusta