From 1a967c7fdd4277b5e0847145379a24392a2e8bf5 Mon Sep 17 00:00:00 2001 From: Tristan Michael Date: Tue, 31 Mar 2026 13:28:06 -0700 Subject: [PATCH] feat(tauri): move-to-list, rename, group toggle, keyboard shortcuts, WebDAV fix - TaskDetailView: 'Move to...' submenu in kebab menu - TasksScreen: list rename (inline input), group-by-due-date toggle, global Escape key handler for closing overlays - SettingsScreen: auto-populate WebDAV URL/credentials on open - SetupScreen: add window dragging, minimize/close buttons, 'Open Existing Folder' button - Store: moveTask, renameList, setGroupByDueDate methods + fs-changed event listener for file watcher Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/lib/components/TaskDetailView.svelte | 31 ++++ .../src/lib/screens/SettingsScreen.svelte | 16 ++ apps/tauri/src/lib/screens/SetupScreen.svelte | 141 +++++++++++++----- apps/tauri/src/lib/screens/TasksScreen.svelte | 98 ++++++++++-- apps/tauri/src/lib/stores/app.svelte.ts | 49 ++++++ 5 files changed, 285 insertions(+), 50 deletions(-) diff --git a/apps/tauri/src/lib/components/TaskDetailView.svelte b/apps/tauri/src/lib/components/TaskDetailView.svelte index 06863d9..478dd35 100644 --- a/apps/tauri/src/lib/components/TaskDetailView.svelte +++ b/apps/tauri/src/lib/components/TaskDetailView.svelte @@ -14,10 +14,13 @@ let title = $state(task.title); let description = $state(task.description); let showMenu = $state(false); + let showMoveSubmenu = $state(false); let menuEl = $state(null); let showDatePicker = $state(false); let saveTimer: ReturnType; + let otherLists = $derived(app.lists.filter((l) => l.id !== app.activeListId)); + function handleHeaderMouseDown(e: MouseEvent) { if (e.button !== 0) return; if ((e.target as HTMLElement).closest("button")) return; @@ -126,6 +129,34 @@ {isCompleted ? "Restore task" : "Mark as completed"} + {#if otherLists.length > 0} +
+ + {#if showMoveSubmenu} +
+ {#each otherLists as list} + + {/each} +
+ {/if} +
+ {/if} + {/if} + + + {/if} + - +
+
+

Onyx

+

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

+ + + + + +
+ + +
- - -
- + +
+
+ or +
+
+ +
- -
diff --git a/apps/tauri/src/lib/screens/TasksScreen.svelte b/apps/tauri/src/lib/screens/TasksScreen.svelte index 11c9e68..92793e4 100644 --- a/apps/tauri/src/lib/screens/TasksScreen.svelte +++ b/apps/tauri/src/lib/screens/TasksScreen.svelte @@ -44,6 +44,8 @@ let completedVisible = $state(false); let listMenuId = $state(null); let wsMenuName = $state(null); + let renamingListId = $state(null); + let renameValue = $state(""); let dragId = $state(null); let dragOverId = $state(null); let resizing = $state(false); @@ -77,6 +79,40 @@ await app.deleteList(id); } + function startRenameList(id: string) { + listMenuId = null; + const list = app.lists.find(l => l.id === id); + if (!list) return; + renamingListId = id; + renameValue = list.title; + } + + async function handleRenameList() { + if (!renamingListId || !renameValue.trim()) { renamingListId = null; return; } + const list = app.lists.find(l => l.id === renamingListId); + if (renameValue.trim() !== list?.title) { + await app.renameList(renamingListId, renameValue.trim()); + } + renamingListId = null; + } + + async function handleToggleGroupByDueDate(id: string) { + listMenuId = null; + const list = app.lists.find(l => l.id === id); + if (!list) return; + await app.setGroupByDueDate(id, !list.group_by_due_date); + } + + function handleKeydown(e: KeyboardEvent) { + if (e.key !== "Escape") return; + if (showSettings) { showSettings = false; return; } + if (selectedTaskId) { selectedTaskId = null; return; } + if (showDrawer) { closeDrawer(); return; } + if (listMenuId) { listMenuId = null; return; } + if (wsMenuName) { wsMenuName = null; return; } + if (showWorkspacePicker) { showWorkspacePicker = false; return; } + } + function handleDragStart(e: DragEvent, taskId: string) { dragId = taskId; if (e.dataTransfer) { @@ -148,6 +184,8 @@ let translateX = $derived(showDrawer ? '0' : '-80cqi'); + +
@@ -238,17 +276,30 @@
{#each app.lists as list (list.id)}
- + {#if renamingListId === list.id} +
+ { if (e.key === "Enter") handleRenameList(); if (e.key === "Escape") renamingListId = null; }} + onblur={handleRenameList} + autofocus + /> +
+ {:else} + + {/if}
{#if listMenuId === list.id} -
+
+ +