aven 0.1.3

Local-first task manager CLI and sync server
Documentation
use super::{SidebarEntry, SidebarEntryTarget, TaskScopeTarget, TaskView, TuiStore};

impl TuiStore {
    pub(super) fn rebuild_sidebar(&mut self) {
        let mut entries = vec![
            SidebarEntry {
                label: "Views".to_string(),
                count: 0,
                target: None,
                section: true,
            },
            view_entry("Queue", self.counts.open, TaskView::Queue),
            view_entry("Open", self.counts.open, TaskView::Open),
            view_entry("Inbox", self.counts.inbox, TaskView::Inbox),
            view_entry("Active", self.counts.active, TaskView::Active),
            view_entry("Backlog", self.counts.backlog, TaskView::Backlog),
            view_entry("Todo", self.counts.todo, TaskView::Todo),
            view_entry("Done", self.counts.done, TaskView::Done),
            view_entry("Conflicts", self.counts.conflicts, TaskView::Conflicts),
            view_entry("Epics", self.counts.epics, TaskView::Epics),
            view_entry(
                "Recent actions",
                self.recent_actions.len() as i64,
                TaskView::RecentActions,
            ),
            view_entry(
                "Search",
                self.view_state.filter_modifiers.task_ids.len() as i64,
                TaskView::Search,
            ),
            SidebarEntry {
                label: String::new(),
                count: 0,
                target: None,
                section: true,
            },
            SidebarEntry {
                label: "Scope".to_string(),
                count: 0,
                target: None,
                section: true,
            },
            SidebarEntry {
                label: "Workspace".to_string(),
                count: self.workspace_open_count(),
                target: Some(SidebarEntryTarget::Scope(TaskScopeTarget::Workspace)),
                section: false,
            },
            SidebarEntry {
                label: String::new(),
                count: 0,
                target: None,
                section: true,
            },
            SidebarEntry {
                label: "Projects".to_string(),
                count: 0,
                target: None,
                section: true,
            },
        ];
        entries.extend(self.projects.iter().map(|project| SidebarEntry {
            label: if project.inbox_count > 0 {
                format!("{} {}*", project.prefix, project.name)
            } else {
                format!("{} {}", project.prefix, project.name)
            },
            count: project.open_count,
            target: Some(SidebarEntryTarget::Scope(TaskScopeTarget::Project(
                project.key.clone(),
            ))),
            section: false,
        }));
        self.sidebar_entries = entries;
    }

    fn workspace_open_count(&self) -> i64 {
        self.projects.iter().map(|project| project.open_count).sum()
    }
}

fn view_entry(label: &str, count: i64, view: TaskView) -> SidebarEntry {
    SidebarEntry {
        label: label.to_string(),
        count,
        target: Some(SidebarEntryTarget::View(view)),
        section: false,
    }
}