Commit graph

65 commits

Author SHA1 Message Date
Tristan Michael 70af83ccfc Show parent path for non-WebDAV workspaces
When displaying workspace paths in the tasks list, the previous code
showed the full path which could include a tail segment (e.g., a
filename or last folder). This change strips the last path segment for
non-WebDAV workspaces so the UI presents the parent directory instead,
improving clarity for users who expect to see the workspace root rather
than a trailing item.
Fix fallback rendering of workspace path

The previous change grouped the nullish coalescing incorrectly, which
caused the fallback empty string to be applied to the result of
replace(...) rather than to ws?.path. This could lead to rendering
'undefined' or leaving the replace expression unresolved when ws.path is
nullish. Adjust the expression so the nullish fallback applies to
ws?.path, ensuring a clean empty string fallback when no path is
present.
2026-04-05 14:30:22 -07:00
Tristan Michael bb735ecd4a Add workspace rename and restructure settings screen
Full-stack workspace rename: renames folder on disk, updates config
key/path, refreshes frontend. Restructure settings screen with generic
'Workspace Settings' header, workspace name row with kebab menu
(Rename + Delete). Replace per-workspace kebab dropdown in workspace
list with a direct settings gear button. Remove Appearance heading
and border box from theme section. Clean up unused wsMenuName state.
2026-04-05 14:30:22 -07:00
Tristan Michael ca0a5c8ab3 update workspace creation to append workspace name 2026-04-05 07:04:40 -07:00
Tristan Michael 9bde08c2d5 feat: sort workspaces and prevent redundant switches
Sort workspace names alphabetically in the drawer for
better organization. Add a check to prevent switching to
the currently active workspace, avoiding unnecessary
operations and improving user experience.
2026-04-03 16:57:45 -07:00
Tristan Michael 58f37b08d6 fix: harden WebDAV sync — async credentials, consolidated command, Onyx subfolder 2026-04-03 10:11:46 -07:00
Tristan Michael 9e57f1df3c chore: update lock files for log dependency
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:11:40 -07:00
Tristan Michael be6b8d0d90 security: update callers for hardened credential API
- Handle Result from WebDavClient::new in CLI sync, core sync, and Tauri
- Unwrap Zeroizing<String> at Tauri serialization boundary
- Use .as_str() for basic_auth calls with Zeroizing<String> fields

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:11:40 -07:00
Tristan Michael 2a2e362a8f fix: WebDAV sync — Onyx subfolder, timeouts, error display, light theme 2026-04-03 10:11:40 -07:00
Tristan Michael 12afc91110 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) <noreply@anthropic.com>
2026-04-03 04:02:39 -07:00
Tristan Michael a1e97bc0fe feat: per-workspace theme system with 5 theme options
Replaces in-memory darkMode toggle with persisted per-workspace theme
selection. Adds dark, nord, dracula, and solarized CSS theme definitions.
Theme is applied via data-theme attribute and derived isDark class.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 04:02:39 -07:00
Tristan Michael a60b1a997b feat: add WorkspaceMode (local/webdav) and per-workspace theme to config
Introduces WorkspaceMode enum with local and webdav variants, plus a
theme field on WorkspaceConfig. Adds set_workspace_theme and
add_webdav_workspace Tauri commands. WebDAV workspaces auto-manage
local files in app data dir.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 04:02:39 -07:00
Tristan Michael 27e6c07fb3 refactor: rename onyx-tauri to onyx-tasks, add onyx-standalone binary
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:48:25 -07:00
Tristan Michael 2a1866112c feat: add MSI to Windows bundle targets
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:48:21 -07:00
Tristan Michael 7fde1a09f9 fix: harden frontend — toggle race guard, fresh debounce snapshot, error surfacing
Add toggling guard to TaskItem preventing double-toggle from rapid clicks
or swipes. Fix debounced save in TaskDetailView to read task at timeout
time instead of capturing a stale snapshot at call time. Remove unused
_unlistenFs variable. Surface reorder_task and watch_workspace errors
instead of silently swallowing them.
2026-04-02 09:37:43 -07:00
Tristan Michael 3c11539f02 fix: harden Tauri backend — replace unwrap panics, fix watcher lifecycle, strengthen CSP
Replace all .unwrap() calls on repo with repo_ref()/repo_mut() helpers
that return error strings instead of panicking. Stop the old file watcher
before starting a new one on workspace switch to prevent accumulation.
Add object-src and base-uri directives to CSP.
2026-04-02 09:37:43 -07:00
Tristan Michael e0c7292a7e fix: harden sync safety — conflict backup, timestamp parsing, credential zeroization
Back up local files before overwriting during ConflictRemoteWins so data
is never silently lost. Fix false-positive change detection by parsing
timestamps before comparing (different formats like RFC3339 vs HTTP date
were never equal as strings). Add zeroize crate to zero WebDAV credentials
in memory on drop, preventing exposure in core dumps.
2026-04-02 09:37:43 -07:00
Tristan Michael 54836f14e7 fix: improve frontend accessibility, consistency, and resource cleanup
Fix nested interactive elements in TaskItem (button inside button) by
restructuring as div + button with aria-label. Replace native confirm()
with ConfirmDialog for workspace removal. Store fs-changed event unlisten
function for cleanup. Log file watcher errors instead of swallowing them.
Fix var usage to const. Add Firefox scrollbar-width support.
2026-04-02 09:35:38 -07:00
Tristan Michael 3b2cb12272 fix: replace panicking unwrap/expect calls with graceful error handling
Replace .expect() in config path resolution with a fallback default.
Replace all .lock().unwrap() on Tauri AppState mutex with a helper that
converts poisoned locks into error strings. Replace .expect() on Android
app data dir with proper error propagation. Handle LAST_WRITE and WATCHER
global mutex locks gracefully. Propagate subtask cascade delete errors
instead of silently ignoring them.
2026-04-02 09:35:38 -07:00
Tristan Michael 68f1bff93b fix: prevent path traversal, enable CSP, and harden URL domain extraction
Validate that resolved list paths stay within the workspace root to prevent
directory traversal via malicious list names. Enable Content Security Policy
in Tauri config instead of leaving it null. Fix CLI domain extraction to
strip userinfo (user:pass@) from URLs before using as keyring service name.
2026-04-02 09:35:38 -07:00
SteelDynamite 40142cb1ca
Merge pull request #21 from SteelDynamite/remove-flutter
remove flutter
2026-04-02 16:11:05 +01:00
Tristan Michael ddf3829cda remove flutter 2026-04-02 08:10:30 -07:00
Tristan Michael e709d6e4f1 Fix Android crash: resolve config path via Tauri app data dir 2026-04-02 07:51:38 -07:00
Tristan Michael 2f2327e4ca feat: overhaul subtask UX with three-panel navigation, custom confirmations, and main panel header redesign
- Remove subtask expand/collapse foldout from main task list
- Add three-panel slide navigation (task list → task detail → subtask detail) via taskStack
- Create ConfirmDialog component replacing native confirm() dialogs
- Cascade delete: deleting a task with subtasks warns and deletes all children
- Subtask detail view: no nested subtasks, collapsible completed section, inline add at top
- Redesign Move To as inline list in kebab menu (no overflow submenu)
- Main panel header: list name + kebab below divider (matching task detail layout)
- Move list management kebab from drawer to main panel; drawer shows chevrons
- Add Delete Completed to both main panel and subtask kebab menus
- Fix debouncedSave stale reference by snapshotting task before timer
- New subtasks prepend to top of list
2026-04-02 07:22:41 -07:00
Claude 45b7cc57de
feat: add subtask hierarchy UI to Tauri GUI
Wire up the existing parent_id data model into a full subtask UI:
- Backend: create_task accepts parent_id, cascade delete/toggle for subtasks
- Store: subtask-aware derived state (root tasks only in pending/completed),
  childrenMap for O(1) subtask lookup, createTask accepts parentId
