|
|
|
/*
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
####### gui ####### Copyright (c) 2021 mls-361 ##################################################### MIT License #######
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
|
|
|
package gui
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"forge.chapril.org/armen/jw"
|
|
|
|
g "github.com/maragudk/gomponents"
|
|
|
|
. "github.com/maragudk/gomponents/html"
|
|
|
|
|
|
|
|
"forge.chapril.org/armen/armen/internal/components"
|
|
|
|
)
|
|
|
|
|
|
|
|
type dashboard struct {
|
|
|
|
app components.Application
|
|
|
|
storage components.Storage
|
|
|
|
}
|
|
|
|
|
|
|
|
func newDashboard(ccs *components.Components) *dashboard {
|
|
|
|
return &dashboard{
|
|
|
|
app: ccs.Application,
|
|
|
|
storage: ccs.Storage,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dashboard) title(title string) g.Node {
|
|
|
|
return H1(
|
|
|
|
Class("title"),
|
|
|
|
g.Text(title),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dashboard) empty() g.Node {
|
|
|
|
return Div(
|
|
|
|
Class("value"),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dashboard) value(name string, value int, url string) g.Node {
|
|
|
|
return Div(
|
|
|
|
Class("value"),
|
|
|
|
A(
|
|
|
|
Class("label"),
|
|
|
|
g.Text(name),
|
|
|
|
Href(url),
|
|
|
|
),
|
|
|
|
Span(
|
|
|
|
Class(name),
|
|
|
|
g.Raw(strconv.Itoa(value)),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dashboard) metrics(ms *jw.Metrics) g.Node {
|
|
|
|
const jobURL = "/gui/job/list?status=%s"
|
|
|
|
const wfURL = "/gui/workflow/list?status=%s"
|
|
|
|
|
|
|
|
return Div(
|
|
|
|
Class("metrics"),
|
|
|
|
Div(
|
|
|
|
Class("panel"),
|
|
|
|
Div(
|
|
|
|
d.title("Jobs"),
|
|
|
|
d.value(string(jw.StatusTodo), ms.Jobs.Todo, fmt.Sprintf(jobURL, jw.StatusTodo)),
|
|
|
|
d.value(string(jw.StatusPending), ms.Jobs.Pending, fmt.Sprintf(jobURL, jw.StatusPending)),
|
|
|
|
d.value(string(jw.StatusRunning), ms.Jobs.Running, fmt.Sprintf(jobURL, jw.StatusRunning)),
|
|
|
|
d.value(string(jw.StatusSucceeded), ms.Jobs.Succeeded, fmt.Sprintf(jobURL, jw.StatusSucceeded)),
|
|
|
|
d.value(string(jw.StatusFailed), ms.Jobs.Failed, fmt.Sprintf(jobURL, jw.StatusFailed)),
|
|
|
|
Hr(),
|
|
|
|
d.value("total", ms.Jobs.Total, "/gui/job/list"),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Div(
|
|
|
|
Class("panel"),
|
|
|
|
Div(
|
|
|
|
d.title("Workflows"),
|
|
|
|
d.empty(),
|
|
|
|
d.empty(),
|
|
|
|
d.value(string(jw.StatusRunning), ms.Workflows.Running, fmt.Sprintf(wfURL, jw.StatusRunning)),
|
|
|
|
d.value(string(jw.StatusSucceeded), ms.Workflows.Succeeded, fmt.Sprintf(wfURL, jw.StatusSucceeded)),
|
|
|
|
d.value(string(jw.StatusFailed), ms.Workflows.Failed, fmt.Sprintf(wfURL, jw.StatusFailed)),
|
|
|
|
Hr(),
|
|
|
|
d.value("total", ms.Workflows.Total, "/gui/workflow/list"),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dashboard) content(ms *jw.Metrics) g.Node {
|
|
|
|
return Div(
|
|
|
|
ID("dashboard"),
|
|
|
|
Class("dashboard"),
|
|
|
|
d.metrics(ms),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dashboard) build() g.Node {
|
|
|
|
ms, err := d.storage.Metrics()
|
|
|
|
if err != nil {
|
|
|
|
return buildPage(d.app, "dashboard", g.Text("ERROR")) //AFINIR
|
|
|
|
}
|
|
|
|
|
|
|
|
return buildPage(d.app, "dashboard", d.content(ms))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dashboard) update() g.Node {
|
|
|
|
ms, err := d.storage.Metrics()
|
|
|
|
if err != nil {
|
|
|
|
return g.Text("ERROR") //AFINIR
|
|
|
|
}
|
|
|
|
|
|
|
|
return d.metrics(ms)
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
######################################################################################################## @(°_°)@ #######
|
|
|
|
*/
|