Skip to content

Commit 50fcadf

Browse files
authored
Merge branch 'master' into fix/plan-after-template
2 parents 33635f0 + d5dca96 commit 50fcadf

File tree

9 files changed

+176
-51
lines changed

9 files changed

+176
-51
lines changed

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

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +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-
"deleteFolderRequested": "qx.event.type.Data"
49+
"deleteFolderRequested": "qx.event.type.Data",
50+
"changeContext": "qx.event.type.Data",
5051
},
5152

5253
properties: {
@@ -186,19 +187,38 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
186187
position: "bottom-right"
187188
});
188189

189-
const editButton = new qx.ui.menu.Button(this.tr("Rename..."), "@FontAwesome5Solid/pencil-alt/12");
190-
editButton.addListener("execute", () => this.__editFolder(), this);
191-
menu.add(editButton);
190+
const studyBrowserContext = osparc.store.Store.getInstance().getStudyBrowserContext();
191+
if (
192+
studyBrowserContext === "search" ||
193+
studyBrowserContext === "studiesAndFolders"
194+
) {
195+
const editButton = new qx.ui.menu.Button(this.tr("Rename..."), "@FontAwesome5Solid/pencil-alt/12");
196+
editButton.addListener("execute", () => this.__editFolder(), this);
197+
menu.add(editButton);
198+
199+
if (studyBrowserContext === "search") {
200+
const openLocationButton = new qx.ui.menu.Button(this.tr("Open location"), "@FontAwesome5Solid/external-link-alt/12");
201+
openLocationButton.addListener("execute", () => {
202+
const folder = this.getFolder();
203+
this.fireDataEvent("changeContext", {
204+
context: "studiesAndFolders",
205+
workspaceId: folder.getWorkspaceId(),
206+
folderId: folder.getParentFolderId(),
207+
});
208+
}, this);
209+
menu.add(openLocationButton);
210+
}
192211

193-
const moveToButton = new qx.ui.menu.Button(this.tr("Move to..."), "@FontAwesome5Solid/folder/12");
194-
moveToButton.addListener("execute", () => this.fireDataEvent("moveFolderToRequested", this.getFolderId()), this);
195-
menu.add(moveToButton);
212+
const moveToButton = new qx.ui.menu.Button(this.tr("Move to..."), "@FontAwesome5Solid/folder/12");
213+
moveToButton.addListener("execute", () => this.fireDataEvent("moveFolderToRequested", this.getFolderId()), this);
214+
menu.add(moveToButton);
196215

197-
menu.addSeparator();
216+
menu.addSeparator();
198217

199-
const deleteButton = new qx.ui.menu.Button(this.tr("Delete"), "@FontAwesome5Solid/trash/12");
200-
deleteButton.addListener("execute", () => this.__deleteFolderRequested(), this);
201-
menu.add(deleteButton);
218+
const deleteButton = new qx.ui.menu.Button(this.tr("Delete"), "@FontAwesome5Solid/trash/12");
219+
deleteButton.addListener("execute", () => this.__deleteFolderRequested(), this);
220+
menu.add(deleteButton);
221+
}
202222

203223
menuButton.setMenu(menu);
204224
},

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,14 @@ qx.Class.define("osparc.dashboard.ResourceBrowserBase", {
280280
const workspaceId = e.getData();
281281
this._workspaceSelected(workspaceId);
282282
}, this);
283+
resourcesContainer.addListener("changeContext", e => {
284+
const {
285+
context,
286+
workspaceId,
287+
folderId,
288+
} = e.getData();
289+
this._changeContext(context, workspaceId, folderId);
290+
}, this);
283291
resourcesContainer.addListener("workspaceUpdated", e => this._workspaceUpdated(e.getData()));
284292
resourcesContainer.addListener("deleteWorkspaceRequested", e => this._deleteWorkspaceRequested(e.getData()));
285293