- TaskItem: depth-based indentation, subtask completion counter badge
- TasksScreen: expand/collapse chevron for parent tasks, indented subtask
  rendering with left border, subtasks shown under completed parents
- TaskDetailView: "Add subtask" inline input, subtask list with toggleable
  checkboxes, parent task breadcrumb for subtasks

https://claude.ai/code/session_01XWcSekaCAJ7qnr4hN3tgL8
2026-04-02 12:14:56 +00:00
Tristan Michael 326ebd83d8 Gate desktop-only deps for Tauri Android compilation
Make keyring optional behind keyring-storage feature in onyx-core.
Make notify/notify-debouncer-mini optional behind desktop feature in Tauri.
Gate all file watcher code behind #[cfg(not(target_os = "android"))].
Provide env-var-only credential fallbacks when keyring is disabled.
2026-04-01 17:35:57 -07:00
Tristan Michael 95ba90d2c1 DateTimePicker: simplify onTap handler for close icon
Remove the redundant call to _done() in the close icon's onTap handler
and simplify the callback to a single-expression setState. The change
keeps behavior focused on hiding the time view (_showTime = false) and
avoids invoking _done() on close, which aligns with the intended UI flow
signaled by the task notification that the Flutter app relaunch
completed successfully.
2026-04-01 01:35:32 -07:00
Tristan Michael d0af0e80a8 Clear time without closing toast
Previously clicking the clear-time button set includeTime to false and
also called done(), which closed the surrounding toast. This change
removes the done() call so clearing the time only clears the time input
state (includeTime = false) without dismissing the toast UI.
2026-04-01 01:33:30 -07:00
Tristan Michael a13008bb71 Separate time toggle from foldout UI
Replace using a foldout state to indicate time presence with an explicit
time section and a simple "Set time" trigger. This makes the UI
semantics clearer (foldouts shouldn't represent function) and mirrors
the Tauri approach: show a compact "Set time" label when time is hidden,
expand inline time controls when shown, and provide a close icon to
dismiss and apply the time. Minor spacing adjustments were applied to
improve alignment.
2026-04-01 01:31:58 -07:00
Tristan Michael 908ac41a6c DateTimePicker: clear time and emit done on unset
Users couldn't clear the time part of a task's due date because the
"clear time" button only toggled includeTime=false without signalling
the picker to finish. Call done() when clearing the time so the picker
closes/emits the updated value, ensuring the task's has_time state is
updated and the UI reflects a date-only value.
2026-04-01 01:29:08 -07:00
Tristan Michael 6ccc167239 Settings: add WebDAV sync UI and syncing backend
Add WebDAV configuration, credential storage/testing, and sync controls
across Flutter UI and Rust API. This implements a stateful Settings
screen with fields to enter server URL, username, and password, plus
Test and Save actions; persist/load credentials and workspace WebDAV URL
via the Rust API; add sync mode selection, a Sync Now action, and a sync
status indicator in Tasks screen; thread has_time through date/time
pickers, new task creation, task detail updates, and task DTOs;
implement async Rust functions for testing connections, storing/loading
credentials, setting workspace WebDAV config, and triggering workspace
sync with a SyncResult mapped back to Flutter; add tokio runtime
dependency. These changes were needed to enable full WebDAV-based
synchronization and provide users controls and feedback for configuring
and running syncs from the Flutter app.
2026-04-01 01:29:08 -07:00
Tristan Michael 39239fadc3 Style: make sync mode dropdown follow dark theme
Ensure the sync mode <select> uses theme-aware background and text
colors so it matches the application's dark theme. The change adds
appearance-none, explicit light-theme surface/text classes and dark:
variants (dark:bg-surface-dark dark:text-text-dark) so the dropdown no
longer appears white in dark mode and conforms to the rest of the themed
UI.
2026-04-01 01:10:45 -07:00
Tristan Michael a7709f80cc chore: restrict bundle targets to appimage and deb, remove bad schema
Remove the incorrect $schema pointing to a NiceGUI URL. Change bundle
targets from "all" to ["appimage", "deb"] to avoid rpm build failures
on machines without rpm tools.
2026-04-01 01:06:10 -07:00
Tristan Michael 70d519de64 feat: sync status indicators and push/pull mode selection
Add workspace_name and mode params to sync_workspace Tauri command.
After each sync, persist last_sync to WorkspaceConfig and save config.
Frontend gains lastSyncResult and syncMode state; triggerSync reloads
config post-sync and stores the result. SettingsScreen shows a sync
direction selector (Full/Push/Pull) and a last-sync status line.
TasksScreen shows an upload/download count chip after sync completes.
2026-04-01 01:06:10 -07:00
Tristan Michael 72475a552a fix: use has_time flag for due date time tracking
Replace the hours==0 && minutes==0 heuristic with an explicit has_time
bool field on Task. Existing files without the field deserialize as false
(date-only), preserving current behavior. Frontend components pass and
receive has_time through DateTimePicker's onchange callback.
2026-04-01 01:06:10 -07:00
Tristan Michael 3ca49fe8f6 chore: gitignore Flutter generated plugin registrants
Remove auto-generated plugin registrant files from tracking and add
them to .gitignore. These are regenerated by flutter pub get.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:35:41 -07:00
Tristan Michael be65d0e714 feat(flutter): add move, rename, grouping, file watcher
Rust API: add move_task, rename_list, set/get_group_by_due_date,
watch_workspace_changes (stream-based via StreamSink) with notify
crate. Self-change suppression via mute_watcher().

Dart frontend: moveTask, renameList, setGroupByDueDate in AppState.
Move-to bottom sheet in TaskDetailView. Rename dialog and group-by-
due-date toggle in list context menu. File watcher stream subscription
on workspace load/switch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:28:17 -07:00
Tristan Michael 1a967c7fdd 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) <noreply@anthropic.com>
2026-03-31 13:28:06 -07:00
Tristan Michael 5faf285d28 feat(tauri): add move, rename, grouping commands and file watcher
Add Tauri commands: move_task, rename_list, set/get_group_by_due_date,
watch_workspace. Implement file watcher using notify crate with 500ms
debounce and self-change suppression via mute_watcher().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:27:56 -07:00
Tristan Michael aca444a274 rename Flutter app from bevy_tasks to onyx 2026-03-31 09:47:13 -07:00
Tristan Michael c536250072 rename Tauri app from bevy-tasks to onyx 2026-03-31 09:47:07 -07:00
Tristan Michael 8983a1b632 feat(flutter): add UI animations, fix resize overflow, polish menus
- Fix resize overflow by replacing AnimatedPositioned/AnimatedContainer
  with OverflowBox + AnimatedSlide (transform-based, no layout reflow)
