diff --git a/apps/tauri/src/lib/screens/SetupScreen.svelte b/apps/tauri/src/lib/screens/SetupScreen.svelte index 3351296..0f15b03 100644 --- a/apps/tauri/src/lib/screens/SetupScreen.svelte +++ b/apps/tauri/src/lib/screens/SetupScreen.svelte @@ -106,12 +106,14 @@ browseLoading = true; browseError = null; try { - browseEntries = await invoke("list_remote_folder", { + const entries: typeof browseEntries = await invoke("list_remote_folder", { url: webdavUrl, username: webdavUser, password: webdavPass, path: currentBrowsePath, }); + entries.sort((a, b) => (a.is_workspace === b.is_workspace ? 0 : a.is_workspace ? -1 : 1)); + browseEntries = entries; } catch (e) { browseError = String(e); browseEntries = []; diff --git a/apps/tauri/src/lib/stores/app.svelte.ts b/apps/tauri/src/lib/stores/app.svelte.ts index 23b901b..a52071f 100644 --- a/apps/tauri/src/lib/stores/app.svelte.ts +++ b/apps/tauri/src/lib/stores/app.svelte.ts @@ -184,7 +184,14 @@ async function loadLists() { async function loadTasks() { if (!activeListId) return; try { - tasks = await invoke("list_tasks", { listId: activeListId }); + const loaded = await invoke("list_tasks", { listId: activeListId }); + // Deduplicate by task ID — sync conflicts can produce files with the same UUID + const seen = new Set(); + tasks = loaded.filter((t) => { + if (seen.has(t.id)) return false; + seen.add(t.id); + return true; + }); } catch (e) { error = String(e); }