Enable tagging only in some categories

This is looking good @neil. One thing that would be good relating to this would be the simple option to ‘enable tags in category’ option in the category modal.

In my use case I only want tags (and specific tags at that) to be able to be used in specific categories. E.g. in those categories where I don’t want tags enabled I wouldn’t want the tag input field to be shown to users. Is this doable?

4 Mi Piace

It’s probably doable, but I have to focus on completing some other tag features first. Will have to come back around to this one later.

9 Mi Piace

I would love to only enable tags in certain categories as well - bookmarking this thread to keep an eye on the discussion moving forward

I think this is currently possible in the way that you can define tag-groups and you can configure category setting in order to use that tag-group.

do you mean something else?

3 Mi Piace

Another feature that would make sense related to this:

If tag filter is enabled, yet only certain categories have tags availble using the ‘Tags that can only be used in this category’ in category settings, I believe the homepage (both the main category, latest and top) pages should have the tag filter disabled by default.

I.e. only when digging down into the categories/sub-categories with tags allowed should the tag filter be shown (showing the respective tags available).

Otherwise from the homepage (whether that be categories or latest), you’ll get a whole bunch of tags in the filter, often without context as they only have context when filtered inside their respective categories.

Does this make sense?

1 Mi Piace

Keen to test this out. Am I able to grab some code somewhere for this? Cheers.

100% d’accordo. Nel nostro esempio, abbiamo una sezione documentale con un gruppo di tag dedicato. Voglio mostrare qui il menu a tendina dei tag, con solo i tag dedicati. Questo funziona.

Ma non voglio che gli stessi tag siano disponibili nel menu a tendina a livello superiore, negli ultimi o nei migliori per tutte le categorie. A mio avviso, questo toglie il vantaggio di assegnare gruppi di tag a determinate categorie e crea confusione a livello superiore.

Solo i tag globali non assegnati a un gruppo di tag legato a una categoria dovrebbero apparire nel menu a tendina dei tag a livello superiore.

Nelle impostazioni del gruppo di tag dovrebbe esserci qualcosa del genere:

[ ] Limita questo gruppo di tag solo alle categorie assegnate, non mostrarlo nei menu a tendina di primo livello

1 Mi Piace

Anche io vorrei vedere questa funzionalità.

Nel mio primo forum (importato), avevo bisogno di una categoria per gli annunci classificati.

Poiché su Discourse non esiste una “cartella” che contenga le categorie, come avviene in altri motori come vBulletin o phpBB, avevo sostanzialmente tre opzioni:

  1. Una singola categoria per gli annunci, sia per “vendita” che per “acquisto”, dove gli utenti avrebbero aggiunto autonomamente [VENDITA] o [ACQUISTO] come prefisso del titolo dell’argomento (quindi 2000…)
  2. Una singola categoria per gli annunci dove gli utenti potevano utilizzare i tag “vendita” o “acquisto”. Di gran lunga la più comoda, ma non avevamo alcun utilizzo dei tag in altre categorie e gli utenti avrebbero visto il campo tag nel compositore per qualsiasi categoria, il che avrebbe creato confusione.
  3. Avere 2 categorie per gli annunci a livello superiore: “vendita” e “acquisto”. Questa è la scelta che abbiamo fatto;

Sto importando un altro forum, più grande, e ho esattamente lo stesso “problema”, tranne che avrei bisogno di tag per 2 categorie invece di 1: una categoria per gli annunci classificati e una categoria “altre lingue” contenente solo post in lingue straniere che utilizzerebbero un tag specifico per la lingua in cui sono scritti, come “ebraico”, “danese”, ecc.

E ancora, non abbiamo la necessità di tag per nessuna altra categoria.

Avrei bisogno del selettore di tag nella barra di navigazione dell’elenco degli argomenti per entrambe queste categorie, ma non per le altre categorie.
Potrei facilmente nasconderlo quando necessario con un po’ di CSS, ma il problema principale è l’input dei tag nel compositore, che non può essere mostrato o nascosto a volontà…

Penso che a questo stadio il modo migliore sarebbe sovrascrivere il metodo tagValidation del compositore.
Ogni volta che una categoria viene selezionata nel compositore, nascosterà o mostrerà l’input dei tag, in base alla categoria selezionata.

Quando i campi dei tag sono nascosti, apparirebbe così, con uno spazio vuoto:

Inoltre, potrebbe potenzialmente rompere il layout se usiamo plugin o componenti del tema che hanno campi personalizzati nel compositore, come il plugin location.

Sto provando il metodo che ho pensato come soluzione alternativa.

Nascondere il selettore dei tag nell’elenco degli argomenti con CSS:


