Aujourd’hui, j’ai rencontré ce problème :
https://meta.discourse.org/t/required-tags-should-only-be-required-based-on-type-of-user/392238
mais pour l’instant, en attendant que l’équipe travaille dessus (avec un peu de chance), j’ai décidé de demander à Claude de m’aider à créer un Composant qui me permet d’avoir un message personnalisé dans le Compositeur pour me rappeler d’ajouter une étiquette (tag). Je peux ajouter un ou plusieurs utilisateurs, par ID, et je peux limiter cela à certaines catégories, également par ID.
Si l’ID (utilisateur et catégories) n’est PAS sur la liste, je vois ceci :

Si l’ID est sur la liste, je vois le message :

Si cela peut être utile à d’autres, le voici (il suffit de créer un composant et d’ajouter le script dans l’onglet JS) :
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("0.8.31", (api) => {
// Configuration : Ajoutez vos IDs d'utilisateur et IDs de catégorie ici
const TARGET_USER_IDS = [2]; // Remplacez par les vrais IDs d'utilisateur
const TARGET_CATEGORY_IDS = [4,49]; // Remplacez par les vrais IDs de catégorie
const REMINDER_MESSAGE = "🛑 Add the appropriate tag to this post!"; // Gardé en anglais car c'est le message affiché
let previousCategoryId = null;
let checkInterval = null;
function checkAndUpdateMessage() {
const composer = api.container.lookup("controller:composer");
if (!composer || !composer.model) {
// Le Compositeur a disparu, arrêtez la vérification
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
return;
}
const currentUser = api.getCurrentUser();
if (!currentUser || !TARGET_USER_IDS.includes(currentUser.id)) return;
const model = composer.model;
const categoryId = model.categoryId;
// Agir uniquement si la catégorie a changé
if (categoryId === previousCategoryId) return;
previousCategoryId = categoryId;
const currentReply = model.reply || "";
// Supprimer le message s'il a été ajouté
if (currentReply.startsWith(REMINDER_MESSAGE)) {
model.set("reply", currentReply.replace(REMINDER_MESSAGE, "").trim());
}
// Ajouter le message si dans la catégorie cible et que le compositeur est vide
if (categoryId && TARGET_CATEGORY_IDS.includes(categoryId)) {
const cleanReply = model.reply || "";
if (cleanReply.trim().length === 0) {
model.set("reply", REMINDER_MESSAGE);
}
}
}
// Vérifier à l'ouverture du compositeur
api.onAppEvent("composer:opened", () => {
previousCategoryId = null;
checkAndUpdateMessage();
// Démarrer le polling pour les changements de catégorie
if (checkInterval) clearInterval(checkInterval);
checkInterval = setInterval(checkAndUpdateMessage, 300);
});
// Arrêter la vérification à la fermeture du compositeur
api.onAppEvent("composer:closed", () => {
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
previousCategoryId = null;
});
});