Skip to content

Commit 38866c1

Browse files
authored
🎨 [Frontend] Enh Drag&Drop: Drop on Trash (#6972)
1 parent 38109f8 commit 38866c1

23 files changed

+255
-186
lines changed

services/static-webserver/client/source/class/osparc/auth/Data.js

+11
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,17 @@ qx.Class.define("osparc.auth.Data", {
147147
return this.getUsername();
148148
},
149149

150+
getFullName: function() {
151+
let name = "";
152+
if (this.getFirstName()) {
153+
name += this.getFirstName();
154+
}
155+
if (this.getLastName()) {
156+
name += " " + this.getLastName();
157+
}
158+
return name;
159+
},
160+
150161
getFriendlyRole: function() {
151162
const role = this.getRole();
152163
let friendlyRole = role.replace(/_/g, " ");

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

+67-1
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ qx.Class.define("osparc.dashboard.DragDropHelpers", {
161161
const folderOrigin = event.getData("osparc-moveFolder")["folderOrigin"];
162162
const folderToFolderData = {
163163
folderId: folderOrigin.getFolderId(),
164+
workspaceId: folderOrigin.getWorkspaceId(),
164165
destWorkspaceId,
165166
destFolderId,
166167
};
@@ -169,11 +170,76 @@ qx.Class.define("osparc.dashboard.DragDropHelpers", {
169170
},
170171
},
171172

173+
trashStudy: {
174+
dragOver: function(event) {
175+
let compatible = false;
176+
const studyDataOrigin = event.getData("osparc-moveStudy")["studyDataOrigin"];
177+
const workspaceIdOrigin = studyDataOrigin["workspaceId"];
178+
const workspaceOrigin = osparc.store.Workspaces.getInstance().getWorkspace(workspaceIdOrigin);
179+
// Compatibility checks:
180+
// - My Workspace -> Trash (0)
181+
// - Delete on Study
182+
// - Shared Workspace -> Trash (1)
183+
// - Delete on Shared Workspace
184+
if (workspaceIdOrigin === null) { // (0)
185+
compatible = osparc.data.model.Study.canIDelete(studyDataOrigin["accessRights"]);
186+
} else if (workspaceIdOrigin !== null) { // (1)
187+
compatible = workspaceOrigin.getMyAccessRights()["delete"];
188+
}
189+
190+
if (!compatible) {
191+
// do not allow
192+
event.preventDefault();
193+
}
194+
195+
const dragWidget = osparc.dashboard.DragWidget.getInstance();
196+
dragWidget.setDropAllowed(compatible);
197+
},
198+
199+
drop: function(event) {
200+
return event.getData("osparc-moveStudy")["studyDataOrigin"];
201+
},
202+
},
203+
204+
trashFolder: {
205+
dragOver: function(event) {
206+
let compatible = false;
207+
const folderOrigin = event.getData("osparc-moveFolder")["folderOrigin"];
208+
const workspaceIdOrigin = folderOrigin.getWorkspaceId();
209+
const workspaceOrigin = osparc.store.Workspaces.getInstance().getWorkspace(workspaceIdOrigin);
210+
// Compatibility checks:
211+
// - My Workspace -> Trash (0)
212+
// - Yes
213+
// - Shared Workspace -> Trash (1)
214+
// - Delete on Shared Workspace
215+
if (workspaceIdOrigin === null) { // (0)
216+
compatible = true;
217+
} else if (workspaceIdOrigin !== null) { // (1)
218+
compatible = workspaceOrigin.getMyAccessRights()["delete"];
219+
}
220+
221+
if (!compatible) {
222+
// do not allow
223+
event.preventDefault();
224+
}
225+
226+
const dragWidget = osparc.dashboard.DragWidget.getInstance();
227+
dragWidget.setDropAllowed(compatible);
228+
},
229+
230+
drop: function(event) {
231+
const folderOrigin = event.getData("osparc-moveFolder")["folderOrigin"];
232+
return folderOrigin.getFolderId();
233+
},
234+
},
235+
172236
dragLeave: function(item) {
173237
const dragWidget = osparc.dashboard.DragWidget.getInstance();
174238
dragWidget.setDropAllowed(false);
175239

176-
item.getChildControl("icon").resetTextColor();
240+
if (item) {
241+
item.getChildControl("icon").resetTextColor();
242+
}
177243
},
178244

179245
dragEnd: function(draggedItem) {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ qx.Class.define("osparc.dashboard.DragWidget", {
2727
}));
2828

2929
this.set({
30+
appearance: "strong-ui",
3031
opacity: 0.9,
3132
padding: 10,
3233
zIndex: 1000,
33-
backgroundColor: "strong-main",
3434
decorator: "rounded",
3535
visibility: "excluded",
3636
});
@@ -71,7 +71,7 @@ qx.Class.define("osparc.dashboard.DragWidget", {
7171
__dropAllowed: function(allowed) {
7272
this.getChildControl("allowed-icon").set({
7373
source: allowed ? "@FontAwesome5Solid/check/14" : "@FontAwesome5Solid/times/14",
74-
textColor: allowed ? "text" : "danger-red",
74+
textColor: allowed ? "default-button-text" : "danger-red",
7575
});
7676
},
7777

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

+1-19
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
272272
menu.addSeparator();
273273

274274
const trashButton = new qx.ui.menu.Button(this.tr("Trash"), "@FontAwesome5Solid/trash/12");
275-
trashButton.addListener("execute", () => this.__trashFolderRequested(), this);
275+
trashButton.addListener("execute", () => this.fireDataEvent("trashFolderRequested", this.getFolderId()), this);
276276
menu.add(trashButton);
277277
} else if (studyBrowserContext === "trash") {
278278
const restoreButton = new qx.ui.menu.Button(this.tr("Restore"), "@MaterialIcons/restore_from_trash/16");
@@ -325,24 +325,6 @@ qx.Class.define("osparc.dashboard.FolderButtonItem", {
325325
folderEditor.addListener("cancel", () => win.close());
326326
},
327327

328-
__trashFolderRequested: function() {
329-
const trashDays = osparc.store.StaticInfo.getInstance().getTrashRetentionDays();
330-
let msg = this.tr("Are you sure you want to move the Folder and all its content to the trash?");
331-
msg += "<br><br>" + this.tr("It will be permanently deleted after ") + trashDays + " days.";
332-
const confirmationWin = new osparc.ui.window.Confirmation(msg).set({
333-
caption: this.tr("Move to Trash"),
334-
confirmText: this.tr("Move to Trash"),
335-
confirmAction: "delete"
336-
});
337-
confirmationWin.center();
338-
confirmationWin.open();
339-
confirmationWin.addListener("close", () => {
340-
if (confirmationWin.getConfirmed()) {
341-
this.fireDataEvent("trashFolderRequested", this.getFolderId());
342-
}
343-
}, this);
344-
},
345-
346328
__deleteFolderRequested: function() {
347329
const msg = this.tr("Are you sure you want to delete") + " <b>" + this.getTitle() + "</b>?";
348330
const confirmationWin = new osparc.ui.window.Confirmation(msg).set({

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ qx.Class.define("osparc.dashboard.NewStudies", {
171171
const newPlanButton = new osparc.dashboard.GridButtonNew(title, desc);
172172
newPlanButton.setCardKey(templateInfo.idToWidget);
173173
osparc.utils.Utils.setIdToWidget(newPlanButton, templateInfo.idToWidget);
174-
newPlanButton.addListener("execute", () => newStudyClicked());
174+
newPlanButton.addListener("tap", () => newStudyClicked());
175175
return newPlanButton;
176176
},
177177

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

+29
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ qx.Class.define("osparc.dashboard.ResourceFilter", {
3535

3636
events: {
3737
"trashContext": "qx.event.type.Event",
38+
"trashStudyRequested": "qx.event.type.Data",
39+
"trashFolderRequested": "qx.event.type.Data",
3840
"changeSharedWith": "qx.event.type.Data",
3941
"changeSelectedTags": "qx.event.type.Data",
4042
"changeServiceType": "qx.event.type.Data"
@@ -114,9 +116,36 @@ qx.Class.define("osparc.dashboard.ResourceFilter", {
114116
}
115117
});
116118
this.evaluateTrashEmpty();
119+
this.__attachDropHandlers(trashButton);
117120
return trashButton;
118121
},
119122

123+
__attachDropHandlers: function(trashButton) {
124+
trashButton.setDroppable(true);
125+
126+
trashButton.addListener("dragover", e => {
127+
if (e.supportsType("osparc-moveStudy")) {
128+
osparc.dashboard.DragDropHelpers.trashStudy.dragOver(e);
129+
} else if (e.supportsType("osparc-moveFolder")) {
130+
osparc.dashboard.DragDropHelpers.trashFolder.dragOver(e);
131+
}
132+
});
133+
134+
trashButton.addListener("dragleave", () => {
135+
osparc.dashboard.DragDropHelpers.dragLeave();
136+
});
137+
138+
trashButton.addListener("drop", e => {
139+
if (e.supportsType("osparc-moveStudy")) {
140+
const studyData = osparc.dashboard.DragDropHelpers.trashStudy.drop(e);
141+
this.fireDataEvent("trashStudyRequested", studyData);
142+
} else if (e.supportsType("osparc-moveFolder")) {
143+
const folderId = osparc.dashboard.DragDropHelpers.trashFolder.drop(e);
144+
this.fireDataEvent("trashFolderRequested", folderId);
145+
}
146+
});
147+
},
148+
120149
evaluateTrashEmpty: function() {
121150
const studiesParams = {
122151
url: {

0 commit comments

Comments
 (0)