Explorateur : icône personnalisable par dossier
Menu « … » d'un dossier > « Icône… » : grille de 27 icônes Tabler
(projet, serveurs, stockage, réseau, sécurité, documents, archives…)
plus « Par défaut ». L'icône est enregistrée dans .meta.json (champ
icon), partagée par tous, et suit renommages et déplacements.
Nouvelle route POST /api/meta/icon {"paths":[...],"icon":"server"}.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011bGUm1KLMvT6YPbJxZgwkj
This commit is contained in:
1 parent
bddbc27a1d
commit
8c29eb35e7
11 files changed
+489
-6
No files matched your search
@@ -71,3 +71,35 @@ func TestTagsFavorites(t *testing.T) {
|
||||
t.Fatalf("après suppression : %+v", tags)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFolderIcon(t *testing.T) {
|
||||
s := newStore(t)
|
||||
s.Write("d/a.excalidraw", []byte(doc), "", true)
|
||||
|
||||
if err := s.SetIcon([]string{"d"}, "server"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, bad := range []struct {
|
||||
path, icon string
|
||||
}{{"d", "Server"}, {"d", "../x"}, {"d/a.excalidraw", "server"}, {"absent", "server"}} {
|
||||
if err := s.SetIcon([]string{bad.path}, bad.icon); err == nil {
|
||||
t.Errorf("SetIcon(%q, %q) aurait dû échouer", bad.path, bad.icon)
|
||||
}
|
||||
}
|
||||
if l, _ := s.List(""); len(l) != 1 || l[0].Icon != "server" {
|
||||
t.Fatalf("List = %+v", l)
|
||||
}
|
||||
|
||||
// L'icône suit le renommage et disparaît quand on rétablit le défaut.
|
||||
s.Move("d", "e")
|
||||
s2, _ := New(s.root)
|
||||
if l, _ := s2.List(""); len(l) != 1 || l[0].Icon != "server" {
|
||||
t.Fatalf("après renommage : %+v", l)
|
||||
}
|
||||
if err := s2.SetIcon([]string{"e"}, ""); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if l, _ := s2.List(""); l[0].Icon != "" {
|
||||
t.Fatalf("après retour au défaut : %+v", l)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user