]> jspc29.x-matter.uni-frankfurt.de Git - mvd_epics.git/commitdiff
DASH: new Bootstrap based layout in addition
authorPhilipp Klaus <klaus@physik.uni-frankfurt.de>
Mon, 18 Sep 2017 09:40:54 +0000 (11:40 +0200)
committerPhilipp Klaus <klaus@physik.uni-frankfurt.de>
Mon, 18 Sep 2017 09:40:54 +0000 (11:40 +0200)
python_suite/dashboard/dashboard.py
python_suite/dashboard/static/css/style.css
python_suite/dashboard/views/base_bootstrap.jinja2 [new file with mode: 0644]
python_suite/dashboard/views/pv_overview_bootstrap.jinja2 [new file with mode: 0644]

index c06ba5f89d71da71bc324b33525b38a765d595b2..d7710a5d81b350c6b64306713895e7eaed88679e 100755 (executable)
@@ -173,6 +173,13 @@ def json_replace_nan():
 def index():
     redirect('/list/general_overview')
 
+@route('/list_bs/<page>')
+@view('pv_overview_bootstrap.jinja2')
+def list_pvs_bs(page):
+    if page not in CONFIG['pages']:
+        return abort(404, 'Page not found')
+    return {'config': CONFIG, 'req_page': page}
+
 @route('/list/<page>')
 @view('pv_overview.jinja2')
 def list_pvs(page):
