-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtablecolumn.go
97 lines (87 loc) · 3.27 KB
/
tablecolumn.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
package view
import (
"fmt"
"strings"
"github.com/samber/lo"
"projectforge.dev/projectforge/app/lib/types"
"projectforge.dev/projectforge/app/project/export/enum"
"projectforge.dev/projectforge/app/project/export/files/helper"
"projectforge.dev/projectforge/app/project/export/golang"
"projectforge.dev/projectforge/app/project/export/model"
"projectforge.dev/projectforge/app/util"
)
const ind1 = " "
var (
anchorIcon = "<a title=%q href=\"{%%%%s %s %%%%}\">{%%%%= components.SVGRef(%q, 18, 18, \"\", ps) %%%%}</a>"
anchorMsgNotNull = `%s ` + anchorIcon
anchorMsg = "%s {%%%% if %s%s != nil %%%%}" + anchorIcon + helper.TextEndIfExtra
linkStart = " <a href=\""
)
func viewTableColumn(
g *golang.Template, ret *golang.Block, models model.Models, m *model.Model, link bool,
col *model.Column, modelKey string, prefix string, indent int, enums enum.Enums,
) {
ind := util.StringRepeat(ind1, indent)
rels := m.RelationsFor(col)
if len(rels) == 0 {
viewString := col.ToGoViewString(modelKey, true, false, enums, "table")
ret.W(colRow(ind, col, m.LinkURL(modelKey, enums), viewString, link))
return
}
if types.IsString(col.Type) {
g.AddImport(helper.ImpURL)
}
toStrings := getTableColumnStrings(m, modelKey, rels, models, prefix)
ret.W(ind + helper.TextTDStart)
if col.PK && link {
cv := col.ToGoViewString(modelKey, true, false, enums, "table")
ret.W(ind + linkStart + m.LinkURL(modelKey, enums) + "\">" + cv + toStrings + helper.TextEndAnchor)
} else {
ret.W(ind + ind1 + col.ToGoViewString(modelKey, true, false, enums, "table") + toStrings)
}
lo.ForEach(rels, func(rel *model.Relation, _ int) {
if lo.Contains(rel.Src, col.Name) {
switch col.Type.Key() {
case types.KeyBool, types.KeyInt, types.KeyFloat:
g.AddImport(helper.ImpFmt)
}
relModel := models.Get(rel.Table)
if col.Nullable {
ret.W(anchorMsg, ind, modelKey, col.Proper(), relModel.Title(), rel.WebPath(m, relModel, modelKey), relModel.Icon)
} else {
ret.W(anchorMsgNotNull, ind, relModel.Title(), rel.WebPath(m, relModel, modelKey), relModel.Icon)
}
}
})
ret.W(ind + helper.TextTDEnd)
}
func getTableColumnStrings(m *model.Model, modelKey string, rels model.Relations, models model.Models, prefix string) string {
ret := lo.FilterMap(rels, func(rel *model.Relation, _ int) (string, bool) {
relModel := models.Get(rel.Table)
if !relModel.CanTraverseRelation() {
return "", false
}
srcCol := m.Columns.Get(rel.Src[0])
tgtCol := relModel.Columns.Get(rel.Tgt[0])
k := relModel.CamelPlural()
if prefix != "" {
k = prefix + relModel.ProperPlural()
}
relTitles := relModel.Columns.WithTag("title")
if len(relTitles) == 0 {
relTitles = relModel.PKs()
}
if len(relTitles) == 1 && relTitles[0].Name == tgtCol.Name {
return "", false
}
st, end := "{%% if x := ", "; x != nil %%} ({%%s x.TitleString() %%})"
if srcCol.Nullable && !tgtCol.Nullable {
get := fmt.Sprintf("%sBy%s.Get(*%s%s)", k, srcCol.Proper(), modelKey, srcCol.Proper())
return "{%% if " + modelKey + srcCol.Proper() + " != nil %%}" +
st + get + end + helper.TextEndIf + helper.TextEndIf, true
}
get := fmt.Sprintf("%sBy%s.Get(%s%s)", k, srcCol.Proper(), modelKey, srcCol.Proper())
return st + get + end + helper.TextEndIf, true
})
return strings.Join(ret, "")
}