From d6479a7ece1133444d7bf8aaed7ecafc383ad551 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 1 May 2025 14:32:31 +0200 Subject: [PATCH] pushbutton changed to link in left column --- client/cssFiles/SEAWebClientGroup.css | 44 +++--- client/jsFiles/SEAWebClientCommunication.js | 5 +- client/jsFiles/SEAWebClientGroup.js | 163 ++++++++------------ client/jsFiles/SEAWebClientMain.js | 18 +-- client/res/icon_sinus.png | Bin 5463 -> 5374 bytes 5 files changed, 97 insertions(+), 133 deletions(-) diff --git a/client/cssFiles/SEAWebClientGroup.css b/client/cssFiles/SEAWebClientGroup.css index 4f34c37..8dd4edf 100644 --- a/client/cssFiles/SEAWebClientGroup.css +++ b/client/cssFiles/SEAWebClientGroup.css @@ -138,6 +138,18 @@ display: inline-block; } + +/* ------------------------------ pushbutton ------------------------------ */ + +.push-button-active { + text-decoration: underline; + cursor: pointer; +} + +.push-button-active:hover { + color: blue; +} + /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* right */ @@ -165,9 +177,11 @@ .icon-edit { position: absolute; - top: 4px; - right: 2px; + top: 7px; + right: 0; cursor: pointer; + width: 14px; + height: 14px; } .icon-edit:hover { @@ -182,9 +196,9 @@ /* ------------------------------ okay-icon ------------------------------ */ .icon-okay { - width: 18px; - height: 18px; - margin-top: 6px; + width: 14px; + height: 14px; + margin-top: 7px; margin-left: 4px; } @@ -201,12 +215,7 @@ text-align: right; } -.input-element-button { - display: block; - text-align: right; -} - -.input-element-hidden, .input-element-button-hidden { +.input-element-hidden { display: none; } @@ -303,19 +312,6 @@ option { opacity: 0.85; } -/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ -/* PUSH-BUTTON */ - -.push-button { - border: 2px solid dimgray; - border-radius: 4px; - display: inline-block; - width: 16px; - height: 16px; - top: 5px; - z-index: 50; -} - /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* PANEL <- moved here from SEAWebClientSwiper.css */ .panel { diff --git a/client/jsFiles/SEAWebClientCommunication.js b/client/jsFiles/SEAWebClientCommunication.js index 89db5b7..6f6233a 100644 --- a/client/jsFiles/SEAWebClientCommunication.js +++ b/client/jsFiles/SEAWebClientCommunication.js @@ -216,7 +216,6 @@ function updateTarget(component) { let matches = document.getElementsByName(component.name); let elem = matches[0]; // Should be the only match elem.value = component.value; - let row = elem.closest('div'); row.classList.remove('row-waiting-for-answer'); @@ -229,7 +228,9 @@ function updateTarget(component) { } } elem.actualValue = component.value; - resizeTextfield(elem); + if(elem.__ctype__ == 'input') { + resizeTextfield(elem); + } } function updateStatus(component) { diff --git a/client/jsFiles/SEAWebClientGroup.js b/client/jsFiles/SEAWebClientGroup.js index d8c1af2..ed78cfe 100644 --- a/client/jsFiles/SEAWebClientGroup.js +++ b/client/jsFiles/SEAWebClientGroup.js @@ -88,6 +88,19 @@ function createLeftColumnForModules(component) { let modules_title = document.createElement('span'); modules_title.classList.add('modules-title'); modules_title.innerHTML = component.title; + if (component.type == 'pushbutton') { + modules_title.classList.add('push-button'); + if (writePermission == true) { + modules_title.classList.add('push-button-active'); + } + modules_title.onclick = function () { + if (writePermission == true) { + let row = button.closest('div'); + row.classList.add('row-waiting-for-answer'); + sendCommand(s, component.command); + } + } + } left.appendChild(modules_title); if (component.statusname) { let status_info = document.createElement('span'); @@ -135,8 +148,29 @@ function createLeftColumnForModules(component) { function createLeftColumnForParameters(component) { let left = document.createElement('span'); left.classList.add('col-left'); - left.innerHTML = component.title; + if (component.type == 'pushbutton') { + left.appendChild(createPushButton (component)); + } else { + left.innerHTML = component.title; + } return left; + + function createPushButton (component) { + let button = document.createElement('span'); + button.classList.add('push-button'); + if (writePermission == true) { + button.classList.add('push-button-active'); + } + button.innerHTML = component.title; + button.onclick = function () { + if (writePermission == true) { + let row = button.closest('div'); + row.classList.add('row-waiting-for-answer'); + sendCommand(s, component.command); + } + } + return button; + } } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ @@ -151,15 +185,12 @@ function createRightColumnForModules(component) { if (component.targetname) { if (component.type == 'input' || - component.type == 'pushbutton' || component.type == 'checkbox' || component.type == 'enum' ) { let input_element = createType(component); - if (component.type != 'pushbutton') { - let icon_edit = createIconEdit(input_element); - right.appendChild(icon_edit); - } + let icon_edit = createIconEdit(input_element); + right.appendChild(icon_edit); right.appendChild(input_element); } } @@ -174,15 +205,12 @@ function createRightColumnForParameters(component) { right.appendChild(createValue(component)); if (component.type == 'input' || - component.type == 'pushbutton' || component.type == 'checkbox' || component.type == 'enum' ) { let input_element = createType(component); - if (component.type != 'pushbutton') { - let icon_edit = createIconEdit(input_element); - right.appendChild(icon_edit); - } + let icon_edit = createIconEdit(input_element); + right.appendChild(icon_edit); right.appendChild(input_element); } return right; @@ -226,14 +254,7 @@ function createType (component) { case 'enum': input_element = createEnum(component); input_element.classList.add('input-element', 'input-element-hidden'); - break; - case 'pushbutton': - input_element = createPushbutton(component); - input_element.classList.add('input-element-button'); - if (writePermission == false) { - input_element.classList.add('input-element-button-hidden'); - } - break; + break; case 'input': input_element = createInputText(component); input_element.classList.add('input-element', 'input-element-hidden'); @@ -249,20 +270,6 @@ function createType (component) { /* ---------------------------------------------------------------------------------- */ // input elements -function createPushbutton(component) { - // Creates row-element containing a push button - var button = createInputElement(component, 'button', 'push-button'); - button.setAttribute('type', 'button'); - - button.onclick = function () { - let row = button.closest('div'); - // row.classList.add('row-waiting-for-answer'); - sendCommand(s, component.command); - } - let elem = document.createElement('span'); - elem.appendChild(button); - return elem; -} function createInputText(component) { // Creates row-element containing input-item. @@ -270,19 +277,15 @@ function createInputText(component) { var input = createInputElement(component, 'input', 'input-text'); input.type = "text"; input.style.width = "100px"; - + input.onclick = function (e) { + e.stopPropagation(); + } // Prevent updates, while user is changing textfield input.addEventListener("focus", function(evt) { let elm = evt.target; setTimeout(function(){elm.setSelectionRange(0, elm.value.length);},0); }); - let submit_btn = document.createElement('input'); - submit_btn.setAttribute('type', 'image'); - submit_btn.classList.add('icon-modules', 'icon-okay'); - submit_btn.setAttribute('src', 'res/icon_okay.png'); - submit_btn - input.onkeydown = function (e) { if (e.key == "Escape") { // User decided to cancel @@ -303,52 +306,6 @@ function createInputText(component) { }, 1); } - // input.onclick = function (e) { - // e.stopPropagation(); - // } - - // input.onblur = function () { - // if (prompt) { - // return false; - // } - // var row = input.closest('div'); - // row.classList.add('row-waiting-for-answer'); - // var value = input.value; - // let oldValue = 'oldValue' in input ? input.oldValue : value; - // if (!('actualValue' in input)) input.actualValue = oldValue; - // actualValue = input.actualValue; - // if (value == actualValue || value == oldValue || - // parseFloat(value) == parseFloat(actualValue) || parseFloat(value) == parseFloat(oldValue)) { - // input.value = actualValue; - // // nothing to do. - // row.classList.remove('row-waiting-for-answer'); - // return false; - // } - // // User changed value and moved focus to other object. - // alertify.confirm("", "You changed a field without pressing the return key.
" - // + "Hint: press ESC for leaving a field unchanged." - // + "You are connected with " + clientTitle + ".
" - // + "Are you sure you want to change the value of
" - // + component.name + " from " + actualValue - // + " to " + value + "?", - // function () { - // // User decided to proceed. - // row.classList.add('row-waiting-for-answer'); - // // Request for command - // sendCommand(s, component.command + " " + value); - // resizeTextfield(input); - // prompt = false; - // hideInputElements(); - // }, function () { - // // User decided to cancel - // input.value = input.actualValue; - // resizeTextfield(input); - // row.classList.remove('row-waiting-for-answer'); - // prompt = false; - // hideInputElements(); - // }); - // } - var form = document.createElement('form'); form.onsubmit = function (e) { e.preventDefault(); @@ -361,11 +318,12 @@ function createInputText(component) { } else { sendCommand(s, component.name + " " + input.value); } + row.classList.add('row-waiting-for-answer'); input.blur(); hideInputElements(); }; form.appendChild(input); - form.appendChild(submit_btn); + form.appendChild(createSubmitButton()); return form; } @@ -373,21 +331,21 @@ function createCheckbox(component) { // Creates row-element containing checkbox-item var input = createInputElement(component, 'input', 'parameter-checkbox'); input.type = "checkbox"; - - input.onclick = function () { - handleCheckbox(); + input.onclick = function (e) { + e.stopPropagation; } - function handleCheckbox() { - let row = input.closest('div'); + var form = document.createElement('form'); + form.onsubmit = function (e) { + e.preventDefault(); + var row = form.closest('div'); row.classList.add('row-waiting-for-answer'); sendCommand(s, component.command + " " + input.checked); - // hideInputElements(); + hideInputElements(); }; - - let right = document.createElement('span'); - right.appendChild(input); - return right; + form.appendChild(input); + form.appendChild(createSubmitButton()); + return form; } function createEnum(component) { @@ -438,6 +396,17 @@ function createInputElement(component, tag='span', cls='col-right-modules') { return input_element; } +function createSubmitButton () { + let submit_btn = document.createElement('input'); + submit_btn.setAttribute('type', 'image'); + submit_btn.classList.add('icon-modules', 'icon-okay'); + submit_btn.setAttribute('src', 'res/icon_okay.png'); + submit_btn.onclick = function (e) { + e.stopPropagation(); + } + return submit_btn; +} + /* ---------------------------------------------------------------------------------- */ // Hides all input elements (input text, pushbotton, enum, checkbox) diff --git a/client/jsFiles/SEAWebClientMain.js b/client/jsFiles/SEAWebClientMain.js index 1526fbc..750eeae 100644 --- a/client/jsFiles/SEAWebClientMain.js +++ b/client/jsFiles/SEAWebClientMain.js @@ -185,24 +185,22 @@ window.onload = function() { icon_lock_container.onclick = function(){ let array_icon_edit = document.getElementsByClassName('icon-edit'); - let array_button = document.getElementsByClassName('input-element-button'); - if (writePermission == false) { + let array_pushbutton = document.getElementsByClassName('push-button'); + + if (writePermission == false) { alertify.prompt( "WRITE PERMISSION", "Current device: "+ window.device + "

Please confirm the instrument:", "" , function(evt, value) { // User decided to proceed - if (window.instrument.toUpperCase() === value.toUpperCase()) { + if (window.instrument.toUpperCase() == value.toUpperCase()) { 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'); + for(i = 0; i < array_pushbutton.length; i++) { + array_pushbutton[i].classList.add('push-button-active'); } - } else { - console.log(clientTitle); } - // prompt = false; } , function() { // User decided to cancel @@ -214,8 +212,8 @@ window.onload = function() { 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'); + for(i = 0; i < array_pushbutton.length; i++) { + array_pushbutton[i].classList.remove('push-button-active'); } } } diff --git a/client/res/icon_sinus.png b/client/res/icon_sinus.png index aa61bf10152f11af62a28cfe7962a79a54b2b83f..2c9987c61c437b82038a222f130301f291e74adf 100644 GIT binary patch delta 5342 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 delta 5432 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 ip#pr