package templates import ( "html/template" "net/http" "os" "github.com/ClusterCockpit/cc-backend/config" "github.com/ClusterCockpit/cc-backend/log" ) var templatesDir string var debugMode bool = os.Getenv("DEBUG") == "1" var templates map[string]*template.Template = map[string]*template.Template{} type User struct { Username string // Username of the currently logged in user IsAdmin bool } type Page struct { Title string // Page title Error string // For generic use (e.g. the exact error message on /login) Info string // For generic use (e.g. "Logout successfull" on /login) User User // Information about the currently logged in user Clusters []string // List of all clusters for use in the Header FilterPresets map[string]interface{} // For pages with the Filter component, this can be used to set initial filters. Infos map[string]interface{} // For generic use (e.g. username for /monitoring/user/, job id for /monitoring/job/) Config map[string]interface{} // UI settings for the currently logged in user (e.g. line width, ...) } func init() { bp := "./" ebp := os.Getenv("BASEPATH") if ebp != "" { bp = ebp } templatesDir = bp + "templates/" base := template.Must(template.ParseFiles(templatesDir + "base.tmpl")) files := []string{ "home.tmpl", "404.tmpl", "login.tmpl", "imprint.tmpl", "privacy.tmpl", "config.tmpl", "monitoring/jobs.tmpl", "monitoring/job.tmpl", "monitoring/taglist.tmpl", "monitoring/list.tmpl", "monitoring/user.tmpl", "monitoring/systems.tmpl", "monitoring/status.tmpl", "monitoring/node.tmpl", "monitoring/analysis.tmpl", } for _, file := range files { templates[file] = template.Must(template.Must(base.Clone()).ParseFiles(templatesDir + file)) } } func Render(rw http.ResponseWriter, r *http.Request, file string, page *Page) { t, ok := templates[file] if !ok { panic("templates must be predefinied!") } if debugMode { t = template.Must(template.ParseFiles(templatesDir+"base.tmpl", templatesDir+file)) } if page.Clusters == nil { for _, c := range config.Clusters { page.Clusters = append(page.Clusters, c.Name) } } if err := t.Execute(rw, page); err != nil { log.Errorf("template error: %s", err.Error()) } }