3.1 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			3.1 KiB
		
	
	
	
	
	
	
	
Dessins (Excalidraw)
Cette section décrit l'intégration d'Excalidraw dans ObsiViewer.
Fonctionnalités
- Édition: ouverture des fichiers .excalidrawde la voûte dans un éditeur dédié.
- Autosave: sauvegarde automatique après 800 ms d'inactivité (avec ETag/If-Match côté serveur).
- Exports: génération de vignettes PNG/SVG enregistrées en sidecar (.excalidraw.png|.svg).
- Thème: synchronisation avec le thème Angular (light/dark).
- Lazy-load: Excalidraw n'est chargé que lors de l'ouverture de l'éditeur.
Utilisation
- Ouvrir un dessin: dans l'explorateur de fichiers, cliquer un fichier avec l'extension .excalidraw. L'application bascule dans la vueDessins.
- Sauvegarde: toute modification de la scène déclenche un événement scene-changecapturé par l'éditeur Angular. La sauvegarde s'exécute automatiquement après 800 ms. Un indicateur "Saving…" s'affiche pendant l'opération.
- Exporter: utiliser les boutons "Export PNG" ou "Export SVG". Les fichiers sidecar sont écrits via l'API /api/files/blob/:path.
Détails techniques
- Web Component: <excalidraw-editor>est défini viareact-to-webcomponentsans Shadow DOM (shadow:false) pour éviter les soucis d'overlays/styling.
- Wrapper: web-components/excalidraw/ExcalidrawElement.tsxmonte<Excalidraw />et expose des méthodes (getScene(),exportPNG(),exportSVG(),setScene(),refresh()).
- Événements: le wrapper émet readyetscene-change(kebab-case).
- Thème: la prop themeest propagée à Excalidraw. Tout changement deThemeServicese reflète automatiquement.
- Backend: endpoints
- GET /api/files/:pathlit des- .excalidrawavec validation Zod (schéma minimal) et renvoie un- ETag.
- PUT /api/files/:pathécrit de façon atomique, vérifie- If-Matchsi fourni, limite 10 MB.
- PUT /api/files/blob/:pathécrit un binaire- .pngou- .svg(≤10 MB).
- /api/files/metadatafusionne la liste Meilisearch avec les- .excalidrawtrouvés sur FS.
 
Sécurité
- JSON only: aucun HTML n'est interprété à partir du contenu .excalidraw.
- Validation: schéma Zod minimal (structure conforme au format Excalidraw) + limites de taille.
Accessibilité
- L'éditeur est inséré dans une zone avec focus gérable au clavier. Les actions d'export possèdent des libellés.
Développement
- Lazy registration: DrawingsEditorComponentappelleimport('../../../../web-components/excalidraw/define')lors de l'initialisation.
- Schéma: schemas: [CUSTOM_ELEMENTS_SCHEMA]est appliqué au composant éditeur.
Tests à prévoir
- Unitaires: debounce/autosave, services fichiers (mocks HTTP), validation serveur (schéma Zod).
- E2E: ouvrir → modifier → autosave → recharger → modifications présentes ; export PNG ; bascule thème.
Limitations actuelles
- Boîte de dialogue "Nouveau dessin" non incluse (à ajouter si besoin).
- Refresh API disponible mais non appelée automatiquement sur redimensionnement (peut être déclenchée en option selon contexte UI).