Skip to content

Commit 326d0e9

Browse files
authored
✨🐛 Various (ITISFoundation#3140)
1 parent f4df405 commit 326d0e9

File tree

22 files changed

+264
-119
lines changed

22 files changed

+264
-119
lines changed

services/web/client/source/class/osparc/Application.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,13 @@ qx.Class.define("osparc.Application", {
328328
view = new osparc.auth.LoginPageTI();
329329
this.__loadView(view);
330330
break;
331-
default:
331+
default: {
332332
view = new osparc.auth.LoginPage();
333333
this.__loadView(view, {
334334
top: "15%"
335335
});
336336
break;
337+
}
337338
}
338339
view.addListener("done", () => this.__restart(), this);
339340
},

services/web/client/source/class/osparc/auth/LoginPage.js

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,21 @@ qx.Class.define("osparc.auth.LoginPage", {
4545
layout.setRowFlex(1, 1);
4646
layout.setColumnFlex(0, 1);
4747
this._setLayout(layout);
48-
49-
const image = this._getLogoWPlatform();
50-
this._add(image, {
51-
row: 0,
52-
column: 0
53-
});
48+
osparc.utils.LibVersions.getPlatformName()
49+
.then(platformName => {
50+
let image = null;
51+
const now = new Date().getTime();
52+
const afterKZ = new Date("2022-07-01").getTime();
53+
if ((now < afterKZ) && platformName === "master") {
54+
image = this._getLogoWPlatform2();
55+
} else {
56+
image = this._getLogoWPlatform();
57+
}
58+
this._add(image, {
59+
row: 0,
60+
column: 0
61+
});
62+
});
5463

5564
const pages = this._getLoginStack();
5665
this._add(pages, {
@@ -75,6 +84,38 @@ qx.Class.define("osparc.auth.LoginPage", {
7584
return image;
7685
},
7786

87+
_getLogoWPlatform2: function() {
88+
const container = new qx.ui.container.Stack();
89+
[
90+
"osparc/kz_1.jpg",
91+
"osparc/kz_2.jpg",
92+
"osparc/kz_3.png",
93+
"osparc/kz_4.png"
94+
].forEach((src, i) => {
95+
const layout = new qx.ui.container.Composite(new qx.ui.layout.HBox());
96+
layout.add(new qx.ui.core.Spacer(), {
97+
flex: 1
98+
});
99+
const image = new qx.ui.basic.Image(src).set({
100+
allowShrinkX: true,
101+
allowShrinkY: true,
102+
width: 300,
103+
height: 150,
104+
scale: true
105+
});
106+
image.addListener("tap", () => {
107+
const nextIdx = i === 3 ? 0 : i+1;
108+
container.setSelection([container.getSelectables()[nextIdx]]);
109+
});
110+
layout.add(image);
111+
layout.add(new qx.ui.core.Spacer(), {
112+
flex: 1
113+
});
114+
container.add(layout);
115+
});
116+
return container;
117+
},
118+
78119
_getLoginStack: function() {
79120
const pages = new qx.ui.container.Stack().set({
80121
allowGrowX: false,

services/web/client/source/class/osparc/component/service/ServiceButtonList.js

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -48,31 +48,11 @@ qx.Class.define("osparc.component.service.ServiceButtonList", {
4848

4949
statics: {
5050
ITEM_WIDTH: 550,
51-
ITEM_HEIGHT: 40,
51+
ITEM_HEIGHT: 35,
5252
SERVICE_ICON: "@FontAwesome5Solid/paw/24"
5353
},
5454

5555
members: {
56-
_createChildControlImpl: function(id) {
57-
let control;
58-
switch (id) {
59-
case "hits":
60-
control = new qx.ui.basic.Label().set({
61-
anonymous: true,
62-
font: "text-13",
63-
allowGrowY: false,
64-
minWidth: 120,
65-
alignY: "middle"
66-
});
67-
this._add(control, {
68-
row: 0,
69-
column: osparc.dashboard.ListButtonBase.POS.HITS
70-
});
71-
break;
72-
}
73-
return control || this.base(arguments, id);
74-
},
75-
7656
__applyServiceModel: function(serviceModel) {
7757
// BASE
7858
if (serviceModel.getThumbnail()) {
@@ -85,7 +65,7 @@ qx.Class.define("osparc.component.service.ServiceButtonList", {
8565

8666
// ITEM
8767
this.__applyLatestVersion(serviceModel);
88-
this.__applyHits(serviceModel);
68+
this.__applyHitsOnItem(serviceModel);
8969
},
9070

9171
__applyLatestVersion: function(serviceModel) {
@@ -98,14 +78,14 @@ qx.Class.define("osparc.component.service.ServiceButtonList", {
9878
});
9979
},
10080

101-
__applyHits: function(serviceModel) {
102-
const hitsLabel = new qx.ui.basic.Label(this.tr("Latest: ") + String(serviceModel.hits)).set({
81+
__applyHitsOnItem: function(serviceModel) {
82+
const hitsLabel = new qx.ui.basic.Label(this.tr("Hits: ") + String(serviceModel.getHits())).set({
10383
alignY: "middle",
10484
toolTipText: this.tr("Number of times it was instantiated")
10585
});
10686
this._add(hitsLabel, {
10787
row: 0,
108-
column: osparc.dashboard.ListButtonBase.POS.HITS_LABEL
88+
column: osparc.dashboard.ListButtonBase.POS.HITS
10989
});
11090
},
11191

services/web/client/source/class/osparc/component/service/ServiceList.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ qx.Class.define("osparc.component.service.ServiceList", {
6262
allowEmptySelection: true
6363
});
6464

65-
osparc.utils.Services.sortBasedOnFav(model);
6665
model.toArray().forEach(service => {
6766
const button = new osparc.component.service.ServiceButtonList(service);
6867
if (this.__filterGroup !== null) {

services/web/client/source/class/osparc/component/widget/logger/LoggerView.js

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
6666
init: 0
6767
},
6868

69+
lockLogs: {
70+
apply : "__updateTable",
71+
nullable: false,
72+
check : "Boolean",
73+
init: true
74+
},
75+
6976
currentNodeId: {
7077
check: "String",
7178
nullable: true,
@@ -74,6 +81,12 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
7481
},
7582

7683
statics: {
84+
POS: {
85+
ORIGIN: 0,
86+
TIMESTAMP: 1,
87+
MESSAGE: 2
88+
},
89+
7790
LOG_LEVELS: {
7891
debug: -1,
7992
info: 0,
@@ -141,6 +154,19 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
141154
toolbar.add(control);
142155
break;
143156
}
157+
case "lock-logs-button": {
158+
control = new qx.ui.form.ToggleButton().set({
159+
toolTipText: this.tr("Toggle auto-scroll"),
160+
appearance: "toolbar-button"
161+
});
162+
control.bind("value", this, "lockLogs");
163+
control.bind("value", control, "icon", {
164+
converter: val => val ? "@FontAwesome5Solid/lock/14" : "@FontAwesome5Solid/lock-open/14"
165+
});
166+
const toolbar = this.getChildControl("toolbar");
167+
toolbar.add(control);
168+
break;
169+
}
144170
case "copy-to-clipboard": {
145171
const toolbar = this.getChildControl("toolbar");
146172
control = new qx.ui.form.Button().set({
@@ -152,6 +178,17 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
152178
toolbar.add(control);
153179
break;
154180
}
181+
case "download-logs-button": {
182+
const toolbar = this.getChildControl("toolbar");
183+
control = new qx.ui.form.Button().set({
184+
icon: "@FontAwesome5Solid/download/14",
185+
toolTipText: this.tr("Download logs"),
186+
appearance: "toolbar-button"
187+
});
188+
osparc.utils.Utils.setIdToWidget(control, "copyLogsToClipboardButton");
189+
toolbar.add(control);
190+
break;
191+
}
155192
}
156193
return control || this.base(arguments, id);
157194
},
@@ -173,10 +210,17 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
173210
}, this);
174211
toolbar.add(logLevelSelectBox);
175212

213+
const lockLogsButton = this.getChildControl("lock-logs-button");
214+
toolbar.add(lockLogsButton);
215+
176216
const copyToClipboardButton = this.getChildControl("copy-to-clipboard");
177217
copyToClipboardButton.addListener("execute", () => this.__copyLogsToClipboard(), this);
178218
toolbar.add(copyToClipboardButton);
179219

220+
const downloadButton = this.getChildControl("download-logs-button");
221+
downloadButton.addListener("execute", () => this.__downloadLogs(), this);
222+
toolbar.add(downloadButton);
223+
180224
return toolbar;
181225
},
182226

@@ -193,21 +237,22 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
193237
const table = this.__logView = new qx.ui.table.Table(loggerModel, custom).set({
194238
selectable: true,
195239
statusBarVisible: false,
196-
showCellFocusIndicator: false
240+
showCellFocusIndicator: false,
241+
rowHeight: 15,
242+
forceLineHeight: false
197243
});
198244
osparc.utils.Utils.setIdToWidget(table, "logsViewer");
199245
const colModel = table.getTableColumnModel();
200-
colModel.setDataCellRenderer(0, new qx.ui.table.cellrenderer.Html());
201-
colModel.setDataCellRenderer(1, new osparc.ui.table.cellrenderer.Html().set({
246+
colModel.setDataCellRenderer(this.self().POS.ORIGIN, new qx.ui.table.cellrenderer.Html());
247+
colModel.setDataCellRenderer(this.self().POS.TIMESTAMP, new osparc.ui.table.cellrenderer.Html().set({
202248
defaultCellStyle: "user-select: text"
203249
}));
204-
colModel.setDataCellRenderer(2, new osparc.ui.table.cellrenderer.Html().set({
250+
colModel.setDataCellRenderer(this.self().POS.MESSAGE, new osparc.ui.table.cellrenderer.Html().set({
205251
defaultCellStyle: "user-select: text"
206252
}));
207253
let resizeBehavior = colModel.getBehavior();
208-
resizeBehavior.setWidth(0, "15%");
209-
resizeBehavior.setWidth(1, "10%");
210-
resizeBehavior.setWidth(2, "75%");
254+
resizeBehavior.setWidth(this.self().POS.ORIGIN, 100);
255+
resizeBehavior.setWidth(this.self().POS.TIMESTAMP, 80);
211256

212257
this.__applyFilters();
213258

@@ -232,12 +277,21 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
232277
this.__textFilterField.setValue(node ? node.getLabel() : "");
233278
},
234279

235-
__copyLogsToClipboard: function() {
280+
__getLogsString: function() {
236281
let logs = "";
237282
this.__loggerModel.getRows().forEach(row => {
238-
logs += `(${row.nodeId}) ${row.label}: ${row.msg} \n`;
283+
logs += `(${row.nodeId}) - [${row.timeStamp}] ${row.label}: ${row.msg} \n`;
239284
});
240-
osparc.utils.Utils.copyTextToClipboard(logs);
285+
return logs;
286+
},
287+
288+
__copyLogsToClipboard: function() {
289+
osparc.utils.Utils.copyTextToClipboard(this.__getLogsString());
290+
},
291+
292+
__downloadLogs: function() {
293+
const logs = this.__getLogsString();
294+
osparc.utils.Utils.downloadContent("data:text/json;charset=utf-8," + logs, "logs.json");
241295
},
242296

243297
debug: function(nodeId, msg = "") {
@@ -287,6 +341,7 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
287341
label,
288342
timeStamp: new Date(),
289343
msg,
344+
tooltip: msg,
290345
logLevel
291346
};
292347
msgLogs.push(msgLog);
@@ -297,9 +352,13 @@ qx.Class.define("osparc.component.widget.logger.LoggerView", {
297352
},
298353

299354
__updateTable: function() {
300-
this.__loggerModel.reloadData();
301-
const nFilteredRows = this.__loggerModel.getFilteredRowCount();
302-
this.__logView.scrollCellVisible(0, nFilteredRows);
355+
if (this.__loggerModel) {
356+
this.__loggerModel.reloadData();
357+
if (!this.isLockLogs()) {
358+
const nFilteredRows = this.__loggerModel.getFilteredRowCount();
359+
this.__logView.scrollCellVisible(0, nFilteredRows);
360+
}
361+
}
303362
},
304363

305364
__applyFilters: function() {

services/web/client/source/class/osparc/component/workbench/BaseNodeUI.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ qx.Class.define("osparc.component.workbench.BaseNodeUI", {
6969
// eslint-disable-next-line no-underscore-dangle
7070
const width = captionTitle.__contentSize.width;
7171
if (width > maxWidth) {
72-
captionTitle.setToolTipText(this.getNode().getLabel());
72+
this.getNode().bind("label", captionTitle, "toolTipText");
7373
}
7474
}, this, 50);
7575
});

services/web/client/source/class/osparc/component/workbench/NodeUI.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ qx.Class.define("osparc.component.workbench.NodeUI", {
297297
const title = this.getChildControl("title");
298298
title.set({
299299
wrap: true,
300-
maxHeight: 28
300+
maxHeight: 28,
301+
maxWidth: 90
301302
});
302303

303304
const outputs = this.getNode().getOutputs();

services/web/client/source/class/osparc/component/workbench/ServiceCatalog.js

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ qx.Class.define("osparc.component.workbench.ServiceCatalog", {
9393
__infoBtn: null,
9494
__serviceBrowser: null,
9595
__addBtn: null,
96+
__sortByGroup: null,
9697

9798
__createFilterLayout: function() {
9899
const layout = new qx.ui.container.Composite(new qx.ui.layout.HBox(10)).set({
@@ -109,9 +110,34 @@ qx.Class.define("osparc.component.workbench.ServiceCatalog", {
109110
flex: 1
110111
});
111112

112-
const reloadBtn = new qx.ui.form.Button(this.tr("Reload"), "@FontAwesome5Solid/sync-alt/12");
113-
reloadBtn.addListener("execute", () => this.__populateList(true), this);
114-
layout.add(reloadBtn);
113+
if (osparc.data.Permissions.getInstance().isTester()) {
114+
const reloadBtn = new qx.ui.form.Button(this.tr("Reload"), "@FontAwesome5Solid/sync-alt/12");
115+
reloadBtn.addListener("execute", () => this.__populateList(true), this);
116+
layout.add(reloadBtn);
117+
}
118+
119+
const containterSortBtns = new qx.ui.container.Composite(new qx.ui.layout.HBox(4));
120+
const byNameBtn = new qx.ui.form.ToggleButton(null, "@FontAwesome5Solid/sort-alpha-down/12");
121+
byNameBtn.sortBy = "name";
122+
const byHitsBtn = new qx.ui.form.ToggleButton(null, "@FontAwesome5Solid/sort-numeric-down/12");
123+
byHitsBtn.sortBy = "hits";
124+
const sortByGroup = this.__sortByGroup = new qx.ui.form.RadioGroup().set({
125+
allowEmptySelection: false
126+
});
127+
[
128+
byNameBtn,
129+
byHitsBtn
130+
].forEach(btn => {
131+
containterSortBtns.add(btn);
132+
sortByGroup.add(btn);
133+
btn.getContentElement().setStyles({
134+
"border-radius": "8px"
135+
});
136+
});
137+
layout.add(containterSortBtns);
138+
139+
sortByGroup.addListener("changeSelection", () => this.__populateList());
140+
115141
return layout;
116142
},
117143

@@ -215,11 +241,14 @@ qx.Class.define("osparc.component.workbench.ServiceCatalog", {
215241
}
216242
});
217243

244+
osparc.utils.Services.addHits(filteredServices);
245+
osparc.utils.Services.sortObjectsBasedOn(filteredServices, this.__sortByGroup.getSelection()[0].sortBy);
218246
const filteredServicesObj = this.__filteredServicesObj = osparc.utils.Services.convertArrayToObject(filteredServices);
219247

220248
const groupedServicesList = [];
221249
for (const key in filteredServicesObj) {
222250
let service = osparc.utils.Services.getLatest(filteredServicesObj, key);
251+
osparc.utils.Services.addHits([service]);
223252
service = osparc.utils.Utils.deepCloneObject(service);
224253
osparc.utils.Services.removeFileToKeyMap(service);
225254
groupedServicesList.push(qx.data.marshal.Json.createModel(service));

0 commit comments

Comments
 (0)