Files
Front-DataSentinel/DataSentinel/src/pages/Admin/referentielsConfig.js
T
Antho af464cfcb7 test(front): étend la couverture de 8 à 41 tests
Les fonctionnalités ajoutées récemment n'étaient couvertes par aucun test,
et deux utilitaires historiques ne l'avaient jamais été.

- statutMonitoring : bornes du seuil testées de part et d'autre, là où une
  confusion entre < et <= se verrait.
- dates : protège la correction du décalage de fuseau (toISOString basculait
  en UTC, le 1er janvier local devenait le 31 décembre). Les helpers sont
  sortis de Historique.jsx vers utils/dates.js, un fichier de composant ne
  pouvant pas exporter autre chose sans casser le rafraîchissement à chaud.
- exportToCSV : échappement des virgules, guillemets et sauts de ligne, et
  conservation du zéro, qui est falsy alors que « 0 erreur » est justement
  l'information utile. Cet utilitaire sert quatre écrans et n'avait aucun test.
- Dashboard : les menus ne proposent que les valeurs ayant des résultats, les
  catégories se restreignent au service choisi, et une catégorie devenue sans
  résultat est réinitialisée. Vérifié par mutation : casser la cascade fait
  bien échouer deux tests.
- Admin : création, modification pré-remplie, confirmation avant suppression,
  remontée du refus 409 de l'API, désactivation et non suppression d'un
  monitoring, affichage des libellés à la place des identifiants.

Corrige un défaut révélé par ces tests : referentielsConfig capturait les
fonctions de l'API à l'import, figeant l'implémentation. Elles sont désormais
résolues à l'appel, ce qui découple la configuration du module d'API.
2026-08-15 15:02:00 +02:00

88 lines
3.7 KiB
JavaScript

/* Les appels API sont référencés via l'espace de noms et résolus au moment de
l'appel, et non capturés à l'import : la configuration ne fige donc pas une
implémentation, ce qui la découple du module d'API. */
import * as api from '../../services/api';
/* Description déclarative des 4 référentiels administrables.
Les colonnes du tableau, les champs du formulaire et les appels API sont
décrits ici plutôt que répétés onglet par onglet : les 4 onglets partagent
ainsi un seul tableau et un seul formulaire. */
export const REFERENTIELS = [
{
key: 'monitorings',
label: 'Monitorings',
singulier: 'monitoring',
idField: 'id_monito',
/* Désactivation logique : TABLE_FINAL référence le monitoring. */
suppressionEstDesactivation: true,
colonnes: [
{ key: 'monito_intitule', label: 'Nom' },
{ key: 'id_service', label: 'Service', referentiel: 'services' },
{ key: 'id_categorie', label: 'Catégorie', referentiel: 'categories' },
{ key: 'bdd_source', label: 'Source' },
{ key: 'table_source', label: 'Table' },
],
champs: [
{ name: 'monito_intitule', label: 'Nom', type: 'text', required: true },
{ name: 'id_service', label: 'Service', type: 'select', options: 'services', required: true },
{ name: 'id_categorie', label: 'Catégorie', type: 'select', options: 'categories', required: true },
{ name: 'table_source', label: 'Table source', type: 'text', required: true },
{ name: 'bdd_source', label: 'Base source', type: 'text', required: true },
],
creer: body => api.createMonitoring(body),
modifier: (id, body) => api.updateMonitoring(id, body),
supprimer: id => api.desactiverMonitoring(id),
},
{
key: 'services',
label: 'Services',
singulier: 'service',
idField: 'id_service',
colonnes: [{ key: 'nom_service', label: 'Nom' }],
champs: [{ name: 'nom_service', label: 'Nom du service', type: 'text', required: true }],
creer: body => api.createService(body),
modifier: (id, body) => api.updateService(id, body),
supprimer: id => api.deleteService(id),
},
{
key: 'categories',
label: 'Catégories',
singulier: 'catégorie',
idField: 'id_categorie',
colonnes: [{ key: 'intitule_categorie', label: 'Nom' }],
champs: [{ name: 'intitule_categorie', label: 'Intitulé', type: 'text', required: true }],
creer: body => api.createCategorie(body),
modifier: (id, body) => api.updateCategorie(id, body),
supprimer: id => api.deleteCategorie(id),
},
{
key: 'contacts',
label: 'Contacts',
singulier: 'contact',
idField: 'id_contact',
colonnes: [
{ key: 'intitule_contact', label: 'Intitulé' },
{ key: 'nom', label: 'Nom' },
{ key: 'prenom', label: 'Prénom' },
{ key: 'mail', label: 'Email' },
{ key: 'id_service', label: 'Service', referentiel: 'services' },
],
champs: [
{ name: 'intitule_contact', label: 'Intitulé', type: 'text', required: true },
{ name: 'nom', label: 'Nom', type: 'text', required: true },
{ name: 'prenom', label: 'Prénom', type: 'text', required: true },
{ name: 'mail', label: 'Email', type: 'email', required: true },
{ name: 'id_service', label: 'Service', type: 'select', options: 'services', required: true },
],
creer: body => api.createContact(body),
modifier: (id, body) => api.updateContact(id, body),
supprimer: id => api.deleteContact(id),
},
];
/* Libellés des listes déroulantes et des colonnes qui affichent un identifiant. */
export const LIBELLES_REFERENTIEL = {
services: { idField: 'id_service', labelField: 'nom_service' },
categories: { idField: 'id_categorie', labelField: 'intitule_categorie' },
};