forked from qor5/admin
/
list_content.go
130 lines (115 loc) · 3.91 KB
/
list_content.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package containers
import (
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"github.com/qor5/ui/vuetify"
"github.com/anshiii/playground-admin/pagebuilder"
"github.com/anshiii/playground-admin/presets"
"github.com/iancoleman/strcase"
"github.com/jinzhu/inflection"
"github.com/qor5/web"
. "github.com/theplant/htmlgo"
"gorm.io/gorm"
)
type ListContent struct {
ID uint
AddTopSpace bool
AddBottomSpace bool
AnchorID string
Items ListItems `sql:"type:text;"`
BackgroundColor string
Link string
LinkText string
LinkDisplayOption string
}
type ListItem struct {
HeadingIcon string
Heading string
Text string
Link string
LinkText string
}
func (*ListContent) TableName() string {
return "container_list_content"
}
type ListItems []*ListItem
func (this ListItems) Value() (driver.Value, error) {
return json.Marshal(this)
}
func (this *ListItems) Scan(value interface{}) error {
switch v := value.(type) {
case string:
return json.Unmarshal([]byte(v), this)
case []byte:
return json.Unmarshal(v, this)
default:
return errors.New("not supported")
}
}
func RegisterListContentContainer(pb *pagebuilder.Builder, db *gorm.DB) {
vb := pb.RegisterContainer("ListContent").
RenderFunc(func(obj interface{}, input *pagebuilder.RenderInput, ctx *web.EventContext) HTMLComponent {
v := obj.(*ListContent)
return ListContentBody(v, input)
})
mb := vb.Model(&ListContent{})
eb := mb.Editing("AddTopSpace", "AddBottomSpace", "AnchorID", "BackgroundColor", "Items", "Link", "LinkText", "LinkDisplayOption")
eb.Field("BackgroundColor").ComponentFunc(func(obj interface{}, field *presets.FieldContext, ctx *web.EventContext) HTMLComponent {
return vuetify.VSelect().
Items([]string{"white", "grey"}).
Value(field.Value(obj)).
Label(field.Label).
FieldName(field.FormKey)
})
eb.Field("LinkDisplayOption").ComponentFunc(func(obj interface{}, field *presets.FieldContext, ctx *web.EventContext) HTMLComponent {
return vuetify.VSelect().
Items([]string{"desktop", "mobile", "all"}).
Value(field.Value(obj)).
Label(field.Label).
FieldName(field.FormKey)
})
fb := pb.GetPresetsBuilder().NewFieldsBuilder(presets.WRITE).Model(&ListItem{}).Only("HeadingIcon", "Heading", "Text", "Link", "LinkText")
eb.Field("Items").Nested(fb, &presets.DisplayFieldInSorter{Field: "Heading"})
}
func ListContentBody(data *ListContent, input *pagebuilder.RenderInput) (body HTMLComponent) {
body = ContainerWrapper(
fmt.Sprintf(inflection.Plural(strcase.ToKebab("ListContent"))+"_%v", data.ID), data.AnchorID, "container-list_content container-lottie",
data.BackgroundColor, "", "",
"", data.AddTopSpace, data.AddBottomSpace, input.IsEditor, "",
Div(
ListItemsBody(data.Items, input),
If(data.LinkText != "" && data.Link != "",
Div(
LinkTextWithArrow(data.LinkText, data.Link),
).Class("container-list_content-link").Attr("data-display", data.LinkDisplayOption),
),
).Class("container-wrapper"),
)
return
}
func ListItemsBody(items []*ListItem, input *pagebuilder.RenderInput) HTMLComponent {
itemsDiv := Div().Class("container-list_content-grid")
for _, i := range items {
itemsDiv.AppendChildren(
Div(
Div(
If(i.Link != "", A(
If(i.HeadingIcon != "", Div(RawHTML(i.HeadingIcon)).Class("container-list_content-icon")),
H3(i.Heading),
).Class("container-list_content-heading").AttrIf("href", i.Link, i.Link != "")),
If(i.Link == "", Div(
If(i.HeadingIcon != "", Div(RawHTML(i.HeadingIcon)).Class("container-list_content-icon")),
H3(i.Heading),
).Class("container-list_content-heading")),
Div(
P(Text(i.Text)),
LinkTextWithArrow(i.LinkText, i.Link),
).Class("container-list_content-content"),
).Class("container-list_content-inner"),
).Class("container-list_content-item").AttrIf("data-has-icon", "true", i.HeadingIcon != ""),
)
}
return itemsDiv
}