Files
am-scripts/cmd/ss/ui.go
2026-03-30 13:58:13 -04:00

165 lines
2.9 KiB
Go

package main
import (
"fmt"
"github.com/stephenafamo/bob"
. "maragu.dev/gomponents"
ds "maragu.dev/gomponents-datastar"
. "maragu.dev/gomponents/components"
. "maragu.dev/gomponents/html"
)
type Service struct {
Name string
URL string
Status string
Err error
}
type State struct {
Input []string
Mysql *Service
Theme Theme
Report [][]string
Err error
db bob.DB
}
type Theme string
const (
ThemeLight = "light"
ThemeDark = "dark"
)
func Home(s *State) Node {
main := Div(
Class("grid"),
input(s),
mysql(s),
)
return layout("Home", s, main)
}
func Report(s *State) Node {
if s.Report == nil {
return layout("Report", s, Div(
err(s.Err),
Button(Text("Launch script")),
))
}
table := Table(
Map(s.Report, func(row []string) Node {
return Tr(
Map(row, func(cell string) Node {
return Td(Text(cell))
}),
)
}),
)
return layout("Report", s, table)
}
func input(s *State) Node {
if len(s.Input) == 0 {
return Article(
Header(Text("Input")),
P(Text("AIP Names")),
Label(
Input(
Type("file"),
Accept(".csv"),
ds.Bind("input-file"),
),
Small(Text("only .csv files accepted - max size 1 MIB")),
),
Button(
Type("submit"),
Text("Upload Input file"),
ds.On("click", "@post('/upload')"),
),
)
} else {
return Article(
Header(Text(fmt.Sprintf("Input file has %d names", len(s.Input)))),
Map(s.Input, func(id string) Node {
return P(Text(id))
}),
)
}
}
func mysql(s *State) Node {
if s.Mysql.Status == "Disconnected" {
return Article(
Header(Text("Mysql Config")),
Form(
Action("/mysql"),
Method("post"),
FieldSet(
Role("group"),
Input(
Type("text"),
Name("mysql"),
Placeholder("place mysql connection string here"),
),
Input(
Type("submit"),
Value("connect"),
),
),
),
Footer(err(s.Mysql.Err)),
)
}
return Article(
Header(Text("Mysql Config")),
P(Text(fmt.Sprintf("Mysql Status: %s", s.Mysql.Status))),
P(Text(fmt.Sprintf("Mysql URL: %s", s.Mysql.URL))),
)
}
func err(err error) Node {
if err != nil {
return P(Text(err.Error()))
}
return nil
}
func layout(title string, s *State, children ...Node) Node {
return HTML5(HTML5Props{
Title: "Migrate - " + title,
Language: "en",
Head: []Node{
Link(Rel("stylesheet"), Href("/assets/css/pico.css")),
Script(Type("module"), Src("https://cdn.jsdelivr.net/gh/starfederation/datastar@1.0.0-RC.7/bundles/datastar.js")),
},
Body: []Node{
Class("container"),
Header(
H1(Text("AIPs Report")),
Nav(
Ul(
navElement("/", "Config"),
navElement("/report", "Report"),
),
),
),
Main(Group(children)),
Footer(),
},
HTMLAttrs: []Node{
Data("theme", string(s.Theme)),
},
},
)
}
func navElement(path, name string) Node {
return Li(A(Href(path), Text(name)))
}