From f0178555bdf6cdfe8943952431bfd664479fdbab Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 10:53:17 +0200 Subject: [PATCH 01/12] post pending users and intro text --- .../source/class/osparc/po/UsersPending.js | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/po/UsersPending.js b/services/static-webserver/client/source/class/osparc/po/UsersPending.js index f4f0c8f5accf..b38391bc71bb 100644 --- a/services/static-webserver/client/source/class/osparc/po/UsersPending.js +++ b/services/static-webserver/client/source/class/osparc/po/UsersPending.js @@ -84,18 +84,42 @@ qx.Class.define("osparc.po.UsersPending", { }); return infoButton; }, + + extractDate: function(pendingUser) { + if (pendingUser.accountRequestStatus === "PENDING" && pendingUser.preRegistrationCreated) { + return pendingUser.preRegistrationCreated; + } else if (pendingUser.accountRequestReviewedAt) { + return pendingUser.accountRequestReviewedAt; + } + return null; + }, }, members: { _createChildControlImpl: function(id) { let control; switch (id) { + case "header-layout": + control = new qx.ui.container.Composite(new qx.ui.layout.HBox(10).set({ + alignY: "middle" + })); + this._add(control); + break; case "reload-button": control = new qx.ui.form.Button(this.tr("Reload")).set({ allowGrowX: false, }); control.addListener("execute", () => this.__reload()); - this._add(control); + this.getChildControl("header-layout").add(control); + break; + case "intro-text": + // list of pending users or approved/rejected, but not yet registered + control = new qx.ui.basic.Label(this.tr("List of pending users or approved/rejected, but not yet registered:")).set({ + font: "text-14", + textColor: "text", + allowGrowX: true + }); + this.getChildControl("header-layout").add(control); break; case "pending-users-container": control = new qx.ui.container.Scroll(); @@ -116,6 +140,7 @@ qx.Class.define("osparc.po.UsersPending", { _buildLayout: function() { this.getChildControl("reload-button"); + this.getChildControl("intro-text"); this.getChildControl("pending-users-container"); this.__addHeader(); this.__populatePendingUsersLayout(); @@ -177,15 +202,8 @@ qx.Class.define("osparc.po.UsersPending", { column: 1, }); - let date = null; - switch (pendingUser.accountRequestStatus) { - case "PENDING": - date = pendingUser.preRegistrationCreated ? osparc.utils.Utils.formatDateAndTime(new Date(pendingUser.preRegistrationCreated)) : "-"; - break; - default: - date = pendingUser.accountRequestReviewedAt ? osparc.utils.Utils.formatDateAndTime(new Date(pendingUser.accountRequestReviewedAt)) : "-"; - break; - } + const dateData = this.self().extractDate(pendingUser); + const date = dateData ? osparc.utils.Utils.formatDateAndTime(new Date(dateData)) : "-"; pendingUsersLayout.add(new qx.ui.basic.Label(date), { row, column: 2, @@ -253,18 +271,10 @@ qx.Class.define("osparc.po.UsersPending", { const pendingUsers = resps[0]; const reviewedUsers = resps[1]; const sortByDate = (a, b) => { - let dateA = new Date(0); // default to epoch if no date is available - if (a.accountRequestStatus === "PENDING" && a.preRegistrationRequestedAt) { - dateA = new Date(a.preRegistrationRequestedAt); - } else if (a.accountRequestReviewedAt) { - dateA = new Date(a.accountRequestReviewedAt); - } - let dateB = new Date(0); // default to epoch if no date is available - if (b.accountRequestStatus === "PENDING" && b.preRegistrationRequestedAt) { - dateB = new Date(b.preRegistrationRequestedAt); - } else if (b.accountRequestReviewedAt) { - dateB = new Date(b.accountRequestReviewedAt); - } + const dateDataA = this.self().extractDate(a); + const dateA = dateDataA ? new Date(dateDataA) : new Date(0); // default to epoch if no date is available + const dateDataB = this.self().extractDate(b); + const dateB = dateDataB ? new Date(dateDataB) : new Date(0); // default to epoch if no date is available return dateB - dateA; // sort by most recent first }; pendingUsers.sort(sortByDate); From d553668bd700ec44adfcd78fb625b7d0882607fa Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 10:58:50 +0200 Subject: [PATCH 02/12] larger window --- .../client/source/class/osparc/po/POCenterWindow.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js b/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js index 6d10de6212a5..1d330f784563 100644 --- a/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js +++ b/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js @@ -21,8 +21,8 @@ qx.Class.define("osparc.po.POCenterWindow", { construct: function() { this.base(arguments, "po-center", this.tr("PO Center")); - const width = 900; - const height = 600; + const width = 1000; + const height = 700; this.set({ width, height From 4718fb2bcbf00ab0f23e9c0d3773004b16adaee3 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 11:23:11 +0200 Subject: [PATCH 03/12] Route: /#/review-users --- .../client/source/class/osparc/Application.js | 49 ++++++++++++++----- .../client/source/class/osparc/po/POCenter.js | 18 ++++++- .../source/class/osparc/po/POCenterWindow.js | 8 +-- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/Application.js b/services/static-webserver/client/source/class/osparc/Application.js index 982bb9683cf4..92cf82c9eda6 100644 --- a/services/static-webserver/client/source/class/osparc/Application.js +++ b/services/static-webserver/client/source/class/osparc/Application.js @@ -138,7 +138,10 @@ qx.Class.define("osparc.Application", { osparc.auth.Manager.getInstance().validateToken() .then(() => { const studyId = urlFragment.nav[1]; - const loadAfterLogin = { studyId }; + const loadAfterLogin = { + id: "startStudy", + studyId, + }; this.__loadMainPage(loadAfterLogin); }) .catch(() => this.__loadLoginPage()); @@ -157,7 +160,10 @@ qx.Class.define("osparc.Application", { if (["anonymous", "guest"].includes(data.role.toLowerCase())) { this.__loadNodeViewerPage(studyId, viewerNodeId); } else { - const loadAfterLogin = { studyId }; + const loadAfterLogin = { + id: "startStudy", + studyId, + }; this.__loadMainPage(loadAfterLogin); } }); @@ -171,13 +177,29 @@ qx.Class.define("osparc.Application", { osparc.auth.Manager.getInstance().validateToken() .then(() => { const conversationId = urlFragment.nav[1]; - const loadAfterLogin = { conversationId }; + const loadAfterLogin = { + id: "openConversation", + conversationId, + }; this.__loadMainPage(loadAfterLogin); }) .catch(() => this.__loadLoginPage()); } break; } + case "review-users": { + // Route: /#/review-users + osparc.utils.Utils.cookie.deleteCookie("user"); + osparc.auth.Manager.getInstance().validateToken() + .then(() => { + const loadAfterLogin = { + id: "openReviewUsers", + }; + this.__loadMainPage(loadAfterLogin); + }) + .catch(() => this.__loadLoginPage()); + break; + } case "registration": { // Route: /#/registration/?invitation={token} if (urlFragment.params && urlFragment.params.invitation) { @@ -516,15 +538,20 @@ qx.Class.define("osparc.Application", { }); } - if (loadAfterLogin && loadAfterLogin["studyId"]) { - const studyId = loadAfterLogin["studyId"]; - osparc.store.Store.getInstance().setCurrentStudyId(studyId); - } + if (loadAfterLogin) { + if (loadAfterLogin["id"] === "startStudy" && loadAfterLogin["studyId"]) { + const studyId = loadAfterLogin["studyId"]; + osparc.store.Store.getInstance().setCurrentStudyId(studyId); + } - if (loadAfterLogin && loadAfterLogin["conversationId"]) { - const conversationId = loadAfterLogin["conversationId"]; - const supportCenterWindow = osparc.support.SupportCenter.openWindow(); - supportCenterWindow.openConversation(conversationId); + if (loadAfterLogin["id"] === "openConversation" && loadAfterLogin["conversationId"]) { + const conversationId = loadAfterLogin["conversationId"]; + const supportCenterWindow = osparc.support.SupportCenter.openWindow(); + supportCenterWindow.openConversation(conversationId); + } + if (loadAfterLogin["id"] === "openReviewUsers" && osparc.data.Permissions.getInstance().isProductOwner()) { + osparc.po.POCenterWindow.openWindow("reviewUsers"); + } } const loadViewerPage = () => { 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 8e68800b2f80..004b9cde985f 100644 --- a/services/static-webserver/client/source/class/osparc/po/POCenter.js +++ b/services/static-webserver/client/source/class/osparc/po/POCenter.js @@ -18,7 +18,7 @@ qx.Class.define("osparc.po.POCenter", { extend: osparc.ui.window.TabbedView, - construct: function() { + construct: function(openPage) { this.base(arguments); const miniProfile = osparc.desktop.account.MyAccount.createMiniProfileView().set({ @@ -31,6 +31,10 @@ qx.Class.define("osparc.po.POCenter", { this.__addPreRegistrationPage(); this.__addInvitationsPage(); this.__addProductPage(); + + if (openPage) { + this.__openPage(openPage); + } }, members: { @@ -45,7 +49,8 @@ qx.Class.define("osparc.po.POCenter", { const title = this.tr("Review Users"); const iconSrc = "@FontAwesome5Solid/user-plus/22"; const usersPending = new osparc.po.UsersPending(); - this.addTab(title, iconSrc, usersPending); + const page = this.addTab(title, iconSrc, usersPending); + page.pageId = "reviewUsers"; }, __addPreRegistrationPage: function() { @@ -68,5 +73,14 @@ qx.Class.define("osparc.po.POCenter", { const productInfo = new osparc.po.ProductInfo(); this.addTab(title, iconSrc, productInfo); }, + + __openPage: function(openPage) { + const tabsView = this.getChildControl("tabs-view"); + const pages = tabsView.getChildren(); + const page = pages.find(page => page.pageId && page.pageId === openPage); + if (page) { + tabsView.setSelection([page]); + } + }, } }); diff --git a/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js b/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js index 1d330f784563..dbc50bebd8c0 100644 --- a/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js +++ b/services/static-webserver/client/source/class/osparc/po/POCenterWindow.js @@ -18,7 +18,7 @@ qx.Class.define("osparc.po.POCenterWindow", { extend: osparc.ui.window.TabbedWindow, - construct: function() { + construct: function(openPage) { this.base(arguments, "po-center", this.tr("PO Center")); const width = 1000; @@ -28,13 +28,13 @@ qx.Class.define("osparc.po.POCenterWindow", { height }); - const poCenter = new osparc.po.POCenter(); + const poCenter = new osparc.po.POCenter(openPage); this._setTabbedView(poCenter); }, statics: { - openWindow: function() { - const accountWindow = new osparc.po.POCenterWindow(); + openWindow: function(openPage) { + const accountWindow = new osparc.po.POCenterWindow(openPage); accountWindow.center(); accountWindow.open(); return accountWindow; From d38b6e710736d1faf700fa295caa6952977e8e09 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 12:32:51 +0200 Subject: [PATCH 04/12] minor --- .../client/source/class/osparc/po/UsersPending.js | 1 - 1 file changed, 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/po/UsersPending.js b/services/static-webserver/client/source/class/osparc/po/UsersPending.js index b38391bc71bb..a707274dd965 100644 --- a/services/static-webserver/client/source/class/osparc/po/UsersPending.js +++ b/services/static-webserver/client/source/class/osparc/po/UsersPending.js @@ -113,7 +113,6 @@ qx.Class.define("osparc.po.UsersPending", { this.getChildControl("header-layout").add(control); break; case "intro-text": - // list of pending users or approved/rejected, but not yet registered control = new qx.ui.basic.Label(this.tr("List of pending users or approved/rejected, but not yet registered:")).set({ font: "text-14", textColor: "text", From 1f3943ec0fd8b0a5288cddfda6b335d31e3df443 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 15:53:46 +0200 Subject: [PATCH 05/12] minor fix, again --- .../client/source/class/osparc/support/ConversationPage.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 48474a66c84b..a5932ab0c3ee 100644 --- a/services/static-webserver/client/source/class/osparc/support/ConversationPage.js +++ b/services/static-webserver/client/source/class/osparc/support/ConversationPage.js @@ -68,7 +68,9 @@ qx.Class.define("osparc.support.ConversationPage", { backgroundColor: "transparent" }); control.addListener("execute", () => { - this.getConversation().setReadBy(true); + if (this.getConversation()) { + this.getConversation().setReadBy(true); + } this.setConversation(null); this.fireEvent("backToConversations"); }); From 030fd71f915c37def4b5815c5883e7b62fb6f657 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 16:12:45 +0200 Subject: [PATCH 06/12] markAsUnread --- .../client/source/class/osparc/data/model/Conversation.js | 3 ++- .../source/class/osparc/data/model/ConversationSupport.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Conversation.js b/services/static-webserver/client/source/class/osparc/data/model/Conversation.js index 52a3a3ff123b..a6341ba15781 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Conversation.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Conversation.js @@ -188,7 +188,8 @@ qx.Class.define("osparc.data.model.Conversation", { return promise .then(resp => { const messagesData = resp["data"]; - messagesData.forEach(messageData => this._addMessage(messageData)); + const markAsUnread = false; + messagesData.forEach(messageData => this._addMessage(messageData, markAsUnread)); this.__nextRequestParams = resp["_links"]["next"]; return resp; }) diff --git a/services/static-webserver/client/source/class/osparc/data/model/ConversationSupport.js b/services/static-webserver/client/source/class/osparc/data/model/ConversationSupport.js index 0004ae7fdd47..519f326875be 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/ConversationSupport.js +++ b/services/static-webserver/client/source/class/osparc/data/model/ConversationSupport.js @@ -184,12 +184,12 @@ qx.Class.define("osparc.data.model.ConversationSupport", { }, // overriden - _addMessage: function(messageData) { + _addMessage: function(messageData, markAsUnread = true) { const message = this.base(arguments, messageData); this.__evalFirstAndLastMessage(); // mark conversation as unread if the message is from the other party - if (!osparc.data.model.Message.isMyMessage(message)) { + if (markAsUnread && !osparc.data.model.Message.isMyMessage(message)) { this.setReadBy(false); } return message; From ca0856e151cbaabe419540fcce92622abef23495 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 16:17:30 +0200 Subject: [PATCH 07/12] chatbot group --- .../client/source/class/osparc/store/Groups.js | 11 +++++++++++ 1 file changed, 11 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 39cc85927a34..eb9d5a000f1d 100644 --- a/services/static-webserver/client/source/class/osparc/store/Groups.js +++ b/services/static-webserver/client/source/class/osparc/store/Groups.js @@ -43,6 +43,13 @@ qx.Class.define("osparc.store.Groups", { event: "changeSupportGroup", }, + chatbot: { + check: "osparc.data.model.Group", + init: null, + nullable: true, + event: "changeChatbot", + }, + organizations: { check: "Object", init: {}, @@ -106,6 +113,10 @@ qx.Class.define("osparc.store.Groups", { }; supportGroup = this.__addToGroupsCache(resp["support"], "support"); } + if ("chatbot" in resp && resp["chatbot"]) { + const chatbot = new osparc.data.model.Group(resp["chatbot"]); + this.setChatbot(chatbot); + } const groupMe = this.__addToGroupsCache(resp["me"], "me"); const orgs = {}; resp["organizations"].forEach(organization => { From c711edbf51dc1ac75ae3847ffc2ce8fe93d389cd Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 16:20:10 +0200 Subject: [PATCH 08/12] only add follow up message if there is no chatbot support --- .../client/source/class/osparc/support/Conversation.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 b997a217ef93..7ba1228f54ee 100644 --- a/services/static-webserver/client/source/class/osparc/support/Conversation.js +++ b/services/static-webserver/client/source/class/osparc/support/Conversation.js @@ -112,7 +112,10 @@ qx.Class.define("osparc.support.Conversation", { return this.__postMessage(content); }) .then(() => { - setTimeout(() => this.addSystemMessage("followUp"), 1000); + if (osparc.store.Groups.getInstance().getChatbot() === null) { + // only add follow up message if there is no chatbot support + setTimeout(() => this.addSystemMessage(this.self().SYSTEM_MESSAGE_TYPE.FOLLOW_UP), 1000); + } }); }); } From 657e9f986182a987ff1d7f88a906c70c67c44c7f Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 16:24:26 +0200 Subject: [PATCH 09/12] Enter --- .../static-webserver/client/source/class/osparc/po/Users.js | 2 ++ .../client/source/class/osparc/po/UsersPending.js | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/po/Users.js b/services/static-webserver/client/source/class/osparc/po/Users.js index c34850e11e54..1d15891d50ae 100644 --- a/services/static-webserver/client/source/class/osparc/po/Users.js +++ b/services/static-webserver/client/source/class/osparc/po/Users.js @@ -70,6 +70,8 @@ qx.Class.define("osparc.po.Users", { searchBtn.set({ appearance: "form-button" }); + const commandEsc = new qx.ui.command.Command("Enter"); + searchBtn.setCommand(commandEsc); searchBtn.addListener("execute", () => { if (!osparc.data.Permissions.getInstance().canDo("user.users.search", true)) { return; diff --git a/services/static-webserver/client/source/class/osparc/po/UsersPending.js b/services/static-webserver/client/source/class/osparc/po/UsersPending.js index a707274dd965..34c5022876b1 100644 --- a/services/static-webserver/client/source/class/osparc/po/UsersPending.js +++ b/services/static-webserver/client/source/class/osparc/po/UsersPending.js @@ -128,7 +128,6 @@ qx.Class.define("osparc.po.UsersPending", { break; case "pending-users-layout": { const grid = new qx.ui.layout.Grid(15, 5); - grid.setColumnMaxWidth(2, 100); // date control = new qx.ui.container.Composite(grid); this.getChildControl("pending-users-container").add(control); break; From 5c1783e204101a210eb604950078e4139ec6d53f Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 16:40:24 +0200 Subject: [PATCH 10/12] populate grid --- .../client/source/class/osparc/po/Users.js | 106 +++++++++++++++++- .../source/class/osparc/po/UsersPending.js | 2 +- 2 files changed, 101 insertions(+), 7 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/po/Users.js b/services/static-webserver/client/source/class/osparc/po/Users.js index 1d15891d50ae..8617f3eea0a3 100644 --- a/services/static-webserver/client/source/class/osparc/po/Users.js +++ b/services/static-webserver/client/source/class/osparc/po/Users.js @@ -19,6 +19,17 @@ qx.Class.define("osparc.po.Users", { extend: osparc.po.BaseView, + statics: { + GRID_POS: { + NAME: 0, + EMAIL: 1, + DATE: 2, + ACCOUNT_REQUEST_STATUS: 3, + STATUS: 4, + INFO: 5, + } + }, + members: { _createChildControlImpl: function(id) { let control; @@ -37,6 +48,12 @@ qx.Class.define("osparc.po.Users", { flex: 1 }); break; + case "found-users-layout": { + const grid = new qx.ui.layout.Grid(15, 5); + control = new qx.ui.container.Composite(grid); + this.getChildControl("found-users-container").add(control); + break; + } } return control || this.base(arguments, id); }, @@ -102,11 +119,88 @@ qx.Class.define("osparc.po.Users", { return form; }, - __populateFoundUsersLayout: function(respData) { - const foundUsersContainer = this.getChildControl("found-users-container"); - osparc.utils.Utils.removeAllChildren(foundUsersContainer); - const usersRespViewer = new osparc.ui.basic.JsonTreeWidget(respData, "users-data"); - foundUsersContainer.add(usersRespViewer); - } + __createHeaderLabel: function(value) { + const label = new qx.ui.basic.Label(value).set({ + font: "text-16", + textColor: "text" + }); + return label; + }, + + __addHeader: function() { + const foundUsersLayout = this.getChildControl("found-users-layout"); + foundUsersLayout.add(this.__createHeaderLabel(this.tr("Name")), { + row: 0, + column: this.self().GRID_POS.NAME, + }); + foundUsersLayout.add(this.__createHeaderLabel(this.tr("Email")), { + row: 0, + column: this.self().GRID_POS.EMAIL, + }); + foundUsersLayout.add(this.__createHeaderLabel(this.tr("Date")), { + row: 0, + column: this.self().GRID_POS.DATE, + }); + foundUsersLayout.add(this.__createHeaderLabel(this.tr("Request")), { + row: 0, + column: this.self().GRID_POS.ACCOUNT_REQUEST_STATUS, + }); + foundUsersLayout.add(this.__createHeaderLabel(this.tr("Status")), { + row: 0, + column: this.self().GRID_POS.STATUS, + }); + }, + + __populateFoundUsersLayout: function(foundUsers) { + const foundUsersLayout = this.getChildControl("found-users-layout"); + foundUsersLayout.removeAll(); + + this.__addHeader(); + foundUsers.forEach((user, index) => { + const row = index + 1; + + const fullNameLabel = new qx.ui.basic.Label(user.firstName + " " + user.lastName).set({ + selectable: true, + }); + foundUsersLayout.add(fullNameLabel, { + row, + column: this.self().GRID_POS.NAME, + }); + + const emailLabel = new qx.ui.basic.Label(user["email"]).set({ + selectable: true, + }); + foundUsersLayout.add(emailLabel, { + row, + column: this.self().GRID_POS.EMAIL, + }); + + const dateData = user["preRegistrationCreated"] || user["accountRequestReviewedAt"]; + const date = dateData ? osparc.utils.Utils.formatDateAndTime(new Date(dateData)) : "-"; + const dateLabel = new qx.ui.basic.Label(date); + foundUsersLayout.add(dateLabel, { + row, + column: this.self().GRID_POS.DATE, + }); + + const accountRequestStatusLabel = new qx.ui.basic.Label(user["accountRequestStatus"]); + foundUsersLayout.add(accountRequestStatusLabel, { + row, + column: this.self().GRID_POS.ACCOUNT_REQUEST_STATUS, + }); + + const statusLabel = new qx.ui.basic.Label(user["status"]); + foundUsersLayout.add(statusLabel, { + row, + column: this.self().GRID_POS.STATUS, + }); + + const infoButton = osparc.po.UsersPending.createInfoButton(user); + foundUsersLayout.add(infoButton, { + row, + column: this.self().GRID_POS.INFO, + }); + }); + }, } }); diff --git a/services/static-webserver/client/source/class/osparc/po/UsersPending.js b/services/static-webserver/client/source/class/osparc/po/UsersPending.js index 34c5022876b1..51d67129abeb 100644 --- a/services/static-webserver/client/source/class/osparc/po/UsersPending.js +++ b/services/static-webserver/client/source/class/osparc/po/UsersPending.js @@ -79,7 +79,7 @@ qx.Class.define("osparc.po.UsersPending", { const infoButton = new qx.ui.form.Button(null, "@MaterialIcons/info_outline/14"); infoButton.addListener("execute", () => { const container = new qx.ui.container.Scroll(); - container.add(new osparc.ui.basic.JsonTreeWidget(infoMetadata, "pendingUserInfo")); + container.add(new osparc.ui.basic.JsonTreeWidget(infoMetadata, "userInfo")); osparc.ui.window.Window.popUpInWindow(container, qx.locale.Manager.tr("User Info")); }); return infoButton; From d324cbeb69be011c1f3a10ed5201bc25134e51ff Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 17:22:13 +0200 Subject: [PATCH 11/12] SUPPORT_CALL --- .../source/class/osparc/data/model/Conversation.js | 7 ++++--- .../class/osparc/store/ConversationsSupport.js | 5 +++-- .../source/class/osparc/support/Conversation.js | 12 ++++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/model/Conversation.js b/services/static-webserver/client/source/class/osparc/data/model/Conversation.js index a6341ba15781..806562e5f218 100644 --- a/services/static-webserver/client/source/class/osparc/data/model/Conversation.js +++ b/services/static-webserver/client/source/class/osparc/data/model/Conversation.js @@ -82,9 +82,10 @@ qx.Class.define("osparc.data.model.Conversation", { type: { check: [ - "PROJECT_STATIC", - "PROJECT_ANNOTATION", - "SUPPORT", + "PROJECT_STATIC", // osparc.store.ConversationsProject.TYPES.PROJECT_STATIC + "PROJECT_ANNOTATION", // osparc.store.ConversationsProject.TYPES.PROJECT_ANNOTATION + "SUPPORT", // osparc.store.ConversationsSupport.TYPES.SUPPORT + "SUPPORT_CALL", // osparc.store.ConversationsSupport.TYPES.SUPPORT_CALL ], nullable: false, init: null, diff --git a/services/static-webserver/client/source/class/osparc/store/ConversationsSupport.js b/services/static-webserver/client/source/class/osparc/store/ConversationsSupport.js index ccdf406228e5..efcd9bce8307 100644 --- a/services/static-webserver/client/source/class/osparc/store/ConversationsSupport.js +++ b/services/static-webserver/client/source/class/osparc/store/ConversationsSupport.js @@ -34,6 +34,7 @@ qx.Class.define("osparc.store.ConversationsSupport", { statics: { TYPES: { SUPPORT: "SUPPORT", + SUPPORT_CALL: "SUPPORT_CALL", }, }, @@ -82,14 +83,14 @@ qx.Class.define("osparc.store.ConversationsSupport", { }); }, - postConversation: function(extraContext = {}) { + postConversation: function(extraContext = {}, type = osparc.store.ConversationsSupport.TYPES.SUPPORT) { const url = window.location.href; extraContext["deployment"] = url; extraContext["product"] = osparc.product.Utils.getProductName(); const params = { data: { name: "null", - type: osparc.store.ConversationsSupport.TYPES.SUPPORT, + type, extraContext, } }; 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 7ba1228f54ee..2230d201e411 100644 --- a/services/static-webserver/client/source/class/osparc/support/Conversation.js +++ b/services/static-webserver/client/source/class/osparc/support/Conversation.js @@ -82,10 +82,11 @@ qx.Class.define("osparc.support.Conversation", { if (currentStudy) { extraContext["projectId"] = currentStudy.getUuid(); } - osparc.store.ConversationsSupport.getInstance().postConversation(extraContext) + // clone first, it will be reset when setting the conversation + const bookACallInfo = this.__bookACallInfo ? Object.assign({}, this.__bookACallInfo) : null; + const type = bookACallInfo ? osparc.store.ConversationsSupport.TYPES.SUPPORT_CALL : osparc.store.ConversationsSupport.TYPES.SUPPORT; + osparc.store.ConversationsSupport.getInstance().postConversation(extraContext, type) .then(data => { - // clone first, it will be reset when setting the conversation - const bookACallInfo = this.__bookACallInfo ? Object.assign({}, this.__bookACallInfo) : null; const newConversation = new osparc.data.model.ConversationSupport(data); this.setConversation(newConversation); let prePostMessagePromise = new Promise((resolve) => resolve()); @@ -112,7 +113,10 @@ qx.Class.define("osparc.support.Conversation", { return this.__postMessage(content); }) .then(() => { - if (osparc.store.Groups.getInstance().getChatbot() === null) { + if ( + osparc.store.Groups.getInstance().getChatbot() === null || + type === osparc.store.ConversationsSupport.TYPES.SUPPORT_CALL + ) { // only add follow up message if there is no chatbot support setTimeout(() => this.addSystemMessage(this.self().SYSTEM_MESSAGE_TYPE.FOLLOW_UP), 1000); } From 3b6db0b32f27faecd812154ea4c1ab51a42d8efb Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 21 Oct 2025 18:07:45 +0200 Subject: [PATCH 12/12] minor --- .../source/class/osparc/navigation/StudyTitleWOptions.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/navigation/StudyTitleWOptions.js b/services/static-webserver/client/source/class/osparc/navigation/StudyTitleWOptions.js index 363fc816d2e1..e98ee5877e7b 100644 --- a/services/static-webserver/client/source/class/osparc/navigation/StudyTitleWOptions.js +++ b/services/static-webserver/client/source/class/osparc/navigation/StudyTitleWOptions.js @@ -166,7 +166,10 @@ qx.Class.define("osparc.navigation.StudyTitleWOptions", { study.bind("name", editTitle, "value"); const shareButton = this.getChildControl("study-menu-share"); - shareButton.setEnabled(osparc.data.model.Study.canIWrite(study.getAccessRights())); + shareButton.set({ + visibility: osparc.auth.Data.getInstance().isGuest() ? "excluded" : "visible", + enabled: osparc.data.model.Study.canIWrite(study.getAccessRights()), + }); const reloadButton = this.getChildControl("study-menu-reload"); study.getUi().bind("mode", reloadButton, "visibility", {