Skip to content

Commit 0718e14

Browse files
authored
✨ [Frontend] Enh: :search also /folders (#6713)
1 parent d9fb9d2 commit 0718e14

File tree

7 files changed

+155
-47
lines changed

7 files changed

+155
-47
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() {
@@ -886,10 +911,11 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
886911
});
887912

888913
this._resourcesContainer.addListener("changeSelection", e => {
914+
const currentContext = this.getCurrentContext();
889915
const selection = e.getData();
890916

891917
studiesMoveButton.set({
892-
visibility: selection.length ? "visible" : "excluded",
918+
visibility: selection.length && currentContext === "studiesAndFolders" ? "visible" : "excluded",
893919
label: selection.length > 1 ? this.tr("Move selected")+" ("+selection.length+")" : this.tr("Move")
894920
});
895921

@@ -910,35 +936,35 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
910936
header.addListener("locationChanged", () => {
911937
const workspaceId = header.getCurrentWorkspaceId();
912938
const folderId = header.getCurrentFolderId();
913-
this.__changeContext("studiesAndFolders", workspaceId, folderId);
939+
this._changeContext("studiesAndFolders", workspaceId, folderId);
914940
}, this);
915941

916942
const workspacesAndFoldersTree = this._resourceFilter.getWorkspacesAndFoldersTree();
917943
workspacesAndFoldersTree.addListener("locationChanged", e => {
918944
const context = e.getData();
919945
const workspaceId = context["workspaceId"];
920946
if (workspaceId === -1) {
921-
this.__changeContext("workspaces");
947+
this._changeContext("workspaces");
922948
} else {
923949
const folderId = context["folderId"];
924-
this.__changeContext("studiesAndFolders", workspaceId, folderId);
950+
this._changeContext("studiesAndFolders", workspaceId, folderId);
925951
}
926952
}, this);
927953

928954
this._searchBarFilter.addListener("filterChanged", e => {
929955
const filterData = e.getData();
930956
if (filterData.text) {
931-
this.__changeContext("search");
957+
this._changeContext("search");
932958
} else {
933959
const workspaceId = this.getCurrentWorkspaceId();
934960
const folderId = this.getCurrentFolderId();
935-
this.__changeContext("studiesAndFolders", workspaceId, folderId);
961+
this._changeContext("studiesAndFolders", workspaceId, folderId);
936962
}
937963
});
938964
}
939965
},
940966

941-
__changeContext: function(context, workspaceId = null, folderId = null) {
967+
_changeContext: function(context, workspaceId = null, folderId = null) {
942968
if (osparc.utils.DisabledPlugins.isFoldersEnabled()) {
943969
if (
944970
context !== "search" && // reload studies for a new search
@@ -950,6 +976,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
950976
return;
951977
}
952978

979+
osparc.store.Store.getInstance().setStudyBrowserContext(context);
953980
this.set({
954981
currentContext: context,
955982
currentWorkspaceId: workspaceId,
@@ -962,7 +989,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
962989
this._resourcesContainer.setResourcesToList([]);
963990

964991
if (context === "search") {
965-
this.__setFoldersToList([]);
992+
this.__reloadFolders();
966993
this.__reloadStudies();
967994
} else if (context === "workspaces") {
968995
this._searchBarFilter.resetFilters();
@@ -1342,7 +1369,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
13421369
__getOpenLocationMenuButton: function(studyData) {
13431370
const openLocationButton = new qx.ui.menu.Button(this.tr("Open location"), "@FontAwesome5Solid/external-link-alt/12");
13441371
openLocationButton.addListener("execute", () => {
1345-
this.__changeContext("studiesAndFolders", studyData["workspaceId"], studyData["folderId"]);
1372+
this._changeContext("studiesAndFolders", studyData["workspaceId"], studyData["folderId"]);
13461373
}, this);
13471374
return openLocationButton;
13481375
},

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/store/Folders.js

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ qx.Class.define("osparc.store.Folders", {
3131
"folderMoved": "qx.event.type.Data",
3232
},
3333

34+
statics: {
35+
curateOrderBy: function(orderBy) {
36+
const curatedOrderBy = osparc.utils.Utils.deepCloneObject(orderBy);
37+
if (curatedOrderBy.field !== "name") {
38+
// only "modified_at" and "name" supported
39+
curatedOrderBy.field = "modified_at";
40+
}
41+
return curatedOrderBy;
42+
},
43+
},
44+
3445
members: {
3546
foldersCached: null,
3647

@@ -40,20 +51,15 @@ qx.Class.define("osparc.store.Folders", {
4051
orderBy = {
4152
field: "modified_at",
4253
direction: "desc"
43-
}
54+
},
4455
) {
4556
if (osparc.auth.Data.getInstance().isGuest()) {
4657
return new Promise(resolve => {
4758
resolve([]);
4859
});
4960
}
5061

51-
const curatedOrderBy = osparc.utils.Utils.deepCloneObject(orderBy);
52-
if (curatedOrderBy.field !== "name") {
53-
// only "modified_at" and "name" supported
54-
curatedOrderBy.field = "modified_at";
55-
}
56-
62+
const curatedOrderBy = this.self().curateOrderBy(orderBy);
5763
const params = {
5864
url: {
5965
workspaceId,
@@ -72,6 +78,37 @@ qx.Class.define("osparc.store.Folders", {
7278
});
7379
},
7480

81+
searchFolders: function(
82+
text,
83+
orderBy = {
84+
field: "modified_at",
85+
direction: "desc"
86+
},
87+
) {
88+
if (osparc.auth.Data.getInstance().isGuest()) {
89+
return new Promise(resolve => {
90+
resolve([]);
91+
});
92+
}
93+
94+
const curatedOrderBy = this.self().curateOrderBy(orderBy);
95+
const params = {
96+
url: {
97+
text,
98+
orderBy: JSON.stringify(curatedOrderBy),
99+
}
100+
};
101+
return osparc.data.Resources.getInstance().getAllPages("folders", params, "getPageSearch")
102+
.then(foldersData => {
103+
const folders = [];
104+
foldersData.forEach(folderData => {
105+
const folder = this.__addToCache(folderData);
106+
folders.push(folder);
107+
});
108+
return folders;
109+
});
110+
},
111+
75112
postFolder: function(name, parentFolderId = null, workspaceId = null) {
76113
const newFolderData = {
77114
name,

0 commit comments

Comments
 (0)