From 0766b47bb215db78db0ebda48c54dd3940ea0c9c Mon Sep 17 00:00:00 2001 From: dtoro Date: Sun, 17 May 2026 16:51:56 +0200 Subject: [PATCH] feat(sidebar): library + general settings dialogs, sidebar footer, alignment polish - Add a Settings cog to the Folders header that opens a tabbed library admin dialog (Library / Index / Import / Logs) wrapping PhotoPrism's /api/v1 settings, index, import and errors endpoints. - Add a sticky footer to the left sidebar with the signed-in user's display name plus quick-toggle theme, general-settings cog (separate dialog for app prefs), and sign-out. Pull these out of the top Toolbar trailing slot. - Align depth-0 folder rows with the rest of the sidebar entries (drop the leading chevron column when no children) and bring heap rows in line with folder rows so the kebab is part of the row's hover background instead of a detached chip. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../lib/components/layout/FolderTree.svelte | 14 +- .../layout/GeneralSettingsDialog.svelte | 83 ++++ .../lib/components/layout/LeftSidebar.svelte | 110 ++++- .../components/layout/SettingsDialog.svelte | 439 ++++++++++++++++++ web/src/lib/services/photoprism.ts | 86 ++++ web/src/routes/+layout.svelte | 7 +- web/src/routes/+page.svelte | 33 +- 7 files changed, 729 insertions(+), 43 deletions(-) create mode 100644 web/src/lib/components/layout/GeneralSettingsDialog.svelte create mode 100644 web/src/lib/components/layout/SettingsDialog.svelte diff --git a/web/src/lib/components/layout/FolderTree.svelte b/web/src/lib/components/layout/FolderTree.svelte index df1781d..3f1ff1d 100644 --- a/web/src/lib/components/layout/FolderTree.svelte +++ b/web/src/lib/components/layout/FolderTree.svelte @@ -110,15 +110,15 @@
{#if hasChildren} - {:else} + {:else if depth > 0} + {/if} + {/each} +
+ + + + diff --git a/web/src/lib/components/layout/LeftSidebar.svelte b/web/src/lib/components/layout/LeftSidebar.svelte index 071fef2..0b56648 100644 --- a/web/src/lib/components/layout/LeftSidebar.svelte +++ b/web/src/lib/components/layout/LeftSidebar.svelte @@ -2,6 +2,7 @@ import { goto } from '$app/navigation'; import { page } from '$app/state'; import { createMutation, createQuery, useQueryClient } from '@tanstack/svelte-query'; + import { mode, toggleMode } from 'mode-watcher'; import { toast } from 'svelte-sonner'; import { createFolder, @@ -12,6 +13,7 @@ heapDownloadUrl, listFolders, listHeaps, + logout, renameFolder, renameHeap, triggerDownload, @@ -24,11 +26,23 @@ setSection, type Section } from '$lib/stores/filters.svelte'; - import { isAuthenticated } from '$lib/stores/session.svelte'; + import { isAuthenticated, session } from '$lib/stores/session.svelte'; import FolderTree, { buildTree } from './FolderTree.svelte'; + import GeneralSettingsDialog from './GeneralSettingsDialog.svelte'; import HeapConvertDialog from './HeapConvertDialog.svelte'; import KebabMenu, { Item, Separator } from './KebabMenu.svelte'; - import { Copy, Download, FolderInput, Pencil, Trash2 } from 'lucide-svelte'; + import SettingsDialog from './SettingsDialog.svelte'; + import { + Copy, + Download, + FolderInput, + LogOut, + Moon, + Pencil, + Settings, + Sun, + Trash2 + } from 'lucide-svelte'; const qc = useQueryClient(); @@ -88,6 +102,18 @@ // mounts ; the dialog clears it on close. let convertingHeap = $state(null); + // Library/admin settings dialog visibility. + let settingsOpen = $state(false); + + // App-wide preferences dialog (theme etc.). Distinct from the library + // admin dialog above — opened from the bottom-of-sidebar footer. + let generalSettingsOpen = $state(false); + + async function onSignOut() { + await logout(); + await goto('/login', { replaceState: true }); + } + async function navigateTo(section: Section, heapUid: string | null = null) { setSection(section, heapUid); setFolderPath(null); @@ -220,7 +246,8 @@ } -