Explorateur : dossiers Favoris et Personnel, cartouche oidc/local

- Racine : entrées « Favoris » (étoile) et « Personnel » en tête, ni
  sélectionnables ni déplaçables ; fil d'Ariane et sélecteur « Déplacer
  vers… » affichent Personnel/Favoris à la place de .perso/.favoris.
- Favoris : glisser un schéma sur Favoris (ou l'étoile) crée un lien, sans
  déplacer l'original ; ouvrir un favori ouvre l'original sans quitter
  Favoris ; Supprimer y retire seulement le lien ; emplacement de l'original
  affiché ; favori cassé barré. Plus de favoris sur les dossiers. Le filtre
  « Favoris » de la ligne de tags est remplacé par le dossier.
- Barre du haut : cartouche encadré « OIDC » + e-mail, ou « LOCAL » + nom
  du compte, avant le bouton de déconnexion.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0174sFqehj4uGqJHQZvWy1gn
This commit is contained in:
claude BotandClaude Opus 5.5 committed 2026-10-08 10:28:05 +02:00
1 parent 824871bd24
commit ea06fdaddf
7 files changed
+259 -72

No files matched your search

+18 -1
View File
@@ -8,6 +8,12 @@ export interface Entry {
modTime: string;
tags?: string[];
favorite?: boolean;
/** Entrée virtuelle de la racine : "favoris" ou "perso" (espace personnel). */
special?: "favoris" | "perso";
/** Dans le dossier Favoris : nom du lien (le chemin est celui de l'original). */
link?: string;
/** Favori dont l'original a disparu (chemin .favoris/<lien>, à retirer). */
broken?: boolean;
}
export interface TagCount {
@@ -74,11 +80,12 @@ export interface PublicScene {
scene: { elements?: unknown[]; appState?: Record<string, unknown>; files?: Record<string, unknown> };
}
/** Session courante (GET /api/me) ; logout présent en mode OIDC. */
/** Session courante (GET /api/me) ; logout présent en mode OIDC, id = dossier de l'utilisateur. */
export interface Me {
mode: "none" | "local" | "oidc";
user?: { sub: string; name: string; email?: string };
logout?: string;
id: string;
}
export class ApiError extends Error {
@@ -247,6 +254,16 @@ export const api = {
export const dirname = (p: string) => (p.includes("/") ? p.slice(0, p.lastIndexOf("/")) : "");
export const basename = (p: string) => p.slice(p.lastIndexOf("/") + 1);
export const join = (dir: string, name: string) => (dir ? `${dir}/${name}` : name);
// Dossiers propres à l'utilisateur connecté (voir internal/storage/spaces.go).
export const PERSO = ".perso";
export const FAVORIS = ".favoris";
const SPECIAL_LABELS: Record<string, string> = { [PERSO]: "Personnel", [FAVORIS]: "Favoris" };
/** Libellé d'un composant de chemin (".perso" → "Personnel"). */
export const label = (part: string) => SPECIAL_LABELS[part] ?? part;
/** Chemin affiché : "Personnel/projets" pour ".perso/projets". */
export const displayPath = (p: string) => p.split("/").map(label).join("/");
export const inFavoris = (p: string) => p === FAVORIS || p.startsWith(FAVORIS + "/");
export const EXT = ".excalidraw";
export const withExt = (name: string) => (name.toLowerCase().endsWith(EXT) ? name : name + EXT);
export const stripExt = (name: string) =>