summaryrefslogtreecommitdiff
path: root/internal/tui/form.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/tui/form.go')
-rw-r--r--internal/tui/form.go31
1 files changed, 31 insertions, 0 deletions
diff --git a/internal/tui/form.go b/internal/tui/form.go
index 71d5299..7dae012 100644
--- a/internal/tui/form.go
+++ b/internal/tui/form.go
@@ -6,6 +6,8 @@ import (
"strconv"
"time"
+ "punchcard/internal/reports"
+
"github.com/charmbracelet/bubbles/textinput"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
@@ -71,6 +73,24 @@ func newOptionalFloatField(label string) FormField {
return f
}
+func newDateRangeField(label string) FormField {
+ f := FormField{
+ Model: textinput.New(),
+ label: label,
+ }
+ f.Validate = func(s string) error {
+ if s == "" {
+ return errors.New("date range is required")
+ }
+ _, err := reports.ParseDateRange(s)
+ if err != nil {
+ return fmt.Errorf("invalid date range: %v", err)
+ }
+ return nil
+ }
+ return f
+}
+
type Form struct {
fields []FormField
selIdx int
@@ -129,6 +149,17 @@ func NewProjectForm() Form {
return form
}
+func NewHistoryFilterForm() Form {
+ form := NewForm([]FormField{
+ newDateRangeField("Date Range"),
+ {Model: textinput.New(), label: "Client (optional)"},
+ {Model: textinput.New(), label: "Project (optional)"},
+ })
+ form.SelectedStyle = &modalFocusedInputStyle
+ form.UnselectedStyle = &modalBlurredInputStyle
+ return form
+}
+
func (ff Form) Update(msg tea.Msg) (Form, tea.Cmd) {
if msg, ok := msg.(tea.KeyMsg); ok {
switch msg.String() {