Add a new keymap doc that explains contexts, focus scope, command routing, event flow, and how to add bindings.
Update keyboard shortcuts to match current modal and search input bindings
Move task detail modal logic from App into a dedicated TaskDetailModal
component. The modal now manages its own state (open/closed, loading,
error states) and handles its own focus and scroll. App delegates modal
operations to the component and reacts to its events.
Split the task detail modal into its own view and add a generic modal
frame, plus new models and service mapping for task details. Update app layout,
keymaps, and sidebar focus events to support the modal and keyboard flow, with small
UI tweaks like wrapping and scroll handling.
Implemented a full keyboard navigation system with directional commands (C-h/j/k/l) for moving between views,
vim-style navigation (j/k for rows, h/l for columns), and TAB cycling.
Added table header navigation mode where users can move between columns and change sort order with keyboard shortcuts.
The navigation follows visual position: left sidebar, table, and filter bar can all be reached with directional keys.
Created a keymap system with context-aware bindings that resolve commands based on
current focus (Table, TableHeaders, FilterBar, Sidebar).
Commands are dispatched through a centralized handler that manages focus transitions and view state.
Added helper methods to cycle through column headers with proper wrapping.
Auto-select first task on load when tasks exist, and set initial window focus so keyboard shortcuts
work immediately without requiring a mouse click.
Extract duplicate UI update logic from reload_tasks and handle_sync into a shared update_ui_from_tasks method.
Add error notifications to StatusBar so users can see when task loading fails instead of silently showing an empty list.
Fix sidebar to only show pending tasks, filtering out deleted and completed ones.
Move magic numbers to constants in ui.rs (sidebar width, table column widths, date format) to make layout adjustments easier.
Standardize all date formatting to ISO 8601 (YYYY-MM-DD) for consistency across the app.
Added a status bar at the bottom with a sync button that updates the task list from the local database.
The button shows different states (idle, syncing, success, error) with colors and icons, and displays status messages.
Fixed the layout shift bug when clearing filters by giving dropdowns a minimum width.
Also fixed sidebar counts not updating when filters change - now the sidebar shows correct project and tag counts based on filtered tasks.
Extracted reusable button and dropdown styles to keep the UI consistent across components.
Add a card-based UI layout with consistent spacing and visual hierarchy.
The main content and sidebar are now wrapped in styled cards with gaps
between them. New theme tokens (card, raised, hover, divider,
disabled_fg) provide semantic colors for different surface levels and
states.
Create ui.rs module with helper functions (card_style, divider_h,
section_header, priority_badge) to keep styling consistent across views.
Connect sidebar project/tag clicks to filter the task table.
App now observes FilterState changes and triggers task reload.
Removed redundant observer from TaskTable since App handles it.
Fix Panel component that was overwriting its own styles, breaking flex layouts.
Sidebar sections now split space equally and scroll properly.
Add a new TaskTable component that displays tasks in a sortable, paginated table.
Columns include ID, Description, Project, Due, Priority, and Status.
Clicking column headers sorts the data (toggles between ascending and descending).
Priority and status are color-coded based on theme colors.
Update Panel component to accept an ID and simplify child rendering.
Add warning, info, and priority colors (high/medium/low) to Theme.
Add Into<usize> and Into<String> implementations for TaskPriority and TaskStatus to support sorting and display.
Added style support to Label, Panel, List, and Modal components by
implementing the gpui::Styled trait. This allows applying styles
directly to components without wrapping them in divs. Updated sidebar to
use Label component directly with styles instead of nested divs.
loading
- Read data.location from ~/.config/task/taskrc (supports
TASKDATA/TASKRC env vars)
- Add get_overview() method to fetch tasks, projects, tags in one call
(3→1 requests)
- Replace mock data with real TaskWarrior data
- Add logging with env_logger
- Improve tag logging output
- Error handling with TaskError enum and TaskResult<T> alias
- Data models: Task, TaskPriority, TaskStatus, TaskAnnotation
- Advanced filtering: TaskFilter with hierarchical projects, tags
(AND/OR), priority, due dates, and search
- TaskService: Full CRUD, tags, projects, annotations, dependencies,
sync
- Create StatusBar component with 30px fixed height
- Position at bottom of app layout with proper flex column structure
- Add placeholders for vim mode (left) and sync status (right)
- Reorganize App layout to accommodate status bar below main content
Add complete sidebar implementation with:
- ProjectTree model using arena allocator for hierarchical projects
- FilterState model for global filter state management
- Sidebar view with independent scrollable sections
- Project tree with expand/collapse functionality
- Tag selection with toggle support
- Observable filter state shared across components