package templates import ( "fmt" "backend/internal/auth" "backend/internal/db/sqlc" ) // PlanningCalendarPage is the top-level page template for the /planning route. // It renders the appropriate view (month / week / day) based on cal.View. templ PlanningCalendarPage(user *auth.User, csrfToken string, activePath string, sidebarTablos []sqlc.Tablo, cal PlanningCalendar, pageTitle string, breadcrumb []BreadcrumbItem) { @AppLayout("Planning - Xtablo", user, csrfToken, activePath, sidebarTablos, pageTitle, breadcrumb, nil) {
@PlanningHeader(cal) if cal.View == "month" { @PlanningMonthView(cal) } else { @PlanningWeekDayView(cal) }
} } // PlanningHeader renders the navigation row: prev/today/next + period label + view toggle. templ PlanningHeader(cal PlanningCalendar) {
{ cal.Label }
Month Week Day
} // --------------------------------------------------------------------------- // Month view // --------------------------------------------------------------------------- templ PlanningMonthView(cal PlanningCalendar) {
Mon
Tue
Wed
Thu
Fri
Sat
Sun
for _, week := range cal.Weeks { for _, day := range week { @MonthDayCell(day) } }
} templ MonthDayCell(day CalendarDay) { if day.OtherMonth {
{ fmt.Sprintf("%d", day.DayNum) }
} else if day.IsToday {
{ fmt.Sprintf("%d", day.DayNum) } for _, ev := range day.Events { @CalEventChip(ev) }
} else {
{ fmt.Sprintf("%d", day.DayNum) } for _, ev := range day.Events { @CalEventChip(ev) }
} } templ CalEventChip(ev CalendarEvent) { if ev.Style != "" { if ev.TimeLabel != "" { { ev.TimeLabel } } { ev.Title } } else { if ev.TimeLabel != "" { { ev.TimeLabel } } { ev.Title } } } // --------------------------------------------------------------------------- // Week / Day view (shared layout with mini-month panel + timeline) // --------------------------------------------------------------------------- templ PlanningWeekDayView(cal PlanningCalendar) {
@MiniMonthPanel(cal)
for _, day := range cal.Days { if day.IsToday {
{ day.Label }
} else {
{ day.Label }
} }
for _, slot := range cal.HourSlots {
{ slot }
}
for _, day := range cal.Days { @TimelineDayCol(day) }
} templ TimelineDayCol(day CalendarDayColumn) {
for range day.Events { } for i := range [14]struct{}{} {
} for _, ev := range day.Events { @TimelineEventBlock(ev) }
} templ TimelineEventBlock(ev CalendarTimeEvent) { if ev.Style != "" { { ev.Title } } else { { ev.Title } } } // --------------------------------------------------------------------------- // Mini-month panel // --------------------------------------------------------------------------- templ MiniMonthPanel(cal PlanningCalendar) {

{ cal.MiniMonthLabel }

M
T
W
T
F
S
S
for _, week := range cal.MiniMonth {
for _, d := range week { @MiniDayCell(d) }
}
} templ MiniDayCell(d MiniCalDay) { if d.IsToday { { fmt.Sprintf("%d", d.DayNum) } } else if d.InWeek { { fmt.Sprintf("%d", d.DayNum) } } else { { fmt.Sprintf("%d", d.DayNum) } } } // --------------------------------------------------------------------------- // Legacy agenda templates kept for reference (no longer used by handler) // --------------------------------------------------------------------------- templ PlanningDaySeparator(label string) {
  • { label }
  • } templ PlanningEventListItem(event PlanningEventRow) {
  • { event.TimeRange } { event.Title }
    if event.HasColor { } { event.TabloTitle } if event.HasLocation { { event.Location } }
  • }