Add task count to task list panel header

Show 'X todo / Y done' in the Tasks panel title bar.

Also includes prior uncommitted work:
- Pagination in fetch_tasks (maxResults=100 + pageToken loop)
- fetch_tasks_since for incremental pull sync
- SyncStats struct with version/last_sync/last_pull/changed counts
- Periodic push (30s) and pull (5min) sync engine
- event::poll(100ms) for non-blocking UI refresh
- Ctrl+R full sync (push + pull)
- refresh_if_needed() to reload data after background sync
- Retry mechanism (MAX_SYNC_RETRIES=3) for sync queue items
- HTTP status code checks in fetch_lists/fetch_tasks/fetch_tasks_since
- Fix move_task URL to use reqwest query()
- Remove CASCADE via replace_all_lists (use insert_list instead)
- has_pending_sync() to prevent pull during pending push
This commit is contained in:
Ruben Rosario
2026-06-21 14:21:14 +01:00
parent ae9910bcbc
commit 6eee90f128
7 changed files with 394 additions and 69 deletions
+3 -1
View File
@@ -3,6 +3,7 @@ pub mod components;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::Frame;
use crate::app::SyncStats;
use crate::domain::models::*;
use components::*;
@@ -42,6 +43,7 @@ pub struct AppView<'a> {
pub task_list_scroll: u16,
pub detail_scroll: u16,
pub auth_error: Option<&'a str>,
pub sync_stats: &'a SyncStats,
}
pub fn draw(frame: &mut Frame, view: AppView) {
@@ -87,7 +89,7 @@ pub fn draw(frame: &mut Frame, view: AppView) {
view.detail_scroll,
);
render_status_bar(frame, status_area, view.network_status);
render_status_bar(frame, status_area, view.network_status, view.sync_stats);
if let Some(popup) = view.show_popup {
match popup {