Commit graph

296 commits

Author SHA1 Message Date
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
SteelDynamite 6aa87b6df9
Merge pull request #16 from SteelDynamite/sync-selective-modes-last-sync-has-time
sync-selective-modes-last-sync-has-time
2026-04-01 01:38:47 -07:00
Tristan Michael 12b500ef6f docs: update CLAUDE.md and PLAN.md to reflect Phase 3 completion
Mark all Phase 3 features complete: has_time, sync status indicators,
push/pull mode, desktop packaging (Linux), and Flutter GUI parity.
Update current state date and feature lists.
2026-04-01 01:38:18 -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
SteelDynamite 970ed9aa1d
Merge pull request #15 from SteelDynamite/plan-phase4-mobile-builds
Mobile support: expand plan with Flutter + Tauri details
2026-04-01 01:05:56 -07:00
Tristan Michael 376191aee2 Mobile support: expand plan with Flutter + Tauri details
Clarify mobile phase goals and add concrete, actionable steps to get
both Flutter and Tauri GUIs building on Android and iOS. The update
highlights iOS requiring macOS, lists known blockers (desktop-only
packages and incompatible crates), provides Android/iOS prerequisites
and build commands, and adds feature checklists and deliverables to
guide implementation and CI setup.
2026-04-01 00:59:20 -07:00
SteelDynamite 120b5bf83c
Merge pull request #14 from SteelDynamite/phase3-mvp
phase3-mvp
2026-03-31 13:38:24 -07:00
Tristan Michael 471f181564 docs: update CLAUDE.md and PLAN.md for Phase 3 progress
Mark completed features: move task, rename list, due date picker,
group-by-due-date toggle, keyboard shortcuts, WebDAV credentials
flow, file watcher. Update current state date, add Flutter GUI to
architecture section, revise remaining TODO list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:37:37 -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 2e75e1df28 chore: update lockfile and Flutter generated plugin registrants
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:28:25 -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 c4c03679ae feat(core): add move_task and rename_list to onyx-core
Add TaskRepository::move_task() to move tasks between lists and
rename_list() to rename lists on the filesystem. Adds rename_list
to the Storage trait with FileSystemStorage implementation.
Includes tests for both operations plus duplicate-name error case.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:27:47 -07:00
SteelDynamite 6959b1f44f
Merge pull request #13 from SteelDynamite/rename-to-onyx
rename-to-onyx
2026-03-31 09:48:40 -07:00
Tristan Michael 13da81fae6 update project docs, workspace config, and lockfile for onyx rename 2026-03-31 09:47:19 -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 27363c8424 rename onyx-cli crate (formerly bevy-tasks-cli) 2026-03-31 09:47:02 -07:00
Tristan Michael 9e204ef818 rename onyx-core crate (formerly bevy-tasks-core) 2026-03-31 09:46:56 -07:00
SteelDynamite 8b5894bff2
Merge pull request #12 from SteelDynamite/flutter-windows
flutter-windows
2026-03-31 09:20:04 -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
SteelDynamite 64015f2f5d
Merge pull request #10 from SteelDynamite/tauri-tweaks
chore(tauri): minor config and style updates
2026-03-31 07:07:40 -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
SteelDynamite 2a0fb03421
Merge pull request #9 from SteelDynamite/gui-layout-refinements
feat(gui): refine layout - compact headers, reorganize panels, improve task UX
2026-03-30 16:52:16 -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
SteelDynamite 6c09ef6b4c
Merge pull request #8 from SteelDynamite/audit-and-fixes
audit-and-fixes
2026-03-30 16:51:36 -07:00
Tristan Michael b863e025d5 refactor(cli): consolidate output through output module
- Add header(), detail(), item(), blank() functions to output.rs
- Replace all raw println!() calls with output::* equivalents
- Fix {:?} debug format for paths — use .display() for clean output
- Extract print_tasks() helper to deduplicate task display logic
- Consistent formatting: info for empty states, item for list entries
2026-03-30 16:29:57 -07:00
Tristan Michael c32a6fbe8b fix(core): resolve all Clippy warnings
- Replace redundant closures with function references (webdav.rs, sync.rs)
- Use is_some_and instead of map_or(false, ...) (sync.rs)
- Use map instead of and_then(|x| Some(...)) (sync.rs)
- Use if-let instead of single-arm match (webdav.rs)
2026-03-30 16:29:47 -07:00
Tristan Michael 60fbbd75b8 fix(cli): add confirmation prompt before task deletion
Match the existing confirmation pattern used by list delete and
workspace remove commands.
2026-03-30 16:24:46 -07:00
Tristan Michael c138a8bcf6 fix(gui): wire sync credentials, fix memory leak, race condition, add delete confirmations
- Add load_credentials Tauri command and use it in triggerSync() instead
  of passing empty username/password strings
- Replace raw __TAURI_INTERNALS__.invoke() with proper invoke import in
  SettingsScreen
- Wrap window event listeners in $effect() with cleanup to prevent
  memory leak on component remount
- Return created Task from createTask() and use it directly in
  NewTaskInput instead of guessing from array index
- Add confirm() dialogs before deleting tasks, lists, and workspaces
2026-03-30 16:24:46 -07:00
Tristan Michael a54e427cd9 fix(core): sanitize task filenames to prevent path traversal
Replace illegal filesystem characters (/ \ : * ? " < > |) and control
characters with underscores. Fall back to task ID as filename if the
sanitized title is empty.
2026-03-30 16:24:46 -07:00
Tristan Michael 9333ac7825 docs: update documentation, add LICENSE, fix outdated info
- Add GPL-3.0 LICENSE file
- Update README with current project status (all 3 phases), fix structure
- Update PLAN.md Phase 2 API signatures to match actual implementation
- Add WebDAV & Sync section to docs/API.md
- Update docs/DEVELOPMENT.md with Tauri app structure and setup
- Add metadata (description, license, repository) to all Cargo.toml files
- Update .gitignore with node_modules, .env, dist, build entries
- Remove stale Cargo.lock from .gitignore (apps should track it)
- Update example dates from 2025 to 2026 across all docs
- Update CLAUDE.md date to 2026-03-30
2026-03-30 16:24:46 -07:00
SteelDynamite 56e3021281
Merge pull request #7 from SteelDynamite/gui-window-and-task-input
Gui window and task input
2026-03-30 10:11:28 -07:00
Tristan Michael 04758db04e Restyle new task sheet to match task detail view layout
Use the same visual structure as TaskDetailView: large bold title input,
description textarea with notes icon, and date/time row with
DateTimePicker. Uses fixed positioning with a combined backdrop wrapper
to avoid layout shifts and ensure proper slide-up animation.

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