It is inside the “user menu” only because this is where Numerus has the same option, although it makes less sense in this case, because Numerus is geared toward individual freelancers while Camper is for companies. But, since it is easy to change afterward, this will do for now. However, it should be only shown to admin users, because regular employees have no UPDATE privilege on the company relation. Thus, the need for a new template function to check if the user is admin. Part of #17.
71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
/*
|
|
* SPDX-FileCopyrightText: 2023 jordi fita mas <jfita@peritasoft.com>
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
package template
|
|
|
|
import (
|
|
"fmt"
|
|
"html/template"
|
|
"io"
|
|
"net/http"
|
|
|
|
"dev.tandem.ws/tandem/camper/pkg/auth"
|
|
httplib "dev.tandem.ws/tandem/camper/pkg/http"
|
|
)
|
|
|
|
func adminTemplateFile(name string) string {
|
|
return "web/templates/admin/" + name
|
|
}
|
|
|
|
func publicTemplateFile(name string) string {
|
|
return "web/templates/public/" + name
|
|
}
|
|
|
|
func MustRenderAdmin(w io.Writer, r *http.Request, user *auth.User, company *auth.Company, filename string, data interface{}) {
|
|
layout := "layout.gohtml"
|
|
if httplib.IsHTMxRequest(r) {
|
|
layout = "htmx.gohtml"
|
|
}
|
|
mustRenderLayout(w, user, company, adminTemplateFile, layout, filename, data)
|
|
}
|
|
|
|
func MustRenderPublic(w io.Writer, r *http.Request, user *auth.User, company *auth.Company, filename string, data interface{}) {
|
|
layout := "layout.gohtml"
|
|
mustRenderLayout(w, user, company, publicTemplateFile, layout, filename, data)
|
|
}
|
|
|
|
func mustRenderLayout(w io.Writer, user *auth.User, company *auth.Company, templateFile func(string) string, layout string, filename string, data interface{}) {
|
|
t := template.New(filename)
|
|
t.Funcs(template.FuncMap{
|
|
"gettext": user.Locale.Get,
|
|
"pgettext": user.Locale.GetC,
|
|
"currentLocale": func() string {
|
|
return user.Locale.Language.String()
|
|
},
|
|
"isLoggedIn": func() bool {
|
|
return user.LoggedIn
|
|
},
|
|
"isAdmin": user.IsAdmin,
|
|
"CSRFHeader": func() string {
|
|
return fmt.Sprintf(`"%s": "%s"`, auth.CSRFTokenHeader, user.CSRFToken)
|
|
},
|
|
"CSRFInput": func() template.HTML {
|
|
return template.HTML(fmt.Sprintf(`<input type="hidden" name="%s" value="%s">`, auth.CSRFTokenField, user.CSRFToken))
|
|
},
|
|
"raw": func(s string) template.HTML {
|
|
return template.HTML(s)
|
|
},
|
|
})
|
|
if _, err := t.ParseFiles(templateFile(layout), templateFile("form.gohtml"), templateFile(filename)); err != nil {
|
|
panic(err)
|
|
}
|
|
if rw, ok := w.(http.ResponseWriter); ok {
|
|
rw.Header().Set("Content-Type", "text/html; charset=utf-8")
|
|
}
|
|
if err := t.ExecuteTemplate(w, layout, data); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|