(dovrai indirizzare ogni categoria taggabile con il tuo selettore CSS)

body:not(.category-other-languages):not(.category-trading-post) {
    .category-breadcrumb .tag-drop {
        display: none;
    }
}

Mostrare e nascondere il selettore dei tag nel compositore con JS:

<script type="text/discourse-plugin" version="0.8.23">
    // mostra il selettore dei tag nel compositore solo quando necessario
    const discourseComputed = require("discourse-common/utils/decorators").default;
    const EmberObject = require("@ember/object").default;
    function toggleTagChooser(display = "hide") {
        if (display == "show") {
            document.getElementsByClassName("mini-tag-chooser")[0].style.display = "block";
            document.getElementsByClassName("reply-area")[0].classList.add("with-tags");
            return;
        }
        // Verifica l'esistenza del selettore dei tag
        let tagChoser = document.getElementsByClassName("mini-tag-chooser");
        if(tagChoser.length > 0) {
            tagChoser[0].style.display = "none";
            document.getElementsByClassName("reply-area")[0].classList.remove("with-tags");
        }
        return;
    }
    api.modifyClass('controller:composer', {
        @discourseComputed("model.category", "model.tags", "lastValidatedAt")
        tagValidation(category, tags, lastValidatedAt) {
            // codice personalizzato per attivare/disattivare il selettore dei tag
            toggleTagChooser("hide");
            if(category != null) {
                if (
                    category.allow_global_tags == true ||
                    category.allowed_tag_groups.length > 0 ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("show");
                }
            }
            // fine del codice personalizzato
            const tagsArray = tags || [];
            if (this.site.can_tag_topics && !this.currentUser.staff && category) {
                // category.minimumRequiredTags incorpora sia minimum_required_tags che required_tag_groups
                if (category.minimumRequiredTags > tagsArray.length) {
                    return EmberObject.create({
                        failed: true,
                        reason: I18n.t("composer.error.tags_missing", {
                            count: category.minimumRequiredTags,
                        }),
                        lastShownAt: lastValidatedAt,
                    });
                }
            }
        }
    });
</script>
1 Mi Piace

Esattamente quello che stavo cercando. Ottimo.

È particolarmente sbagliato nel codice core attuale mostrare il box di selezione dei tag quando non ci sono tag disponibili per un utente da selezionare per una categoria. L’ultimo codice risolve questo problema di UX. Dovrebbe essere così nel core @team

Inoltre, dovrebbero esserci due testi standard per il menu a tendina di selezione dei tag:

“tag opzionali”

e uno se i tag sono obbligatori (e disponibili per un utente) per una categoria

“seleziona almeno X tag”

1 Mi Piace

Creando un gruppo di tag, puoi rendere obbligatorio l’uso di uno di un insieme di tag (“buy” o “sell”) in tutti i post di una categoria.

1 Mi Piace

Ancora la casella di selezione dei tag appare con la dicitura “tag opzionali” nel compositore per una categoria che ha un gruppo di tag obbligatorio, e appare anche nelle categorie in cui non sono disponibili tag per l’utente in un’altra categoria. Questo è piuttosto confuso dal punto di vista dell’esperienza utente (UX). L’utente deve cliccare sul popup di errore prima di capire cosa è richiesto.

1 Mi Piace

Lo so, voglio solo nascondere in qualche modo la funzionalità dei tag per le categorie in cui i tag non sono disponibili, come spiega @Terrapop.

Quando i tag sono disabilitati nelle impostazioni del sito, il selettore delle categorie si trova sulla stessa riga del titolo dell’argomento:

Con il mio workaround, c’è un po’ di spreco di spazio, dato che il selettore delle categorie si trova sempre sotto il titolo dell’argomento:

Da un lato, cambiare la posizione del selettore delle categorie quando si seleziona una categoria, a seconda che richieda o meno i tag, potrebbe essere un errore dal punto di vista dell’esperienza utente. Dall’altro, raramente usiamo il selettore delle categorie più di una volta.

1 Mi Piace

Non sono tanto preoccupato per lo spreco di spazio, ma ho trovato un’altra “questione” nel tuo codice JS, che per il resto è molto buono. Forse puoi darci un’occhiata?

Abbiamo gruppi di tag “solo per lo staff” (ad esempio tag nascosti e tag di sistema) e gruppi di tag obbligatori per gli utenti per categoria. Entrambi sono collegati tramite “Ristretta questi gruppi di tag a questa categoria”.

Ora, questo codice controlla solo se una categoria consente tag o se tag_groups.length > 0 o allowed_tags > 0, ma sfortunatamente questo è sempre vero poiché abbiamo anche quei gruppi di tag solo per lo staff nei gruppi di tag ristretti.

