feat(r1.2): écrans web du référentiel — 7 écrans fidèles à maquette-r1

- Sites : liste + carte Leaflet/OSM réelle (pins maquette, positions
  PostGIS), création en modale avec position posée au clic sur la carte
- Fiche site : arbre site→zones, appareils rattachés, ajout de zone
- Ascenseurs : table dense, filtres site/statut, strie rouge à l'arrêt ;
  fiche appareil (organes ± ajout/retrait, statut, QR réel) ; création
  identité → rattachement → organes ; étiquette A6 imprimable (objet
  papier, window.print n'imprime qu'elle)
- Personnes & équipes : invitation → lien d'activation affiché à copier
  (pas d'email en R1, décision explicite), renvoi de lien, équipes ;
  page /activation (choix du mot de passe, connexion directe)
- Catégories : ajout, renommage inline, désactivation
- navigation et actions pilotées par la matrice (usePermissions) —
  l'API re-vérifie chaque requête
- e2e Playwright : recette R1 officielle rejouée intégralement (site →
  zone → appareil+organe → étiquette → invitation → activation) +
  parcours « la matrice pilote l'UI » ; purge idempotente en globalSetup
- alias Vite @siop/shared → source TS (exports nommés CJS ↯ workspace lié)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-07-16 13:06:45 +01:00
parent 266ffaaf1b
commit 9778629827
29 changed files with 2350 additions and 35 deletions

View File

@@ -1,8 +1,7 @@
import type { RoleName } from '@siop/shared';
import { cn } from '@/lib/cn';
/** Couleur d'avatar par rôle (tokens uniquement — répartition de la maquette). */
const ROLE_TOKEN: Record<RoleName, string> = {
const ROLE_TOKEN: Record<string, string> = {
Administrateur: 'var(--graf-1)',
Dispatcher: 'var(--primaire)',
Technicien: 'var(--graf-3)',
@@ -18,13 +17,14 @@ export function Avatar({
className,
}: {
initials: string;
roleName?: RoleName;
roleName?: string;
className?: string;
}) {
const couleur = roleName ? ROLE_TOKEN[roleName] : undefined;
return (
<span
className={cn('avatar', className)}
style={roleName ? { background: ROLE_TOKEN[roleName] } : undefined}
style={couleur ? { background: couleur } : undefined}
aria-hidden="true"
>
{initials}