diff --git a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js index bd95c4276b4e..7db4d4468918 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js @@ -526,6 +526,9 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { if (!osparc.desktop.credits.Utils.areWalletsEnabled()) { return; } + if (osparc.utils.Resources.isStudyLike(this.__resourceData) && !osparc.data.model.Study.canIWrite(this.__resourceData["accessRights"])) { + return; + } const resourceData = this.__resourceData; if (osparc.utils.Resources.isStudy(resourceData)) { @@ -634,6 +637,13 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { }, __addPermissionsPage: function() { + if (osparc.utils.Resources.isStudyLike(this.__resourceData) && !osparc.data.model.Study.canIWrite(this.__resourceData["accessRights"])) { + return; + } + if (osparc.utils.Resources.isService(this.__resourceData) && !osparc.data.model.Service.canIWrite(this.__resourceData["accessRights"])) { + return; + } + const id = "Permissions"; const title = this.tr("Sharing"); const iconSrc = "@FontAwesome5Solid/share-alt/22"; @@ -695,7 +705,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { let classifiers = null; if ( (osparc.utils.Resources.isStudy(resourceData) || osparc.utils.Resources.isTemplate(resourceData)) && osparc.data.model.Study.canIWrite(resourceData["accessRights"]) || - osparc.utils.Resources.isService(resourceData) && osparc.service.Utils.canIWrite(resourceData["accessRights"]) + osparc.utils.Resources.isService(resourceData) && osparc.data.model.Service.canIWrite(resourceData["accessRights"]) ) { classifiers = new osparc.metadata.ClassifiersEditor(resourceData); classifiers.addListener("updateClassifiers", e => { @@ -779,6 +789,9 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { if (osparc.utils.Resources.isService(resourceData)) { return; } + if (osparc.utils.Resources.isStudyLike(this.__resourceData) && !osparc.data.model.Study.canIWrite(this.__resourceData["accessRights"])) { + return; + } const id = "ServicesUpdate"; const title = this.tr("Services Updates"); @@ -813,6 +826,9 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { ) { return; } + if (osparc.utils.Resources.isStudyLike(this.__resourceData) && !osparc.data.model.Study.canIWrite(this.__resourceData["accessRights"])) { + return; + } const id = "ServicesBootOptions"; const title = this.tr("Boot Options"); diff --git a/services/static-webserver/client/source/class/osparc/data/model/Service.js b/services/static-webserver/client/source/class/osparc/data/model/Service.js index a9b5382c63d0..b278e3e253fa 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Service.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Service.js @@ -161,4 +161,13 @@ qx.Class.define("osparc.data.model.Service", { nullable: false }, }, + + statics: { + canIWrite: function(serviceAccessRights) { + const groupsStore = osparc.store.Groups.getInstance(); + const orgIDs = groupsStore.getOrganizationIds(); + orgIDs.push(groupsStore.getMyGroupId()); + return osparc.share.CollaboratorsService.canGroupsWrite(serviceAccessRights, orgIDs); + }, + }, }); diff --git a/services/static-webserver/client/source/class/osparc/editor/HtmlEditor.js b/services/static-webserver/client/source/class/osparc/editor/HtmlEditor.js deleted file mode 100644 index 21b09135f4dc..000000000000 --- a/services/static-webserver/client/source/class/osparc/editor/HtmlEditor.js +++ /dev/null @@ -1,61 +0,0 @@ -/* ************************************************************************ - - osparc - the simcore frontend - - https://osparc.io - - Copyright: - 2023 IT'IS Foundation, https://itis.swiss - - License: - MIT: https://opensource.org/licenses/MIT - - Authors: - * Odei Maiz (odeimaiz) - -************************************************************************ */ - -qx.Class.define("osparc.editor.HtmlEditor", { - extend: osparc.editor.TextEditor, - - /** - * @param initText {String} Initialization text - */ - construct: function(initText = "") { - this.base(arguments, initText); - - this.getChildControl("preview-html"); - this.getChildControl("subtitle").set({ - value: this.tr("Supports HTML"), - url: "https://en.wikipedia.org/wiki/HTML", - }); - }, - - members: { - _createChildControlImpl: function(id) { - let control; - switch (id) { - case "preview-html": { - control = new qx.ui.embed.Html(); - const textArea = this.getChildControl("text-area"); - textArea.bind("value", control, "html"); - const tabs = this.getChildControl("tabs"); - const previewPage = new qx.ui.tabview.Page(this.tr("Preview")).set({ - layout: new qx.ui.layout.VBox(5) - }); - previewPage.getChildControl("button").getChildControl("label").set({ - font: "text-13" - }); - const scrollContainer = new qx.ui.container.Scroll(); - scrollContainer.add(control); - previewPage.add(scrollContainer, { - flex: 1 - }); - tabs.add(previewPage); - break; - } - } - return control || this.base(arguments, id); - } - } -}); diff --git a/services/static-webserver/client/source/class/osparc/info/ServiceLarge.js b/services/static-webserver/client/source/class/osparc/info/ServiceLarge.js index a9515e3a79ff..988b9f1b805b 100644 --- a/services/static-webserver/client/source/class/osparc/info/ServiceLarge.js +++ b/services/static-webserver/client/source/class/osparc/info/ServiceLarge.js @@ -110,7 +110,7 @@ qx.Class.define("osparc.info.ServiceLarge", { if ( this.getService()["descriptionUi"] && - !osparc.service.Utils.canIWrite(this.getService()["accessRights"]) + !osparc.data.model.Service.canIWrite(this.getService()["accessRights"]) ) { // In case of service instance, show also the copy Id buttons too const buttonsLayout = new qx.ui.container.Composite(new qx.ui.layout.HBox(10)); @@ -177,7 +177,7 @@ qx.Class.define("osparc.info.ServiceLarge", { alignY: "middle" })); layout.add(view); - if (osparc.service.Utils.canIWrite(this.getService()["accessRights"])) { + if (osparc.data.model.Service.canIWrite(this.getService()["accessRights"])) { const editBtn = osparc.utils.Utils.getEditButton(); editBtn.addListener("execute", () => cb.call(this), this); layout.add(editBtn); @@ -221,7 +221,7 @@ qx.Class.define("osparc.info.ServiceLarge", { }, __infoElements: function() { - const canIWrite = osparc.service.Utils.canIWrite(this.getService()["accessRights"]); + const canIWrite = osparc.data.model.Service.canIWrite(this.getService()["accessRights"]); const infoLayout = { "THUMBNAIL": { diff --git a/services/static-webserver/client/source/class/osparc/metadata/QualityEditor.js b/services/static-webserver/client/source/class/osparc/metadata/QualityEditor.js index 7573f82c110c..7ac8377433eb 100644 --- a/services/static-webserver/client/source/class/osparc/metadata/QualityEditor.js +++ b/services/static-webserver/client/source/class/osparc/metadata/QualityEditor.js @@ -484,7 +484,7 @@ qx.Class.define("osparc.metadata.QualityEditor", { const myGid = osparc.auth.Data.getInstance().getGroupId(); if (myGid) { if (osparc.utils.Resources.isService(this.__resourceData)) { - return osparc.service.Utils.canIWrite(this.__resourceData["accessRights"]); + return osparc.data.model.Service.canIWrite(this.__resourceData["accessRights"]); } return osparc.data.model.Study.canIWrite(this.__resourceData["accessRights"]); } diff --git a/services/static-webserver/client/source/class/osparc/po/MessageTemplates.js b/services/static-webserver/client/source/class/osparc/po/MessageTemplates.js deleted file mode 100644 index 6a6bdadd674b..000000000000 --- a/services/static-webserver/client/source/class/osparc/po/MessageTemplates.js +++ /dev/null @@ -1,99 +0,0 @@ -/* ************************************************************************ - - osparc - the simcore frontend - - https://osparc.io - - Copyright: - 2023 IT'IS Foundation, https://itis.swiss - - License: - MIT: https://opensource.org/licenses/MIT - - Authors: - * Odei Maiz (odeimaiz) - -************************************************************************ */ - -qx.Class.define("osparc.po.MessageTemplates", { - extend: osparc.po.BaseView, - - members: { - __messageTemplates: null, - - _buildLayout: function() { - const params = { - url: { - productName: osparc.product.Utils.getProductName() - } - }; - osparc.data.Resources.fetch("productMetadata", "get", params) - .then(respData => { - this.__messageTemplates = respData["templates"]; - this.__buildLayout(); - }); - }, - - __buildLayout: function() { - this._removeAll(); - - const templatesSB = new qx.ui.form.SelectBox().set({ - allowGrowX: false - }); - this._add(templatesSB); - - const htmlViewer = this.__htmlViewer = new osparc.editor.HtmlEditor().set({ - minHeight: 400 - }); - htmlViewer.getChildControl("cancel-button").exclude(); - const container = new qx.ui.container.Scroll(); - container.add(htmlViewer, { - flex: 1 - }); - this._add(container, { - flex: 1 - }); - - templatesSB.addListener("changeSelection", e => { - const selection = e.getData(); - if (selection.length) { - const templateId = selection[0].getModel(); - this.__populateMessage(templateId); - } - }, this); - this.__messageTemplates.forEach(template => { - const lItem = new qx.ui.form.ListItem(template.id, null, template.id); - templatesSB.add(lItem); - }); - htmlViewer.addListener("textChanged", e => { - const newTemplate = e.getData(); - const templateId = templatesSB.getSelection()[0].getModel(); - this.__saveTemplate(templateId, newTemplate); - }); - }, - - __populateMessage: function(templateId) { - const found = this.__messageTemplates.find(template => template.id === templateId); - if (found) { - this.__htmlViewer.setText(found.content); - } - }, - - __saveTemplate: function(templateId, newTemplate) { - const productName = osparc.product.Utils.getProductName(); - const params = { - url: { - productName, - templateId - }, - data: { - content: newTemplate - } - }; - osparc.data.Resources.fetch("productMetadata", "updateEmailTemplate", params) - .then(() => osparc.FlashMessenger.logAs(this.tr("Template updated"), "INFO")) - .catch(err => osparc.FlashMessenger.logError(err)) - .finally(() => this._buildLayout()); - } - } -}); diff --git a/services/static-webserver/client/source/class/osparc/po/POCenter.js b/services/static-webserver/client/source/class/osparc/po/POCenter.js index b000864caa50..8e68800b2f80 100644 --- a/services/static-webserver/client/source/class/osparc/po/POCenter.js +++ b/services/static-webserver/client/source/class/osparc/po/POCenter.js @@ -31,7 +31,6 @@ qx.Class.define("osparc.po.POCenter", { this.__addPreRegistrationPage(); this.__addInvitationsPage(); this.__addProductPage(); - this.__addMsgTemplatesPage(); }, members: { @@ -69,12 +68,5 @@ qx.Class.define("osparc.po.POCenter", { const productInfo = new osparc.po.ProductInfo(); this.addTab(title, iconSrc, productInfo); }, - - __addMsgTemplatesPage: function() { - const title = this.tr("Message Templates"); - const iconSrc = "@FontAwesome5Solid/envelope-open/22"; - const productInfo = new osparc.po.MessageTemplates(); - this.addTab(title, iconSrc, productInfo); - } } }); diff --git a/services/static-webserver/client/source/class/osparc/service/Utils.js b/services/static-webserver/client/source/class/osparc/service/Utils.js index 8b750cf49d1b..dfa512fdf51d 100644 --- a/services/static-webserver/client/source/class/osparc/service/Utils.js +++ b/services/static-webserver/client/source/class/osparc/service/Utils.js @@ -140,13 +140,6 @@ qx.Class.define("osparc.service.Utils", { return ""; }, - canIWrite: function(serviceAccessRights) { - const groupsStore = osparc.store.Groups.getInstance(); - const orgIDs = groupsStore.getOrganizationIds(); - orgIDs.push(groupsStore.getMyGroupId()); - return osparc.share.CollaboratorsService.canGroupsWrite(serviceAccessRights, orgIDs); - }, - DEPRECATED_SERVICE_TEXT: qx.locale.Manager.tr("Service deprecated"), DEPRECATED_DYNAMIC_INSTRUCTIONS: qx.locale.Manager.tr("Please go back to the dashboard and Update the Service or download its data and upload it to an updated version"), DEPRECATED_COMPUTATIONAL_INSTRUCTIONS: qx.locale.Manager.tr("Please instantiate an updated version"), diff --git a/services/static-webserver/client/source/class/osparc/share/Collaborators.js b/services/static-webserver/client/source/class/osparc/share/Collaborators.js index 394766ae2de1..5686938e7588 100644 --- a/services/static-webserver/client/source/class/osparc/share/Collaborators.js +++ b/services/static-webserver/client/source/class/osparc/share/Collaborators.js @@ -202,7 +202,7 @@ qx.Class.define("osparc.share.Collaborators", { canIShare = osparc.data.model.Function.canIWrite(this._serializedDataCopy["accessRights"]); break; case "service": - canIShare = osparc.service.Utils.canIWrite(this._serializedDataCopy["accessRights"]); + canIShare = osparc.data.model.Service.canIWrite(this._serializedDataCopy["accessRights"]); break; case "workspace": canIShare = osparc.share.CollaboratorsWorkspace.canIDelete(this._serializedDataCopy["myAccessRights"]); @@ -231,7 +231,7 @@ qx.Class.define("osparc.share.Collaborators", { fullOptions = osparc.data.model.Function.canIWrite(this._serializedDataCopy["accessRights"]); break; case "service": - fullOptions = osparc.service.Utils.canIWrite(this._serializedDataCopy["accessRights"]); + fullOptions = osparc.data.model.Service.canIWrite(this._serializedDataCopy["accessRights"]); break; case "workspace": fullOptions = osparc.share.CollaboratorsWorkspace.canIDelete(this._serializedDataCopy["myAccessRights"]); diff --git a/services/static-webserver/client/source/class/osparc/utils/Resources.js b/services/static-webserver/client/source/class/osparc/utils/Resources.js index fb6a33663d0a..42e6a7aa13a1 100644 --- a/services/static-webserver/client/source/class/osparc/utils/Resources.js +++ b/services/static-webserver/client/source/class/osparc/utils/Resources.js @@ -39,6 +39,10 @@ qx.Class.define("osparc.utils.Resources", { return ((hypertoolData["resourceType"] === "hypertool") && ("uuid" in hypertoolData)); }, + isStudyLike: function(resourceData) { + return this.isStudy(resourceData) || this.isTemplate(resourceData) || this.isTutorial(resourceData) || this.isHypertool(resourceData); + }, + isFunction: function(functionData) { return ((functionData["resourceType"] === "function") && ("uuid" in functionData)); },