Skip to content

Commit d298983

Browse files
authored
persist user messages for a while (#90)
1 parent d0643a9 commit d298983

File tree

7 files changed

+116
-65
lines changed

7 files changed

+116
-65
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
- Allow filtering tasks by status in analytics commands (log, report, stats)
1213
- Contextual cues in the "Task Log Entry" view
1314

1415
### Changed
1516

1617
- Removed limit on range limit for stats and log
1718
- Missing end date in date range implies today (eg. 2025/08/12...)
1819
- "today" can be used in date range (eg. 2025/08/12...today)
20+
- Improved TUI navigation: (Esc/q) now function from more panes, returning the
21+
user to previous panes in a predictable manner
22+
- User messages in the TUI remain visible for a while
1923

2024
## [v0.5.0] - Feb 22, 2025
2125

internal/ui/handle.go

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ const (
1717
removeFilterMsg = "Remove filter first"
1818
beginTsCannotBeInTheFutureMsg = "Begin timestamp cannot be in the future"
1919
endTsCannotBeInTheFutureMsg = "End timestamp cannot be in the future"
20-
timeSpentLowerBoundMsg = "time spent needs to be at least a minute"
20+
timeSpentLowerBoundMsg = "Time spent needs to be at least a minute"
2121
)
2222

2323
var suggestReloadingMsg = fmt.Sprintf("Something went wrong, please restart hours; let %s know about this error via %s.", c.Author, c.RepoIssuesURL)
2424

2525
func (m *Model) getCmdToCreateOrUpdateTask() tea.Cmd {
2626
if strings.TrimSpace(m.taskInputs[summaryField].Value()) == "" {
27-
m.message = "Task summary cannot be empty"
27+
m.message = errMsg("Task summary cannot be empty")
2828
return nil
2929
}
3030

@@ -36,7 +36,7 @@ func (m *Model) getCmdToCreateOrUpdateTask() tea.Cmd {
3636
case taskUpdateCxt:
3737
selectedTask, ok := m.activeTasksList.SelectedItem().(*types.Task)
3838
if !ok {
39-
m.message = "Something went wrong"
39+
m.message = errMsg("Something went wrong")
4040
return nil
4141
}
4242
cmd = updateTask(m.db, selectedTask, m.taskInputs[summaryField].Value())
@@ -50,12 +50,12 @@ func (m *Model) getCmdToCreateOrUpdateTask() tea.Cmd {
5050
func (m *Model) getCmdToUpdateActiveTL() tea.Cmd {
5151
beginTS, err := time.ParseInLocation(timeFormat, m.tLInputs[entryBeginTS].Value(), time.Local)
5252
if err != nil {
53-
m.message = err.Error()
53+
m.message = errMsgQuick(err.Error())
5454
return nil
5555
}
5656

5757
if beginTS.After(time.Now()) {
58-
m.message = beginTsCannotBeInTheFutureMsg
58+
m.message = errMsgQuick(beginTsCannotBeInTheFutureMsg)
5959
return nil
6060
}
6161

@@ -72,26 +72,26 @@ func (m *Model) getCmdToUpdateActiveTL() tea.Cmd {
7272
func (m *Model) getCmdToFinishTrackingActiveTL() tea.Cmd {
7373
beginTS, err := time.ParseInLocation(timeFormat, m.tLInputs[entryBeginTS].Value(), time.Local)
7474
if err != nil {
75-
m.message = err.Error()
75+
m.message = errMsgQuick(err.Error())
7676
return nil
7777
}
7878

7979
now := time.Now()
8080
if beginTS.After(now) {
81-
m.message = beginTsCannotBeInTheFutureMsg
81+
m.message = errMsgQuick(beginTsCannotBeInTheFutureMsg)
8282
return nil
8383
}
8484

8585
m.activeTLBeginTS = beginTS
8686

8787
endTS, err := time.ParseInLocation(timeFormat, m.tLInputs[entryEndTS].Value(), time.Local)
8888
if err != nil {
89-
m.message = err.Error()
89+
m.message = errMsgQuick(err.Error())
9090
return nil
9191
}
9292

9393
if endTS.After(now) {
94-
m.message = endTsCannotBeInTheFutureMsg
94+
m.message = errMsgQuick(endTsCannotBeInTheFutureMsg)
9595
return nil
9696
}
9797

@@ -130,24 +130,24 @@ func (m *Model) getCmdToFinishActiveTLWithoutComment() tea.Cmd {
130130
func (m *Model) getCmdToCreateOrEditTL() tea.Cmd {
131131
beginTS, err := time.ParseInLocation(timeFormat, m.tLInputs[entryBeginTS].Value(), time.Local)
132132
if err != nil {
133-
m.message = err.Error()
133+
m.message = errMsgQuick(err.Error())
134134
return nil
135135
}
136136

137137
now := time.Now()
138138
if beginTS.After(now) {
139-
m.message = beginTsCannotBeInTheFutureMsg
139+
m.message = errMsgQuick(beginTsCannotBeInTheFutureMsg)
140140
return nil
141141
}
142142

143143
endTS, err := time.ParseInLocation(timeFormat, m.tLInputs[entryEndTS].Value(), time.Local)
144144
if err != nil {
145-
m.message = err.Error()
145+
m.message = errMsgQuick(err.Error())
146146
return nil
147147
}
148148

149149
if endTS.After(now) {
150-
m.message = endTsCannotBeInTheFutureMsg
150+
m.message = errMsgQuick(endTsCannotBeInTheFutureMsg)
151151
return nil
152152
}
153153

@@ -171,15 +171,15 @@ func (m *Model) getCmdToCreateOrEditTL() tea.Cmd {
171171
m.activeView = taskListView
172172
task, ok := m.activeTasksList.SelectedItem().(*types.Task)
173173
if !ok {
174-
m.message = genericErrorMsg
174+
m.message = errMsg(genericErrorMsg)
175175
return nil
176176
}
177177
cmd = insertManualTL(m.db, task.ID, beginTS, endTS, comment)
178178
case tasklogUpdate:
179179
m.activeView = taskLogView
180180
tl, ok := m.taskLogList.SelectedItem().(types.TaskLogEntry)
181181
if !ok {
182-
m.message = genericErrorMsg
182+
m.message = errMsg(genericErrorMsg)
183183
return nil
184184
}
185185
cmd = editSavedTL(m.db, tl.ID, tl.TaskID, beginTS, endTS, comment)
@@ -359,7 +359,7 @@ func (m *Model) goToActiveTask() {
359359
}
360360

361361
if !m.trackingActive {
362-
m.message = "Nothing is being tracked right now"
362+
m.message = errMsg("Nothing is being tracked right now")
363363
return
364364
}
365365

@@ -368,7 +368,7 @@ func (m *Model) goToActiveTask() {
368368
}
369369
activeIndex, ok := m.taskIndexMap[m.activeTaskID]
370370
if !ok {
371-
m.message = genericErrorMsg
371+
m.message = errMsg(genericErrorMsg)
372372
return
373373
}
374374

@@ -410,7 +410,7 @@ func (m *Model) handleRequestToEditSavedTL() {
410410

411411
tl, ok := m.taskLogList.SelectedItem().(types.TaskLogEntry)
412412
if !ok {
413-
m.message = genericErrorMsg
413+
m.message = errMsg(genericErrorMsg)
414414
return
415415
}
416416

@@ -436,18 +436,18 @@ func (m *Model) handleRequestToEditSavedTL() {
436436

437437
func (m *Model) getCmdToDeactivateTask() tea.Cmd {
438438
if m.activeTasksList.IsFiltered() {
439-
m.message = removeFilterMsg
439+
m.message = errMsg(removeFilterMsg)
440440
return nil
441441
}
442442

443443
if m.trackingActive {
444-
m.message = "Cannot deactivate a task being tracked; stop tracking and try again."
444+
m.message = errMsg("Cannot deactivate a task being tracked; stop tracking and try again.")
445445
return nil
446446
}
447447

448448
task, ok := m.activeTasksList.SelectedItem().(*types.Task)
449449
if !ok {
450-
m.message = msgCouldntSelectATask
450+
m.message = errMsg(msgCouldntSelectATask)
451451
return nil
452452
}
453453

@@ -457,21 +457,21 @@ func (m *Model) getCmdToDeactivateTask() tea.Cmd {
457457
func (m *Model) getCmdToDeleteTL() tea.Cmd {
458458
entry, ok := m.taskLogList.SelectedItem().(types.TaskLogEntry)
459459
if !ok {
460-
m.message = "Couldn't delete task log entry"
460+
m.message = errMsg("Couldn't delete task log entry")
461461
return nil
462462
}
463463
return deleteTL(m.db, &entry)
464464
}
465465

466466
func (m *Model) getCmdToActivateDeactivatedTask() tea.Cmd {
467467
if m.inactiveTasksList.IsFiltered() {
468-
m.message = removeFilterMsg
468+
m.message = errMsg(removeFilterMsg)
469469
return nil
470470
}
471471

472472
task, ok := m.inactiveTasksList.SelectedItem().(*types.Task)
473473
if !ok {
474-
m.message = genericErrorMsg
474+
m.message = errMsg(genericErrorMsg)
475475
return nil
476476
}
477477

@@ -481,7 +481,7 @@ func (m *Model) getCmdToActivateDeactivatedTask() tea.Cmd {
481481
func (m *Model) getCmdToStartTracking() tea.Cmd {
482482
task, ok := m.activeTasksList.SelectedItem().(*types.Task)
483483
if !ok {
484-
m.message = genericErrorMsg
484+
m.message = errMsg(genericErrorMsg)
485485
return nil
486486
}
487487

@@ -511,7 +511,7 @@ func (m *Model) handleRequestToStopTracking() {
511511
func (m *Model) getCmdToQuickSwitchTracking() tea.Cmd {
512512
task, ok := m.activeTasksList.SelectedItem().(*types.Task)
513513
if !ok {
514-
m.message = genericErrorMsg
514+
m.message = errMsg(genericErrorMsg)
515515
return nil
516516
}
517517

@@ -535,7 +535,7 @@ func (m *Model) getCmdToQuickSwitchTracking() tea.Cmd {
535535

536536
func (m *Model) handleRequestToCreateTask() {
537537
if m.activeTasksList.IsFiltered() {
538-
m.message = removeFilterMsg
538+
m.message = errMsg(removeFilterMsg)
539539
return
540540
}
541541

@@ -547,13 +547,13 @@ func (m *Model) handleRequestToCreateTask() {
547547

548548
func (m *Model) handleRequestToUpdateTask() {
549549
if m.activeTasksList.IsFiltered() {
550-
m.message = removeFilterMsg
550+
m.message = errMsg(removeFilterMsg)
551551
return
552552
}
553553

554554
task, ok := m.activeTasksList.SelectedItem().(*types.Task)
555555
if !ok {
556-
m.message = genericErrorMsg
556+
m.message = errMsg(genericErrorMsg)
557557
return
558558
}
559559

@@ -605,7 +605,7 @@ func (m *Model) handleRequestToViewTLDetails() {
605605

606606
tl, ok := m.taskLogList.SelectedItem().(types.TaskLogEntry)
607607
if !ok {
608-
m.message = genericErrorMsg
608+
m.message = errMsg(genericErrorMsg)
609609
return
610610
}
611611

@@ -685,7 +685,7 @@ func (m *Model) handleWindowResizing(msg tea.WindowSizeMsg) {
685685

686686
func (m *Model) handleTasksFetchedMsg(msg tasksFetchedMsg) tea.Cmd {
687687
if msg.err != nil {
688-
m.message = "error fetching tasks : " + msg.err.Error()
688+
m.message = errMsg("Error fetching tasks : " + msg.err.Error())
689689
return nil
690690
}
691691

@@ -722,7 +722,7 @@ func (m *Model) handleTasksFetchedMsg(msg tasksFetchedMsg) tea.Cmd {
722722

723723
func (m *Model) handleManualTLInsertedMsg(msg manualTLInsertedMsg) []tea.Cmd {
724724
if msg.err != nil {
725-
m.message = msg.err.Error()
725+
m.message = errMsg(msg.err.Error())
726726
return nil
727727
}
728728

@@ -739,7 +739,7 @@ func (m *Model) handleManualTLInsertedMsg(msg manualTLInsertedMsg) []tea.Cmd {
739739

740740
func (m *Model) handleSavedTLEditedMsg(msg savedTLEditedMsg) []tea.Cmd {
741741
if msg.err != nil {
742-
m.message = msg.err.Error()
742+
m.message = errMsg(msg.err.Error())
743743
return nil
744744
}
745745

@@ -756,7 +756,7 @@ func (m *Model) handleSavedTLEditedMsg(msg savedTLEditedMsg) []tea.Cmd {
756756

757757
func (m *Model) handleTLSFetchedMsg(msg tLsFetchedMsg) {
758758
if msg.err != nil {
759-
m.message = msg.err.Error()
759+
m.message = errMsg(msg.err.Error())
760760
return
761761
}
762762

@@ -783,7 +783,7 @@ func (m *Model) handleTLSFetchedMsg(msg tLsFetchedMsg) {
783783

784784
func (m *Model) handleActiveTaskFetchedMsg(msg activeTaskFetchedMsg) {
785785
if msg.err != nil {
786-
m.message = msg.err.Error()
786+
m.message = errMsg(msg.err.Error())
787787
return
788788
}
789789

@@ -813,7 +813,7 @@ func (m *Model) handleActiveTaskFetchedMsg(msg activeTaskFetchedMsg) {
813813

814814
func (m *Model) handleTrackingToggledMsg(msg trackingToggledMsg) []tea.Cmd {
815815
if msg.err != nil {
816-
m.message = msg.err.Error()
816+
m.message = errMsg(msg.err.Error())
817817
m.trackingActive = false
818818
return nil
819819
}
@@ -823,7 +823,7 @@ func (m *Model) handleTrackingToggledMsg(msg trackingToggledMsg) []tea.Cmd {
823823
task, ok := m.taskMap[msg.taskID]
824824

825825
if !ok {
826-
m.message = genericErrorMsg
826+
m.message = errMsg(genericErrorMsg)
827827
return nil
828828
}
829829

@@ -851,14 +851,14 @@ func (m *Model) handleTrackingToggledMsg(msg trackingToggledMsg) []tea.Cmd {
851851

852852
func (m *Model) handleActiveTLSwitchedMsg(msg activeTLSwitchedMsg) tea.Cmd {
853853
if msg.err != nil {
854-
m.message = msg.err.Error()
854+
m.message = errMsg(msg.err.Error())
855855
return nil
856856
}
857857

858858
lastActiveTask, ok := m.taskMap[msg.lastActiveTaskID]
859859

860860
if !ok {
861-
m.message = suggestReloadingMsg
861+
m.message = errMsg(suggestReloadingMsg)
862862
return nil
863863
}
864864

@@ -868,7 +868,7 @@ func (m *Model) handleActiveTLSwitchedMsg(msg activeTLSwitchedMsg) tea.Cmd {
868868
currentlyActiveTask, ok := m.taskMap[msg.currentlyActiveTaskID]
869869

870870
if !ok {
871-
m.message = suggestReloadingMsg
871+
m.message = errMsg(suggestReloadingMsg)
872872
return nil
873873
}
874874
currentlyActiveTask.TrackingActive = true
@@ -883,7 +883,7 @@ func (m *Model) handleActiveTLSwitchedMsg(msg activeTLSwitchedMsg) tea.Cmd {
883883

884884
func (m *Model) handleTLDeleted(msg tLDeletedMsg) []tea.Cmd {
885885
if msg.err != nil {
886-
m.message = "error deleting entry: " + msg.err.Error()
886+
m.message = errMsg("Error deleting entry: " + msg.err.Error())
887887
return nil
888888
}
889889

@@ -899,13 +899,13 @@ func (m *Model) handleTLDeleted(msg tLDeletedMsg) []tea.Cmd {
899899

900900
func (m *Model) handleActiveTLDeletedMsg(msg activeTaskLogDeletedMsg) {
901901
if msg.err != nil {
902-
m.message = fmt.Sprintf("Error deleting active log entry: %s", msg.err)
902+
m.message = errMsg(fmt.Sprintf("Error deleting active log entry: %s", msg.err))
903903
return
904904
}
905905

906906
activeTask, ok := m.taskMap[m.activeTaskID]
907907
if !ok {
908-
m.message = genericErrorMsg
908+
m.message = errMsg(genericErrorMsg)
909909
return
910910
}
911911

@@ -919,12 +919,12 @@ func (m *Model) handleActiveTLDeletedMsg(msg activeTaskLogDeletedMsg) {
919919

920920
func (m *Model) isDurationValid(start, end time.Time) bool {
921921
if !end.After(start) {
922-
m.message = "End time must be after begin time"
922+
m.message = errMsgQuick("End time must be after begin time")
923923
return false
924924
}
925925

926926
if end.Sub(start).Seconds() < 60 {
927-
m.message = timeSpentLowerBoundMsg
927+
m.message = errMsgQuick(timeSpentLowerBoundMsg)
928928
return false
929929
}
930930
return true

0 commit comments

Comments
 (0)