Personnalisation : référence complète¶
En bref
Cette page recense tous les paramètres d'affichage de l'application web SenSaaS, avec leur identifiant interne, leur lieu de stockage, leur valeur par défaut et le fichier source qui fait foi. Elle s'adresse aux administrateurs, aux revendeurs et aux intégrateurs. La vue utilisateur, sans identifiants techniques, est sur Personnaliser l'interface.
Comment lire les tableaux¶
Stockage. Aujourd'hui, la totalité des préférences d'affichage vit dans le stockage
local du navigateur (localStorage), sous la clé indiquée. Il n'existe aucun point de
sauvegarde côté serveur : le client d'API de l'application ne déclare aucune ressource de
préférences ni de dispositions, et la seule famille d'API liée à l'affichage est une
proposition non livrée (voir « Ce qui est en préparation »).
Conséquences pratiques :
- un réglage ne suit pas l'utilisateur d'un poste à l'autre, ni d'un navigateur à l'autre ;
- une navigation privée ou un vidage du stockage du site remet tout par défaut ;
- rien de tout cela n'est sauvegardé par le connecteur ni par le portail.
Portée. Trois portées seulement existent : cet appareil (le cas général), cet appareil + ce compte (les dispositions de listes, rangées sous l'adresse e-mail de connexion), et cet appareil + cet écran (les surcharges par écran). Aucune préférence n'a pour portée un serveur, un dossier Sage ou une société.
Trois canaux de propagation. Un réglage change dans le Redux store du shell, puis atteint
les autres modules de l'application par l'un de trois canaux : un attribut sur <body>
(apparence des listes, mode compact des fiches, variante d'indicateur de chargement), une
variable CSS sur :root (couleurs, police, fond de navigation), ou le stockage local
partagé (dispositions, préférences de modules). Le détour par le DOM est nécessaire parce que
la bibliothèque de composants n'est pas partagée en instance unique entre les modules : ils ne
peuvent pas lire le store du shell.
Dans les colonnes « Source », les chemins sont relatifs à
C:\Projets\SenSaaS\www\SenSaaS-Modulaire\.
1. Thème, couleurs, typographie¶
| Clé / identifiant | Stockage | Défaut | Écran ou module porteur | Source |
|---|---|---|---|---|
theme |
Navigateur (localStorage) |
light (valeurs : light, dark, system, sageTheme toléré en lecture) |
Réglages › Apparence (shell) | remotes/shell/src/store/slices/app.slice.ts |
isDarkMode |
Dérivé, non persisté | false — calculé depuis theme, ou depuis prefers-color-scheme quand theme = system |
shell | remotes/shell/src/hooks/useThemeEffect.ts |
themeCustomization (objet JSON : colors, font, fontSize, logo) |
Navigateur | Voir DEFAULT_THEME_CUSTOMIZATION ci-dessous |
Réglages › Personnalisation (shell) | libraries/hooks/src/themeCustomization.ts |
themeCustomization.colors.primary |
Navigateur | #00811f |
Réglages › Personnalisation | idem |
themeCustomization.colors.primaryHover |
Navigateur | #007219 |
Réglages › Personnalisation | idem |
themeCustomization.colors.secondary |
Navigateur | #4361ee |
Réglages › Personnalisation | idem |
themeCustomization.colors.secondaryHover |
Navigateur | #3550cf |
Réglages › Personnalisation | idem |
themeCustomization.colors.success |
Navigateur | #00811f |
Réglages › Personnalisation | idem |
themeCustomization.colors.danger |
Navigateur | #db004e |
Réglages › Personnalisation | idem |
themeCustomization.colors.warning |
Navigateur | #d64309 |
Réglages › Personnalisation | idem |
themeCustomization.colors.info |
Navigateur | #0071c3 |
Réglages › Personnalisation | idem |
themeCustomization.colors.navBackground |
Navigateur | #000000 — raccourcis : #000000 Noir, #0c1524 Bleu nuit, #00352c Vert Sage, #3b1d2e Prune, #f4f5f6 Clair |
Réglages › Personnalisation | remotes/shell/src/components/settings/sections/PersonalizationSection.tsx |
themeCustomization.font |
Navigateur | sage-ui (8 valeurs : sage-ui, sensaas-sans, sensaas-droit, inter, plus-jakarta-sans, ibm-plex-sans, roboto, system) |
Réglages › Personnalisation | libraries/hooks/src/themeCustomization.ts |
themeCustomization.fontSize |
Navigateur | small (small = 16 px, medium = 18 px, large = 20 px) — aucun contrôle dans le panneau des réglages |
Aucun écran aujourd'hui | idem |
themeCustomization.logo.light / .dark |
Navigateur (image encodée en data:) |
null — logos livrés par défaut |
Réglages › Personnalisation | idem ; limite de taille LOGO_MAX_FILE_SIZE_BYTES = 400 Ko dans remotes/shell/src/components/settings/constants.ts |
themePresetId |
Navigateur | absent (aucun thème actif) | Réglages › Personnalisation | libraries/hooks/src/themePreset.ts |
themeCustomPresets |
Navigateur (tableau JSON) | [] |
Réglages › Personnalisation (import de fichier) | idem |
themeOverrides |
Navigateur (tableau JSON) | [] — clés possibles : les huit accents, navBackground, font, fontSize |
Renseigné automatiquement dès qu'un réglage est modifié à la main | idem |
loaderVariant |
Navigateur | comete (valeurs : comete, infini, ring, standalone, star) |
Réglages › Apparence | libraries/ui/src/components/components/loader-appearance.ts |
Les quatre thèmes livrés¶
| Identifiant | Nom affiché | Description affichée |
|---|---|---|
sage-default |
Sage — rendu actuel | Thème par défaut Sage — vert, surfaces neutres |
sensaas-v2 |
SenSaaS V2 | Charte SenSaaS V2 — action bleue, marque bleu-vert, encre |
sage-corporate |
Sage Corporate | Surfaces neutres froides, aspect professionnel |
sage-warm |
Sage Warm | Surfaces chaudes, ambiance accueillante |
Source : libraries/hooks/src/themePreset.ts (BUILT_IN_PRESETS). L'ordre du tableau est
celui de la liste affichée.
2. Mise en page et navigation¶
| Clé / identifiant | Stockage | Défaut | Écran ou module porteur | Source |
|---|---|---|---|---|
shell_nav_mode |
Navigateur | sidebar (valeurs : sidebar Vertical, sidebar-icon Icônes, secondnav Horizontal) |
Réglages › Navigation — proposé seulement au-delà de 900 px de large ; sidebar-icon retombe sur sidebar en dessous |
remotes/shell/src/components/Layout.tsx |
menusUnified |
Navigateur | true (Regroupés) |
Réglages › Navigation | remotes/shell/src/store/slices/app.slice.ts |
menuOrder |
Navigateur (objet JSON) | {} |
Réglages › Navigation › Ordre des menus | idem |
menuReparent |
Navigateur (objet JSON) | {} |
idem | idem |
menuLabels |
Navigateur (objet JSON) | {} |
idem (crayon « Renommer ») | idem |
hiddenMenuKeys |
Navigateur (objet JSON) | {} |
idem (« Masquer ») — masquer n'empêche pas la navigation directe | idem |
page_favorites |
Navigateur (tableau JSON : path, label, environment, createdAt) |
[] |
Étoile de la barre du haut | remotes/shell/src/store/slices/favorites.slice.ts |
installed_apps |
Navigateur | [] |
Magasin d'applications | remotes/shell/src/store/slices/installedApps.slice.ts |
activeEnvironment |
Navigateur | gestion (valeurs : gestion, compta) |
Sélecteur Gestion / Comptabilité de la barre du haut | remotes/shell/src/store/slices/app.slice.ts |
lastPathByEnvironment |
Navigateur (objet JSON) | { gestion: null, compta: null } |
Automatique | idem |
shell.settings.uiMode |
Navigateur | panel (valeurs : panel, fullscreen) |
Réglages › Affichage | remotes/shell/src/hooks/useSettingsUiMode.ts |
Le regroupement des menus n'est pas codé dans le shell : chaque module déclare
routes[].menuGroup dans son public/manifest.json, et le shell en dérive les deux
présentations. revealChildrenWhenSplit: true (catalogues, tiers) démasque les
sous-catégories en mode « Séparés » seulement. Source : .claude/rules/featr.md § 3.
Champs persistés sans contrôle dans l'interface¶
Le store du shell persiste huit champs hérités qui n'ont aucun réglage exposé
aujourd'hui, mais qui sont réinitialisés avec les autres : menu (vertical), layout
(full), rtlClass (ltr), animation (''), navbar (navbar-sticky), semidark
(false), compact (false), datatableClientServerMode (false). Source :
preferenceDefaults() et PREFERENCE_STORAGE_KEYS dans
remotes/shell/src/store/slices/app.slice.ts.
3. Listes dynamiques¶
| Clé / identifiant | Stockage | Défaut | Écran ou module porteur | Source |
|---|---|---|---|---|
gridDataMode |
Navigateur | auto (valeurs : server, auto, client) |
Réglages › Tableaux | remotes/shell/src/store/slices/app.slice.ts |
gridDensity |
Navigateur | normal (valeurs : compact, normal, comfortable) |
Réglages › Tableaux | libraries/ui/src/ag-grid/grid-appearance.ts |
gridRowBorders |
Navigateur | true |
Réglages › Tableaux | idem |
gridColumnBorders |
Navigateur | true |
Réglages › Tableaux | idem |
gridColumnFilters |
Navigateur | true |
Réglages › Tableaux | idem |
gridColumnFiltersByScope |
Navigateur (objet JSON, clé = identifiant de liste) | {} |
Panneau Paramètres d'un écran de liste | libraries/document-shared/src/components/RemoteSettingsPanel.tsx |
gridCharts |
Navigateur | false |
Réglages › Tableaux | libraries/ui/src/ag-grid/grid-appearance.ts |
sensaas.grid.<e-mail>.<identifiant de liste> |
Navigateur, une clé par liste et par compte | absente | Automatique, à chaque geste dans une liste | libraries/ui/src/ag-grid/grid-state-persistence.ts |
La disposition enregistrée d'une liste contient : l'état complet des colonnes (visibilité, ordre, largeur, tri, regroupement), le modèle de filtres s'il n'est pas vide, et la liste des groupes dépliés pour les listes groupées. L'écriture est différée de 300 ms après le dernier geste, et vidée de force quand l'onglet passe en arrière-plan ou se ferme. Une liste revenue à ses valeurs d'origine voit son entrée supprimée plutôt que réécrite.
Les dimensions appliquées par la densité :
| Densité | Hauteur de ligne | Hauteur d'en-tête | Échelle de marge horizontale |
|---|---|---|---|
compact |
28 px | 36 px | 0,65 |
normal |
32 px | 40 px | 0,80 |
comfortable |
40 px | 48 px | 1,00 |
Sans bordures de lignes, le fond des lignes impaires passe en zébrure
(--theme-surface-2). Source : libraries/ui/src/ag-grid/grid-appearance.ts.
Attributs posés sur <body> : data-grid-density, data-grid-row-borders,
data-grid-column-borders, data-grid-column-filters, data-grid-charts,
data-grid-column-filters-overrides.
4. Fiches et saisie de documents¶
| Clé / identifiant | Stockage | Défaut | Écran ou module porteur | Source |
|---|---|---|---|---|
detailHideEmptyFields |
Navigateur | false (Affichées) |
Réglages › Apparence | libraries/ui/src/components/components/detail-appearance.ts |
sensaas:prefs:documents → recapStyle |
Navigateur | rail (valeurs : rail, flottant) |
Réglages › Documents | libraries/document-shared/src/DocumentEditor/DocumentsSettings.tsx |
sensaas:prefs:documents → density |
Navigateur | confortable (valeurs : confortable, compacte) |
Réglages › Documents | idem |
sensaas:prefs:documents → remiseMode |
Navigateur | demander (valeurs : demander, cascade) |
Réglages › Documents | idem |
sensaas:prefs:documents → autoSelectContact |
Navigateur | true |
Réglages › Documents | idem |
sensaas:prefs:documents → lineColumns:<écran> |
Navigateur | [] (colonnes de base) — <écran> vaut vente, achat, stock ou interne |
Bouton Colonnes de l'éditeur de document | libraries/document-shared/src/DocumentEditor/LinesTable/LinesTable.tsx |
sensaas:prefs:documents → lineColumnsOrder:<écran> |
Navigateur | [] |
idem | idem |
sensaas:prefs:documents → mobileLineView |
Navigateur | auto (valeurs : auto, cartes, liste) — bascule au-delà de 20 lignes en mode auto |
Bascule Cartes / Liste de l'éditeur mobile | libraries/document-shared/src/DocumentEditor/Mobile/EditorMobile.tsx |
Le mode « masquer les zones vides » est posé sur <body> (data-detail-hide-empty) et
consommé en CSS pur : aucun composant ne lit l'attribut. Une valeur 0 reste affichée —
c'est une information métier, pas un vide. Source :
libraries/ui/src/theme/detail-empty.css et
libraries/ui/src/components/components/detail-appearance.ts, décision ADR-0032.
5. Langue et unités¶
| Clé / identifiant | Stockage | Défaut | Écran ou module porteur | Source |
|---|---|---|---|---|
i18n_locale |
Navigateur | fr (valeurs : fr, en, es) |
Réglages › Apparence — et sélecteur de langue de l'écran de connexion | remotes/shell/src/i18n/config.ts ; chaque module relit la clé à son démarrage |
defaultCurrency |
Navigateur | EUR (code ISO 4217, choix limité aux devises des dossiers accessibles) |
Réglages › Apparence | remotes/shell/src/store/slices/app.slice.ts |
La langue est aussi le seul réglage de format : le formatage des nombres, des montants et des
dates suit la locale (fr-FR, en-US, es-ES) associée à la langue dans languageList. Il
n'y a pas de réglage distinct de format de date ou de séparateur décimal.
6. Réglages contribués par les écrans¶
Un module ajoute sa propre section au panneau des réglages en déclarant une contribution sur
la zone shell:settings:sections dans son public/manifest.json. Le shell affiche l'entrée
du rail sans charger le module ; le contenu n'est chargé qu'au clic. Aucune ligne du shell ne
nomme le module.
| Section | key de la contribution |
Ordre | Modules qui la déclarent |
|---|---|---|---|
| Documents | documents-settings |
70 | vente, achat, stock, doc-interne (même composant partagé, même espace de préférences) |
| Indicateurs | kpi-settings |
80 | kpi |
| Demo | demo-settings |
80 | demo |
Source : remotes/*/public/manifest.json et .claude/rules/featr.md § 1.
Préférences du module Indicateurs¶
| Clé / identifiant | Stockage | Défaut | Écran porteur | Source |
|---|---|---|---|---|
sensaas:prefs:kpi → globallyHidden |
Navigateur | false |
Réglages › Indicateurs | remotes/kpi/src/preferences.ts |
sensaas:prefs:kpi → cardStyle |
Navigateur | soft (Teinte ; autres : banner Bandeau, ghost Filigrane) |
Réglages › Indicateurs | idem |
sensaas:prefs:kpi → cardWidth |
Navigateur | stretch (Étirées ; autre : fixed Fixe) |
Réglages › Indicateurs | idem |
sensaas:prefs:kpi → hiddenByView |
Navigateur (objet JSON par vue) | {} |
Panneau Paramètres d'un écran de liste | libraries/document-shared/src/components/RemoteSettingsPanel.tsx |
sensaas:prefs:kpi → disabled |
Navigateur (objet JSON par identifiant d'indicateur) | {} |
Réglages › Indicateurs › Catalogue des indicateurs | remotes/kpi/src/settings/KpiCatalog.tsx |
kpi.pinned.<vue> |
Navigateur, une clé par vue | absente (disposition livrée) | Ligne d'indicateurs d'un écran | remotes/kpi/src/kpi-layout-storage.ts |
kpi.collapsed.<vue> |
Navigateur, une clé par vue | absente (déplié) | idem | idem |
Ces réglages vivaient dans le store du shell jusqu'à la refonte FEAT-052 ; une reprise
automatique des anciennes clés (kpiCardStyle, kpiCardWidth, kpiGloballyHidden,
kpiHiddenByView, disabledKpis) est exécutée une seule fois à la première ouverture.
Source : remotes/kpi/src/preferences-migration.ts.
Préférence du module Demo¶
| Clé / identifiant | Stockage | Défaut | Écran porteur | Source |
|---|---|---|---|---|
sensaas:prefs:demo → exampleToggle |
Navigateur | false |
Réglages › Demo | remotes/demo/src/settings/DemoSettingsSection.tsx |
Cette section est explicitement un tutoriel : son fichier documente, en commentaire, les trois gestes qui permettent à un module d'ajouter sa section (écrire le composant, l'exposer, le déclarer dans le manifeste). Elle n'a aucun effet métier.
Mécanisme commun¶
Toutes les préférences d'un module passent par usePreference('<module>', '<clé>', <défaut>)
et sont écrites dans une seule clé de stockage par module, sensaas:prefs:<module>, au format
JSON. C'est le contrat de plateforme N-16 : un module n'ajoute jamais de champ au store du
shell. Source : libraries/api/src/slices/preferences.slice.ts et
.claude/rules/remote-autonomy.md.
7. Panneau « Paramètres » d'un écran de liste¶
Ouvert depuis le menu Actions d'une liste, ce panneau porte au plus trois blocs :
| Bloc | Libellé français | Ce qu'il écrit |
|---|---|---|
| Affichage | Afficher les indicateurs (KPIs) | sensaas:prefs:kpi → hiddenByView[<vue>] |
| Tableau | Afficher les filtres par colonne | gridColumnFiltersByScope[<identifiant de liste>] |
| Section libre | variable selon l'écran | — |
Écrans qui le montent aujourd'hui : comptes, journaux, trésorerie, pilotage, et toutes les
listes de documents. Source : libraries/document-shared/src/components/RemoteSettingsPanel.tsx,
libraries/document-shared/src/components/RemoteActionsMenu.tsx,
remotes/{compte,journaux,tresorerie,pilotage}/src/components/*SettingsButton.tsx.
8. Réinitialisation¶
Le bouton Réinitialiser mes réglages (Réglages › Réinitialiser) enchaîne cinq opérations, dans cet ordre :
resetPreferences()— remet les champs du store du shell àpreferenceDefaults()et purge les 25 clés dePREFERENCE_STORAGE_KEYS, plus les trois clés de thème (themeCustomization,themePresetId,themeCustomPresets) ; resynchronise la langue surfr;resetAllPreferences()— purge tous les espacessensaas:prefs:*des modules ;clearFavorites()— videpage_favorites;resetAiFavorites()— purge les clés de l'assistant et émetsensaas:ai-favorites-reset;resetAllColumnLayoutsForCurrentUser()— supprime toutes les cléssensaas.grid.<e-mail>.*du compte connecté ;
puis émet sensaas:reset-all-preferences sur window pour tout module qui gère des caches
propres.
Conservés : la session et le jeton, dossiers, activeDossier, exercice,
exerciceOverrides, activeEnvironment, lastPathByEnvironment et la route courante.
Source : remotes/shell/src/components/settings/SettingsOverlay.tsx et
remotes/shell/src/store/slices/app.slice.ts.
Comment le thème est construit¶
Les couches¶
L'application pose ses couleurs dans cet ordre, à chaque rendu :
- Les jetons de la charte, en CSS statique :
libraries/ui/src/theme/sage-tokens.css(jetons Sage) puistheme-tokens.css(jetons--theme-*propres à SenSaaS). C'est le socle : tout composant lit--theme-primary,--theme-surface,--theme-text-primary… - La personnalisation de l'utilisateur (
applyThemeCustomizationToRoot) : elle écrit en style inline sur:rootles huit accents, le fond de navigation et la typographie. - Le thème actif, s'il y en a un (
applyThemePresetToRoot) : il écrase ce qu'il définit. - Les réglages explicitement choisis (
applyThemeOverridesToRoot) : les couleurs, la police ou le fond de navigation que l'utilisateur a touchés à la main reviennent par-dessus le thème.
Avant chaque application, clearThemePresetFromRoot() nettoie le style inline : sans cela,
retirer un thème laisserait ses surfaces en place. Source :
remotes/shell/src/hooks/useThemeCustomization.ts.
Ce qu'un thème porte¶
Un thème est un fichier JSON schemaVersion: '1' avec un bloc meta (id, name,
description, author, builtIn), un bloc light obligatoire et un bloc dark facultatif
qui surcharge le premier. Les groupes de jetons acceptés : colors (les huit accents plus
focus), surfaces (7 jetons), borders (3), inputs (2), text (4), shadows (2), nav
(background), font et fontSize. Tout le reste est ignoré à la validation.
Un thème porte donc la charte entière : accents par mode, surfaces, bordures, champs, texte, ombres, fond de navigation, police et taille de base. C'est la décision ADR-0123 — « Un preset de thème porte la charte entière et prime sur les couleurs ajustées ».
Un accent n'est jamais écrit seul : à partir de la couleur de base, une dérivation unique
pose aussi -hover, -active, -soft et, pour la couleur primaire, -soft-strong. C'est ce
qui garantit qu'un changement de couleur emporte aussi le survol d'une ligne de liste et la
couleur de sélection.
Le fond de navigation fonctionne à l'identique : une seule couleur stockée, dix jetons
dérivés par calcul de luminance (--theme-nav-bg, -hover, -active, -elevated, -fg,
-fg-muted, -fg-subtle, --theme-nav-hover, -active, -border). Le texte bascule en
blanc ou en encre selon le contraste réel du fond. Source :
libraries/hooks/src/themeCustomization.ts.
Le mode sombre¶
Le mode sombre n'est pas un thème : c'est une bascule qui pose la classe dark sur
<html> et <body>, ce que la feuille de styles exploite, et qui fait résoudre les jetons
d'un thème par sa variante dark. En mode system, l'application s'abonne à
prefers-color-scheme et bascule quand le système bascule. Source :
remotes/shell/src/hooks/useThemeEffect.ts.
Ce que le thème n'atteint pas¶
D'après sensaas-remote-control/docs/design-system-unification.md et l'ADR-0123 :
- environ 614 classes de couleur écrites en dur, réparties dans 18 paquets, ignorent les jetons par construction et ne suivent aucun changement de thème ;
- les teintes des cartes d'indicateurs ne suivent pas non plus, volontairement (ADR-0024 : la palette d'indicateurs est calibrée sur le contraste, pas sur la marque) ;
- le corps de texte à 17 px, l'interligne 1,65 et les chiffres tabulaires demandés par la charte ne sont pas portés : la taille de base est un choix à trois crans (16 / 18 / 20) ;
- le dégradé de marque, le filet de la barre haute et le mode daltonisme de la charte n'ont aucun mécanisme aujourd'hui ;
- la charte ne définit ni couleur de danger ni couleur d'avertissement : le thème
sensaas-v2conserve les valeurs Sage pour ces deux rôles.
Ce qu'un revendeur peut changer aujourd'hui¶
| Élément | Possible ? | Comment, et avec quelle limite |
|---|---|---|
| Couleurs de l'interface | Oui, poste par poste | Réglages › Personnalisation, ou un thème JSON importé. Pas de diffusion centralisée : chaque utilisateur doit importer le fichier sur chaque navigateur |
| Logo de la barre du haut | Oui, poste par poste | Import d'un logo clair et d'un logo sombre, 400 Ko maximum, png/jpg/svg/webp/gif. Stocké dans le navigateur de l'utilisateur. Un thème JSON ne porte pas de logo : les deux mécanismes sont distincts |
| Police | Oui | Choix parmi huit polices livrées. Aucune police tierce ne peut être ajoutée sans modification du produit |
| Charte complète | Oui, par fichier | Un thème JSON exporté depuis un poste de référence puis importé sur les autres. C'est le chemin prévu : « une charte complète s'installe par un fichier JSON, sans une ligne de code » (ADR-0123) |
| Nom du produit, textes de marque | Non | Aucun paramètre d'affichage ne porte de nom de produit ni de texte de marque. Les libellés viennent des fichiers de traduction livrés |
| Adresse et favicon | Non documenté ici | Relève du déploiement, pas des paramètres d'affichage |
| Réglages imposés à un utilisateur | Non | Aucun mécanisme ne permet aujourd'hui de forcer ou de verrouiller une préférence : chaque utilisateur reste maître de la sienne |
| Réglages communs à une équipe | Non | Rien n'est stocké côté serveur ; un réglage ne quitte pas le navigateur où il a été posé |
Ce qui est en préparation¶
Évolution non livrée
Ce qui suit décrit des travaux annoncés par les documents internes, à la date du 2026-09-11. Rien de tout cela n'est disponible aujourd'hui, et les éléments marqués « proposition » n'ont pas d'endpoint existant.
Politique d'affichage pilotée par le connecteur¶
sensaas-remote-control/docs/politique-affichage-connecteur-v2.md est une proposition
adressée à l'équipe du connecteur, explicitement au statut « à discuter, aucun endpoint
n'existe aujourd'hui ». Elle décrit une famille affichage de l'API v2 où :
- le front publie un catalogue de toute sa surface d'interface ;
- des administrateurs définissent des préréglages de visibilité et les affectent à des utilisateurs, par adresse e-mail ;
- chaque utilisateur reçoit à la connexion sa politique effective compilée.
Les clés seraient de la forme <type>:<identifiant>, avec dix types en v1 : remote,
route, menu, feature, slot, kpi, app, env, vue, section. Trois types sont
réservés et refusés en v1 : pref, colonne, action — autrement dit, piloter une
préférence d'affichage à distance n'est pas dans le périmètre de la première version.
Deux principes du document méritent d'être retenus par un intégrateur :
- masquer n'est pas interdire : la politique agit sur l'interface, pas sur la sécurité ; un utilisateur outillé appelle toujours les mêmes endpoints ;
- la politique borne les choix de l'utilisateur, elle ne les réécrit jamais : quand une règle est levée, l'utilisateur retrouve exactement ses réglages — vue mémorisée, applications installées, entrées de menu masquées à la main.
Côté application, l'ossature existe déjà : le shell lit une politique d'affichage, la met en
cache une heure et ne rejette jamais (absente, invalide ou injoignable = tout visible). Les
sections natives du panneau des réglages portent d'ailleurs chacune leur clé de politique
(section:shell/settings/display, …/appearance, …/navigation, …/personalization,
…/tables, …/help, …/reset), ce qui permettrait de masquer une section de réglages
entière. Source : remotes/shell/src/services/displayPolicy.ts,
remotes/shell/src/store/slices/displayPolicy.slice.ts,
remotes/shell/src/components/settings/sections.ts.
Rendre un écran pilotable¶
sensaas-remote-control/docs/remote-pilotable-affichage.md est la méthode à l'usage de qui
développe un module, y compris un prestataire externe. Sa règle : tout élément qu'un client
pourrait vouloir masquer doit être déclaré dans le manifeste du module ; ce qui n'y est pas
déclaré n'existe pas pour l'administrateur. Sont déjà pilotables sans rien faire : le module
entier, chaque page, chaque contribution, chaque indicateur, chaque application du magasin.
Doivent être déclarés en plus : les vues d'un écran (vues[], pour un sélecteur
Cards / Catalogue / Tableau) et les sections internes d'un écran (sections[]).
Une garde est prévue : si une politique masque toutes les vues d'un écran, elles sont toutes rendues — un écran ne devient jamais vide.
Charte graphique V2¶
Le thème sensaas-v2 est livré et sélectionnable à côté du rendu Sage, qui reste le
défaut — c'est un arbitrage explicite, daté du 10/09/2026 : « la bascule générale se décide
sur pièce, après essai ». Le tableau « Ce que le front en applique » de
sensaas-remote-control/docs/charte-graphique-sensaas-v2.md recense ce qui reste à faire ;
il est repris plus haut sous « Ce que le thème n'atteint pas ».
Le défaut d'un composant qui suit une préférence¶
L'ADR-0124 pose un mécanisme générique et déjà appliqué une fois : un composant du design
system rendu sans propriété explicite prend la valeur choisie par l'utilisateur, lue sur
un attribut de <body>. Le premier cas est l'indicateur de chargement. L'ADR note que « le
mécanisme est générique : un autre composant peut suivre la même voie » — sans nommer lequel,
ni donner de calendrier.
Limites de l'analyse¶
Cette page a été établie par lecture des sources listées dans le front-matter. N'ont pas été vérifiés :
- Le rendu réel à l'écran. Aucune capture n'a été prise et l'application n'a pas été exécutée : les libellés cités viennent des fichiers de traduction et des composants, pas d'une observation.
- La taille du texte. Le réglage existe dans le modèle de thème, ses libellés existent en français, mais aucun composant du panneau ne l'expose. Retiré ou pas encore branché : indéterminé.
- Les huit champs hérités du store (
menu,layout,rtlClass,navbar,semidark,compact,animation,datatableClientServerMode) : persistés et réinitialisés, mais aucun réglage ne les écrit. Leur lecture éventuelle par un composant n'a pas été tracée exhaustivement. - Le README du shell est en retard sur le code sur un point : il annonce des
« préférences doc/article » dans le store du shell (
syncMode,groupArticlesDoc,autoSelectContactDoc,defaultDocVenteType,redirectToEditOnCreate) qui n'existent plus dansapp.slice.ts. Les préférences de documents relevées ici sont celles de l'espacesensaas:prefs:documents. - Le contenu exact des sections de réglages des modules non lus : seuls
documents,kpietdemodéclarent une section, et les trois ont été lus. Aucun autre module n'a été parcouru ligne à ligne à la recherche d'un réglage caché ailleurs que dans une section déclarée. - Le portail et le connecteur n'ont pas été consultés : si un réglage d'apparence y existe, il n'apparaît pas ici.
- Le nombre de 614 classes de couleur en dur et le chiffre de 18 paquets sont repris des documents internes ; ils n'ont pas été recomptés.
- Le format des dates et des nombres : aucun réglage dédié n'a été trouvé, mais l'absence n'a été vérifiée que dans le panneau des réglages et le store du shell.