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">&times;</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>