@@ -479,6 +487,10 @@ qx.Class.define("osparc.dashboard.ResourceBrowserBase", {
479487
throw new Error("Abstract method called!");
480488
},
481489

490+
_changeContext: function(context, workspaceId, folderId) {
491+
throw new Error("Abstract method called!");
492+
},
493+
482494
_folderSelected: function(folderId) {
483495
throw new Error("Abstract method called!");
484496
},

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
7979
"workspaceSelected": "qx.event.type.Data",
8080
"workspaceUpdated": "qx.event.type.Data",
8181
"deleteWorkspaceRequested": "qx.event.type.Data",
82+
"changeContext": "qx.event.type.Data",
8283
},
8384

8485
statics: {
@@ -419,6 +420,7 @@ qx.Class.define("osparc.dashboard.ResourceContainerManager", {
419420
"folderUpdated",
420421
"moveFolderToRequested",
421422
"deleteFolderRequested",
423+
"changeContext",
422424
].forEach(eName => card.addListener(eName, e => this.fireDataEvent(eName, e.getData())));
423425
return card;
424426
},

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

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -171,17 +171,30 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
171171
if (
172172
!osparc.auth.Manager.getInstance().isLoggedIn() ||
173173
!osparc.utils.DisabledPlugins.isFoldersEnabled() ||
174-
this.getCurrentContext() !== "studiesAndFolders" ||
174+
this.getCurrentContext() === "workspaces" ||
175175
this.__loadingFolders
176176
) {
177177
return;
178178
}
179179

180-
const workspaceId = this.getCurrentWorkspaceId();
181-
const folderId = this.getCurrentFolderId();
182180
this.__loadingFolders = true;
181+
let request = null;
182+
switch (this.getCurrentContext()) {
183+
case "search": {
184+
const filterData = this._searchBarFilter.getFilterData();
185+
const text = filterData.text ? encodeURIComponent(filterData.text) : ""; // name, description and uuid
186+
request = osparc.store.Folders.getInstance().searchFolders(text, this.getOrderBy());
187+
break;
188+
}
189+
case "studiesAndFolders": {
190+
const workspaceId = this.getCurrentWorkspaceId();
191+
const folderId = this.getCurrentFolderId();
192+
request = osparc.store.Folders.getInstance().fetchFolders(folderId, workspaceId, this.getOrderBy());
193+
break;
194+
}
195+
}
183196
this.__setFoldersToList([]);
184-
osparc.store.Folders.getInstance().fetchFolders(folderId, workspaceId, this.getOrderBy())
197+
request
185198
.then(folders => {
186199
this.__setFoldersToList(folders);
187200
})
@@ -384,7 +397,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
384397
},
385398

386399
_workspaceSelected: function(workspaceId) {
387-
this.__changeContext("studiesAndFolders", workspaceId, null);
400+
this._changeContext("studiesAndFolders", workspaceId, null);
388401
},
389402

390403
_workspaceUpdated: function() {
@@ -444,7 +457,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
444457
},
445458

446459
_folderSelected: function(folderId) {
447-
this.__changeContext("studiesAndFolders", this.getCurrentWorkspaceId(), folderId);
460+
this._changeContext("studiesAndFolders", this.getCurrentWorkspaceId(), folderId);
448461
},
449462

450463
_folderUpdated: function() {
@@ -653,17 +666,23 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
653666
const requestParams = {};
654667
requestParams.orderBy = JSON.stringify(this.getOrderBy());
655668

656-
const filterData = this._searchBarFilter.getFilterData();
657-
// Use the ``search`` functionality only if the user types some text
658-
// tags should only be used to filter the current context (search context ot workspace/folder context)
659-
if (filterData.text) {
660-
requestParams.text = filterData.text ? encodeURIComponent(filterData.text) : ""; // name, description and uuid
661-
requestParams["tagIds"] = filterData.tags.length ? filterData.tags.join(",") : "";
662-
return requestParams;
669+
switch (this.getCurrentContext()) {
670+
case "studiesAndFolders":
671+
requestParams.workspaceId = this.getCurrentWorkspaceId();
672+
requestParams.folderId = this.getCurrentFolderId();
673+
break;
674+
case "search": {
675+
// Use the ``search`` functionality only if the user types some text
676+
// tags should only be used to filter the current context (search context ot workspace/folder context)
677+
const filterData = this._searchBarFilter.getFilterData();
678+
if (filterData.text) {
679+
requestParams.text = filterData.text ? encodeURIComponent(filterData.text) : ""; // name, description and uuid
680+
requestParams["tagIds"] = filterData.tags.length ? filterData.tags.join(",") : "";
681+
}
682+
break;
683+
}
663684
}
664685

665-
requestParams.workspaceId = this.getCurrentWorkspaceId();
666-
requestParams.folderId = this.getCurrentFolderId();
667686
return requestParams;
668687
},
669688

@@ -688,10 +707,16 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
688707
resolveWResponse: true
689708
};
690709

