Make server out of SS script
This commit is contained in:
164
cmd/ss/ui.go
Normal file
164
cmd/ss/ui.go
Normal file
@@ -0,0 +1,164 @@
|
||||
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)))
|
||||
}
|
||||
Reference in New Issue
Block a user