diff --git a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js index e40aa1f74733..74ae7a7538d5 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceDetails.js @@ -63,7 +63,8 @@ qx.Class.define("osparc.dashboard.ResourceDetails", { break; } } - }); + }) + .catch(err => osparc.FlashMessenger.logError(err)); }, events: { diff --git a/services/static-webserver/client/source/class/osparc/pricing/ServicesList.js b/services/static-webserver/client/source/class/osparc/pricing/ServicesList.js index eb215da3c766..9c90f83b28eb 100644 --- a/services/static-webserver/client/source/class/osparc/pricing/ServicesList.js +++ b/services/static-webserver/client/source/class/osparc/pricing/ServicesList.js @@ -77,29 +77,42 @@ qx.Class.define("osparc.pricing.ServicesList", { .then(data => this.__populateList(data)); }, - __populateList: function(services) { - // before accessing the metadata in a sync way, we need to bring them to the cache - const metadataPromises = []; - services.forEach(service => { + __populateList: async function(services) { + const failedServices = []; + const servicePromises = services.map(async service => { const key = service["serviceKey"]; const version = service["serviceVersion"]; - metadataPromises.push(osparc.store.Services.getService(key, version)); - }); - Promise.all(metadataPromises) - .catch(err => console.error(err)) - .finally(() => { - const sList = []; - services.forEach(service => { - const key = service["serviceKey"]; - const version = service["serviceVersion"]; - const serviceMetadata = osparc.store.Services.getMetadata(key, version); - if (serviceMetadata) { - sList.push(new osparc.data.model.Service(serviceMetadata)); - } + try { + return await osparc.store.Services.getService(key, version); + } catch (err) { + console.error(err); + failedServices.push({ + key: service["serviceKey"], + version: service["serviceVersion"], }); - const servicesList = this.getChildControl("services-list"); - servicesList.setModel(new qx.data.Array(sList)); - }) + return null; // Return null to maintain array structure + } + }); + + const serviceModels = new qx.data.Array(); + // ensure that even if one request fails, the rest continue executing + const results = await Promise.allSettled(servicePromises); + results.forEach(result => { + if (result.status === "fulfilled" && result.value) { + const serviceMetadata = result.value; + serviceModels.push(new osparc.data.model.Service(serviceMetadata)); + } + }); + const servicesList = this.getChildControl("services-list"); + servicesList.setModel(serviceModels); + + if (failedServices.length) { + let msg = "Could not retrieve data from some services:
"; + failedServices.forEach(failedService => { + msg+= `- ${failedService.key}:${failedService.version}
`; + }); + osparc.FlashMessenger.logAs(msg, "WARNING"); + } }, __openAddServiceToPlan: function() { diff --git a/services/static-webserver/client/source/class/osparc/store/Services.js b/services/static-webserver/client/source/class/osparc/store/Services.js index 32d18ca41c11..f8a1c222b1ed 100644 --- a/services/static-webserver/client/source/class/osparc/store/Services.js +++ b/services/static-webserver/client/source/class/osparc/store/Services.js @@ -99,7 +99,7 @@ qx.Class.define("osparc.store.Services", { }, getService: function(key, version, useCache = true) { - return new Promise(resolve => { + return new Promise((resolve, reject) => { if ( useCache && this.__isInCache(key, version) && @@ -120,7 +120,10 @@ qx.Class.define("osparc.store.Services", { this.__addToCache(service) resolve(service); }) - .catch(console.error); + .catch(err => { + console.error(err); + reject(); + }); }); }, diff --git a/services/static-webserver/client/source/class/osparc/ui/window/Window.js b/services/static-webserver/client/source/class/osparc/ui/window/Window.js index 9dadc4288262..c8f8c304d308 100644 --- a/services/static-webserver/client/source/class/osparc/ui/window/Window.js +++ b/services/static-webserver/client/source/class/osparc/ui/window/Window.js @@ -75,6 +75,7 @@ qx.Class.define("osparc.ui.window.Window", { resizable: true, width: width, minHeight: minHeight, + maxHeight: Math.max(minHeight, document.documentElement.clientHeight), modal: true, clickAwayClose: 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 92bdc890e20a..092d04be44c8 100644 --- a/services/static-webserver/client/source/class/osparc/widget/StudyDataManager.js +++ b/services/static-webserver/client/source/class/osparc/widget/StudyDataManager.js @@ -58,9 +58,7 @@ qx.Class.define("osparc.widget.StudyDataManager", { if (!title) { title = osparc.product.Utils.getStudyAlias({firstUpperCase: true}) + qx.locale.Manager.tr(" Files"); } - return osparc.ui.window.Window.popUpInWindow(studyDataManager, title, osparc.dashboard.ResourceDetails.WIDTH, osparc.dashboard.ResourceDetails.HEIGHT).set({ - maxHeight: document.documentElement.clientHeight, - }); + return osparc.ui.window.Window.popUpInWindow(studyDataManager, title, osparc.dashboard.ResourceDetails.WIDTH, osparc.dashboard.ResourceDetails.HEIGHT); }, },