691-
if ("text" in requestParams) {
692-
return osparc.data.Resources.fetch("studies", "getPageSearch", params, options);
710+
let request = null;
711+
switch (this.getCurrentContext()) {
712+
case "search":
713+
request = osparc.data.Resources.fetch("studies", "getPageSearch", params, options);
714+
break;
715+
case "studiesAndFolders":
716+
request = osparc.data.Resources.fetch("studies", "getPage", params, options);
717+
break;
693718
}
694-
return osparc.data.Resources.fetch("studies", "getPage", params, options);
719+
return request;
695720
},
696721

697722
invalidateStudies: function() {
@@ -889,10 +914,11 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
889914
});
890915

891916
this._resourcesContainer.addListener("changeSelection", e => {
917+
const currentContext = this.getCurrentContext();
892918
const selection = e.getData();
893919

894920
studiesMoveButton.set({
895-
visibility: selection.length ? "visible" : "excluded",
921+
visibility: selection.length && currentContext === "studiesAndFolders" ? "visible" : "excluded",
896922
label: selection.length > 1 ? this.tr("Move selected")+" ("+selection.length+")" : this.tr("Move")
897923
});
898924

@@ -913,35 +939,35 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
913939
header.addListener("locationChanged", () => {
914940
const workspaceId = header.getCurrentWorkspaceId();
915941
const folderId = header.getCurrentFolderId();
916-
this.__changeContext("studiesAndFolders", workspaceId, folderId);
942+
this._changeContext("studiesAndFolders", workspaceId, folderId);
917943
}, this);
918944

919945
const workspacesAndFoldersTree = this._resourceFilter.getWorkspacesAndFoldersTree();
920946
workspacesAndFoldersTree.addListener("locationChanged", e => {
921947
const context = e.getData();
922948
const workspaceId = context["workspaceId"];
923949
if (workspaceId === -1) {
924-
this.__changeContext("workspaces");
950+
this._changeContext("workspaces");
925951
} else {
926952
const folderId = context["folderId"];
927-
this.__changeContext("studiesAndFolders", workspaceId, folderId);
953+
this._changeContext("studiesAndFolders", workspaceId, folderId);
928954
}
929955
}, this);
930956

931957
this._searchBarFilter.addListener("filterChanged", e => {
932958
const filterData = e.getData();
933959
if (filterData.text) {
934-
this.__changeContext("search");
960+
this._changeContext("search");
935961
} else {
936962
const workspaceId = this.getCurrentWorkspaceId();
937963
const folderId = this.getCurrentFolderId();
938-
this.__changeContext("studiesAndFolders", workspaceId, folderId);
964+
this._changeContext("studiesAndFolders", workspaceId, folderId);
939965
}
940966
});
941967
}
942968
},
943969

