github.com/golazy/golazy@v0.0.7-0.20221012133820-968fe65a0b65/examples/webdocker/controller.go (about) 1 package main 2 3 import ( 4 "context" 5 _ "embed" 6 "io" 7 "net/http" 8 9 "github.com/docker/docker/api/types" 10 "github.com/docker/docker/client" 11 . "github.com/golazy/golazy/lazyview/html" 12 "github.com/golazy/golazy/lazyview/layout" 13 "github.com/golazy/golazy/lazyview/nodes" 14 ) 15 16 var ( 17 cli *client.Client 18 ) 19 20 func init() { 21 d, err := client.NewClientWithOpts(client.FromEnv) 22 if err != nil { 23 panic(err) 24 } 25 cli = d 26 } 27 28 type Controller struct { 29 } 30 31 //go:embed style.css 32 var style string 33 34 var PageLayout = layout.LayoutTemplate{ 35 Lang: "en", 36 Title: "golazy", 37 Viewport: "width=device-width", 38 Head: []interface{}{Script(Type("module"), Src("https://cdn.skypack.dev/@hotwired/turbo"))}, 39 Styles: []string{style}, 40 LayoutBody: func(l *layout.LayoutTemplate, content ...interface{}) io.WriterTo { 41 return nodes.ContentNode{ 42 Header( 43 H1("webdocker"), 44 ), 45 Nav( 46 "Homepage", 47 ), 48 Main( 49 content, 50 ), 51 } 52 }, 53 } 54 55 func (c *Controller) Layout(r *http.Request) *layout.LayoutTemplate { 56 return &PageLayout 57 } 58 59 func (c *Controller) Index(w http.ResponseWriter, r *http.Request) interface{} { 60 var rows []interface{} 61 62 containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) 63 if err != nil { 64 return err 65 } 66 67 for _, container := range containers { 68 url := "/container/" + container.ID 69 70 rows = append(rows, Tr( 71 Td(container.ID[:10]), 72 Td(container.Image), 73 Td( 74 A(Href(url), "Inspect"), 75 Form(Method("delete"), Action(url), Input(Type("submit"), "Stop")), 76 ), 77 )) 78 } 79 80 return Table( 81 Thead( 82 Tr( 83 Td("containers"), 84 Td("id"), 85 Td("actions"), 86 ), 87 ), 88 Tbody(rows), 89 ) 90 }