0.14.0: multi-folder media drawer
- Clipart store holds an array of root folders instead of a single handle, plus an activeHandleIndex for the in-folder view. Getters: activeHandle, inOverview, hasAnyFolder, canGoBack, folderName. - Actions: addFolder (appends a root), enterFolder, exitFolder, removeFolder. Single-folder installs auto-drill into the sole root and behave exactly like the pre-refactor drawer; adding a 2nd+ folder pops back to the root overview. - IDB persistence migrated from the 'clipartDir' single-handle key to a 'clipartDirs' array. Legacy records are migrated on first load. saveClipartFolders unwraps Pinia proxies (toRaw per element) so IDB's structured clone accepts the payload. - ClipartItem union gained a 'folder' kind so root tiles render as first-class media items. listClipart emits nested directories too, but the drawer keeps drill-down one level deep for now. - ClipartDrawer header: three equally-sized .header-btn chips — back (only when canGoBack), refresh (when viewing a folder), and a new `+` (when any folder is attached). No more big 'Choose folder' button — empty state is a centred 96px dashed + with a wrapped hint. - Folder tiles carry a hover `×` to remove a root from the library. - DocumentSettings media tab lists all configured folders with a per- folder remove action; primary button is now 'Add folder'. - Pinia store now calls acceptHMRUpdate so Vite HMR actually swaps the store definition between reloads instead of leaving the first- load state shape behind. - Tests: store actions (addFolder / enterFolder / exitFolder / remove / IDB round-trip), drawer UI (centred + empty state, overview with folder tiles + click-to-enter, back visibility, single-root hides back, header + button triggers addFolder). Tests isolated with try/finally so a failing store assertion can't leak error state into subsequent drawer tests. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
8aa91fc27b
commit
9fe86b62b9
9 files changed
+698
-142
No files matched your search
+22
-4
@@ -438,7 +438,7 @@ export const en = {
|
||||
open: 'Open media',
|
||||
close: 'Close media',
|
||||
refresh: 'Reload folder',
|
||||
empty: 'Choose a folder with images and audio to populate the library.',
|
||||
empty: 'Add a folder with images and audio to populate the library.',
|
||||
noFiles: 'No images or audio files in this folder.',
|
||||
loading: 'Loading…',
|
||||
unsupported: 'Your browser does not support folder access. Try Chrome or Edge.',
|
||||
@@ -446,8 +446,17 @@ export const en = {
|
||||
clearFolder: 'Clear',
|
||||
folderLabel: 'Folder',
|
||||
noFolder: 'No folder selected',
|
||||
addFolder: 'Add folder',
|
||||
addFolderTooltip: 'Add another media folder',
|
||||
backToIndex: 'Back to folder index',
|
||||
removeFolder: 'Remove folder from library',
|
||||
removeFolderDialog: {
|
||||
title: 'Remove folder from library?',
|
||||
message: '"{name}" will no longer show up in the Media drawer. The files themselves stay untouched on disk.',
|
||||
confirm: 'Remove',
|
||||
},
|
||||
settingsHint:
|
||||
'Point to a local folder with your images and audio files. The app remembers the folder; permissions may be re-asked after browser restart.',
|
||||
'Add one or more local folders with your images and audio files. The app remembers them; permissions may be re-asked after browser restart.',
|
||||
},
|
||||
|
||||
documentDrawer: {
|
||||
@@ -1206,7 +1215,7 @@ export const de: DeepPartial<Messages> = {
|
||||
open: 'Medien öffnen',
|
||||
close: 'Medien schließen',
|
||||
refresh: 'Ordner neu laden',
|
||||
empty: 'Wähle einen Ordner mit Bildern und Audiodateien, um die Bibliothek zu füllen.',
|
||||
empty: 'Füge einen Ordner mit Bildern und Audiodateien hinzu, um die Bibliothek zu füllen.',
|
||||
noFiles: 'In diesem Ordner gibt es keine Bilder oder Audiodateien.',
|
||||
loading: 'Lädt…',
|
||||
unsupported:
|
||||
@@ -1215,8 +1224,17 @@ export const de: DeepPartial<Messages> = {
|
||||
clearFolder: 'Leeren',
|
||||
folderLabel: 'Ordner',
|
||||
noFolder: 'Kein Ordner ausgewählt',
|
||||
addFolder: 'Ordner hinzufügen',
|
||||
addFolderTooltip: 'Weiteren Medien-Ordner hinzufügen',
|
||||
backToIndex: 'Zur Ordnerübersicht',
|
||||
removeFolder: 'Ordner aus der Bibliothek entfernen',
|
||||
removeFolderDialog: {
|
||||
title: 'Ordner entfernen?',
|
||||
message: '„{name}" erscheint nicht mehr im Medien-Drawer. Die Dateien auf der Festplatte bleiben unangetastet.',
|
||||
confirm: 'Entfernen',
|
||||
},
|
||||
settingsHint:
|
||||
'Verweise auf einen lokalen Ordner mit Bildern und Audio. Die App merkt sich den Ordner. Nach einem Browser-Neustart kann die Berechtigung erneut abgefragt werden.',
|
||||
'Binde einen oder mehrere lokale Ordner mit Bildern und Audio an. Die App merkt sich die Auswahl. Nach einem Browser-Neustart kann die Berechtigung erneut abgefragt werden.',
|
||||
},
|
||||
documentDrawer: {
|
||||
open: 'Dokument-Einstellungen öffnen',
|
||||
|
||||
Reference in new issue
Block a user