From 9bacb41be862af964265ecd6e172ec30c060b606 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 27 Apr 2025 09:36:03 +0200 Subject: [PATCH] Global write permission | lock button + lock icon added: click -> toggle global write permission --- client/SEAWebClient.html | 12 ++-- client/cssFiles/SEAWebClientGroup.css | 32 +++++---- client/cssFiles/SEAWebClientMain.css | 71 +++++++++++--------- client/jsFiles/SEAWebClientCommunication.js | 22 +++--- client/jsFiles/SEAWebClientGroup.js | 10 +-- client/jsFiles/SEAWebClientMain.js | 48 ++++++++++--- client/res/icon_lock_closed.png | Bin 0 -> 6341 bytes client/res/icon_lock_open.png | Bin 0 -> 6424 bytes 8 files changed, 119 insertions(+), 76 deletions(-) create mode 100644 client/res/icon_lock_closed.png create mode 100644 client/res/icon_lock_open.png diff --git a/client/SEAWebClient.html b/client/SEAWebClient.html index 0423481..72f0158 100644 --- a/client/SEAWebClient.html +++ b/client/SEAWebClient.html @@ -76,12 +76,14 @@
-
- - +
+
-
- +
+ +
+
+
diff --git a/client/cssFiles/SEAWebClientGroup.css b/client/cssFiles/SEAWebClientGroup.css index e6caf1e..aa78449 100644 --- a/client/cssFiles/SEAWebClientGroup.css +++ b/client/cssFiles/SEAWebClientGroup.css @@ -21,8 +21,6 @@ /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* panel */ -/* ------------------------------ modules-icons ------------------------------ */ - /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* row */ @@ -53,7 +51,9 @@ background-color: orangered; } -.modules-icon { +/* ------------------------------ icon-modules ------------------------------ */ + +.icon-modules { display: inline-block; width: 12px; height: 12px; @@ -95,31 +95,31 @@ display: inline-block; } -/* ------------------------------ status-icon ------------------------------ */ +/* ------------------------------ icon-status ------------------------------ */ -.status-icon { +.icon-status { border-radius: 50%; background-color: lightgray; margin-right: 4px; } -.status-icon-idle { +.icon-status-idle { background-color: lightgray; } -.status-icon-idle { +.icon-status-idle { background-color: white; } -.status-icon-busy { +.icon-status-busy { background-color: yellow; } -.status-icon-warn { +.icon-status-warn { background-color: orange; } -.status-icon-error { +.icon-status-error { background-color: red; } @@ -134,7 +134,7 @@ display: none; } -.status-icon:hover ~ .status-info { +.icon-status:hover ~ .status-info { display: inline-block; } @@ -163,18 +163,22 @@ /* ------------------------------ edit-icon ------------------------------ */ -.edit-icon { +.icon-edit { position: absolute; top: 4px; right: 2px; cursor: pointer; } -.edit-icon:hover { +.icon-edit:hover { transform: scale(.8); opacity: .6; } +.icon-edit-hidden { + display: none; +} + /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* INPUT ELEMENTS */ @@ -188,7 +192,7 @@ text-align: right; } -.input-element-hidden { +.input-element-hidden, .input-element-button-hidden { display: none; } diff --git a/client/cssFiles/SEAWebClientMain.css b/client/cssFiles/SEAWebClientMain.css index b69e0fb..5be7510 100644 --- a/client/cssFiles/SEAWebClientMain.css +++ b/client/cssFiles/SEAWebClientMain.css @@ -179,48 +179,57 @@ meta, body { } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ -/* CLOSE CROSS */ +/* MAIN ICONS */ -#close-cross { - z-index: 50; - top: 9px; - right: 12px; - position: fixed; - cursor: pointer; -} - -.icon-close { - height: 20px; - width: 20px; -} - -.icon-close:hover { - transform: scale(90%); - transition: .5s; -} - -/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ -/* LOG ICON */ - -.log-icon-container { +.icon-main-container { z-index: 1001; - bottom: 9px; - right: 12px; position: fixed; color: white; cursor: pointer; } -.log-icon-container-hidden { - display: none; -} - -.log-icon { +.icon-main { height: 20px; width: 20px; } -.log-icon:hover { +.icon-main:hover { transform: scale(90%); transition: .5s; +} + +.icon-main-container-hidden { + display: none; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* CLOSE CROSS */ + +.icon-close-container { + top: 9px; + right: 12px; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* LOG ICON */ + +.icon-log-container { + bottom: 9px; + right: 42px; +} + +.icon-log-container-hidden { + display: none; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* LOCK ICON */ + +.icon-lock-container { + bottom: 9px; + right: 12px; +} + +.icon-lock-container-hidden { + display: none; } \ No newline at end of file diff --git a/client/jsFiles/SEAWebClientCommunication.js b/client/jsFiles/SEAWebClientCommunication.js index 41a9e32..f2efabb 100644 --- a/client/jsFiles/SEAWebClientCommunication.js +++ b/client/jsFiles/SEAWebClientCommunication.js @@ -239,31 +239,31 @@ function updateStatus(component) { status_info.innerHTML = component.formatted; } - status_icon.classList.remove('status-icon-disabled'); - status_icon.classList.remove('status-icon-idle'); - status_icon.classList.remove('status-icon-warn'); - status_icon.classList.remove('status-icon-busy'); - status_icon.classList.remove('status-icon-error'); + status_icon.classList.remove('icon-status-disabled'); + status_icon.classList.remove('icon-status-idle'); + status_icon.classList.remove('icon-status-warn'); + status_icon.classList.remove('icon-status-busy'); + status_icon.classList.remove('icon-status-error'); row.classList.remove('row-disabled'); right.classList.remove = 'col-right-disabled'; switch (statusCode) { case 0: - status_icon.classList.add('status-icon-disabled'); + status_icon.classList.add('icon-status-disabled'); row.classList.add('row-disabled'); right.classList.add = 'col-right-disabled'; break; case 1: - status_icon.classList.add('status-icon-idle'); + status_icon.classList.add('icon-status-idle'); break; case 2: - status_icon.classList.add('status-icon-warn'); + status_icon.classList.add('icon-status-warn'); break; case 3: - status_icon.classList.add('status-icon-busy'); + status_icon.classList.add('icon-status-busy'); break; case 4: - status_icon.classList.add('status-icon-error'); + status_icon.classList.add('icon-status-error'); break; } @@ -399,7 +399,7 @@ function successHandler(s, message) { isl = appendToGridElement(2, message.title, 'parameters', createContent(message)); adjustGrid(); if (nColumns == 1 || nColumns == 2 || nColumns == 3) { - document.getElementById('close-cross').innerHTML = ''; + document.getElementsByClassName('icon-close-container')[0].innerHTML = ''; } } nextInitCommand(); diff --git a/client/jsFiles/SEAWebClientGroup.js b/client/jsFiles/SEAWebClientGroup.js index 2748bef..b8fde68 100644 --- a/client/jsFiles/SEAWebClientGroup.js +++ b/client/jsFiles/SEAWebClientGroup.js @@ -82,7 +82,7 @@ function createRowForParameters(component) { break; case 'pushbutton': input_element = createPushbutton(component); - input_element.classList.add('input-element-button'); + input_element.classList.add('input-element-button', 'input-element-button-hidden'); break; case 'input': input_element = createInput(component); @@ -104,7 +104,7 @@ function createRowForParameters(component) { function createIconEdit () { let icon_edit = document.createElement('img'); icon_edit.setAttribute('src', 'res/icon_edit.png'); - icon_edit.classList.add('modules-icon', 'edit-icon'); + icon_edit.classList.add('icon-modules', 'icon-edit', 'icon-edit-hidden'); icon_edit.onclick = function () { let is_hidden = input_element.classList.contains('input-element-hidden'); @@ -156,14 +156,14 @@ function createLeftColumnForModules(component) { let icon_status = document.createElement('img'); icon_status.setAttribute('src', 'res/icon_status.png'); icon_status.setAttribute('name', component.title + ':status'); - icon_status.classList.add('modules-icon', 'status-icon'); + icon_status.classList.add('icon-modules', 'icon-status'); return icon_status; } function createInfoIcon(component) { let icon_info = document.createElement('img'); icon_info.setAttribute('src', 'res/icon_info.png'); - icon_info.classList.add('modules-icon', 'icon-info'); + icon_info.classList.add('icon-modules', 'icon-info'); if (isTouchDevice) { icon_info.onclick = function (event) { event.stopPropagation() @@ -206,7 +206,7 @@ function createRightColumnForModules(component) { function createIconEdit () { let icon_edit = document.createElement('img'); icon_edit.setAttribute('src', 'res/icon_edit.png'); - icon_edit.classList.add('modules-icon', 'edit-icon'); + icon_edit.classList.add('icon-modules', 'icon-edit', 'icon-edit-hidden'); icon_edit.onclick = function (event) { event.stopPropagation() diff --git a/client/jsFiles/SEAWebClientMain.js b/client/jsFiles/SEAWebClientMain.js index 886a694..3da5261 100644 --- a/client/jsFiles/SEAWebClientMain.js +++ b/client/jsFiles/SEAWebClientMain.js @@ -148,32 +148,36 @@ window.onload = function() { // rows 'n' adjustGrid(); - let crossElement = document.getElementById("close-cross"); + /* ----------------------------------------------------------------------------------------------------- */ + /* MIAN ICONS */ + + let icon_close_container = document.getElementsByClassName("icon-close-container")[0]; + let icon_log_container = document.getElementsByClassName("icon-log-container")[0]; + let icon_lock_container = document.getElementsByClassName("icon-lock-container")[0]; if (window.hideRightPart){ - document.body.removeChild(crossElement); + document.body.removeChild(icon_close_container); } else { - crossElement.onclick = function(){ + icon_close_container.onclick = function(){ if (showParams) { showParams = false; - document.getElementById('close-cross').innerHTML = ''; + icon_close_container.innerHTML = ''; } else { if (window.wideGraphs) { window.wideGraphs = false; - document.getElementById('close-cross').innerHTML = ''; - document.getElementsByClassName('log-icon-container')[0].classList.remove("log-icon-container-hidden"); + icon_close_container.innerHTML = ''; + icon_log_container.classList.remove("icon-main-container-hidden"); } else { window.wideGraphs = true; - document.getElementById('close-cross').innerHTML = ''; - document.getElementsByClassName('log-icon-container')[0].classList.add("log-icon-container-hidden"); + icon_close_container.innerHTML = ''; + icon_log_container.classList.add("icon-main-container-hidden"); } } adjustGrid(); } } - let logIcon = document.getElementsByClassName("log-icon-container")[0]; - logIcon.onclick = function(){ + icon_log_container.onclick = function(){ if (showConsole) { showConsole = false; } else { @@ -182,6 +186,30 @@ window.onload = function() { adjustGrid(); } + icon_lock_container.onclick = function(){ + let array_icon_edit = document.getElementsByClassName('icon-edit'); + let array_button = document.getElementsByClassName('input-element-button'); + if (writePermission == false) { + writePermission = true; + icon_lock_container.innerHTML = ''; + for(i = 0; i < array_icon_edit.length; i++) { + array_icon_edit[i].classList.remove('icon-edit-hidden'); + } + for(i = 0; i < array_button.length; i++) { + array_button[i].classList.remove('input-element-button-hidden'); + } + } else { + writePermission = false; + icon_lock_container.innerHTML = ''; + for(i = 0; i < array_icon_edit.length; i++) { + array_icon_edit[i].classList.add('icon-edit-hidden'); + } + for(i = 0; i < array_button.length; i++) { + array_button[i].classList.add('input-element-button-hidden'); + } + } + } + var homeButton = document.getElementById("home-icon"); homeButton.onclick = function () { diff --git a/client/res/icon_lock_closed.png b/client/res/icon_lock_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..5b60bf72fb0386555a40a3de9aa2fb06cf036e1e GIT binary patch literal 6341 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 O1Yl}t1=i}j{r7*pL?Q41 literal 0 HcmV?d00001 diff --git a/client/res/icon_lock_open.png b/client/res/icon_lock_open.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3d5ecd6ca4780380aa861636a5c834b2a3c097 GIT binary patch literal 6424 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 literal 0 HcmV?d00001