From af3a4f0e71257574adc62ecc9ae8b258758b9ba7 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Thu, 30 May 2024 17:12:39 +0200 Subject: [PATCH 01/27] patchNode --- .../source/class/osparc/data/model/Study.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Study.js b/services/static-webserver/client/source/class/osparc/data/model/Study.js index f34ce1865ef..14850a0ee0f 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Study.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Study.js @@ -595,6 +595,33 @@ qx.Class.define("osparc.data.model.Study", { return jsonObject; }, + patchNode: function(nodeId, fieldKey, value) { + return new Promise((resolve, reject) => { + const patchData = {}; + patchData[fieldKey] = value; + const params = { + url: { + "studyId": this.getUuid(), + "nodeId": nodeId + }, + data: patchData + }; + osparc.data.Resources.fetch("studies", "patchNode", params) + .then(() => { + const upKey = qx.lang.String.firstUp(fieldKey); + const setter = "set" + upKey; + this.getWorkbench()[setter](value); + // A bit hacky, but it's not sent back to the backend + this.set({ + lastChangeDate: new Date() + }); + const studyData = this.serializeStudyData(); + resolve(studyData); + }) + .catch(err => reject(err)); + }); + }, + patchStudy: function(fieldKey, value) { return new Promise((resolve, reject) => { const patchData = {}; From 7cf04599c083e352b6f7abd7a34b1316259d0d38 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Thu, 30 May 2024 17:13:41 +0200 Subject: [PATCH 02/27] retire exposedNodes --- .../source/class/osparc/data/model/Node.js | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index afca119c2c9..02a4f1a5370 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -53,7 +53,6 @@ qx.Class.define("osparc.data.model.Node", { this.setOutputs({}); this.__inputNodes = []; - this.__exposedNodes = []; if (study) { this.setStudy(study); @@ -331,7 +330,6 @@ qx.Class.define("osparc.data.model.Node", { members: { __metaData: null, __inputNodes: null, - __exposedNodes: null, __settingsForm: null, __posX: null, __posY: null, @@ -512,7 +510,6 @@ qx.Class.define("osparc.data.model.Node", { } this.setOutputData(nodeData.outputs); this.addInputNodes(nodeData.inputNodes); - this.addOutputNodes(nodeData.outputNodes); }, populateStates: function(nodeData) { @@ -875,44 +872,6 @@ qx.Class.define("osparc.data.model.Node", { }, // !---- Input Nodes ----- - // ----- Output Nodes ----- - getOutputNodes: function() { - return this.__exposedNodes; - }, - - addOutputNodes: function(outputNodes) { - if (outputNodes) { - outputNodes.forEach(outputNode => { - this.addOutputNode(outputNode); - }); - } - }, - - addOutputNode: function(outputNodeId) { - if (!this.__exposedNodes.includes(outputNodeId)) { - this.__exposedNodes.push(outputNodeId); - this.fireEvent("outputListChanged"); - return true; - } - return false; - }, - - removeOutputNode: function(outputNodeId) { - const index = this.__exposedNodes.indexOf(outputNodeId); - if (index > -1) { - // remove node connection - this.__exposedNodes.splice(index, 1); - this.fireEvent("outputListChanged"); - } - return false; - }, - - isOutputNode: function(outputNodeId) { - const index = this.__exposedNodes.indexOf(outputNodeId); - return (index > -1); - }, - // !---- Output Nodes ----- - canNodeStart: function() { return this.isDynamic() && ["idle", "failed"].includes(this.getStatus().getInteractive()); }, From 6fad4c6a4177612aeb8d7ed3c0b89f5ca507e20f Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Thu, 30 May 2024 17:15:22 +0200 Subject: [PATCH 03/27] "Input Required" button --- .../source/class/osparc/data/model/Node.js | 8 ++ .../class/osparc/form/renderer/PropForm.js | 75 ++++++++++++++----- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index 02a4f1a5370..00c1406e4b8 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -135,6 +135,13 @@ qx.Class.define("osparc.data.model.Node", { event: "changeInputs" }, + inputsRequired: { + check: "Array", + init: [], + event: "changeInputsRequired", + apply: "__applyInputsRequired" + }, + outputs: { check: "Object", nullable: false, @@ -1491,6 +1498,7 @@ qx.Class.define("osparc.data.model.Node", { inputsUnits: this.__getInputUnits(), inputAccess: this.getInputAccess(), inputNodes: this.getInputNodes(), + inputsRequired: this.getInputsRequired(), thumbnail: this.getThumbnail(), bootOptions: this.getBootOptions() }; diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index 733be9bd936..ac13a259124 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -286,6 +286,12 @@ qx.Class.define("osparc.form.renderer.PropForm", { }); }); } + + if (optionsMenu.getChildren().length) { + optionsMenu.addSeparator(); + } + const inputRequiredButton = this.__getInputRequiredButton(field.key); + optionsMenu.add(inputRequiredButton); }, __connectToInputNode: function(targetPortId, inputNodeId, outputKey) { @@ -342,6 +348,26 @@ qx.Class.define("osparc.form.renderer.PropForm", { return null; }, + __populateInputNodePortsMenu: function(inputNodeId, targetPortId, menu, menuBtn) { + menuBtn.exclude(); + menu.removeAll(); + + const inputNode = this.getStudy().getWorkbench().getNode(inputNodeId); + if (inputNode) { + for (const outputKey in inputNode.getOutputs()) { + osparc.utils.Ports.arePortsCompatible(inputNode, outputKey, this.getNode(), targetPortId) + .then(compatible => { + if (compatible) { + const paramButton = new qx.ui.menu.Button(inputNode.getOutput(outputKey).label); + paramButton.addListener("execute", () => this.__connectToInputNode(targetPortId, inputNodeId, outputKey), this); + menu.add(paramButton); + menuBtn.show(); + } + }); + } + } + }, + __getSelectFileButton: function(portId) { const selectFileButton = new qx.ui.menu.Button(this.tr("Select File")); selectFileButton.addListener("execute", () => this.fireDataEvent("filePickerRequested", { @@ -366,26 +392,6 @@ qx.Class.define("osparc.form.renderer.PropForm", { return existingParamBtn; }, - __populateInputNodePortsMenu: function(inputNodeId, targetPortId, menu, menuBtn) { - menuBtn.exclude(); - menu.removeAll(); - - const inputNode = this.getStudy().getWorkbench().getNode(inputNodeId); - if (inputNode) { - for (const outputKey in inputNode.getOutputs()) { - osparc.utils.Ports.arePortsCompatible(inputNode, outputKey, this.getNode(), targetPortId) - .then(compatible => { - if (compatible) { - const paramButton = new qx.ui.menu.Button(inputNode.getOutput(outputKey).label); - paramButton.addListener("execute", () => this.__connectToInputNode(targetPortId, inputNodeId, outputKey), this); - menu.add(paramButton); - menuBtn.show(); - } - }); - } - } - }, - __populateExistingParamsMenu: function(targetPortId, menu, menuBtn) { menuBtn.exclude(); menu.removeAll(); @@ -410,6 +416,35 @@ qx.Class.define("osparc.form.renderer.PropForm", { }); }, + __getInputRequiredButton: function(portId) { + const node = this.getNode(); + const inputRequiredBtn = new qx.ui.menu.Button(); + inputRequiredBtn.addListener("execute", () => { + const inputsRequired = node.getInputsRequired(); + const index = inputsRequired.indexOf(5); + if (index > -1) { + inputsRequired.splice(index, 1); + } else { + inputsRequired.push(portId); + } + }, this); + node.addListener("changeInputsRequired", e => { + const inputsRequired = e.getData(); + if (inputsRequired.includes(portId)) { + inputRequiredBtn.set({ + icon: "@FontAwesome5Solid/check/8", + label: this.tr("Input Required") + }); + } else { + inputRequiredBtn.set({ + icon: null, + label: this.tr("Input not Required") + }); + } + }, this); + return inputRequiredBtn; + }, + // overridden addItems: function(items, names, title, itemOptions, headerOptions) { this.base(arguments, items, names, title, itemOptions, headerOptions); From 3c20946508d38e131a6b165878d430b1810b2c83 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Thu, 30 May 2024 17:27:52 +0200 Subject: [PATCH 04/27] fixes --- .../class/osparc/form/renderer/PropForm.js | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index ac13a259124..cf267cc9e57 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -419,17 +419,8 @@ qx.Class.define("osparc.form.renderer.PropForm", { __getInputRequiredButton: function(portId) { const node = this.getNode(); const inputRequiredBtn = new qx.ui.menu.Button(); - inputRequiredBtn.addListener("execute", () => { + const evalButton = () => { const inputsRequired = node.getInputsRequired(); - const index = inputsRequired.indexOf(5); - if (index > -1) { - inputsRequired.splice(index, 1); - } else { - inputsRequired.push(portId); - } - }, this); - node.addListener("changeInputsRequired", e => { - const inputsRequired = e.getData(); if (inputsRequired.includes(portId)) { inputRequiredBtn.set({ icon: "@FontAwesome5Solid/check/8", @@ -441,7 +432,19 @@ qx.Class.define("osparc.form.renderer.PropForm", { label: this.tr("Input not Required") }); } + } + inputRequiredBtn.addListener("execute", () => { + const inputsRequired = node.getInputsRequired(); + const index = inputsRequired.indexOf(portId); + if (index > -1) { + inputsRequired.splice(index, 1); + } else { + inputsRequired.push(portId); + } + evalButton(); }, this); + node.addListener("changeInputsRequired", () => evalButton(), this); + evalButton(); return inputRequiredBtn; }, From 7c6409882260a39c42c272bed4c491cb7507dc6b Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Thu, 30 May 2024 17:29:25 +0200 Subject: [PATCH 05/27] minor --- .../client/source/class/osparc/data/model/Node.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index 00c1406e4b8..e9a4a49704c 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -138,8 +138,7 @@ qx.Class.define("osparc.data.model.Node", { inputsRequired: { check: "Array", init: [], - event: "changeInputsRequired", - apply: "__applyInputsRequired" + event: "changeInputsRequired" }, outputs: { From f1c3ba0d18e5b387055398774d4a9d71e779da8e Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 10:44:22 +0200 Subject: [PATCH 06/27] toggleInputRequired --- .../source/class/osparc/data/model/Node.js | 17 ++++++++++++++--- .../source/class/osparc/data/model/Study.js | 17 ++++++++++------- .../class/osparc/form/renderer/PropForm.js | 15 +++------------ 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index e9a4a49704c..473f47271ad 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -137,8 +137,7 @@ qx.Class.define("osparc.data.model.Node", { inputsRequired: { check: "Array", - init: [], - event: "changeInputsRequired" + init: [] }, outputs: { @@ -233,7 +232,8 @@ qx.Class.define("osparc.data.model.Node", { "fileUploaded": "qx.event.type.Event", "showInLogger": "qx.event.type.Data", "outputListChanged": "qx.event.type.Event", - "changeInputNodes": "qx.event.type.Event" + "changeInputNodes": "qx.event.type.Event", + "changeInputsRequired": "qx.event.type.Event" }, statics: { @@ -878,6 +878,17 @@ qx.Class.define("osparc.data.model.Node", { }, // !---- Input Nodes ----- + toggleInputRequired: function(portId) { + const inputsRequired = this.getInputsRequired(); + const index = inputsRequired.indexOf(portId); + if (index > -1) { + inputsRequired.splice(index, 1); + } else { + inputsRequired.push(portId); + } + this.fireEvent("changeInputsRequired"); + }, + canNodeStart: function() { return this.isDynamic() && ["idle", "failed"].includes(this.getStatus().getInteractive()); }, diff --git a/services/static-webserver/client/source/class/osparc/data/model/Study.js b/services/static-webserver/client/source/class/osparc/data/model/Study.js index 14850a0ee0f..01e74728ad7 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Study.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Study.js @@ -608,13 +608,16 @@ qx.Class.define("osparc.data.model.Study", { }; osparc.data.Resources.fetch("studies", "patchNode", params) .then(() => { - const upKey = qx.lang.String.firstUp(fieldKey); - const setter = "set" + upKey; - this.getWorkbench()[setter](value); - // A bit hacky, but it's not sent back to the backend - this.set({ - lastChangeDate: new Date() - }); + const node = this.getWorkbench().getNode(nodeId); + if (node) { + const upKey = qx.lang.String.firstUp(fieldKey); + const setter = "set" + upKey; + node[setter](value); + // A bit hacky, but it's not sent back to the backend + this.set({ + lastChangeDate: new Date() + }); + } const studyData = this.serializeStudyData(); resolve(studyData); }) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index cf267cc9e57..bafe0c3e2de 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -423,26 +423,17 @@ qx.Class.define("osparc.form.renderer.PropForm", { const inputsRequired = node.getInputsRequired(); if (inputsRequired.includes(portId)) { inputRequiredBtn.set({ - icon: "@FontAwesome5Solid/check/8", + icon: "@FontAwesome5Regular/check-square/12", label: this.tr("Input Required") }); } else { inputRequiredBtn.set({ - icon: null, + icon: "@FontAwesome5Regular/square/12", label: this.tr("Input not Required") }); } } - inputRequiredBtn.addListener("execute", () => { - const inputsRequired = node.getInputsRequired(); - const index = inputsRequired.indexOf(portId); - if (index > -1) { - inputsRequired.splice(index, 1); - } else { - inputsRequired.push(portId); - } - evalButton(); - }, this); + inputRequiredBtn.addListener("execute", () => node.toggleInputRequired(portId), this); node.addListener("changeInputsRequired", () => evalButton(), this); evalButton(); return inputRequiredBtn; From 99a1dc3c09795c6e434185b5695b0f37fec1d4d7 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 10:48:44 +0200 Subject: [PATCH 07/27] working --- .../source/class/osparc/data/model/Node.js | 1 + .../source/class/osparc/data/model/Study.js | 30 ------------------- 2 files changed, 1 insertion(+), 30 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index 473f47271ad..3ab9d22fd92 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -516,6 +516,7 @@ qx.Class.define("osparc.data.model.Node", { } this.setOutputData(nodeData.outputs); this.addInputNodes(nodeData.inputNodes); + this.setInputsRequired(nodeData.inputsRequired); }, populateStates: function(nodeData) { diff --git a/services/static-webserver/client/source/class/osparc/data/model/Study.js b/services/static-webserver/client/source/class/osparc/data/model/Study.js index 01e74728ad7..f34ce1865ef 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Study.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Study.js @@ -595,36 +595,6 @@ qx.Class.define("osparc.data.model.Study", { return jsonObject; }, - patchNode: function(nodeId, fieldKey, value) { - return new Promise((resolve, reject) => { - const patchData = {}; - patchData[fieldKey] = value; - const params = { - url: { - "studyId": this.getUuid(), - "nodeId": nodeId - }, - data: patchData - }; - osparc.data.Resources.fetch("studies", "patchNode", params) - .then(() => { - const node = this.getWorkbench().getNode(nodeId); - if (node) { - const upKey = qx.lang.String.firstUp(fieldKey); - const setter = "set" + upKey; - node[setter](value); - // A bit hacky, but it's not sent back to the backend - this.set({ - lastChangeDate: new Date() - }); - } - const studyData = this.serializeStudyData(); - resolve(studyData); - }) - .catch(err => reject(err)); - }); - }, - patchStudy: function(fieldKey, value) { return new Promise((resolve, reject) => { const patchData = {}; From 08634ef1e45926cc150627e2fd9dab17c78ac83f Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 11:18:34 +0200 Subject: [PATCH 08/27] minor --- .../client/source/class/osparc/widget/NodeOptions.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/widget/NodeOptions.js b/services/static-webserver/client/source/class/osparc/widget/NodeOptions.js index 2aafc7f2dd6..180de5bb2cb 100644 --- a/services/static-webserver/client/source/class/osparc/widget/NodeOptions.js +++ b/services/static-webserver/client/source/class/osparc/widget/NodeOptions.js @@ -113,6 +113,8 @@ qx.Class.define("osparc.widget.NodeOptions", { const startStopButton = new osparc.node.StartStopButton(); startStopButton.setNode(node); this._add(startStopButton); + + startStopButton.getChildControl("stop-button").bind("visibility", instructions, "visibility"); } sections.forEach(section => this._add(section)); From 59cc0add8a86996cd7dc2f38a431459523d1570e Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 11:20:31 +0200 Subject: [PATCH 09/27] minor --- .../client/source/class/osparc/form/renderer/PropForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index bafe0c3e2de..68ad386f050 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -433,8 +433,8 @@ qx.Class.define("osparc.form.renderer.PropForm", { }); } } - inputRequiredBtn.addListener("execute", () => node.toggleInputRequired(portId), this); node.addListener("changeInputsRequired", () => evalButton(), this); + inputRequiredBtn.addListener("execute", () => node.toggleInputRequired(portId), this); evalButton(); return inputRequiredBtn; }, From a015cd396db2af3f2e32c473352451d07f9bf5ad Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 11:39:44 +0200 Subject: [PATCH 10/27] setRequired on label --- .../source/class/osparc/form/renderer/PropFormBase.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index f6110e38204..b3faf3075e8 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -124,8 +124,17 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { const item = items[i]; const label = this._createLabel(names[i], item); + label.setRequired = required => { + const requiredSuffix = " *"; + const oldLabel = label.getValue(); + if (required) { + label.setValue(oldLabel + requiredSuffix); + } else { + label.setValue(oldLabel.replace(requiredSuffix, "")); + } + } label.set({ - rich: false, // override, required for showing the vut off ellipses + rich: false, // override, required for showing the cut off ellipses toolTipText: names[i] }); label.setBuddy(item); From 0f3698bfa921c9db976fd57cf19312f46e911688 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 12:22:53 +0200 Subject: [PATCH 11/27] minor --- .../client/source/class/osparc/form/renderer/PropForm.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index 68ad386f050..11f136e8d3e 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -420,8 +420,7 @@ qx.Class.define("osparc.form.renderer.PropForm", { const node = this.getNode(); const inputRequiredBtn = new qx.ui.menu.Button(); const evalButton = () => { - const inputsRequired = node.getInputsRequired(); - if (inputsRequired.includes(portId)) { + if (node.getInputsRequired().includes(portId)) { inputRequiredBtn.set({ icon: "@FontAwesome5Regular/check-square/12", label: this.tr("Input Required") @@ -448,6 +447,7 @@ qx.Class.define("osparc.form.renderer.PropForm", { for (let i = 0; i < items.length; i++) { const item = items[i]; + const portId = item.key; const fieldOpts = this.__createLinkUnlinkStack(item); if (fieldOpts) { @@ -457,10 +457,10 @@ qx.Class.define("osparc.form.renderer.PropForm", { }); } - this.__createDropMechanism(item, item.key); + this.__createDropMechanism(item, portId); // Notify focus and focus out - const msgDataFn = (nodeId, portId) => this.__arePortsCompatible(nodeId, portId, this.getNode().getNodeId(), item.key); + const msgDataFn = (nodeId, pId) => this.__arePortsCompatible(nodeId, pId, this.getNode().getNodeId(), item.key); item.addListener("focus", () => { if (this.getNode()) { From a69692d1f6fdb26c7159d715d568e2dac68fb71f Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 13:23:53 +0200 Subject: [PATCH 12/27] evalRequired --- .../source/class/osparc/form/renderer/PropForm.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index 11f136e8d3e..13881577eb7 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -476,6 +476,16 @@ qx.Class.define("osparc.form.renderer.PropForm", { row++; } + const evalRequired = () => { + const inputsRequired = this.getNode().getInputsRequired(); + for (const portId in this.__ctrlLinkMap) { + const label = this._getLabelFieldChild(portId).child; + label.setRequired(inputsRequired.includes(portId)); + } + } + this.getNode().addListener("changeInputsRequired", () => evalRequired()); + evalRequired(); + // add port button const addPortButton = this.__addInputPortButton = new qx.ui.form.Button().set({ label: this.tr("Input"), From e0b7b424ce47343050a3ecd491142dc2fb3b4b68 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 13:24:20 +0200 Subject: [PATCH 13/27] minor --- .../source/class/osparc/form/renderer/PropFormBase.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index b3faf3075e8..ae1a4b5f96b 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -126,11 +126,10 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { const label = this._createLabel(names[i], item); label.setRequired = required => { const requiredSuffix = " *"; - const oldLabel = label.getValue(); + let newLabel = label.getValue(); + newLabel = newLabel.replace(requiredSuffix, ""); if (required) { - label.setValue(oldLabel + requiredSuffix); - } else { - label.setValue(oldLabel.replace(requiredSuffix, "")); + label.setValue(newLabel + requiredSuffix); } } label.set({ From 3dd9f869b8c37d9cd4ff3bcad3a4cf2b58cb6184 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 13:26:29 +0200 Subject: [PATCH 14/27] minor --- .../client/source/class/osparc/form/renderer/PropFormBase.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index ae1a4b5f96b..8d9d6962ad8 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -129,8 +129,9 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { let newLabel = label.getValue(); newLabel = newLabel.replace(requiredSuffix, ""); if (required) { - label.setValue(newLabel + requiredSuffix); + newLabel += requiredSuffix; } + label.setValue(newLabel); } label.set({ rich: false, // override, required for showing the cut off ellipses From b8fef199cb835b982ba49dec8812837ff6d3a88b Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 13:48:53 +0200 Subject: [PATCH 15/27] changeInputsRequired --- .../client/source/class/osparc/data/model/Node.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index 3ab9d22fd92..285b0448967 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -137,7 +137,8 @@ qx.Class.define("osparc.data.model.Node", { inputsRequired: { check: "Array", - init: [] + init: [], + event: "changeInputsRequired" }, outputs: { From b34534019cd2b0ca5c2b45afa36a67449985b50b Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 15:08:32 +0200 Subject: [PATCH 16/27] evalFieldRequired --- .../class/osparc/form/renderer/PropForm.js | 4 +-- .../osparc/form/renderer/PropFormBase.js | 32 +++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index 13881577eb7..5718633b938 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -477,10 +477,8 @@ qx.Class.define("osparc.form.renderer.PropForm", { } const evalRequired = () => { - const inputsRequired = this.getNode().getInputsRequired(); for (const portId in this.__ctrlLinkMap) { - const label = this._getLabelFieldChild(portId).child; - label.setRequired(inputsRequired.includes(portId)); + this.evalFieldRequired(portId); } } this.getNode().addListener("changeInputsRequired", () => evalRequired()); diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index 8d9d6962ad8..8bc64d1ea37 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -124,15 +124,6 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { const item = items[i]; const label = this._createLabel(names[i], item); - label.setRequired = required => { - const requiredSuffix = " *"; - let newLabel = label.getValue(); - newLabel = newLabel.replace(requiredSuffix, ""); - if (required) { - newLabel += requiredSuffix; - } - label.setValue(newLabel); - } label.set({ rich: false, // override, required for showing the cut off ellipses toolTipText: names[i] @@ -200,6 +191,29 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { return filteredData; }, + evalFieldRequired: function(portId) { + const label = this._getLabelFieldChild(portId).child; + const inputsRequired = this.getNode().getInputsRequired(); + + // add star (*) to the label + const requiredSuffix = " *"; + let newLabel = label.getValue(); + newLabel = newLabel.replace(requiredSuffix, ""); + if (inputsRequired.includes(portId)) { + newLabel += requiredSuffix; + } + label.setValue(newLabel); + + // add tooltip + const toolTipSuffix = "
REQUIRED"; + let newToolTip = label.getToolTipText(); + newToolTip = newToolTip.replace(toolTipSuffix, ""); + if (inputsRequired.includes(portId)) { + newToolTip += toolTipSuffix; + } + label.setToolTipText(newToolTip); + }, + getChangedXUnits: function() { const xUnits = {}; const ctrls = this._form.getControls(); From 4b12d6b3ef8e1f0812b6fb7d8b3c7333971a0d69 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 15:12:34 +0200 Subject: [PATCH 17/27] tooltip text --- .../client/source/class/osparc/form/renderer/PropFormBase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index 8bc64d1ea37..99a9d36f621 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -205,7 +205,7 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { label.setValue(newLabel); // add tooltip - const toolTipSuffix = "
REQUIRED"; + const toolTipSuffix = this.tr("
Required input: Without it, the service will not start/run."); let newToolTip = label.getToolTipText(); newToolTip = newToolTip.replace(toolTipSuffix, ""); if (inputsRequired.includes(portId)) { From ac96071579b8551e5c5600fc5dae7d791784a15e Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 15:24:09 +0200 Subject: [PATCH 18/27] minor --- .../client/source/class/osparc/data/model/Node.js | 1 + 1 file changed, 1 insertion(+) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index 285b0448967..4153d7e92b3 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -888,6 +888,7 @@ qx.Class.define("osparc.data.model.Node", { } else { inputsRequired.push(portId); } + this.setInputsRequired(inputsRequired); this.fireEvent("changeInputsRequired"); }, From 1fd1f9e37aa7fdd6a39a30cdc6d5f9ade491b561 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 15:27:25 +0200 Subject: [PATCH 19/27] deepCloneObject --- .../client/source/class/osparc/desktop/StudyEditor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/desktop/StudyEditor.js b/services/static-webserver/client/source/class/osparc/desktop/StudyEditor.js index 9ad894e029a..4b0848288d2 100644 --- a/services/static-webserver/client/source/class/osparc/desktop/StudyEditor.js +++ b/services/static-webserver/client/source/class/osparc/desktop/StudyEditor.js @@ -169,7 +169,7 @@ qx.Class.define("osparc.desktop.StudyEditor", { study.openStudy() .then(() => { - this.__lastSavedStudy = study.serialize(); + this.__lastSavedStudy = osparc.utils.Utils.deepCloneObject(study.serialize()); this.__workbenchView.setStudy(study); this.__slideshowView.setStudy(study); @@ -761,7 +761,7 @@ qx.Class.define("osparc.desktop.StudyEditor", { const newObj = this.getStudy().serialize(); return this.getStudy().updateStudy(newObj, run) .then(() => { - this.__lastSavedStudy = osparc.wrapper.JsonDiffPatch.getInstance().clone(newObj); + this.__lastSavedStudy = osparc.utils.Utils.deepCloneObject(newObj); }) .catch(error => { if ("status" in error && error.status === 409) { From 70fdd145087aedfa31c6027fe4a464e4366ba6ff Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 15:34:22 +0200 Subject: [PATCH 20/27] @elisabettai fixed text --- .../client/source/class/osparc/form/renderer/PropForm.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js index 5718633b938..07fa01cb1f2 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropForm.js @@ -418,17 +418,15 @@ qx.Class.define("osparc.form.renderer.PropForm", { __getInputRequiredButton: function(portId) { const node = this.getNode(); - const inputRequiredBtn = new qx.ui.menu.Button(); + const inputRequiredBtn = new qx.ui.menu.Button(this.tr("Required Input")); const evalButton = () => { if (node.getInputsRequired().includes(portId)) { inputRequiredBtn.set({ - icon: "@FontAwesome5Regular/check-square/12", - label: this.tr("Input Required") + icon: "@FontAwesome5Regular/check-square/12" }); } else { inputRequiredBtn.set({ - icon: "@FontAwesome5Regular/square/12", - label: this.tr("Input not Required") + icon: "@FontAwesome5Regular/square/12" }); } } From 1b433c3ba5193bb7ca27f8ed71ec70deefd58be7 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 15:54:58 +0200 Subject: [PATCH 21/27] tooltip also on field --- .../class/osparc/form/renderer/PropFormBase.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index 99a9d36f621..49616712793 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -204,14 +204,22 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { } label.setValue(newLabel); - // add tooltip - const toolTipSuffix = this.tr("
Required input: Without it, the service will not start/run."); + // add tooltip to the label + const toolTipText = this.tr("Required input: Without it, the service will not start/run."); + const toolTipSuffix = "
" + toolTipText; let newToolTip = label.getToolTipText(); newToolTip = newToolTip.replace(toolTipSuffix, ""); if (inputsRequired.includes(portId)) { newToolTip += toolTipSuffix; } label.setToolTipText(newToolTip); + + // add tooltip to the field + const field = this._getCtrlFieldChild(portId).child; + field.getContentElement().removeAttribute("title"); + if (inputsRequired.includes(portId)) { + field.getContentElement().setAttribute("title", toolTipText); + } }, getChangedXUnits: function() { From f97df41cb2e1bc0aa7242ef0adbbff6398177d01 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 15:56:05 +0200 Subject: [PATCH 22/27] minor --- .../client/source/class/osparc/form/renderer/PropFormBase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index 49616712793..72ca024a8e8 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -205,7 +205,7 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { label.setValue(newLabel); // add tooltip to the label - const toolTipText = this.tr("Required input: Without it, the service will not start/run."); + const toolTipText = this.tr("Required input: without it, the service will not start/run."); const toolTipSuffix = "
" + toolTipText; let newToolTip = label.getToolTipText(); newToolTip = newToolTip.replace(toolTipSuffix, ""); From 5beaf4e5e400b5fc578ee12321a6f0fe5586d913 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 17:50:37 +0200 Subject: [PATCH 23/27] minor --- .../client/source/class/osparc/form/PortInfoHint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/form/PortInfoHint.js b/services/static-webserver/client/source/class/osparc/form/PortInfoHint.js index 9c1bf89f9b6..70ddcf32bf0 100644 --- a/services/static-webserver/client/source/class/osparc/form/PortInfoHint.js +++ b/services/static-webserver/client/source/class/osparc/form/PortInfoHint.js @@ -38,7 +38,7 @@ qx.Class.define("osparc.form.PortInfoHint", { const color = qx.theme.manager.Color.getInstance().resolve("failed-red"); text += `

${errorMsg}`; } - this._hint.setText(text); + this.setHintText(text); this.set({ source: errorMsg ? this.self().ERROR_ICON : osparc.ui.hint.InfoHint.INFO_ICON, textColor: errorMsg ? "failed-red" : "text" From fb610211adc2632d022c5b3e8a58956c324657fc Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Fri, 31 May 2024 17:54:35 +0200 Subject: [PATCH 24/27] add "required" text to the description --- .../class/osparc/form/renderer/PropFormBase.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js index 72ca024a8e8..bda6c498aed 100644 --- a/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js +++ b/services/static-webserver/client/source/class/osparc/form/renderer/PropFormBase.js @@ -204,9 +204,8 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { } label.setValue(newLabel); - // add tooltip to the label - const toolTipText = this.tr("Required input: without it, the service will not start/run."); - const toolTipSuffix = "
" + toolTipText; + // add "required" text to the label's tooltip + const toolTipSuffix = "
" + this.tr("Required input: without it, the service will not start/run."); let newToolTip = label.getToolTipText(); newToolTip = newToolTip.replace(toolTipSuffix, ""); if (inputsRequired.includes(portId)) { @@ -214,12 +213,14 @@ qx.Class.define("osparc.form.renderer.PropFormBase", { } label.setToolTipText(newToolTip); - // add tooltip to the field - const field = this._getCtrlFieldChild(portId).child; - field.getContentElement().removeAttribute("title"); + // add "required" text to the description + const infoButton = this._getInfoFieldChild(portId).child; + let newHintText = infoButton.getHintText(); + newHintText = newHintText.replace(toolTipSuffix, ""); if (inputsRequired.includes(portId)) { - field.getContentElement().setAttribute("title", toolTipText); + newHintText += toolTipSuffix; } + infoButton.setHintText(newHintText); }, getChangedXUnits: function() { From 136a8c9deaebe51728bb1feae1af412be8fa7359 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 3 Jun 2024 09:23:41 +0200 Subject: [PATCH 25/27] more unused --- .../source/class/osparc/data/model/Workbench.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Workbench.js b/services/static-webserver/client/source/class/osparc/data/model/Workbench.js index 072913795d4..01da1153297 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Workbench.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Workbench.js @@ -676,12 +676,11 @@ qx.Class.define("osparc.data.model.Workbench", { if (node === null) { continue; } - this.__addInputOutputNodesAndEdges(node, nodeData.inputNodes, true); - this.__addInputOutputNodesAndEdges(node, nodeData.outputNodes, false); + this.__addInputOutputNodesAndEdges(node, nodeData.inputNodes); } }, - __addInputOutputNodesAndEdges: function(node, inputOutputNodeIds, isInput) { + __addInputOutputNodesAndEdges: function(node, inputOutputNodeIds) { if (inputOutputNodeIds) { inputOutputNodeIds.forEach(inputOutputNodeId => { const node1 = this.getNode(inputOutputNodeId); @@ -690,11 +689,7 @@ qx.Class.define("osparc.data.model.Workbench", { } const edge = new osparc.data.model.Edge(null, node1, node); this.addEdge(edge); - if (isInput) { - node.addInputNode(inputOutputNodeId); - } else { - node.addOutputNode(inputOutputNodeId); - } + node.addInputNode(inputOutputNodeId); }); } }, From 6712969891a10a83e0a5a08255ef0d4d9db599e9 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 3 Jun 2024 09:55:24 +0200 Subject: [PATCH 26/27] backwards compatible --- .../client/source/class/osparc/data/model/Node.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Node.js b/services/static-webserver/client/source/class/osparc/data/model/Node.js index 4153d7e92b3..488c1b54f6f 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Node.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Node.js @@ -517,7 +517,8 @@ qx.Class.define("osparc.data.model.Node", { } this.setOutputData(nodeData.outputs); this.addInputNodes(nodeData.inputNodes); - this.setInputsRequired(nodeData.inputsRequired); + // backwards compatible + this.setInputsRequired(nodeData.inputsRequired || []); }, populateStates: function(nodeData) { From 3fd620da7826e6112c8c8caa3b7d73aa41c5b08a Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 3 Jun 2024 09:57:00 +0200 Subject: [PATCH 27/27] minor --- .../client/source/class/osparc/dashboard/StudyBrowser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/StudyBrowser.js b/services/static-webserver/client/source/class/osparc/dashboard/StudyBrowser.js index 1f4260bbf29..b1a87f56194 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/StudyBrowser.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/StudyBrowser.js @@ -285,8 +285,6 @@ qx.Class.define("osparc.dashboard.StudyBrowser", { }, _reloadCards: function() { - this.__addNewStudyButtons(); - const fetching = this._loadingResourcesBtn ? this._loadingResourcesBtn.getFetching() : false; const visibility = this._loadingResourcesBtn ? this._loadingResourcesBtn.getVisibility() : "excluded"; @@ -294,6 +292,8 @@ qx.Class.define("osparc.dashboard.StudyBrowser", { const cards = this._resourcesContainer.reloadCards("studiesList"); this.__configureCards(cards); + this.__addNewStudyButtons(); + const loadMoreBtn = this.__createLoadMoreButton(); loadMoreBtn.set({ fetching,