Commit fffa70b64e005ae1b907b323cfd6e8fda6552839

Authored by hitier
2 parents e73a1a70 4d87aba1

Front fixes

CHANGELOG.md
... ... @@ -23,6 +23,12 @@ Should be noted only functionnal changes,
23 23 or major refactoring improvments.
24 24  
25 25 ## Unreleased
  26 +## [0.3.pre-8] - 2021-05-06 - Front Fixes
  27 +### Changed
  28 +Sidebar menu enhanced
  29 +New export button
  30 +
  31 +## Unreleased
26 32 ## [0.3.pre-7] - 2021-05-03 - Better Tests Coverage
27 33 ### Changed
28 34 Add tests and fix some code issues
... ...
VERSION.txt
1   -0.3.pre-7
  1 +0.3.pre-8
... ...
app/main/static/css/charges.css
... ... @@ -90,7 +90,53 @@ rect.bar:hover {
90 90 pointer-events: none;
91 91 }
92 92  
93   -button.export {
94   - float: right;
95   - margin-right: 0;
  93 +i.export {
  94 + padding: 7px;
  95 + position: absolute;
  96 + margin-top:8px;
  97 + right: 3%;
  98 +}
  99 +
  100 +i.export:hover {
  101 + background: lightgrey;
  102 + border-radius: 2px;
  103 +}
  104 +
  105 +.tooltip_hamburger {
  106 + border-radius: 0px;
  107 + box-shadow: 2px 2px 2px 2px darkgrey;
  108 + right: 2%;
  109 + pointer-events: auto;
  110 + width: 150px;
  111 + margin-top:15px;
  112 + padding: 0;
  113 +}
  114 +
  115 +.tooltip_hamburger li {
  116 + list-style: none;
  117 + padding: 5px;
  118 + cursor: pointer;
  119 + pointer-events: auto;
  120 +}
  121 +
  122 +.tooltip_hamburger li:hover {
  123 + background-color: lightgrey;
  124 +}
  125 +
  126 +.tooltip_hamburger span {
  127 + width: 90%;
  128 + padding: 5px;
  129 + margin-left: 5px;
  130 + display: block;
  131 + border-bottom: 1px solid grey;
  132 +}
  133 +
  134 +.rectmouseleave {
  135 + width: 200px;
  136 + height: 150px;
  137 + position: absolute;
  138 + padding: 10px;
  139 + top:0;
  140 + right: 0;
  141 + /*background-color: #0b2e13;*/
96 142 }
97 143 \ No newline at end of file
... ...
app/main/static/js/charges.js
... ... @@ -65,11 +65,39 @@ function build_chart(div_selector, data_url, entity_name, category_type) {
65 65 alert("ALERT ! Every body shall quit the boat, we are sinking ! ALERT !")
66 66 }
67 67  
  68 + // Configure the tooltip to export svg to png or csv
  69 + var update_export_menu = function (e, d) {
  70 +
  71 + const tooltip_test = document.getElementsByClassName('tooltip_hamburger');
  72 +
  73 + if (tooltip_test.length == 0) {
  74 + d3.select(".tooltip_hamburger").remove();
  75 +
  76 + const tooltip_hamburger = hamburger.append("div")
  77 + .style("opacity", 0)
  78 + .attr("class", "tooltip tooltip_hamburger");
  79 +
  80 + d3.select(this).transition()
  81 + .duration(1)
  82 + tooltip_hamburger
  83 + .transition()
  84 + .duration(200)
  85 + .style("opacity", 1)
  86 + tooltip_hamburger
  87 + .html("<span>Export </span>" +
  88 + "<li>To CSV</li>" +
  89 + "<li id='to_png'>To PNG</li>")
  90 + d3.select("#to_png").on("click", download_png);
  91 + } else {
  92 + d3.select(".tooltip_hamburger").remove();
  93 + }
  94 +
  95 + }
68 96 // Create a download button inside the div contaning svg chart
69   - var dl_btn = d3.select(div_selector).append("button")
70   - .text('png')
71   - .attr('class', 'export')
72   - .on('click', download_png)
  97 + const hamburger = d3.select(div_selector).append('i')
  98 + .attr('class', 'fas fa-bars fa-lg export')
  99 + .on("click", update_export_menu);
  100 +
73 101  
74 102 const svg = d3.select(div_selector).append("svg")
75 103 .attr("class", "svg_chart")
... ... @@ -326,7 +354,6 @@ function build_chart(div_selector, data_url, entity_name, category_type) {
326 354 .on("mouseover", mouseoverdot)
327 355 .on("mouseleave", mouseleavedot)
328 356 .lower();// set it below bars if called after
329   - ;
330 357  
331 358 }
332 359  
... ...
app/main/static/js/svg_to_png.js
1 1 var download_png = function () {
2 2 // This callback is supposed to be called on the click event of a button child of the div containing the svg.
3 3 // We then get the parent of this btn to guess the chart's title, width and heigth
4   - var chart_div = this.parentNode;
  4 + var chart_div = this.parentNode.parentNode.parentNode;
5 5 var chart_title = chart_div.id;
6 6 width = chart_div.offsetWidth;
7 7 height = chart_div.offsetHeight;
... ...
app/main/templates/agent.html
... ... @@ -5,6 +5,10 @@
5 5 {% endblock %}
6 6  
7 7 {% block content %}
  8 +
  9 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  10 +<span id="nav_actived" style="display: none">agent,agents</span>
  11 +
8 12 <div id="projects_chart" class="charge_chart"></div>
9 13 <table id="charge_table">
10 14 <thead>
... ...
app/main/templates/agents.html
1 1 {% extends "base_page.html" %}
2 2 {% block content %}
  3 +
  4 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  5 +<span id="nav_actived" style="display: none">agent,agents</span>
  6 +
3 7 <table class="table table-hover">
4 8 <thead>
5 9 <tr>
... ...
app/main/templates/capacities.html
1 1 {% extends "base_page.html" %}
2 2 {% block content %}
  3 +
  4 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  5 +<span id="nav_actived" style="display: none">agent,capacities</span>
  6 +
3 7 <table class="table table-hover">
4 8 <thead>
5 9 <tr>
... ...
app/main/templates/charge.html
1 1 {% extends "base_page.html" %}
2 2 {% block content %}
  3 +
  4 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  5 +<span id="nav_actived" style="display: none">cds,charge/add</span>
  6 +
3 7 <form class="form-horizontal" id="new_affectation" action="#" method="post">
4 8 <input name="utf8" type="hidden" value="โœ“">
5 9 <input type="hidden" name="authenticity_token" value="NPVU9shCwiRt07EXMAroxTdsP61Et00VQjkBiit3MWeqQt3Eez9UdGK68RzZ6npLCFyg0gL+M1MR6VjK9WOCYw==">
... ...
app/main/templates/periods.html
1 1 {% extends "base_page.html" %}
2 2 {% block content %}
  3 +
  4 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  5 +<span id="nav_actived" style="display: none">admin,periods</span>
  6 +
3 7 <table class="table table-hover">
4 8 <thead>
5 9 <tr>
... ...
app/main/templates/project.html
... ... @@ -5,6 +5,9 @@
5 5 {% endblock %}
6 6  
7 7 {% block content %}
  8 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  9 +<span id="nav_actived" style="display: none">projet,projects</span>
  10 +
8 11 <div class="charge_chart" id="project_services_chart"></div>
9 12 <hr/>
10 13 <div class="charge_chart" id="project_capacities_chart"></div>
... ...
app/main/templates/projects.html
1 1 {% extends "base_page.html" %}
2 2 {% block content %}
  3 +
  4 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  5 +<span id="nav_actived" style="display: none">projet,projects</span>
  6 +
3 7 <table class="table table-hover">
4 8 <thead>
5 9 <tr>
... ...
app/main/templates/services.html
1 1 {% extends "base_page.html" %}
2 2 {% block content %}
  3 +
  4 +<!-- Invisible span to definte wich ul and a in the navbar are actived -->
  5 +<span id="nav_actived" style="display: none">service,services</span>
  6 +
3 7 <table class="table table-hover">
4 8 <thead>
5 9 <tr>
... ...
app/static/css/style.css
... ... @@ -40,6 +40,10 @@ nav.sidebar a:hover {
40 40 background-color: lightgrey;
41 41 }
42 42  
  43 +nav.sidebar ul {
  44 + width: 100%;
  45 +}
  46 +
43 47 nav.sidebar a {
44 48 color: black;
45 49 text-decoration: none;
... ... @@ -82,9 +86,15 @@ nav.sidebar a.disabled {
82 86 }
83 87  
84 88 /* Update the navbar for small screens. Replace bootstrap css for small screens only */
85   -@media (max-width: 600px) {
  89 +@media (max-width: 768px) {
86 90 .sidebar {
87 91 position: static !important;
88 92 margin-top: 0px !important;
89 93 }
90 94 }
  95 +
  96 +@media (min-width: 1670px) {
  97 + .sidebar {
  98 + max-width:12.499999995%;
  99 + }
  100 +}
91 101 \ No newline at end of file
... ...
app/static/js/font-awesome.min.js 0 โ†’ 100644
... ... @@ -0,0 +1,2 @@
  1 +window.FontAwesomeKitConfig = {"asyncLoading":{"enabled":false},"autoA11y":{"enabled":true},"baseUrl":"https://ka-f.fontawesome.com","baseUrlKit":"https://kit.fontawesome.com","detectConflictsUntil":null,"iconUploads":{},"id":49010708,"license":"free","method":"css","minify":{"enabled":true},"token":"46c1ff7934","v4FontFaceShim":{"enabled":true},"v4shim":{"enabled":true},"version":"5.15.3"};
  2 +!function(t){"function"==typeof define&&define.amd?define("kit-loader",t):t()}((function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function n(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function r(t){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?n(Object(o),!0).forEach((function(n){e(t,n,o[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(o,e))}))}return t}function o(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(t)))return;var n=[],r=!0,o=!1,i=void 0;try{for(var c,a=t[Symbol.iterator]();!(r=(c=a.next()).done)&&(n.push(c.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{r||null==a.return||a.return()}finally{if(o)throw i}}return n}(t,e)||function(t,e){if(!t)return;if("string"==typeof t)return i(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(t,e)}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function c(t,e){var n=e&&e.addOn||"",r=e&&e.baseFilename||t.license+n,o=e&&e.minify?".min":"",i=e&&e.fileSuffix||t.method,c=e&&e.subdir||t.method;return t.baseUrl+"/releases/"+("latest"===t.version?"latest":"v".concat(t.version))+"/"+c+"/"+r+o+"."+i}function a(t){return t.baseUrlKit+"/"+t.token+"/"+t.id+"/kit-upload.css"}function u(t,e){var n=e||["fa"],r="."+Array.prototype.join.call(n,",."),o=t.querySelectorAll(r);Array.prototype.forEach.call(o,(function(e){var n=e.getAttribute("title");e.setAttribute("aria-hidden","true");var r=!e.nextElementSibling||!e.nextElementSibling.classList.contains("sr-only");if(n&&r){var o=t.createElement("span");o.innerHTML=n,o.classList.add("sr-only"),e.parentNode.insertBefore(o,e.nextSibling)}}))}var f,s=function(){},d="undefined"!=typeof global&&void 0!==global.process&&"function"==typeof global.process.emit,l="undefined"==typeof setImmediate?setTimeout:setImmediate,h=[];function m(){for(var t=0;t<h.length;t++)h[t][0](h[t][1]);h=[],f=!1}function p(t,e){h.push([t,e]),f||(f=!0,l(m,0))}function y(t){var e=t.owner,n=e._state,r=e._data,o=t[n],i=t.then;if("function"==typeof o){n="fulfilled";try{r=o(r)}catch(t){w(i,t)}}b(i,r)||("fulfilled"===n&&v(i,r),"rejected"===n&&w(i,r))}function b(e,n){var r;try{if(e===n)throw new TypeError("A promises callback cannot return that same promise.");if(n&&("function"==typeof n||"object"===t(n))){var o=n.then;if("function"==typeof o)return o.call(n,(function(t){r||(r=!0,n===t?g(e,t):v(e,t))}),(function(t){r||(r=!0,w(e,t))})),!0}}catch(t){return r||w(e,t),!0}return!1}function v(t,e){t!==e&&b(t,e)||g(t,e)}function g(t,e){"pending"===t._state&&(t._state="settled",t._data=e,p(S,t))}function w(t,e){"pending"===t._state&&(t._state="settled",t._data=e,p(O,t))}function A(t){t._then=t._then.forEach(y)}function S(t){t._state="fulfilled",A(t)}function O(t){t._state="rejected",A(t),!t._handled&&d&&global.process.emit("unhandledRejection",t._data,t)}function j(t){global.process.emit("rejectionHandled",t)}function E(t){if("function"!=typeof t)throw new TypeError("Promise resolver "+t+" is not a function");if(this instanceof E==!1)throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._then=[],function(t,e){function n(t){w(e,t)}try{t((function(t){v(e,t)}),n)}catch(t){n(t)}}(t,this)}E.prototype={constructor:E,_state:"pending",_then:null,_data:void 0,_handled:!1,then:function(t,e){var n={owner:this,then:new this.constructor(s),fulfilled:t,rejected:e};return!e&&!t||this._handled||(this._handled=!0,"rejected"===this._state&&d&&p(j,this)),"fulfilled"===this._state||"rejected"===this._state?p(y,n):this._then.push(n),n.then},catch:function(t){return this.then(null,t)}},E.all=function(t){if(!Array.isArray(t))throw new TypeError("You must pass an array to Promise.all().");return new E((function(e,n){var r=[],o=0;function i(t){return o++,function(n){r[t]=n,--o||e(r)}}for(var c,a=0;a<t.length;a++)(c=t[a])&&"function"==typeof c.then?c.then(i(a),n):r[a]=c;o||e(r)}))},E.race=function(t){if(!Array.isArray(t))throw new TypeError("You must pass an array to Promise.race().");return new E((function(e,n){for(var r,o=0;o<t.length;o++)(r=t[o])&&"function"==typeof r.then?r.then(e,n):e(r)}))},E.resolve=function(e){return e&&"object"===t(e)&&e.constructor===E?e:new E((function(t){t(e)}))},E.reject=function(t){return new E((function(e,n){n(t)}))};var _="function"==typeof Promise?Promise:E;function P(t,e){var n=e.fetch,r=e.XMLHttpRequest,o=e.token,i=t;return"URLSearchParams"in window?(i=new URL(t)).searchParams.set("token",o):i=i+"?token="+encodeURIComponent(o),i=i.toString(),new _((function(t,e){if("function"==typeof n)n(i,{mode:"cors",cache:"default"}).then((function(t){if(t.ok)return t.text();throw new Error("")})).then((function(e){t(e)})).catch(e);else if("function"==typeof r){var o=new r;o.addEventListener("loadend",(function(){this.responseText?t(this.responseText):e(new Error(""))}));["abort","error","timeout"].map((function(t){o.addEventListener(t,(function(){e(new Error(""))}))})),o.open("GET",i),o.send()}else{e(new Error(""))}}))}function C(t,e,n){var r=t;return[[/(url\("?)\.\.\/\.\.\/\.\./g,function(t,n){return"".concat(n).concat(e)}],[/(url\("?)\.\.\/webfonts/g,function(t,r){return"".concat(r).concat(e,"/releases/v").concat(n,"/webfonts")}],[/(url\("?)https:\/\/kit-free([^.])*\.fontawesome\.com/g,function(t,n){return"".concat(n).concat(e)}]].forEach((function(t){var e=o(t,2),n=e[0],i=e[1];r=r.replace(n,i)})),r}function F(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},o=e.document||o,i=u.bind(u,o,["fa","fab","fas","far","fal","fad","fak"]),f=Object.keys(t.iconUploads||{}).length>0;t.autoA11y.enabled&&n(i);var s=[{id:"fa-main",addOn:void 0}];t.v4shim.enabled&&s.push({id:"fa-v4-shims",addOn:"-v4-shims"}),t.v4FontFaceShim.enabled&&s.push({id:"fa-v4-font-face",addOn:"-v4-font-face"}),f&&s.push({id:"fa-kit-upload",customCss:!0});var d=s.map((function(n){return new _((function(o,i){P(n.customCss?a(t):c(t,{addOn:n.addOn,minify:t.minify.enabled}),e).then((function(i){o(U(i,r(r({},e),{},{baseUrl:t.baseUrl,version:t.version,id:n.id,contentFilter:function(t,e){return C(t,e.baseUrl,e.version)}})))})).catch(i)}))}));return _.all(d)}function U(t,e){var n=e.contentFilter||function(t,e){return t},r=document.createElement("style"),o=document.createTextNode(n(t,e));return r.appendChild(o),r.media="all",e.id&&r.setAttribute("id",e.id),e&&e.detectingConflicts&&e.detectionIgnoreAttr&&r.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),r}function k(t,e){e.autoA11y=t.autoA11y.enabled,"pro"===t.license&&(e.autoFetchSvg=!0,e.fetchSvgFrom=t.baseUrl+"/releases/"+("latest"===t.version?"latest":"v".concat(t.version))+"/svgs",e.fetchUploadedSvgFrom=t.uploadsUrl);var n=[];return t.v4shim.enabled&&n.push(new _((function(n,o){P(c(t,{addOn:"-v4-shims",minify:t.minify.enabled}),e).then((function(t){n(I(t,r(r({},e),{},{id:"fa-v4-shims"})))})).catch(o)}))),n.push(new _((function(n,o){P(c(t,{minify:t.minify.enabled}),e).then((function(t){var o=I(t,r(r({},e),{},{id:"fa-main"}));n(function(t,e){var n=e&&void 0!==e.autoFetchSvg?e.autoFetchSvg:void 0,r=e&&void 0!==e.autoA11y?e.autoA11y:void 0;void 0!==r&&t.setAttribute("data-auto-a11y",r?"true":"false");n&&(t.setAttributeNode(document.createAttribute("data-auto-fetch-svg")),t.setAttribute("data-fetch-svg-from",e.fetchSvgFrom),t.setAttribute("data-fetch-uploaded-svg-from",e.fetchUploadedSvgFrom));return t}(o,e))})).catch(o)}))),_.all(n)}function I(t,e){var n=document.createElement("SCRIPT"),r=document.createTextNode(t);return n.appendChild(r),n.referrerPolicy="strict-origin",e.id&&n.setAttribute("id",e.id),e&&e.detectingConflicts&&e.detectionIgnoreAttr&&n.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),n}function L(t){var e,n=[],r=document,o=r.documentElement.doScroll,i=(o?/^loaded|^c/:/^loaded|^i|^c/).test(r.readyState);i||r.addEventListener("DOMContentLoaded",e=function(){for(r.removeEventListener("DOMContentLoaded",e),i=1;e=n.shift();)e()}),i?setTimeout(t,0):n.push(t)}function T(t){"undefined"!=typeof MutationObserver&&new MutationObserver(t).observe(document,{childList:!0,subtree:!0})}try{if(window.FontAwesomeKitConfig){var x=window.FontAwesomeKitConfig,M={detectingConflicts:x.detectConflictsUntil&&new Date<=new Date(x.detectConflictsUntil),detectionIgnoreAttr:"data-fa-detection-ignore",fetch:window.fetch,token:x.token,XMLHttpRequest:window.XMLHttpRequest,document:document},D=document.currentScript,N=D?D.parentElement:document.head;(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"js"===t.method?k(t,e):"css"===t.method?F(t,e,(function(t){L(t),T(t)})):void 0})(x,M).then((function(t){t.map((function(t){try{N.insertBefore(t,D?D.nextSibling:null)}catch(e){N.appendChild(t)}})),M.detectingConflicts&&D&&L((function(){D.setAttributeNode(document.createAttribute(M.detectionIgnoreAttr));var t=function(t,e){var n=document.createElement("script");return e&&e.detectionIgnoreAttr&&n.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),n.src=c(t,{baseFilename:"conflict-detection",fileSuffix:"js",subdir:"js",minify:t.minify.enabled}),n}(x,M);document.body.appendChild(t)}))})).catch((function(t){console.error("".concat("Font Awesome Kit:"," ").concat(t))}))}}catch(t){console.error("".concat("Font Awesome Kit:"," ").concat(t))}}));
... ...
app/static/js/navbar.js
1   -// Script used with the navbar to color the menu items and leave them visible
  1 +/* Read the <span> with information about ul and li to active */
  2 +const navbar_active = $("#nav_actived").html();
  3 +const navbar_active_split = navbar_active.split(',');
2 4  
  5 +const ul_active = navbar_active_split[0];
  6 +const a_active = navbar_active_split[1];
3 7  
4   -// Check if an element of the navbar is stored in the local storage or not
5   -var collapseItem_ul = localStorage.getItem('collapseItem_ul');
6   -var collapseItem_a = localStorage.getItem('collapseItem_a');
7   -
8   -//
9   -var sublink_activate = $("a[href='" + collapseItem_a + "']");
10   -sublink_activate.addClass("sublink_activate");
11   -
12   -$("#" + collapseItem_ul).addClass("show");
13   -
14   -
15   -//store the id of the collapsible element
16   -$('.main-nav').click(function () {
17   - localStorage.setItem('collapseItem_ul', $(this).next().attr("id"));
18   -});
19   -$('.sub_link').click(function (e) {
20   - localStorage.setItem('collapseItem_a', $(this).attr("href"));
21   -})
22   -
23   -
24   -// a click to the connection bar or 'accueil' button desactivate the localstorage
25   -$('.link_connect').click(function() {
26   - $("#" + collapseItem_ul).removeClass("show");
27   - $("#" + collapseItem_ul).addClass("hide");
28   - sublink_activate.removeClass("sublink_activate");
29   - localStorage.removeItem('collapseItem_ul');
30   - localStorage.removeItem('collapseItem_a');
31   -
32   -});
33   -$("#accueil").click(function (){
34   - $("#" + collapseItem_ul).removeClass("show");
35   - $("#" + collapseItem_ul).addClass("hide");
36   - sublink_activate.removeClass("sublink_activate");
37   - localStorage.removeItem('collapseItem_ul');
38   - localStorage.removeItem('collapseItem_a');
39   -});
  8 +/* Open the ul */
  9 +$("#" + ul_active).addClass("show");
40 10  
  11 +/* Active the li */
  12 +var sublink_activate = $("a[href='/" + a_active + "']");
  13 +sublink_activate.addClass("sublink_activate");
41 14 \ No newline at end of file
... ...
app/templates/base_page.html
... ... @@ -30,7 +30,7 @@
30 30  
31 31 <div class="container-fluid">
32 32 <div class="row">
33   - <nav class="col-md-2 col-sm-auto col-xs-auto navbar-light bg-light navbar-expand-md sidebar mt-5">
  33 + <nav class="col-md-half col-lg-2 col-md-2 navbar-light bg-light navbar-expand-md sidebar mt-5">
34 34 <button id="test" class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
35 35 <span class="navbar-toggler-icon"></span>
36 36 </button>
... ...
app/templates/d3js-includes.html
1 1 <script src="{{ url_for('static', filename='js/d3.v6.min.js') }}" type="text/javascript"></script>
  2 + <script src="{{ url_for('static', filename='js/font-awesome.min.js') }}" type="text/javascript"></script>
... ...