Skip to content

Commit e91a2d3

Browse files
committed
Merge branch 'feature/vip-store' of github.com:odeimaiz/osparc-simcore into feature/vip-store
2 parents 641a724 + 19cb202 commit e91a2d3

23 files changed

+1062
-237
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,14 @@ qx.Class.define("osparc.dashboard.CardBase", {
395395
return this.getResourceType() === resourceType;
396396
},
397397

398+
isItemNotClickable: function() {
399+
const studyBrowserContext = osparc.store.Store.getInstance().getStudyBrowserContext();
400+
return (
401+
this.getBlocked() === true || // It could be blocked by IN_USE or UNKNOWN_SERVICE
402+
(this.isResourceType("study") && (studyBrowserContext === "trash")) // It could a trashed study
403+
);
404+
},
405+
398406
__applyResourceData: function(resourceData) {
399407
let uuid = null;
400408
let owner = null;
@@ -776,9 +784,9 @@ qx.Class.define("osparc.dashboard.CardBase", {
776784
if (moveToButton) {
777785
moveToButton.setEnabled(osparc.study.Utils.canMoveTo(resourceData));
778786
}
779-
const deleteButton = menuButtons.find(menuBtn => "deleteButton" in menuBtn);
780-
if (deleteButton) {
781-
deleteButton.setEnabled(osparc.study.Utils.canBeDeleted(resourceData));
787+
const trashButton = menuButtons.find(menuBtn => "trashButton" in menuBtn);
788+
if (trashButton) {
789+
trashButton.setEnabled(osparc.study.Utils.canBeDeleted(resourceData));
782790
}
783791
}
784792
},

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,15 @@ qx.Class.define("osparc.dashboard.ContextBreadcrumbs", {
2424
this._setLayout(new qx.ui.layout.HBox(5).set({
2525
alignY: "middle"
2626
}));
27+
28+
osparc.store.Store.getInstance().addListener("changeStudyBrowserContext", () => this.__rebuild(), this);
2729
},
2830

2931
events: {
3032
"locationChanged": "qx.event.type.Data",
3133
},
3234

3335
properties: {
34-
currentContext: {
35-
check: ["studiesAndFolders", "workspaces", "search"],
36-
nullable: false,
37-
init: "studiesAndFolders",
38-
event: "changeCurrentContext",
39-
apply: "__rebuild"
40-
},
41-
4236
currentWorkspaceId: {
4337
check: "Number",
4438
nullable: true,
@@ -60,7 +54,8 @@ qx.Class.define("osparc.dashboard.ContextBreadcrumbs", {
6054
__rebuild: function() {
6155
this._removeAll();
6256

63-
if (this.getCurrentContext() !== "studiesAndFolders") {
57+
const currentContext = osparc.store.Store.getInstance().getStudyBrowserContext();
58+
if (currentContext !== "studiesAndFolders") {
6459
return;
6560
}
6661

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

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
4646
"folderSelected": "qx.event.type.Data",
4747
"folderUpdated": "qx.event.type.Data",
4848
"moveFolderToRequested": "qx.event.type.Data",
49+
"trashFolderRequested": "qx.event.type.Data",
50+
"untrashFolderRequested": "qx.event.type.Data",
4951
"deleteFolderRequested": "qx.event.type.Data",
5052
"changeContext": "qx.event.type.Data",
5153
},
@@ -85,7 +87,7 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
8587
check: "Date",
8688
nullable: true,
8789
apply: "__applyLastModified"
88-
}
90+
},
8991
},
9092

9193
members: {
@@ -219,6 +221,16 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
219221

220222
menu.addSeparator();
221223

224+
const trashButton = new qx.ui.menu.Button(this.tr("Trash"), "@FontAwesome5Solid/trash/12");
225+
trashButton.addListener("execute", () => this.__trashFolderRequested(), this);
226+
menu.add(trashButton);
227+
} else if (studyBrowserContext === "trash") {
228+
const restoreButton = new qx.ui.menu.Button(this.tr("Restore"), "@MaterialIcons/restore_from_trash/16");
229+
restoreButton.addListener("execute", () => this.fireDataEvent("untrashFolderRequested", this.getFolder()), this);
230+
menu.add(restoreButton);
231+
232+
menu.addSeparator();
233+
222234
const deleteButton = new qx.ui.menu.Button(this.tr("Delete"), "@FontAwesome5Solid/trash/12");
223235
osparc.utils.Utils.setIdToWidget(deleteButton, "deleteFolderMenuItem");
224236
deleteButton.addListener("execute", () => this.__deleteFolderRequested(), this);
@@ -229,7 +241,9 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
229241
},
230242

231243
__itemSelected: function(newVal) {
232-
if (newVal) {
244+
const studyBrowserContext = osparc.store.Store.getInstance().getStudyBrowserContext();
245+
// do not allow selecting workspace
246+
if (studyBrowserContext !== "trash" && newVal) {
233247
this.fireDataEvent("folderSelected", this.getFolderId());
234248
}
235249
this.setValue(false);
@@ -262,6 +276,24 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
262276
folderEditor.addListener("cancel", () => win.close());
263277
},
264278

279+
__trashFolderRequested: function() {
280+
const trashDays = osparc.store.StaticInfo.getInstance().getTrashRetentionDays();
281+
let msg = this.tr("Are you sure you want to move the Folder and all its content to the trash?");
282+
msg += "<br><br>" + this.tr("It will be permanently deleted after ") + trashDays + " days.";
283+
const confirmationWin = new osparc.ui.window.Confirmation(msg).set({
284+
caption: this.tr("Move to Trash"),
285+
confirmText: this.tr("Move to Trash"),
286+
confirmAction: "delete"
287+
});
288+
confirmationWin.center();
289+
confirmationWin.open();
290+
confirmationWin.addListener("close", () => {
291+
if (confirmationWin.getConfirmed()) {
292+
this.fireDataEvent("trashFolderRequested", this.getFolderId());
293+
}
294+
}, this);
295+
},
296+
265297
__deleteFolderRequested: function() {
266298
const msg = this.tr("Are you sure you want to delete") + " <b>" + this.getTitle() + "</b>?";
267299
const confirmationWin = new osparc.ui.window.Confirmation(msg).set({

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,7 @@ qx.Class.define("osparc.dashboard.GridButtonItem", {
188188
},
189189

190190
__itemSelected: function() {
191-
// It could be blocked by IN_USE or UNKNOWN_SERVICE
192-
if (this.getBlocked() === true) {
191+
if (this.isItemNotClickable()) {
193192
this.setValue(false);
194193
return;
195194
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,7 @@ qx.Class.define("osparc.dashboard.ListButtonItem", {
274274
},
275275

276276
__itemSelected: function() {
277-
// It could be blocked by IN_USE or UNKNOWN_SERVICE
278-
if (this.getBlocked() === true) {
277+
if (this.isItemNotClickable()) {
279278
this.setValue(false);
280279
return;
281280
}

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ qx.Class.define("osparc.dashboard.ResourceBrowserBase", {
244244
this._addToLayout(searchBarFilter);
245245
},
246246

247-
_createResourcesLayout: function() {
247+
_createResourcesLayout: function(flatListId) {
248248
const toolbar = this._toolbar = new qx.ui.toolbar.ToolBar().set({
249249
backgroundColor: "transparent",
250250
spacing: 10,
@@ -255,7 +255,13 @@ qx.Class.define("osparc.dashboard.ResourceBrowserBase", {
255255

256256
this.__viewModeLayout = new qx.ui.toolbar.Part();
257257

258-
const resourcesContainer = this._resourcesContainer = new osparc.dashboard.ResourceContainerManager();
258+
const resourcesContainer = this._resourcesContainer = new osparc.dashboard.ResourceContainerManager(this._resourceType);
259+
if (flatListId) {
260+
const list = this._resourcesContainer.getFlatList();
261+
if (list) {
262+
osparc.utils.Utils.setIdToWidget(list, flatListId);
263+
}
264+
}
259265
if (this._resourceType === "study") {
260266
const viewMode = osparc.utils.Utils.localCache.getLocalStorageItem("studiesViewMode");
261267
if (viewMode) {
@@ -270,6 +276,8 @@ qx.Class.define("osparc.dashboard.ResourceBrowserBase", {
270276
resourcesContainer.addListener("emptyStudyClicked", e => this._deleteResourceRequested(e.getData()));
271277
resourcesContainer.addListener("folderUpdated", e => this._folderUpdated(e.getData()));
272278
resourcesContainer.addListener("moveFolderToRequested", e => this._moveFolderToRequested(e.getData()));
279+
resourcesContainer.addListener("trashFolderRequested", e => this._trashFolderRequested(e.getData()));
280+
resourcesContainer.addListener("untrashFolderRequested", e => this._untrashFolderRequested(e.getData()));
273281
resourcesContainer.addListener("deleteFolderRequested", e => this._deleteFolderRequested(e.getData()));
274282
resourcesContainer.addListener("folderSelected", e => {
275283
const folderId = e.getData();
@@ -288,6 +296,8 @@ qx.Class.define("osparc.dashboard.ResourceBrowserBase", {
288296
this._changeContext(context, workspaceId, folderId);
289297
}, this);
290298
resourcesContainer.addListener("workspaceUpdated", e => this._workspaceUpdated(e.getData()));
299+
resourcesContainer.addListener("trashWorkspaceRequested", e => this._trashWorkspaceRequested(e.getData()));
300+
resourcesContainer.addListener("untrashWorkspaceRequested", e => this._untrashWorkspaceRequested(e.getData()));
291301
resourcesContainer.addListener("deleteWorkspaceRequested", e => this._deleteWorkspaceRequested(e.getData()));
292302

293303
this._addToLayout(resourcesContainer);
@@ -502,6 +512,14 @@ qx.Class.define("osparc.dashboard.ResourceBrowserBase", {
502512
throw new Error("Abstract method called!");
503513
},
504514

515+
_trashFolderRequested: function(folderId) {
516+
throw new Error("Abstract method called!");
517+
},
518+
519+
_untrashFolderRequested: function(folder) {
520+
throw new Error("Abstract method called!");
521+
},
522+
505523
_deleteFolderRequested: function(folderId) {
506524
throw new Error("Abstract method called!");
507525
},

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

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
qx.Class.define("osparc.dashboard.ResourceContainerManager", {
1919
extend: qx.ui.core.Widget,
2020

21-
construct: function() {
21+
construct: function(resourceType) {
2222
this.base(arguments);
2323

2424
this._setLayout(new qx.ui.layout.VBox(15));
@@ -27,19 +27,20 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
2727
paddingBottom: 60
2828
});
2929

30-
this.__foldersList = [];
3130
this.__workspacesList = [];
31+
this.__foldersList = [];
3232
this.__resourcesList = [];
3333
this.__groupedContainersList = [];
3434

35+
if (resourceType === "study") {
36+
const workspacesContainer = this.__workspacesContainer = new osparc.dashboard.ToggleButtonContainer();
37+
this._add(workspacesContainer);
38+
workspacesContainer.setVisibility(osparc.utils.DisabledPlugins.isFoldersEnabled() ? "visible" : "excluded");
3539

36-
const workspacesContainer = this.__workspacesContainer = new osparc.dashboard.ToggleButtonContainer();
37-
workspacesContainer.setVisibility(osparc.utils.DisabledPlugins.isFoldersEnabled() ? "visible" : "excluded");
38-
39-
40-
const foldersContainer = this.__foldersContainer = new osparc.dashboard.ToggleButtonContainer();
41-
this._add(foldersContainer);
42-
foldersContainer.setVisibility(osparc.utils.DisabledPlugins.isFoldersEnabled() ? "visible" : "excluded");
40+
const foldersContainer = this.__foldersContainer = new osparc.dashboard.ToggleButtonContainer();
41+
this._add(foldersContainer);
42+
foldersContainer.setVisibility(osparc.utils.DisabledPlugins.isFoldersEnabled() ? "visible" : "excluded");
43+
}
4344

4445
const nonGroupedContainer = this.__nonGroupedContainer = this.__createFlatList();
4546
this._add(nonGroupedContainer);
@@ -75,9 +76,13 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
7576
"folderSelected": "qx.event.type.Data",
7677
"folderUpdated": "qx.event.type.Data",
7778
"moveFolderToRequested": "qx.event.type.Data",
79+
"trashFolderRequested": "qx.event.type.Data",
80+
"untrashFolderRequested": "qx.event.type.Data",
7881
"deleteFolderRequested": "qx.event.type.Data",
7982
"workspaceSelected": "qx.event.type.Data",
8083
"workspaceUpdated": "qx.event.type.Data",
84+
"trashWorkspaceRequested": "qx.event.type.Data",
85+
"untrashWorkspaceRequested": "qx.event.type.Data",
8186
"deleteWorkspaceRequested": "qx.event.type.Data",
8287
"changeContext": "qx.event.type.Data",
8388
},
@@ -260,9 +265,13 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
260265
},
261266

262267
__cleanAll: function() {
263-
if (this.__workspacesContainer) {
264-
this.__workspacesContainer.removeAll();
268+
if (this._getChildren().includes(this.__nonGroupedContainer)) {
269+
this._remove(this.__nonGroupedContainer);
270+
}
271+
if (this._getChildren().includes(this.__groupedContainers)) {
272+
this._remove(this.__groupedContainers);
265273
}
274+
266275
if (this.__nonGroupedContainer) {
267276
this.__nonGroupedContainer.removeAll();
268277
this.__nonGroupedContainer = null;
@@ -274,7 +283,6 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
274283
groupedContainer.getContentContainer().removeAll();
275284
});
276285
this.__groupedContainersList = [];
277-
this._removeAll();
278286
},
279287

280288
__addFoldersContainer: function() {
@@ -299,9 +307,6 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
299307

300308
__rebuildLayout: function(resourceType) {
301309
this.__cleanAll();
302-
if (osparc.utils.DisabledPlugins.isFoldersEnabled()) {
303-
this.__addFoldersContainer();
304-
}
305310
if (this.getGroupBy()) {
306311
const noGroupContainer = this.__createGroupContainer("no-group", "No Group", "transparent");
307312
this.__groupedContainers.add(noGroupContainer);
@@ -361,8 +366,9 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
361366
},
362367

363368
reloadWorkspaces: function() {
364-
this.__cleanAll();
365-
this._add(this.__workspacesContainer);
369+
if (this.__workspacesContainer) {
370+
this.__workspacesContainer.removeAll();
371+
}
366372
let workspacesCards = [];
367373
this.__workspacesList.forEach(workspaceData => workspacesCards.push(this.__workspaceToCard(workspaceData)));
368374
return workspacesCards;
@@ -383,6 +389,8 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
383389
[
384390
"workspaceSelected",
385391
"workspaceUpdated",
392+
"trashWorkspaceRequested",
393+
"untrashWorkspaceRequested",
386394
"deleteWorkspaceRequested",
387395
].forEach(eName => card.addListener(eName, e => this.fireDataEvent(eName, e.getData())));
388396
return card;
@@ -419,6 +427,8 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
419427
"folderSelected",
420428
"folderUpdated",
421429
"moveFolderToRequested",
430+
"trashFolderRequested",
431+
"untrashFolderRequested",
422432
"deleteFolderRequested",
423433
"changeContext",
424434
].forEach(eName => card.addListener(eName, e => this.fireDataEvent(eName, e.getData())));
@@ -494,7 +504,7 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
494504
} else {
495505
groupContainer.exclude();
496506
}
497-
this._add(groupContainer);
507+
this.__groupedContainers.add(groupContainer);
498508
this.__moveNoGroupToLast();
499509
}
500510
const card = this.__createCard(resourceData);

0 commit comments

Comments
 (0)