Skip to content

Commit 189821d

Browse files
authored
🐛 [Frontend] Fix: Cropped Fontawesome images (#7369)
1 parent 0d04169 commit 189821d

File tree

16 files changed

+467
-415
lines changed

16 files changed

+467
-415
lines changed

services/static-webserver/client/source/class/osparc/dashboard/GridButtonBase.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ qx.Class.define("osparc.dashboard.GridButtonBase", {
140140
const hGrid = new qx.ui.layout.Grid().set({
141141
spacing: 6,
142142
});
143+
hGrid.setRowFlex(0, 1);
143144
hGrid.setColumnFlex(1, 1);
144145
hGrid.setColumnAlign(0, "right", "middle");
145146
hGrid.setColumnAlign(1, "left", "middle");
@@ -149,6 +150,7 @@ qx.Class.define("osparc.dashboard.GridButtonBase", {
149150
paddingBottom: 6,
150151
paddingRight: 4,
151152
maxWidth: this.self().ITEM_WIDTH,
153+
minHeight: 32 + 6,
152154
maxHeight: this.self().ITEM_HEIGHT
153155
});
154156
control.setLayout(hGrid);
@@ -283,18 +285,11 @@ qx.Class.define("osparc.dashboard.GridButtonBase", {
283285

284286
// overridden
285287
_applyThumbnail: function(value, old) {
286-
if (value.includes("@FontAwesome5Solid/")) {
288+
if (qx.util.ResourceManager.getInstance().isFontUri(value)) {
287289
value += this.self().THUMBNAIL_SIZE;
288-
const image = this.getChildControl("thumbnail").set({
290+
this.getChildControl("thumbnail").set({
289291
source: value,
290292
});
291-
292-
[
293-
"appear",
294-
"loaded"
295-
].forEach(eventName => {
296-
image.addListener(eventName, () => this.__fitThumbnailHeight(), this);
297-
});
298293
} else {
299294
let source = osparc.product.Utils.getThumbnailUrl();
300295
osparc.utils.Utils.checkImageExists(value)

services/static-webserver/client/source/class/osparc/dashboard/ServiceBrowser.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ qx.Class.define("osparc.dashboard.ServiceBrowser", {
4848
// overridden
4949
initResources: function() {
5050
this._resourcesList = [];
51-
osparc.store.Services.getServicesLatest(false)
51+
osparc.store.Services.getServicesLatest()
5252
.then(services => {
5353
// Show "Contact Us" message if services.length === 0
5454
// Most probably is a product-stranger user (it can also be that the catalog is down)

services/static-webserver/client/source/class/osparc/study/Utils.js

Lines changed: 76 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -169,80 +169,83 @@ qx.Class.define("osparc.study.Utils", {
169169

170170
createStudyFromTemplate: function(templateData, loadingPage, contextProps = {}) {
171171
return new Promise((resolve, reject) => {
172-
const inaccessibleServices = osparc.store.Services.getInaccessibleServices(templateData["workbench"]);
173-
if (inaccessibleServices.length) {
174-
const msg = osparc.store.Services.getInaccessibleServicesMsg(inaccessibleServices, templateData["workbench"]);
175-
reject({
176-
message: msg
172+
osparc.store.Services.getStudyServicesMetadata(templateData)
173+
.finally(() => {
174+
const inaccessibleServices = osparc.store.Services.getInaccessibleServices(templateData["workbench"]);
175+
if (inaccessibleServices.length) {
176+
const msg = osparc.store.Services.getInaccessibleServicesMsg(inaccessibleServices, templateData["workbench"]);
177+
reject({
178+
message: msg
179+
});
180+
return;
181+
}
182+
// context props, otherwise Study will be created in the root folder of my personal workspace
183+
const minStudyData = Object.assign(osparc.data.model.Study.createMinStudyObject(), contextProps);
184+
minStudyData["name"] = templateData["name"];
185+
minStudyData["description"] = templateData["description"];
186+
minStudyData["thumbnail"] = templateData["thumbnail"];
187+
const params = {
188+
url: {
189+
templateId: templateData["uuid"]
190+
},
191+
data: minStudyData
192+
};
193+
const options = {
194+
pollTask: true
195+
};
196+
const fetchPromise = osparc.data.Resources.fetch("studies", "postNewStudyFromTemplate", params, options);
197+
const pollTasks = osparc.data.PollTasks.getInstance();
198+
const interval = 1000;
199+
pollTasks.createPollingTask(fetchPromise, interval)
200+
.then(task => {
201+
const title = qx.locale.Manager.tr("CREATING ") + osparc.product.Utils.getStudyAlias({allUpperCase: true}) + " ...";
202+
const progressSequence = new osparc.widget.ProgressSequence(title).set({
203+
minHeight: 180 // four tasks
204+
});
205+
progressSequence.addOverallProgressBar();
206+
loadingPage.clearMessages();
207+
loadingPage.addWidgetToMessages(progressSequence);
208+
task.addListener("updateReceived", e => {
209+
const updateData = e.getData();
210+
if ("task_progress" in updateData && loadingPage) {
211+
const progress = updateData["task_progress"];
212+
const message = progress["message"];
213+
const percent = progress["percent"] ? parseFloat(progress["percent"].toFixed(3)) : progress["percent"];
214+
progressSequence.setOverallProgress(percent);
215+
const existingTask = progressSequence.getTask(message);
216+
if (existingTask) {
217+
// update task
218+
osparc.widget.ProgressSequence.updateTaskProgress(existingTask, {
219+
value: percent,
220+
progressLabel: parseFloat((percent*100).toFixed(2)) + "%"
221+
});
222+
} else {
223+
// new task
224+
// all the previous steps to 100%
225+
progressSequence.getTasks().forEach(tsk => osparc.widget.ProgressSequence.updateTaskProgress(tsk, {
226+
value: 1,
227+
progressLabel: "100%"
228+
}));
229+
// and move to the next new task
230+
const subTask = progressSequence.addNewTask(message);
231+
osparc.widget.ProgressSequence.updateTaskProgress(subTask, {
232+
value: percent,
233+
progressLabel: "0%"
234+
});
235+
}
236+
}
237+
}, this);
238+
task.addListener("resultReceived", e => {
239+
const studyData = e.getData();
240+
resolve(studyData);
241+
}, this);
242+
task.addListener("pollingError", e => {
243+
const err = e.getData();
244+
reject(err);
245+
}, this);
246+
})
247+
.catch(err => reject(err));
177248
});
178-
return;
179-
}
180-
// context props, otherwise Study will be created in the root folder of my personal workspace
181-
const minStudyData = Object.assign(osparc.data.model.Study.createMinStudyObject(), contextProps);
182-
minStudyData["name"] = templateData["name"];
183-
minStudyData["description"] = templateData["description"];
184-
minStudyData["thumbnail"] = templateData["thumbnail"];
185-
const params = {
186-
url: {
187-
templateId: templateData["uuid"]
188-
},
189-
data: minStudyData
190-
};
191-
const options = {
192-
pollTask: true
193-
};
194-
const fetchPromise = osparc.data.Resources.fetch("studies", "postNewStudyFromTemplate", params, options);
195-
const pollTasks = osparc.data.PollTasks.getInstance();
196-
const interval = 1000;
197-
pollTasks.createPollingTask(fetchPromise, interval)
198-
.then(task => {
199-
const title = qx.locale.Manager.tr("CREATING ") + osparc.product.Utils.getStudyAlias({allUpperCase: true}) + " ...";
200-
const progressSequence = new osparc.widget.ProgressSequence(title).set({
201-
minHeight: 180 // four tasks
202-
});
203-
progressSequence.addOverallProgressBar();
204-
loadingPage.clearMessages();
205-
loadingPage.addWidgetToMessages(progressSequence);
206-
task.addListener("updateReceived", e => {
207-
const updateData = e.getData();
208-
if ("task_progress" in updateData && loadingPage) {
209-
const progress = updateData["task_progress"];
210-
const message = progress["message"];
211-
const percent = progress["percent"] ? parseFloat(progress["percent"].toFixed(3)) : progress["percent"];
212-
progressSequence.setOverallProgress(percent);
213-
const existingTask = progressSequence.getTask(message);
214-
if (existingTask) {
215-
// update task
216-
osparc.widget.ProgressSequence.updateTaskProgress(existingTask, {
217-
value: percent,
218-
progressLabel: parseFloat((percent*100).toFixed(2)) + "%"
219-
});
220-
} else {
221-
// new task
222-
// all the previous steps to 100%
223-
progressSequence.getTasks().forEach(tsk => osparc.widget.ProgressSequence.updateTaskProgress(tsk, {
224-
value: 1,
225-
progressLabel: "100%"
226-
}));
227-
// and move to the next new task
228-
const subTask = progressSequence.addNewTask(message);
229-
osparc.widget.ProgressSequence.updateTaskProgress(subTask, {
230-
value: percent,
231-
progressLabel: "0%"
232-
});
233-
}
234-
}
235-
}, this);
236-
task.addListener("resultReceived", e => {
237-
const studyData = e.getData();
238-
resolve(studyData);
239-
}, this);
240-
task.addListener("pollingError", e => {
241-
const err = e.getData();
242-
reject(err);
243-
}, this);
244-
})
245-
.catch(err => reject(err));
246249
});
247250
},
248251

services/static-webserver/client/source/class/osparc/workbench/ServiceCatalog.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,10 @@ qx.Class.define("osparc.workbench.ServiceCatalog", {
247247
osparc.store.Services.populateVersionsSelectBox(key, selectBox)
248248
.then(() => {
249249
osparc.utils.Utils.growSelectBox(selectBox, 200);
250-
selectBox.setSelection([latest]);
250+
const idx = selectBox.getSelectables().indexOf(latest);
251+
if (idx > -1) {
252+
selectBox.setSelection([latest]);
253+
}
251254
});
252255
}
253256
}

tests/e2e/jest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module.exports = {
22
preset: "jest-puppeteer",
33
verbose: true,
4-
collectCoverage: true,
4+
collectCoverage: false,
55
coverageReporters: ["lcov", "text"],
66
globals: {
77
url: "http://127.0.0.1.nip.io:9081/", // For local testing, set your deployed url here

tests/e2e/tests/register.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
const auto = require('../utils/auto');
2+
const utils = require('../utils/utils');
3+
4+
5+
const {
6+
user,
7+
pass
8+
} = utils.getUserAndPass();
9+
10+
module.exports = {
11+
registerAndLogOut: () => {
12+
describe('Register and LogOut', () => {
13+
const firstHandler = async response => {
14+
if (response.url().endsWith("/config")) {
15+
try {
16+
const respStatus = response.status();
17+
expect(respStatus).toBe(200);
18+
const responseBody = await response.json();
19+
expect(responseBody.data["invitation_required"]).toBeFalsy();
20+
} catch (e) {
21+
console.log("Puppeteer error", e);
22+
}
23+
} else if (response.url().endsWith("/register")) {
24+
try {
25+
const respStatus = response.status();
26+
expect(respStatus).toBe(200);
27+
} catch (e) {
28+
console.log("Puppeteer error", e);
29+
}
30+
}
31+
}
32+
33+
const secondHandler = response => {
34+
if (response.url().endsWith("/login")) {
35+
try {
36+
const respStatus = response.status();
37+
expect(respStatus).toBe(200);
38+
} catch (e) {
39+
console.log("Puppeteer error", e);
40+
}
41+
} else if (response.url().endsWith("/me")) {
42+
try {
43+
const respStatus = response.status();
44+
expect(respStatus).toBe(200);
45+
} catch (e) {
46+
console.log("Puppeteer error", e);
47+
}
48+
} else if (response.url().endsWith("/logout")) {
49+
expect(response.status()).toBe(200);
50+
}
51+
}
52+
53+
beforeAll(async () => {
54+
console.log("Start:", new Date().toUTCString());
55+
56+
await page.goto(url);
57+
}, ourTimeout);
58+
59+
afterAll(async () => {
60+
page.off('response', firstHandler);
61+
page.off('response', secondHandler);
62+
63+
console.log("End:", new Date().toUTCString());
64+
})
65+
66+
test('Register and Log Out', async () => {
67+
page.on('response', firstHandler);
68+
await auto.register(page, user, pass);
69+
page.on('response', secondHandler);
70+
await auto.logOut(page);
71+
await page.waitFor(5000);
72+
}, ourTimeout);
73+
});
74+
}
75+
}

tests/e2e/tests/register.test.js

Lines changed: 0 additions & 71 deletions
This file was deleted.

0 commit comments

Comments
 (0)