-
-
Notifications
You must be signed in to change notification settings - Fork 201
/
modal.go
144 lines (131 loc) · 3.52 KB
/
modal.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
Nging is a toolbox for webmasters
Copyright (C) 2018-present Wenhui Shen <swh@admpub.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package modal
import (
"html/template"
"os"
"path/filepath"
"strings"
"sync"
"github.com/admpub/confl"
"github.com/admpub/log"
"github.com/webx-top/com"
"github.com/webx-top/echo"
)
var (
modalConfig = map[string]Modal{}
DefaultModal = Modal{
ExtButtons: []Button{},
}
PathFixer = func(ctx echo.Context, conf string) string {
return conf
}
ReadConfigFile = func(file string) ([]byte, error) {
return os.ReadFile(file)
}
WriteConfigFile = func(file string, b []byte) error {
err := com.MkdirAll(filepath.Dir(file), os.ModePerm)
if err != nil {
return err
}
return os.WriteFile(file, b, os.ModePerm)
}
mutext = &sync.RWMutex{}
)
type HTMLAttr struct {
Attr string //属性名
Value interface{} //属性值
}
type Button struct {
Attributes []HTMLAttr //按钮属性
Text string //按钮文本
}
type Modal struct {
Id string //元素id
Custom bool //是否自定义整个内容区域
HeadTitle string //头部标题
Title string //内容标题
Content string //内容
HelpText string //帮助提示
Animate string //动画样式class名
Type string //类型:warning/primary/success/danger
ContentType string //内容类型:form/blackform/""
ExtButtons []Button //附加按钮 [{Text:"🔃重载",Attributes:[{Attr:"class",Value:"btn btn-warning btn-reload"}]}]
}
func UnmarshalFile(ctx echo.Context, confile string) (Modal, error) {
mutext.Lock()
defer mutext.Unlock()
confile = PathFixer(ctx, confile)
ov, ok := modalConfig[confile]
if ok {
return ov, nil
}
b, err := ReadConfigFile(confile)
if err == nil {
err = confl.Unmarshal(b, &ov)
}
if err != nil {
if os.IsNotExist(err) || strings.Contains(err.Error(), `cannot find the file`) {
var b []byte
b, err = confl.Marshal(DefaultModal)
if err == nil {
if WriteConfigFile != nil {
err = WriteConfigFile(confile, b)
}
}
}
if err != nil {
return ov, err
}
}
modalConfig[confile] = ov
return ov, nil
}
func Render(ctx echo.Context, param interface{}) template.HTML {
var data Modal
switch v := param.(type) {
case *Modal:
data = *v
case Modal:
data = v
case string:
var err error
data, err = UnmarshalFile(ctx, v)
if err != nil {
return template.HTML(err.Error())
}
}
b, err := ctx.Fetch(`modal`, data)
if err != nil {
return template.HTML(err.Error())
}
return template.HTML(string(b))
}
func Remove(confPath string) error {
mutext.Lock()
defer mutext.Unlock()
if _, ok := modalConfig[confPath]; ok {
delete(modalConfig, confPath)
log.Debugf(`remove: modalConfig[%s] (remains:%d)`, confPath, len(modalConfig))
}
return nil
}
func Clear() error {
mutext.Lock()
defer mutext.Unlock()
modalConfig = map[string]Modal{}
log.Debugf(`clear: modalConfig (remains:%d)`, len(modalConfig))
return nil
}