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) {
}
// ---------------------------------------------------------------------------
// Month view
// ---------------------------------------------------------------------------
templ PlanningMonthView(cal PlanningCalendar) {
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 _, 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 }
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 }
}
}