diff --git a/services/static-webserver/client/source/class/osparc/component/metadata/ServicesInStudy.js b/services/static-webserver/client/source/class/osparc/component/metadata/ServicesInStudy.js index 10256261752..4aee11d2079 100644 --- a/services/static-webserver/client/source/class/osparc/component/metadata/ServicesInStudy.js +++ b/services/static-webserver/client/source/class/osparc/component/metadata/ServicesInStudy.js @@ -19,6 +19,7 @@ */ qx.Class.define("osparc.component.metadata.ServicesInStudy", { + type: "abstract", extend: qx.ui.core.Widget, /** diff --git a/services/static-webserver/client/source/class/osparc/component/share/Collaborators.js b/services/static-webserver/client/source/class/osparc/component/share/Collaborators.js index 23d0ebce960..f643e22246e 100644 --- a/services/static-webserver/client/source/class/osparc/component/share/Collaborators.js +++ b/services/static-webserver/client/source/class/osparc/component/share/Collaborators.js @@ -151,6 +151,7 @@ qx.Class.define("osparc.component.share.Collaborators", { members: { _serializedData: null, + _resourceType: null, __organizationsAndMembers: null, __collaboratorsModel: null, __collaborators: null, @@ -210,7 +211,7 @@ qx.Class.define("osparc.component.share.Collaborators", { __createAddCollaboratorSection: function() { const vBox = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)); - if (osparc.utils.Resources.isService(this._serializedData)) { + if (this._resourceType === "service") { // service vBox.setVisibility(this._canIWrite() ? "visible" : "excluded"); } else { @@ -317,7 +318,13 @@ qx.Class.define("osparc.component.share.Collaborators", { }, __getLeaveStudyButton: function() { - if (osparc.utils.Resources.isStudy(this._serializedData)) { + if ( + (this._resourceType === "study") && + // check the study is shared + (Object.keys(this._serializedData["accessRights"]).length > 1) && + // check also user is not "prjOwner". Backend will silently not let the frontend remove that user. + (this._serializedData["prjOwner"] !== osparc.auth.Data.getInstance().getEmail()) + ) { const myGid = osparc.auth.Data.getInstance().getGroupId(); const leaveButton = new qx.ui.form.Button(this.tr("Leave") + " " + osparc.product.Utils.getStudyAlias({ firstUpperCase: true @@ -363,7 +370,7 @@ qx.Class.define("osparc.component.share.Collaborators", { collaborator["name"] = osparc.utils.Utils.firstsUp(collaborator["first_name"], collaborator["last_name"]); } collaborator["accessRights"] = aceessRights[gid]; - collaborator["showOptions"] = osparc.utils.Resources.isService(this._serializedData) ? this._canIWrite() : this._canIDelete(); + collaborator["showOptions"] = (this._resourceType === "service") ? this._canIWrite() : this._canIDelete(); collaboratorsList.push(collaborator); } }); diff --git a/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsService.js b/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsService.js index 47b6db4c6de..d255d995d97 100644 --- a/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsService.js +++ b/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsService.js @@ -31,6 +31,7 @@ qx.Class.define("osparc.component.share.CollaboratorsService", { * @param serviceData {Object} Object containing the Service Data */ construct: function(serviceData) { + this._resourceType = "service"; const serializedData = osparc.utils.Utils.deepCloneObject(serviceData); const initCollabs = this.self().getEveryoneObj(); diff --git a/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsStudy.js b/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsStudy.js index bec91df50df..6273db6d755 100644 --- a/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsStudy.js +++ b/services/static-webserver/client/source/class/osparc/component/share/CollaboratorsStudy.js @@ -32,12 +32,12 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", { */ construct: function(studyData) { // this info is lost when we deepCloneStudyObject - this.__resourceType = studyData["resourceType"]; // study or template + this._resourceType = studyData["resourceType"]; // study or template const serializedData = osparc.data.model.Study.deepCloneStudyObject(studyData); const initCollabs = []; if (osparc.data.Permissions.getInstance().canDo("study.everyone.share")) { - initCollabs.push(this.self().getEveryoneObj(this.__resourceType === "study")); + initCollabs.push(this.self().getEveryoneObj(this._resourceType === "study")); } this.base(arguments, serializedData, initCollabs); @@ -126,8 +126,6 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", { }, members: { - __resourceType: null, - _canIDelete: function() { return osparc.data.model.Study.canIDelete(this._serializedData["accessRights"]); }, @@ -142,7 +140,7 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", { } gids.forEach(gid => { - this._serializedData["accessRights"][gid] = this.__resourceType === "study" ? this.self().getCollaboratorAccessRight() : this.self().getViewerAccessRight(); + this._serializedData["accessRights"][gid] = this._resourceType === "study" ? this.self().getCollaboratorAccessRight() : this.self().getViewerAccessRight(); }); const params = { url: { @@ -173,7 +171,7 @@ qx.Class.define("osparc.component.share.CollaboratorsStudy", { // it's a user, not an organization const collab = potentialCollaborators[gid]; const uid = collab["id"]; - if (this.__resourceType === "study") { + if (this._resourceType === "study") { osparc.component.notification.Notifications.postNewStudy(uid, this._serializedData["uuid"]); } else { osparc.component.notification.Notifications.postNewTemplate(uid, this._serializedData["uuid"]); diff --git a/services/static-webserver/client/source/class/osparc/ui/basic/NodeStatusUI.js b/services/static-webserver/client/source/class/osparc/ui/basic/NodeStatusUI.js index 956ade03cdb..35133dff60c 100644 --- a/services/static-webserver/client/source/class/osparc/ui/basic/NodeStatusUI.js +++ b/services/static-webserver/client/source/class/osparc/ui/basic/NodeStatusUI.js @@ -59,8 +59,7 @@ qx.Class.define("osparc.ui.basic.NodeStatusUI", { converter: state => { if (state) { this.show(); - let labelValue = osparc.utils.StatusUI.getLabelValue(state); - labelValue = labelValue.replaceAll("_", " "); + const labelValue = osparc.utils.StatusUI.getLabelValue(state); return qx.lang.String.firstUp(labelValue.toLowerCase()); } this.exclude(); 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 cd9ac7999f2..701480b0d7e 100644 --- a/services/static-webserver/client/source/class/osparc/utils/Resources.js +++ b/services/static-webserver/client/source/class/osparc/utils/Resources.js @@ -24,15 +24,15 @@ qx.Class.define("osparc.utils.Resources", { statics: { isStudy: function(studyData) { - return ((studyData["resourceType"] === "study") || ("uuid" in studyData)); + return ((studyData["resourceType"] === "study") && ("uuid" in studyData)); }, isTemplate: function(templateData) { - return ((templateData["resourceType"] === "template") || ("uuid" in templateData)); + return ((templateData["resourceType"] === "template") && ("uuid" in templateData)); }, isService: function(serviceData) { - return ((serviceData["resourceType"] === "service") || (("key" in serviceData) && ("version" in serviceData))); + return ((serviceData["resourceType"] === "service") && ("key" in serviceData) && ("version" in serviceData)); } } }); diff --git a/services/static-webserver/client/source/class/osparc/utils/StatusUI.js b/services/static-webserver/client/source/class/osparc/utils/StatusUI.js index 9425125cc6b..d14dc58ad0e 100644 --- a/services/static-webserver/client/source/class/osparc/utils/StatusUI.js +++ b/services/static-webserver/client/source/class/osparc/utils/StatusUI.js @@ -116,6 +116,8 @@ qx.Class.define("osparc.utils.StatusUI", { return qx.locale.Manager.tr("Running"); case "NOT_STARTED": return qx.locale.Manager.tr("Idle"); + case "WAITING_FOR_RESOURCES": + return qx.locale.Manager.tr("Waiting for resources"); // dynamics case "idle":