From 12afc91110144d9da30e7d2a43975d5cd08d9866 Mon Sep 17 00:00:00 2001 From: Tristan Michael Date: Fri, 3 Apr 2026 03:58:12 -0700 Subject: [PATCH] feat: setup mode selection, per-workspace settings in kebab menu Setup screen now offers Local vs WebDAV mode choice with cancel button when workspaces exist. Settings moved from drawer bottom into workspace kebab menu, scoped per-workspace. WebDAV section hidden for local workspaces, theme dropdown replaces dark mode toggle. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/lib/screens/SettingsScreen.svelte | 157 +++++------ apps/tauri/src/lib/screens/SetupScreen.svelte | 245 ++++++++++++++---- apps/tauri/src/lib/screens/TasksScreen.svelte | 35 +-- 3 files changed, 293 insertions(+), 144 deletions(-) diff --git a/apps/tauri/src/lib/screens/SettingsScreen.svelte b/apps/tauri/src/lib/screens/SettingsScreen.svelte index c932bc6..1576ff1 100644 --- a/apps/tauri/src/lib/screens/SettingsScreen.svelte +++ b/apps/tauri/src/lib/screens/SettingsScreen.svelte @@ -2,7 +2,10 @@ import { invoke } from "@tauri-apps/api/core"; import { app } from "../stores/app.svelte"; - let { onclose }: { onclose?: () => void } = $props(); + let { onclose, workspaceName }: { onclose?: () => void; workspaceName: string } = $props(); + + let ws = $derived(app.config?.workspaces[workspaceName]); + let isWebdav = $derived(ws?.mode === "webdav"); let webdavUrl = $state(""); let webdavUser = $state(""); @@ -10,19 +13,15 @@ let testStatus = $state<"idle" | "testing" | "ok" | "fail">("idle"); $effect(() => { - const ws = app.config?.current_workspace; - if (!ws) return; - const cfg = app.config?.workspaces[ws]; - if (cfg?.webdav_url) { - webdavUrl = cfg.webdav_url; - try { - const domain = new URL(cfg.webdav_url).hostname; - invoke<[string, string]>("load_credentials", { domain }).then(([u, p]) => { - webdavUser = u; - webdavPass = p; - }).catch(() => {}); - } catch {} - } + if (!ws?.webdav_url) return; + webdavUrl = ws.webdav_url; + try { + const domain = new URL(ws.webdav_url).hostname; + invoke<[string, string]>("load_credentials", { domain }).then(([u, p]) => { + webdavUser = u; + webdavPass = p; + }).catch(() => {}); + } catch {} }); async function testConnection() { @@ -40,9 +39,9 @@ } async function saveWebdav() { - if (!app.config?.current_workspace || !webdavUrl.trim()) return; + if (!webdavUrl.trim()) return; await invoke("set_webdav_config", { - workspaceName: app.config.current_workspace, + workspaceName, webdavUrl: webdavUrl.trim(), }); if (webdavUser && webdavPass) { @@ -55,13 +54,12 @@ } await app.loadConfig(); } -
-

Settings

+

{workspaceName} Settings

- -
-

- WebDAV Sync -

-
- - + + {#if isWebdav} +
+

+ WebDAV Sync +

+
+ + - - + + - - + + -
- - +
+ + +
-
- {#if app.config?.current_workspace}
{ + const val = (e.target as HTMLSelectElement).value; + app.setTheme(val || null); + }} + class="w-full appearance-none rounded-lg border border-border-light bg-surface-light px-3 py-2 text-sm text-text-light outline-none focus:border-primary dark:border-border-dark dark:bg-surface-dark dark:text-text-dark" > -
-
- + + + + + + + +

Tauri v2 + Svelte

diff --git a/apps/tauri/src/lib/screens/SetupScreen.svelte b/apps/tauri/src/lib/screens/SetupScreen.svelte index f164798..7741941 100644 --- a/apps/tauri/src/lib/screens/SetupScreen.svelte +++ b/apps/tauri/src/lib/screens/SetupScreen.svelte @@ -1,16 +1,25 @@
-
+
+
+ {#if cancellable} + + {/if} +
{#if isDesktop}
{#if isWindows} @@ -72,58 +121,162 @@ class="w-full max-w-sm rounded-2xl bg-card-light p-8 shadow-lg dark:bg-card-dark" >

Onyx

-

- Create a new workspace or open an existing one. -

- + {#if mode === null} + +

+ How would you like to store your tasks? +

- - -
- -
- + -
-
- or -
-
+ {:else if mode === "local"} + +

+ Create a new workspace or open an existing one. +

- + + + + +
+ + +
+ + + +
+
+ or +
+
+ + + + {#if !isMobile} + + {/if} + + {:else} + +

+ Connect to a WebDAV server for cloud-synced tasks. +

+ + + + + + + + + + + + +
+ +
+ + + + {#if !isMobile} + + {/if} + {/if}
diff --git a/apps/tauri/src/lib/screens/TasksScreen.svelte b/apps/tauri/src/lib/screens/TasksScreen.svelte index 6ed0665..f22d91f 100644 --- a/apps/tauri/src/lib/screens/TasksScreen.svelte +++ b/apps/tauri/src/lib/screens/TasksScreen.svelte @@ -35,6 +35,7 @@ let showDrawer = $state(false); let showSettings = $state(false); + let settingsWorkspace = $state(null); let showNewList = $state(false); let showWorkspacePicker = $state(false); let workspacePickerEl = $state(null); @@ -152,7 +153,7 @@ clone.style.position = "absolute"; clone.style.top = "-9999px"; clone.style.left = "-9999px"; - if (app.darkMode) { + if (app.isDark) { clone.classList.add("dark"); clone.style.backgroundColor = "var(--color-surface-dark)"; clone.style.color = "var(--color-text-dark)"; @@ -192,12 +193,9 @@ showNewList = false; } - function openSettings() { - showSettings = true; - } - function closeSettings() { showSettings = false; + settingsWorkspace = null; } function handleHeaderMouseDown(e: MouseEvent) { @@ -256,7 +254,7 @@ {/if}

{name}

-

{ws?.path ?? ""}

+

{ws?.mode === "webdav" ? ws.webdav_url ?? "WebDAV" : ws?.path ?? ""}

@@ -270,6 +268,15 @@ {#if wsMenuName === name}
+
- - @@ -632,7 +625,7 @@ class="relative flex h-full w-full flex-col overflow-hidden rounded-2xl bg-surface-light transition-transform duration-200 dark:bg-surface-dark {showSettings ? 'scale-100' : 'scale-95'}" style="border: 1px solid rgba(255,255,255,0.1); box-shadow: 0 25px 60px rgba(0,0,0,0.7), 0 10px 20px rgba(0,0,0,0.5)" > - +