summaryrefslogtreecommitdiff
path: root/internal/tui/modal.go
diff options
context:
space:
mode:
authorT <t@tjp.lol>2025-08-13 13:04:05 -0600
committerT <t@tjp.lol>2025-08-13 13:42:43 -0600
commit389b72e55b04ccfc02b04eb81cb8f7bb7a5c8b59 (patch)
treebe3015b2c7db90cddfc85d3e77ddc76213485494 /internal/tui/modal.go
parent29c6581e08d0fe98433eff218de7701b51a6861c (diff)
history filtering
Diffstat (limited to 'internal/tui/modal.go')
-rw-r--r--internal/tui/modal.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/internal/tui/modal.go b/internal/tui/modal.go
index 9a72336..8277077 100644
--- a/internal/tui/modal.go
+++ b/internal/tui/modal.go
@@ -9,6 +9,7 @@ import (
"punchcard/internal/actions"
"punchcard/internal/queries"
+ "punchcard/internal/reports"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss/v2"
@@ -21,6 +22,7 @@ const (
ModalTypeProject
ModalTypeDeleteConfirmation
ModalTypeEntry
+ ModalTypeHistoryFilter
)
func (mt ModalType) newForm() Form {
@@ -31,6 +33,8 @@ func (mt ModalType) newForm() Form {
return NewClientForm()
case ModalTypeProject:
return NewProjectForm()
+ case ModalTypeHistoryFilter:
+ return NewHistoryFilterForm()
}
return Form{}
@@ -85,6 +89,8 @@ func (m ModalBoxModel) Render() string {
return m.RenderFormModal("👤 Client")
case ModalTypeProject:
return m.RenderFormModal("📂 Project")
+ case ModalTypeHistoryFilter:
+ return m.RenderFormModal("🔍 History Filter")
default: // REMOVE ME
return "DEFAULT CONTENT"
}
@@ -216,6 +222,57 @@ func (m *ModalBoxModel) SubmitForm(am AppModel) tea.Cmd {
msg := am.refreshCmd()
return func() tea.Msg { return msg }
+
+ case ModalTypeHistoryFilter:
+ if err := m.form.Error(); err != nil {
+ return reOpenModal()
+ }
+
+ // Parse date range
+ dateRangeStr := m.form.fields[0].Value()
+ dateRange, err := reports.ParseDateRange(dateRangeStr)
+ if err != nil {
+ m.form.fields[0].Err = fmt.Errorf("invalid date range: %v", err)
+ return reOpenModal()
+ }
+
+ // Create new filter
+ newFilter := HistoryFilter{
+ StartDate: dateRange.Start,
+ EndDate: nil,
+ ClientID: nil,
+ ProjectID: nil,
+ }
+
+ // Set end date if the parsed range has one
+ if !dateRange.End.IsZero() {
+ newFilter.EndDate = &dateRange.End
+ }
+
+ // Parse client filter if provided
+ clientStr := m.form.fields[1].Value()
+ if clientStr != "" {
+ client, err := actions.New(am.queries).FindClient(context.Background(), clientStr)
+ if err != nil {
+ m.form.fields[1].Err = fmt.Errorf("client not found: %s", clientStr)
+ return reOpenModal()
+ }
+ newFilter.ClientID = &client.ID
+ }
+
+ // Parse project filter if provided
+ projectStr := m.form.fields[2].Value()
+ if projectStr != "" {
+ project, err := actions.New(am.queries).FindProject(context.Background(), projectStr)
+ if err != nil {
+ m.form.fields[2].Err = fmt.Errorf("project not found: %s", projectStr)
+ return reOpenModal()
+ }
+ newFilter.ProjectID = &project.ID
+ }
+
+ // Return filter update message
+ return func() tea.Msg { return updateHistoryFilter(newFilter) }
}
return nil