Skip to content

Commit 228c681

Browse files
committed
sandbox: datetime picker component
1 parent c201b5c commit 228c681

File tree

2 files changed

+356
-4
lines changed

2 files changed

+356
-4
lines changed

internal/tui/debug/debug.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"os"
1010
"strings"
11+
"time"
1112

1213
"github.com/charmbracelet/bubbles/viewport"
1314
tea "github.com/charmbracelet/bubbletea"
@@ -37,6 +38,8 @@ type testModel struct {
3738
showDialog bool
3839
filePicker *frame.FilePicker
3940
showFilePicker bool
41+
datePicker *frame.DatePicker
42+
showDatePicker bool
4043
}
4144

4245
func newTestModel() testModel {
@@ -69,6 +72,11 @@ func newTestModel() testModel {
6972
m.filePicker = frame.NewFilePicker(home)
7073
m.showFilePicker = false
7174

75+
// Create a date picker (default to 30 days from now, with time)
76+
futureDate := time.Now().AddDate(0, 0, 30)
77+
m.datePicker = frame.NewDatePicker(futureDate, true)
78+
m.showDatePicker = false
79+
7280
return m
7381
}
7482

@@ -82,6 +90,8 @@ func (m testModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
8290
return m, tea.Quit
8391
case "d":
8492
m.showDialog = !m.showDialog
93+
case "t":
94+
m.showDatePicker = !m.showDatePicker
8595
case "f":
8696
m.showFilePicker = !m.showFilePicker
8797
// Toggle between load and save mode for testing
@@ -96,6 +106,8 @@ func (m testModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
96106
case "tab", "right":
97107
if m.showDialog {
98108
m.dialog.FocusRight()
109+
} else if m.showDatePicker {
110+
m.datePicker.FocusNext()
99111
} else if m.showFilePicker {
100112
// Tab cycles through: file list -> [filename input] -> OK -> Cancel -> file list
101113
if m.filePicker.IsSaveMode() {
@@ -121,6 +133,8 @@ func (m testModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
121133
case "shift+tab", "left":
122134
if m.showDialog {
123135
m.dialog.FocusLeft()
136+
} else if m.showDatePicker {
137+
m.datePicker.FocusPrev()
124138
} else if m.showFilePicker {
125139
// Shift+Tab cycles backward
126140
if m.filePicker.IsSaveMode() {
@@ -164,6 +178,14 @@ func (m testModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
164178
// Left button (Cancel) pressed
165179
m.showDialog = false
166180
}
181+
} else if m.showDatePicker {
182+
if m.datePicker.IsFocusedOk() {
183+
// OK pressed - close date picker
184+
m.showDatePicker = false
185+
} else if m.datePicker.IsFocusedCancel() {
186+
// Cancel pressed
187+
m.showDatePicker = false
188+
}
167189
} else if m.showFilePicker && m.filePicker.Focused == 0 {
168190
// Enter on file list: enter directory or select file
169191
selected := m.filePicker.SelectCurrent()
@@ -173,27 +195,31 @@ func (m testModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
173195
}
174196
}
175197
case "j", "down":
176-
if !m.showDialog && !m.showFilePicker {
198+
if !m.showDialog && !m.showFilePicker && !m.showDatePicker {
177199
m.vp.LineDown(1)
178200
} else if m.showFilePicker {
179201
m.filePicker.MoveDown()
202+
} else if m.showDatePicker {
203+
m.datePicker.DecrementField()
180204
}
181205
case "k", "up":
182-
if !m.showDialog && !m.showFilePicker {
206+
if !m.showDialog && !m.showFilePicker && !m.showDatePicker {
183207
m.vp.LineUp(1)
184208
} else if m.showFilePicker {
185209
m.filePicker.MoveUp()
210+
} else if m.showDatePicker {
211+
m.datePicker.IncrementField()
186212
}
187213
case "u":
188214
if m.showFilePicker {
189215
m.filePicker.GoUp()
190216
}
191217
case "J":
192-
if !m.showDialog && !m.showFilePicker {
218+
if !m.showDialog && !m.showFilePicker && !m.showDatePicker {
193219
m.menu.MoveDown()
194220
}
195221
case "K":
196-
if !m.showDialog && !m.showFilePicker {
222+
if !m.showDialog && !m.showFilePicker && !m.showDatePicker {
197223
m.menu.MoveUp()
198224
}
199225
case "backspace":
@@ -286,6 +312,14 @@ func (m testModel) View() string {
286312
return m.overlayDialog(pickerOutput, final)
287313
}
288314

315+
// Step 10: Render date picker if shown (overlay on top of background).
316+
if m.showDatePicker {
317+
m.datePicker.Width = 60
318+
m.datePicker.Height = frameH - 4
319+
dateOutput := m.datePicker.Render()
320+
return m.overlayDialog(dateOutput, final)
321+
}
322+
289323
return final
290324
}
291325

0 commit comments

Comments
 (0)