diff --git a/CMakeLists.txt b/CMakeLists.txt
index c58f45e..ff3b6f2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -62,7 +62,7 @@ add_custom_command(OUTPUT laminar.capnp.c++ laminar.capnp.h
# Zip and compile statically served resources
generate_compressed_bins(${CMAKE_SOURCE_DIR}/src/resources index.html js/app.js
- favicon.ico favicon-152.png icon.png)
+ style.css manifest.webmanifest favicon.ico favicon-152.png icon.png)
# The code that allows dynamic modifying of index.html requires knowing its original size
add_custom_command(OUTPUT index_html_size.h
@@ -78,11 +78,9 @@ file(DOWNLOAD https://raw.githubusercontent.com/drudru/ansi_up/v1.3.0/ansi_up.js
js/ansi_up.js EXPECTED_MD5 158566dc1ff8f2804de972f7e841e2f6)
file(DOWNLOAD https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js
js/Chart.min.js EXPECTED_MD5 f6c8efa65711e0cbbc99ba72997ecd0e)
-file(DOWNLOAD https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css
- css/bootstrap.min.css EXPECTED_MD5 5d5357cb3704e1f43a1f5bfed2aebf42)
# ...and compile them
generate_compressed_bins(${CMAKE_BINARY_DIR} js/vue-router.min.js js/vue.min.js
- js/ansi_up.js js/Chart.min.js css/bootstrap.min.css)
+ js/ansi_up.js js/Chart.min.js)
# (see resources.cpp where these are fetched)
set(LAMINARD_CORE_SOURCES
diff --git a/src/resources.cpp b/src/resources.cpp
index a8561d7..021905b 100644
--- a/src/resources.cpp
+++ b/src/resources.cpp
@@ -1,5 +1,5 @@
///
-/// Copyright 2015-2019 Oliver Giles
+/// Copyright 2015-2020 Oliver Giles
///
/// This file is part of Laminar
///
@@ -27,11 +27,12 @@
extern const char _binary_##name##_z_end[]; \
resources.emplace(route, Resource{_binary_ ## name ## _z_start, _binary_ ## name ## _z_end, content_type})
-#define CONTENT_TYPE_HTML "text/html; charset=utf-8"
-#define CONTENT_TYPE_ICO "image/x-icon"
-#define CONTENT_TYPE_PNG "image/png"
-#define CONTENT_TYPE_JS "application/javascript; charset=utf-8"
-#define CONTENT_TYPE_CSS "text/css; charset=utf-8"
+#define CONTENT_TYPE_HTML "text/html; charset=utf-8"
+#define CONTENT_TYPE_ICO "image/x-icon"
+#define CONTENT_TYPE_PNG "image/png"
+#define CONTENT_TYPE_JS "application/javascript; charset=utf-8"
+#define CONTENT_TYPE_CSS "text/css; charset=utf-8"
+#define CONTENT_TYPE_MANIFEST "application/manifest+json; charset=utf-8"
#define GZIP_FORMAT 16
@@ -46,7 +47,8 @@ Resources::Resources()
INIT_RESOURCE("/js/vue-router.min.js", js_vue_router_min_js, CONTENT_TYPE_JS);
INIT_RESOURCE("/js/ansi_up.js", js_ansi_up_js, CONTENT_TYPE_JS);
INIT_RESOURCE("/js/Chart.min.js", js_Chart_min_js, CONTENT_TYPE_JS);
- INIT_RESOURCE("/css/bootstrap.min.css", css_bootstrap_min_css, CONTENT_TYPE_CSS);
+ INIT_RESOURCE("/style.css", style_css, CONTENT_TYPE_CSS);
+ INIT_RESOURCE("/manifest.webmanifest", manifest_webmanifest, CONTENT_TYPE_MANIFEST);
// Configure the default template
setHtmlTemplate(std::string());
}
diff --git a/src/resources/index.html b/src/resources/index.html
index e27b80e..f84ebea 100644
--- a/src/resources/index.html
+++ b/src/resources/index.html
@@ -8,334 +8,200 @@
+
Laminar
-
-
-
+
+
-
-
- Home
-
-
-
-
- {{job.name}} queued |
-
-
- {{job.name}} #{{job.number}}
- {{formatDuration(job.started, job.completed)}}
-
- |
-
-
- {{job.name}} #{{job.number}} Took {{formatDuration(job.started, job.completed)}} at {{formatDate(job.started)}} |
-
-
+
+
+
+
+
+
Recent regressions
+
+ {{job.name}} #{{job.lastFailure}} since #{{job.lastSuccess}} |
+
+
+
+
Low pass rates
+
+ {{job.name}} | {{Math.round(job.passRate*100)}} % |
+
+
+
-
-
-
-
Total runs per day this week
-
-
-
-
+
+
-
-
-
Most runs per job in the last 24 hours
-
-
-
-
-
-
-
-
Longest average run time per job this week
-
-
-
-
-
-
-
-
Current executor utilization
-
-
-
-
-
-
-
-
Regressions and recoveries
-
-
-
- - {{job.name}}: #{{job.lastFailure}} since #{{job.lastSuccess}}
- - {{job.name}}: #{{job.lastSuccess}} since #{{job.lastFailure}}
-
-
-
-
-
-
-
-
Run time changes
-
-
-
-
-
-
-
-
Average run time distribution
-
-
-
-
-
-
-
+
+
-
+
-
- Home
- Jobs
-
-
-
-
-
-
-
-
- {{job.name}} |
- #{{job.number}} |
- {{formatDate(job.started)}} |
- {{formatDuration(job.started,job.completed)}} |
-
-
+
+
+
+
+
+ {{job.name}} |
+ #{{job.number}} |
+ {{formatDate(job.started)}} |
+ {{formatDuration(job.started,job.completed)}} |
+
+
-
-
- Home
- Jobs
- {{$route.params.name}}
-
-
-
-
{{$route.params.name}}
-
-
- - Last Successful Run
- - #{{lastSuccess.number}} {{lastSuccess?' - at '+formatDate(lastSuccess.started):'never'}}
- - Last Failed Run
- - #{{lastFailed.number}} {{lastFailed?' - at '+formatDate(lastFailed.started):'never'}}
-
-
-
+
+
+
{{$route.params.name}}
+
+
+ - Last Successful Run
+ - #{{lastSuccess.number}} {{lastSuccess?' - at '+formatDate(lastSuccess.started):'never'}}
+ - Last Failed Run
+ - #{{lastFailed.number}} {{lastFailed?' - at '+formatDate(lastFailed.started):'never'}}
+
+
+
+
+
+
+
+
+ |
+ Run |
+ Started |
+ Duration |
+ Reason |
+
+
+ {{nQueued}} run(s) queued |
+
+
+ |
+ #{{job.number}} |
+ {{formatDate(job.started)}} |
+ {{formatDuration(job.started, job.completed)}} |
+ {{job.reason}} |
+
+
+
+
+ Page {{sort.page+1}} of {{pages}}
+
-
-
-
- |
- Run |
- Started |
- Duration |
- Reason |
-
-
- {{nQueued}} run(s) queued |
-
-
- |
- #{{job.number}} |
- {{formatDate(job.started)}} |
- {{formatDuration(job.started, job.completed)}} |
- {{job.reason}} |
-
-
- |
- #{{job.number}} |
- {{formatDate(job.started)}} |
- {{formatDuration(job.started, job.completed)}} |
- {{job.reason}} |
-
-
-
-
-
-
- Home
- Jobs
- {{$route.params.name}}
- #{{$route.params.number}}
-
-
-
-
{{$route.params.name}} #{{$route.params.number}}
-
-
-
- - Reason
- {{job.reason}}
- - Upstream
- {{job.upstream.name}} #{{job.upstream.num}}
- - Queued for
- {{job.queued}}s
- - Started
- {{formatDate(job.started)}}
- - Completed
- {{formatDate(job.completed)}}
- - Duration
- {{formatDuration(job.started, job.completed)}}
-
-
-
+
+
+
+
{{$route.params.name}} #{{$route.params.number}}
+
+
+
«
+
»
-
-
-
Console output
-
-
+
+
+ - Reason
- {{job.reason}}
+ - Upstream
- {{job.upstream.name}} #{{job.upstream.num}}
+ - Queued for
- {{job.queued}}s
+ - Started
- {{formatDate(job.started)}}
+ - Completed
- {{formatDate(job.completed)}}
+ - Duration
- {{formatDuration(job.started, job.completed)}}
+
+
+ - Artifacts
+ -
+
+
+
+
+
+
+
+
-
-