diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index 1e43832..13ca648 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -624,6 +624,9 @@ func (m *Repository) AdminReservationsCalendar(w http.ResponseWriter, r *http.Re now = time.Date(year, time.Month(month), 1, 0, 0, 0, 0, time.UTC) } + data := make(map[string]interface{}) + data["now"] = now + next := now.AddDate(0, 1, 0) last := now.AddDate(0, -1, 0) @@ -641,9 +644,28 @@ func (m *Repository) AdminReservationsCalendar(w http.ResponseWriter, r *http.Re stringMap["this_month"] = now.Format("01") stringMap["this_month_year"] = now.Format("2006") + // get the first and last days from the month + currentYear, currentMonth, _ := now.Date() + currentLocation := now.Location() + firstOfMonth := time.Date(currentYear, currentMonth, 1, 0, 0, 0, 0, currentLocation) + lastOfMonth := firstOfMonth.AddDate(0, 1, -1) + + intMap := make(map[string]int) + intMap["days_in_month"] = lastOfMonth.Day() + + rooms, err := m.DB.AllRooms() + if err != nil { + helpers.ServerError(w, err) + return + } + + data["rooms"] = rooms + render.Template(w, r, "admin-reservations-calendar.page.tmpl", &models.TemplateData{ StringMap: stringMap, + Data: data, + IntMap: intMap, }) } diff --git a/internal/render/render.go b/internal/render/render.go index 374cf1a..cc2bb80 100644 --- a/internal/render/render.go +++ b/internal/render/render.go @@ -16,7 +16,10 @@ import ( ) var functions = template.FuncMap{ - "humanDate": HumanDate, + "humanDate": HumanDate, + "formatDate": FormatDate, + "iterate": Iterate, + "add": Add, } var ( @@ -34,6 +37,24 @@ func HumanDate(t time.Time) string { return t.Format("2006-01-02") } +func FormatDate(t time.Time, f string) string { + return t.Format(f) +} + +// Iterate returns a slice of ints, starting at 1, going to count +func Iterate(count int) []int { + var i int + var items []int + for i = 0; i < count; i++ { + items = append(items, i) + } + return items +} + +func Add(a, b int) int { + return a + b +} + // AddDefaultData adds default template data func AddDefaultData(td *models.TemplateData, r *http.Request) *models.TemplateData { td.Flash = app.Session.PopString(r.Context(), "flash") diff --git a/internal/repository/dbrepo/postgres.go b/internal/repository/dbrepo/postgres.go index a0463b4..62cdc81 100644 --- a/internal/repository/dbrepo/postgres.go +++ b/internal/repository/dbrepo/postgres.go @@ -386,3 +386,36 @@ func (m *postgresDBRepo) UpdateProcessedForReservation(id, processed int) error } return nil } + +func (m *postgresDBRepo) AllRooms() ([]models.Room, error) { + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + var rooms []models.Room + + query := `select id, room_name, created_at, updated_at from rooms order by room_name` + + rows, err := m.DB.QueryContext(ctx, query) + if err != nil { + return rooms, err + } + defer rows.Close() // To avoid memory leak + + for rows.Next() { + var rm models.Room + err := rows.Scan( + &rm.ID, + &rm.RoomName, + &rm.CreatedAt, + &rm.UpdatedAt, + ) + if err != nil { + return rooms, err + } + rooms = append(rooms, rm) + } + + if err = rows.Err(); err != nil { + return rooms, err + } + return rooms, nil +} diff --git a/internal/repository/dbrepo/test-repo.go b/internal/repository/dbrepo/test-repo.go index 561f3a4..10e3979 100644 --- a/internal/repository/dbrepo/test-repo.go +++ b/internal/repository/dbrepo/test-repo.go @@ -116,3 +116,9 @@ func (m *testDBRepo) DeleteReservation(id int) error { func (m *testDBRepo) UpdateProcessedForReservation(id, processed int) error { return nil } + +func (m *testDBRepo) AllRooms() ([]models.Room, error) { + var rooms []models.Room + + return rooms, nil +} diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 9acacfe..af4b0fe 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -22,4 +22,5 @@ type DatabaseRepo interface { UpdateReservation(r models.Reservation) error DeleteReservation(id int) error UpdateProcessedForReservation(id, processed int) error + AllRooms() ([]models.Room, error) } diff --git a/templates/admin-reservations-calendar.page.tmpl b/templates/admin-reservations-calendar.page.tmpl index 51c6bc6..037bcb0 100644 --- a/templates/admin-reservations-calendar.page.tmpl +++ b/templates/admin-reservations-calendar.page.tmpl @@ -5,9 +5,12 @@ Reservations Calendar {{end}} {{define "content"}} +{{$now := index .Data "now"}} +{{$rooms := index .Data "rooms"}} +{{$dim := index .IntMap "days_in_month"}}
-

{{index .StringMap "this_month"}} {{index .StringMap "this_month_year"}}

+

{{formatDate $now "January"}} {{formatDate $now "2006"}}

@@ -21,5 +24,27 @@ Reservations Calendar
+{{range $rooms}} + {{$roomId := .ID}} +

{{.RoomName}}

+
+ + + {{range $index := iterate $dim}} + + {{end}} + + + {{range $index := iterate $dim}} + + {{end}} + +
+ {{add $index 1}} +
+ +
+
+{{end}}
{{end}}