diff --git a/controllers/addOfficeHourHandler.go b/controllers/addOfficeHourHandler.go index 33322b8..1bdaf5d 100644 --- a/controllers/addOfficeHourHandler.go +++ b/controllers/addOfficeHourHandler.go @@ -2,7 +2,6 @@ package controllers import ( "fmt" - "log" "net/http" "net/mail" "officeHours/config" @@ -149,12 +148,12 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ id, err := b.officeHourRepo.Add(officeHour) if err != nil { w.WriteHeader(http.StatusInternalServerError) - Templates.ExecuteTemplate(w, "addFailure.html", err) + b.serveTemplate(w, "addFailure", err) return } officeHour, _ = b.officeHourRepo.FindById(id) b.requestRepo.Add(officeHour, models.RequestActivate) - Templates.ExecuteTemplate(w, "addSuccess.html", struct{}{}) + b.serveTemplate(w, "addSuccess", nil) } } @@ -165,10 +164,5 @@ func (b *BaseHandler) writeAddOfficeHourMask(w http.ResponseWriter, req *http.Re if len(data.Errors) != 0 { w.WriteHeader(http.StatusBadRequest) } - err := Templates.ExecuteTemplate(w, "addMask.html", data) - if err != nil { - log.Printf("Template addMask.html could not be parsed: %s", err.Error()) - w.Write([]byte(fmt.Sprintf("Template konnte nicht geparst werden : %s", err.Error()))) - return - } + b.serveTemplate(w, "addMask", data) } diff --git a/controllers/confirmRequestHandler.go b/controllers/confirmRequestHandler.go index 09ef51a..7f2060f 100644 --- a/controllers/confirmRequestHandler.go +++ b/controllers/confirmRequestHandler.go @@ -9,17 +9,15 @@ func (b *BaseHandler) ConfirmRequestHandler(w http.ResponseWriter, req *http.Req request, err := b.requestRepo.FindBySecret(secret) if err != nil { - w.WriteHeader(http.StatusNotFound) - Templates.ExecuteTemplate(w, "requestNotFound.html", struct{}{}) + b.serveTemplate(w, "requestNotFound", nil) return } err = b.requestRepo.Execute(request) if err != nil { - w.WriteHeader(http.StatusInternalServerError) - Templates.ExecuteTemplate(w, "executeFailure.html", err.Error()) + b.serveTemplate(w, "executeFailure", err.Error()) return } - Templates.ExecuteTemplate(w, "executeSuccess.html", struct{}{}) + b.serveTemplate(w, "executeSuccess", nil) } diff --git a/controllers/deleteOfficeHourHandler.go b/controllers/deleteOfficeHourHandler.go index c38162e..233dc34 100644 --- a/controllers/deleteOfficeHourHandler.go +++ b/controllers/deleteOfficeHourHandler.go @@ -18,7 +18,7 @@ func (b *BaseHandler) DeleteOfficeHourHandler(w http.ResponseWriter, req *http.R w.WriteHeader(http.StatusBadRequest) } _, err = b.requestRepo.Add(officeHour, models.RequestDelete) - Templates.ExecuteTemplate(w, "deleteSuccess.html", struct{}{}) + b.serveTemplate(w, "deleteSuccess", nil) } else { officeHours, _ := b.officeHourRepo.GetAll(true) timetable, slots := b.GetTimetable(officeHours) diff --git a/controllers/getHandlers.go b/controllers/getHandlers.go index ca410f4..50d055e 100644 --- a/controllers/getHandlers.go +++ b/controllers/getHandlers.go @@ -1,7 +1,6 @@ package controllers import ( - "fmt" "html/template" "net/http" "officeHours/models" @@ -28,6 +27,7 @@ func (b *BaseHandler) GetByCourseHandler(w http.ResponseWriter, req *http.Reques courseid, err := strconv.Atoi(req.FormValue("veranstaltung")) if err != nil { b.RootHandler(w, req) + return } course, err := b.courseRepo.FindById(courseid) if err != nil { @@ -51,9 +51,5 @@ func (b *BaseHandler) writeTimetablePage(w http.ResponseWriter, req *http.Reques SelectedRoom int SelectedCourse int }{courses, rooms, timetable, selectedRoom, selectedCourse} - err := Templates.ExecuteTemplate(w, "index.html", data) - if err != nil { - w.Write([]byte(fmt.Sprintf("Template konnte nicht geparst werden : %s", err.Error()))) - return - } + b.serveTemplate(w, "index", data) } diff --git a/controllers/templates.go b/controllers/templates.go index c87fd8c..da2fa77 100644 --- a/controllers/templates.go +++ b/controllers/templates.go @@ -1,21 +1,47 @@ package controllers import ( + "fmt" "html/template" + "net/http" "officeHours/models" + "os" ) -var Templates, _ = template.Must(template.ParseFiles( - "templates/addFailure.html", - "templates/addMask.html", - "templates/addSuccess.html", - "templates/deleteSuccess.html", - "templates/executeFailure.html", - "templates/executeSuccess.html", - "templates/footer.html", - "templates/head.html", - "templates/index.html", - "templates/officeHourTable.html", - "templates/requestNotFound.html")). - New("").Funcs(template.FuncMap{"DayName": models.DayName, - "divide": func(i int, j int) int { return i / j }}).ParseFiles("templates/confirmationMail", "templates/td.html") +var funcs = template.FuncMap{ + "DayName": models.DayName, + "divide": func(i int, j int) int { return i / j }, +} +var baseTemplate = template.Must(template.ParseFiles("templates/base.html")).New("base.html").Funcs(funcs) + +func (b *BaseHandler) serveTemplate(w http.ResponseWriter, name string, data any) { + full_name := "templates/" + name + ".html" + // check that template exists + info, err := os.Stat(full_name) + if (err != nil && os.IsNotExist(err)) || info.IsDir() { + w.WriteHeader(http.StatusNotFound) + w.Write([]byte("404: Template nicht gefunden.")) + return + } + + tmpl, err := baseTemplate.ParseFiles(full_name) + if err != nil { + // TODO: log.Printf + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("500: Template "+full_name+" konnte nicht geparst werden : %s", err.Error()))) + return + } + // TODO: cache templates in parsed state, but not executed + err = template.Must(tmpl.Clone()).Execute(w, data) + if err != nil { + // TODO: log.Printf + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("500: Template "+full_name+" konnte nicht ausgeführt werden : %s", err.Error()))) + return + } +} + +var RawTemplates = template.Must(template.New("").Funcs(funcs).ParseFiles( + "templates/confirmationMail", + "templates/td.html", + "templates/officeHourTable.html")) diff --git a/controllers/timetable.go b/controllers/timetable.go index a16ba21..7162026 100644 --- a/controllers/timetable.go +++ b/controllers/timetable.go @@ -84,7 +84,7 @@ func (b *BaseHandler) printTimetable(timetable map[models.Date]map[int]models.Of MinuteGranularity int DeleteIcons bool }{OfficeHour: current, MinuteGranularity: b.config.Date.MinuteGranularity, DeleteIcons: deleteIcons} - Templates.ExecuteTemplate(&celldata, "td.html", data) + RawTemplates.ExecuteTemplate(&celldata, "td.html", data) tableBody += celldata.String() } } else { @@ -116,6 +116,6 @@ func (b *BaseHandler) printTimetable(timetable map[models.Date]map[int]models.Of slots[4], template.HTML(tableBody), } - Templates.ExecuteTemplate(&table, "officeHourTable.html", tableData) + RawTemplates.ExecuteTemplate(&table, "officeHourTable.html", tableData) return template.HTML(table.String()) } diff --git a/repositories/request.go b/repositories/request.go index 20bd06b..2ebdb73 100644 --- a/repositories/request.go +++ b/repositories/request.go @@ -128,7 +128,7 @@ func (r *RequestRepo) sendConfirmationMail(request models.Request) error { Config config.Config Request models.Request }{r.config, request} - err := controllers.Templates.ExecuteTemplate(&message, "confirmationMail", data) + err := controllers.RawTemplates.ExecuteTemplate(&message, "confirmationMail", data) if err != nil { log.Printf("Error parsing confirmation Mail: %s", err.Error()) return err diff --git a/templates/addFailure.html b/templates/addFailure.html index f160553..51d4b2d 100644 --- a/templates/addFailure.html +++ b/templates/addFailure.html @@ -1,13 +1,7 @@ - - - - Sprechstunde anlegen - {{template "head.html" .}} - - - Irgendetwas ist schief gegangen. Bitte sende folgende Daten an sprechstundentool@mathebau.de mit einer Beschreibung, was du tun wolltest. -
- {{.}} - {{template "footer.html" .}} - - \ No newline at end of file +{{define "title"}}Fehler{{end}} + +{{define "content"}} +Irgendetwas ist schief gegangen. Bitte sende folgende Daten an sprechstundentool@mathebau.de mit einer Beschreibung, was du tun wolltest. +
+{{.}} +{{end}} diff --git a/templates/addMask.html b/templates/addMask.html index 8fbca62..ec98fa5 100644 --- a/templates/addMask.html +++ b/templates/addMask.html @@ -1,50 +1,52 @@ - - - - Sprechstunde anlegen - {{template "head.html" .}} - - -

- {{range .Errors}}{{.}}
{{end}} -

-
- : -
- : -
- :
- :
- :
- : -
- :
- :
- : -
- :
- -
- {{if ne .Config.Tutor.MailSuffix ""}}Du musst hier eine Email-Adresse angeben, die auf „{{.Config.Tutor.MailSuffix}}“ endet.
{{end}} - Außerdem dürfen in Räumen nur begrenzt viele Sprechstunden gleichzeitig stattfinden, nämlich -
- {{range $room := .Rooms}} -
{{$room.Name}}
{{$room.MaxOccupy}} Sprechstunde{{if gt $room.MaxOccupy 1}}n{{end}}
{{end}} -
- {{template "footer.html" .}} - - \ No newline at end of file +<{{define "title"}}Sprechstunde anlegen{{end}} + +{{define "content"}} +

+ {{range .Errors}}{{.}}
{{end}} +

+
+ : +
+ : +
+ :
+ :
+ :
+ : +
+ :
+ :
+ : +
+ :
+ +
+{{if ne .Config.Tutor.MailSuffix ""}} +Du musst hier eine Email-Adresse angeben, die auf „{{.Config.Tutor.MailSuffix}}“ endet.
+{{end}} +Außerdem dürfen in Räumen nur begrenzt viele Sprechstunden gleichzeitig stattfinden, nämlich +
+ {{range $room := .Rooms}} +
{{$room.Name}}
+
{{$room.MaxOccupy}} Sprechstunde{{if gt $room.MaxOccupy 1}}n{{end}}
+ {{end}} +
+{{end}} diff --git a/templates/addSuccess.html b/templates/addSuccess.html index 272e500..d2ee6ba 100644 --- a/templates/addSuccess.html +++ b/templates/addSuccess.html @@ -1,12 +1,5 @@ - - - - Sprechstunde anlegen - {{template "head.html" .}} - - - Die Sprechstunde wurde angelegt. Du solltest eine Mail mit einem Aktivierungslink erhalten haben. -
- {{template "footer.html" .}} - - \ No newline at end of file +{{define "title"}}Sprechstunde anlegen{{end}} + +{{define "content"}} +Die Sprechstunde wurde angelegt. Du solltest eine Mail mit einem Aktivierungslink erhalten haben. +{{end}} diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..472f333 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,27 @@ + + + + + + + + + + + {{block "title" .}}Start{{end}} – Sprechstunden + + +
+ {{block "content" .}}Du solltest dies nicht sehen.{{end}} +
+ + + + + + diff --git a/templates/deleteSuccess.html b/templates/deleteSuccess.html index 02b14a5..0b98041 100644 --- a/templates/deleteSuccess.html +++ b/templates/deleteSuccess.html @@ -1,13 +1,7 @@ - - - - Sprechstunde löschen - {{template "head.html" .}} - - - Du solltest eine Mail mit einem Bestätigungslink erhalten haben.
- Sie wurde an die Adresse geschickt, mit der die Sprechstunde angelegt wurde. -
- {{template "footer.html" .}} - - \ No newline at end of file +{{define "title"}}Sprechstunde löschen{{end}} + +{{define "content"}} +Du solltest eine Mail mit einem Bestätigungslink erhalten haben.
+Sie wurde an die Adresse geschickt, mit der die Sprechstunde angelegt wurde. +
+{{end}} diff --git a/templates/executeFailure.html b/templates/executeFailure.html index df27062..8deaa43 100644 --- a/templates/executeFailure.html +++ b/templates/executeFailure.html @@ -1,13 +1,7 @@ - - - - Anfrage ausführen fehlgeschlagen - {{template "head.html" .}} - - - Irgendetwas ist schief gegangen. Bitte sende folgende Daten an sprechstundentool@mathebau.de mit einer Beschreibung, was du tun wolltest. -
- {{.}} - {{template "footer.html" .}} - - \ No newline at end of file +{{define "title"}}Anfrage ausführen fehlgeschlagen{{end}} + +{{define "content"}} +Irgendetwas ist schief gegangen. Bitte sende folgende Daten an sprechstundentool@mathebau.de mit einer Beschreibung, was du tun wolltest. +
+{{.}} +{{end}} diff --git a/templates/executeSuccess.html b/templates/executeSuccess.html index 1d4cdca..f30fe9b 100644 --- a/templates/executeSuccess.html +++ b/templates/executeSuccess.html @@ -1,11 +1,5 @@ - - - - Anfrage ausgeführt - {{template "head.html" .}} - - - Deine Anfrage wurde ausgeführt.
- {{template "footer.html" .}} - - \ No newline at end of file +{{define "title"}}Anfrage ausgeführt{{end}} + +{{define "content"}} +Deine Anfrage wurde ausgeführt. +{{end}} diff --git a/templates/footer.html b/templates/footer.html deleted file mode 100644 index 0736807..0000000 --- a/templates/footer.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/templates/head.html b/templates/head.html deleted file mode 100644 index 2b874c2..0000000 --- a/templates/head.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/templates/index.html b/templates/index.html index ce6dd3b..91fad61 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,29 +1,25 @@ - - - - Sprechstunden - {{template "head.html" .}} - - -
- - - -
-
- - - -
- {{.Timetable}} - {{template "footer.html" .}} - - \ No newline at end of file +{{define "title"}}Übersicht{{end}} + +{{define "content"}} +
+ + + +
+
+ + + +
+{{.Timetable}} +{{end}} diff --git a/templates/requestNotFound.html b/templates/requestNotFound.html index edbfd72..9bf0d24 100644 --- a/templates/requestNotFound.html +++ b/templates/requestNotFound.html @@ -1,18 +1,12 @@ - - - - Anfrage bestätigen fehlgeschlagen - {{template "head.html" .}} - - -

- Dieser Bestätigungscode ist nicht verfügbar.
- Bitte gib deinen Bestätigungscode hier ein. -

-
- : - -
- {{template "footer.html" .}} - - \ No newline at end of file +{{define "title"}}Anfrage bestätigen fehlgeschlagen{{end}} + +{{define "content"}} +

+ Dieser Bestätigungscode ist nicht verfügbar.
+ Bitte gib deinen Bestätigungscode hier ein. +

+
+ : + +
+{{end}}