- Add slide-up animation for new task toast using AnimationController
- Add fade+scale animation for settings screen overlay
- Add fade+scale animation for kebab menu in task detail view
- Convert workspace switcher from inline dropdown to floating popup
  menu with fade+scale animation and hover states
- Add hover highlights to workspace menu items and fix kebab menu
  hover highlights extending to edges
- Add drawer shadow casting onto main content when open
- Standardize all transition durations to 150ms
- Skip custom border/resize zones on Windows (native frame suffices)
2026-03-31 09:18:02 -07:00
Tristan Michael e1eba4cb83 feat(flutter): add Windows platform support
Add Windows runner files from flutter create, lower Dart SDK
constraint to ^3.11.1 for compatibility, and remove native
border/shadow on Windows since the OS provides it.
2026-03-31 09:17:50 -07:00
SteelDynamite 45c5da7f47
Merge pull request #11 from SteelDynamite/flutter-app
flutter-app
2026-03-31 07:08:53 -07:00
Tristan Michael af61feecc2 chore(tauri): minor config and style updates 2026-03-31 07:06:46 -07:00
Tristan Michael 3b48f5fd86 feat(flutter): add widgets — title bar, task item, detail view, new task, date picker 2026-03-31 07:03:12 -07:00
Tristan Michael 0fc5066f97 feat(flutter): add screens — setup, tasks, settings 2026-03-31 07:03:07 -07:00
Tristan Michael b236892203 feat(flutter): add app shell, theme, and state management 2026-03-31 07:03:02 -07:00
Tristan Michael 85e616c256 feat(flutter): add Rust bridge backend and generated bindings 2026-03-31 07:02:58 -07:00
Tristan Michael 8bfbbd0444 feat(flutter): add project scaffold and Linux runner 2026-03-31 07:02:51 -07:00
Tristan Michael 4d762364d5 feat(gui): refine layout - compact headers, reorganize panels, improve task UX
- Standardize header height (h-11) across detail view and main panel
- Move kebab menu below header in task detail view
- Move workspace switcher to drawer header with window drag support
- Move settings button to drawer footer with label
- Add mark-as-completed/restore to kebab menu, remove bottom action bar
- Enlarge checkbox hit target without changing visual size
- Show checkmark animation before task collapse transition

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 16:51:41 -07:00