grpcApiDashboardEntities.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package grpcapi
  2. import (
  3. apiv1 "github.com/OliveTin/OliveTin/gen/grpc/olivetin/api/v1"
  4. config "github.com/OliveTin/OliveTin/internal/config"
  5. sv "github.com/OliveTin/OliveTin/internal/stringvariables"
  6. "golang.org/x/exp/slices"
  7. )
  8. func buildEntityFieldsets(entityTitle string, tpl *config.DashboardComponent, rr *DashboardRenderRequest) []*apiv1.DashboardComponent {
  9. ret := make([]*apiv1.DashboardComponent, 0)
  10. entityCount := sv.GetEntityCount(entityTitle)
  11. for i := range entityCount {
  12. fs := buildEntityFieldset(tpl, entityTitle, i, rr)
  13. if len(fs.Contents) > 0 {
  14. ret = append(ret, fs)
  15. }
  16. }
  17. return ret
  18. }
  19. func buildEntityFieldset(tpl *config.DashboardComponent, entityTitle string, entityIndex int, rr *DashboardRenderRequest) *apiv1.DashboardComponent {
  20. prefix := sv.GetEntityPrefix(entityTitle, entityIndex)
  21. return &apiv1.DashboardComponent{
  22. Title: sv.ReplaceEntityVars(prefix, tpl.Title),
  23. Type: "fieldset",
  24. Contents: removeFieldsetIfHasNoLinks(buildEntityFieldsetContents(tpl.Contents, prefix, rr)),
  25. CssClass: sv.ReplaceEntityVars(prefix, tpl.CssClass),
  26. }
  27. }
  28. func removeFieldsetIfHasNoLinks(contents []*apiv1.DashboardComponent) []*apiv1.DashboardComponent {
  29. for _, subitem := range contents {
  30. if subitem.Type == "link" {
  31. return contents
  32. }
  33. }
  34. return nil
  35. }
  36. func buildEntityFieldsetContents(contents []config.DashboardComponent, prefix string, rr *DashboardRenderRequest) []*apiv1.DashboardComponent {
  37. ret := make([]*apiv1.DashboardComponent, 0)
  38. for _, subitem := range contents {
  39. c := cloneItem(&subitem, prefix, rr)
  40. if c != nil {
  41. ret = append(ret, c)
  42. }
  43. }
  44. return ret
  45. }
  46. func cloneItem(subitem *config.DashboardComponent, prefix string, rr *DashboardRenderRequest) *apiv1.DashboardComponent {
  47. clone := &apiv1.DashboardComponent{}
  48. clone.CssClass = sv.ReplaceEntityVars(prefix, subitem.CssClass)
  49. if subitem.Type == "" || subitem.Type == "link" {
  50. clone.Type = "link"
  51. clone.Title = sv.ReplaceEntityVars(prefix, subitem.Title)
  52. if !slices.Contains(rr.AllowedActionTitles, clone.Title) {
  53. return nil
  54. }
  55. } else {
  56. clone.Title = sv.ReplaceEntityVars(prefix, subitem.Title)
  57. clone.Type = subitem.Type
  58. }
  59. return clone
  60. }