From 7ac723a6fe81cec1d5611c3fe15fdbe691fe3247 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 13:18:19 +0100 Subject: [PATCH 01/16] Tester Center --- .../source/class/osparc/data/Permissions.js | 1 - .../osparc/desktop/preferences/Preferences.js | 10 --- .../desktop/preferences/pages/TesterPage.js | 88 ------------------- .../class/osparc/navigation/UserMenu.js | 8 ++ .../source/class/osparc/tester/Statics.js | 72 +++++++++++++++ .../class/osparc/tester/TesterCenter.js | 40 +++++++++ .../class/osparc/tester/TesterCenterWindow.js | 43 +++++++++ 7 files changed, 163 insertions(+), 99 deletions(-) delete mode 100644 services/static-webserver/client/source/class/osparc/desktop/preferences/pages/TesterPage.js create mode 100644 services/static-webserver/client/source/class/osparc/tester/Statics.js create mode 100644 services/static-webserver/client/source/class/osparc/tester/TesterCenter.js create mode 100644 services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js diff --git a/services/static-webserver/client/source/class/osparc/data/Permissions.js b/services/static-webserver/client/source/class/osparc/data/Permissions.js index 44d004711601..5c53b4da76d4 100644 --- a/services/static-webserver/client/source/class/osparc/data/Permissions.js +++ b/services/static-webserver/client/source/class/osparc/data/Permissions.js @@ -138,7 +138,6 @@ qx.Class.define("osparc.data.Permissions", { "study.nodestree.uuid.read", "study.filestree.uuid.read", "study.logger.debug.read", - "statics.read" ], "product_owner": [ "user.invitation.generate", diff --git a/services/static-webserver/client/source/class/osparc/desktop/preferences/Preferences.js b/services/static-webserver/client/source/class/osparc/desktop/preferences/Preferences.js index 876019a22c6f..d04b96ceeea6 100644 --- a/services/static-webserver/client/source/class/osparc/desktop/preferences/Preferences.js +++ b/services/static-webserver/client/source/class/osparc/desktop/preferences/Preferences.js @@ -32,9 +32,6 @@ qx.Class.define("osparc.desktop.preferences.Preferences", { if (osparc.product.Utils.showClusters()) { this.__addClustersPage(); } - if (osparc.data.Permissions.getInstance().canDo("statics.read")) { - this.__addTestersPage(); - } }, members: { @@ -85,12 +82,5 @@ qx.Class.define("osparc.desktop.preferences.Preferences", { .catch(err => console.error(err)); } }, - - __addTestersPage: function() { - const title = this.tr("Tester"); - const iconSrc = "@FontAwesome5Solid/user-md/24"; - const testerPage = new osparc.desktop.preferences.pages.TesterPage(); - this.addTab(title, iconSrc, testerPage); - } } }); diff --git a/services/static-webserver/client/source/class/osparc/desktop/preferences/pages/TesterPage.js b/services/static-webserver/client/source/class/osparc/desktop/preferences/pages/TesterPage.js deleted file mode 100644 index c886995c7441..000000000000 --- a/services/static-webserver/client/source/class/osparc/desktop/preferences/pages/TesterPage.js +++ /dev/null @@ -1,88 +0,0 @@ -/* ************************************************************************ - - osparc - the simcore frontend - - https://osparc.io - - Copyright: - 2020 IT'IS Foundation, https://itis.swiss - - License: - MIT: https://opensource.org/licenses/MIT - - Authors: - * Odei Maiz (odeimaiz) - -************************************************************************ */ - -/** - * Tester Misc in preferences dialog - */ - -qx.Class.define("osparc.desktop.preferences.pages.TesterPage", { - extend: qx.ui.core.Widget, - - construct: function() { - this.base(arguments); - - this._setLayout(new qx.ui.layout.VBox(15)); - - const container = new qx.ui.container.Composite(new qx.ui.layout.VBox(10)); - - const statics = this.__createStaticsLayout(); - container.add(statics); - - const localStorage = this.__createLocalStorageLayout(); - container.add(localStorage); - - const scroll = new qx.ui.container.Scroll(container); - this._add(scroll, { - flex: 1 - }); - }, - - members: { - __createStaticsLayout: function() { - // layout - const box = osparc.ui.window.TabbedView.createSectionBox(this.tr("Statics")); - - const label = osparc.ui.window.TabbedView.createHelpLabel(this.tr( - "This is a list of the 'statics' resources" - )); - box.add(label); - - const statics = osparc.store.Store.getInstance().get("statics"); - const form = new qx.ui.form.Form(); - for (let [key, value] of Object.entries(statics)) { - const textField = new qx.ui.form.TextField().set({ - value: typeof value === "object" ? JSON.stringify(value) : value.toString(), - readOnly: true - }); - form.add(textField, key, null, key); - } - box.add(new qx.ui.form.renderer.Single(form)); - - return box; - }, - - __createLocalStorageLayout: function() { - // layout - const box = osparc.ui.window.TabbedView.createSectionBox(this.tr("Local Storage")); - - const items = { - ...window.localStorage - }; - const form = new qx.ui.form.Form(); - for (let [key, value] of Object.entries(items)) { - const textField = new qx.ui.form.TextField().set({ - value: typeof value === "object" ? JSON.stringify(value) : value.toString(), - readOnly: true - }); - form.add(textField, key, null, key); - } - box.add(new qx.ui.form.renderer.Single(form)); - - return box; - } - } -}); diff --git a/services/static-webserver/client/source/class/osparc/navigation/UserMenu.js b/services/static-webserver/client/source/class/osparc/navigation/UserMenu.js index b18f0a4d7b37..8a736ef7d40e 100644 --- a/services/static-webserver/client/source/class/osparc/navigation/UserMenu.js +++ b/services/static-webserver/client/source/class/osparc/navigation/UserMenu.js @@ -61,6 +61,11 @@ qx.Class.define("osparc.navigation.UserMenu", { control.addListener("execute", () => osparc.po.POCenterWindow.openWindow(), this); this.add(control); break; + case "tester-center": + control = new qx.ui.menu.Button(this.tr("Tester Center")); + control.addListener("execute", () => osparc.tester.TesterCenterWindow.openWindow(), this); + this.add(control); + break; case "billing-center": control = new qx.ui.menu.Button(this.tr("Billing Center")); osparc.utils.Utils.setIdToWidget(control, "userMenuBillingCenterBtn"); @@ -157,6 +162,9 @@ qx.Class.define("osparc.navigation.UserMenu", { if (osparc.data.Permissions.getInstance().isProductOwner()) { this.getChildControl("po-center"); } + if (osparc.data.Permissions.getInstance().isTester()) { + this.getChildControl("tester-center"); + } if (osparc.desktop.credits.Utils.areWalletsEnabled()) { this.getChildControl("billing-center"); } diff --git a/services/static-webserver/client/source/class/osparc/tester/Statics.js b/services/static-webserver/client/source/class/osparc/tester/Statics.js new file mode 100644 index 000000000000..8caf4152db48 --- /dev/null +++ b/services/static-webserver/client/source/class/osparc/tester/Statics.js @@ -0,0 +1,72 @@ +/* ************************************************************************ + + osparc - the simcore frontend + + https://osparc.io + + Copyright: + 2024 IT'IS Foundation, https://itis.swiss + + License: + MIT: https://opensource.org/licenses/MIT + + Authors: + * Odei Maiz (odeimaiz) + +************************************************************************ */ + +qx.Class.define("osparc.tester.Statics", { + extend: osparc.po.BaseView, + + members: { + _createChildControlImpl: function(id) { + let control; + switch (id) { + case "statics-container": + control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Statics")); + this._add(control); + break; + case "statics-content": { + const statics = osparc.store.Store.getInstance().get("statics"); + const form = new qx.ui.form.Form(); + for (let [key, value] of Object.entries(statics)) { + const textField = new qx.ui.form.TextField().set({ + value: typeof value === "object" ? JSON.stringify(value) : value.toString(), + readOnly: true + }); + form.add(textField, key, null, key); + } + control = new qx.ui.form.renderer.Single(form); + this.getChildControl("statics-container").add(control); + break; + } + case "local-storage-container": + control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Statics")); + this._add(control); + break; + case "local-storage-content": { + const items = { + ...window.localStorage + }; + const form = new qx.ui.form.Form(); + for (let [key, value] of Object.entries(items)) { + const textField = new qx.ui.form.TextField().set({ + value: typeof value === "object" ? JSON.stringify(value) : value.toString(), + readOnly: true + }); + form.add(textField, key, null, key); + } + control = new qx.ui.form.renderer.Single(form); + this.getChildControl("local-storage-container").add(control); + break; + } + } + return control || this.base(arguments, id); + }, + + _buildLayout: function() { + this.getChildControl("statics-content"); + this.getChildControl("local-storage-content"); + }, + } +}); diff --git a/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js b/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js new file mode 100644 index 000000000000..53767bdecd3d --- /dev/null +++ b/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js @@ -0,0 +1,40 @@ +/* ************************************************************************ + + osparc - the simcore frontend + + https://osparc.io + + Copyright: + 2024 IT'IS Foundation, https://itis.swiss + + License: + MIT: https://opensource.org/licenses/MIT + + Authors: + * Odei Maiz (odeimaiz) + +************************************************************************ */ + +qx.Class.define("osparc.tester.TesterCenter", { + extend: osparc.ui.window.TabbedView, + + construct: function() { + this.base(arguments); + + const miniProfile = osparc.desktop.account.MyAccount.createMiniProfileView().set({ + paddingRight: 10 + }); + this.addWidgetOnTopOfTheTabs(miniProfile); + + this.__addStaticsPage(); + }, + + members: { + __addStaticsPage: function() { + const title = this.tr("Maintenance"); + const iconSrc = "@FontAwesome5Solid/wrench/22"; + const maintenance = new osparc.tester.Statics(); + this.addTab(title, iconSrc, maintenance); + }, + } +}); diff --git a/services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js b/services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js new file mode 100644 index 000000000000..5cb76533ac70 --- /dev/null +++ b/services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js @@ -0,0 +1,43 @@ +/* ************************************************************************ + + osparc - the simcore frontend + + https://osparc.io + + Copyright: + 2024 IT'IS Foundation, https://itis.swiss + + License: + MIT: https://opensource.org/licenses/MIT + + Authors: + * Odei Maiz (odeimaiz) + +************************************************************************ */ + +qx.Class.define("osparc.tester.TesterCenterWindow", { + extend: osparc.ui.window.TabbedWindow, + + construct: function() { + this.base(arguments, "tester-center", this.tr("Tester Center")); + + const width = 800; + const height = 600; + this.set({ + width: width, + height: height, + }); + + const testerCenter = new osparc.tester.TesterCenter(); + this._setTabbedView(testerCenter); + }, + + statics: { + openWindow: function() { + const accountWindow = new osparc.tester.TesterCenterWindow(); + accountWindow.center(); + accountWindow.open(); + return accountWindow; + } + } +}); From 98db22646d4d9715624ca85287f70fbaf3970c0b Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 13:23:34 +0100 Subject: [PATCH 02/16] minor --- .../client/source/class/osparc/tester/Statics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/tester/Statics.js b/services/static-webserver/client/source/class/osparc/tester/Statics.js index 8caf4152db48..61ef43893544 100644 --- a/services/static-webserver/client/source/class/osparc/tester/Statics.js +++ b/services/static-webserver/client/source/class/osparc/tester/Statics.js @@ -41,7 +41,7 @@ qx.Class.define("osparc.tester.Statics", { break; } case "local-storage-container": - control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Statics")); + control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Local Storage")); this._add(control); break; case "local-storage-content": { From b7382e8994a003bed9d34fa33fedbeda8c3d5ca9 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 13:32:16 +0100 Subject: [PATCH 03/16] WebSocketMessages --- .../class/osparc/tester/TesterCenter.js | 10 ++- .../class/osparc/tester/WebSocketMessages.js | 72 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js diff --git a/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js b/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js index 53767bdecd3d..87e4839c7ca1 100644 --- a/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js +++ b/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js @@ -27,14 +27,22 @@ qx.Class.define("osparc.tester.TesterCenter", { this.addWidgetOnTopOfTheTabs(miniProfile); this.__addStaticsPage(); + this.__addSocketMessagesPage(); }, members: { __addStaticsPage: function() { - const title = this.tr("Maintenance"); + const title = this.tr("Statics"); const iconSrc = "@FontAwesome5Solid/wrench/22"; const maintenance = new osparc.tester.Statics(); this.addTab(title, iconSrc, maintenance); }, + + __addSocketMessagesPage: function() { + const title = this.tr("Socket Messages"); + const iconSrc = "@FontAwesome5Solid/wrench/22"; + const maintenance = new osparc.tester.WebSocketMessages(); + this.addTab(title, iconSrc, maintenance); + }, } }); diff --git a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js new file mode 100644 index 000000000000..ca831fdcb732 --- /dev/null +++ b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js @@ -0,0 +1,72 @@ +/* ************************************************************************ + + osparc - the simcore frontend + + https://osparc.io + + Copyright: + 2024 IT'IS Foundation, https://itis.swiss + + License: + MIT: https://opensource.org/licenses/MIT + + Authors: + * Odei Maiz (odeimaiz) + +************************************************************************ */ + +qx.Class.define("osparc.tester.WebSocketMessages", { + extend: osparc.po.BaseView, + + members: { + _createChildControlImpl: function(id) { + let control; + switch (id) { + case "statics-container": + control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Statics")); + this._add(control); + break; + case "statics-content": { + const statics = osparc.store.Store.getInstance().get("statics"); + const form = new qx.ui.form.Form(); + for (let [key, value] of Object.entries(statics)) { + const textField = new qx.ui.form.TextField().set({ + value: typeof value === "object" ? JSON.stringify(value) : value.toString(), + readOnly: true + }); + form.add(textField, key, null, key); + } + control = new qx.ui.form.renderer.Single(form); + this.getChildControl("statics-container").add(control); + break; + } + case "local-storage-container": + control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Local Storage")); + this._add(control); + break; + case "local-storage-content": { + const items = { + ...window.localStorage + }; + const form = new qx.ui.form.Form(); + for (let [key, value] of Object.entries(items)) { + const textField = new qx.ui.form.TextField().set({ + value: typeof value === "object" ? JSON.stringify(value) : value.toString(), + readOnly: true + }); + form.add(textField, key, null, key); + } + control = new qx.ui.form.renderer.Single(form); + this.getChildControl("local-storage-container").add(control); + break; + } + } + return control || this.base(arguments, id); + }, + + _buildLayout: function() { + this.getChildControl("statics-content"); + this.getChildControl("local-storage-content"); + }, + } +}); From 5010a0b7dcdfd2e4b551f7bd3e4c5f63a6447bfa Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 13:53:40 +0100 Subject: [PATCH 04/16] init socketio cache --- .../client/source/class/osparc/wrapper/WebSocket.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js index 3a300c433b9d..7331630026cd 100644 --- a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js +++ b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js @@ -134,11 +134,13 @@ qx.Class.define("osparc.wrapper.WebSocket", { this.setNamespace(namespace); } this.__name = []; + this.__cache = {}; }, members: { // The name store an array of events __name: null, + __cache: null, /** * Trying to using socket.io to connect and plug every event from socket.io to qooxdoo one @@ -234,12 +236,15 @@ qx.Class.define("osparc.wrapper.WebSocket", { * Connect and event from socket.io like qooxdoo event * * @param {string} name The event name to watch - * @param {function} fn The function wich will catch event response + * @param {function} fn The function which will catch event response * @param {mixed} that A link to this * @returns {void} */ on: function(name, fn, that) { this.__name.push(name); + if (!(name in this.__cache)) { + this.__cache[name] = [] + } const socket = this.getSocket(); if (socket) { if (typeof (that) !== "undefined" && that !== null) { From efb09ab0080b8e1b9bef809646923e3cb870a63d Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 14:17:08 +0100 Subject: [PATCH 05/16] save messages --- .../source/class/osparc/wrapper/WebSocket.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js index 7331630026cd..9968adc6c873 100644 --- a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js +++ b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js @@ -243,10 +243,21 @@ qx.Class.define("osparc.wrapper.WebSocket", { on: function(name, fn, that) { this.__name.push(name); if (!(name in this.__cache)) { - this.__cache[name] = [] + this.__cache[name] = []; } const socket = this.getSocket(); if (socket) { + socket.on(name, message => { + const info = { + datetime: new Date(), + message, + } + this.__cache[name].unshift(info); + if (this.__cache[name].length > 20) { + this.__cache[name].length = 20; + } + console.log(this.__cache); + }, this); if (typeof (that) !== "undefined" && that !== null) { socket.on(name, qx.lang.Function.bind(fn, that)); } else { @@ -286,6 +297,7 @@ qx.Class.define("osparc.wrapper.WebSocket", { } } this.__name = null; + this.__cache = null; this.removeAllBindings(); From cc02bfd962608a6eca4f9857d24ec5912cb9f276 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 14:22:30 +0100 Subject: [PATCH 06/16] minor --- .../source/class/osparc/wrapper/WebSocket.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js index 9968adc6c873..0a47aa14d7ec 100644 --- a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js +++ b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js @@ -247,6 +247,13 @@ qx.Class.define("osparc.wrapper.WebSocket", { } const socket = this.getSocket(); if (socket) { + if (typeof (that) !== "undefined" && that !== null) { + socket.on(name, qx.lang.Function.bind(fn, that)); + } else { + socket.on(name, fn); + } + + // add a duplicated slot listener to keep the messages cached socket.on(name, message => { const info = { datetime: new Date(), @@ -256,13 +263,7 @@ qx.Class.define("osparc.wrapper.WebSocket", { if (this.__cache[name].length > 20) { this.__cache[name].length = 20; } - console.log(this.__cache); }, this); - if (typeof (that) !== "undefined" && that !== null) { - socket.on(name, qx.lang.Function.bind(fn, that)); - } else { - socket.on(name, fn); - } } }, @@ -281,7 +282,11 @@ qx.Class.define("osparc.wrapper.WebSocket", { index = this.__name.indexOf(name); } } - } + }, + + getCachedMessages: function() { + return this.__cache; + }, }, /** From 0f7506e009284e4e35bc286ef85ef76f45fa8cb1 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 15:07:43 +0100 Subject: [PATCH 07/16] unused --- .../source/class/osparc/file/FolderViewer.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FolderViewer.js b/services/static-webserver/client/source/class/osparc/file/FolderViewer.js index 23c1d5e57e85..26fb4433bf30 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderViewer.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderViewer.js @@ -201,24 +201,6 @@ qx.Class.define("osparc.file.FolderViewer", { return control || this.base(arguments, id); }, - __getEmptyEntry: function() { - const items = []; - if (this.getMode() === "list") { - items.push([ - "", - this.tr("Empty folder"), - "", - "", - "" - ]); - } else if (this.getMode() === "icons") { - items.push(this.self().getItemButton().set({ - label: this.tr("Empty folder") - })); - } - return items; - }, - __convertEntries: function(content) { const items = []; if (this.getMode() === "list") { From c299ba355302dbaebddf990de3573e738a284a49 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 15:07:59 +0100 Subject: [PATCH 08/16] display messages --- .../class/osparc/tester/TesterCenterWindow.js | 6 +- .../class/osparc/tester/WebSocketMessages.js | 126 +++++++++++++----- .../class/osparc/widget/logger/LoggerView.js | 2 +- .../source/class/osparc/wrapper/WebSocket.js | 2 +- 4 files changed, 98 insertions(+), 38 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js b/services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js index 5cb76533ac70..9b2a99c330d5 100644 --- a/services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js +++ b/services/static-webserver/client/source/class/osparc/tester/TesterCenterWindow.js @@ -22,10 +22,10 @@ qx.Class.define("osparc.tester.TesterCenterWindow", { this.base(arguments, "tester-center", this.tr("Tester Center")); const width = 800; - const height = 600; + const maxHeight = 800; this.set({ - width: width, - height: height, + width, + maxHeight, }); const testerCenter = new osparc.tester.TesterCenter(); diff --git a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js index ca831fdcb732..6def2dd45179 100644 --- a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js +++ b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js @@ -17,47 +17,76 @@ qx.Class.define("osparc.tester.WebSocketMessages", { extend: osparc.po.BaseView, + construct: function() { + this.base(arguments); + }, members: { _createChildControlImpl: function(id) { let control; switch (id) { - case "statics-container": - control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Statics")); + case "toolbar": + control = new qx.ui.toolbar.ToolBar().set({ + maxHeight: 30 + }); this._add(control); break; - case "statics-content": { - const statics = osparc.store.Store.getInstance().get("statics"); - const form = new qx.ui.form.Form(); - for (let [key, value] of Object.entries(statics)) { - const textField = new qx.ui.form.TextField().set({ - value: typeof value === "object" ? JSON.stringify(value) : value.toString(), - readOnly: true - }); - form.add(textField, key, null, key); - } - control = new qx.ui.form.renderer.Single(form); - this.getChildControl("statics-container").add(control); + case "filter-text": { + const toolbar = this.getChildControl("toolbar"); + control = new qx.ui.form.TextField().set({ + appearance: "toolbar-textfield", + liveUpdate: true, + placeholder: this.tr("Filter") + }); + osparc.utils.Utils.setIdToWidget(control, "logsFilterField"); + toolbar.add(control, { + flex: 1 + }); break; } - case "local-storage-container": - control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Local Storage")); - this._add(control); - break; - case "local-storage-content": { - const items = { - ...window.localStorage + case "messages-table": { + const tableModel = new qx.ui.table.model.Simple(); + tableModel.setColumns([ + this.tr("Date"), + this.tr("Channel"), + this.tr("Message"), + ]); + const custom = { + tableColumnModel: function(obj) { + return new qx.ui.table.columnmodel.Resize(obj); + } }; - const form = new qx.ui.form.Form(); - for (let [key, value] of Object.entries(items)) { - const textField = new qx.ui.form.TextField().set({ - value: typeof value === "object" ? JSON.stringify(value) : value.toString(), - readOnly: true - }); - form.add(textField, key, null, key); - } - control = new qx.ui.form.renderer.Single(form); - this.getChildControl("local-storage-container").add(control); + control = new qx.ui.table.Table(tableModel, custom).set({ + selectable: true, + statusBarVisible: false, + showCellFocusIndicator: false, + forceLineHeight: false + }); + control.getTableColumnModel().setDataCellRenderer( + 1, + new qx.ui.table.cellrenderer.String().set({ + defaultCellStyle: "user-select: text" + }) + ); + control.getTableColumnModel().setDataCellRenderer( + 0, + new qx.ui.table.cellrenderer.String().set({ + defaultCellStyle: "user-select: text" + }) + ); + control.getTableColumnModel().setDataCellRenderer( + 2, + new osparc.ui.table.cellrenderer.Html().set({ + defaultCellStyle: "user-select: text; text-wrap: wrap" + }) + ); + control.setColumnWidth(0, 100); + control.setColumnWidth(1, 100); + + control.setDataRowRenderer(new osparc.ui.table.rowrenderer.ExpandSelection(control)); + this._add(control, { + flex: 1 + }); break; } } @@ -65,8 +94,39 @@ qx.Class.define("osparc.tester.WebSocketMessages", { }, _buildLayout: function() { - this.getChildControl("statics-content"); - this.getChildControl("local-storage-content"); + this.getChildControl("filter-text"); + this.getChildControl("messages-table"); + + this.__populateTable(); }, + + __populateTable: function() { + const socket = osparc.wrapper.WebSocket.getInstance(); + const messagesObj = socket.getCachedMessages(); + const messagesArray = []; + for (const channel in messagesObj) { + messagesObj[channel].forEach(msg => { + messagesArray.push({ + datetime: msg.datetime, + channel, + message: msg.message, + }); + }); + } + messagesArray.sort((a, b) => { + return new Date(b.date) - new Date(a.date); // newest first + }); + const datas = []; + messagesArray.forEach(entry => { + const data = [ + new Date(entry.datetime).toLocaleTimeString(), + entry.channel, + JSON.stringify(entry.message), + ]; + datas.push(data); + }); + this.getChildControl("messages-table").getTableModel().setData(datas); + console.log(messagesArray); + } } }); diff --git a/services/static-webserver/client/source/class/osparc/widget/logger/LoggerView.js b/services/static-webserver/client/source/class/osparc/widget/logger/LoggerView.js index e77ff8c6840b..7eb6bbb4081c 100644 --- a/services/static-webserver/client/source/class/osparc/widget/logger/LoggerView.js +++ b/services/static-webserver/client/source/class/osparc/widget/logger/LoggerView.js @@ -21,7 +21,7 @@ * It consists of: * - a toolbar containing: * - clear button - * - filter as you type textfiled + * - filter as you type textfield * - some log type filtering buttons * - log messages table * diff --git a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js index 0a47aa14d7ec..04e48eb9e3a7 100644 --- a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js +++ b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js @@ -257,7 +257,7 @@ qx.Class.define("osparc.wrapper.WebSocket", { socket.on(name, message => { const info = { datetime: new Date(), - message, + message: message ? message : "", } this.__cache[name].unshift(info); if (this.__cache[name].length > 20) { From 58a455954b9204c202b781b504aa25db8e836771 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 15:11:12 +0100 Subject: [PATCH 09/16] renaming --- .../class/osparc/tester/WebSocketMessages.js | 15 ++++++--------- .../source/class/osparc/wrapper/WebSocket.js | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js index 6def2dd45179..cb743a464e78 100644 --- a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js +++ b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js @@ -26,9 +26,7 @@ qx.Class.define("osparc.tester.WebSocketMessages", { let control; switch (id) { case "toolbar": - control = new qx.ui.toolbar.ToolBar().set({ - maxHeight: 30 - }); + control = new qx.ui.toolbar.ToolBar(); this._add(control); break; case "filter-text": { @@ -80,8 +78,8 @@ qx.Class.define("osparc.tester.WebSocketMessages", { defaultCellStyle: "user-select: text; text-wrap: wrap" }) ); - control.setColumnWidth(0, 100); - control.setColumnWidth(1, 100); + control.setColumnWidth(0, 80); + control.setColumnWidth(1, 150); control.setDataRowRenderer(new osparc.ui.table.rowrenderer.ExpandSelection(control)); this._add(control, { @@ -107,26 +105,25 @@ qx.Class.define("osparc.tester.WebSocketMessages", { for (const channel in messagesObj) { messagesObj[channel].forEach(msg => { messagesArray.push({ - datetime: msg.datetime, + date: msg.date, channel, message: msg.message, }); }); } messagesArray.sort((a, b) => { - return new Date(b.date) - new Date(a.date); // newest first + return new Date(a.date) - new Date(b.date); // newest first }); const datas = []; messagesArray.forEach(entry => { const data = [ - new Date(entry.datetime).toLocaleTimeString(), + new Date(entry.date).toLocaleTimeString(), entry.channel, JSON.stringify(entry.message), ]; datas.push(data); }); this.getChildControl("messages-table").getTableModel().setData(datas); - console.log(messagesArray); } } }); diff --git a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js index 04e48eb9e3a7..bce5bab43185 100644 --- a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js +++ b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js @@ -256,7 +256,7 @@ qx.Class.define("osparc.wrapper.WebSocket", { // add a duplicated slot listener to keep the messages cached socket.on(name, message => { const info = { - datetime: new Date(), + date: new Date(), message: message ? message : "", } this.__cache[name].unshift(info); From 016fdb421106973283aebbc1afc99743d106abf0 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 15:19:11 +0100 Subject: [PATCH 10/16] refactor --- .../source/class/osparc/ui/basic/JsonTreeWidget.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/ui/basic/JsonTreeWidget.js b/services/static-webserver/client/source/class/osparc/ui/basic/JsonTreeWidget.js index 24453fe0bf80..60f5a55e5b16 100644 --- a/services/static-webserver/client/source/class/osparc/ui/basic/JsonTreeWidget.js +++ b/services/static-webserver/client/source/class/osparc/ui/basic/JsonTreeWidget.js @@ -36,11 +36,21 @@ qx.Class.define("osparc.ui.basic.JsonTreeWidget", { * @param data {Object} Json object to be displayed by JsonTreeViewer */ construct: function(data) { - const prettyJson = JSON.stringify(data, null, " ").replace(/\n/ig, "
"); - this.base(arguments, prettyJson); + this.base(arguments); this.set({ rich: true, selectable: true }); + + if (data) { + this.setJson(data); + } + }, + + members: { + setJson(data) { + const prettyJson = JSON.stringify(data, null, " ").replace(/\n/ig, "
"); + this.setValue(prettyJson); + } } }); From 5944622d87a14110e92f4aa1a714c706ba7f6ec4 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 15:23:55 +0100 Subject: [PATCH 11/16] show selected row --- .../class/osparc/tester/WebSocketMessages.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js index cb743a464e78..5ad83daded41 100644 --- a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js +++ b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js @@ -87,13 +87,24 @@ qx.Class.define("osparc.tester.WebSocketMessages", { }); break; } + case "json-viewer": + control = new osparc.ui.basic.JsonTreeWidget(); + this._add(control); + break; } return control || this.base(arguments, id); }, _buildLayout: function() { this.getChildControl("filter-text"); - this.getChildControl("messages-table"); + const table = this.getChildControl("messages-table"); + const jsonViewer = this.getChildControl("json-viewer"); + + table.addListener("cellTap", e => { + const selectedRow = e.getRow(); + const rowData = table.getTableModel().getRowData(selectedRow); + jsonViewer.setJson(rowData[2]); + }, this); this.__populateTable(); }, @@ -112,7 +123,7 @@ qx.Class.define("osparc.tester.WebSocketMessages", { }); } messagesArray.sort((a, b) => { - return new Date(a.date) - new Date(b.date); // newest first + return new Date(b.date) - new Date(a.date); // newest first }); const datas = []; messagesArray.forEach(entry => { From 1282c21a897d7f5c28cbe9e9a21f83040b5e1992 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 15:33:15 +0100 Subject: [PATCH 12/16] working --- .../client/source/class/osparc/tester/WebSocketMessages.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js index 5ad83daded41..53a86d999368 100644 --- a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js +++ b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js @@ -103,7 +103,7 @@ qx.Class.define("osparc.tester.WebSocketMessages", { table.addListener("cellTap", e => { const selectedRow = e.getRow(); const rowData = table.getTableModel().getRowData(selectedRow); - jsonViewer.setJson(rowData[2]); + jsonViewer.setJson(JSON.parse(rowData[2])); }, this); this.__populateTable(); From a223551ad1140af765bc822ee9c967195e7f459b Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 15:46:17 +0100 Subject: [PATCH 13/16] filtering --- .../class/osparc/tester/WebSocketMessages.js | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js index 53a86d999368..6c2027c247cf 100644 --- a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js +++ b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js @@ -25,25 +25,16 @@ qx.Class.define("osparc.tester.WebSocketMessages", { _createChildControlImpl: function(id) { let control; switch (id) { - case "toolbar": - control = new qx.ui.toolbar.ToolBar(); - this._add(control); - break; case "filter-text": { - const toolbar = this.getChildControl("toolbar"); control = new qx.ui.form.TextField().set({ - appearance: "toolbar-textfield", - liveUpdate: true, - placeholder: this.tr("Filter") - }); - osparc.utils.Utils.setIdToWidget(control, "logsFilterField"); - toolbar.add(control, { - flex: 1 + liveUpdate : true, + placeholder: this.tr("search"), }); + this._add(control); break; } case "messages-table": { - const tableModel = new qx.ui.table.model.Simple(); + const tableModel = new qx.ui.table.model.Filtered(); tableModel.setColumns([ this.tr("Date"), this.tr("Channel"), @@ -96,10 +87,17 @@ qx.Class.define("osparc.tester.WebSocketMessages", { }, _buildLayout: function() { - this.getChildControl("filter-text"); + const filterText = this.getChildControl("filter-text"); const table = this.getChildControl("messages-table"); const jsonViewer = this.getChildControl("json-viewer"); + const model = table.getModel(); + filterText.addListener("changeValue", e => { + const value = e.getData(); + model.resetHiddenRows(); + model.addNotRegex(value, "login", true); + model.applyFilters(); + }); table.addListener("cellTap", e => { const selectedRow = e.getRow(); const rowData = table.getTableModel().getRowData(selectedRow); From fad9e789c025af2d4dd2fee6dd17aff2f37ce9ef Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 16:03:36 +0100 Subject: [PATCH 14/16] minor --- .../client/source/class/osparc/tester/Statics.js | 7 +++++-- .../source/class/osparc/tester/TesterCenter.js | 16 ++++++++-------- .../class/osparc/tester/WebSocketMessages.js | 12 ++++++------ 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/tester/Statics.js b/services/static-webserver/client/source/class/osparc/tester/Statics.js index 61ef43893544..b6655075e9f1 100644 --- a/services/static-webserver/client/source/class/osparc/tester/Statics.js +++ b/services/static-webserver/client/source/class/osparc/tester/Statics.js @@ -24,7 +24,9 @@ qx.Class.define("osparc.tester.Statics", { switch (id) { case "statics-container": control = osparc.ui.window.TabbedView.createSectionBox(this.tr("Statics")); - this._add(control); + this._add(control, { + flex: 1 + }); break; case "statics-content": { const statics = osparc.store.Store.getInstance().get("statics"); @@ -36,7 +38,8 @@ qx.Class.define("osparc.tester.Statics", { }); form.add(textField, key, null, key); } - control = new qx.ui.form.renderer.Single(form); + const renderer = new qx.ui.form.renderer.Single(form); + control = new qx.ui.container.Scroll(renderer); this.getChildControl("statics-container").add(control); break; } diff --git a/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js b/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js index 87e4839c7ca1..b456afebb327 100644 --- a/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js +++ b/services/static-webserver/client/source/class/osparc/tester/TesterCenter.js @@ -26,22 +26,22 @@ qx.Class.define("osparc.tester.TesterCenter", { }); this.addWidgetOnTopOfTheTabs(miniProfile); - this.__addStaticsPage(); this.__addSocketMessagesPage(); + this.__addStaticsPage(); }, members: { - __addStaticsPage: function() { - const title = this.tr("Statics"); - const iconSrc = "@FontAwesome5Solid/wrench/22"; - const maintenance = new osparc.tester.Statics(); + __addSocketMessagesPage: function() { + const title = this.tr("Socket Messages"); + const iconSrc = "@FontAwesome5Solid/exchange-alt/22"; + const maintenance = new osparc.tester.WebSocketMessages(); this.addTab(title, iconSrc, maintenance); }, - __addSocketMessagesPage: function() { - const title = this.tr("Socket Messages"); + __addStaticsPage: function() { + const title = this.tr("Statics"); const iconSrc = "@FontAwesome5Solid/wrench/22"; - const maintenance = new osparc.tester.WebSocketMessages(); + const maintenance = new osparc.tester.Statics(); this.addTab(title, iconSrc, maintenance); }, } diff --git a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js index 6c2027c247cf..0872301459f0 100644 --- a/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js +++ b/services/static-webserver/client/source/class/osparc/tester/WebSocketMessages.js @@ -25,10 +25,10 @@ qx.Class.define("osparc.tester.WebSocketMessages", { _createChildControlImpl: function(id) { let control; switch (id) { - case "filter-text": { + case "filter-message": { control = new qx.ui.form.TextField().set({ liveUpdate : true, - placeholder: this.tr("search"), + placeholder: this.tr("Search in Message"), }); this._add(control); break; @@ -87,15 +87,15 @@ qx.Class.define("osparc.tester.WebSocketMessages", { }, _buildLayout: function() { - const filterText = this.getChildControl("filter-text"); + const filterMessage = this.getChildControl("filter-message"); const table = this.getChildControl("messages-table"); const jsonViewer = this.getChildControl("json-viewer"); - const model = table.getModel(); - filterText.addListener("changeValue", e => { + const model = table.getTableModel(); + filterMessage.addListener("changeValue", e => { const value = e.getData(); model.resetHiddenRows(); - model.addNotRegex(value, "login", true); + model.addNotRegex(value, "Message", true); model.applyFilters(); }); table.addListener("cellTap", e => { From 91bb98b6ec26dfb27b284778fafcfa94027a8419 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 16:44:42 +0100 Subject: [PATCH 15/16] @neagu testers only --- .../source/class/osparc/wrapper/WebSocket.js | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js index bce5bab43185..697106f76f2e 100644 --- a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js +++ b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js @@ -242,9 +242,6 @@ qx.Class.define("osparc.wrapper.WebSocket", { */ on: function(name, fn, that) { this.__name.push(name); - if (!(name in this.__cache)) { - this.__cache[name] = []; - } const socket = this.getSocket(); if (socket) { if (typeof (that) !== "undefined" && that !== null) { @@ -253,17 +250,22 @@ qx.Class.define("osparc.wrapper.WebSocket", { socket.on(name, fn); } - // add a duplicated slot listener to keep the messages cached - socket.on(name, message => { - const info = { - date: new Date(), - message: message ? message : "", - } - this.__cache[name].unshift(info); - if (this.__cache[name].length > 20) { - this.__cache[name].length = 20; - } - }, this); + if (osparc.data.Permissions.getInstance().isTester()) { + // add a duplicated slot listener to keep the messages cached + socket.on(name, message => { + if (!(name in this.__cache)) { + this.__cache[name] = []; + } + const info = { + date: new Date(), + message: message ? message : "", + } + this.__cache[name].unshift(info); + if (this.__cache[name].length > 20) { + this.__cache[name].length = 20; + } + }, this); + } } }, From 07f4a794f5c935b823e1ba019438fa480ebf0831 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Mon, 18 Nov 2024 16:46:29 +0100 Subject: [PATCH 16/16] keep for all users --- .../source/class/osparc/wrapper/WebSocket.js | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js index 697106f76f2e..081d790c01d5 100644 --- a/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js +++ b/services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js @@ -250,22 +250,20 @@ qx.Class.define("osparc.wrapper.WebSocket", { socket.on(name, fn); } - if (osparc.data.Permissions.getInstance().isTester()) { - // add a duplicated slot listener to keep the messages cached - socket.on(name, message => { - if (!(name in this.__cache)) { - this.__cache[name] = []; - } - const info = { - date: new Date(), - message: message ? message : "", - } - this.__cache[name].unshift(info); - if (this.__cache[name].length > 20) { - this.__cache[name].length = 20; - } - }, this); - } + // add a duplicated slot listener to keep the messages cached + socket.on(name, message => { + if (!(name in this.__cache)) { + this.__cache[name] = []; + } + const info = { + date: new Date(), + message: message ? message : "", + } + this.__cache[name].unshift(info); + if (this.__cache[name].length > 20) { + this.__cache[name].length = 20; + } + }, this); } },