(data any, t *template.Template)
| 215 | } |
| 216 | |
| 217 | func (w *widgetBase) renderTemplate(data any, t *template.Template) template.HTML { |
| 218 | w.templateBuffer.Reset() |
| 219 | err := t.Execute(&w.templateBuffer, data) |
| 220 | if err != nil { |
| 221 | w.ContentAvailable = false |
| 222 | w.Error = err |
| 223 | |
| 224 | slog.Error("Failed to render template", "error", err) |
| 225 | |
| 226 | // need to immediately re-render with the error, |
| 227 | // otherwise risk breaking the page since the widget |
| 228 | // will likely be partially rendered with tags not closed. |
| 229 | w.templateBuffer.Reset() |
| 230 | err2 := t.Execute(&w.templateBuffer, data) |
| 231 | |
| 232 | if err2 != nil { |
| 233 | slog.Error("Failed to render error within widget", "error", err2, "initial_error", err) |
| 234 | w.templateBuffer.Reset() |
| 235 | // TODO: add some kind of a generic widget error template when the widget |
| 236 | // failed to render, and we also failed to re-render the widget with the error |
| 237 | } |
| 238 | } |
| 239 | |
| 240 | return template.HTML(w.templateBuffer.String()) |
| 241 | } |
| 242 | |
| 243 | func (w *widgetBase) withTitle(title string) *widgetBase { |
| 244 | if w.Title == "" { |
no test coverage detected