diff options
author | T <t@tjp.lol> | 2025-08-13 13:04:05 -0600 |
---|---|---|
committer | T <t@tjp.lol> | 2025-08-13 13:42:43 -0600 |
commit | 389b72e55b04ccfc02b04eb81cb8f7bb7a5c8b59 (patch) | |
tree | be3015b2c7db90cddfc85d3e77ddc76213485494 /internal/tui/modal.go | |
parent | 29c6581e08d0fe98433eff218de7701b51a6861c (diff) |
history filtering
Diffstat (limited to 'internal/tui/modal.go')
-rw-r--r-- | internal/tui/modal.go | 57 |
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 |