index eebc06ed7ea0a83307fed8d531d8a087dc6c72cd..6c7f55de2b87d41bb66916a29a91e15cb15cc8cb 100644 (file)
@@ -104,7 +104,11 @@ div.error {
 .invalid_alarm .indicator,
 .minor_alarm .indicator,
 .major_alarm .indicator,
-.disconnected .indicator {
+.disconnected .indicator,
+.invalid_alarm.indicator,
+.minor_alarm.indicator,
+.major_alarm.indicator,
+.disconnected.indicator {
   border: 4px solid;
 }
 
@@ -113,7 +117,8 @@ div.error {
   content: "- invalid -";
   color: #0091FF;
 }
-.invalid_alarm .indicator {
+.invalid_alarm .indicator,
+.invalid_alarm.indicator {
   border-color: #0091FF;
 }
 
@@ -122,7 +127,8 @@ div.error {
   content: "- MINOR -";
   color: #FF6F00;
 }
-.minor_alarm .indicator {
+.minor_alarm .indicator,
+.minor_alarm.indicator {
   border-color: #FF6F00;
 }
 
@@ -131,7 +137,8 @@ div.error {
   content: "- MAJOR -";
   color: #FF0000;
 }
-.major_alarm .indicator {
+.major_alarm .indicator,
+.major_alarm.indicator {
   border-color: #FF0000;
 }
 
@@ -140,7 +147,8 @@ div.error {
   content: "- disconnected -";
   color: #FF0000;
 }
-.disconnected .indicator {
+.disconnected .indicator,
+.disconnected.indicator {
   border-color: #EBFF00;
 }
 
diff --git a/python_suite/dashboard/views/base_bootstrap.jinja2 b/python_suite/dashboard/views/base_bootstrap.jinja2
new file mode 100644 (file)
index 0000000..bf7cad1
--- /dev/null
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>{% block title %}{% endblock %} - DASHBOARD</title>
+    <!-- Required meta tags -->
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+    <!-- Bootstrap CSS -->
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
+
+    <!-- Custom CSS -->
+    <link rel="stylesheet" href="/static/css/style.css">
+
+    <style>
+    /* Bootstrap Navbar Requires: */
+    body {
+      padding-top: 70px;
+    }
+    </style>
+
+    {% block header %}
+    <!-- Custom Head Section -->
+    {% endblock %}
+  </head>
+  <body>
+    <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
+      <a class="navbar-brand" href="/">DASHBOARD</a>
+      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+      </button>
+
+      <div class="collapse navbar-collapse" id="navbarsExampleDefault">
+        <ul class="navbar-nav mr-auto">
+          <li class="nav-item active">
+            <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
+          </li>
+          <li class="nav-item">
+            <a class="nav-link" href="#">Link</a>
+          </li>
+          <li class="nav-item">
+            <a class="nav-link disabled" href="#">Disabled</a>
+          </li>
+          <li class="nav-item dropdown">
+            <a class="nav-link dropdown-toggle" href="http://example.com" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
+            <div class="dropdown-menu" aria-labelledby="dropdown01">
+              <a class="dropdown-item" href="#">Action</a>
+              <a class="dropdown-item" href="#">Another action</a>
+              <a class="dropdown-item" href="#">Something else here</a>
+            </div>
+          </li>
+        </ul>
+        <form class="form-inline my-2 my-lg-0">
+          <input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
+          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
+        </form>
+      </div>
+    </nav>
+
+    <div class="container">
+
+      <div>
+        <h1>{{ page_title }}</h1>
+        <!-- <p class="lead">Use this document as a way to quickly start any new project.<br> All you get is this text and a mostly barebones HTML document.</p> -->
+      </div>
+      {% block content %}{% endblock %}
+
+    </div><!-- /.container -->
+
+    <!-- Optional JavaScript -->
+    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
+    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
+    <!--<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>-->
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
+    <script type="text/javascript" src="/static/js/script.js"></script>
+    <script type="text/javascript">
+      {% block js_end_of_page %}
+      {% endblock %}
+    </script>
+
+  </body>
+</html>
diff --git a/python_suite/dashboard/views/pv_overview_bootstrap.jinja2 b/python_suite/dashboard/views/pv_overview_bootstrap.jinja2
new file mode 100644 (file)
index 0000000..e379369
--- /dev/null
@@ -0,0 +1,74 @@
+{% extends "base_bootstrap.jinja2" %}
+
+{% block title %}{{ config.pages[req_page].name }}{% endblock %}
+
+{% block header %}
+<meta http-equiv="refresh" content="15">
+<link rel="stylesheet" href="/static/css/sparkline.css">
+<script src="https://d3js.org/d3.v4.min.js"></script>
+<script src="/static/js/sparkline.js"></script>
+<style>
+.pv-block {
+  border-radius: 10px;
+  border: 1.5px solid #ddd;
+  margin-bottom: 20px;
+  padding: 10px;
+}
+</style>
+{% endblock %}
+
+{% block content %}
+               <div id="PVs">
+                       {% set page = config.pages[req_page] %}
+                       {% for group in page.groups %}
+                       {% set this_group = config.groups[group] %}
+                       <div id="{{ this_group.name }}">
+                               <h2>{{ this_group.name }}</h2>
+                               {% for pv_name in this_group.PVs %}
+                               {% set PV = config.PVs[config.PV_lookup[pv_name]] %}
+                               {% if loop.index0 % 3 == 0 %}
+                               <div class="row">
+                               {% endif %}
+                                       <div class="col-md-4">
+                                       <div class="pv-block value indicator {{ PV.classes }}" style="cursor: pointer;" title="{{ PV.alias }}">
+                                               <div class="error"></div>
+                                               <div class="pvname">{{ PV.name }}</div>
+                                               <div class="value-unit-box">
+                                                       <span class="value">
+                                                       {% if 'switch' in PV.classes %}
+                                                               <label class="toggle">
+                                                                       <input type="checkbox" disabled readonly {{ 'checked' if 'ON' in PV.value else '' }}>
+                                                                       <span data-unchecked="OFF" data-checked="ON"></span>
+                                                               </label>
+                                                       {% else %}
+                                                               {% if PV.precision is number %}
+                                                                       {{ ("%."+PV.precision|string +"f") % PV.value }}
+                                                               {% else %}
+                                                                       {{ PV.value }}
+                                                               {% endif %}
+                                                       {% endif %}
+                                                       </span>
+                                                       <span class="unit">{{ PV.unit }}</span>
+                                               </div>
+                                               <div id="sparkline-{{ PV.name|replace(':','-') }}" class="sparkline"></div></td>
+                                       </div>
+                                       </div>
+                               {% if (loop.index0 % 3 == 2) or loop.last %}
+                               </div>
+                               {% endif %}
+                               {% endfor %}
+                       </div>
+                       {% endfor %}
+               </div>
+{% endblock %}
+
+
+{% block js_end_of_page %}
+/*
+$(function() {
+  // on page load
+  updateSparklines();
+});
+*/
+updateSparklines();
+{% endblock %}