From 8d2717d25b95bb869f82458ee5d5c0f3f95e427b Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Wed, 24 Jul 2024 23:26:43 +0300 Subject: [PATCH 01/16] add connected blender list for index page --- .../bim/data/webui/static/css/index.css | 69 ++++++++++++++++++- .../bim/data/webui/static/js/index.js | 67 ++++++++++++++++++ .../bim/data/webui/templates/index.html | 8 +++ 3 files changed, 142 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css b/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css index 7a480b42c8..bd491ffbf2 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css +++ b/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css @@ -7,6 +7,7 @@ --padding-medium: 1rem; --font-size-large: 1.2rem; --logo-height: 2.5rem; + --nav-height: 2.5rem; } :root.dark { @@ -18,6 +19,7 @@ --nav-link-color: #fff; --nav-link-hover-color: #3fb449; --warning-color: #FFDB8F; + --table-border-color: #464444; } :root.light { @@ -29,6 +31,7 @@ --nav-link-color: #000000; --nav-link-hover-color: #38a63d; --warning-color: #FF4500; + --table-border-color: #222; } html { @@ -63,6 +66,7 @@ h3 { nav { background-color: var(--nav-bg-color); + height: var(--nav-height); padding: var(--padding-medium) 0; display: flex; align-items: center; @@ -118,6 +122,67 @@ nav ul li a.active { outline: none; } +#client-list { + position: absolute; + top: calc(0 + var(--nav-height)); + overflow-y: auto; + overflow: hidden; + transition: opacity 0.3s ease-out, visibility 0.3s ease-out; + border: 1px solid var(--table-border-color); + background-color: var(--nav-bg-color); + z-index: 1; + opacity: 0; + visibility: hidden; + width: auto; +} + +#client-list.show { + opacity: 1; + visibility: visible; +} + +#connected-list-div { + display: inline-block; +} + +.client { + padding: 10px; + border-bottom: 1px solid var(--table-border-color); + cursor: pointer; +} + +.client-details { + max-height: 0; + overflow: hidden; + padding-left: 10px; + transition: max-height 0.2s ease-out, padding 0.2s ease-out, opacity 0.1s ease-out; + background-color: var(--bg-color); + margin-top: 5px; + opacity: 0; +} + +.client-details.show { + max-height: none; + padding: 10px; + opacity: 1; +} + +.client-detail { + border-bottom: 1px solid var(--table-border-color); + padding: 10px; +} + +#show-connected-button { + width: auto; + background-color: var(--bg-color); + border: none; + font-size: var(--base-font-size); +} + +#show-connected-button:hover { + cursor: pointer; +} + /* ------------ Overwriting Tabulator CSS rules ------------ */ :root.light .tabulator-header, @@ -127,6 +192,6 @@ nav ul li a.active { } :root.light .tabulator { - border-top: 1px solid #222; - border-bottom: 2px solid #222; + border-top: 1px solid var(--table-border-color); + border-bottom: 2px solid var(--table-border-color); } \ No newline at end of file diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js b/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js index 0d4db42480..4896a1643c 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js +++ b/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js @@ -81,6 +81,10 @@ function handleDefaultData(data) { // Function to add a new table with data and filename function addTableElement(blenderId, csvData, filename) { + $("#blender-count").text(function (i, text) { + return parseInt(text, 10) + 1; + }); + // store headers of the csv data const firstLine = csvData.indexOf("\n"); const csvHeaders = csvData.substring(0, firstLine).split(","); @@ -274,3 +278,66 @@ function toggleTheme() { setTheme("dark"); } } + +function toggleClientList() { + var clientList = $("#client-list"); + + if (clientList.hasClass("show")) { + clientList.removeClass("show"); + return; + } + + clientList.empty(); + + $.each(connectedClients, function (id, client) { + if (!client.shown) return; + + const icon = $("") + .addClass("fas fa-chevron-down") + .css("margin-left", "8px"); + + const clientDiv = $("
").addClass("client").text(client.ifc_file); + + clientDiv.append(icon); + + const clientDetailsDiv = $("
").addClass("client-details"); + + if (id) { + const clientId = $("
") + .addClass("client-detail") + .text(`Blender ID: ${id}`); + clientDetailsDiv.append(clientId); + } + + if (client.headers && client.headers.length) { + const clientHeaders = $("
") + .addClass("client-detail") + .text(`Table Headers: ${client.headers.join(", ")}`); + + const scrollButton = $(" +
+ +
+
From a14fc0a7f53972acf0b63fccd4997c29f2721afa Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:25:44 +0300 Subject: [PATCH 02/16] edit css rules --- .../bim/data/webui/static/css/index.css | 44 ++++++++++++------- .../bim/data/webui/static/js/index.js | 4 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css b/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css index bd491ffbf2..63cd80c40c 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css +++ b/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css @@ -1,10 +1,12 @@ :root { --font-family: Arial, sans-serif; + --margin-tiny: 0.125; --margin-small: 0.625rem; --margin-medium: 1.25rem; --margin-large: 2.5rem; - --padding-small: 0.125rem; + --padding-small: 0.625rem; --padding-medium: 1rem; + --warning-padding: 0.125rem; --font-size-large: 1.2rem; --logo-height: 2.5rem; --nav-height: 2.5rem; @@ -52,14 +54,6 @@ body { margin-bottom: var(--margin-medium); } -.table-container { - margin-bottom: var(--margin-large); -} - -.csv-table { - margin-top: var(--margin-small); -} - h3 { margin-top: 0; } @@ -106,7 +100,7 @@ nav ul li a.active { .warning { color: var(--warning-color); margin-bottom: var(--margin-small); - padding: var(--padding-small); + padding: var(--warning-padding); display: none; } @@ -146,7 +140,7 @@ nav ul li a.active { } .client { - padding: 10px; + padding: var(--margin-small); border-bottom: 1px solid var(--table-border-color); cursor: pointer; } @@ -154,22 +148,22 @@ nav ul li a.active { .client-details { max-height: 0; overflow: hidden; - padding-left: 10px; + padding-left: var(--padding-small); transition: max-height 0.2s ease-out, padding 0.2s ease-out, opacity 0.1s ease-out; - background-color: var(--bg-color); - margin-top: 5px; + background-color: var(--nav-bg-color); + margin-top: var(--margin-tiny); opacity: 0; } .client-details.show { max-height: none; - padding: 10px; + padding: var(--padding-small); opacity: 1; } .client-detail { border-bottom: 1px solid var(--table-border-color); - padding: 10px; + padding: var(--padding-small); } #show-connected-button { @@ -179,10 +173,26 @@ nav ul li a.active { font-size: var(--base-font-size); } -#show-connected-button:hover { +#show-connected-button:hover, +.scroll-button:hover { cursor: pointer; } +.scroll-button { + font-size: var(--base-font-size); + margin-left: var(--margin-tiny); + margin-top: var(--margin-small); +} + + +.table-container { + margin-bottom: var(--margin-large); +} + +.csv-table { + margin-top: var(--margin-small); +} + /* ------------ Overwriting Tabulator CSS rules ------------ */ :root.light .tabulator-header, diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js b/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js index 4896a1643c..78bd2c59b7 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js +++ b/src/blenderbim/blenderbim/bim/data/webui/static/js/index.js @@ -292,13 +292,13 @@ function toggleClientList() { $.each(connectedClients, function (id, client) { if (!client.shown) return; - const icon = $("") + const dropdownIcon = $("") .addClass("fas fa-chevron-down") .css("margin-left", "8px"); const clientDiv = $("
").addClass("client").text(client.ifc_file); - clientDiv.append(icon); + clientDiv.append(dropdownIcon); const clientDetailsDiv = $("
").addClass("client-details"); From c8defbb77f28c38f8aec217d142e243443b42fa1 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:59:56 +0300 Subject: [PATCH 03/16] add connected list to gantt chart page --- .../bim/data/webui/static/css/gantt.css | 78 +++++++++++++++++- .../bim/data/webui/static/css/index.css | 7 +- .../bim/data/webui/static/js/gantt.js | 82 +++++++++++++++++++ .../bim/data/webui/static/js/index.js | 6 +- .../bim/data/webui/templates/gantt.html | 8 ++ 5 files changed, 175 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/css/gantt.css b/src/blenderbim/blenderbim/bim/data/webui/static/css/gantt.css index 1256b09080..bad0ccad59 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/static/css/gantt.css +++ b/src/blenderbim/blenderbim/bim/data/webui/static/css/gantt.css @@ -1,13 +1,17 @@ :root { --font-family: Arial, sans-serif; + --base-font-size: 16px; + --margin-tiny: 0.125rem; --margin-small: 0.625rem; --margin-medium: 1.25rem; --margin-large: 2.5rem; - --padding-small: 0.125rem; + --padding-tiny: 0.125rem; + --padding-small: 0.625rem; --padding-medium: 1rem; --font-size-small: 1rem; --font-size-large: 1.2rem; --logo-height: 2.5rem; + --nav-height: 2.5rem; --folder-collapse-font-size: 0.75rem; --folder-collapse-font-family: Courier, "Courier New", monospace; --box-shadow: 0 0 0.7rem #5f5f5f66; @@ -31,6 +35,7 @@ --group-item-bg-color: #4b4b4b; --input-bg-color: #3b3b3b; --input-border-color: #000; + --details-border-color: #464444; } :root.light { @@ -42,6 +47,7 @@ --nav-link-color: #000000; --nav-link-hover-color: #38a63d; --warning-color: #FF4500; + --details-border-color: #222; } html { @@ -107,7 +113,7 @@ nav ul li a.active { .warning { color: var(--warning-color); margin-bottom: var(--margin-small); - padding: var(--padding-small); + padding: var(--padding-tiny); display: none; } @@ -141,6 +147,74 @@ nav ul li a.active { outline: none; } +#client-list { + position: absolute; + top: calc(0 + var(--nav-height)); + overflow-y: auto; + overflow: hidden; + transition: opacity 0.3s ease-out, visibility 0.3s ease-out; + border: 1px solid var(--table-border-color); + background-color: var(--nav-bg-color); + z-index: 1; + opacity: 0; + visibility: hidden; + width: auto; +} + +#client-list.show { + opacity: 1; + visibility: visible; +} + +#connected-list-div { + display: inline-block; +} + +.client { + padding: var(--margin-small); + border-bottom: 1px solid var(--table-border-color); + cursor: pointer; +} + +.client-details { + max-height: 0; + overflow: hidden; + padding-left: var(--padding-small); + transition: max-height 0.2s ease-out, padding 0.2s ease-out, opacity 0.1s ease-out; + background-color: var(--nav-bg-color); + margin-top: var(--margin-tiny); + opacity: 0; +} + +.client-details.show { + max-height: none; + padding: var(--padding-small); + opacity: 1; +} + +.client-detail { + border-bottom: 1px solid var(--table-border-color); + padding: var(--padding-small); +} + +#show-connected-button { + width: auto; + background-color: var(--bg-color); + border: none; + font-size: var(--base-font-size); +} + +#show-connected-button:hover, +.scroll-button:hover { + cursor: pointer; +} + +.scroll-button { + font-size: var(--base-font-size); + margin-left: var(--margin-tiny); + margin-top: var(--margin-small); +} + .gantt-info { margin: 0.5rem; font-size: var(--font-size-small); diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css b/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css index 63cd80c40c..d8a46fa708 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css +++ b/src/blenderbim/blenderbim/bim/data/webui/static/css/index.css @@ -1,12 +1,13 @@ :root { --font-family: Arial, sans-serif; - --margin-tiny: 0.125; + --base-font-size: 16px; + --margin-tiny: 0.125rem; --margin-small: 0.625rem; --margin-medium: 1.25rem; --margin-large: 2.5rem; + --padding-tiny: 0.125rem; --padding-small: 0.625rem; --padding-medium: 1rem; - --warning-padding: 0.125rem; --font-size-large: 1.2rem; --logo-height: 2.5rem; --nav-height: 2.5rem; @@ -100,7 +101,7 @@ nav ul li a.active { .warning { color: var(--warning-color); margin-bottom: var(--margin-small); - padding: var(--warning-padding); + padding: var(--padding-tiny); display: none; } diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/js/gantt.js b/src/blenderbim/blenderbim/bim/data/webui/static/js/gantt.js index e822c600d8..926d6cf5ad 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/static/js/gantt.js +++ b/src/blenderbim/blenderbim/bim/data/webui/static/js/gantt.js @@ -60,6 +60,10 @@ function handleBlenderDisconnect(blenderId) { delete connectedClients[blenderId]; removeGanttElement(blenderId); } + + $("#blender-count").text(function (i, text) { + return parseInt(text, 10) - 1; + }); } // Function to handle 'gantt_data' event @@ -77,6 +81,7 @@ function handleGanttData(data) { if (!connectedClients[blenderId].shown) { connectedClients[blenderId] = { shown: true, + ifc_file: filename, ganttTasks: ganttTasks, workSchedule: ganttWorkSched, }; @@ -89,6 +94,7 @@ function handleGanttData(data) { } else { connectedClients[blenderId] = { shown: true, + ifc_file: filename, ganttTasks: ganttTasks, workSchedule: ganttWorkSched, }; @@ -105,6 +111,10 @@ function handleDefaultData(data) { // Function to add a new gantt with data and filename function addGanttElement(blenderId, tasks, workSched, filename) { + $("#blender-count").text(function (i, text) { + return parseInt(text, 10) + 1; + }); + const ganttContainer = $("
") .addClass("gantt-container") .attr("id", "container-" + blenderId); @@ -382,3 +392,75 @@ function toggleTheme() { setTheme("dark"); } } + +function toggleClientList() { + var clientList = $("#client-list"); + + if (clientList.hasClass("show")) { + clientList.removeClass("show"); + return; + } + + clientList.empty(); + + $.each(connectedClients, function (id, client) { + if (!client.shown) return; + + const dropdownIcon = $("") + .addClass("fas fa-chevron-down") + .css("margin-left", "0.5rem"); + + const clientDiv = $("
").addClass("client").text(client.ifc_file); + + clientDiv.append(dropdownIcon); + + const clientDetailsDiv = $("
").addClass("client-details"); + + if (id) { + const clientId = $("
") + .addClass("client-detail") + .text(`Blender ID: ${id}`); + clientDetailsDiv.append(clientId); + } + + if (client.workSchedule && client.gantt) { + const clientScheduleName = $("
") + .addClass("client-detail") + .text(`Schedule Name: ${client.workSchedule.Name}`); + + const clientScheduleDate = $("
") + .addClass("client-detail") + .text( + `Schedule Date: ${new Date( + client.workSchedule.CreationDate + ).toLocaleDateString()}` + ); + + const scrollButton = $(" +
+ +
+
From adbf9093d359e6a5f0b1cc22bbe9045b1d9aad10 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:12:37 +0300 Subject: [PATCH 04/16] add initial drawings page --- .../blenderbim/bim/data/webui/sioserver.py | 8 + .../bim/data/webui/static/css/drawings.css | 186 ++++++++++++++++++ .../bim/data/webui/static/js/drawings.js | 28 +++ .../bim/data/webui/templates/drawings.html | 51 +++++ .../bim/data/webui/templates/gantt.html | 1 + .../bim/data/webui/templates/index.html | 1 + 6 files changed, 275 insertions(+) create mode 100644 src/blenderbim/blenderbim/bim/data/webui/static/css/drawings.css create mode 100644 src/blenderbim/blenderbim/bim/data/webui/static/js/drawings.js create mode 100644 src/blenderbim/blenderbim/bim/data/webui/templates/drawings.html diff --git a/src/blenderbim/blenderbim/bim/data/webui/sioserver.py b/src/blenderbim/blenderbim/bim/data/webui/sioserver.py index fdbef0b50c..269f355fce 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/sioserver.py +++ b/src/blenderbim/blenderbim/bim/data/webui/sioserver.py @@ -119,11 +119,19 @@ async def gantt(request): return web.Response(text=html_content, content_type="text/html") +async def drawings(request): + with open("templates/drawings.html", "r") as f: + template = f.read() + html_content = pystache.render(template, {"port": sio_port}) + return web.Response(text=html_content, content_type="text/html") + + async def open_web_browser(app): webbrowser.open(f"http://127.0.0.1:{sio_port}/") app.router.add_get("/", index) +app.router.add_get("/drawings", drawings) app.router.add_get("/gantt", gantt) app.router.add_static("/jsgantt/", path="../gantt", name="jsgantt") app.router.add_static("/static/", path="./static", name="static") diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/css/drawings.css b/src/blenderbim/blenderbim/bim/data/webui/static/css/drawings.css new file mode 100644 index 0000000000..3798c42875 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/data/webui/static/css/drawings.css @@ -0,0 +1,186 @@ +:root { + --font-family: Arial, sans-serif; + --base-font-size: 16px; + --margin-tiny: 0.125rem; + --margin-small: 0.625rem; + --margin-medium: 1.25rem; + --margin-large: 2.5rem; + --padding-tiny: 0.125rem; + --padding-small: 0.625rem; + --padding-medium: 1rem; + --font-size-large: 1.2rem; + --logo-height: 2.5rem; + --nav-height: 2.5rem; +} + +:root.dark { + color-scheme: dark; + --bg-color: #252525; + --text-color: #e0e0e0; + --nav-bg-color: #121212; + --nav-border-color: #25682a; + --nav-link-color: #fff; + --nav-link-hover-color: #3fb449; + --warning-color: #FFDB8F; + --table-border-color: #464444; +} + +:root.light { + color-scheme: light; + --bg-color: #ffffff; + --text-color: #000000; + --nav-bg-color: #f8f8f8; + --nav-border-color: #cccccc; + --nav-link-color: #000000; + --nav-link-hover-color: #38a63d; + --warning-color: #FF4500; + --table-border-color: #222; +} + +html { + font-size: var(--base-font-size); +} + +body { + background-color: var(--bg-color); + color: var(--text-color); + margin: 0; + font-family: var(--font-family); +} + +#container { + margin-top: var(--margin-medium); + margin-left: var(--margin-small); + margin-right: var(--margin-small); + margin-bottom: var(--margin-medium); +} + +h3 { + margin-top: 0; +} + +nav { + background-color: var(--nav-bg-color); + height: var(--nav-height); + padding: var(--padding-medium) 0; + display: flex; + align-items: center; + position: relative; + border-bottom: 2px solid var(--nav-border-color); +} + +nav .logo { + margin-left: var(--margin-large); + height: var(--logo-height); +} + +nav ul { + list-style-type: none; + margin: 0; + margin-left: 0.0625rem; + display: flex; + flex-grow: 1; + justify-content: center; +} + +nav ul li { + margin-right: 3.125rem; +} + +nav ul li a { + text-decoration: none; + color: var(--nav-link-color); + font-size: var(--font-size-large); +} + +nav ul li a:hover, +nav ul li a.active { + color: var(--nav-link-hover-color); +} + +.warning { + color: var(--warning-color); + margin-bottom: var(--margin-small); + padding: var(--padding-tiny); + display: none; +} + +#toggle-theme { + border: none; + background: none; + cursor: pointer; + font-size: var(--font-size-large); + margin-right: var(--margin-medium); +} + +#toggle-theme:focus { + outline: none; +} + +#client-list { + position: absolute; + top: calc(0 + var(--nav-height)); + overflow-y: auto; + overflow: hidden; + transition: opacity 0.3s ease-out, visibility 0.3s ease-out; + border: 1px solid var(--table-border-color); + background-color: var(--nav-bg-color); + z-index: 1; + opacity: 0; + visibility: hidden; + width: auto; +} + +#client-list.show { + opacity: 1; + visibility: visible; +} + +#connected-list-div { + display: inline-block; +} + +.client { + padding: var(--margin-small); + border-bottom: 1px solid var(--table-border-color); + cursor: pointer; +} + +.client-details { + max-height: 0; + overflow: hidden; + padding-left: var(--padding-small); + transition: max-height 0.2s ease-out, padding 0.2s ease-out, opacity 0.1s ease-out; + background-color: var(--nav-bg-color); + margin-top: var(--margin-tiny); + opacity: 0; +} + +.client-details.show { + max-height: none; + padding: var(--padding-small); + opacity: 1; +} + +.client-detail { + border-bottom: 1px solid var(--table-border-color); + padding: var(--padding-small); +} + +#show-connected-button { + width: auto; + background-color: var(--bg-color); + border: none; + font-size: var(--base-font-size); +} + +#show-connected-button:hover, +.scroll-button:hover { + cursor: pointer; +} + +.scroll-button { + font-size: var(--base-font-size); + margin-left: var(--margin-tiny); + margin-top: var(--margin-small); +} \ No newline at end of file diff --git a/src/blenderbim/blenderbim/bim/data/webui/static/js/drawings.js b/src/blenderbim/blenderbim/bim/data/webui/static/js/drawings.js new file mode 100644 index 0000000000..ae254501a2 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/data/webui/static/js/drawings.js @@ -0,0 +1,28 @@ +// keeps track of blenders connected in form of +// {shown:bool, filename:string, headers:array} +const connectedClients = {}; +let socket; + +// Document ready function +$(document).ready(function () { + var systemTheme = window.matchMedia("(prefers-color-scheme: light)").matches + ? "light" + : "dark"; + var theme = localStorage.getItem("theme") || systemTheme; + setTheme(theme); + + connectSocket(); +}); + +// Function to connect to Socket.IO server +function connectSocket() { + const url = "ws://localhost:" + SOCKET_PORT + "/web"; + socket = io(url); + console.log("socket: ", socket); + + // Register socket event handlers + // socket.on("blender_connect", handleBlenderConnect); + // socket.on("blender_disconnect", handleBlenderDisconnect); + // socket.on("csv_data", handleCsvData); + // socket.on("default_data", handleDefaultData); +} diff --git a/src/blenderbim/blenderbim/bim/data/webui/templates/drawings.html b/src/blenderbim/blenderbim/bim/data/webui/templates/drawings.html new file mode 100644 index 0000000000..159e2a95fd --- /dev/null +++ b/src/blenderbim/blenderbim/bim/data/webui/templates/drawings.html @@ -0,0 +1,51 @@ + + + + + + Web Client + + + + + + + + + +
+ +
+
+
+ + diff --git a/src/blenderbim/blenderbim/bim/data/webui/templates/gantt.html b/src/blenderbim/blenderbim/bim/data/webui/templates/gantt.html index 3556aa86bc..aa28ce3705 100644 --- a/src/blenderbim/blenderbim/bim/data/webui/templates/gantt.html +++ b/src/blenderbim/blenderbim/bim/data/webui/templates/gantt.html @@ -34,6 +34,7 @@