944-
__changeContext: function(context, workspaceId = null, folderId = null) {
970+
_changeContext: function(context, workspaceId = null, folderId = null) {
945971
if (osparc.utils.DisabledPlugins.isFoldersEnabled()) {
946972
if (
947973
context !== "search" && // reload studies for a new search
@@ -953,6 +979,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
953979
return;
954980
}
955981

982+
osparc.store.Store.getInstance().setStudyBrowserContext(context);
956983
this.set({
957984
currentContext: context,
958985
currentWorkspaceId: workspaceId,
@@ -965,7 +992,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
965992
this._resourcesContainer.setResourcesToList([]);
966993

967994
if (context === "search") {
968-
this.__setFoldersToList([]);
995+
this.__reloadFolders();
969996
this.__reloadStudies();
970997
} else if (context === "workspaces") {
971998
this._searchBarFilter.resetFilters();
@@ -1345,7 +1372,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
13451372
__getOpenLocationMenuButton: function(studyData) {
13461373
const openLocationButton = new qx.ui.menu.Button(this.tr("Open location"), "@FontAwesome5Solid/external-link-alt/12");
13471374
openLocationButton.addListener("execute", () => {
1348-
this.__changeContext("studiesAndFolders", studyData["workspaceId"], studyData["folderId"]);
1375+
this._changeContext("studiesAndFolders", studyData["workspaceId"], studyData["folderId"]);
13491376
}, this);
13501377
return openLocationButton;
13511378
},

services/static-webserver/client/source/class/osparc/data/Resources.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,11 @@ qx.Class.define("osparc.data.Resources", {
301301
method: "GET",
302302
url: statics.API + "/folders?workspace_id={workspaceId}&folder_id={folderId}&offset={offset}&limit={limit}&order_by={orderBy}"
303303
},
304+
getPageSearch: {
305+
useCache: false,
306+
method: "GET",
307+
url: statics.API + "/folders:search?offset={offset}&limit={limit}&text={text}&order_by={orderBy}"
308+
},
304309
getOne: {
305310
method: "GET",
306311
url: statics.API + "/folders/{folderId}"
@@ -1368,7 +1373,7 @@ qx.Class.define("osparc.data.Resources", {
13681373
});
13691374
},
13701375

1371-
getAllPages: function(resource, params = {}) {
1376+
getAllPages: function(resource, params = {}, endpoint = "getPage") {
13721377
return new Promise((resolve, reject) => {
13731378
let resources = [];
13741379
let offset = 0;
@@ -1377,7 +1382,6 @@ qx.Class.define("osparc.data.Resources", {
13771382
}
13781383
params["url"]["offset"] = offset;
13791384
params["url"]["limit"] = 10;
1380-
const endpoint = "getPage";
13811385
const options = {
13821386
resolveWResponse: true
13831387
};

services/static-webserver/client/source/class/osparc/data/model/Folder.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ qx.Class.define("osparc.data.model.Folder", {
3737
owner: folderData.owner,
3838
createdAt: new Date(folderData.createdAt),
3939
lastModified: new Date(folderData.modifiedAt),
40+
trashedAt: folderData.trashedAt ? new Date(folderData.trashedAt) : this.getTrashedAt(),
4041
});
4142
},
4243

@@ -95,7 +96,13 @@ qx.Class.define("osparc.data.model.Folder", {
9596
nullable: true,
9697
init: null,
9798
event: "changeLastModified"
98-
}
99+
},
100+
101+
trashedAt: {
102+
check: "Date",
103+
nullable: true,
104+
init: null,
105+
},
99106
},
100107

101108
statics: {

services/static-webserver/client/source/class/osparc/data/model/Study.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ qx.Class.define("osparc.data.model.Study", {
5858
state: studyData.state || this.getState(),
5959
quality: studyData.quality || this.getQuality(),
6060
permalink: studyData.permalink || this.getPermalink(),
61-
dev: studyData.dev || this.getDev()
61+
dev: studyData.dev || this.getDev(),
62+
trashedAt: studyData.trashedAt ? new Date(studyData.trashedAt) : this.getTrashedAt(),
6263
});
6364

6465
const wbData = studyData.workbench || this.getWorkbench();
@@ -209,7 +210,13 @@ qx.Class.define("osparc.data.model.Study", {
209210
nullable: true,
210211
event: "changeReadOnly",
211212
init: true
212-
}
213+
},
214+
215+
trashedAt: {
216+
check: "Date",
217+
nullable: true,
218+
init: null,
219+
},
213220
// ------ ignore for serializing ------
214221
},
215222

@@ -218,7 +225,8 @@ qx.Class.define("osparc.data.model.Study", {
218225
"permalink",
219226
"state",
220227
"pipelineRunning",
221-
"readOnly"
228+
"readOnly",
229+
"trashedAt",
222230
],
223231

224232
IgnoreModelizationProps: [

0 commit comments

Comments
 (0)