165 lines
2.9 KiB
Go
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)))
|
||
|
|
}
|