Initial commit
Change-Id: I2a5d2cb4de1b17fd4ae6583d61b14a21a4de77a0
Reviewed-on: https://chromium-review.googlesource.com/c/lab-automation-ui-demo2/+/2238659
Reviewed-by: Allen Li <[email protected]>
Tested-by: Allen Li <[email protected]>
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2264ce5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+# Lab Automation UI demo
+
+To run the demo, run:
+
+ go run .
+
+Open a web browser at localhost:8080 to view the demo.
+
+To stop the server, press Ctrl-C.
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..945205e
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module example.com
+
+go 1.13
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..fd6fcf9
--- /dev/null
+++ b/main.go
@@ -0,0 +1,54 @@
+package main
+
+import (
+ "io/ioutil"
+ "log"
+ "net/http"
+ "os"
+ "text/template"
+)
+
+func main() {
+ http.Handle("/", makeServer())
+ log.Fatal(http.ListenAndServe(":8080", nil))
+}
+
+func makeServer() *server {
+ root, err := os.Getwd()
+ if err != nil {
+ panic(err)
+ }
+ d, err := ioutil.ReadFile("template.html")
+ if err != nil {
+ panic(err)
+ }
+ return &server{
+ root: root,
+ template: template.Must(template.New("template").Parse(string(d))),
+ }
+}
+
+type server struct {
+ root string
+ template *template.Template
+}
+
+func (s *server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+ path := req.URL.Path
+ b, err := ioutil.ReadFile(s.root + "/src" + path)
+ if err != nil {
+ log.Printf("serve %s: %s", path, err)
+ http.Error(w, err.Error(), 500)
+ return
+ }
+ v := struct {
+ Title string
+ Body string
+ }{
+ Title: path,
+ Body: string(b),
+ }
+ if err := s.template.Execute(w, v); err != nil {
+ log.Printf("serve %s: %s", path, err)
+ }
+}
diff --git a/src/dut-history/dut1.html b/src/dut-history/dut1.html
new file mode 100644
index 0000000..88d3cca
--- /dev/null
+++ b/src/dut-history/dut1.html
@@ -0,0 +1,45 @@
+<div class="container">
+ <h1>History for dut1</h1>
+ <table class="table table-bordered">
+ <thead>
+ <tr>
+ <th scope="col">Time</th>
+ <th scope="col">Event</th>
+ <th scope="col">User</th>
+ <th scope="col">Details</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td></td>
+ <th scope="row">Repair task</th>
+ <td>(infra)</td>
+ <td class="bg-danger"><a href="/dut-verifiers/dut1.html">Fail</a></td>
+ </tr>
+ <tr>
+ <td></td>
+ <th scope="row">Test provision failure</th>
+ <td>(infra)</td>
+ <td class="bg-warning"><a href="#">Link to test</a></td>
+ </tr>
+ <tr>
+ <td>2019-12-31 20:22:23 PST</td>
+ <th scope="row">Open lid</th>
+ <td>demitrio</td>
+ <td class="bg-success">Success</td>
+ </tr>
+ <tr>
+ <td>2019-12-30 20:22:23 PST</td>
+ <th scope="row">Reset servo</th>
+ <td>demitrio</td>
+ <td class="bg-danger"><a href="/dut-verifiers/dut1.html">Fail</a></td>
+ </tr>
+ <tr>
+ <td></td>
+ <th scope="row">Repair task</th>
+ <td>(infra)</td>
+ <td class="bg-danger"><a href="/dut-verifiers/dut1.html">Fail</a></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
diff --git a/src/dut-verifiers/dut1.html b/src/dut-verifiers/dut1.html
new file mode 100644
index 0000000..12b3bde
--- /dev/null
+++ b/src/dut-verifiers/dut1.html
@@ -0,0 +1,26 @@
+<div class="container">
+ <h1>Verifier details for dut1</h1>
+ <a href="#" class="btn btn-primary">Go to task logs</a>
+ <table class="table table-bordered">
+ <thead>
+ <tr>
+ <th scope="col">Verifier</th>
+ <th scope="col">Status</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th scope="row">Servo</th>
+ <td class="bg-success">Pass</td>
+ </tr>
+ <tr>
+ <th scope="row">USB</th>
+ <td class="bg-danger">Fail</td>
+ </tr>
+ <tr>
+ <th scope="row">Power</th>
+ <td class="bg-success">Pass</td>
+ </tr>
+ </tbody>
+ </table>
+</div>
diff --git a/src/dut-verifiers/running.html b/src/dut-verifiers/running.html
new file mode 100644
index 0000000..c3aef74
--- /dev/null
+++ b/src/dut-verifiers/running.html
@@ -0,0 +1,33 @@
+<div class="container">
+ <h1>Verifier details for dut1</h1>
+ <a href="#" class="btn btn-primary">Go to task logs</a>
+ <table class="table table-bordered">
+ <thead>
+ <tr>
+ <th scope="col">Verifier</th>
+ <th scope="col">Status</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th scope="row">Servo</th>
+ <td class="bg-success">Pass</td>
+ </tr>
+ <tr>
+ <th scope="row">USB</th>
+ <td>
+ Running
+ <div class="spinner-border spinner-border-sm text-warning" role="status">
+ <span class="sr-only">Loading...</span>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">Power</th>
+ <td>
+ Pending
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 0000000..f0db8f1
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,31 @@
+<div class="container">
+ <div class="alert alert-primary" role="alert">
+ This is just a UI demo. All data is fake and buttons don't affect anything.
+ </div>
+ <div class="row">
+ <div class="col">
+ <div class="card" style="width: 18rem;">
+ <div class="card-body">
+ <h5 class="card-title">Deploys</h5>
+ <a href="/deploy.html" class="btn btn-primary">Go somewhere</a>
+ </div>
+ </div>
+ </div>
+ <div class="col">
+ <div class="card" style="width: 18rem;">
+ <div class="card-body">
+ <h5 class="card-title">Repairs</h5>
+ <a href="/repair-overview.html" class="btn btn-primary">Go somewhere</a>
+ </div>
+ </div>
+ </div>
+ <div class="col">
+ <div class="card" style="width: 18rem;">
+ <div class="card-body">
+ <h5 class="card-title">Decomms</h5>
+ <a href="/decomm.html" class="btn btn-primary">Go somewhere</a>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/src/repair-duts.html b/src/repair-duts.html
new file mode 100644
index 0000000..981135b
--- /dev/null
+++ b/src/repair-duts.html
@@ -0,0 +1,91 @@
+<div class="container">
+ <h1>Repairs</h1>
+ <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
+ <div class="btn-group mr-2" role="group">
+ <a href="/scanner-repairs.html" class="btn btn-primary">Scanner repairs</a>
+ </div>
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-secondary">Export to CSV</button>
+ </div>
+ </div>
+ <table class="table table-bordered">
+ <thead>
+ <tr>
+ <th scope="col">DUT</th>
+ <th scope="col">Model</th>
+ <th scope="col">Board</th>
+ <th scope="col">Actions</th>
+ <th scope="col">History</th>
+ <th scope="col">Verifier details</th>
+ <th scope="col">Servo</th>
+ <th scope="col">Power</th>
+ <th scope="col">USB</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th scope="row">chromeos2-row3-rack4-host6</th>
+ <td>lava</td>
+ <td>coral</td>
+ <td>
+ <div class="btn-group">
+ <button type="button" class="btn btn-primary">Mark Reset servo</button>
+ <button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <span class="sr-only">Toggle Dropdown</span>
+ </button>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#">Mark Reset servo</a>
+ <a class="dropdown-item" href="#" data-toggle="modal" data-target="#markOther">Mark Other</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#">Rerun repair</a>
+ <a class="dropdown-item" href="#">Start replacement</a>
+ </div>
+ </div>
+ </td>
+ <td><a href="/dut-history/dut1.html">History</a></td>
+ <td><a href="/dut-verifiers/dut1.html">details</a></td>
+ <td class="bg-danger">Fail</td>
+ <td class="bg-success">Pass</td>
+ <td class="bg-success">Pass</td>
+ </tr>
+ <tr>
+ <th scope="row">chromeos2-row3-rack4-host7</th>
+ <td>lava</td>
+ <td>coral</td>
+ <td></td>
+ <td></td>
+ <td>
+ <a href="/dut-verifiers/running.html">Running</a>
+ <div class="spinner-border spinner-border-sm text-warning" role="status">
+ <span class="sr-only">Loading...</span>
+ </div>
+ </td>
+ <td class="bg-success">Pass</td>
+ <td class="bg-danger">Fail</td>
+ <td class="bg-success">Pass</td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+<div class="modal fade" id="markOther" tabindex="-1" role="dialog">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title" id="exampleModalLabel">Mark custom manual action</h5>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">×</span>
+ </button>
+ </div>
+ <div class="modal-body">
+ <form>
+ <div class="form-group">
+ <label for="action">Manual action</label>
+ <input class="form-control" id="exampleInputEmail1">
+ </div>
+ <button type="submit" class="btn btn-primary">Submit</button>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/src/repair-overview.html b/src/repair-overview.html
new file mode 100644
index 0000000..4415d6a
--- /dev/null
+++ b/src/repair-overview.html
@@ -0,0 +1,20 @@
+<div class="container">
+ <div class="row">
+ <div class="col">
+ <div class="card" style="width: 18rem;">
+ <div class="card-body">
+ <h5 class="card-title">Repair DUTs</h5>
+ <a href="/repair-duts.html" class="btn btn-primary">Go somewhere</a>
+ </div>
+ </div>
+ </div>
+ <div class="col">
+ <div class="card" style="width: 18rem;">
+ <div class="card-body">
+ <h5 class="card-title">Some dashboard</h5>
+ <a href="/repair-duts.html" class="btn btn-primary">Go somewhere</a>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/src/scanner-repairs.html b/src/scanner-repairs.html
new file mode 100644
index 0000000..c93722c
--- /dev/null
+++ b/src/scanner-repairs.html
@@ -0,0 +1,21 @@
+<div class="container">
+ <h1>Scanner Repairs</h1>
+ <form>
+ <div class="form-group">
+ <label>Scanner</label>
+ <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
+ </div>
+ <div class="dropdown">
+ <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ Actions
+ </button>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#">Mark Reset servo</a>
+ <a class="dropdown-item" href="#" data-toggle="modal" data-target="#markOther">Mark Other</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#">Rerun repair</a>
+ <a class="dropdown-item" href="#">Start replacement</a>
+ </div>
+ </div>
+ </form>
+</div>
diff --git a/template.html b/template.html
new file mode 100644
index 0000000..77dc2f5
--- /dev/null
+++ b/template.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
+ <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
+ <title>{{.Title}}</title>
+ </head>
+ <body>
+ <nav class="navbar navbar-expand-lg navbar-light bg-light">
+ <a class="navbar-brand" href="/index.html">Home</a>
+ </nav>
+{{.Body}}
+ </body>
+</html>