group.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package widget
  2. import (
  3. "context"
  4. "errors"
  5. "html/template"
  6. "sync"
  7. "time"
  8. "github.com/glanceapp/glance/internal/assets"
  9. )
  10. type Group struct {
  11. widgetBase `yaml:",inline"`
  12. Widgets Widgets `yaml:"widgets"`
  13. }
  14. func (widget *Group) Initialize() error {
  15. widget.withError(nil)
  16. widget.HideHeader = true
  17. for i := range widget.Widgets {
  18. widget.Widgets[i].SetHideHeader(true)
  19. if widget.Widgets[i].GetType() == "group" {
  20. return errors.New("nested groups are not allowed")
  21. }
  22. if err := widget.Widgets[i].Initialize(); err != nil {
  23. return err
  24. }
  25. }
  26. return nil
  27. }
  28. func (widget *Group) Update(ctx context.Context) {
  29. var wg sync.WaitGroup
  30. now := time.Now()
  31. for w := range widget.Widgets {
  32. widget := widget.Widgets[w]
  33. if !widget.RequiresUpdate(&now) {
  34. continue
  35. }
  36. wg.Add(1)
  37. go func() {
  38. defer wg.Done()
  39. widget.Update(ctx)
  40. }()
  41. }
  42. wg.Wait()
  43. }
  44. func (widget *Group) SetProviders(providers *Providers) {
  45. for i := range widget.Widgets {
  46. widget.Widgets[i].SetProviders(providers)
  47. }
  48. }
  49. func (widget *Group) RequiresUpdate(now *time.Time) bool {
  50. for i := range widget.Widgets {
  51. if widget.Widgets[i].RequiresUpdate(now) {
  52. return true
  53. }
  54. }
  55. return false
  56. }
  57. func (widget *Group) Render() template.HTML {
  58. return widget.render(widget, assets.GroupTemplate)
  59. }