From 7c29e13ce11a94c718a47623e3fba9b96640bc7f Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 09:52:31 +0100 Subject: [PATCH 01/68] minor --- .../source/class/osparc/data/Resources.js | 20 +++++------ .../client/source/class/osparc/store/Data.js | 36 +++++-------------- 2 files changed, 18 insertions(+), 38 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Resources.js b/services/static-webserver/client/source/class/osparc/data/Resources.js index f6a257dabf9..89427bb3ef2 100644 --- a/services/static-webserver/client/source/class/osparc/data/Resources.js +++ b/services/static-webserver/client/source/class/osparc/data/Resources.js @@ -1171,26 +1171,26 @@ qx.Class.define("osparc.data.Resources", { } }, /* - * STORAGE LOCATIONS + * STORAGE DATASETS */ - "storageLocations": { - useCache: true, + "storageDatasets": { + useCache: false, endpoints: { - get: { + getByLocation: { method: "GET", - url: statics.API + "/storage/locations" + url: statics.API + "/storage/locations/{locationId}/datasets" } } }, /* - * STORAGE DATASETS + * STORAGE LOCATIONS */ - "storageDatasets": { - useCache: false, + "storageLocations": { + useCache: true, endpoints: { - getByLocation: { + getLocations: { method: "GET", - url: statics.API + "/storage/locations/{locationId}/datasets" + url: statics.API + "/storage/locations" } } }, diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index d592f78ea67..31d79668fdc 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -36,44 +36,24 @@ qx.Class.define("osparc.store.Data", { }, members: { - __locationsCached: null, __datasetsByLocationCached: null, __filesByLocationAndDatasetCached: null, resetCache: function() { - this.__locationsCached = []; this.__datasetsByLocationCached = {}; this.__filesByLocationAndDatasetCached = {}; - - osparc.store.Store.getInstance().reset("storageLocations"); - }, - - getLocationsCached: function() { - const cache = this.__locationsCached; - if (cache && cache.length) { - return cache; - } - return null; }, getLocations: function() { return new Promise((resolve, reject) => { - const cachedData = this.getLocationsCached(); - if (cachedData) { - resolve(cachedData); - } else { - // Get available storage locations - osparc.data.Resources.get("storageLocations") - .then(locations => { - // Add them to cache - this.__locationsCached = locations; - resolve(locations); - }) - .catch(err => { - console.error(err); - reject([]); - }); - } + osparc.data.Resources.fetch("storageLocations", "getLocations") + .then(locations => { + resolve(locations); + }) + .catch(err => { + console.error(err); + reject([]); + }); }); }, From 992c60514ed36a72090efa2792274cc4f523dfe5 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 10:24:44 +0100 Subject: [PATCH 02/68] refactor --- .../source/class/osparc/data/Resources.js | 36 +++++----- .../source/class/osparc/file/FilePicker.js | 4 +- .../source/class/osparc/file/FilesTree.js | 6 +- .../client/source/class/osparc/store/Data.js | 72 +++++++------------ 4 files changed, 45 insertions(+), 73 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Resources.js b/services/static-webserver/client/source/class/osparc/data/Resources.js index 89427bb3ef2..8c7cefe7224 100644 --- a/services/static-webserver/client/source/class/osparc/data/Resources.js +++ b/services/static-webserver/client/source/class/osparc/data/Resources.js @@ -1170,18 +1170,6 @@ qx.Class.define("osparc.data.Resources", { }, } }, - /* - * STORAGE DATASETS - */ - "storageDatasets": { - useCache: false, - endpoints: { - getByLocation: { - method: "GET", - url: statics.API + "/storage/locations/{locationId}/datasets" - } - } - }, /* * STORAGE LOCATIONS */ @@ -1200,14 +1188,6 @@ qx.Class.define("osparc.data.Resources", { "storageFiles": { useCache: false, endpoints: { - getByLocationAndDataset: { - method: "GET", - url: statics.API + "/storage/locations/{locationId}/datasets/{datasetId}/metadata" - }, - getByNode: { - method: "GET", - url: statics.API + "/storage/locations/0/files/metadata?uuid_filter={nodeId}" - }, put: { method: "PUT", url: statics.API + "/storage/locations/{toLoc}/files/{fileName}?extra_location={fromLoc}&extra_source={fileUuid}" @@ -1218,6 +1198,22 @@ qx.Class.define("osparc.data.Resources", { } } }, + /* + * STORAGE PATHS + */ + "storagePaths": { + useCache: false, + endpoints: { + getDatasets: { + method: "GET", + url: statics.API + "/storage/locations/{locationId}/paths" + }, + getFiles: { + method: "GET", + url: statics.API + "/storage/locations/{locationId}/paths?file_filter={path}" + }, + } + }, /* * STORAGE LINK */ diff --git a/services/static-webserver/client/source/class/osparc/file/FilePicker.js b/services/static-webserver/client/source/class/osparc/file/FilePicker.js index 4437b773064..db69dce115c 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilePicker.js +++ b/services/static-webserver/client/source/class/osparc/file/FilePicker.js @@ -155,10 +155,10 @@ qx.Class.define("osparc.file.FilePicker", { const params = { url: { locationId: outValue.store, - datasetId: outValue.dataset + path: outValue.dataset } }; - osparc.data.Resources.fetch("storageFiles", "getByLocationAndDataset", params) + osparc.data.Resources.fetch("storagePaths", "getFiles", params) .then(files => { const fileMetadata = files.find(file => file.file_id === outValue.path); if (fileMetadata) { diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 1d828881cae..54ba999dbf6 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -442,9 +442,9 @@ qx.Class.define("osparc.file.FilesTree", { let openThis = null; datasets.forEach(dataset => { const datasetData = osparc.data.Converters.createDirEntry( - dataset.display_name, + dataset["display_path"], locationId, - dataset.dataset_id + dataset["path"] ); datasetData.isDataset = true; datasetData.loaded = false; @@ -454,7 +454,7 @@ qx.Class.define("osparc.file.FilesTree", { locationModel.getChildren().append(datasetModel); // add cached files - const datasetId = dataset.dataset_id; + const datasetId = dataset["path"]; const cachedData = dataStore.getFilesByLocationAndDatasetCached(locationId, datasetId); if (cachedData) { this.__filesToDataset(cachedData.location, cachedData.dataset, cachedData.files); diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index 31d79668fdc..c30af599053 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -36,11 +36,9 @@ qx.Class.define("osparc.store.Data", { }, members: { - __datasetsByLocationCached: null, __filesByLocationAndDatasetCached: null, resetCache: function() { - this.__datasetsByLocationCached = {}; this.__filesByLocationAndDatasetCached = {}; }, @@ -57,56 +55,32 @@ qx.Class.define("osparc.store.Data", { }); }, - getDatasetsByLocationCached: function(locationId) { - const cache = this.__datasetsByLocationCached; - if (locationId in cache && cache[locationId] && cache[locationId].length) { - const data = { - location: locationId, - datasets: cache[locationId] - }; - return data; - } - return null; - }, - getDatasetsByLocation: function(locationId) { - const emptyData = { + const data = { location: locationId, datasets: [] }; return new Promise((resolve, reject) => { - // Get list of datasets if (locationId === 1 && !osparc.data.Permissions.getInstance().canDo("storage.datcore.read")) { - reject(emptyData); + reject(data); } - const cachedData = this.getDatasetsByLocationCached(locationId); - if (cachedData) { - resolve(cachedData); - } else { - const params = { - url: { - locationId + const params = { + url: { + locationId + } + }; + osparc.data.Resources.fetch("storagePaths", "getDatasets", params) + .then(pagResp => { + if (pagResp["items"] && pagResp["items"].length>0) { + data.datasets = pagResp["items"]; } - }; - osparc.data.Resources.fetch("storageDatasets", "getByLocation", params) - .then(datasets => { - const data = { - location: locationId, - datasets: [] - }; - if (datasets && datasets.length>0) { - data.datasets = datasets; - } - // Add it to cache - this.__datasetsByLocationCached[locationId] = data.datasets; - resolve(data); - }) - .catch(err => { - console.error(err); - reject(emptyData); - }); - } + resolve(data); + }) + .catch(err => { + console.error(err); + reject(data); + }); }); }, @@ -141,11 +115,11 @@ qx.Class.define("osparc.store.Data", { } else { const params = { url: { - locationId, - datasetId + locationId: locationId, + path: datasetId } }; - osparc.data.Resources.fetch("storageFiles", "getByLocationAndDataset", params) + osparc.data.Resources.fetch("storagePaths", "getFiles", params) .then(files => { const data = { location: locationId, @@ -169,12 +143,14 @@ qx.Class.define("osparc.store.Data", { getNodeFiles: function(nodeId) { return new Promise((resolve, reject) => { + const nodePath = encodeURIComponent(nodeId); const params = { url: { - nodeId: encodeURIComponent(nodeId) + locationId: 0, + path: nodePath, } }; - osparc.data.Resources.fetch("storageFiles", "getByNode", params) + osparc.data.Resources.fetch("storagePaths", "getFiles", params) .then(files => { console.log("Node Files", files); if (files && files.length>0) { From fc72276f978cd983eddd8cad58a7b4d252dc93d9 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 10:29:08 +0100 Subject: [PATCH 03/68] [skip ci] more items --- .../client/source/class/osparc/store/Data.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index c30af599053..77c7c5dcbca 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -120,12 +120,15 @@ qx.Class.define("osparc.store.Data", { } }; osparc.data.Resources.fetch("storagePaths", "getFiles", params) - .then(files => { + .then(pagResp => { const data = { location: locationId, dataset: datasetId, - files: files && files.length>0 ? files : [] + files: [] }; + if (pagResp["items"] && pagResp["items"].length>0) { + data.files = pagResp["items"]; + } // Add it to cache if (!(locationId in this.__filesByLocationAndDatasetCached)) { this.__filesByLocationAndDatasetCached[locationId] = {}; From 735a9542760268f274a538a48ebfa68959370a6f Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 10:35:21 +0100 Subject: [PATCH 04/68] bring back the cache --- .../client/source/class/osparc/store/Data.js | 80 +++++++++++++------ 1 file changed, 57 insertions(+), 23 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index 77c7c5dcbca..b041c5e8a3e 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -36,25 +36,54 @@ qx.Class.define("osparc.store.Data", { }, members: { + __locationsCached: null, + __datasetsByLocationCached: null, __filesByLocationAndDatasetCached: null, resetCache: function() { + this.__locationsCached = []; + this.__datasetsByLocationCached = {}; this.__filesByLocationAndDatasetCached = {}; }, + getLocationsCached: function() { + const cache = this.__locationsCached; + if (cache && cache.length) { + return cache; + } + return null; + }, + getLocations: function() { return new Promise((resolve, reject) => { - osparc.data.Resources.fetch("storageLocations", "getLocations") - .then(locations => { - resolve(locations); - }) - .catch(err => { - console.error(err); - reject([]); - }); + const cachedData = this.getLocationsCached(); + if (cachedData) { + resolve(cachedData); + } else { + osparc.data.Resources.fetch("storageLocations", "getLocations") + .then(locations => { + resolve(locations); + }) + .catch(err => { + console.error(err); + reject([]); + }); + } }); }, + getDatasetsByLocationCached: function(locationId) { + const cache = this.__datasetsByLocationCached; + if (locationId in cache && cache[locationId] && cache[locationId].length) { + const data = { + location: locationId, + datasets: cache[locationId] + }; + return data; + } + return null; + }, + getDatasetsByLocation: function(locationId) { const data = { location: locationId, @@ -65,22 +94,27 @@ qx.Class.define("osparc.store.Data", { reject(data); } - const params = { - url: { - locationId - } - }; - osparc.data.Resources.fetch("storagePaths", "getDatasets", params) - .then(pagResp => { - if (pagResp["items"] && pagResp["items"].length>0) { - data.datasets = pagResp["items"]; + const cachedData = this.getDatasetsByLocationCached(locationId); + if (cachedData) { + resolve(cachedData); + } else { + const params = { + url: { + locationId } - resolve(data); - }) - .catch(err => { - console.error(err); - reject(data); - }); + }; + osparc.data.Resources.fetch("storagePaths", "getDatasets", params) + .then(pagResp => { + if (pagResp["items"] && pagResp["items"].length>0) { + data.datasets = pagResp["items"]; + } + resolve(data); + }) + .catch(err => { + console.error(err); + reject(data); + }); + } }); }, From 86b4870ccffcba9959917d4260f454ef552cbb1e Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 10:40:24 +0100 Subject: [PATCH 05/68] more caching --- .../static-webserver/client/source/class/osparc/store/Data.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index b041c5e8a3e..af2e684eeac 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -62,6 +62,8 @@ qx.Class.define("osparc.store.Data", { } else { osparc.data.Resources.fetch("storageLocations", "getLocations") .then(locations => { + // Add them to cache + this.__locationsCached = locations; resolve(locations); }) .catch(err => { @@ -108,6 +110,8 @@ qx.Class.define("osparc.store.Data", { if (pagResp["items"] && pagResp["items"].length>0) { data.datasets = pagResp["items"]; } + // Add it to cache + this.__datasetsByLocationCached[locationId] = data.datasets; resolve(data); }) .catch(err => { From 038c8500615c980e8e20fcd3e9658d7fc6476568 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 10:57:26 +0100 Subject: [PATCH 06/68] simplify resp --- .../client/source/class/osparc/file/FilesTree.js | 8 +++----- .../client/source/class/osparc/store/Data.js | 15 +++++---------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 54ba999dbf6..b569998e713 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -179,7 +179,7 @@ qx.Class.define("osparc.file.FilesTree", { const dataStore = osparc.store.Data.getInstance(); return dataStore.getNodeFiles(nodeId) .then(files => { - const newChildren = osparc.data.Converters.fromDSMToVirtualTreeModel(null, files); + const newChildren = osparc.data.Converters.fromDSMToVirtualTreeModel(0, null, files); if (newChildren.length && // location newChildren[0].children.length && // study newChildren[0].children[0].children.length) { // node @@ -385,11 +385,9 @@ qx.Class.define("osparc.file.FilesTree", { return dataStore.getFilesByLocationAndDataset(locationId, datasetId) .then(data => { const { - location, - dataset, files } = data; - this.__filesToDataset(location, dataset, files); + this.__filesToDataset(locationId, datasetId, files); }); }, @@ -485,7 +483,7 @@ qx.Class.define("osparc.file.FilesTree", { if (datasetModel) { datasetModel.getChildren().removeAll(); if (files.length) { - const locationData = osparc.data.Converters.fromDSMToVirtualTreeModel(datasetId, files); + const locationData = osparc.data.Converters.fromDSMToVirtualTreeModel(locationId, datasetId, files); const datasetData = locationData[0].children; datasetData[0].children.forEach(data => { this.self().attachPathLabel(datasetModel.getPathLabel(), data); diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index af2e684eeac..22b5a3d4b70 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -136,15 +136,15 @@ qx.Class.define("osparc.store.Data", { }, getFilesByLocationAndDataset: function(locationId, datasetId) { - const emptyData = { - location: locationId, - dataset: datasetId, + const data = { + locationId, + datasetId, files: [] }; return new Promise((resolve, reject) => { // Get list of file meta data if (locationId === 1 && !osparc.data.Permissions.getInstance().canDo("storage.datcore.read")) { - reject(emptyData); + reject(data); } const cachedData = this.getFilesByLocationAndDatasetCached(locationId, datasetId); @@ -159,11 +159,6 @@ qx.Class.define("osparc.store.Data", { }; osparc.data.Resources.fetch("storagePaths", "getFiles", params) .then(pagResp => { - const data = { - location: locationId, - dataset: datasetId, - files: [] - }; if (pagResp["items"] && pagResp["items"].length>0) { data.files = pagResp["items"]; } @@ -176,7 +171,7 @@ qx.Class.define("osparc.store.Data", { }) .catch(err => { console.error(err); - reject(emptyData); + reject(data); }); } }); From 517e4cb728956ca6fb4d261cb9f5f89bb82129f7 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 11:46:18 +0100 Subject: [PATCH 07/68] getPaths --- .../client/source/class/osparc/data/Resources.js | 2 +- .../client/source/class/osparc/file/FilePicker.js | 2 +- .../static-webserver/client/source/class/osparc/store/Data.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Resources.js b/services/static-webserver/client/source/class/osparc/data/Resources.js index 8c7cefe7224..1d3eaf0d2db 100644 --- a/services/static-webserver/client/source/class/osparc/data/Resources.js +++ b/services/static-webserver/client/source/class/osparc/data/Resources.js @@ -1208,7 +1208,7 @@ qx.Class.define("osparc.data.Resources", { method: "GET", url: statics.API + "/storage/locations/{locationId}/paths" }, - getFiles: { + getPaths: { method: "GET", url: statics.API + "/storage/locations/{locationId}/paths?file_filter={path}" }, diff --git a/services/static-webserver/client/source/class/osparc/file/FilePicker.js b/services/static-webserver/client/source/class/osparc/file/FilePicker.js index db69dce115c..db9c9e47d1b 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilePicker.js +++ b/services/static-webserver/client/source/class/osparc/file/FilePicker.js @@ -158,7 +158,7 @@ qx.Class.define("osparc.file.FilePicker", { path: outValue.dataset } }; - osparc.data.Resources.fetch("storagePaths", "getFiles", params) + osparc.data.Resources.fetch("storagePaths", "getPaths", params) .then(files => { const fileMetadata = files.find(file => file.file_id === outValue.path); if (fileMetadata) { diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index 22b5a3d4b70..4c5e8a3201b 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -157,7 +157,7 @@ qx.Class.define("osparc.store.Data", { path: datasetId } }; - osparc.data.Resources.fetch("storagePaths", "getFiles", params) + osparc.data.Resources.fetch("storagePaths", "getPaths", params) .then(pagResp => { if (pagResp["items"] && pagResp["items"].length>0) { data.files = pagResp["items"]; @@ -186,7 +186,7 @@ qx.Class.define("osparc.store.Data", { path: nodePath, } }; - osparc.data.Resources.fetch("storagePaths", "getFiles", params) + osparc.data.Resources.fetch("storagePaths", "getPaths", params) .then(files => { console.log("Node Files", files); if (files && files.length>0) { From 906ea00003b5413481792647e94c30a722268fd0 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 11:58:05 +0100 Subject: [PATCH 08/68] do not cache files --- .../source/class/osparc/file/FilesTree.js | 15 ++--- .../client/source/class/osparc/store/Data.js | 57 ++++++------------- 2 files changed, 21 insertions(+), 51 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index b569998e713..91382be96d8 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -48,7 +48,7 @@ qx.Class.define("osparc.file.FilesTree", { font: "text-14", }); - this.resetChecks(); + this.__resetChecks(); this.addListener("tap", this.__selectionChanged, this); @@ -133,13 +133,13 @@ qx.Class.define("osparc.file.FilesTree", { __datasets: null, __loadPaths: null, - resetChecks: function() { + __resetChecks: function() { this.__locations = new Set(); this.__datasets = new Set(); }, resetCache: function() { - this.resetChecks(); + this.__resetChecks(); const dataStore = osparc.store.Data.getInstance(); dataStore.resetCache(); @@ -304,7 +304,7 @@ qx.Class.define("osparc.file.FilesTree", { }, __populateLocations: function() { - this.resetChecks(); + this.__resetChecks(); const treeName = "My Data"; this.__resetTree(treeName); @@ -320,7 +320,7 @@ qx.Class.define("osparc.file.FilesTree", { .then(locations => { const datasetPromises = []; if (this.__locations.size === 0) { - this.resetChecks(); + this.__resetChecks(); this.__locationsToRoot(locations); for (let i=0; i { + if (pagResp["items"] && pagResp["items"].length>0) { + data.files = pagResp["items"]; } - }; - osparc.data.Resources.fetch("storagePaths", "getPaths", params) - .then(pagResp => { - if (pagResp["items"] && pagResp["items"].length>0) { - data.files = pagResp["items"]; - } - // Add it to cache - if (!(locationId in this.__filesByLocationAndDatasetCached)) { - this.__filesByLocationAndDatasetCached[locationId] = {}; - } - this.__filesByLocationAndDatasetCached[locationId][datasetId] = data.files; - resolve(data); - }) - .catch(err => { - console.error(err); - reject(data); - }); - } + resolve(data); + }) + .catch(err => { + console.error(err); + reject(data); + }); }); }, From 21fece7b5c655be481fd7a2227a4412be9d4169a Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 11:58:32 +0100 Subject: [PATCH 09/68] [skip ci] minor --- .../client/source/class/osparc/file/FilesTree.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 91382be96d8..34ece745655 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -429,8 +429,6 @@ qx.Class.define("osparc.file.FilesTree", { }, __datasetsToLocation: function(locationId, datasets) { - const dataStore = osparc.store.Data.getInstance(); - const locationModel = this.__getLocationModel(locationId); if (!locationModel) { return; From d2bb386eab2c68a8a1176d670463b882650a02bb Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 12:47:50 +0100 Subject: [PATCH 10/68] renaming --- .../client/source/class/osparc/file/FilesTree.js | 16 ++++++++-------- .../client/source/class/osparc/store/Data.js | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 34ece745655..d730aef4d4c 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -152,17 +152,17 @@ qx.Class.define("osparc.file.FilesTree", { this.self().addLoadingChild(studyModel); const dataStore = osparc.store.Data.getInstance(); - return dataStore.getFilesByLocationAndDataset("0", studyId) + return dataStore.getPathByLocationAndDataset("0", studyId) .then(data => { const { - files + items } = data; - if (files.length && "project_name" in files[0]) { - this.__resetTree(files[0]["project_name"]); + if (items.length && "project_name" in items[0]) { + this.__resetTree(items[0]["project_name"]); } studyModel = this.getModel(); - this.__filesToDataset("0", studyId, files, studyModel); + this.__filesToDataset("0", studyId, items, studyModel); // select study item this.setSelection(new qx.data.Array([studyModel])); @@ -382,12 +382,12 @@ qx.Class.define("osparc.file.FilesTree", { } const dataStore = osparc.store.Data.getInstance(); - return dataStore.getFilesByLocationAndDataset(locationId, datasetId) + return dataStore.getPathByLocationAndDataset(locationId, datasetId) .then(data => { const { - files + items } = data; - this.__filesToDataset(locationId, datasetId, files); + this.__filesToDataset(locationId, datasetId, items); }); }, diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index 76392ce70a8..b609306d75a 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -120,11 +120,11 @@ qx.Class.define("osparc.store.Data", { }); }, - getFilesByLocationAndDataset: function(locationId, datasetId) { + getPathByLocationAndDataset: function(locationId, datasetId) { const data = { locationId, datasetId, - files: [] + items: [] }; return new Promise((resolve, reject) => { // Get list of file meta data @@ -141,7 +141,7 @@ qx.Class.define("osparc.store.Data", { osparc.data.Resources.fetch("storagePaths", "getPaths", params) .then(pagResp => { if (pagResp["items"] && pagResp["items"].length>0) { - data.files = pagResp["items"]; + data.items = pagResp["items"]; } resolve(data); }) From 2b253f8338996ea9196c572e9f4a20e19947e6b3 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 13:01:26 +0100 Subject: [PATCH 11/68] renaming --- .../source/class/osparc/file/FilesTree.js | 57 ++++++++++++++----- .../client/source/class/osparc/store/Data.js | 16 ++---- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index d730aef4d4c..0b70118cc72 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -152,17 +152,13 @@ qx.Class.define("osparc.file.FilesTree", { this.self().addLoadingChild(studyModel); const dataStore = osparc.store.Data.getInstance(); - return dataStore.getPathByLocationAndDataset("0", studyId) - .then(data => { - const { - items - } = data; - + return dataStore.getItemsByLocationAndDataset("0", studyId) + .then(items => { if (items.length && "project_name" in items[0]) { this.__resetTree(items[0]["project_name"]); } studyModel = this.getModel(); - this.__filesToDataset("0", studyId, items, studyModel); + this.__itemsToDataset("0", studyId, items, studyModel); // select study item this.setSelection(new qx.data.Array([studyModel])); @@ -382,12 +378,12 @@ qx.Class.define("osparc.file.FilesTree", { } const dataStore = osparc.store.Data.getInstance(); - return dataStore.getPathByLocationAndDataset(locationId, datasetId) - .then(data => { - const { - items - } = data; - this.__filesToDataset(locationId, datasetId, items); + return dataStore.getItemsByLocationAndDataset(locationId, datasetId) + .then(items => { + const parentModel = this.__getDatasetModel(locationId, datasetId); + if (parentModel) { + this.__itemsToParentModel(locationId, datasetId, items); + } }); }, @@ -415,6 +411,39 @@ qx.Class.define("osparc.file.FilesTree", { return null; }, + __itemsToParentModel(locationId, datasetId, items, model) { + if (this.__datasets.has(datasetId)) { + return; + } + + const datasetModel = model ? model : this.__getDatasetModel(locationId, datasetId); + if (datasetModel) { + datasetModel.getChildren().removeAll(); + if (items.length) { + const locationData = osparc.data.Converters.fromDSMToVirtualTreeModel(locationId, datasetId, items); + const datasetData = locationData[0].children; + datasetData[0].children.forEach(data => { + this.self().attachPathLabel(datasetModel.getPathLabel(), data); + const filesModel = qx.data.marshal.Json.createModel(data, true); + datasetModel.getChildren().append(filesModel); + }); + } + // sort files + osparc.data.Converters.sortModelByLabel(datasetModel); + + this.__rerender(datasetModel); + + this.__datasets.add(datasetId); + this.fireEvent("filesAddedToTree"); + } + + this.__filesReceived(locationId, datasetId, items); + }, + + __getPathModel: function(locationId, path) { + + }, + __itemsToNode: function(files) { const currentModel = this.getModel(); this.self().removeLoadingChild(currentModel); @@ -467,7 +496,7 @@ qx.Class.define("osparc.file.FilesTree", { } }, - __filesToDataset: function(locationId, datasetId, files, model) { + __itemsToDataset: function(locationId, datasetId, files, model) { if (this.__datasets.has(datasetId)) { return; } diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index b609306d75a..fa9c87bd768 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -120,16 +120,11 @@ qx.Class.define("osparc.store.Data", { }); }, - getPathByLocationAndDataset: function(locationId, datasetId) { - const data = { - locationId, - datasetId, - items: [] - }; + getItemsByLocationAndDataset: function(locationId, datasetId) { return new Promise((resolve, reject) => { // Get list of file meta data if (locationId === 1 && !osparc.data.Permissions.getInstance().canDo("storage.datcore.read")) { - reject(data); + reject([]); } const params = { @@ -141,13 +136,14 @@ qx.Class.define("osparc.store.Data", { osparc.data.Resources.fetch("storagePaths", "getPaths", params) .then(pagResp => { if (pagResp["items"] && pagResp["items"].length>0) { - data.items = pagResp["items"]; + resolve(pagResp["items"]); + } else { + resolve([]); } - resolve(data); }) .catch(err => { console.error(err); - reject(data); + reject([]); }); }); }, From 27a690e4315e2f86c7c61ff93340222e5daa1be2 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 13:07:31 +0100 Subject: [PATCH 12/68] [skip ci] minor --- .../source/class/osparc/file/FilesTree.js | 86 +++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 0b70118cc72..425278ef1bc 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -133,11 +133,6 @@ qx.Class.define("osparc.file.FilesTree", { __datasets: null, __loadPaths: null, - __resetChecks: function() { - this.__locations = new Set(); - this.__datasets = new Set(); - }, - resetCache: function() { this.__resetChecks(); @@ -145,6 +140,10 @@ qx.Class.define("osparc.file.FilesTree", { dataStore.resetCache(); }, + populateTree: function() { + return this.__populateLocations(); + }, + populateStudyTree: function(studyId) { const treeName = osparc.product.Utils.getStudyAlias({firstUpperCase: true}) + " Files"; this.__resetTree(treeName); @@ -198,10 +197,6 @@ qx.Class.define("osparc.file.FilesTree", { }); }, - populateTree: function() { - return this.__populateLocations(); - }, - loadFilePath: function(outFileVal) { const locationId = outFileVal.store; let datasetId = "dataset" in outFileVal ? outFileVal.dataset : null; @@ -217,40 +212,9 @@ qx.Class.define("osparc.file.FilesTree", { this.__populateLocations(); }, - __addToLoadFilePath: function(locationId, datasetId, pathId) { - if (datasetId) { - if (!(locationId in this.__loadPaths)) { - this.__loadPaths[locationId] = {}; - } - if (!(datasetId in this.__loadPaths[locationId])) { - this.__loadPaths[locationId][datasetId] = new Set(); - } - this.__loadPaths[locationId][datasetId].add(pathId); - } - }, - - __hasLocationNeedToBeLoaded: function(locationId) { - return (locationId in this.__loadPaths) && (Object.keys(this.__loadPaths[locationId]).length > 0); - }, - - __hasDatasetNeedToBeLoaded: function(locationId, datasetId) { - return (locationId in this.__loadPaths) && (datasetId in this.__loadPaths[locationId]) && (this.__loadPaths[locationId][datasetId].size > 0); - }, - - __filesReceived: function(locationId, datasetId, files) { - if (this.__hasDatasetNeedToBeLoaded(locationId, datasetId)) { - const paths = Array.from(this.__loadPaths[locationId][datasetId]); - for (let i=0; i 0); + }, + + __hasDatasetNeedToBeLoaded: function(locationId, datasetId) { + return (locationId in this.__loadPaths) && (datasetId in this.__loadPaths[locationId]) && (this.__loadPaths[locationId][datasetId].size > 0); + }, + + __filesReceived: function(locationId, datasetId, files) { + if (this.__hasDatasetNeedToBeLoaded(locationId, datasetId)) { + const paths = Array.from(this.__loadPaths[locationId][datasetId]); + for (let i=0; i Date: Wed, 26 Feb 2025 13:16:42 +0100 Subject: [PATCH 13/68] getItemsByLocationAndPath --- .../class/osparc/dashboard/DataBrowser.js | 2 +- .../source/class/osparc/file/FilePicker.js | 2 +- .../source/class/osparc/file/FilesTree.js | 39 ++++++++++--------- .../class/osparc/file/TreeFolderView.js | 2 +- .../client/source/class/osparc/store/Data.js | 6 +-- 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js b/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js index f8ffd3d73d0..79497df778a 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js @@ -113,7 +113,7 @@ qx.Class.define("osparc.dashboard.DataBrowser", { foldersTree.populateTree() .then(datasetPromises => { Promise.all(datasetPromises) - .then(() => foldersTree.requestDatasetFiles(locationId, datasetId)) + .then(() => foldersTree.requestPathItems(locationId, datasetId)) .then(() => openSameFolder()); }) .catch(err => console.error(err)); diff --git a/services/static-webserver/client/source/class/osparc/file/FilePicker.js b/services/static-webserver/client/source/class/osparc/file/FilePicker.js index db9c9e47d1b..1e22dcecceb 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilePicker.js +++ b/services/static-webserver/client/source/class/osparc/file/FilePicker.js @@ -576,7 +576,7 @@ qx.Class.define("osparc.file.FilePicker", { }, this); folderViewer.addListener("requestDatasetFiles", e => { const data = e.getData(); - filesTree.requestDatasetFiles(data.locationId, data.datasetId); + filesTree.requestPathItems(data.locationId, data.datasetId); }, this); const selectBtn = this.__selectButton = new qx.ui.form.Button(this.tr("Select")).set({ diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 425278ef1bc..990a605f5a8 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -151,7 +151,9 @@ qx.Class.define("osparc.file.FilesTree", { this.self().addLoadingChild(studyModel); const dataStore = osparc.store.Data.getInstance(); - return dataStore.getItemsByLocationAndDataset("0", studyId) + const locationId = 0; + const path = studyId; + return dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { if (items.length && "project_name" in items[0]) { this.__resetTree(items[0]["project_name"]); @@ -212,6 +214,22 @@ qx.Class.define("osparc.file.FilesTree", { this.__populateLocations(); }, + requestPathItems: function(locationId, datasetId) { + if (this.__datasets.has(datasetId)) { + return null; + } + + const dataStore = osparc.store.Data.getInstance(); + const path = datasetId; + return dataStore.getItemsByLocationAndPath(locationId, path) + .then(items => { + const parentModel = this.__getDatasetModel(locationId, datasetId); + if (parentModel) { + this.__itemsToParentModel(locationId, datasetId, items); + } + }); + }, + __resetChecks: function() { this.__locations = new Set(); this.__datasets = new Set(); @@ -254,7 +272,7 @@ qx.Class.define("osparc.file.FilesTree", { item.setLoaded(true); const locationId = item.getLocation(); const datasetId = item.getPath(); - this.requestDatasetFiles(locationId, datasetId); + this.requestPathItems(locationId, datasetId); } }, this); item.addListener("dbltap", () => this.__itemSelected(), this); @@ -372,21 +390,6 @@ qx.Class.define("osparc.file.FilesTree", { }); }, - requestDatasetFiles: function(locationId, datasetId) { - if (this.__datasets.has(datasetId)) { - return null; - } - - const dataStore = osparc.store.Data.getInstance(); - return dataStore.getItemsByLocationAndDataset(locationId, datasetId) - .then(items => { - const parentModel = this.__getDatasetModel(locationId, datasetId); - if (parentModel) { - this.__itemsToParentModel(locationId, datasetId, items); - } - }); - }, - __getLocationModel: function(locationId) { const rootModel = this.getModel(); const locationModels = rootModel.getChildren(); @@ -492,7 +495,7 @@ qx.Class.define("osparc.file.FilesTree", { if (openThis) { const datasetId = openThis.getItemId(); this.openNodeAndParents(openThis); - this.requestDatasetFiles(locationId, datasetId); + this.requestPathItems(locationId, datasetId); } }, diff --git a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js index d85836d5ed7..fe3d4db06c5 100644 --- a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js +++ b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js @@ -109,7 +109,7 @@ qx.Class.define("osparc.file.TreeFolderView", { folderViewer.addListener("requestDatasetFiles", e => { const data = e.getData(); - folderTree.requestDatasetFiles(data.locationId, data.datasetId); + folderTree.requestPathItems(data.locationId, data.datasetId); }, this); }, diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index fa9c87bd768..4af5c4d82d8 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -120,7 +120,7 @@ qx.Class.define("osparc.store.Data", { }); }, - getItemsByLocationAndDataset: function(locationId, datasetId) { + getItemsByLocationAndPath: function(locationId, path) { return new Promise((resolve, reject) => { // Get list of file meta data if (locationId === 1 && !osparc.data.Permissions.getInstance().canDo("storage.datcore.read")) { @@ -129,8 +129,8 @@ qx.Class.define("osparc.store.Data", { const params = { url: { - locationId: locationId, - path: datasetId + locationId, + path, } }; osparc.data.Resources.fetch("storagePaths", "getPaths", params) From 87e6abc514080e9f1f0b37d8e6d93beab737dd09 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 13:40:38 +0100 Subject: [PATCH 14/68] remove isDataset --- .../source/class/osparc/data/Converters.js | 31 ++++++++++- .../source/class/osparc/file/FileTreeItem.js | 7 --- .../source/class/osparc/file/FilesTree.js | 53 +++++++++++-------- 3 files changed, 59 insertions(+), 32 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index c5cae8bd25c..670b1fc880c 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -123,7 +123,7 @@ qx.Class.define("osparc.data.Converters", { return children; }, - createDirEntry: function(label, location, path, children = []) { + createDirEntry: function(label, location, path) { if (label === null || label === undefined || label === "") { label = "Unknown label"; } @@ -132,7 +132,34 @@ qx.Class.define("osparc.data.Converters", { location, path, itemId: path, - children + children: [], + }; + }, + + createFileEntry: function(label, location, path, fileMetaData) { + if (label === undefined) { + label = "Unknown label"; + } + if (location === undefined) { + location = "Unknown location"; + } + if (fileId === undefined) { + fileId = "Unknown fileId"; + } + if (lastModified === undefined) { + lastModified = (Math.floor(Math.random()*1000000)+1).toString(); + } + if (size === undefined) { + size = 0; + } + return { + label, + location, + datasetId, + fileId, + itemId: fileId, + lastModified, + size }; }, diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index 5b96a32dc8f..400042c32b8 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -83,13 +83,6 @@ qx.Class.define("osparc.file.FileTreeItem", { nullable: true }, - isDataset: { - check: "Boolean", - event: "changeIsDataset", - init: false, - nullable: false - }, - datasetId: { check: "String", event: "changeDatasetId", diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 990a605f5a8..cec0af0b93c 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -223,9 +223,9 @@ qx.Class.define("osparc.file.FilesTree", { const path = datasetId; return dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { - const parentModel = this.__getDatasetModel(locationId, datasetId); + const parentModel = this.__getModelFromPath(locationId, path); if (parentModel) { - this.__itemsToParentModel(locationId, datasetId, items); + this.__itemsToParentModel(locationId, datasetId, items, parentModel); } }); }, @@ -256,7 +256,6 @@ qx.Class.define("osparc.file.FilesTree", { c.bindProperty("itemId", "itemId", null, item, id); c.bindProperty("fileId", "fileId", null, item, id); c.bindProperty("location", "location", null, item, id); - c.bindProperty("isDataset", "isDataset", null, item, id); c.bindProperty("datasetId", "datasetId", null, item, id); c.bindProperty("loaded", "loaded", null, item, id); c.bindProperty("path", "path", null, item, id); @@ -268,7 +267,7 @@ qx.Class.define("osparc.file.FilesTree", { configureItem: item => { const openButton = item.getChildControl("open"); openButton.addListener("tap", () => { - if (item.isOpen() && !item.getLoaded() && item.getIsDataset()) { + if (item.isOpen() && !item.getLoaded()) { item.setLoaded(true); const locationId = item.getLocation(); const datasetId = item.getPath(); @@ -402,39 +401,48 @@ qx.Class.define("osparc.file.FilesTree", { return null; }, - __getDatasetModel: function(locationId, datasetId) { + __getModelFromPath: function(locationId, path) { const locationModel = this.__getLocationModel(locationId); const datasetModels = locationModel.getChildren(); for (let i=0; i { - this.self().attachPathLabel(datasetModel.getPathLabel(), data); - const filesModel = qx.data.marshal.Json.createModel(data, true); - datasetModel.getChildren().append(filesModel); - }); - } + if (parentModel) { + parentModel.getChildren().removeAll(); + items.forEach(item => { + let data = null; + if (item["file_meta_data"]) { + data = osparc.data.Converters.createFileEntry( + item["display_path"], + locationId, + item["path"], + item["file_meta_data"], + ); + } else { + data = osparc.data.Converters.createDirEntry( + item["display_path"], + locationId, + item["path"] + ); + } + const dirModel = qx.data.marshal.Json.createModel(data, true); + parentModel.getChildren().append(dirModel); + }); // sort files - osparc.data.Converters.sortModelByLabel(datasetModel); + osparc.data.Converters.sortModelByLabel(parentModel); - this.__rerender(datasetModel); + this.__rerender(parentModel); this.__datasets.add(datasetId); this.fireEvent("filesAddedToTree"); @@ -474,7 +482,6 @@ qx.Class.define("osparc.file.FilesTree", { locationId, dataset["path"] ); - datasetData.isDataset = true; datasetData.loaded = false; datasetData["pathLabel"] = locationModel.getPathLabel().concat(datasetData["label"]); const datasetModel = qx.data.marshal.Json.createModel(datasetData, true); @@ -504,7 +511,7 @@ qx.Class.define("osparc.file.FilesTree", { return; } - const datasetModel = model ? model : this.__getDatasetModel(locationId, datasetId); + const datasetModel = model ? model : this.__getModelFromPath(locationId, datasetId); if (datasetModel) { datasetModel.getChildren().removeAll(); if (files.length) { From 8723ba5b2d6ca17b50924016e7ad245b9a416e30 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 13:48:06 +0100 Subject: [PATCH 15/68] minor --- .../source/class/osparc/data/Converters.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 670b1fc880c..12941394a85 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -123,12 +123,13 @@ qx.Class.define("osparc.data.Converters", { return children; }, - createDirEntry: function(label, location, path) { - if (label === null || label === undefined || label === "") { - label = "Unknown label"; + createDirEntry: function(displayPath, location, path) { + if (displayPath === null || displayPath === undefined || displayPath === "") { + displayPath = "Unknown label"; } return { - label, + label: displayPath.split("/").slice(-1).pop(), // take last part of the display name + displayPath, location, path, itemId: path, @@ -136,9 +137,9 @@ qx.Class.define("osparc.data.Converters", { }; }, - createFileEntry: function(label, location, path, fileMetaData) { - if (label === undefined) { - label = "Unknown label"; + createFileEntry: function(displayPath, location, path, fileMetaData) { + if (displayPath === undefined) { + displayPath = "Unknown label"; } if (location === undefined) { location = "Unknown location"; @@ -153,11 +154,11 @@ qx.Class.define("osparc.data.Converters", { size = 0; } return { - label, + label: displayPath.split("/").slice(-1).pop(), // take last part of the display name location, datasetId, - fileId, - itemId: fileId, + fileId: path, + itemId: path, lastModified, size }; From 57a4b7d282d259cecc431736d5319fccd816b4c2 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 14:09:49 +0100 Subject: [PATCH 16/68] fixes --- .../client/source/class/osparc/file/FolderViewer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 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 914709dbcdd..3604e2b0fe0 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderViewer.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderViewer.js @@ -42,11 +42,11 @@ qx.Class.define("osparc.file.FolderViewer", { const selectedFileLayout = this.getChildControl("selected-file-layout"); this.bind("folder", this.getChildControl("folder-up"), "enabled", { - converter: folder => Boolean(folder && folder.getPathLabel && folder.getPathLabel().length > 1) + converter: folder => Boolean(folder && folder.getDisplayPath && folder.getDisplayPath()) }); this.bind("folder", this.getChildControl("folder-path"), "value", { - converter: folder => folder ? folder.getPathLabel().join(" / ") : this.tr("Select folder") + converter: folder => folder && folder.getDisplayPath ? folder.getDisplayPath() : this.tr("Select folder") }); this.bind("folder", folderContent, "folder"); From f7add5c27a7a511079546d199e5335e6b91e82c6 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 14:10:17 +0100 Subject: [PATCH 17/68] [skip ci] displayPaths --- .../source/class/osparc/data/Converters.js | 1 + .../source/class/osparc/file/FileTreeItem.js | 6 +++++ .../source/class/osparc/file/FilesTree.js | 25 ++++++++++--------- .../client/source/class/osparc/store/Data.js | 6 ++--- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 12941394a85..0bd87aeaec5 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -155,6 +155,7 @@ qx.Class.define("osparc.data.Converters", { } return { label: displayPath.split("/").slice(-1).pop(), // take last part of the display name + displayPath, location, datasetId, fileId: path, diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index 400042c32b8..75e688f7b77 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -70,6 +70,12 @@ qx.Class.define("osparc.file.FileTreeItem", { nullable: true }, + displayPath: { + check: "String", + event: "changeDisplayPath", + nullable: true + }, + pathLabel: { check: "Array", event: "changePathLabel", diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index cec0af0b93c..497259a939f 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -254,6 +254,7 @@ qx.Class.define("osparc.file.FilesTree", { bindItem: (c, item, id) => { c.bindDefaultProperties(item, id); c.bindProperty("itemId", "itemId", null, item, id); + c.bindProperty("displayPath", "displayPath", null, item, id); c.bindProperty("fileId", "fileId", null, item, id); c.bindProperty("location", "location", null, item, id); c.bindProperty("datasetId", "datasetId", null, item, id); @@ -270,8 +271,8 @@ qx.Class.define("osparc.file.FilesTree", { if (item.isOpen() && !item.getLoaded()) { item.setLoaded(true); const locationId = item.getLocation(); - const datasetId = item.getPath(); - this.requestPathItems(locationId, datasetId); + const path = item.getPath(); + this.requestPathItems(locationId, path); } }, this); item.addListener("dbltap", () => this.__itemSelected(), this); @@ -381,10 +382,10 @@ qx.Class.define("osparc.file.FilesTree", { .then(data => { const { location, - datasets + items, } = data; if (location === locationId && !this.__locations.has(locationId)) { - this.__datasetsToLocation(location, datasets); + this.__itemsToLocation(location, items); } }); }, @@ -468,7 +469,7 @@ qx.Class.define("osparc.file.FilesTree", { return newModelToAdd; }, - __datasetsToLocation: function(locationId, datasets) { + __itemsToLocation: function(locationId, items) { const locationModel = this.__getLocationModel(locationId); if (!locationModel) { return; @@ -476,11 +477,11 @@ qx.Class.define("osparc.file.FilesTree", { this.__locations.add(locationId); locationModel.getChildren().removeAll(); let openThis = null; - datasets.forEach(dataset => { + items.forEach(item => { const datasetData = osparc.data.Converters.createDirEntry( - dataset["display_path"], + item["display_path"], locationId, - dataset["path"] + item["path"] ); datasetData.loaded = false; datasetData["pathLabel"] = locationModel.getPathLabel().concat(datasetData["label"]); @@ -489,8 +490,8 @@ qx.Class.define("osparc.file.FilesTree", { locationModel.getChildren().append(datasetModel); // add cached files - const datasetId = dataset["path"]; - if (this.__hasDatasetNeedToBeLoaded(locationId, datasetId)) { + const path = item["path"]; + if (this.__hasDatasetNeedToBeLoaded(locationId, path)) { openThis = datasetModel; } }); @@ -500,9 +501,9 @@ qx.Class.define("osparc.file.FilesTree", { this.__rerender(locationModel); if (openThis) { - const datasetId = openThis.getItemId(); + const path = openThis.getItemId(); this.openNodeAndParents(openThis); - this.requestPathItems(locationId, datasetId); + this.requestPathItems(locationId, path); } }, diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index 4af5c4d82d8..91904cc3b19 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -87,7 +87,7 @@ qx.Class.define("osparc.store.Data", { getDatasetsByLocation: function(locationId) { const data = { location: locationId, - datasets: [] + items: [] }; return new Promise((resolve, reject) => { if (locationId === 1 && !osparc.data.Permissions.getInstance().canDo("storage.datcore.read")) { @@ -106,10 +106,10 @@ qx.Class.define("osparc.store.Data", { osparc.data.Resources.fetch("storagePaths", "getDatasets", params) .then(pagResp => { if (pagResp["items"] && pagResp["items"].length>0) { - data.datasets = pagResp["items"]; + data.items = pagResp["items"]; } // Add it to cache - this.__datasetsByLocationCached[locationId] = data.datasets; + this.__datasetsByLocationCached[locationId] = data.items; resolve(data); }) .catch(err => { From 8f10d094bf61c34d82f259a7e759a9209ed2d00d Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 14:27:16 +0100 Subject: [PATCH 18/68] addLoadingChild --- .../client/source/class/osparc/file/FilesTree.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 497259a939f..c76e4bf259d 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -423,7 +423,8 @@ qx.Class.define("osparc.file.FilesTree", { parentModel.getChildren().removeAll(); items.forEach(item => { let data = null; - if (item["file_meta_data"]) { + const isFile = Boolean(item["file_meta_data"]) + if (isFile) { data = osparc.data.Converters.createFileEntry( item["display_path"], locationId, @@ -436,9 +437,13 @@ qx.Class.define("osparc.file.FilesTree", { locationId, item["path"] ); + data.loaded = false; + } + const model = qx.data.marshal.Json.createModel(data, true); + parentModel.getChildren().append(model); + if (!isFile) { + this.self().addLoadingChild(model); } - const dirModel = qx.data.marshal.Json.createModel(data, true); - parentModel.getChildren().append(dirModel); }); // sort files osparc.data.Converters.sortModelByLabel(parentModel); From 24248f2227607e17b691656d1cf4963aa2b06b16 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 14:59:11 +0100 Subject: [PATCH 19/68] __pathModels --- .../source/class/osparc/file/FilesTree.js | 70 ++++++++++--------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index c76e4bf259d..91be23820fc 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -59,6 +59,7 @@ qx.Class.define("osparc.file.FilesTree", { } }, this); + this.__pathModels = []; this.__loadPaths = {}; }, @@ -130,7 +131,8 @@ qx.Class.define("osparc.file.FilesTree", { members: { __locations: null, - __datasets: null, + __paths: null, + __pathModels: null, __loadPaths: null, resetCache: function() { @@ -214,25 +216,24 @@ qx.Class.define("osparc.file.FilesTree", { this.__populateLocations(); }, - requestPathItems: function(locationId, datasetId) { - if (this.__datasets.has(datasetId)) { - return null; + requestPathItems: function(locationId, path) { + if (this.__paths.has(path)) { + return; } const dataStore = osparc.store.Data.getInstance(); - const path = datasetId; - return dataStore.getItemsByLocationAndPath(locationId, path) + dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { const parentModel = this.__getModelFromPath(locationId, path); if (parentModel) { - this.__itemsToParentModel(locationId, datasetId, items, parentModel); + this.__itemsToParentModel(locationId, path, items, parentModel); } }); }, __resetChecks: function() { this.__locations = new Set(); - this.__datasets = new Set(); + this.__paths = new Set(); }, __resetTree: function(treeName, itemId) { @@ -403,45 +404,54 @@ qx.Class.define("osparc.file.FilesTree", { }, __getModelFromPath: function(locationId, path) { - const locationModel = this.__getLocationModel(locationId); - const datasetModels = locationModel.getChildren(); - for (let i=0; i entry["locationId"] === locationId && entry["path"] === path); + if (modelFound) { + return modelFound["model"]; } return null; }, + __createModel: function(locationId, path, data) { + const model = qx.data.marshal.Json.createModel(data, true); + this.__pathModels.push({ + locationId, + path, + model, + }); + return model; + }, + __itemsToParentModel(locationId, datasetId, items, parentModel) { - if (this.__datasets.has(datasetId)) { + if (this.__paths.has(datasetId)) { return; } if (parentModel) { parentModel.getChildren().removeAll(); items.forEach(item => { - let data = null; - const isFile = Boolean(item["file_meta_data"]) - if (isFile) { - data = osparc.data.Converters.createFileEntry( + if (item["file_meta_data"]) { + const data = osparc.data.Converters.createFileEntry( item["display_path"], locationId, item["path"], item["file_meta_data"], ); + const model = this.__createModel(locationId, item["path"], data); + parentModel.getChildren().append(model); } else { - data = osparc.data.Converters.createDirEntry( + const data = osparc.data.Converters.createDirEntry( item["display_path"], locationId, item["path"] ); data.loaded = false; - } - const model = qx.data.marshal.Json.createModel(data, true); - parentModel.getChildren().append(model); - if (!isFile) { + const model = this.__createModel(locationId, item["path"], data); + this.__pathModels.push({ + locationId, + path: item["path"], + model, + }); + parentModel.getChildren().append(model); this.self().addLoadingChild(model); } }); @@ -450,17 +460,13 @@ qx.Class.define("osparc.file.FilesTree", { this.__rerender(parentModel); - this.__datasets.add(datasetId); + this.__paths.add(datasetId); this.fireEvent("filesAddedToTree"); } this.__filesReceived(locationId, datasetId, items); }, - __getPathModel: function(locationId, path) { - - }, - __itemsToNode: function(files) { const currentModel = this.getModel(); this.self().removeLoadingChild(currentModel); @@ -513,7 +519,7 @@ qx.Class.define("osparc.file.FilesTree", { }, __itemsToDataset: function(locationId, datasetId, files, model) { - if (this.__datasets.has(datasetId)) { + if (this.__paths.has(datasetId)) { return; } @@ -534,7 +540,7 @@ qx.Class.define("osparc.file.FilesTree", { this.__rerender(datasetModel); - this.__datasets.add(datasetId); + this.__paths.add(datasetId); this.fireEvent("filesAddedToTree"); } From d3004913478116717ba86b223b6efeb75746daca Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 15:10:46 +0100 Subject: [PATCH 20/68] more progress --- .../source/class/osparc/data/Converters.js | 23 ++++--------------- .../source/class/osparc/file/FilesTree.js | 23 ++++--------------- 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 0bd87aeaec5..16c5f18edfc 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -138,30 +138,15 @@ qx.Class.define("osparc.data.Converters", { }, createFileEntry: function(displayPath, location, path, fileMetaData) { - if (displayPath === undefined) { - displayPath = "Unknown label"; - } - if (location === undefined) { - location = "Unknown location"; - } - if (fileId === undefined) { - fileId = "Unknown fileId"; - } - if (lastModified === undefined) { - lastModified = (Math.floor(Math.random()*1000000)+1).toString(); - } - if (size === undefined) { - size = 0; - } return { label: displayPath.split("/").slice(-1).pop(), // take last part of the display name displayPath, location, - datasetId, - fileId: path, + path, itemId: path, - lastModified, - size + fileId: fileMetaData["file_uuid"], + lastModified: fileMetaData["last_modified"], + size: fileMetaData["file_size"], }; }, diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 91be23820fc..0a32fa41b2f 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -131,7 +131,6 @@ qx.Class.define("osparc.file.FilesTree", { members: { __locations: null, - __paths: null, __pathModels: null, __loadPaths: null, @@ -217,10 +216,6 @@ qx.Class.define("osparc.file.FilesTree", { }, requestPathItems: function(locationId, path) { - if (this.__paths.has(path)) { - return; - } - const dataStore = osparc.store.Data.getInstance(); dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { @@ -233,7 +228,6 @@ qx.Class.define("osparc.file.FilesTree", { __resetChecks: function() { this.__locations = new Set(); - this.__paths = new Set(); }, __resetTree: function(treeName, itemId) { @@ -322,7 +316,7 @@ qx.Class.define("osparc.file.FilesTree", { "" ); locationData["pathLabel"] = rootModel.getPathLabel().concat(locationData["label"]); - const locationModel = qx.data.marshal.Json.createModel(locationData, true); + const locationModel = this.__createModel(location.id, null, locationData); rootModel.getChildren().append(locationModel); if (this.__hasLocationNeedToBeLoaded(location.id)) { openThis = locationModel; @@ -404,7 +398,7 @@ qx.Class.define("osparc.file.FilesTree", { }, __getModelFromPath: function(locationId, path) { - const modelFound = this.__pathModels.find(entry => entry["locationId"] === locationId && entry["path"] === path); + const modelFound = this.__pathModels.find(entry => entry["locationId"] == locationId && entry["path"] === path); if (modelFound) { return modelFound["model"]; } @@ -422,10 +416,6 @@ qx.Class.define("osparc.file.FilesTree", { }, __itemsToParentModel(locationId, datasetId, items, parentModel) { - if (this.__paths.has(datasetId)) { - return; - } - if (parentModel) { parentModel.getChildren().removeAll(); items.forEach(item => { @@ -460,7 +450,6 @@ qx.Class.define("osparc.file.FilesTree", { this.__rerender(parentModel); - this.__paths.add(datasetId); this.fireEvent("filesAddedToTree"); } @@ -496,7 +485,7 @@ qx.Class.define("osparc.file.FilesTree", { ); datasetData.loaded = false; datasetData["pathLabel"] = locationModel.getPathLabel().concat(datasetData["label"]); - const datasetModel = qx.data.marshal.Json.createModel(datasetData, true); + const datasetModel = this.__createModel(locationId, item["path"], datasetData); this.self().addLoadingChild(datasetModel); locationModel.getChildren().append(datasetModel); @@ -519,14 +508,11 @@ qx.Class.define("osparc.file.FilesTree", { }, __itemsToDataset: function(locationId, datasetId, files, model) { - if (this.__paths.has(datasetId)) { - return; - } - const datasetModel = model ? model : this.__getModelFromPath(locationId, datasetId); if (datasetModel) { datasetModel.getChildren().removeAll(); if (files.length) { + // OM here const locationData = osparc.data.Converters.fromDSMToVirtualTreeModel(locationId, datasetId, files); const datasetData = locationData[0].children; datasetData[0].children.forEach(data => { @@ -540,7 +526,6 @@ qx.Class.define("osparc.file.FilesTree", { this.__rerender(datasetModel); - this.__paths.add(datasetId); this.fireEvent("filesAddedToTree"); } From d0d826204060e3733d34bb177ed9526190060b9d Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 16:15:30 +0100 Subject: [PATCH 21/68] __itemsToTree --- .../client/source/class/osparc/file/FilesTree.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 0a32fa41b2f..bb0fd75a388 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -219,10 +219,7 @@ qx.Class.define("osparc.file.FilesTree", { const dataStore = osparc.store.Data.getInstance(); dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { - const parentModel = this.__getModelFromPath(locationId, path); - if (parentModel) { - this.__itemsToParentModel(locationId, path, items, parentModel); - } + this.__itemsToTree(locationId, path, items); }); }, @@ -415,7 +412,8 @@ qx.Class.define("osparc.file.FilesTree", { return model; }, - __itemsToParentModel(locationId, datasetId, items, parentModel) { + __itemsToTree: function(locationId, path, items) { + const parentModel = this.__getModelFromPath(locationId, path); if (parentModel) { parentModel.getChildren().removeAll(); items.forEach(item => { @@ -453,7 +451,7 @@ qx.Class.define("osparc.file.FilesTree", { this.fireEvent("filesAddedToTree"); } - this.__filesReceived(locationId, datasetId, items); + this.__filesReceived(locationId, path, items); }, __itemsToNode: function(files) { From 2b5c4a7b36f75f4ea87545f993a82eaa201bf497 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 16:19:20 +0100 Subject: [PATCH 22/68] rename function --- .../class/osparc/dashboard/DataBrowser.js | 6 +- .../class/osparc/desktop/WorkbenchView.js | 4 +- .../source/class/osparc/file/FilePicker.js | 2 +- .../source/class/osparc/file/FilesTree.js | 58 +++++++++---------- .../source/class/osparc/widget/NodesTree.js | 6 +- .../class/osparc/widget/StudyTitleOnlyTree.js | 2 +- 6 files changed, 37 insertions(+), 41 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js b/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js index 79497df778a..8cf1c4be319 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js @@ -60,7 +60,7 @@ qx.Class.define("osparc.dashboard.DataBrowser", { this.addListener("appear", () => { const treeFolderView = this.getChildControl("tree-folder-view"); - treeFolderView.getChildControl("folder-tree").populateTree(); + treeFolderView.getChildControl("folder-tree").populateLocations(); treeFolderView.getChildControl("folder-viewer").setFolder(treeFolderView.getChildControl("folder-tree").getModel()); }, this); }, @@ -84,7 +84,7 @@ qx.Class.define("osparc.dashboard.DataBrowser", { const foldersTree = treeFolderView.getChildControl("folder-tree"); foldersTree.resetCache(); - foldersTree.populateTree(); + foldersTree.populateLocations(); const folderViewer = treeFolderView.getChildControl("folder-viewer"); folderViewer.resetFolder(); @@ -110,7 +110,7 @@ qx.Class.define("osparc.dashboard.DataBrowser", { const locationId = fileMetadata["locationId"]; const datasetId = path[0]; foldersTree.resetCache(); - foldersTree.populateTree() + foldersTree.populateLocations() .then(datasetPromises => { Promise.all(datasetPromises) .then(() => foldersTree.requestPathItems(locationId, datasetId)) diff --git a/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js b/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js index 603b746dc76..7900f68c012 100644 --- a/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js +++ b/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js @@ -369,7 +369,7 @@ qx.Class.define("osparc.desktop.WorkbenchView", { dragMechanism: true, hideRoot: true }); - filesTree.populateTree(); + filesTree.populateLocations(); const storagePage = this.__storagePage = this.__createTabPage("@FontAwesome5Solid/database", this.tr("Storage"), filesTree, this.self().PRIMARY_COL_BG_COLOR); tabViewPrimary.add(storagePage); @@ -1177,7 +1177,7 @@ qx.Class.define("osparc.desktop.WorkbenchView", { }, __workbenchChanged: function() { - this.__nodesTree.populateTree(); + this.__nodesTree.populateLocations(); this.__nodesTree.nodeSelected(this.__currentNodeId); }, diff --git a/services/static-webserver/client/source/class/osparc/file/FilePicker.js b/services/static-webserver/client/source/class/osparc/file/FilePicker.js index 1e22dcecceb..776b216574b 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilePicker.js +++ b/services/static-webserver/client/source/class/osparc/file/FilePicker.js @@ -274,7 +274,7 @@ qx.Class.define("osparc.file.FilePicker", { if (this.__filesTree) { this.__selectedFileFound = false; this.__filesTree.resetCache(); - this.__filesTree.populateTree(); + this.__filesTree.populateLocations(); } }, diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index bb0fd75a388..d2afe265ad6 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -141,8 +141,32 @@ qx.Class.define("osparc.file.FilesTree", { dataStore.resetCache(); }, - populateTree: function() { - return this.__populateLocations(); + populateLocations: function() { + this.__resetChecks(); + + const treeName = "My Data"; + this.__resetTree(treeName); + const rootModel = this.getModel(); + rootModel.getChildren().removeAll(); + this.self().addLoadingChild(rootModel); + + this.set({ + hideRoot: true + }); + const dataStore = osparc.store.Data.getInstance(); + return dataStore.getLocations() + .then(locations => { + const datasetPromises = []; + if (this.__locations.size === 0) { + this.__resetChecks(); + this.__locationsToRoot(locations); + for (let i=0; i { - const datasetPromises = []; - if (this.__locations.size === 0) { - this.__resetChecks(); - this.__locationsToRoot(locations); - for (let i=0; i this.populateTree(), this); + node.addListener("keyChanged", () => this._populateTree(), this); } }, configureItem: item => { diff --git a/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js b/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js index 6d3499b2364..31afc33c124 100644 --- a/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js +++ b/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js @@ -28,7 +28,7 @@ qx.Class.define("osparc.widget.StudyTitleOnlyTree", { members: { // override - populateTree: function() { + _populateTree: function() { const study = this.getStudy(); const newModel = osparc.widget.NodesTree.createStudyModel(study); this.setModel(newModel); From 49234f5be8258bfa8d7209cd685df146d6a2d47d Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 17:01:53 +0100 Subject: [PATCH 23/68] more itemsToTree --- .../source/class/osparc/file/FilesTree.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index d2afe265ad6..2392e7984ff 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -172,7 +172,7 @@ qx.Class.define("osparc.file.FilesTree", { populateStudyTree: function(studyId) { const treeName = osparc.product.Utils.getStudyAlias({firstUpperCase: true}) + " Files"; this.__resetTree(treeName); - let studyModel = this.getModel(); + const studyModel = this.getModel(); this.self().addLoadingChild(studyModel); const dataStore = osparc.store.Data.getInstance(); @@ -180,11 +180,11 @@ qx.Class.define("osparc.file.FilesTree", { const path = studyId; return dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { - if (items.length && "project_name" in items[0]) { - this.__resetTree(items[0]["project_name"]); + if (items.length) { + const studyName = items[0]["display_path"].split("/")[0] + this.__resetTree(studyName); } - studyModel = this.getModel(); - this.__itemsToDataset("0", studyId, items, studyModel); + this.__itemsToTree(locationId, path, items, studyModel); // select study item this.setSelection(new qx.data.Array([studyModel])); @@ -236,6 +236,7 @@ qx.Class.define("osparc.file.FilesTree", { } } this.__addToLoadFilePath(locationId, datasetId, pathId); + this.populateLocations(); }, @@ -408,8 +409,10 @@ qx.Class.define("osparc.file.FilesTree", { return model; }, - __itemsToTree: function(locationId, path, items) { - const parentModel = this.__getModelFromPath(locationId, path); + __itemsToTree: function(locationId, path, items, parentModel) { + if (!parentModel) { + parentModel = this.__getModelFromPath(locationId, path); + } if (parentModel) { parentModel.getChildren().removeAll(); items.forEach(item => { @@ -430,12 +433,12 @@ qx.Class.define("osparc.file.FilesTree", { ); data.loaded = false; const model = this.__createModel(locationId, item["path"], data); + parentModel.getChildren().append(model); this.__pathModels.push({ locationId, path: item["path"], model, }); - parentModel.getChildren().append(model); this.self().addLoadingChild(model); } }); From 7b686666ecc416c181aef15b1285a7f31c72c117 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 17:06:32 +0100 Subject: [PATCH 24/68] faster --- .../client/source/class/osparc/file/FilesTree.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 2392e7984ff..0699585787e 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -181,8 +181,8 @@ qx.Class.define("osparc.file.FilesTree", { return dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { if (items.length) { - const studyName = items[0]["display_path"].split("/")[0] - this.__resetTree(studyName); + const studyName = items[0]["display_path"].split("/")[0]; + studyModel.setLabel(studyName); } this.__itemsToTree(locationId, path, items, studyModel); From 4168b881bff452942947857e64a8087d9f6a1285 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 17:08:55 +0100 Subject: [PATCH 25/68] unused --- .../source/class/osparc/file/FilesTree.js | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 0699585787e..7657b787266 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -504,31 +504,6 @@ qx.Class.define("osparc.file.FilesTree", { } }, - __itemsToDataset: function(locationId, datasetId, files, model) { - const datasetModel = model ? model : this.__getModelFromPath(locationId, datasetId); - if (datasetModel) { - datasetModel.getChildren().removeAll(); - if (files.length) { - // OM here - const locationData = osparc.data.Converters.fromDSMToVirtualTreeModel(locationId, datasetId, files); - const datasetData = locationData[0].children; - datasetData[0].children.forEach(data => { - this.self().attachPathLabel(datasetModel.getPathLabel(), data); - const filesModel = qx.data.marshal.Json.createModel(data, true); - datasetModel.getChildren().append(filesModel); - }); - } - // sort files - osparc.data.Converters.sortModelByLabel(datasetModel); - - this.__rerender(datasetModel); - - this.fireEvent("filesAddedToTree"); - } - - this.__filesReceived(locationId, datasetId, files); - }, - __rerender: function(item) { // Hack to trigger a rebuild of the item. // Without this sometimes the arrow giving access to the children is not rendered From a2daad802c2bb3682a3197ee61d89afeb1e6eb50 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 17:20:51 +0100 Subject: [PATCH 26/68] StudyDataManager --- .../class/osparc/desktop/WorkbenchView.js | 6 ++-- .../source/class/osparc/file/FilesTree.js | 35 ++++++------------- .../client/source/class/osparc/store/Data.js | 25 ------------- .../class/osparc/widget/StudyDataManager.js | 26 +++++--------- 4 files changed, 22 insertions(+), 70 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js b/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js index 7900f68c012..b7178d0ff73 100644 --- a/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js +++ b/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js @@ -54,8 +54,8 @@ qx.Class.define("osparc.desktop.WorkbenchView", { }); }, - openStudyDataManager: function(node) { - const win = osparc.widget.StudyDataManager.popUpInWindow(null, node.getNodeId(), node.getLabel()); + openNodeDataManager: function(node) { + const win = osparc.widget.StudyDataManager.popUpInWindow(node.getStudy().getUuid(), node.getNodeId(), node.getLabel()); const closeBtn = win.getChildControl("close-button"); osparc.utils.Utils.setIdToWidget(closeBtn, "nodeDataManagerCloseBtn"); } @@ -1046,7 +1046,7 @@ qx.Class.define("osparc.desktop.WorkbenchView", { allowGrowY: false }); osparc.utils.Utils.setIdToWidget(nodeFilesBtn, "nodeFilesBtn"); - nodeFilesBtn.addListener("execute", () => this.self().openStudyDataManager(node)); + nodeFilesBtn.addListener("execute", () => this.self().openNodeDataManager(node)); outputsBox.add(nodeFilesBtn); const outputs = new osparc.desktop.PanelView(this.tr("Outputs"), outputsBox); diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 7657b787266..5f00cf32233 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -186,41 +186,26 @@ qx.Class.define("osparc.file.FilesTree", { } this.__itemsToTree(locationId, path, items, studyModel); - // select study item this.setSelection(new qx.data.Array([studyModel])); this.__selectionChanged(); }); }, - populateNodeTree(nodeId) { + populateNodeTree(studyId, nodeId) { const treeName = "Node Files"; this.__resetTree(treeName); - const rootModel = this.getModel(); - this.self().addLoadingChild(rootModel); + const nodeModel = this.getModel(); + this.self().addLoadingChild(nodeModel); const dataStore = osparc.store.Data.getInstance(); - return dataStore.getNodeFiles(nodeId) - .then(files => { - const newChildren = osparc.data.Converters.fromDSMToVirtualTreeModel(0, null, files); - if (newChildren.length && // location - newChildren[0].children.length && // study - newChildren[0].children[0].children.length) { // node - const nodeData = newChildren[0].children[0].children[0]; - const nodeTreeName = nodeData.label; - this.__resetTree(nodeTreeName, nodeId); - const rootNodeModel = this.getModel(); - if (nodeData.children.length) { - const nodeItemsOnly = nodeData.children; - this.__itemsToNode(nodeItemsOnly); - } - this.openNode(rootNodeModel); + const locationId = 0; + const path = encodeURIComponent(studyId) + "/" + encodeURIComponent(nodeId); + return dataStore.getItemsByLocationAndPath(locationId, path) + .then(items => { + this.__itemsToTree(0, path, items, nodeModel); - // select node item - this.setSelection(new qx.data.Array([rootNodeModel])); - this.__selectionChanged(); - } else { - rootModel.getChildren().removeAll(); - } + this.setSelection(new qx.data.Array([nodeModel])); + this.__selectionChanged(); }); }, diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index 91904cc3b19..f4f71df1723 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -148,31 +148,6 @@ qx.Class.define("osparc.store.Data", { }); }, - getNodeFiles: function(nodeId) { - return new Promise((resolve, reject) => { - const nodePath = encodeURIComponent(nodeId); - const params = { - url: { - locationId: 0, - path: nodePath, - } - }; - osparc.data.Resources.fetch("storagePaths", "getPaths", params) - .then(files => { - console.log("Node Files", files); - if (files && files.length>0) { - resolve(files); - } else { - resolve([]); - } - }) - .catch(err => { - console.error(err); - reject([]); - }); - }); - }, - getPresignedLink: function(download = true, locationId, fileUuid, fileSize) { return new Promise((resolve, reject) => { if (download && !osparc.data.Permissions.getInstance().canDo("study.node.data.pull", true)) { diff --git a/services/static-webserver/client/source/class/osparc/widget/StudyDataManager.js b/services/static-webserver/client/source/class/osparc/widget/StudyDataManager.js index 2626265b0cf..4671432bfad 100644 --- a/services/static-webserver/client/source/class/osparc/widget/StudyDataManager.js +++ b/services/static-webserver/client/source/class/osparc/widget/StudyDataManager.js @@ -42,16 +42,10 @@ qx.Class.define("osparc.widget.StudyDataManager", { this._setLayout(new qx.ui.layout.VBox(10)); - if (studyId) { - this.set({ - studyId - }); - } + this.setStudyId(studyId); if (nodeId) { - this.set({ - nodeId - }); + this.setNodeId(nodeId); } this.__buildLayout(); @@ -113,11 +107,10 @@ qx.Class.define("osparc.widget.StudyDataManager", { const foldersTree = treeFolderView.getChildControl("folder-tree"); foldersTree.resetCache(); - if (this.getStudyId()) { - foldersTree.populateStudyTree(this.getStudyId()); - } if (this.getNodeId()) { - foldersTree.populateNodeTree(this.getNodeId()); + foldersTree.populateNodeTree(this.getStudyId(), this.getNodeId()); + } else if (this.getStudyId()) { + foldersTree.populateStudyTree(this.getStudyId()); } const folderViewer = treeFolderView.getChildControl("folder-viewer"); @@ -144,13 +137,12 @@ qx.Class.define("osparc.widget.StudyDataManager", { treeFolderView.openPath(path); }; - if (this.getStudyId()) { - foldersTree.populateStudyTree(this.getStudyId()) + if (this.getNodeId()) { + foldersTree.populateNodeTree(this.getStudyId(), this.getNodeId()) .then(() => openSameFolder()) .catch(err => console.error(err)); - } - if (this.getNodeId()) { - foldersTree.populateNodeTree(this.getNodeId()) + } else if (this.getStudyId()) { + foldersTree.populateStudyTree(this.getStudyId()) .then(() => openSameFolder()) .catch(err => console.error(err)); } From 326b50cee90c263fe12f3902b8b8ec61a8d85844 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 17:22:11 +0100 Subject: [PATCH 27/68] [skip ci] finally deprecated --- .../source/class/osparc/data/Converters.js | 114 ------------------ 1 file changed, 114 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 16c5f18edfc..f6394805aca 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -24,40 +24,6 @@ qx.Class.define("osparc.data.Converters", { type: "static", statics: { - __mergeFileTreeChildren: function(one, two) { - let newDir = true; - for (let i=0; i { - if (a["label"] > b["label"]) { - return 1; - } - if (a["label"] < b["label"]) { - return -1; - } - return 0; - }); - children.forEach(child => { - if ("children" in child) { - this.sortFiles(child["children"]); - } - }); - } - }, - sortModelByLabel: function(model) { model.getChildren().sort((a, b) => { if (a.getLabel() > b.getLabel()) { @@ -70,59 +36,6 @@ qx.Class.define("osparc.data.Converters", { }); }, - fromDSMToVirtualTreeModel: function(datasetId, files) { - let children = []; - for (let i=0; i Date: Wed, 26 Feb 2025 17:57:20 +0100 Subject: [PATCH 28/68] isFile --- .../client/source/class/osparc/file/FilesTree.js | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 5f00cf32233..4e9e90dcb2d 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -84,21 +84,14 @@ qx.Class.define("osparc.file.FilesTree", { statics: { isDir: function(item) { - let isDir = false; - if (item["get"+qx.lang.String.firstUp("path")]) { - if (item.getPath() !== null) { - isDir = true; - } - } - return isDir; + return !this.isFile(item); }, isFile: function(item) { - let isFile = false; if (item["set"+qx.lang.String.firstUp("fileId")]) { - isFile = true; + return true; } - return isFile; + return false; }, addLoadingChild: function(parent) { From ec7642cc61bd3349d7564c7a17ea02570e88f92c Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 26 Feb 2025 18:04:09 +0100 Subject: [PATCH 29/68] [skip ci] clean up and comments --- .../class/osparc/desktop/WorkbenchView.js | 2 +- .../source/class/osparc/file/FilesTree.js | 22 ++----------------- .../source/class/osparc/widget/NodesTree.js | 6 ++--- .../class/osparc/widget/StudyTitleOnlyTree.js | 2 +- 4 files changed, 7 insertions(+), 25 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js b/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js index b7178d0ff73..1281742898e 100644 --- a/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js +++ b/services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js @@ -1177,7 +1177,7 @@ qx.Class.define("osparc.desktop.WorkbenchView", { }, __workbenchChanged: function() { - this.__nodesTree.populateLocations(); + this.__nodesTree.populateTree(); this.__nodesTree.nodeSelected(this.__currentNodeId); }, diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 4e9e90dcb2d..489af70f11c 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -113,13 +113,6 @@ qx.Class.define("osparc.file.FilesTree", { } } }, - - attachPathLabel: function(srcPathLabel, data) { - data["pathLabel"] = srcPathLabel.concat(data["label"]); - if ("children" in data) { - data.children.forEach(child => this.self().attachPathLabel(data["pathLabel"], child)); - } - } }, members: { @@ -431,19 +424,6 @@ qx.Class.define("osparc.file.FilesTree", { this.__filesReceived(locationId, path, items); }, - __itemsToNode: function(files) { - const currentModel = this.getModel(); - this.self().removeLoadingChild(currentModel); - - files.forEach(file => this.self().attachPathLabel(currentModel.getPathLabel(), file)); - const newModelToAdd = qx.data.marshal.Json.createModel(files, true); - currentModel.getChildren().append(newModelToAdd); - this.setModel(currentModel); - this.fireEvent("filesAddedToTree"); - - return newModelToAdd; - }, - __itemsToLocation: function(locationId, items) { const locationModel = this.__getLocationModel(locationId); if (!locationModel) { @@ -502,6 +482,8 @@ qx.Class.define("osparc.file.FilesTree", { const root = this.getModel(); const items = []; this.__getItemsInTree(root, items); + // OM: review this + // OM: also check if datasetId is needed return items.find(element => "getItemId" in element && element.getItemId() === itemId); }, diff --git a/services/static-webserver/client/source/class/osparc/widget/NodesTree.js b/services/static-webserver/client/source/class/osparc/widget/NodesTree.js index b2a6d4826e9..e88930b09c5 100644 --- a/services/static-webserver/client/source/class/osparc/widget/NodesTree.js +++ b/services/static-webserver/client/source/class/osparc/widget/NodesTree.js @@ -157,10 +157,10 @@ qx.Class.define("osparc.widget.NodesTree", { }, _applyStudy: function() { - this._populateTree(); + this.populateTree(); }, - _populateTree: function() { + populateTree: function() { const study = this.getStudy(); const rootModel = this.self().createStudyModel(study); this.setModel(rootModel); @@ -198,7 +198,7 @@ qx.Class.define("osparc.widget.NodesTree", { if (item.getModel().getId() === study.getUuid()) { item.getChildControl("delete-button").exclude(); } else if (node) { - node.addListener("keyChanged", () => this._populateTree(), this); + node.addListener("keyChanged", () => this.populateTree(), this); } }, configureItem: item => { diff --git a/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js b/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js index 31afc33c124..6d3499b2364 100644 --- a/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js +++ b/services/static-webserver/client/source/class/osparc/widget/StudyTitleOnlyTree.js @@ -28,7 +28,7 @@ qx.Class.define("osparc.widget.StudyTitleOnlyTree", { members: { // override - _populateTree: function() { + populateTree: function() { const study = this.getStudy(); const newModel = osparc.widget.NodesTree.createStudyModel(study); this.setModel(newModel); From c32c569a535a1addcfe48cb2df4665a82831b4b9 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 11:26:28 +0100 Subject: [PATCH 30/68] refactor --- .../source/class/osparc/file/FilesTree.js | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 489af70f11c..6060e15291d 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -197,16 +197,24 @@ qx.Class.define("osparc.file.FilesTree", { loadFilePath: function(outFileVal) { const locationId = outFileVal.store; + const path = outFileVal.path; let datasetId = "dataset" in outFileVal ? outFileVal.dataset : null; - const pathId = outFileVal.path; if (datasetId === null) { - const splitted = pathId.split("/"); - if (splitted.length === 3) { + const splitted = path.split("/"); + if (splitted.length === 3) { // studyId + nodeId + fileId // simcore.s3 datasetId = splitted[0]; } } - this.__addToLoadFilePath(locationId, datasetId, pathId); + if (datasetId) { + if (!(locationId in this.__loadPaths)) { + this.__loadPaths[locationId] = {}; + } + if (!(datasetId in this.__loadPaths[locationId])) { + this.__loadPaths[locationId][datasetId] = new Set(); + } + this.__loadPaths[locationId][datasetId].add(path); + } this.populateLocations(); }, @@ -292,18 +300,6 @@ qx.Class.define("osparc.file.FilesTree", { } }, - __addToLoadFilePath: function(locationId, datasetId, pathId) { - if (datasetId) { - if (!(locationId in this.__loadPaths)) { - this.__loadPaths[locationId] = {}; - } - if (!(datasetId in this.__loadPaths[locationId])) { - this.__loadPaths[locationId][datasetId] = new Set(); - } - this.__loadPaths[locationId][datasetId].add(pathId); - } - }, - __hasLocationNeedToBeLoaded: function(locationId) { return (locationId in this.__loadPaths) && (Object.keys(this.__loadPaths[locationId]).length > 0); }, From 7b673e75340ba2466890891e824849bd7a42746f Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 11:54:48 +0100 Subject: [PATCH 31/68] displayPathToLabel --- .../client/source/class/osparc/data/Converters.js | 15 ++++++++++++++- .../client/source/class/osparc/file/FilesTree.js | 8 ++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index f6394805aca..157118b6bd9 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -75,6 +75,19 @@ qx.Class.define("osparc.data.Converters", { return "@MaterialIcons/insert_drive_file/15"; } return "@MaterialIcons/arrow_right_alt/15"; - } + }, + + displayPathToLabel: function(encodedDisplayPath, options) { + const parts = encodedDisplayPath.split("/"); + const decodedParts = parts.map(decodeURIComponent); + if (options.first) { + return decodedParts[0]; + } else if (options.last) { + return decodedParts[decodedParts.length-1]; + } else if ("pos" in options && options["pos"] < decodedParts.length) { + return decodedParts[options["pos"]]; + } + return decodedParts[0]; + }, } }); diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 6060e15291d..073f370bc23 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -167,7 +167,7 @@ qx.Class.define("osparc.file.FilesTree", { return dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { if (items.length) { - const studyName = items[0]["display_path"].split("/")[0]; + const studyName = osparc.data.Converters.displayPathToLabel(items[0]["display_path"], { first: true }); studyModel.setLabel(studyName); } this.__itemsToTree(locationId, path, items, studyModel); @@ -385,7 +385,7 @@ qx.Class.define("osparc.file.FilesTree", { items.forEach(item => { if (item["file_meta_data"]) { const data = osparc.data.Converters.createFileEntry( - item["display_path"], + osparc.data.Converters.displayPathToLabel(item["display_path"], { last: true }), locationId, item["path"], item["file_meta_data"], @@ -394,7 +394,7 @@ qx.Class.define("osparc.file.FilesTree", { parentModel.getChildren().append(model); } else { const data = osparc.data.Converters.createDirEntry( - item["display_path"], + osparc.data.Converters.displayPathToLabel(item["display_path"], { last: true }), locationId, item["path"] ); @@ -430,7 +430,7 @@ qx.Class.define("osparc.file.FilesTree", { let openThis = null; items.forEach(item => { const datasetData = osparc.data.Converters.createDirEntry( - item["display_path"], + osparc.data.Converters.displayPathToLabel(item["display_path"], { last: true }), locationId, item["path"] ); From 83c6fd9e368a6bfb2282e7279c3e211b5644d44f Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 12:17:24 +0100 Subject: [PATCH 32/68] fix conversion --- .../client/source/class/osparc/data/Converters.js | 8 ++++---- .../client/source/class/osparc/file/FileTreeItem.js | 6 ++++++ .../client/source/class/osparc/file/FilesTree.js | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 157118b6bd9..958f37fce00 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -41,8 +41,8 @@ qx.Class.define("osparc.data.Converters", { displayPath = "Unknown label"; } return { - label: displayPath.split("/").slice(-1).pop(), // take last part of the display name - displayPath, + label: this.displayPathToLabel(displayPath, { last: true }), + displayPath: decodeURIComponent(displayPath), location, path, itemId: path, @@ -52,8 +52,8 @@ qx.Class.define("osparc.data.Converters", { createFileEntry: function(displayPath, location, path, fileMetaData) { return { - label: displayPath.split("/").slice(-1).pop(), // take last part of the display name - displayPath, + label: this.displayPathToLabel(displayPath, { last: true }), + displayPath: decodeURIComponent(displayPath), location, path, itemId: path, diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index 75e688f7b77..54b76c3c350 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -76,6 +76,12 @@ qx.Class.define("osparc.file.FileTreeItem", { nullable: true }, + label: { + check: "String", + event: "changeLabel", + nullable: true + }, + pathLabel: { check: "Array", event: "changePathLabel", diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 073f370bc23..6ef87693cfd 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -385,7 +385,7 @@ qx.Class.define("osparc.file.FilesTree", { items.forEach(item => { if (item["file_meta_data"]) { const data = osparc.data.Converters.createFileEntry( - osparc.data.Converters.displayPathToLabel(item["display_path"], { last: true }), + item["display_path"], locationId, item["path"], item["file_meta_data"], @@ -394,7 +394,7 @@ qx.Class.define("osparc.file.FilesTree", { parentModel.getChildren().append(model); } else { const data = osparc.data.Converters.createDirEntry( - osparc.data.Converters.displayPathToLabel(item["display_path"], { last: true }), + item["display_path"], locationId, item["path"] ); @@ -430,7 +430,7 @@ qx.Class.define("osparc.file.FilesTree", { let openThis = null; items.forEach(item => { const datasetData = osparc.data.Converters.createDirEntry( - osparc.data.Converters.displayPathToLabel(item["display_path"], { last: true }), + item["display_path"], locationId, item["path"] ); From cb2e55382982d28fa1baa801bf60c37f924e62cd Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 12:21:26 +0100 Subject: [PATCH 33/68] minor --- .../source/class/osparc/file/FileTreeItem.js | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index 54b76c3c350..5e34013eabf 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -58,9 +58,16 @@ qx.Class.define("osparc.file.FileTreeItem", { }, properties: { + loaded: { + check: "Boolean", + event: "changeLoaded", + init: true, + nullable: false + }, + location: { check: "String", - event: "changePath", + event: "changeLocation", nullable: true }, @@ -101,13 +108,6 @@ qx.Class.define("osparc.file.FileTreeItem", { nullable: true }, - loaded: { - check: "Boolean", - event: "changeLoaded", - init: true, - nullable: false - }, - fileId: { check: "String", event: "changeFileId", @@ -181,7 +181,9 @@ qx.Class.define("osparc.file.FileTreeItem", { }, __applyItemId: function(value, old) { - osparc.utils.Utils.setIdToWidget(this, "fileTreeItem_" + value); + if (value) { + osparc.utils.Utils.setIdToWidget(this, "fileTreeItem_" + value); + } }, // override From c1c48ea2fe16b5dd2539122a1859a6274117c22d Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 13:01:48 +0100 Subject: [PATCH 34/68] [skip ci] minor fix --- .../client/source/class/osparc/file/FileTreeItem.js | 6 ------ .../client/source/class/osparc/file/FilesTree.js | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index 5e34013eabf..cdde88dd567 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -83,12 +83,6 @@ qx.Class.define("osparc.file.FileTreeItem", { nullable: true }, - label: { - check: "String", - event: "changeLabel", - nullable: true - }, - pathLabel: { check: "Array", event: "changePathLabel", diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 6ef87693cfd..bfb03650b23 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -100,7 +100,7 @@ qx.Class.define("osparc.file.FilesTree", { location: null, path: null, children: [], - icon: "@FontAwesome5Solid/circle-notch/12" + icon: "@FontAwesome5Solid/circle-notch/12", }, true); parent.getChildren().append(loadingModel); }, From 3a98205f69f405fe0dc6fcf9268d1d642e1aa1ea Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 13:08:15 +0100 Subject: [PATCH 35/68] PlanListItem remove hardcoded widths --- .../client/source/class/osparc/pricing/PlanListItem.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/pricing/PlanListItem.js b/services/static-webserver/client/source/class/osparc/pricing/PlanListItem.js index a76527e35fd..9906b10ab3a 100644 --- a/services/static-webserver/client/source/class/osparc/pricing/PlanListItem.js +++ b/services/static-webserver/client/source/class/osparc/pricing/PlanListItem.js @@ -120,7 +120,6 @@ qx.Class.define("osparc.pricing.PlanListItem", { control = new qx.ui.basic.Label().set({ font: "text-14", alignY: "middle", - width: 35, }); this._add(control, { row: 0, @@ -132,7 +131,6 @@ qx.Class.define("osparc.pricing.PlanListItem", { control = new qx.ui.basic.Label().set({ font: "text-14", alignY: "middle", - width: 80, }); this._add(control, { row: 0, @@ -164,7 +162,6 @@ qx.Class.define("osparc.pricing.PlanListItem", { control = new qx.ui.basic.Label().set({ font: "text-14", alignY: "middle", - width: 60, }); this.bind("classification", control, "value"); this._add(control, { From 73c00331c26868394be78155383f63dff5f40185 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 13:25:01 +0100 Subject: [PATCH 36/68] setLoaded deeper --- .../client/source/class/osparc/file/FilesTree.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index bfb03650b23..201d217f046 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -58,9 +58,6 @@ qx.Class.define("osparc.file.FilesTree", { this.__itemSelected(); } }, this); - - this.__pathModels = []; - this.__loadPaths = {}; }, properties: { @@ -229,6 +226,8 @@ qx.Class.define("osparc.file.FilesTree", { __resetChecks: function() { this.__locations = new Set(); + this.__pathModels = []; + this.__loadPaths = {}; }, __resetTree: function(treeName, itemId) { @@ -265,7 +264,6 @@ qx.Class.define("osparc.file.FilesTree", { const openButton = item.getChildControl("open"); openButton.addListener("tap", () => { if (item.isOpen() && !item.getLoaded()) { - item.setLoaded(true); const locationId = item.getLocation(); const path = item.getPath(); this.requestPathItems(locationId, path); @@ -381,6 +379,7 @@ qx.Class.define("osparc.file.FilesTree", { parentModel = this.__getModelFromPath(locationId, path); } if (parentModel) { + parentModel.setLoaded(true); parentModel.getChildren().removeAll(); items.forEach(item => { if (item["file_meta_data"]) { From 06aa232f2f25511a889b3adda38d227c256c13ee Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 13:37:14 +0100 Subject: [PATCH 37/68] minor --- .../client/source/class/osparc/file/FolderViewer.js | 1 + 1 file changed, 1 insertion(+) 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 3604e2b0fe0..a1b8db392a9 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderViewer.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderViewer.js @@ -128,6 +128,7 @@ qx.Class.define("osparc.file.FolderViewer", { marginLeft: 10, marginRight: 10 }); + control.bind("value", control, "toolTipText"); header.addAt(control, 1, { flex: 1 }); From aab934a5f43a43bc543cff4d64254f2da0145ba5 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 14:10:48 +0100 Subject: [PATCH 38/68] disable dbltap on treeitems --- .../client/source/class/osparc/file/FilesTree.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 201d217f046..d97826fe233 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -51,13 +51,6 @@ qx.Class.define("osparc.file.FilesTree", { this.__resetChecks(); this.addListener("tap", this.__selectionChanged, this); - - // Listen to "Enter" key - this.addListener("keypress", keyEvent => { - if (keyEvent.getKeyIdentifier() === "Enter") { - this.__itemSelected(); - } - }, this); }, properties: { @@ -74,7 +67,6 @@ qx.Class.define("osparc.file.FilesTree", { events: { "selectionChanged": "qx.event.type.Event", // tap - "itemSelected": "qx.event.type.Event", // dbltap "fileCopied": "qx.event.type.Data", "filesAddedToTree": "qx.event.type.Event" }, @@ -269,7 +261,6 @@ qx.Class.define("osparc.file.FilesTree", { this.requestPathItems(locationId, path); } }, this); - item.addListener("dbltap", () => this.__itemSelected(), this); this.__addDragAndDropMechanisms(item); } }); @@ -548,13 +539,6 @@ qx.Class.define("osparc.file.FilesTree", { } }, - __itemSelected: function() { - let selectedItem = this.getSelectedItem(); - if (selectedItem) { - this.fireEvent("itemSelected"); - } - }, - __addDragAndDropMechanisms: function(item) { if (this.isDragMechanism()) { this.__createDragMechanism(item); From 0101bdcc006a0950a672208c2d3b4c2e6f16fcd4 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 14:16:03 +0100 Subject: [PATCH 39/68] minor --- .../client/source/class/osparc/file/FilesTree.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index d97826fe233..cf003bfead8 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -253,9 +253,8 @@ qx.Class.define("osparc.file.FilesTree", { c.bindProperty("icon", "icon", null, item, id); }, configureItem: item => { - const openButton = item.getChildControl("open"); - openButton.addListener("tap", () => { - if (item.isOpen() && !item.getLoaded()) { + item.addListener("changeOpen", e => { + if (e.getData() && !item.getLoaded()) { const locationId = item.getLocation(); const path = item.getPath(); this.requestPathItems(locationId, path); From 3f350e14b26af8549a5c4488c7925df4f7d78bee Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 14:50:32 +0100 Subject: [PATCH 40/68] type --- .../source/class/osparc/data/Converters.js | 15 ++++++++- .../source/class/osparc/file/FileTreeItem.js | 9 ++++- .../source/class/osparc/file/FilesTree.js | 33 ++++++++----------- .../source/class/osparc/file/FolderContent.js | 18 +++++----- .../class/osparc/file/TreeFolderView.js | 3 +- .../client/source/class/osparc/store/Data.js | 1 + 6 files changed, 47 insertions(+), 32 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 958f37fce00..4f1fe1b68fc 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -36,7 +36,18 @@ qx.Class.define("osparc.data.Converters", { }); }, - createDirEntry: function(displayPath, location, path) { + createLoadingEntry: function() { + return { + label: "Loading...", + location: null, + path: null, + children: [], + icon: "@FontAwesome5Solid/circle-notch/12", + type: "loading", + }; + }, + + createFolderEntry: function(displayPath, location, path) { if (displayPath === null || displayPath === undefined || displayPath === "") { displayPath = "Unknown label"; } @@ -47,6 +58,7 @@ qx.Class.define("osparc.data.Converters", { path, itemId: path, children: [], + type: "folder", }; }, @@ -60,6 +72,7 @@ qx.Class.define("osparc.data.Converters", { fileId: fileMetaData["file_uuid"], lastModified: fileMetaData["last_modified"], size: fileMetaData["file_size"], + type: "file", }; }, diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index cdde88dd567..5f766780892 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -118,7 +118,14 @@ qx.Class.define("osparc.file.FileTreeItem", { check: "String", event: "changeSize", nullable: true - } + }, + + type: { + check: ["folder", "file", "loading"], + event: "changeType", + init: null, + nullable: false, + }, }, members: { // eslint-disable-line qx-rules/no-refs-in-members diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index cf003bfead8..35e906c54ef 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -66,39 +66,30 @@ qx.Class.define("osparc.file.FilesTree", { }, events: { - "selectionChanged": "qx.event.type.Event", // tap + "selectionChanged": "qx.event.type.Event", "fileCopied": "qx.event.type.Data", "filesAddedToTree": "qx.event.type.Event" }, statics: { isDir: function(item) { - return !this.isFile(item); + return item.getType() === "folder"; }, isFile: function(item) { - if (item["set"+qx.lang.String.firstUp("fileId")]) { - return true; - } - return false; + return item.getType() === "file"; }, addLoadingChild: function(parent) { - const loadingModel = qx.data.marshal.Json.createModel({ - label: "Loading...", - location: null, - path: null, - children: [], - icon: "@FontAwesome5Solid/circle-notch/12", - }, true); + const loadingData = osparc.data.Converters.createLoadingEntry(); + const loadingModel = qx.data.marshal.Json.createModel(loadingData, true); parent.getChildren().append(loadingModel); }, removeLoadingChild: function(parent) { for (let i = parent.getChildren().length - 1; i >= 0; i--) { - if (parent.getChildren().toArray()[i].getLabel() === "Loading...") { - parent.getChildren().toArray() - .splice(i, 1); + if (parent.getChildren().toArray()[i].getType() === "loading") { + parent.getChildren().toArray().splice(i, 1); } } }, @@ -231,7 +222,8 @@ qx.Class.define("osparc.file.FilesTree", { location: null, path: null, pathLabel: [treeName], - children: [] + type: "folder", + children: [], }; const root = qx.data.marshal.Json.createModel(rootData, true); @@ -251,6 +243,7 @@ qx.Class.define("osparc.file.FilesTree", { c.bindProperty("lastModified", "lastModified", null, item, id); c.bindProperty("size", "size", null, item, id); c.bindProperty("icon", "icon", null, item, id); + c.bindProperty("type", "type", null, item, id); }, configureItem: item => { item.addListener("changeOpen", e => { @@ -271,7 +264,7 @@ qx.Class.define("osparc.file.FilesTree", { let openThis = null; for (let i=0; i { - const datasetData = osparc.data.Converters.createDirEntry( + const datasetData = osparc.data.Converters.createFolderEntry( item["display_path"], locationId, item["path"] diff --git a/services/static-webserver/client/source/class/osparc/file/FolderContent.js b/services/static-webserver/client/source/class/osparc/file/FolderContent.js index bc6c680d926..8f9503b7fc9 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderContent.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderContent.js @@ -131,16 +131,16 @@ qx.Class.define("osparc.file.FolderContent", { return control || this.base(arguments, id); }, - __convertEntries: function(content) { + __convertChildren: function(children) { const datas = []; - content.forEach(entry => { + children.forEach(child => { const data = { - icon: entry.getIcon ? entry.getIcon() : this.__getIcon(entry), - label: entry.getLabel(), - lastModified: entry.getLastModified ? osparc.utils.Utils.formatDateAndTime(new Date(entry.getLastModified())) : "", - size: entry.getSize ? osparc.utils.Utils.bytesToSize(entry.getSize()) : "", - itemId: entry.getItemId ? entry.getItemId() : null, - entry: entry, + icon: child.getIcon ? child.getIcon() : this.__getIcon(child), + label: child.getLabel(), + lastModified: child.getLastModified ? osparc.utils.Utils.formatDateAndTime(new Date(child.getLastModified())) : "", + size: child.getSize ? osparc.utils.Utils.bytesToSize(child.getSize()) : "", + itemId: child.getItemId ? child.getItemId() : null, + entry: child, }; datas.push(data); }); @@ -198,7 +198,7 @@ qx.Class.define("osparc.file.FolderContent", { __getEntries: function() { if (this.getFolder()) { const children = this.getFolder().getChildren().toArray(); - return this.__convertEntries(children); + return this.__convertChildren(children); } return []; }, diff --git a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js index fe3d4db06c5..d40608b8c3f 100644 --- a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js +++ b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js @@ -87,7 +87,8 @@ qx.Class.define("osparc.file.TreeFolderView", { // Connect elements folderTree.addListener("selectionChanged", () => { const selectedFolder = folderTree.getSelectedItem(); - if (selectedFolder && (osparc.file.FilesTree.isDir(selectedFolder) || (selectedFolder.getChildren && selectedFolder.getChildren().length))) { + // if (selectedFolder && (osparc.file.FilesTree.isDir(selectedFolder) || (selectedFolder.getChildren && selectedFolder.getChildren().length))) { + if (selectedFolder && osparc.file.FilesTree.isDir(selectedFolder)) { folderViewer.setFolder(selectedFolder); } }, this); diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index f4f71df1723..198f6c50ee0 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -179,6 +179,7 @@ qx.Class.define("osparc.store.Data", { resolve(presignedLinkData); }) .catch(err => { + console.log("remove the FP"); console.error(err); reject(err); }); From 16681ffd712f5d8d78ae92c45410b0555d0ed127 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 14:56:56 +0100 Subject: [PATCH 41/68] minor, navigation finished --- .../client/source/class/osparc/file/FilesTree.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 35e906c54ef..def6d83a76e 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -362,7 +362,9 @@ qx.Class.define("osparc.file.FilesTree", { parentModel = this.__getModelFromPath(locationId, path); } if (parentModel) { - parentModel.setLoaded(true); + if ("setLoaded" in parentModel) { + parentModel.setLoaded(true); + } parentModel.getChildren().removeAll(); items.forEach(item => { if (item["file_meta_data"]) { From f95473d9d63009b7e48808295fc06df54fb5f4f4 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 15:05:04 +0100 Subject: [PATCH 42/68] FileTreeItem --- .../source/class/osparc/file/FileTreeItem.js | 37 ++++++------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index 5f766780892..a097e873230 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -48,13 +48,8 @@ qx.Class.define("osparc.file.FileTreeItem", { this.set({ indent: 12, // defaults to 19, decorator: "rounded", + alignY: "middle", }); - - // create a date format like "Oct. 19, 2018 11:31 AM" - this._dateFormat = new qx.util.format.DateFormat( - qx.locale.Date.getDateFormat("medium") + " " + - qx.locale.Date.getTimeFormat("short") - ); }, properties: { @@ -128,9 +123,7 @@ qx.Class.define("osparc.file.FileTreeItem", { }, }, - members: { // eslint-disable-line qx-rules/no-refs-in-members - _dateFormat: null, - + members: { // overridden _addWidgets: function() { // Here's our indentation and tree-lines @@ -151,32 +144,24 @@ qx.Class.define("osparc.file.FileTreeItem", { // Add lastModified const lastModifiedWidget = new qx.ui.basic.Label().set({ maxWidth: 140, - textAlign: "right" + textAlign: "right", + alignY: "middle", + paddingLeft: 10, }); - let that = this; this.bind("lastModified", lastModifiedWidget, "value", { - converter: function(value) { - if (value === null) { - return ""; - } - const date = new Date(value); - return that._dateFormat.format(date); // eslint-disable-line no-underscore-dangle - } + converter: value => value ? osparc.utils.Utils.formatDateAndTime(new Date(value)) : "" }); this.addWidget(lastModifiedWidget); // Add size const sizeWidget = new qx.ui.basic.Label().set({ - maxWidth: 70, - textAlign: "right" + maxWidth: 90, + textAlign: "right", + alignY: "middle", + paddingLeft: 10, }); this.bind("size", sizeWidget, "value", { - converter: function(value) { - if (value === null) { - return ""; - } - return osparc.utils.Utils.bytesToSize(value); - } + converter: value => value ? osparc.utils.Utils.bytesToSize(value) : "" }); this.addWidget(sizeWidget); }, From 4b4d7170e2c92a0df59ba7fd1594d7d048755fb5 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 15:07:18 +0100 Subject: [PATCH 43/68] [skip ci] requestPathItems --- .../client/source/class/osparc/file/FilePicker.js | 4 ++-- .../client/source/class/osparc/file/FolderContent.js | 6 +++--- .../client/source/class/osparc/file/FolderViewer.js | 4 ++-- .../client/source/class/osparc/file/TreeFolderView.js | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilePicker.js b/services/static-webserver/client/source/class/osparc/file/FilePicker.js index 776b216574b..876289d7fd9 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilePicker.js +++ b/services/static-webserver/client/source/class/osparc/file/FilePicker.js @@ -574,9 +574,9 @@ qx.Class.define("osparc.file.FilePicker", { folderViewer.setFolder(parent); } }, this); - folderViewer.addListener("requestDatasetFiles", e => { + folderViewer.addListener("requestPathItems", e => { const data = e.getData(); - filesTree.requestPathItems(data.locationId, data.datasetId); + filesTree.requestPathItems(data.locationId, data.path); }, this); const selectBtn = this.__selectButton = new qx.ui.form.Button(this.tr("Select")).set({ diff --git a/services/static-webserver/client/source/class/osparc/file/FolderContent.js b/services/static-webserver/client/source/class/osparc/file/FolderContent.js index 8f9503b7fc9..03e188271a7 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderContent.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderContent.js @@ -55,7 +55,7 @@ qx.Class.define("osparc.file.FolderContent", { "selectionChanged": "qx.event.type.Data", // tap "multiSelectionChanged": "qx.event.type.Data", // tap "openItemSelected": "qx.event.type.Data", // dbltap - "requestDatasetFiles": "qx.event.type.Data", + "requestPathItems": "qx.event.type.Data", }, statics: { @@ -206,9 +206,9 @@ qx.Class.define("osparc.file.FolderContent", { __applyFolder: function(folder) { if (folder) { if (folder.getLoaded && !folder.getLoaded()) { - this.fireDataEvent("requestDatasetFiles", { + this.fireDataEvent("requestPathItems", { locationId: folder.getLocation(), - datasetId: folder.getPath() + path: folder.getPath() }); } 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 a1b8db392a9..18b46f1d7b2 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderViewer.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderViewer.js @@ -69,7 +69,7 @@ qx.Class.define("osparc.file.FolderViewer", { multiSelectButton.setValue(false); }); - folderContent.addListener("requestDatasetFiles", e => this.fireDataEvent("requestDatasetFiles", e.getData())); + folderContent.addListener("requestPathItems", e => this.fireDataEvent("requestPathItems", e.getData())); folderContent.addListener("selectionChanged", e => { const selectionData = e.getData(); selectedFileLayout.setItemSelected(selectionData); @@ -100,7 +100,7 @@ qx.Class.define("osparc.file.FolderViewer", { events: { "openItemSelected": "qx.event.type.Data", // dbltap "folderUp": "qx.event.type.Data", - "requestDatasetFiles": "qx.event.type.Data" + "requestPathItems": "qx.event.type.Data" }, members: { diff --git a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js index d40608b8c3f..66614625f09 100644 --- a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js +++ b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js @@ -108,9 +108,9 @@ qx.Class.define("osparc.file.TreeFolderView", { } }, this); - folderViewer.addListener("requestDatasetFiles", e => { + folderViewer.addListener("requestPathItems", e => { const data = e.getData(); - folderTree.requestPathItems(data.locationId, data.datasetId); + folderTree.requestPathItems(data.locationId, data.path); }, this); }, From 7298952e319ff78ac5f93940d2e59f1f2f87507a Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 15:24:16 +0100 Subject: [PATCH 44/68] minor --- .../client/source/class/osparc/file/FilePicker.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilePicker.js b/services/static-webserver/client/source/class/osparc/file/FilePicker.js index 876289d7fd9..0ecc0a31c4f 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilePicker.js +++ b/services/static-webserver/client/source/class/osparc/file/FilePicker.js @@ -111,7 +111,7 @@ qx.Class.define("osparc.file.FilePicker", { return osparc.file.FilePicker.isOutputFromStore(outputs) || osparc.file.FilePicker.isOutputDownloadLink(outputs); }, - setOutputValue: function(node, outputValue) { + __setOutputValue: function(node, outputValue) { node.setOutputData({ "outFile": outputValue }); @@ -127,7 +127,7 @@ qx.Class.define("osparc.file.FilePicker", { setOutputValueFromStore: function(node, store, dataset, path, label) { if (store !== undefined && path) { - osparc.file.FilePicker.setOutputValue(node, { + this.__setOutputValue(node, { store, dataset, path, @@ -138,7 +138,7 @@ qx.Class.define("osparc.file.FilePicker", { setOutputValueFromLink: function(node, downloadLink, label) { if (downloadLink) { - osparc.file.FilePicker.setOutputValue(node, { + this.__setOutputValue(node, { downloadLink, label: label ? label : "" }); @@ -146,7 +146,7 @@ qx.Class.define("osparc.file.FilePicker", { }, resetOutputValue: function(node) { - osparc.file.FilePicker.setOutputValue(node, null); + this.__setOutputValue(node, null); }, getOutputFileMetadata: function(node) { From 1426f169d1cf4e4a90b871bb78dcea773a2b42f1 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 15:37:57 +0100 Subject: [PATCH 45/68] pathToDatasetId --- .../client/source/class/osparc/data/Converters.js | 13 ++++++++++++- .../client/source/class/osparc/file/FilesTree.js | 8 +++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 4f1fe1b68fc..39b563fadde 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -62,13 +62,14 @@ qx.Class.define("osparc.data.Converters", { }; }, - createFileEntry: function(displayPath, location, path, fileMetaData) { + createFileEntry: function(displayPath, location, path, datasetId, fileMetaData) { return { label: this.displayPathToLabel(displayPath, { last: true }), displayPath: decodeURIComponent(displayPath), location, path, itemId: path, + datasetId, fileId: fileMetaData["file_uuid"], lastModified: fileMetaData["last_modified"], size: fileMetaData["file_size"], @@ -90,6 +91,16 @@ qx.Class.define("osparc.data.Converters", { return "@MaterialIcons/arrow_right_alt/15"; }, + pathToDatasetId: function(path) { + const splitted = path.split("/"); + if (splitted.length > 1) { + // simcore: studyId + nodeId + fileId + // datcore: datasetId + packageId + return splitted[0]; + } + return null; + }, + displayPathToLabel: function(encodedDisplayPath, options) { const parts = encodedDisplayPath.split("/"); const decodedParts = parts.map(decodeURIComponent); diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index def6d83a76e..8da55c24768 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -180,11 +180,7 @@ qx.Class.define("osparc.file.FilesTree", { const path = outFileVal.path; let datasetId = "dataset" in outFileVal ? outFileVal.dataset : null; if (datasetId === null) { - const splitted = path.split("/"); - if (splitted.length === 3) { // studyId + nodeId + fileId - // simcore.s3 - datasetId = splitted[0]; - } + datasetId = osparc.data.Converters.pathToDatasetId(path); } if (datasetId) { if (!(locationId in this.__loadPaths)) { @@ -368,10 +364,12 @@ qx.Class.define("osparc.file.FilesTree", { parentModel.getChildren().removeAll(); items.forEach(item => { if (item["file_meta_data"]) { + const datasetId = osparc.data.Converters.pathToDatasetId(path); const data = osparc.data.Converters.createFileEntry( item["display_path"], locationId, item["path"], + datasetId, item["file_meta_data"], ); const model = this.__createModel(locationId, item["path"], data); From 2818d8fc2ed174b8197abb7017d2b62b0aba15fc Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 15:40:39 +0100 Subject: [PATCH 46/68] minor --- .../client/source/class/osparc/data/Converters.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index 39b563fadde..cda38c33812 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -93,9 +93,9 @@ qx.Class.define("osparc.data.Converters", { pathToDatasetId: function(path) { const splitted = path.split("/"); - if (splitted.length > 1) { + if (splitted.length > 0) { // simcore: studyId + nodeId + fileId - // datcore: datasetId + packageId + // datcore: datasetId return splitted[0]; } return null; From cdf26d35b3caeac2c01cf732259711bf6f1dee93 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 15:45:04 +0100 Subject: [PATCH 47/68] one left --- .../source/class/osparc/dashboard/DataBrowser.js | 10 +++++----- .../client/source/class/osparc/file/FilesTree.js | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js b/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js index 8cf1c4be319..2305feaa8a4 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/DataBrowser.js @@ -94,7 +94,7 @@ qx.Class.define("osparc.dashboard.DataBrowser", { // After deleting a file, try to keep the user in the same folder. // If the folder doesn't longer exist, open the closest available parent - const path = fileMetadata["fileUuid"].split("/"); + const pathParts = fileMetadata["fileUuid"].split("/"); const treeFolderView = this.getChildControl("tree-folder-view"); const foldersTree = treeFolderView.getChildControl("folder-tree"); @@ -102,18 +102,18 @@ qx.Class.define("osparc.dashboard.DataBrowser", { const openSameFolder = () => { // drop last, which is the file - path.pop(); - treeFolderView.openPath(path); + pathParts.pop(); + treeFolderView.openPath(pathParts); }; folderViewer.resetFolder(); const locationId = fileMetadata["locationId"]; - const datasetId = path[0]; + const path = pathParts[0]; foldersTree.resetCache(); foldersTree.populateLocations() .then(datasetPromises => { Promise.all(datasetPromises) - .then(() => foldersTree.requestPathItems(locationId, datasetId)) + .then(() => foldersTree.requestPathItems(locationId, path)) .then(() => openSameFolder()); }) .catch(err => console.error(err)); diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 8da55c24768..d944ced9127 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -461,7 +461,6 @@ qx.Class.define("osparc.file.FilesTree", { const items = []; this.__getItemsInTree(root, items); // OM: review this - // OM: also check if datasetId is needed return items.find(element => "getItemId" in element && element.getItemId() === itemId); }, From 36c7fa04e07f675f3e8e07d7537b65d6e261e072 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 16:22:58 +0100 Subject: [PATCH 48/68] all good --- .../client/source/class/osparc/data/Resources.js | 2 +- .../client/source/class/osparc/file/FileLabelWithActions.js | 1 + .../client/source/class/osparc/file/FilesTree.js | 1 - .../static-webserver/client/source/class/osparc/store/Data.js | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Resources.js b/services/static-webserver/client/source/class/osparc/data/Resources.js index 1d3eaf0d2db..df7ab87b3cc 100644 --- a/services/static-webserver/client/source/class/osparc/data/Resources.js +++ b/services/static-webserver/client/source/class/osparc/data/Resources.js @@ -1188,7 +1188,7 @@ qx.Class.define("osparc.data.Resources", { "storageFiles": { useCache: false, endpoints: { - put: { + copy: { method: "PUT", url: statics.API + "/storage/locations/{toLoc}/files/{fileName}?extra_location={fromLoc}&extra_source={fileUuid}" }, diff --git a/services/static-webserver/client/source/class/osparc/file/FileLabelWithActions.js b/services/static-webserver/client/source/class/osparc/file/FileLabelWithActions.js index 2e270c26709..780279d026b 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileLabelWithActions.js +++ b/services/static-webserver/client/source/class/osparc/file/FileLabelWithActions.js @@ -182,6 +182,7 @@ qx.Class.define("osparc.file.FileLabelWithActions", { } else if (this.__selection.length) { const selection = this.__selection[0]; if (selection) { + toBeDeleted.push(selection); if (osparc.file.FilesTree.isDir(selection)) { isFolderSelected = true; } diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index d944ced9127..9ebf3d8ce2e 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -460,7 +460,6 @@ qx.Class.define("osparc.file.FilesTree", { const root = this.getModel(); const items = []; this.__getItemsInTree(root, items); - // OM: review this return items.find(element => "getItemId" in element && element.getItemId() === itemId); }, diff --git a/services/static-webserver/client/source/class/osparc/store/Data.js b/services/static-webserver/client/source/class/osparc/store/Data.js index 198f6c50ee0..92f66acc1e2 100644 --- a/services/static-webserver/client/source/class/osparc/store/Data.js +++ b/services/static-webserver/client/source/class/osparc/store/Data.js @@ -203,7 +203,7 @@ qx.Class.define("osparc.store.Data", { fileUuid: encodeURIComponent(fileUuid) } }; - osparc.data.Resources.fetch("storageFiles", "put", params) + osparc.data.Resources.fetch("storageFiles", "copy", params) .then(files => { const data = { data: files, From d2f1781cc20cdb15005668bb9e91ecf8bee23574 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 17:08:20 +0100 Subject: [PATCH 49/68] minor --- .../client/source/class/osparc/data/Converters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Converters.js b/services/static-webserver/client/source/class/osparc/data/Converters.js index cda38c33812..d567b63e561 100644 --- a/services/static-webserver/client/source/class/osparc/data/Converters.js +++ b/services/static-webserver/client/source/class/osparc/data/Converters.js @@ -70,7 +70,7 @@ qx.Class.define("osparc.data.Converters", { path, itemId: path, datasetId, - fileId: fileMetaData["file_uuid"], + fileId: fileMetaData["file_id"], lastModified: fileMetaData["last_modified"], size: fileMetaData["file_size"], type: "file", From 78ae8946ed6d2345ef5255d9f8909c96db5089b4 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Thu, 27 Feb 2025 18:01:20 +0100 Subject: [PATCH 50/68] update test --- tests/e2e-playwright/tests/sleepers/test_sleepers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e-playwright/tests/sleepers/test_sleepers.py b/tests/e2e-playwright/tests/sleepers/test_sleepers.py index 0940b37609d..a8b86b18e09 100644 --- a/tests/e2e-playwright/tests/sleepers/test_sleepers.py +++ b/tests/e2e-playwright/tests/sleepers/test_sleepers.py @@ -217,7 +217,7 @@ def test_sleepers( sleeper.click() # waiting for this response is not enough, the frontend needs some time to show the files # therefore _get_file_names is wrapped with tenacity - with page.expect_response(re.compile(r"files/metadata")): + with page.expect_response(re.compile(r"paths?file_filter=")): page.get_by_test_id("nodeFilesBtn").click() output_file_names_found = _get_file_names(page) From dc7f2bc762270e4ea21c3847d8fbd01194dd0d60 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Fri, 28 Feb 2025 09:45:25 +0100 Subject: [PATCH 51/68] update test paths --- tests/e2e/tutorials/tutorialBase.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tests/e2e/tutorials/tutorialBase.js b/tests/e2e/tutorials/tutorialBase.js index 76c7edcb3de..0fe3fd9b4c5 100644 --- a/tests/e2e/tutorials/tutorialBase.js +++ b/tests/e2e/tutorials/tutorialBase.js @@ -447,25 +447,27 @@ class TutorialBase { return nodeIframe; } - async openNodeFiles(nodeId) { - this.__responsesQueue.addResponseListener("storage/locations/0/files/metadata?uuid_filter=" + nodeId); + async openNodeFiles(studyId, nodeId) { + const pathFilter = `${studyId}/${nodeId}`; + const path = "storage/locations/0/files/paths?file_filter=" + pathFilter; + this.__responsesQueue.addResponseListener(path); await auto.openNodeFiles(this.__page); try { - await this.__responsesQueue.waitUntilResponse("storage/locations/0/files/metadata?uuid_filter=" + nodeId); - } - catch (err) { + await this.__responsesQueue.waitUntilResponse(path); + } catch (err) { console.error("Error: open node files", err); throw (err); } } - async openNodeFilesAppMode(nodeId) { - this.__responsesQueue.addResponseListener("storage/locations/0/files/metadata?uuid_filter=" + nodeId); + async openNodeFilesAppMode(studyId, nodeId) { + const pathFilter = `${studyId}/${nodeId}`; + const path = "storage/locations/0/files/paths?file_filter=" + pathFilter; + this.__responsesQueue.addResponseListener(path); await auto.openNodeFilesAppMode(this.__page); try { - await this.__responsesQueue.waitUntilResponse("storage/locations/0/files/metadata?uuid_filter=" + nodeId); - } - catch (err) { + await this.__responsesQueue.waitUntilResponse(path); + } catch (err) { console.error("Error: open node files", err); throw (err); } From ff6e8877c0e10fda56ddc3ed517096ee3b8a267a Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Fri, 28 Feb 2025 09:51:43 +0100 Subject: [PATCH 52/68] update test paths --- tests/e2e/tutorials/tutorialBase.js | 45 +++++++++++++---------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/tests/e2e/tutorials/tutorialBase.js b/tests/e2e/tutorials/tutorialBase.js index 0fe3fd9b4c5..936649b04eb 100644 --- a/tests/e2e/tutorials/tutorialBase.js +++ b/tests/e2e/tutorials/tutorialBase.js @@ -26,6 +26,7 @@ class TutorialBase { this.__responsesQueue = null; this.__services = null; + this.__studyId = null; this.__interval = null; @@ -216,8 +217,9 @@ class TutorialBase { let resp = null; try { resp = await this.__responsesQueue.waitUntilResponse(":open"); - } - catch (err) { + const studyId = this.__studyId = resp["data"]["uuid"]; + console.log("Study ID:", studyId); + } catch (err) { console.error("Error:", this.__templateName, "could not be started", err); throw (err); } @@ -234,10 +236,9 @@ class TutorialBase { await auto.dashboardNewTIPlan(this.__page); await this.__responsesQueue.waitUntilResponse("projects?from_study="); resp = await this.__responsesQueue.waitUntilResponse(":open"); - const studyId = resp["data"]["uuid"]; + const studyId = this.__studyId = resp["data"]["uuid"]; console.log("Study ID:", studyId); - } - catch (err) { + } catch (err) { console.error(`Error: Classic TI could not be started:\n`, err); throw (err); } @@ -254,10 +255,9 @@ class TutorialBase { await this.waitFor(2000); await auto.dashboardStartSim4LifeLite(this.__page); resp = await this.__responsesQueue.waitUntilResponse(":open"); - const studyId = resp["data"]["uuid"]; + const studyId = this.__studyId = resp["data"]["uuid"]; console.log("Study ID:", studyId); - } - catch (err) { + } catch (err) { console.error(`Error: Sim4Life Lite could not be started:\n`, err); throw (err); } @@ -274,10 +274,9 @@ class TutorialBase { await this.__goTo(); resp = await this.__responsesQueue.waitUntilResponse(":open", openStudyTimeout); await this.__printMe(); - const studyId = resp["data"]["uuid"]; + const studyId = this.__studyId = resp["data"]["uuid"]; console.log("Study ID:", studyId); - } - catch (err) { + } catch (err) { console.error("Error:", this.__templateName, "could not be started", err); throw (err); } @@ -294,10 +293,9 @@ class TutorialBase { assert(templateFound, "Expected template, got nothing. TIP: did you inject templates in database??") await this.__responsesQueue.waitUntilResponse("projects?from_study="); resp = await this.__responsesQueue.waitUntilResponse(":open"); - const studyId = resp["data"]["uuid"]; + const studyId = this.__studyId = resp["data"]["uuid"]; console.log("Study ID:", studyId); - } - catch (err) { + } catch (err) { console.error(`Error: "${this.__templateName}" template could not be started:\n`, err); throw (err); } @@ -314,10 +312,9 @@ class TutorialBase { const serviceFound = await auto.dashboardOpenService(this.__page, this.__templateName); assert(serviceFound, "Expected service, got nothing. TIP: is it available??"); resp = await this.__responsesQueue.waitUntilResponse(":open"); - const studyId = resp["data"]["uuid"]; + const studyId = this.__studyId = resp["data"]["uuid"]; console.log("Study ID:", studyId); - } - catch (err) { + } catch (err) { console.error(`Error: "${this.__templateName}" service could not be started:\n`, err); throw (err); } @@ -447,8 +444,8 @@ class TutorialBase { return nodeIframe; } - async openNodeFiles(studyId, nodeId) { - const pathFilter = `${studyId}/${nodeId}`; + async openNodeFiles(nodeId) { + const pathFilter = `${this.__studyId}/${nodeId}`; const path = "storage/locations/0/files/paths?file_filter=" + pathFilter; this.__responsesQueue.addResponseListener(path); await auto.openNodeFiles(this.__page); @@ -460,8 +457,8 @@ class TutorialBase { } } - async openNodeFilesAppMode(studyId, nodeId) { - const pathFilter = `${studyId}/${nodeId}`; + async openNodeFilesAppMode(nodeId) { + const pathFilter = `${this.__studyId}/${nodeId}`; const path = "storage/locations/0/files/paths?file_filter=" + pathFilter; this.__responsesQueue.addResponseListener(path); await auto.openNodeFilesAppMode(this.__page); @@ -534,8 +531,7 @@ class TutorialBase { const nodeId = await auto.openNode(this.__page, nodePos); await this.openNodeFiles(nodeId); await this.__checkNItemsInFolder(fileNames, openOutputsFolder); - } - catch (err) { + } catch (err) { console.error("Error: Checking Node Outputs:", err); throw (err) } @@ -545,8 +541,7 @@ class TutorialBase { try { await this.openNodeFilesAppMode(nodeId); await this.__checkNItemsInFolder(fileNames, openOutputsFolder); - } - catch (err) { + } catch (err) { console.error("Error: Checking Node Outputs:", err); throw (err) } From 27daf145f32d991ddc3a612fe6c35f87575f0270 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Fri, 28 Feb 2025 10:03:37 +0100 Subject: [PATCH 53/68] question mark --- tests/e2e-playwright/tests/sleepers/test_sleepers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e-playwright/tests/sleepers/test_sleepers.py b/tests/e2e-playwright/tests/sleepers/test_sleepers.py index a8b86b18e09..72a506ef979 100644 --- a/tests/e2e-playwright/tests/sleepers/test_sleepers.py +++ b/tests/e2e-playwright/tests/sleepers/test_sleepers.py @@ -217,7 +217,7 @@ def test_sleepers( sleeper.click() # waiting for this response is not enough, the frontend needs some time to show the files # therefore _get_file_names is wrapped with tenacity - with page.expect_response(re.compile(r"paths?file_filter=")): + with page.expect_response(re.compile(r"paths\?file_filter=")): page.get_by_test_id("nodeFilesBtn").click() output_file_names_found = _get_file_names(page) From 4cfe5a48ada244336dadf5f3329cc3de6874a3a2 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 4 Mar 2025 09:55:36 +0100 Subject: [PATCH 54/68] minor --- .../class/osparc/dashboard/ListButtonItem.js | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/ListButtonItem.js b/services/static-webserver/client/source/class/osparc/dashboard/ListButtonItem.js index f5dbbdda082..3cfb70d3b7d 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ListButtonItem.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ListButtonItem.js @@ -132,8 +132,25 @@ qx.Class.define("osparc.dashboard.ListButtonItem", { column: osparc.dashboard.ListButtonBase.POS.OPTIONS }); break; - case "tick-unselected": { + case "menu-button": { + control = new qx.ui.form.MenuButton().set({ + appearance: "form-button-outlined", + padding: [0, 8], + maxWidth: this.self().MENU_BTN_DIMENSIONS, + maxHeight: this.self().MENU_BTN_DIMENSIONS, + icon: "@FontAwesome5Solid/ellipsis-v/14", + focusable: false + }); + // make it circular + control.getContentElement().setStyles({ + "border-radius": `${this.self().MENU_BTN_DIMENSIONS / 2}px` + }); + osparc.utils.Utils.setIdToWidget(control, "studyItemMenuButton"); const menuSelectionStack = this.getChildControl("menu-selection-stack"); + menuSelectionStack.addAt(control, 0); + break; + } + case "tick-unselected": { control = new qx.ui.basic.Atom().set({ appearance: "form-button-outlined", width: this.self().MENU_BTN_DIMENSIONS, @@ -143,11 +160,11 @@ qx.Class.define("osparc.dashboard.ListButtonItem", { control.getContentElement().setStyles({ "border-radius": `${this.self().MENU_BTN_DIMENSIONS / 2}px` }); + const menuSelectionStack = this.getChildControl("menu-selection-stack"); menuSelectionStack.addAt(control, 1); break; } case "tick-selected": { - const menuSelectionStack = this.getChildControl("menu-selection-stack"); control = new qx.ui.basic.Image("@FontAwesome5Solid/check/12").set({ appearance: "form-button-outlined", width: this.self().MENU_BTN_DIMENSIONS, @@ -158,25 +175,8 @@ qx.Class.define("osparc.dashboard.ListButtonItem", { control.getContentElement().setStyles({ "border-radius": `${this.self().MENU_BTN_DIMENSIONS / 2}px` }); - menuSelectionStack.addAt(control, 2); - break; - } - case "menu-button": { const menuSelectionStack = this.getChildControl("menu-selection-stack"); - control = new qx.ui.form.MenuButton().set({ - appearance: "form-button-outlined", - padding: [0, 8], - maxWidth: this.self().MENU_BTN_DIMENSIONS, - maxHeight: this.self().MENU_BTN_DIMENSIONS, - icon: "@FontAwesome5Solid/ellipsis-v/14", - focusable: false - }); - // make it circular - control.getContentElement().setStyles({ - "border-radius": `${this.self().MENU_BTN_DIMENSIONS / 2}px` - }); - osparc.utils.Utils.setIdToWidget(control, "studyItemMenuButton"); - menuSelectionStack.addAt(control, 0); + menuSelectionStack.addAt(control, 2); break; } } From 49219c116a6452beb500a8cb2730280ac6a3bea7 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 4 Mar 2025 10:13:17 +0100 Subject: [PATCH 55/68] refactor and aesthetics --- .../source/class/osparc/dashboard/CardBase.js | 16 +++--- .../class/osparc/dashboard/GridButtonBase.js | 49 ++++++++----------- .../class/osparc/dashboard/GridButtonItem.js | 38 ++++++++------ 3 files changed, 50 insertions(+), 53 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 d42080a05f6..a06ec485d48 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/CardBase.js @@ -530,22 +530,20 @@ qx.Class.define("osparc.dashboard.CardBase", { __evalSelectedButton: function() { if ( + this.hasChildControl("menu-selection-stack") && this.hasChildControl("menu-button") && this.hasChildControl("tick-selected") && this.hasChildControl("tick-unselected") ) { - const menuButton = this.getChildControl("menu-button"); - const tick = this.getChildControl("tick-selected"); - const untick = this.getChildControl("tick-unselected"); + const menuButtonStack = this.getChildControl("menu-selection-stack"); if (this.isResourceType("study") && this.isMultiSelectionMode()) { + const tick = this.getChildControl("tick-selected"); + const untick = this.getChildControl("tick-unselected"); const selected = this.getSelected(); - menuButton.setVisibility("excluded"); - tick.setVisibility(selected ? "visible" : "excluded"); - untick.setVisibility(selected ? "excluded" : "visible"); + menuButtonStack.setSelection(selected ? [tick] : [untick]); } else { - menuButton.setVisibility("visible"); - tick.setVisibility("excluded"); - untick.setVisibility("excluded"); + const menuButton = this.getChildControl("menu-button"); + menuButtonStack.setSelection([menuButton]); } } }, diff --git a/services/static-webserver/client/source/class/osparc/dashboard/GridButtonBase.js b/services/static-webserver/client/source/class/osparc/dashboard/GridButtonBase.js index 74b2da3c990..a04e872c894 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/GridButtonBase.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/GridButtonBase.js @@ -138,13 +138,16 @@ qx.Class.define("osparc.dashboard.GridButtonBase", { } case "header": { const hGrid = new qx.ui.layout.Grid().set({ - spacing: 0, // the sub-elements will take care of the padding + spacing: 6, }); hGrid.setColumnFlex(1, 1); - hGrid.setRowAlign(0, "left", "middle"); + hGrid.setColumnAlign(0, "right", "middle"); + hGrid.setColumnAlign(1, "left", "middle"); + hGrid.setColumnAlign(2, "center", "middle"); control = new qx.ui.container.Composite().set({ backgroundColor: "background-card-overlay", - padding: 0, + paddingBottom: 6, + paddingRight: 4, maxWidth: this.self().ITEM_WIDTH, maxHeight: this.self().ITEM_HEIGHT }); @@ -189,37 +192,23 @@ qx.Class.define("osparc.dashboard.GridButtonBase", { control = new qx.ui.basic.Label().set({ textColor: "contrasted-text-light", font: "text-14", - padding: this.self().TITLE_PADDING, - maxWidth: this.self().ITEM_WIDTH, }); layout = this.getChildControl("header"); - layout.addAt(control, 0, { + layout.add(control, { column: 1, row: 0, }); break; - case "subtitle": - control = new qx.ui.container.Composite(new qx.ui.layout.HBox(6)).set({ - anonymous: true, - height: 20, - padding: 6, - paddingLeft: 20, // align with icon + case "subtitle-icon": { + control = new qx.ui.basic.Image().set({ + allowGrowX: false, + allowShrinkX: false, }); layout = this.getChildControl("header"); - layout.addAt(control, 0, { + layout.add(control, { column: 0, row: 1, - colSpan: 2, - }); - break; - case "subtitle-icon": { - control = new qx.ui.basic.Image().set({ - alignY: "middle", - allowGrowX: false, - allowShrinkX: false }); - const subtitleLayout = this.getChildControl("subtitle"); - subtitleLayout.addAt(control, 0); break; } case "subtitle-text": { @@ -233,9 +222,10 @@ qx.Class.define("osparc.dashboard.GridButtonBase", { font: "text-12", allowGrowY: false }); - const subtitleLayout = this.getChildControl("subtitle"); - subtitleLayout.addAt(control, 1, { - flex: 1 + layout = this.getChildControl("header"); + layout.add(control, { + column: 1, + row: 1, }); break; } @@ -269,9 +259,10 @@ qx.Class.define("osparc.dashboard.GridButtonBase", { width: 13, margin: [0, 1] }); - layout = this.getChildControl("subtitle"); - layout.set({ - visibility: "visible" + layout = this.getChildControl("header"); + layout.add(control, { + column: 2, + row: 1, }); layout.addAt(control, 2); break; diff --git a/services/static-webserver/client/source/class/osparc/dashboard/GridButtonItem.js b/services/static-webserver/client/source/class/osparc/dashboard/GridButtonItem.js index 675951f1ab6..ad0bf2ec3ae 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/GridButtonItem.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/GridButtonItem.js @@ -91,7 +91,18 @@ qx.Class.define("osparc.dashboard.GridButtonItem", { layout = this.getChildControl("main-layout"); layout.add(control, osparc.dashboard.GridButtonBase.POS.TAGS); break; - case "menu-button": + case "menu-selection-stack": + control = new qx.ui.container.Stack(); + control.set({ + alignX: "center", + alignY: "middle" + }); + this.getChildControl("header").add(control, { + column: 2, + row: 0, + }); + break; + case "menu-button": { this.getChildControl("title").set({ maxWidth: osparc.dashboard.GridButtonBase.ITEM_WIDTH - osparc.dashboard.CardBase.ICON_SIZE - this.self().MENU_BTN_DIMENSIONS - 2, }); @@ -110,12 +121,11 @@ qx.Class.define("osparc.dashboard.GridButtonItem", { "border-radius": `${this.self().MENU_BTN_DIMENSIONS / 2}px` }); osparc.utils.Utils.setIdToWidget(control, "studyItemMenuButton"); - this._add(control, { - top: 6, - right: 6, - }); + const menuSelectionStack = this.getChildControl("menu-selection-stack"); + menuSelectionStack.addAt(control, 0); break; - case "tick-unselected": + } + case "tick-unselected": { control = new qx.ui.basic.Atom().set({ appearance: "form-button-outlined", width: this.self().MENU_BTN_DIMENSIONS, @@ -126,12 +136,11 @@ qx.Class.define("osparc.dashboard.GridButtonItem", { control.getContentElement().setStyles({ "border-radius": `${this.self().MENU_BTN_DIMENSIONS / 2}px` }); - this._add(control, { - top: 8, - right: 8 - }); + const menuSelectionStack = this.getChildControl("menu-selection-stack"); + menuSelectionStack.addAt(control, 1); break; - case "tick-selected": + } + case "tick-selected": { control = new qx.ui.basic.Image().set({ appearance: "form-button", width: this.self().MENU_BTN_DIMENSIONS, @@ -146,11 +155,10 @@ qx.Class.define("osparc.dashboard.GridButtonItem", { control.getContentElement().setStyles({ "border-radius": `${this.self().MENU_BTN_DIMENSIONS / 2}px` }); - this._add(control, { - top: 8, - right: 8 - }); + const menuSelectionStack = this.getChildControl("menu-selection-stack"); + menuSelectionStack.addAt(control, 2); break; + } case "lock-status": control = new osparc.ui.basic.Thumbnail(); this._add(control, { From 5aca3685004a6fd6ac0f9cb3415625bb174f87d0 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Tue, 4 Mar 2025 10:54:40 +0100 Subject: [PATCH 56/68] ?size=100 --- .../client/source/class/osparc/data/Resources.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Resources.js b/services/static-webserver/client/source/class/osparc/data/Resources.js index df7ab87b3cc..850006c6bde 100644 --- a/services/static-webserver/client/source/class/osparc/data/Resources.js +++ b/services/static-webserver/client/source/class/osparc/data/Resources.js @@ -1206,11 +1206,11 @@ qx.Class.define("osparc.data.Resources", { endpoints: { getDatasets: { method: "GET", - url: statics.API + "/storage/locations/{locationId}/paths" + url: statics.API + "/storage/locations/{locationId}/paths?size=100" }, getPaths: { method: "GET", - url: statics.API + "/storage/locations/{locationId}/paths?file_filter={path}" + url: statics.API + "/storage/locations/{locationId}/paths?file_filter={path}&size=100" }, } }, From c7d0e9160d9fbfcfb7dbcc74ff1076c080924c4d Mon Sep 17 00:00:00 2001 From: Odei Maiz <33152403+odeimaiz@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:17:48 +0100 Subject: [PATCH 57/68] size 1000 --- .../client/source/class/osparc/data/Resources.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/data/Resources.js b/services/static-webserver/client/source/class/osparc/data/Resources.js index 850006c6bde..8fcc7a4b005 100644 --- a/services/static-webserver/client/source/class/osparc/data/Resources.js +++ b/services/static-webserver/client/source/class/osparc/data/Resources.js @@ -1206,11 +1206,11 @@ qx.Class.define("osparc.data.Resources", { endpoints: { getDatasets: { method: "GET", - url: statics.API + "/storage/locations/{locationId}/paths?size=100" + url: statics.API + "/storage/locations/{locationId}/paths?size=1000" }, getPaths: { method: "GET", - url: statics.API + "/storage/locations/{locationId}/paths?file_filter={path}&size=100" + url: statics.API + "/storage/locations/{locationId}/paths?file_filter={path}&size=1000" }, } }, From 873de8dff3fe6a34f5dcab570cd0687fc7dac5b2 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 10:34:34 +0100 Subject: [PATCH 58/68] optimize folder population --- .../client/source/class/osparc/file/FilesTree.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 9ebf3d8ce2e..0a01d30ba11 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -362,6 +362,7 @@ qx.Class.define("osparc.file.FilesTree", { parentModel.setLoaded(true); } parentModel.getChildren().removeAll(); + const itemModels = []; items.forEach(item => { if (item["file_meta_data"]) { const datasetId = osparc.data.Converters.pathToDatasetId(path); @@ -373,7 +374,7 @@ qx.Class.define("osparc.file.FilesTree", { item["file_meta_data"], ); const model = this.__createModel(locationId, item["path"], data); - parentModel.getChildren().append(model); + itemModels.push(model); } else { const data = osparc.data.Converters.createFolderEntry( item["display_path"], @@ -382,7 +383,7 @@ qx.Class.define("osparc.file.FilesTree", { ); data.loaded = false; const model = this.__createModel(locationId, item["path"], data); - parentModel.getChildren().append(model); + itemModels.push(model); this.__pathModels.push({ locationId, path: item["path"], @@ -391,6 +392,7 @@ qx.Class.define("osparc.file.FilesTree", { this.self().addLoadingChild(model); } }); + parentModel.getChildren().append(itemModels); // sort files osparc.data.Converters.sortModelByLabel(parentModel); @@ -410,6 +412,7 @@ qx.Class.define("osparc.file.FilesTree", { this.__locations.add(locationId); locationModel.getChildren().removeAll(); let openThis = null; + const datasetItems = []; items.forEach(item => { const datasetData = osparc.data.Converters.createFolderEntry( item["display_path"], @@ -419,8 +422,8 @@ qx.Class.define("osparc.file.FilesTree", { datasetData.loaded = false; datasetData["pathLabel"] = locationModel.getPathLabel().concat(datasetData["label"]); const datasetModel = this.__createModel(locationId, item["path"], datasetData); + datasetItems.push(datasetModel); this.self().addLoadingChild(datasetModel); - locationModel.getChildren().append(datasetModel); // add cached files const path = item["path"]; @@ -428,6 +431,7 @@ qx.Class.define("osparc.file.FilesTree", { openThis = datasetModel; } }); + locationModel.getChildren().append(datasetItems); // sort datasets osparc.data.Converters.sortModelByLabel(locationModel); From 05dccef52f7ef7434358a5c639541566af4407ef Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 11:02:04 +0100 Subject: [PATCH 59/68] minor --- .../client/source/class/osparc/file/FolderContent.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FolderContent.js b/services/static-webserver/client/source/class/osparc/file/FolderContent.js index 03e188271a7..3100e472423 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderContent.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderContent.js @@ -22,7 +22,8 @@ qx.Class.define("osparc.file.FolderContent", { this.base(arguments); this.getChildControl("icons-layout"); - this.getChildControl("table"); + const table = this.getChildControl("table"); + this.__attachListenersToTable(table); }, properties: { @@ -225,7 +226,6 @@ qx.Class.define("osparc.file.FolderContent", { if (this.getMode() === "list") { const table = this.getChildControl("table"); table.setData(entries); - this.__attachListenersToTableItem(table); } else if (this.getMode() === "icons") { const iconsLayout = this.getChildControl("icons-layout"); iconsLayout.removeAll(); @@ -306,7 +306,7 @@ qx.Class.define("osparc.file.FolderContent", { }, this); }, - __attachListenersToTableItem: function(table) { + __attachListenersToTable: function(table) { table.addListener("cellTap", e => { if (e.getNativeEvent().ctrlKey) { this.setMultiSelect(true); From 5dc664dcb0967d1225abc4d2812a9a6ba3e1ef96 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 11:23:09 +0100 Subject: [PATCH 60/68] [skip ci] minor --- .../client/source/class/osparc/file/FolderViewer.js | 3 --- .../client/source/class/osparc/file/TreeFolderView.js | 3 +++ 2 files changed, 3 insertions(+), 3 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 18b46f1d7b2..932c2ed9381 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderViewer.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderViewer.js @@ -81,9 +81,6 @@ qx.Class.define("osparc.file.FolderViewer", { folderContent.addListener("openItemSelected", e => { const entry = e.getData(); this.fireDataEvent("openItemSelected", entry); - if (osparc.file.FilesTree.isDir(entry)) { - this.setFolder(entry); - } }); }, diff --git a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js index 66614625f09..a469becbf05 100644 --- a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js +++ b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js @@ -97,6 +97,9 @@ qx.Class.define("osparc.file.TreeFolderView", { const data = e.getData(); folderTree.openNodeAndParents(data); folderTree.setSelection(new qx.data.Array([data])); + if (osparc.file.FilesTree.isDir(data)) { + folderViewer.setFolder(data); + } }, this); folderViewer.addListener("folderUp", e => { From 33751267cc214ebb4579960f0e632226b29166f7 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 11:39:23 +0100 Subject: [PATCH 61/68] minor --- .../client/source/class/osparc/file/FolderContent.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FolderContent.js b/services/static-webserver/client/source/class/osparc/file/FolderContent.js index 3100e472423..98cd8d94080 100644 --- a/services/static-webserver/client/source/class/osparc/file/FolderContent.js +++ b/services/static-webserver/client/source/class/osparc/file/FolderContent.js @@ -78,6 +78,10 @@ qx.Class.define("osparc.file.FolderContent", { return item; }, + getIcon: function(entry) { + return osparc.file.FilesTree.isDir(entry) ? "@MaterialIcons/folder" : "@MaterialIcons/insert_drive_file"; + }, + T_POS: { TYPE: 0, NAME: 1, @@ -136,7 +140,7 @@ qx.Class.define("osparc.file.FolderContent", { const datas = []; children.forEach(child => { const data = { - icon: child.getIcon ? child.getIcon() : this.__getIcon(child), + icon: child.getIcon ? child.getIcon() : this.self().getIcon(child), label: child.getLabel(), lastModified: child.getLastModified ? osparc.utils.Utils.formatDateAndTime(new Date(child.getLastModified())) : "", size: child.getSize ? osparc.utils.Utils.bytesToSize(child.getSize()) : "", @@ -192,10 +196,6 @@ qx.Class.define("osparc.file.FolderContent", { return items; }, - __getIcon: function(entry) { - return osparc.file.FilesTree.isDir(entry) ? "@MaterialIcons/folder" : "@MaterialIcons/insert_drive_file"; - }, - __getEntries: function() { if (this.getFolder()) { const children = this.getFolder().getChildren().toArray(); From 8ed0218b30be406d6101e6345ec6f03ebe312861 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 12:31:37 +0100 Subject: [PATCH 62/68] getParent --- .../client/source/class/osparc/file/FilesTree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 0a01d30ba11..4159d55b1f9 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -457,7 +457,7 @@ qx.Class.define("osparc.file.FilesTree", { const root = this.getModel(); const list = []; this.__getItemsInTree(root, list); - return list.find(element => element.getChildren && element.getChildren().contains(childItem)); + return list.find(element => element.getChildren && childItem.getPath && element.getChildren().toArray().find(child => child.getPath() === childItem.getPath())); }, findItemId: function(itemId) { From 3b51124133703e491789ca252dde158dbf9940ed Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 13:09:44 +0100 Subject: [PATCH 63/68] setFolder --- .../client/source/class/osparc/file/FilesTree.js | 5 +++-- .../client/source/class/osparc/file/TreeFolderView.js | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilesTree.js b/services/static-webserver/client/source/class/osparc/file/FilesTree.js index 4159d55b1f9..76fd6050315 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilesTree.js +++ b/services/static-webserver/client/source/class/osparc/file/FilesTree.js @@ -197,9 +197,9 @@ qx.Class.define("osparc.file.FilesTree", { requestPathItems: function(locationId, path) { const dataStore = osparc.store.Data.getInstance(); - dataStore.getItemsByLocationAndPath(locationId, path) + return dataStore.getItemsByLocationAndPath(locationId, path) .then(items => { - this.__itemsToTree(locationId, path, items); + return this.__itemsToTree(locationId, path, items); }); }, @@ -402,6 +402,7 @@ qx.Class.define("osparc.file.FilesTree", { } this.__filesReceived(locationId, path, items); + return parentModel || null; }, __itemsToLocation: function(locationId, items) { diff --git a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js index a469becbf05..b46e489607b 100644 --- a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js +++ b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js @@ -113,7 +113,12 @@ qx.Class.define("osparc.file.TreeFolderView", { folderViewer.addListener("requestPathItems", e => { const data = e.getData(); - folderTree.requestPathItems(data.locationId, data.path); + folderTree.requestPathItems(data.locationId, data.path) + .then(pathModel => { + if (osparc.file.FilesTree.isDir(pathModel)) { + folderViewer.setFolder(pathModel); + } + }); }, this); }, From 1074a06c84c1b0a0a14f7aa7ebeacbde8ab72d98 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 13:23:31 +0100 Subject: [PATCH 64/68] file picker file --- .../source/class/osparc/file/FilePicker.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FilePicker.js b/services/static-webserver/client/source/class/osparc/file/FilePicker.js index e997f5d9504..c7449eb6233 100644 --- a/services/static-webserver/client/source/class/osparc/file/FilePicker.js +++ b/services/static-webserver/client/source/class/osparc/file/FilePicker.js @@ -155,17 +155,19 @@ qx.Class.define("osparc.file.FilePicker", { const params = { url: { locationId: outValue.store, - path: outValue.dataset + path: outValue.path } }; osparc.data.Resources.fetch("storagePaths", "getPaths", params) - .then(files => { - const fileMetadata = files.find(file => file.file_id === outValue.path); - if (fileMetadata) { - resolve(fileMetadata); - } else { - reject(); + .then(pagResp => { + if (pagResp["items"]) { + const file = pagResp["items"].find(item => item.path === outValue.path); + if (file) { + resolve(file["file_meta_data"]); + return; + } } + reject(); }) .catch(() => reject()); }); From d5e999ba9871b5d97d0217469ca03b3ed03fd834 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 14:11:58 +0100 Subject: [PATCH 65/68] add iseg to plus button --- .../client/source/resource/osparc/ui_config.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/services/static-webserver/client/source/resource/osparc/ui_config.json b/services/static-webserver/client/source/resource/osparc/ui_config.json index 2616e8a0709..54be5e1da8c 100644 --- a/services/static-webserver/client/source/resource/osparc/ui_config.json +++ b/services/static-webserver/client/source/resource/osparc/ui_config.json @@ -106,14 +106,18 @@ "resourceType": "service", "expectedKey": "simcore/services/dynamic/s4l-ui", "title": "Sim4Life", - "newStudyLabel": "New S4L project", + "newStudyLabel": "New Sim4Life", "idToWidget": "startS4LButton" }, { "resourceType": "service", "expectedKey": "simcore/services/dynamic/s4l-jupyter", "title": "Jupyter Lab", - "icon": "https://upload.wikimedia.org/wikipedia/commons/3/38/Jupyter_logo.svg", "newStudyLabel": "New S4L Jupyter Lab" + }, { + "resourceType": "service", + "expectedKey": "simcore/services/dynamic/iseg-web", + "title": "Segmentation", + "newStudyLabel": "Segmentation" }] } }, @@ -123,14 +127,18 @@ "resourceType": "service", "expectedKey": "simcore/services/dynamic/s4l-ui", "title": "Sim4Life", - "newStudyLabel": "New S4L project", + "newStudyLabel": "New Sim4Life", "idToWidget": "startS4LButton" }, { "resourceType": "service", "expectedKey": "simcore/services/dynamic/s4l-jupyter", - "icon": "https://upload.wikimedia.org/wikipedia/commons/3/38/Jupyter_logo.svg", "title": "Jupyter Lab", "newStudyLabel": "New S4L Jupyter Lab" + }, { + "resourceType": "service", + "expectedKey": "simcore/services/dynamic/iseg-web", + "title": "Segmentation", + "newStudyLabel": "Segmentation" }] } }, From c07c6b0f13fd9d1c9dc18e130bd63d4dacf0a922 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 14:27:08 +0100 Subject: [PATCH 66/68] simplify navigation --- .../class/osparc/file/TreeFolderView.js | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js index b46e489607b..882c191e9b8 100644 --- a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js +++ b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js @@ -87,19 +87,30 @@ qx.Class.define("osparc.file.TreeFolderView", { // Connect elements folderTree.addListener("selectionChanged", () => { const selectedFolder = folderTree.getSelectedItem(); - // if (selectedFolder && (osparc.file.FilesTree.isDir(selectedFolder) || (selectedFolder.getChildren && selectedFolder.getChildren().length))) { - if (selectedFolder && osparc.file.FilesTree.isDir(selectedFolder)) { - folderViewer.setFolder(selectedFolder); + if (selectedFolder) { + if (selectedFolder.getPath()) { + folderTree.requestPathItems(selectedFolder.getLocation(), selectedFolder.getPath()) + .then(pathModel => { + if (osparc.file.FilesTree.isDir(pathModel)) { + folderViewer.setFolder(pathModel); + } + }); + } else if (osparc.file.FilesTree.isDir(selectedFolder)) { + folderViewer.setFolder(selectedFolder); + } } }, this); folderViewer.addListener("openItemSelected", e => { const data = e.getData(); - folderTree.openNodeAndParents(data); - folderTree.setSelection(new qx.data.Array([data])); - if (osparc.file.FilesTree.isDir(data)) { - folderViewer.setFolder(data); - } + folderTree.requestPathItems(data.getLocation(), data.getPath()) + .then(pathModel => { + folderTree.openNodeAndParents(pathModel); + folderTree.setSelection(new qx.data.Array([pathModel])); + if (osparc.file.FilesTree.isDir(pathModel)) { + folderViewer.setFolder(pathModel); + } + }); }, this); folderViewer.addListener("folderUp", e => { @@ -107,19 +118,11 @@ qx.Class.define("osparc.file.TreeFolderView", { const parent = folderTree.getParent(currentFolder); if (parent) { folderTree.setSelection(new qx.data.Array([parent])); - folderViewer.setFolder(parent); + if (osparc.file.FilesTree.isDir(parent)) { + folderViewer.setFolder(parent); + } } }, this); - - folderViewer.addListener("requestPathItems", e => { - const data = e.getData(); - folderTree.requestPathItems(data.locationId, data.path) - .then(pathModel => { - if (osparc.file.FilesTree.isDir(pathModel)) { - folderViewer.setFolder(pathModel); - } - }); - }, this); }, openPath: function(path) { From be749c4a38fd2b6fb1bb7985ae1a96432b85f438 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 14:38:19 +0100 Subject: [PATCH 67/68] minor --- .../client/source/class/osparc/file/FileTreeItem.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js index a097e873230..7ef50a49ed4 100644 --- a/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js +++ b/services/static-webserver/client/source/class/osparc/file/FileTreeItem.js @@ -187,9 +187,4 @@ qx.Class.define("osparc.file.FileTreeItem", { } } }, - - destruct: function() { - this._dateFormat.dispose(); - this._dateFormat = null; - } }); From 0629e55f385ad67773659857083a742d4769a648 Mon Sep 17 00:00:00 2001 From: odeimaiz Date: Wed, 5 Mar 2025 14:46:17 +0100 Subject: [PATCH 68/68] sync tree and folder --- .../class/osparc/file/TreeFolderView.js | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js index 882c191e9b8..fe228c0e7f7 100644 --- a/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js +++ b/services/static-webserver/client/source/class/osparc/file/TreeFolderView.js @@ -84,33 +84,38 @@ qx.Class.define("osparc.file.TreeFolderView", { const folderTree = this.getChildControl("folder-tree"); const folderViewer = this.getChildControl("folder-viewer"); - // Connect elements folderTree.addListener("selectionChanged", () => { - const selectedFolder = folderTree.getSelectedItem(); - if (selectedFolder) { - if (selectedFolder.getPath()) { - folderTree.requestPathItems(selectedFolder.getLocation(), selectedFolder.getPath()) + const selectedModel = folderTree.getSelectedItem(); + if (selectedModel) { + if (selectedModel.getPath() && !selectedModel.getLoaded()) { + folderTree.requestPathItems(selectedModel.getLocation(), selectedModel.getPath()) .then(pathModel => { if (osparc.file.FilesTree.isDir(pathModel)) { folderViewer.setFolder(pathModel); } }); - } else if (osparc.file.FilesTree.isDir(selectedFolder)) { - folderViewer.setFolder(selectedFolder); + } else if (osparc.file.FilesTree.isDir(selectedModel)) { + folderViewer.setFolder(selectedModel); } } }, this); folderViewer.addListener("openItemSelected", e => { - const data = e.getData(); - folderTree.requestPathItems(data.getLocation(), data.getPath()) - .then(pathModel => { - folderTree.openNodeAndParents(pathModel); - folderTree.setSelection(new qx.data.Array([pathModel])); - if (osparc.file.FilesTree.isDir(pathModel)) { - folderViewer.setFolder(pathModel); - } - }); + const selectedModel = e.getData(); + if (selectedModel) { + if (selectedModel.getPath() && !selectedModel.getLoaded()) { + folderTree.requestPathItems(selectedModel.getLocation(), selectedModel.getPath()) + .then(pathModel => { + folderTree.openNodeAndParents(pathModel); + folderTree.setSelection(new qx.data.Array([pathModel])); + if (osparc.file.FilesTree.isDir(pathModel)) { + folderViewer.setFolder(pathModel); + } + }); + } else if (osparc.file.FilesTree.isDir(selectedModel)) { + folderViewer.setFolder(selectedModel); + } + } }, this); folderViewer.addListener("folderUp", e => {