/
page.go
102 lines (87 loc) · 2.68 KB
/
page.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
package okr
import (
_ "embed"
"fmt"
"github.com/flowline-io/flowbot/internal/page/library"
"github.com/flowline-io/flowbot/internal/page/uikit"
"github.com/flowline-io/flowbot/internal/ruleset/page"
"github.com/flowline-io/flowbot/internal/store"
"github.com/flowline-io/flowbot/internal/types"
"github.com/maxence-charriere/go-app/v9/pkg/app"
)
const (
okrPageId = "okr"
)
//go:embed static/okr.css
var exampleCss string
//go:embed static/okr.js
var exampleJs string
var pageRules = []page.Rule{
{
Id: okrPageId,
UI: func(ctx types.Context, flag string) (*types.UI, error) {
p, err := store.Database.ParameterGet(flag)
if err != nil {
return nil, err
}
sequence, _ := types.KV(p.Params).Int64("sequence")
objective, err := store.Database.GetObjectiveBySequence(ctx.AsUser, ctx.Original, sequence)
if err != nil {
return nil, err
}
keyResult, err := store.Database.ListKeyResultsByObjectiveId(int64(objective.ID))
if err != nil {
return nil, err
}
ratio := float64(0)
if objective.TotalValue != 0 {
ratio = float64(objective.CurrentValue) / float64(objective.TotalValue) * 100
}
css := []app.UI{
uikit.Css(exampleCss),
}
js := []app.HTMLScript{
uikit.Script(library.VueJs),
uikit.Js(exampleJs),
}
app := uikit.App(
uikit.Div(
uikit.Text("Title").Class("okr-title"),
uikit.Div(
uikit.Text(objective.Title),
uikit.Text("Progress").Class("okr-item-title"),
uikit.Div(
uikit.Div(
uikit.Div().Class("progress-line progress-inner").Style("width", fmt.Sprintf("%.2f%%", ratio)),
).Class("progress-bg-line progress-bg"),
uikit.Text(ratio).Class("ratio"),
).Class("okr-progress"),
uikit.Text("Memo").Class("okr-item-title"),
uikit.Text(objective.Memo).Class("okr-memo"),
uikit.Text("Motive").Class("okr-item-title"),
uikit.Text(objective.Motive).Class("okr-motive"),
uikit.Text("Feasibility").Class("okr-item-title"),
uikit.Text(objective.Feasibility).Class("okr-feasibility"),
uikit.Text("KeyResult").Class("okr-item-title"),
uikit.Div(
app.Range(keyResult).Slice(func(i int) app.UI {
return uikit.Div(
uikit.Text(fmt.Sprintf("#%d %s", keyResult[i].Sequence, keyResult[i].Title)).Class("title"),
uikit.Text(fmt.Sprintf("%d -> %d", keyResult[i].CurrentValue, keyResult[i].TargetValue)).Class("value"),
).Class("okr-keyresult-item")
}),
).Class("okr-keyresult"),
),
).Class("okr"),
uikit.Countdown(p.ExpiredAt),
)
return &types.UI{
Title: "OKR",
App: app,
CSS: css,
JS: js,
Global: types.KV(p.Params),
}, nil
},
},
}