diff --git a/tui/newEventForm.go b/tui/newEventForm.go index e7173fc..82cbc16 100644 --- a/tui/newEventForm.go +++ b/tui/newEventForm.go @@ -1,7 +1,6 @@ package tui import ( - "context" "strconv" "git.skdevstudios.com/SK-Development-Studios/go-cal-tui/internal/storage" @@ -10,7 +9,7 @@ import ( "github.com/charmbracelet/huh" ) -func showEventForm(ctx context.Context, onSubmit func(storage.EventInput)) error { +func showEventForm(onSubmit func(storage.EventInput)) error { var title, description, year, month, day, startHour, endHour, color string form := huh.NewForm( diff --git a/tui/update.go b/tui/update.go index e15b3ba..cb5cfdf 100644 --- a/tui/update.go +++ b/tui/update.go @@ -1,7 +1,6 @@ package tui import ( - "context" "time" "git.skdevstudios.com/SK-Development-Studios/go-cal-tui/internal/storage" @@ -86,7 +85,7 @@ func (m model) updateHourlyView(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyMsg: switch msg.String() { case "n": - showEventForm(context.Background(), func(e storage.EventInput) { + showEventForm(func(e storage.EventInput) { _ = storage.SaveEvent(e) }) case "esc": diff --git a/tui/view.go b/tui/view.go index e69de29..940fd40 100644 --- a/tui/view.go +++ b/tui/view.go @@ -0,0 +1,140 @@ +package tui + +import ( + "fmt" + "git.skdevstudios.com/SK-Development-Studios/go-cal-tui/internal/storage" + "github.com/charmbracelet/lipgloss" + "strings" + "time" +) + +func (m model) View() string { + switch m.mode { + case monthView: + return m.viewMonth() + case hourlyView: + return m.viewHourly() + default: + return m.viewMonth() + } +} + +func (m model) viewMonth() string { + var out string + + // Create time object for the first day of the selected month/year + monthTime := time.Date(m.year, time.Month(m.monthIndex+1), 1, 0, 0, 0, 0, time.UTC) + + // Render header showing "Month Year" + header := headerStyle.Render(monthTime.Format("January 2006")) + out += header + "\n" + + // Render abbreviated weekday names + weekdays := []string{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"} + for _, day := range weekdays { + out += daysOfWeekStyle.Render(day) + } + out += "\n" + + // Create row and column index slices for range-based iteration + rows := make([]struct{}, numRows) + cols := make([]struct{}, numCols) + + day := 1 + for r := range rows { + for c := range cols { + cellNum := r*numCols + c + var content string + + if cellNum >= m.startOffset && day <= m.daysInMonth { + content = fmt.Sprintf("%2d", day) + + if r == m.cursorRow && c == m.cursorCol { + out += selectedStyle.Render(content) + } else { + today := time.Now() + isToday := m.year == today.Year() && + m.monthIndex == int(today.Month())-1 && + day == today.Day() + + if isToday { + out += todayStyle.Render(content) + } else { + out += unselectedStyle.Render(content) + } + } + day++ + } else { + out += cellStyle.Render("") + } + } + out += "\n" + } + + out += "\n[a]/[d] to change month, [up]/[down]/[left]/[right] keys to move, [enter] to select a day, [q] to quit." + return out +} + + +func (m model) viewHourly() string { + var b strings.Builder + + // Construct the date object for the selected day + date := time.Date(m.year, time.Month(m.monthIndex+1), m.selectedDay, 0, 0, 0, 0, time.UTC) + header := headerStyle.Render(date.Format("Monday, Jan 2, 2006")) + b.WriteString(header + "\n\n") + + // Load all events for the current day + events, _ := storage.GetEventsForDay(int32(m.year), int32(m.monthIndex+1), int32(m.selectedDay)) + + // Create slice of 24 integers for each hour of the day + hours := make([]int, 24) + for i := range hours { + hours[i] = i + } + + for _, hour := range hours { + label := fmt.Sprintf("%02d:00", hour) + styled := false + + // Render events that span the current hour + for _, e := range events { + if hour >= int(e.StartHour) && hour < int(e.EndHour) { + style := hourCellStyle.Background(lipgloss.Color(e.Color)) + + if hour == m.hourCursor { + if hour == int(e.StartHour) { + label = style.Bold(true).Render("▶ " + fmt.Sprintf("%02d:00 - %s", hour, e.Title)) + } else { + label = style.Bold(true).Render("▶ " + label) + } + } else { + if hour == int(e.StartHour) { + label = style.Render(" " + fmt.Sprintf("%02d:00 - %s", hour, e.Title)) + } else { + label = style.Render(" " + label) + } + } + + styled = true + break + } + } + + if !styled { + if hour == m.hourCursor { + label = hourSelectedStyle.Render("▶ " + label) + } else if hour == time.Now().Hour() { + label = currentHourStyle.Render(" " + label) + } else { + label = hourCellStyle.Render(" " + label) + } + } + + b.WriteString(label + "\n") + } + + b.WriteString("[n] to add event, [up]/[down] keys to move, [Esc] to go back to month view, [q] to quit.") + return b.String() +} +