diff --git a/api/config/type/schema.json b/api/config/type/schema.json index 9e8c1f41..c26a2a1b 100644 --- a/api/config/type/schema.json +++ b/api/config/type/schema.json @@ -43,6 +43,7 @@ "type": "string" }, "pluginCategories": { + "description": "Ordered list of plugin group labels, used only to control the display order of groups in the plugin picker. A group found on the registry but absent from this list is shown after the configured ones, just before the trailing \"other\" fallback group.", "type": "array", "items": { "type": "string" diff --git a/ui/src/pages/processings/new.vue b/ui/src/pages/processings/new.vue index eba65c86..c5076672 100644 --- a/ui/src/pages/processings/new.vue +++ b/ui/src/pages/processings/new.vue @@ -27,17 +27,17 @@ /> - +
@@ -210,9 +213,18 @@ const artefactDisplayDescription = (a: RegistryArtefact) => const artefactGroup = (a: RegistryArtefact) => a.group?.[locale.value as 'fr' | 'en'] ?? a.group?.fr ?? a.group?.en ?? t('otherGroup') -// Configured group order, with a trailing fallback bucket for ungrouped or -// unknown groups. Empty buckets are hidden by the template. -const orderedGroups = computed(() => [...$uiConfig.pluginCategories, t('otherGroup')]) +// Configured groups define the leading display order. Any registry group not +// listed in the config is appended (alphabetically) after the configured ones, +// just before the trailing fallback bucket — so plugins are never hidden simply +// because their group is unconfigured. Empty buckets are hidden by the template. +const orderedGroups = computed(() => { + const configured = $uiConfig.pluginCategories + const otherGroup = t('otherGroup') + const extra = [...new Set(filteredArtefacts.value.map(artefactGroup))] + .filter(group => group !== otherGroup && !configured.includes(group)) + .sort((a, b) => a.localeCompare(b)) + return [...configured, ...extra, otherGroup] +}) const groupedArtefacts = computed(() => { const buckets: Record = {} for (const group of orderedGroups.value) buckets[group] = [] @@ -266,14 +278,14 @@ onMounted(() => { en: - selectPluginType: Processing type selection + selectPluginType: Plugin selection information: Information title: Title previous: Previous create: Create noPermission: You do not have permission to create a processing searchPlugin: Search for a plugin - noPlugins: No processing plugins are available for this account. + noPlugins: No plugins are available for your account. noMatch: No plugin matches your search. createSuccess: Processing created! createError: Error while creating processing @@ -282,14 +294,14 @@ onMounted(() => { otherGroup: Other fr: - selectPluginType: Sélection du type de traitement + selectPluginType: Sélection du plugin information: Informations title: Titre previous: Précédent create: Créer noPermission: Vous n'avez pas les droits pour créer un traitement searchPlugin: Rechercher un plugin - noPlugins: Aucun plugin de traitement n'est disponible pour ce compte. + noPlugins: Aucun plugin n'est disponible pour votre compte. noMatch: Aucun plugin ne correspond à votre recherche. createSuccess: Traitement créé ! createError: Erreur lors de la création du traitement