feat(tui): add status bar, help overlay, tag filter, and entity actions

Status bar with entity count and context-sensitive key hints. Help
overlay via ? key. Tag filter via # with cursor-navigable tag list.
Todo toggle (x), pin (!), promote (p), demote (D), copy (c), edit (e)
via $EDITOR. Delete confirmation with 3s timeout. Date-grouped list
with completed todo and pinned indicators. Esc clears active tag filter.

Adds CompletedAt/ClearCompleted to EntityUpdate for todo toggling.
This commit is contained in:
2026-05-17 20:33:34 -04:00
parent 36999cd825
commit c2ea63dd16
10 changed files with 804 additions and 77 deletions
+18 -10
View File
@@ -89,16 +89,18 @@ func DefaultListParams() ListParams {
}
type EntityUpdate struct {
Body *string
Title *string
Description *string
Glyph *Glyph
TimeAnchor *string
ClearTime bool
Pinned *bool
CardType *CardType
CardData *string
Tags *[]string
Body *string
Title *string
Description *string
Glyph *Glyph
TimeAnchor *string
ClearTime bool
CompletedAt *time.Time
ClearCompleted bool
Pinned *bool
CardType *CardType
CardData *string
Tags *[]string
}
func (s *Store) Create(e *Entity) error {
@@ -311,6 +313,12 @@ func (s *Store) Update(id string, u *EntityUpdate) error {
sets = append(sets, "time_anchor = ?")
args = append(args, *u.TimeAnchor)
}
if u.ClearCompleted {
sets = append(sets, "completed_at = NULL")
} else if u.CompletedAt != nil {
sets = append(sets, "completed_at = ?")
args = append(args, u.CompletedAt.Format(time.RFC3339))
}
if u.Pinned != nil {
sets = append(sets, "pinned = ?")
args = append(args, boolToInt(*u.Pinned))