From d2f2cec2380a88bd5e50c035aa89bd4150c1ef1a Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Fri, 13 Jun 2025 15:40:57 +0200 Subject: [PATCH 01/14] request access button --- .../class/osparc/dashboard/ResourceDetails.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 5193dafb8251..5a808ad604b4 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js @@ -147,7 +147,18 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const toolbar = this.self().createToolbar(); page.addToHeader(toolbar); - if (["study", "template"].includes(this.__resourceData["resourceType"])) { + if (["study", "template", "tutorial"].includes(resourceData["resourceType"])) { + const cantReadServices = osparc.study.Utils.getCantReadServices(resourceData["services"]); + if (cantReadServices.length) { + const requestAccessButton = new qx.ui.form.Button(this.tr("Request Access")); + requestAccessButton.addListener("execute", () => { + console.log("cantReadServices", cantReadServices); + }); + toolbar.add(requestAccessButton); + } + } + + if (this.__resourceData["resourceType"] === "study") { const payDebtButton = new qx.ui.form.Button(this.tr("Credits required")); page.payDebtButton = payDebtButton; osparc.dashboard.resources.pages.BasePage.decorateHeaderButton(payDebtButton); From ccfe5ad48da0da05020fd5264161834296e163de Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Fri, 13 Jun 2025 15:43:51 +0200 Subject: [PATCH 02/14] __addToolbarButtons --- .../class/osparc/dashboard/ResourceDetails.js | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) 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 5a808ad604b4..5b037f69b995 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js @@ -141,7 +141,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { __classifiersPage: null, __qualityPage: null, - __addOpenButton: function(page) { + __addToolbarButtons: function(page) { const resourceData = this.__resourceData; const toolbar = this.self().createToolbar(); @@ -416,7 +416,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Overview"); const iconSrc = "@FontAwesome5Solid/info/22"; const page = this.__infoPage = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const lazyLoadContent = () => { const resourceData = this.__resourceData; @@ -457,7 +457,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Billing Settings"); const iconSrc = "@FontAwesome5Solid/cogs/22"; const page = this.__billingSettings = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); if (resourceData["resourceType"] === "study") { const canBeOpened = osparc.study.Utils.canShowBillingOptions(resourceData); @@ -484,7 +484,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Tiers"); const iconSrc = "@FontAwesome5Solid/server/22"; const page = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const lazyLoadContent = () => { const pricingUnitsList = new osparc.service.PricingUnitsList(resourceData); @@ -513,7 +513,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Pipeline View"); const iconSrc = "@FontAwesome5Solid/eye/22"; const page = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const studyData = this.__resourceData; const enabled = osparc.study.Utils.canShowPreview(studyData); @@ -539,7 +539,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Conversations"); const iconSrc = "@FontAwesome5Solid/comments/22"; const page = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const lazyLoadContent = () => { const conversations = new osparc.study.Conversations(resourceData); @@ -555,7 +555,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Sharing"); const iconSrc = "@FontAwesome5Solid/share-alt/22"; const page = this.__permissionsPage = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const lazyLoadContent = () => { const resourceData = this.__resourceData; @@ -598,7 +598,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Classifiers"); const iconSrc = "@FontAwesome5Solid/search/22"; const page = this.__classifiersPage = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const lazyLoadContent = () => { const resourceData = this.__resourceData; @@ -636,7 +636,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Quality"); const iconSrc = "@FontAwesome5Solid/star-half/22"; const page = this.__qualityPage = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const lazyLoadContent = () => { const qualityEditor = new osparc.metadata.QualityEditor(resourceData); @@ -666,7 +666,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Tags"); const iconSrc = "@FontAwesome5Solid/tags/22"; const page = this.__tagsPage = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const lazyLoadContent = () => { const tagManager = new osparc.form.tag.TagManager(resourceData); @@ -692,7 +692,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Services Updates"); const iconSrc = "@MaterialIcons/update/24"; const page = this.__servicesUpdatePage = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const studyData = this.__resourceData; const enabled = osparc.study.Utils.canShowServiceUpdates(studyData); @@ -724,7 +724,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const title = this.tr("Boot Options"); const iconSrc = "@FontAwesome5Solid/play-circle/22"; const page = new osparc.dashboard.resources.pages.BasePage(title, iconSrc, id); - this.__addOpenButton(page); + this.__addToolbarButtons(page); const studyData = this.__resourceData; const enabled = osparc.study.Utils.canShowServiceBootOptions(studyData); From 9c3f33b106f51296850292488778529a7269151d Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Fri, 13 Jun 2025 15:45:07 +0200 Subject: [PATCH 03/14] minor --- .../client/source/class/osparc/dashboard/ResourceDetails.js | 1 + 1 file changed, 1 insertion(+) 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 5b037f69b995..46dcc4356c67 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js @@ -151,6 +151,7 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { const cantReadServices = osparc.study.Utils.getCantReadServices(resourceData["services"]); if (cantReadServices.length) { const requestAccessButton = new qx.ui.form.Button(this.tr("Request Access")); + osparc.dashboard.resources.pages.BasePage.decorateHeaderButton(requestAccessButton); requestAccessButton.addListener("execute", () => { console.log("cantReadServices", cantReadServices); }); From 10a55a69aa3f4826bfd7b81820fadbe6bab1ecef Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 10:14:56 +0200 Subject: [PATCH 04/14] refactor --- .../class/osparc/share/CollaboratorsStudy.js | 27 +--------------- .../class/osparc/share/ShareePermissions.js | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/share/CollaboratorsStudy.js b/services/static-webserver/client/source/class/osparc/share/CollaboratorsStudy.js index a595b47320df..124d275ae76c 100644 --- a/services/static-webserver/client/source/class/osparc/share/CollaboratorsStudy.js +++ b/services/static-webserver/client/source/class/osparc/share/CollaboratorsStudy.js @@ -235,32 +235,7 @@ qx.Class.define("osparc.share.CollaboratorsStudy", { if (gids.length === 0) { return; } - - const promises = []; - gids.forEach(gid => { - const params = { - url: { - "studyId": this._serializedDataCopy["uuid"], - "gid": gid - } - }; - promises.push(osparc.data.Resources.fetch("studies", "checkShareePermissions", params)); - }); - Promise.all(promises) - .then(values => { - const noAccessible = values.filter(value => value["accessible"] === false); - if (noAccessible.length) { - const shareePermissions = new osparc.share.ShareePermissions(noAccessible); - const win = osparc.ui.window.Window.popUpInWindow(shareePermissions, this.tr("Sharee permissions"), 500, 500, "@FontAwesome5Solid/exclamation-triangle/14").set({ - clickAwayClose: false, - resizable: true, - showClose: true - }); - win.getChildControl("icon").set({ - textColor: "warning-yellow" - }); - } - }); + osparc.share.ShareePermissions.checkShareePermissions(this._serializedDataCopy["uuid"], gids); } } }); diff --git a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js index bc8c92cbe991..f2a8670099c7 100644 --- a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js +++ b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js @@ -16,6 +16,37 @@ qx.Class.define("osparc.share.ShareePermissions", { this.__populateLayout(shareesData); }, + statics: { + checkShareePermissions: function(studyId, gids) { + const promises = []; + gids.forEach(gid => { + const params = { + url: { + studyId, + gid, + } + }; + promises.push(osparc.data.Resources.fetch("studies", "checkShareePermissions", params)); + }); + Promise.all(promises) + .then(values => { + const noAccessible = values.filter(value => value["accessible"] === false); + if (noAccessible.length) { + const shareePermissions = new osparc.share.ShareePermissions(noAccessible); + const caption = qx.locale.Manager.tr("Sharee permissions"); + const win = osparc.ui.window.Window.popUpInWindow(shareePermissions, caption, 500, 500, "@FontAwesome5Solid/exclamation-triangle/14").set({ + clickAwayClose: false, + resizable: true, + showClose: true + }); + win.getChildControl("icon").set({ + textColor: "warning-yellow" + }); + } + }); + }, + }, + members: { __populateLayout: function(shareesData) { const text = this.tr("The following users/groups will not be able to open the shared study, because they don't have access to some services. Please contact the service owner(s) to give permission."); From 5b5b49d45bd8924875a0d4d0bf7e90d9cd778a49 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 11:03:38 +0200 Subject: [PATCH 05/14] comment --- .../client/source/class/osparc/share/ShareePermissions.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js index f2a8670099c7..6803a3afdf16 100644 --- a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js +++ b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js @@ -5,6 +5,12 @@ * Authors: Odei Maiz (odeimaiz) */ +/** + * Data structure for showing sharee permissions + * - accessible: boolean + * - gid: string // sharee group id + * - inaccessible_services: Array of objects with keys "key" and "version" + */ qx.Class.define("osparc.share.ShareePermissions", { extend: qx.ui.core.Widget, From 066fc4ffdb6da66ee4cb0a9016b357cf0fd32be3 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 11:11:47 +0200 Subject: [PATCH 06/14] renamings --- .../source/class/osparc/share/ShareePermissions.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js index 6803a3afdf16..f35e5d0b2f7b 100644 --- a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js +++ b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js @@ -6,7 +6,7 @@ */ /** - * Data structure for showing sharee permissions + * Data structure for showing sharee permissions. Array of objects with the following keys * - accessible: boolean * - gid: string // sharee group id * - inaccessible_services: Array of objects with keys "key" and "version" @@ -35,10 +35,10 @@ qx.Class.define("osparc.share.ShareePermissions", { promises.push(osparc.data.Resources.fetch("studies", "checkShareePermissions", params)); }); Promise.all(promises) - .then(values => { - const noAccessible = values.filter(value => value["accessible"] === false); - if (noAccessible.length) { - const shareePermissions = new osparc.share.ShareePermissions(noAccessible); + .then(shareesData => { + const inaccessibleShareesData = shareesData.filter(value => value["accessible"] === false); + if (inaccessibleShareesData.length) { + const shareePermissions = new osparc.share.ShareePermissions(inaccessibleShareesData); const caption = qx.locale.Manager.tr("Sharee permissions"); const win = osparc.ui.window.Window.popUpInWindow(shareePermissions, caption, 500, 500, "@FontAwesome5Solid/exclamation-triangle/14").set({ clickAwayClose: false, @@ -70,7 +70,7 @@ qx.Class.define("osparc.share.ShareePermissions", { this._add(layout); for (let i=0; i Date: Mon, 16 Jun 2025 11:14:38 +0200 Subject: [PATCH 07/14] minor --- .../client/source/class/osparc/share/ShareePermissions.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js index f35e5d0b2f7b..2a2a2bf9909a 100644 --- a/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js +++ b/services/static-webserver/client/source/class/osparc/share/ShareePermissions.js @@ -84,7 +84,9 @@ qx.Class.define("osparc.share.ShareePermissions", { }); const infoButton = new qx.ui.form.Button(null, "@MaterialIcons/info_outline/14"); infoButton.setAppearance("strong-button"); - const label = new qx.ui.basic.Label(); + const label = new qx.ui.basic.Label().set({ + alignY: "middle", + }); hBox.add(infoButton); hBox.add(label); osparc.store.Services.getService(inaccessibleService.key, inaccessibleService.version) From f39e4bf3dc1193eb3ca4dd38215bc00f54edd4c7 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 11:45:25 +0200 Subject: [PATCH 08/14] RequestServiceAccess --- .../class/osparc/dashboard/ResourceDetails.js | 4 +- .../osparc/share/RequestServiceAccess.js | 75 +++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js 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 46dcc4356c67..53beac877a41 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js @@ -150,10 +150,10 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { if (["study", "template", "tutorial"].includes(resourceData["resourceType"])) { const cantReadServices = osparc.study.Utils.getCantReadServices(resourceData["services"]); if (cantReadServices.length) { - const requestAccessButton = new qx.ui.form.Button(this.tr("Request Access")); + const requestAccessButton = new qx.ui.form.Button(this.tr("Request Apps Access")); osparc.dashboard.resources.pages.BasePage.decorateHeaderButton(requestAccessButton); requestAccessButton.addListener("execute", () => { - console.log("cantReadServices", cantReadServices); + osparc.share.RequestServiceAccess.openRequestAccess(cantReadServices); }); toolbar.add(requestAccessButton); } diff --git a/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js new file mode 100644 index 000000000000..ca0ec1ad120d --- /dev/null +++ b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js @@ -0,0 +1,75 @@ +/* + * oSPARC - The SIMCORE frontend - https://osparc.io + * Copyright: 2025 IT'IS Foundation - https://itis.swiss + * License: MIT - https://opensource.org/licenses/MIT + * Authors: Odei Maiz (odeimaiz) + */ + +qx.Class.define("osparc.share.RequestServiceAccess", { + extend: qx.ui.core.Widget, + + construct: function(cantReadServicesData) { + this.base(arguments); + + this._setLayout(new qx.ui.layout.VBox(25)); + + this.__populateLayout(cantReadServicesData); + }, + + statics: { + openRequestAccess: function(cantReadServicesData) { + const requestServiceAccess = new osparc.share.RequestServiceAccess(cantReadServicesData); + const caption = qx.locale.Manager.tr("Request Apps Access"); + osparc.ui.window.Window.popUpInWindow(requestServiceAccess, caption, 500, 500).set({ + clickAwayClose: false, + resizable: true, + showClose: true + }); + } + }, + + members: { + __populateLayout: function(cantReadServicesData) { + const text = this.tr("In order to open the Project, the following users/groups need to give you access to some apps. Please contact the app owner(s):"); + this._add(new qx.ui.basic.Label().set({ + value: text, + font: "text-14", + rich: true, + wrap: true + })); + + const grid = new qx.ui.layout.Grid(20, 10); + grid.setColumnAlign(0, "center", "middle"); + grid.setColumnAlign(1, "center", "middle"); + const layout = new qx.ui.container.Composite(grid); + this._add(layout); + + // Header + layout.add(new qx.ui.basic.Label(this.tr("Owner"), { + row: idx+1, + column: 0 + })); + layout.add(new qx.ui.basic.Label(this.tr("App"), { + row: idx+1, + column: 1 + })); + + cantReadServicesData.forEach((cantReadServiceData, idx) => { + const group = osparc.store.Groups.getInstance().getGroup(cantReadServiceData["owner"]); + if (group) { + layout.add(new qx.ui.basic.Label(group.getLabel()), { + row: idx+1, + column: 0 + }); + const appLabel = new qx.ui.basic.Label().set({ + value: `${cantReadServiceData["key"]} : ${osparc.service.Utils.extractVersionDisplay(cantReadServiceData["release"])}`, + }); + layout.add(appLabel, { + row: i, + column: 1 + }); + } + }); + } + } +}); From e4154d5e24ff8f1a0a5951f1bc2b6c429b3f706a Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 11:55:55 +0200 Subject: [PATCH 09/14] display grid info --- .../osparc/share/RequestServiceAccess.js | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js index ca0ec1ad120d..5aef3051b4e2 100644 --- a/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js +++ b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js @@ -45,28 +45,47 @@ qx.Class.define("osparc.share.RequestServiceAccess", { this._add(layout); // Header - layout.add(new qx.ui.basic.Label(this.tr("Owner"), { - row: idx+1, + layout.add(new qx.ui.basic.Label(this.tr("Owner")), { + row: 0, column: 0 - })); - layout.add(new qx.ui.basic.Label(this.tr("App"), { - row: idx+1, + }); + layout.add(new qx.ui.basic.Label(this.tr("Email")), { + row: 0, column: 1 - })); + }); + layout.add(new qx.ui.basic.Label(this.tr("App")), { + row: 0, + column: 2 + }); + // Populate the grid with the cantReadServicesData cantReadServicesData.forEach((cantReadServiceData, idx) => { const group = osparc.store.Groups.getInstance().getGroup(cantReadServiceData["owner"]); if (group) { - layout.add(new qx.ui.basic.Label(group.getLabel()), { + const username = new qx.ui.basic.Label(group.getLabel()).set({ + rich: true, + selectable: true, + }); + layout.add(username, { row: idx+1, column: 0 }); + const email = new qx.ui.basic.Label(group.getEmail()).set({ + rich: true, + selectable: true, + }); + layout.add(email, { + row: idx+1, + column: 1 + }); const appLabel = new qx.ui.basic.Label().set({ - value: `${cantReadServiceData["key"]} : ${osparc.service.Utils.extractVersionDisplay(cantReadServiceData["release"])}`, + value: `${cantReadServiceData["key"]}:${osparc.service.Utils.extractVersionDisplay(cantReadServiceData["release"])}`, + rich: true, + selectable: true, }); layout.add(appLabel, { - row: i, - column: 1 + row: idx+1, + column: 2 }); } }); From 963f4958e720dacf9773117c8bd4f7152de3dfe8 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 13:15:52 +0200 Subject: [PATCH 10/14] aesthetics --- .../source/class/osparc/share/RequestServiceAccess.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js index 5aef3051b4e2..80fdd1a33d21 100644 --- a/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js +++ b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js @@ -20,7 +20,7 @@ qx.Class.define("osparc.share.RequestServiceAccess", { openRequestAccess: function(cantReadServicesData) { const requestServiceAccess = new osparc.share.RequestServiceAccess(cantReadServicesData); const caption = qx.locale.Manager.tr("Request Apps Access"); - osparc.ui.window.Window.popUpInWindow(requestServiceAccess, caption, 500, 500).set({ + osparc.ui.window.Window.popUpInWindow(requestServiceAccess, caption, 600, 400).set({ clickAwayClose: false, resizable: true, showClose: true @@ -30,7 +30,7 @@ qx.Class.define("osparc.share.RequestServiceAccess", { members: { __populateLayout: function(cantReadServicesData) { - const text = this.tr("In order to open the Project, the following users/groups need to give you access to some apps. Please contact the app owner(s):"); + const text = this.tr("In order to open the Project, the following users/groups need to give you access to some apps. Please contact the app owner:"); this._add(new qx.ui.basic.Label().set({ value: text, font: "text-14", @@ -39,8 +39,6 @@ qx.Class.define("osparc.share.RequestServiceAccess", { })); const grid = new qx.ui.layout.Grid(20, 10); - grid.setColumnAlign(0, "center", "middle"); - grid.setColumnAlign(1, "center", "middle"); const layout = new qx.ui.container.Composite(grid); this._add(layout); From 7509abe1c4cd8d06afb1cda675c687b972b7acc6 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 13:16:41 +0200 Subject: [PATCH 11/14] minor --- .../client/source/class/osparc/share/RequestServiceAccess.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js index 80fdd1a33d21..7aa5718d6636 100644 --- a/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js +++ b/services/static-webserver/client/source/class/osparc/share/RequestServiceAccess.js @@ -30,7 +30,7 @@ qx.Class.define("osparc.share.RequestServiceAccess", { members: { __populateLayout: function(cantReadServicesData) { - const text = this.tr("In order to open the Project, the following users/groups need to give you access to some apps. Please contact the app owner:"); + const text = this.tr("In order to open the project, the following users/groups need to give you access to some apps. Please contact the app owner:"); this._add(new qx.ui.basic.Label().set({ value: text, font: "text-14", From f436674f0bf2b381042b5433219c6c8c24be6c3e Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 13:18:01 +0200 Subject: [PATCH 12/14] minor --- .../client/source/class/osparc/dashboard/ResourceDetails.js | 4 ++++ 1 file changed, 4 insertions(+) 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 53beac877a41..57017ac23067 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js @@ -152,6 +152,10 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { if (cantReadServices.length) { const requestAccessButton = new qx.ui.form.Button(this.tr("Request Apps Access")); osparc.dashboard.resources.pages.BasePage.decorateHeaderButton(requestAccessButton); + requestAccessButton.set({ + minWidth: 170, + maxWidth: 170, + }); requestAccessButton.addListener("execute", () => { osparc.share.RequestServiceAccess.openRequestAccess(cantReadServices); }); From d15d7ee5ac48f2e3a39f9542330f34025c95eb9b Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 13:37:58 +0200 Subject: [PATCH 13/14] minor --- .../client/source/class/osparc/study/Utils.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/study/Utils.js b/services/static-webserver/client/source/class/osparc/study/Utils.js index 51953df991db..5fc844844ba3 100644 --- a/services/static-webserver/client/source/class/osparc/study/Utils.js +++ b/services/static-webserver/client/source/class/osparc/study/Utils.js @@ -442,7 +442,7 @@ qx.Class.define("osparc.study.Utils", { if (studyData["ui"]["mode"] === "pipeline") { resolve(osparc.data.model.StudyUI.PIPELINE_ICON); } else { - const defaultIcon = osparc.dashboard.CardBase.PRODUCT_ICON; + const productIcon = osparc.dashboard.CardBase.PRODUCT_ICON; // the was to guess the TI type is to check the boot mode of the ti-postpro in the pipeline const wbServices = this.self().getNonFrontendNodes(studyData); if (wbServices.length === 1) { @@ -452,8 +452,9 @@ qx.Class.define("osparc.study.Utils", { if (serviceMetadata && serviceMetadata["icon"]) { resolve(serviceMetadata["icon"]); } - resolve(defaultIcon); - }); + resolve(productIcon); + }) + .catch(() => resolve(productIcon)); } else { resolve(osparc.data.model.StudyUI.PIPELINE_ICON); } From 691a6dac0f37fe3da31f79dab20ee65eb8d3b751 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Mon, 16 Jun 2025 13:39:10 +0200 Subject: [PATCH 14/14] minor --- .../static-webserver/client/source/class/osparc/study/Utils.js | 1 - 1 file changed, 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/study/Utils.js b/services/static-webserver/client/source/class/osparc/study/Utils.js index 5fc844844ba3..70df0d502e22 100644 --- a/services/static-webserver/client/source/class/osparc/study/Utils.js +++ b/services/static-webserver/client/source/class/osparc/study/Utils.js @@ -443,7 +443,6 @@ qx.Class.define("osparc.study.Utils", { resolve(osparc.data.model.StudyUI.PIPELINE_ICON); } else { const productIcon = osparc.dashboard.CardBase.PRODUCT_ICON; - // the was to guess the TI type is to check the boot mode of the ti-postpro in the pipeline const wbServices = this.self().getNonFrontendNodes(studyData); if (wbServices.length === 1) { const wbService = wbServices[0];