// timetable.go package controllers import ( "bytes" "fmt" "html/template" "log" "officeHours/models" "officeHours/templating" ) func (b *BaseHandler) GetTimetable(officeHours []models.OfficeHour) (timetable map[models.Date]map[int]models.OfficeHour, slots []int) { var fullTimetable = make(map[models.Date]map[int]models.OfficeHour) for _, officeHour := range officeHours { var slot int = 0 for minute := 0; minute < officeHour.Duration; minute += b.config.Date.MinuteGranularity { // find slot id _, exists := fullTimetable[models.GetEndDate(officeHour.Date, minute, true)] if exists { _, exists := fullTimetable[models.GetEndDate(officeHour.Date, minute, true)][slot] if exists { slot += 1 minute = 0 continue } } else { fullTimetable[models.GetEndDate(officeHour.Date, minute, true)] = make(map[int]models.OfficeHour) } } for minute := 0; minute < officeHour.Duration; minute += b.config.Date.MinuteGranularity { // write officeHour id to timetable fullTimetable[models.GetEndDate(officeHour.Date, minute, true)][slot] = officeHour } } slots = []int{1, 1, 1, 1, 1} for date, _ := range fullTimetable { if slots[date.Day] < len(fullTimetable[date]) { slots[date.Day] = len(fullTimetable[date]) } } timetable = make(map[models.Date]map[int]models.OfficeHour) for _, officeHour := range officeHours { for slot := 0; slot < slots[officeHour.Date.Day]; slot += 1 { if fullTimetable[officeHour.Date][slot] == officeHour { timetable[officeHour.Date] = make(map[int]models.OfficeHour) timetable[officeHour.Date][slot] = officeHour } } } return fullTimetable, slots } func (b *BaseHandler) printTimetable(timetable map[models.Date]map[int]models.OfficeHour, slots []int, deleteIcons bool) template.HTML { var tableBody string var anyOfficeHourExists bool = false // do not show table if no entry in there for hour := 8; hour < 19; hour += 1 { for minute := 0; minute < 60; minute += b.config.Date.MinuteGranularity { tableBody += "
Aktuell sind keine passenden Sprechstunden eingetragen.
") } var table bytes.Buffer tableData := struct { ColspanMon int ColspanTue int ColspanWed int ColspanThu int ColspanFri int TableBody template.HTML }{ slots[0], slots[1], slots[2], slots[3], slots[4], template.HTML(tableBody), } err := templating.WriteTemplate(&table, "officeHourTable", tableData) if err != nil { err = fmt.Errorf("writing table failed:\n%w", err) log.Println(err.Error()) // TODO: better error wrapping up to top-level request handler } return template.HTML(table.String()) }