From f0641dea78ad8e177c4b3328708202c8d61eed63 Mon Sep 17 00:00:00 2001 From: Ralph Ocdol Date: Wed, 16 Jul 2025 20:08:12 +0800 Subject: [PATCH] Added widget-stack that stacks widget for tab group --- internal/glance/templates/stack.html | 9 +++++ internal/glance/widget-stack.go | 53 ++++++++++++++++++++++++++++ internal/glance/widget.go | 2 ++ 3 files changed, 64 insertions(+) create mode 100644 internal/glance/templates/stack.html create mode 100644 internal/glance/widget-stack.go diff --git a/internal/glance/templates/stack.html b/internal/glance/templates/stack.html new file mode 100644 index 00000000..77d4f3de --- /dev/null +++ b/internal/glance/templates/stack.html @@ -0,0 +1,9 @@ +{{ template "widget-base.html" . }} + +{{ define "widget-content-classes" }}widget-content-frameless{{ end }} + +{{ define "widget-content" }} + {{- range $i, $widget := .Widgets }} + {{- .Render -}} + {{- end }} +{{ end }} \ No newline at end of file diff --git a/internal/glance/widget-stack.go b/internal/glance/widget-stack.go new file mode 100644 index 00000000..bebae7d4 --- /dev/null +++ b/internal/glance/widget-stack.go @@ -0,0 +1,53 @@ +package glance + +import ( + "context" + "errors" + "html/template" + "time" +) + +var stackWidgetTemplate = mustParseTemplate("stack.html", "widget-base.html") + +type stackWidget struct { + widgetBase `yaml:",inline"` + containerWidgetBase `yaml:",inline"` +} + +func (widget *stackWidget) initialize() error { + widget.withError(nil) + widget.HideHeader = true + + for i := range widget.Widgets { + + if widget.Widgets[i].GetType() == "stack" { + return errors.New("nested stacks are not supported") + } else if widget.Widgets[i].GetType() == "group" { + return errors.New("groups inside of stacks are not supported") + } else if widget.Widgets[i].GetType() == "split-column" { + return errors.New("split columns inside of stacks are not supported") + } + } + + if err := widget.containerWidgetBase._initializeWidgets(); err != nil { + return err + } + + return nil +} + +func (widget *stackWidget) update(ctx context.Context) { + widget.containerWidgetBase._update(ctx) +} + +func (widget *stackWidget) setProviders(providers *widgetProviders) { + widget.containerWidgetBase._setProviders(providers) +} + +func (widget *stackWidget) requiresUpdate(now *time.Time) bool { + return widget.containerWidgetBase._requiresUpdate(now) +} + +func (widget *stackWidget) Render() template.HTML { + return widget.renderTemplate(widget, stackWidgetTemplate) +} diff --git a/internal/glance/widget.go b/internal/glance/widget.go index 50dc3cb5..ea5c9e07 100644 --- a/internal/glance/widget.go +++ b/internal/glance/widget.go @@ -81,6 +81,8 @@ func newWidget(widgetType string) (widget, error) { w = &serverStatsWidget{} case "to-do": w = &todoWidget{} + case "stack": + w = &stackWidget{} default: return nil, fmt.Errorf("unknown widget type: %s", widgetType) }