From f437d19f23d940f725bf0abee4820e610fef840c Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 10:31:32 +0200 Subject: [PATCH 01/19] supportGroup as prop --- .../client/source/class/osparc/store/Groups.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index 9279cae9d4f1..4e692e0313ba 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -36,6 +36,11 @@ qx.Class.define("osparc.store.Groups", { init: null // this will stay null for guest users }, + supportGroup: { + check: "osparc.data.model.Group", + init: null // this will stay null for guest users + }, + organizations: { check: "Object", init: {}, From dab82bc3db687709ef05f871c50ff55e310ce9b0 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 10:59:50 +0200 Subject: [PATCH 02/19] support group --- .../source/class/osparc/data/model/Group.js | 2 +- .../source/class/osparc/product/Utils.js | 4 --- .../source/class/osparc/store/Groups.js | 26 ++++++++++++++- .../source/class/osparc/store/Products.js | 20 ++++++------ .../source/class/osparc/store/Support.js | 32 ++++++++++--------- .../class/osparc/support/Conversation.js | 4 +-- .../class/osparc/support/ConversationPage.js | 2 +- .../class/osparc/support/SupportCenter.js | 2 +- .../osparc/ui/message/FlashMessageOEC.js | 2 +- 9 files changed, 57 insertions(+), 37 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Group.js b/services/static-webserver/client/source/class/osparc/data/model/Group.js index e345265ba689..174e1081ab84 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Group.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Group.js @@ -82,7 +82,7 @@ qx.Class.define("osparc.data.model.Group", { }, groupType: { - check: ["me", "organization", "productEveryone", "everyone"], + check: ["me", "organization", "support", "productEveryone", "everyone"], nullable: false, init: null, }, diff --git a/services/static-webserver/client/source/class/osparc/product/Utils.js b/services/static-webserver/client/source/class/osparc/product/Utils.js index d6ca69d2456f..085053489af2 100644 --- a/services/static-webserver/client/source/class/osparc/product/Utils.js +++ b/services/static-webserver/client/source/class/osparc/product/Utils.js @@ -417,9 +417,5 @@ qx.Class.define("osparc.product.Utils", { groupServices: function() { return Boolean(osparc.store.Products.getInstance().getGroupedServicesUiConfig()); }, - - isSupportEnabled: function() { - return Boolean(osparc.store.Products.getInstance().getSupportGroupId()); - }, } }); diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index 4e692e0313ba..f16dfc323c99 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -38,7 +38,8 @@ qx.Class.define("osparc.store.Groups", { supportGroup: { check: "osparc.data.model.Group", - init: null // this will stay null for guest users + init: null, // this will stay null for guest users + event: "changeSupportGroup", }, organizations: { @@ -67,6 +68,15 @@ qx.Class.define("osparc.store.Groups", { .then(resp => { const everyoneGroup = this.__addToGroupsCache(resp["all"], "everyone"); const productEveryoneGroup = this.__addToGroupsCache(resp["product"], "productEveryone"); + let supportGroup = null; + if ("support" && resp["support"]) { + resp["support"]["accessRights"] = { + "read": false, + "write": false, + "delete": false, + }; + supportGroup = this.__addToGroupsCache(resp["support"], "support"); + } const groupMe = this.__addToGroupsCache(resp["me"], "me"); const orgs = {}; resp["organizations"].forEach(organization => { @@ -75,6 +85,7 @@ qx.Class.define("osparc.store.Groups", { }); this.setEveryoneGroup(everyoneGroup); this.setEveryoneProductGroup(productEveryoneGroup); + this.setSupportGroup(supportGroup); this.setOrganizations(orgs); this.setGroupMe(groupMe); const myAuthData = osparc.auth.Data.getInstance(); @@ -182,6 +193,19 @@ qx.Class.define("osparc.store.Groups", { return everyoneGroups; }, + isSupportEnabled: function() { + return Boolean(this.getSupportGroup()); + }, + + amIASupportUser: function() { + const supportGroup = this.getSupportGroup(); + if (supportGroup) { + const myOrgIds = this.getOrganizationIds().map(gId => parseInt(gId)); + return myOrgIds.includes(supportGroup.getGroupId()); + } + return false; + }, + getGroup: function(groupId) { const groups = []; diff --git a/services/static-webserver/client/source/class/osparc/store/Products.js b/services/static-webserver/client/source/class/osparc/store/Products.js index 14e759434bec..8c6f7558c2eb 100644 --- a/services/static-webserver/client/source/class/osparc/store/Products.js +++ b/services/static-webserver/client/source/class/osparc/store/Products.js @@ -27,6 +27,15 @@ qx.Class.define("osparc.store.Products", { extend: qx.core.Object, type: "singleton", + properties: { + supportEnabled: { + check: "Boolean", + nullable: false, + init: false, + event: "changeSupportEnabled", + }, + }, + members: { __uiConfig: null, @@ -125,16 +134,5 @@ qx.Class.define("osparc.store.Products", { getGroupedServicesUiConfig: function() { return this.__uiConfig["groupedServices"]; }, - - getSupportGroupId: function() { - return osparc.store.StaticInfo.getValue("supportStandardGroupId"); - }, - - amIASupportUser: function() { - const supportGroupId = this.getSupportGroupId(); - const groupsStore = osparc.store.Groups.getInstance(); - const myGroupIds = groupsStore.getOrganizationIds().map(gId => parseInt(gId)); - return (supportGroupId && myGroupIds.includes(supportGroupId)); - }, } }); diff --git a/services/static-webserver/client/source/class/osparc/store/Support.js b/services/static-webserver/client/source/class/osparc/store/Support.js index 58e71f81301d..3f2ea79dcebf 100644 --- a/services/static-webserver/client/source/class/osparc/store/Support.js +++ b/services/static-webserver/client/source/class/osparc/store/Support.js @@ -20,23 +20,25 @@ qx.Class.define("osparc.store.Support", { }, addSupportConversationsToMenu: function(menu) { - if (osparc.product.Utils.isSupportEnabled()) { - const supportCenterButton = new qx.ui.menu.Button().set({ - icon: "@FontAwesome5Regular/question-circle/16", - }); - const amISupporter = () => { - const isSupportUser = osparc.store.Products.getInstance().amIASupportUser(); - supportCenterButton.set({ - label: isSupportUser ? qx.locale.Manager.tr("Support Center") : qx.locale.Manager.tr("Support"), - }); - }; - amISupporter(); - osparc.store.Groups.getInstance().addListener("organizationsChanged", () => amISupporter()); - supportCenterButton.addListener("execute", () => { - osparc.support.SupportCenter.openWindow(); + const supportCenterButton = new qx.ui.menu.Button().set({ + icon: "@FontAwesome5Regular/question-circle/16", + visibility: "excluded", + }); + supportCenterButton.addListener("execute", () => osparc.support.SupportCenter.openWindow()); + menu.add(supportCenterButton); + + const updateSupportButton = () => { + const isSupportEnabled = osparc.store.Groups.getInstance().isSupportEnabled(); + const isSupportUser = osparc.store.Groups.getInstance().amIASupportUser(); + supportCenterButton.set({ + visibility: isSupportEnabled ? "visible" : "excluded", + label: isSupportUser ? qx.locale.Manager.tr("Support Center") : qx.locale.Manager.tr("Support"), }); - menu.add(supportCenterButton); } + + updateSupportButton(); + osparc.store.Groups.getInstance().addListener("changeSupportGroup", () => updateSupportButton()); + osparc.store.Groups.getInstance().addListener("organizationsChanged", () => updateSupportButton()); }, addQuickStartToMenu: function(menu) { diff --git a/services/static-webserver/client/source/class/osparc/support/Conversation.js b/services/static-webserver/client/source/class/osparc/support/Conversation.js index 27d9ab07d505..3ff136a1336a 100644 --- a/services/static-webserver/client/source/class/osparc/support/Conversation.js +++ b/services/static-webserver/client/source/class/osparc/support/Conversation.js @@ -190,7 +190,7 @@ qx.Class.define("osparc.support.Conversation", { .then(studyData => { let isAlreadyShared = false; const accessRights = studyData["accessRights"]; - const supportGroupId = osparc.store.Products.getInstance().getSupportGroupId(); + const supportGroupId = osparc.store.Groups.getInstance().getSupportGroup().getGroupId(); if (supportGroupId && supportGroupId in accessRights) { isAlreadyShared = true; } else { @@ -207,7 +207,7 @@ qx.Class.define("osparc.support.Conversation", { __shareProjectWithSupport: function(e) { const share = e.getData(); - const supportGroupId = osparc.store.Products.getInstance().getSupportGroupId(); + const supportGroupId = osparc.store.Groups.getInstance().getSupportGroup().getGroupId(); const projectId = this.getConversation().getContextProjectId(); osparc.store.Study.getInstance().getOne(projectId) .then(studyData => { diff --git a/services/static-webserver/client/source/class/osparc/support/ConversationPage.js b/services/static-webserver/client/source/class/osparc/support/ConversationPage.js index 685f7372ebc5..deee88900e22 100644 --- a/services/static-webserver/client/source/class/osparc/support/ConversationPage.js +++ b/services/static-webserver/client/source/class/osparc/support/ConversationPage.js @@ -147,7 +147,7 @@ qx.Class.define("osparc.support.ConversationPage", { } const extraContextLabel = this.getChildControl("conversation-extra-content"); - const amISupporter = osparc.store.Products.getInstance().amIASupportUser(); + const amISupporter = osparc.store.Groups.getInstance().amIASupportUser(); if (conversation && amISupporter) { const extraContext = conversation.getExtraContext(); if (extraContext && Object.keys(extraContext).length) { diff --git a/services/static-webserver/client/source/class/osparc/support/SupportCenter.js b/services/static-webserver/client/source/class/osparc/support/SupportCenter.js index 925b5e9cb327..12b5174ecacc 100644 --- a/services/static-webserver/client/source/class/osparc/support/SupportCenter.js +++ b/services/static-webserver/client/source/class/osparc/support/SupportCenter.js @@ -90,7 +90,7 @@ qx.Class.define("osparc.support.SupportCenter", { rich: true, font: "text-14", }); - const isSupportUser = osparc.store.Products.getInstance().amIASupportUser(); + const isSupportUser = osparc.store.Groups.getInstance().amIASupportUser(); control.set({ value: isSupportUser ? this.tr("Thanks for being here! Let's help every user feel supported.") : diff --git a/services/static-webserver/client/source/class/osparc/ui/message/FlashMessageOEC.js b/services/static-webserver/client/source/class/osparc/ui/message/FlashMessageOEC.js index a2227e9274d0..872bafb140ef 100644 --- a/services/static-webserver/client/source/class/osparc/ui/message/FlashMessageOEC.js +++ b/services/static-webserver/client/source/class/osparc/ui/message/FlashMessageOEC.js @@ -28,7 +28,7 @@ qx.Class.define("osparc.ui.message.FlashMessageOEC", { construct: function(message, duration, supportId) { this.base(arguments, message, "ERROR", duration ? duration*2 : null); - if (osparc.product.Utils.isSupportEnabled()) { + if (osparc.store.Groups.getInstance().isSupportEnabled()) { this.getChildControl("contact-support"); } else { const oecAtom = this.getChildControl("oec-atom"); From 2211521ccec60feb2536e2fae475286b70e1b155 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 11:02:11 +0200 Subject: [PATCH 03/19] not needed --- .../client/source/class/osparc/store/Products.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/store/Products.js b/services/static-webserver/client/source/class/osparc/store/Products.js index 8c6f7558c2eb..c62da0be5ee5 100644 --- a/services/static-webserver/client/source/class/osparc/store/Products.js +++ b/services/static-webserver/client/source/class/osparc/store/Products.js @@ -27,15 +27,6 @@ qx.Class.define("osparc.store.Products", { extend: qx.core.Object, type: "singleton", - properties: { - supportEnabled: { - check: "Boolean", - nullable: false, - init: false, - event: "changeSupportEnabled", - }, - }, - members: { __uiConfig: null, From 5a8906da2ba54466df51be0d4000cee8bc66fc1b Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 11:21:39 +0200 Subject: [PATCH 04/19] minor --- .../static-webserver/client/source/class/osparc/store/Groups.js | 1 + 1 file changed, 1 insertion(+) diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index f16dfc323c99..2fbecdb0cddc 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -39,6 +39,7 @@ qx.Class.define("osparc.store.Groups", { supportGroup: { check: "osparc.data.model.Group", init: null, // this will stay null for guest users + nullable: true, event: "changeSupportGroup", }, From 9ad6201e44f16ecd16fc2911ce1847850575409a Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 11:23:31 +0200 Subject: [PATCH 05/19] show icon --- .../client/source/class/osparc/dashboard/CardBase.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js index 46a05799fddc..5542348a376a 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js @@ -188,17 +188,25 @@ qx.Class.define("osparc.dashboard.CardBase", { // Icon const groupsStore = osparc.store.Groups.getInstance(); const everyoneGroupIds = groupsStore.getEveryoneGroupIds(); + const supportGroup = groupsStore.getSupportGroup(); const organizations = groupsStore.getOrganizations(); const myGroupId = groupsStore.getMyGroupId(); const organizationIds = Object.keys(organizations).map(key => parseInt(key)); if (gids.some(gid => everyoneGroupIds.includes(gid))) { + // shared with "1" or product everyone shareIcon.setSource(osparc.dashboard.CardBase.SHARED_ALL); + } else if (supportGroup && gids.includes(supportGroup.getGroupId())) { + // shared with support group, show as if it was a group + shareIcon.setSource(osparc.dashboard.CardBase.SHARED_ORGS); } else if (organizationIds.filter(value => gids.includes(value)).length) { // find intersection + // shared with at least one organization shareIcon.setSource(osparc.dashboard.CardBase.SHARED_ORGS); } else if (gids.length === 1 && gids[0] === myGroupId) { + // not shared shareIcon.setSource(osparc.dashboard.CardBase.SHARE_ICON); } else { + // shared with some users shareIcon.setSource(osparc.dashboard.CardBase.SHARED_USER); } From f712dbb04147e1eabb65103363650a7293c850a9 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 11:42:05 +0200 Subject: [PATCH 06/19] show tooltip --- .../client/source/class/osparc/dashboard/CardBase.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js index 5542348a376a..c0f98f3ff9d7 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js @@ -235,10 +235,14 @@ qx.Class.define("osparc.dashboard.CardBase", { addHintFromGids: function(icon, gids) { const groupsStore = osparc.store.Groups.getInstance(); const everyoneGroups = groupsStore.getEveryoneGroups(); + const supportGroup = groupsStore.getSupportGroup(); const organizations = groupsStore.getOrganizations(); const myGroupId = groupsStore.getMyGroupId(); const groups = everyoneGroups.slice(); + if (supportGroup) { + groups.push(supportGroup); + } groups.push(...Object.values(organizations)); const sharedGrps = []; groups.forEach(group => { @@ -275,10 +279,14 @@ qx.Class.define("osparc.dashboard.CardBase", { sharedGrpLabels.push("..."); break; } - let sharedGrpLabel = sharedGrps[i].getLabel(); - if (everyoneGroups.includes(sharedGrps[i])) { + const sharedGroup = sharedGrps[i]; + let sharedGrpLabel = sharedGroup.getLabel(); + if (everyoneGroups.includes(sharedGroup)) { sharedGrpLabel = "Public"; } + if (supportGroup && [supportGroup.getGroupId()].includes(sharedGroup.getGroupId())) { + sharedGrpLabel = supportGroup.getLabel(); + } if (!sharedGrpLabels.includes(sharedGrpLabel)) { sharedGrpLabels.push(sharedGrpLabel); } From c6ad1e51276f1f6feddbcb548363997d43e5bee6 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 11:51:10 +0200 Subject: [PATCH 07/19] supportGroup in list --- .../client/source/class/osparc/share/Collaborators.js | 5 +++++ 1 file changed, 5 insertions(+) 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 d20a1d2b8f34..e27e9cafe7d9 100644 --- a/services/static-webserver/client/source/class/osparc/share/Collaborators.js +++ b/services/static-webserver/client/source/class/osparc/share/Collaborators.js @@ -437,6 +437,7 @@ qx.Class.define("osparc.share.Collaborators", { const usersStore = osparc.store.Users.getInstance(); const groupsStore = osparc.store.Groups.getInstance(); const everyoneGroupIds = groupsStore.getEveryoneGroupIds(); + const supportGroup = groupsStore.getSupportGroup(); const allGroups = groupsStore.getAllGroups(); const showOptions = this.__canIChangePermissions(); const accessRights = this._serializedDataCopy["accessRights"]; @@ -446,6 +447,8 @@ qx.Class.define("osparc.share.Collaborators", { let collab = null; if (gid in allGroups) { collab = allGroups[gid]; + } else if (supportGroup && supportGroup.getGroupId() === gid) { + collab = supportGroup; } else { collab = await usersStore.getUser(gid); } @@ -461,6 +464,8 @@ qx.Class.define("osparc.share.Collaborators", { // organization if (everyoneGroupIds.includes(parseInt(gid))) { collaborator["thumbnail"] = "@FontAwesome5Solid/globe/32"; + } else if (supportGroup && supportGroup.getGroupId() === parseInt(gid)) { + collaborator["thumbnail"] = supportGroup.getThumbnail(); } else if (!collaborator["thumbnail"]) { collaborator["thumbnail"] = "@FontAwesome5Solid/users/26"; } From 1977626df7956f21dc30c2b1ec189ef62b253e90 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 12:23:11 +0200 Subject: [PATCH 08/19] getAllGroups --- .../client/source/class/osparc/share/Collaborators.js | 2 -- .../client/source/class/osparc/store/Groups.js | 11 +++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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 e27e9cafe7d9..394766ae2de1 100644 --- a/services/static-webserver/client/source/class/osparc/share/Collaborators.js +++ b/services/static-webserver/client/source/class/osparc/share/Collaborators.js @@ -447,8 +447,6 @@ qx.Class.define("osparc.share.Collaborators", { let collab = null; if (gid in allGroups) { collab = allGroups[gid]; - } else if (supportGroup && supportGroup.getGroupId() === gid) { - collab = supportGroup; } else { collab = await usersStore.getUser(gid); } diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index 2fbecdb0cddc..92f1aa202840 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -146,6 +146,11 @@ qx.Class.define("osparc.store.Groups", { allGroupsAndUsers[groupProductEveryone.getGroupId()] = groupProductEveryone; } + const supportGroup = this.getSupportGroup(); + if (supportGroup) { + allGroupsAndUsers[supportGroup.getGroupId()] = supportGroup; + } + const groupMe = this.getGroupMe(); allGroupsAndUsers[groupMe.getGroupId()] = groupMe; @@ -226,6 +231,12 @@ qx.Class.define("osparc.store.Groups", { groups.push(org); }); + const supportGroup = this.getSupportGroup(); + if (supportGroup && groups.findIndex(g => g.getGroupId() === supportGroup.getGroupId()) === -1) { + supportGroup["collabType"] = 1; + groups.push(supportGroup); + } + const groupProductEveryone = this.getEveryoneProductGroup(); if (groupProductEveryone) { groupProductEveryone["collabType"] = 0; From 814f65cb38638904c28c25c5c6085fcdbbf08388 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 12:24:01 +0200 Subject: [PATCH 09/19] getAllMyGroupIds --- .../client/source/class/osparc/store/Groups.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index 92f1aa202840..372673b8c536 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -174,8 +174,9 @@ qx.Class.define("osparc.store.Groups", { this.getMyGroupId(), ...this.getOrganizationIds().map(gId => parseInt(gId)) ]; - if (this.getEveryoneProductGroup()) { - allMyGroupIds.push(this.getEveryoneProductGroup().getGroupId()); + const supportGroup = this.getSupportGroup(); + if (supportGroup && !allMyGroupIds.includes(supportGroup.getGroupId())) { + allMyGroupIds.push(supportGroup.getGroupId()); } if (this.getEveryoneGroup()) { allMyGroupIds.push(this.getEveryoneGroup().getGroupId()); From a301a30999dc74350c6aab8d6ff65b191cb54ee8 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 12:26:49 +0200 Subject: [PATCH 10/19] getPotentialCollaborators --- .../client/source/class/osparc/store/Groups.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index 372673b8c536..14c3dd38ff35 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -259,6 +259,7 @@ qx.Class.define("osparc.store.Groups", { getPotentialCollaborators: function(includeMe = false, includeProductEveryone = false) { const potentialCollaborators = {}; const orgs = this.getOrganizations(); + const supportGroup = this.getSupportGroup(); const productEveryone = this.getEveryoneProductGroup(); if (includeProductEveryone && productEveryone) { @@ -278,6 +279,11 @@ qx.Class.define("osparc.store.Groups", { } }); + if (supportGroup && !(supportGroup.getGroupId() in potentialCollaborators)) { + supportGroup["collabType"] = 1; + potentialCollaborators[supportGroup.getGroupId()] = supportGroup; + } + if (includeMe) { const myGroup = this.getGroupMe(); myGroup["collabType"] = 2; From c68397b1984ceb8ad6cb82c0444271d08cb4eb22 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 12:31:37 +0200 Subject: [PATCH 11/19] minor --- .../source/class/osparc/filter/CollaboratorToggleButton.js | 6 +++--- .../source/class/osparc/filter/OrganizationsAndMembers.js | 6 +++--- .../client/source/class/osparc/utils/Icons.js | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js b/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js index 2817fd3af730..06009ff92981 100644 --- a/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js +++ b/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js @@ -29,17 +29,17 @@ qx.Class.define("osparc.filter.CollaboratorToggleButton", { let toolTipText = ""; switch (collaborator["collabType"]) { case 0: - iconPath = "@FontAwesome5Solid/globe/14"; + iconPath = osparc.dashboard.CardBase.SHARED_ALL; label = this.tr("Public"); toolTipText = this.tr("Public to all users"); break; case 1: - iconPath = "@FontAwesome5Solid/users/14"; + iconPath = osparc.dashboard.CardBase.SHARED_ORGS; label = collaborator.getLabel(); toolTipText = collaborator.getDescription(); break; case 2: { - iconPath = "@FontAwesome5Solid/user/14"; + iconPath = osparc.dashboard.CardBase.SHARED_USER; label = collaborator.getLabel(); if (collaborator.getEmail()) { toolTipText += collaborator.getEmail() + "
"; diff --git a/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js b/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js index 0ca91537931f..0981acffe69c 100644 --- a/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js +++ b/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js @@ -86,13 +86,13 @@ qx.Class.define("osparc.filter.OrganizationsAndMembers", { let iconPath = null; switch (visibleCollaborator["collabType"]) { case 0: - iconPath = "@FontAwesome5Solid/globe/14"; + iconPath = osparc.dashboard.CardBase.SHARED_ALL; break; case 1: - iconPath = "@FontAwesome5Solid/users/14"; + iconPath = osparc.dashboard.CardBase.SHARED_ORGS; break; case 2: - iconPath = "@FontAwesome5Solid/user/14"; + iconPath = osparc.dashboard.CardBase.SHARED_USER; break; } btn.setIcon(iconPath); diff --git a/services/static-webserver/client/source/class/osparc/utils/Icons.js b/services/static-webserver/client/source/class/osparc/utils/Icons.js index 6fc5b52935b0..4fb976460836 100644 --- a/services/static-webserver/client/source/class/osparc/utils/Icons.js +++ b/services/static-webserver/client/source/class/osparc/utils/Icons.js @@ -23,21 +23,21 @@ qx.Class.define("osparc.utils.Icons", { if (iconSize) { return "@FontAwesome5Solid/user/" + iconSize; } - return "@FontAwesome5Solid/user/14"; + return osparc.dashboard.CardBase.SHARED_USER; }, organization: function(iconSize) { if (iconSize) { return "@FontAwesome5Solid/users/" + iconSize; } - return "@FontAwesome5Solid/users/14"; + return osparc.dashboard.CardBase.SHARED_ORGS; }, everyone: function(iconSize) { if (iconSize) { return "@FontAwesome5Solid/globe/" + iconSize; } - return "@FontAwesome5Solid/globe/14"; + return osparc.dashboard.CardBase.SHARED_ALL; } } }); From 19bff143cca1d4dc4fd74fa9ee1d1553241fb00e Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 12:45:04 +0200 Subject: [PATCH 12/19] refactor --- .../source/class/osparc/dashboard/CardBase.js | 1 + .../dashboard/ResourceContainerManager.js | 6 ++-- .../osparc/filter/CollaboratorToggleButton.js | 6 ++-- .../osparc/filter/OrganizationsAndMembers.js | 29 +++++++++-------- .../osparc/share/NewCollaboratorsManager.js | 25 ++++++++------- .../source/class/osparc/store/Groups.js | 31 ++++++++++++------- .../osparc/ui/list/CollaboratorListItem.js | 13 +++++--- 7 files changed, 66 insertions(+), 45 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js index c0f98f3ff9d7..321d83a40c6c 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js @@ -52,6 +52,7 @@ qx.Class.define("osparc.dashboard.CardBase", { statics: { SHARE_ICON: "@FontAwesome5Solid/share-alt/13", SHARED_USER: "@FontAwesome5Solid/user/13", + SHARED_SUPPORT: "@FontAwesome5Solid/headset/13", SHARED_ORGS: "@FontAwesome5Solid/users/13", SHARED_ALL: "@FontAwesome5Solid/globe/13", PERM_READ: "@FontAwesome5Solid/eye/13", diff --git a/services/static-webserver/client/source/class/osparc/dashboard/ResourceContainerManager.js b/services/static-webserver/client/source/class/osparc/dashboard/ResourceContainerManager.js index a331425a5557..8ff84ed5bce2 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceContainerManager.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceContainerManager.js @@ -580,11 +580,11 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", { let icon = ""; if (group.getThumbnail()) { icon = group.getThumbnail(); - } else if (group["collabType"] === 0) { + } else if (group["collabType"] === osparc.store.Groups.COLLAB_TYPE.EVERYONE) { icon = "@FontAwesome5Solid/globe/24"; - } else if (group["collabType"] === 1) { + } else if (group["collabType"] === osparc.store.Groups.COLLAB_TYPE.ORGANIZATION) { icon = "@FontAwesome5Solid/users/24"; - } else if (group["collabType"] === 2) { + } else if (group["collabType"] === osparc.store.Groups.COLLAB_TYPE.USER) { icon = "@FontAwesome5Solid/user/24"; } groupContainer.set({ diff --git a/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js b/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js index 06009ff92981..cb794654dc3d 100644 --- a/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js +++ b/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js @@ -28,17 +28,17 @@ qx.Class.define("osparc.filter.CollaboratorToggleButton", { let label = null; let toolTipText = ""; switch (collaborator["collabType"]) { - case 0: + case osparc.store.Groups.COLLAB_TYPE.EVERYONE: iconPath = osparc.dashboard.CardBase.SHARED_ALL; label = this.tr("Public"); toolTipText = this.tr("Public to all users"); break; - case 1: + case osparc.store.Groups.COLLAB_TYPE.ORGANIZATION: iconPath = osparc.dashboard.CardBase.SHARED_ORGS; label = collaborator.getLabel(); toolTipText = collaborator.getDescription(); break; - case 2: { + case osparc.store.Groups.COLLAB_TYPE.USER: { iconPath = osparc.dashboard.CardBase.SHARED_USER; label = collaborator.getLabel(); if (collaborator.getEmail()) { diff --git a/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js b/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js index 0981acffe69c..67103aa43e48 100644 --- a/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js +++ b/services/static-webserver/client/source/class/osparc/filter/OrganizationsAndMembers.js @@ -64,18 +64,21 @@ qx.Class.define("osparc.filter.OrganizationsAndMembers", { const visibleCollaborators = Object.values(this.__visibleCollaborators); + // define the priority order + const collabTypeOrder = [ + osparc.store.Groups.COLLAB_TYPE.EVERYONE, + osparc.store.Groups.COLLAB_TYPE.SUPPORT, + osparc.store.Groups.COLLAB_TYPE.ORGANIZATION, + osparc.store.Groups.COLLAB_TYPE.USER + ]; // sort them first visibleCollaborators.sort((a, b) => { - if (a["collabType"] > b["collabType"]) { - return 1; - } - if (a["collabType"] < b["collabType"]) { - return -1; - } - if (a.getLabel() > b.getLabel()) { - return 1; - } - return -1; + const typeDiff = collabTypeOrder.indexOf(a["collabType"]) - collabTypeOrder.indexOf(b["collabType"]); + if (typeDiff !== 0) { + return typeDiff; + } + // fallback: sort alphabetically by label + return a.getLabel().localeCompare(b.getLabel()); }); visibleCollaborators.forEach(visibleCollaborator => { @@ -85,13 +88,13 @@ qx.Class.define("osparc.filter.OrganizationsAndMembers", { const btn = this.addOption(visibleCollaborator); let iconPath = null; switch (visibleCollaborator["collabType"]) { - case 0: + case osparc.store.Groups.COLLAB_TYPE.EVERYONE: iconPath = osparc.dashboard.CardBase.SHARED_ALL; break; - case 1: + case osparc.store.Groups.COLLAB_TYPE.ORGANIZATION: iconPath = osparc.dashboard.CardBase.SHARED_ORGS; break; - case 2: + case osparc.store.Groups.COLLAB_TYPE.USER: iconPath = osparc.dashboard.CardBase.SHARED_USER; break; } diff --git a/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js b/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js index 2a43e07c6fd9..8bf1a4bdd338 100644 --- a/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js +++ b/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js @@ -242,7 +242,7 @@ qx.Class.define("osparc.share.NewCollaboratorsManager", { const text = this.getChildControl("text-filter").getChildControl("textfield").getValue(); osparc.store.Users.getInstance().searchUsers(text) .then(users => { - users.forEach(user => user["collabType"] = 2); + users.forEach(user => user["collabType"] = osparc.store.Groups.COLLAB_TYPE.USER); this.__addPotentialCollaborators(users); }) .catch(err => osparc.FlashMessenger.logError(err)) @@ -338,18 +338,21 @@ qx.Class.define("osparc.share.NewCollaboratorsManager", { const potentialCollaborators = Object.values(this.__potentialCollaborators).concat(foundCollaborators); const potentialCollaboratorList = this.getChildControl("potential-collaborators-list"); + // define the priority order + const collabTypeOrder = [ + osparc.store.Groups.COLLAB_TYPE.EVERYONE, + osparc.store.Groups.COLLAB_TYPE.SUPPORT, + osparc.store.Groups.COLLAB_TYPE.ORGANIZATION, + osparc.store.Groups.COLLAB_TYPE.USER + ]; // sort them first potentialCollaborators.sort((a, b) => { - if (a["collabType"] > b["collabType"]) { - return 1; + const typeDiff = collabTypeOrder.indexOf(a["collabType"]) - collabTypeOrder.indexOf(b["collabType"]); + if (typeDiff !== 0) { + return typeDiff; } - if (a["collabType"] < b["collabType"]) { - return -1; - } - if (a.getLabel() > b.getLabel()) { - return 1; - } - return -1; + // fallback: sort alphabetically by label + return a.getLabel().localeCompare(b.getLabel()); }); let existingCollabs = []; @@ -383,7 +386,7 @@ qx.Class.define("osparc.share.NewCollaboratorsManager", { return; } // maybe, do not list the organizations - if (this.__showOrganizations === false && potentialCollaborator["collabType"] !== 2) { + if (this.__showOrganizations === false && potentialCollaborator["collabType"] !== osparc.store.Groups.COLLAB_TYPE.USER) { return; } potentialCollaboratorList.add(this.__collaboratorButton(potentialCollaborator)); diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index 14c3dd38ff35..c414c9c577ad 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -55,6 +55,15 @@ qx.Class.define("osparc.store.Groups", { }, }, + statics: { + COLLAB_TYPE: { + EVERYONE: "everyone", + SUPPORT: "support", + ORGANIZATION: "organization", + USER: "user", + }, + }, + members: { groupsCached: null, @@ -217,36 +226,36 @@ qx.Class.define("osparc.store.Groups", { const groups = []; const groupMe = this.getGroupMe(); - groupMe["collabType"] = 2; + groupMe["collabType"] = osparc.store.Groups.COLLAB_TYPE.USER; groups.push(groupMe); const usersStore = osparc.store.Users.getInstance(); const users = usersStore.getUsers(); users.forEach(user => { - user["collabType"] = 2; + user["collabType"] = osparc.store.Groups.COLLAB_TYPE.USER; groups.push(user); }); Object.values(this.getOrganizations()).forEach(org => { - org["collabType"] = 1; + org["collabType"] = osparc.store.Groups.COLLAB_TYPE.ORGANIZATION; groups.push(org); }); const supportGroup = this.getSupportGroup(); if (supportGroup && groups.findIndex(g => g.getGroupId() === supportGroup.getGroupId()) === -1) { - supportGroup["collabType"] = 1; + supportGroup["collabType"] = osparc.store.Groups.COLLAB_TYPE.SUPPORT; groups.push(supportGroup); } const groupProductEveryone = this.getEveryoneProductGroup(); if (groupProductEveryone) { - groupProductEveryone["collabType"] = 0; + groupProductEveryone["collabType"] = osparc.store.Groups.COLLAB_TYPE.EVERYONE; groups.push(groupProductEveryone); } const groupEveryone = this.getEveryoneGroup(); if (groupEveryone) { - groupEveryone["collabType"] = 0; + groupEveryone["collabType"] = osparc.store.Groups.COLLAB_TYPE.EVERYONE; groups.push(groupEveryone); } const idx = groups.findIndex(group => group.getGroupId() === parseInt(groupId)); @@ -263,7 +272,7 @@ qx.Class.define("osparc.store.Groups", { const productEveryone = this.getEveryoneProductGroup(); if (includeProductEveryone && productEveryone) { - productEveryone["collabType"] = 0; + productEveryone["collabType"] = osparc.store.Groups.COLLAB_TYPE.EVERYONE; potentialCollaborators[productEveryone.getGroupId()] = productEveryone; } @@ -274,26 +283,26 @@ qx.Class.define("osparc.store.Groups", { if (org.getGroupId() === productEveryone.getGroupId() && !includeProductEveryone) { return; } - org["collabType"] = 1; + org["collabType"] = osparc.store.Groups.COLLAB_TYPE.ORGANIZATION; potentialCollaborators[org.getGroupId()] = org; } }); if (supportGroup && !(supportGroup.getGroupId() in potentialCollaborators)) { - supportGroup["collabType"] = 1; + supportGroup["collabType"] = osparc.store.Groups.COLLAB_TYPE.SUPPORT; potentialCollaborators[supportGroup.getGroupId()] = supportGroup; } if (includeMe) { const myGroup = this.getGroupMe(); - myGroup["collabType"] = 2; + myGroup["collabType"] = osparc.store.Groups.COLLAB_TYPE.USER; potentialCollaborators[myGroup.getGroupId()] = myGroup; } const usersStore = osparc.store.Users.getInstance(); const users = usersStore.getUsers(); users.forEach(user => { - user["collabType"] = 2; + user["collabType"] = osparc.store.Groups.COLLAB_TYPE.USER; potentialCollaborators[user.getGroupId()] = user; }); diff --git a/services/static-webserver/client/source/class/osparc/ui/list/CollaboratorListItem.js b/services/static-webserver/client/source/class/osparc/ui/list/CollaboratorListItem.js index 5a2eb6c160bf..09ff26332b4c 100644 --- a/services/static-webserver/client/source/class/osparc/ui/list/CollaboratorListItem.js +++ b/services/static-webserver/client/source/class/osparc/ui/list/CollaboratorListItem.js @@ -20,7 +20,12 @@ qx.Class.define("osparc.ui.list.CollaboratorListItem", { properties: { collabType: { - check: [0, 1, 2], // 0:all, 1:org, 2:user + check: [ + "everyone", // osparc.store.Groups.COLLAB_TYPE.EVERYONE + "support", // osparc.store.Groups.COLLAB_TYPE.SUPPORT + "organization", // osparc.store.Groups.COLLAB_TYPE.ORGANIZATION + "user", // osparc.store.Groups.COLLAB_TYPE.USER + ], event: "changeCollabType", nullable: true }, @@ -143,13 +148,13 @@ qx.Class.define("osparc.ui.list.CollaboratorListItem", { if (value === null) { const collabType = this.getCollabType(); switch (collabType) { - case 0: + case osparc.store.Groups.COLLAB_TYPE.EVERYONE: value = "@FontAwesome5Solid/globe/28"; break; - case 1: + case osparc.store.Groups.COLLAB_TYPE.ORGANIZATION: value = "@FontAwesome5Solid/users/28"; break; - case 2: + case osparc.store.Groups.COLLAB_TYPE.USER: value = "@FontAwesome5Solid/user/28"; break; } From 962f10ac34da8652d4ff1d2fd966a434e112b886 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 12:46:42 +0200 Subject: [PATCH 13/19] working --- .../client/source/class/osparc/dashboard/CardBase.js | 2 +- .../source/class/osparc/filter/CollaboratorToggleButton.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js index 321d83a40c6c..2efaa9c2e840 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js @@ -52,7 +52,7 @@ qx.Class.define("osparc.dashboard.CardBase", { statics: { SHARE_ICON: "@FontAwesome5Solid/share-alt/13", SHARED_USER: "@FontAwesome5Solid/user/13", - SHARED_SUPPORT: "@FontAwesome5Solid/headset/13", + SHARED_SUPPORT: "@FontAwesome5Solid/question/13", SHARED_ORGS: "@FontAwesome5Solid/users/13", SHARED_ALL: "@FontAwesome5Solid/globe/13", PERM_READ: "@FontAwesome5Solid/eye/13", diff --git a/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js b/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js index cb794654dc3d..d003e056d2b9 100644 --- a/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js +++ b/services/static-webserver/client/source/class/osparc/filter/CollaboratorToggleButton.js @@ -33,6 +33,11 @@ qx.Class.define("osparc.filter.CollaboratorToggleButton", { label = this.tr("Public"); toolTipText = this.tr("Public to all users"); break; + case osparc.store.Groups.COLLAB_TYPE.SUPPORT: + iconPath = osparc.dashboard.CardBase.SHARED_SUPPORT; + label = collaborator.getLabel(); + toolTipText = collaborator.getDescription(); + break; case osparc.store.Groups.COLLAB_TYPE.ORGANIZATION: iconPath = osparc.dashboard.CardBase.SHARED_ORGS; label = collaborator.getLabel(); From 3bd6d5df67c7af5227be02daa0d088aa940b85cb Mon Sep 17 00:00:00 2001 From: Odei Maiz <33152403+odeimaiz@users.noreply.github.com> Date: Thu, 4 Sep 2025 12:47:44 +0200 Subject: [PATCH 14/19] Update services/static-webserver/client/source/class/osparc/dashboard/CardBase.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../client/source/class/osparc/dashboard/CardBase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js index 2efaa9c2e840..0e8465a9a646 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js @@ -285,7 +285,7 @@ qx.Class.define("osparc.dashboard.CardBase", { if (everyoneGroups.includes(sharedGroup)) { sharedGrpLabel = "Public"; } - if (supportGroup && [supportGroup.getGroupId()].includes(sharedGroup.getGroupId())) { + if (supportGroup && supportGroup.getGroupId() === sharedGroup.getGroupId()) { sharedGrpLabel = supportGroup.getLabel(); } if (!sharedGrpLabels.includes(sharedGrpLabel)) { From a16dda4c89378a3335ffebf2f0f06da8e439b8f2 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 12:48:35 +0200 Subject: [PATCH 15/19] minor --- .../static-webserver/client/source/class/osparc/store/Groups.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index c414c9c577ad..5f047357c338 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -79,7 +79,7 @@ qx.Class.define("osparc.store.Groups", { const everyoneGroup = this.__addToGroupsCache(resp["all"], "everyone"); const productEveryoneGroup = this.__addToGroupsCache(resp["product"], "productEveryone"); let supportGroup = null; - if ("support" && resp["support"]) { + if ("support" in resp && resp["support"]) { resp["support"]["accessRights"] = { "read": false, "write": false, From 4954a6eb501e88431a83620d84fe56c04ff6d785 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 13:03:44 +0200 Subject: [PATCH 16/19] userDataToDescription --- .../source/class/osparc/data/model/User.js | 20 ++++++++++++------- .../source/class/osparc/store/Groups.js | 3 ++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/User.js b/services/static-webserver/client/source/class/osparc/data/model/User.js index 6d571b98aba5..4b0583f2f38b 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/User.js +++ b/services/static-webserver/client/source/class/osparc/data/model/User.js @@ -44,13 +44,7 @@ qx.Class.define("osparc.data.model.User", { } else if (userData["lastName"]) { lastName = userData["lastName"]; } - let description = [firstName, lastName].join(" ").trim(); // the null values will be replaced by empty strings - if (email) { - if (description) { - description += " - " - } - description += email; - } + const description = osparc.data.model.User.userDataToDescription(firstName, lastName, email); this.set({ userId, @@ -142,6 +136,18 @@ qx.Class.define("osparc.data.model.User", { }, }, + statics: { + userDataToDescription: function(firstName, lastName, email) { + let description = [(firstName || ""), (lastName || "")].join(" ").trim(); // the null values will be replaced by empty strings + if (email) { + if (description) { + description += " - " + } + description += email; + } + } + }, + members: { createThumbnail: function(size) { return osparc.utils.Avatar.emailToThumbnail(this.getEmail(), this.getUsername(), size); diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index 5f047357c338..a2fa6f22ca0e 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -99,9 +99,10 @@ qx.Class.define("osparc.store.Groups", { this.setOrganizations(orgs); this.setGroupMe(groupMe); const myAuthData = osparc.auth.Data.getInstance(); + const description = osparc.data.model.User.userDataToDescription(myAuthData.getFirstName(), myAuthData.getLastName(), myAuthData.getEmail()); groupMe.set({ label: myAuthData.getUsername(), - description: `${myAuthData.getFirstName()} ${myAuthData.getLastName()} - ${myAuthData.getEmail()}`, + description: description, thumbnail: osparc.utils.Avatar.emailToThumbnail(myAuthData.getEmail(), myAuthData.getUsername()), }) return orgs; From aff1208060774a7bd3412e542745465916210433 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 13:04:48 +0200 Subject: [PATCH 17/19] minor --- .../client/source/class/osparc/data/model/User.js | 1 + .../static-webserver/client/source/class/osparc/store/Groups.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/User.js b/services/static-webserver/client/source/class/osparc/data/model/User.js index 4b0583f2f38b..88badee5b90e 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/User.js +++ b/services/static-webserver/client/source/class/osparc/data/model/User.js @@ -145,6 +145,7 @@ qx.Class.define("osparc.data.model.User", { } description += email; } + return description; } }, diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index a2fa6f22ca0e..dcb1b5891d06 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -102,7 +102,7 @@ qx.Class.define("osparc.store.Groups", { const description = osparc.data.model.User.userDataToDescription(myAuthData.getFirstName(), myAuthData.getLastName(), myAuthData.getEmail()); groupMe.set({ label: myAuthData.getUsername(), - description: description, + description, thumbnail: osparc.utils.Avatar.emailToThumbnail(myAuthData.getEmail(), myAuthData.getUsername()), }) return orgs; From 462cf961f6066e755be51165254e7ef62f919f77 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 13:08:22 +0200 Subject: [PATCH 18/19] minor --- .../client/source/class/osparc/store/Groups.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/store/Groups.js b/services/static-webserver/client/source/class/osparc/store/Groups.js index dcb1b5891d06..191adf1b2ad2 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -184,10 +184,6 @@ qx.Class.define("osparc.store.Groups", { this.getMyGroupId(), ...this.getOrganizationIds().map(gId => parseInt(gId)) ]; - const supportGroup = this.getSupportGroup(); - if (supportGroup && !allMyGroupIds.includes(supportGroup.getGroupId())) { - allMyGroupIds.push(supportGroup.getGroupId()); - } if (this.getEveryoneGroup()) { allMyGroupIds.push(this.getEveryoneGroup().getGroupId()); } From dc904b0cfc8d44c03730ef93c9b9af13762e007e Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 4 Sep 2025 13:45:14 +0200 Subject: [PATCH 19/19] minor fix --- .../source/class/osparc/share/NewCollaboratorsManager.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js b/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js index 8bf1a4bdd338..71acad53e4c9 100644 --- a/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js +++ b/services/static-webserver/client/source/class/osparc/share/NewCollaboratorsManager.js @@ -17,11 +17,12 @@ qx.Class.define("osparc.share.NewCollaboratorsManager", { allowMaximize: false, showMinimize: false, showMaximize: false, + resizable: true, autoDestroy: true, modal: true, width: 430, - maxHeight: 500, - clickAwayClose: true + height: 500, + clickAwayClose: true, }); this.__resourceData = resourceData; @@ -120,9 +121,7 @@ qx.Class.define("osparc.share.NewCollaboratorsManager", { break; } case "potential-collaborators-list": { - control = new qx.ui.container.Composite(new qx.ui.layout.VBox()).set({ - minHeight: 160, - }); + control = new qx.ui.container.Composite(new qx.ui.layout.VBox()); const scrollContainer = new qx.ui.container.Scroll(); scrollContainer.add(control); this.add(scrollContainer, {