Il codice potrebbe essere modificato per tenere conto del contesto dell’utente e verificare se ci sono davvero tag disponibili per questo specifico utente?

 if(category != null) {
                if (
                    category.allow_global_tags == true ||
                    category.allowed_tag_groups.length > 0 ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("visible");
                }
            }

Dovrebbe essere possibile contare solo i tag pubblici nell’array category.allowed_tag_groups.length per gli utenti non staff (o sono disponibili solo i nomi e non gli stati nell’array?):

public_category.allowed_tag_groups = [public_tag_group.name, staff_only_tag_group.name]
private_category.allowed_tag_groups = [private_tag_group.name, staff_only_tag_group.name]

Ok, aggiornamento:

Nel nostro caso, esamineremo i nomi in allowed_tag_groups e li escluderemo dall’array se currentUser non è staff. Ma è un workaround sporco, poiché non so come aggiungere il contesto dell’utente qui (o se ciò sia possibile dato il codice core attuale, non credo di sì).

             var non_staff_tag_groups = category.allowed_tag_groups.filter(filterHidden);
                function filterHidden(value) {
                  if(value.toLowerCase().indexOf("hidden") === -1 && value.toLowerCase().indexOf("system") === -1) return value;
                }
                if (
                    category.allow_global_tags == true ||
                    (category.allowed_tag_groups.length > 0 && this.currentUser.staff) ||
                    (non_staff_tag_groups.length > 0 && !this.currentUser.staff) ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("visible");
                }
            }

Ma questo è un hack sporco; l’intera dropdown dei tag nel composer dovrebbe essere più contestuale tramite il core e dovrebbe considerare tutti i casi sopra menzionati.

2 Mi Piace

Mi dispiace, sembra che non abbia visto il tuo messaggio nel 2020!

Comunque, il mio codice si è rotto dopo un recente aggiornamento di Discourse. Ecco un aggiornamento funzionante (il CSS non cambia però):

Seleziona le classi di categoria su cui vuoi nascondere il selettore di tag:

body:not(.category-other-languages):not(.category-trading-post) {
    .category-breadcrumb .tag-drop {
        display: none;
    }
}

Lo script che attiverà dinamicamente il selettore di tag:


    // mostra il selettore di tag nell'editor solo quando necessario
    const discourseComputed = require("discourse-common/utils/decorators").default;
    const EmberObject = require("@ember/object").default;
    function toggleTagChooser(display = "hide") {
        if (display == "show") {
            document.getElementsByClassName("mini-tag-chooser")[0].style.display = "block";
            document.getElementsByClassName("reply-area")[0].classList.add("with-tags");
            return;
        }
        // Verifica l'esistenza del selettore di tag
        let tagChoser = document.getElementsByClassName("mini-tag-chooser");
        if(tagChoser.length > 0) {
            tagChoser[0].style.display = "none";
            document.getElementsByClassName("reply-area")[0].classList.remove("with-tags");
        }
        return;
    }
    api.modifyClass('controller:composer', {
        @discourseComputed("model.category", "model.tags", "lastValidatedAt")
        tagValidation(category, tags, lastValidatedAt) {
            // codice personalizzato per attivare/disattivare il selettore di tag
            toggleTagChooser("hide");
            if(category != null) {
                if (
                    category.allow_global_tags == true ||
                    category.allowed_tag_groups.length > 0 ||
                    category.allowed_tags.length > 0
                ) {
                    toggleTagChooser("show");
                }
            }
            // fine del codice personalizzato
            const tagsArray = tags || [];
            if (this.site.can_tag_topics && !this.currentUser.staff && category) {
                // category.minimumRequiredTags incorpora sia minimum_required_tags che required_tag_groups
                if (category.minimumRequiredTags > tagsArray.length) {
                    return EmberObject.create({
                        failed: true,
                        reason: I18n.t("composer.error.tags_missing", {
                            count: category.minimumRequiredTags,
                        }),
                        lastShownAt: lastValidatedAt,
                    });
                }
            }
        }
    });

a proposito di questo… sono passati 6 anni amico :sweat_smile:

Penso che la funzionalità dei gruppi di tag oggi ti offra un’esperienza simile.

Potresti associare un gruppo di tag a un gruppo di categorie e quindi disabilitare la creazione di nuovi tag.

Non sono sicuro di pr-welcome qui, lo rimuovo, la modifica desiderata deve essere specificata correttamente. Questo, immagino, richiede una casella di controllo nelle impostazioni della categoria, ma anche questo richiede un po’ di riflessione, è selezionato per impostazione predefinita, l’impostazione aggiuntiva è semplicemente fonte di confusione per molte persone?