Context menu support for multi-select options in drive

pull/1/head
yflory 8 years ago
parent e1c02fd8a4
commit 3f7dea8f7e

@ -353,24 +353,44 @@ define([
},0); },0);
}; };
var filterContextMenu = function ($menu, $element) { var filterContextMenu = function ($menu, paths) {
var path = $element.data('path'); //var path = $element.data('path');
var hide = []; var hide = [];
if (!APP.editable) { var hasFolder = false;
hide.push($menu.find('a.editable')); paths.forEach(function (p, i) {
} var path = p.path;
if (!isOwnDrive()) { var $element = p.element;
hide.push($menu.find('a.own')); if (!APP.editable) {
} hide.push($menu.find('a.editable'));
if ($element.is('.file-element')) { }
hide.push($menu.find('a.newfolder')); if (!isOwnDrive()) {
} else { hide.push($menu.find('a.own'));
hide.push($menu.find('a.open_ro')); }
} if ($element.is('.file-element')) {
if (path && path.length > 4) { // No folder in files
hide.push($menu.find('a.newfolder'));
} else {
if (hasFolder) {
// More than 1 folder selected: cannot create a new subfolder
hide.push($menu.find('a.newfolder'));
}
hasFolder = true;
hide.push($menu.find('a.open_ro'));
}
if (path && path.length > 4) {
hide.push($menu.find('a.restore'));
hide.push($menu.find('a.properties'));
}
});
if (paths.length > 1) {
hide.push($menu.find('a.restore')); hide.push($menu.find('a.restore'));
hide.push($menu.find('a.properties')); hide.push($menu.find('a.properties'));
hide.push($menu.find('a.rename'));
}
if (hasFolder && paths.length > 1) {
// Cannot open multiple folders
hide.push($menu.find('a.open'));
} }
return hide; return hide;
}; };
@ -384,9 +404,35 @@ define([
$driveToolbar.find('.path').css('max-width', 'calc(100vw - '+$tree.width()+'px - '+l+'px)'); $driveToolbar.find('.path').css('max-width', 'calc(100vw - '+$tree.width()+'px - '+l+'px)');
}; };
var getSelectedPaths = function ($element) {
var paths = [];
if ($iframe.find('.selected').length > 1) {
var $selected = $iframe.find('.selected');
$selected.each(function (idx, elmt) {
var ePath = $(elmt).data('path');
if (ePath) {
paths.push({
path: ePath,
element: $(elmt)
});
}
});
}
if (!paths.length) {
var path = $element.data('path');
if (!path) { return false; }
paths.push({
path: path,
element: $element
});
}
return paths;
};
var updateContextButton = function () { var updateContextButton = function () {
var $li = $content.find('.selected'); var $li = $content.find('.selected');
if ($li.length !== 1) { if ($li.length === 0) {
$li = findDataHolder($tree.find('.element.active')); $li = findDataHolder($tree.find('.element.active'));
} }
var $button = $driveToolbar.find('#contextButton'); var $button = $driveToolbar.find('#contextButton');
@ -412,13 +458,13 @@ define([
var $container = $driveToolbar.find('#contextButtonsContainer'); var $container = $driveToolbar.find('#contextButtonsContainer');
if (!$container.length) { return; } if (!$container.length) { return; }
$container.html(''); $container.html('');
var $element = $li; var $element = $li.length === 1 ? $li : $($li[0]);
var paths = getSelectedPaths($element);
var $menu = $element.data('context'); var $menu = $element.data('context');
var path = $element.data('path'); if (!$menu) { return; }
if (!$menu || !path) { return; }
var actions = []; var actions = [];
var $actions = $menu.find('a'); var $actions = $menu.find('a');
var toHide = filterContextMenu($menu, $element); var toHide = filterContextMenu($menu, paths);
$actions = $actions.filter(function (i, el) { $actions = $actions.filter(function (i, el) {
for (var j = 0; j < toHide.length; j++) { for (var j = 0; j < toHide.length; j++) {
if ($(el).is(toHide[j])) { return false; } if ($(el).is(toHide[j])) { return false; }
@ -433,8 +479,9 @@ define([
} else { } else {
$a.text($(el).text()); $a.text($(el).text());
} }
$(el).data('path', path); $(el).data('paths', paths);
$(el).data('element', $element); //$(el).data('path', path);
//:$(el).data('element', $element);
$container.append($a); $container.append($a);
$a.click(function() { $(el).click(); }); $a.click(function() { $(el).click(); });
}); });
@ -460,6 +507,9 @@ define([
$element.removeClass("selected"); $element.removeClass("selected");
} }
updateContextButton(); updateContextButton();
if ($iframe.find('.selected').length > 1) {
module.hideMenu();
}
}; };
// Open the selected context menu on the closest "li" element // Open the selected context menu on the closest "li" element
@ -475,10 +525,9 @@ define([
return false; return false;
} }
var path = $element.data('path'); var paths = getSelectedPaths($element);
if (!path) { return false; }
var toHide = filterContextMenu($menu, $element); var toHide = filterContextMenu($menu, paths);
toHide.forEach(function ($a) { toHide.forEach(function ($a) {
$a.parent('li').hide(); $a.parent('li').hide();
}); });
@ -495,10 +544,13 @@ define([
return true; return true;
} }
onElementClick(undefined, $element); if (paths.length === 1) {
onElementClick(undefined, $element);
}
$menu.find('a').data('path', path); $menu.find('a').data('paths', paths);
$menu.find('a').data('element', $element); //$menu.find('a').data('path', path);
//$menu.find('a').data('element', $element);
return false; return false;
}; };
@ -515,6 +567,7 @@ define([
}; };
var openTrashTreeContextMenu = function (e) { var openTrashTreeContextMenu = function (e) {
removeSelected();
$trashTreeContextMenu.find('li').show(); $trashTreeContextMenu.find('li').show();
openContextMenu(e, $trashTreeContextMenu); openContextMenu(e, $trashTreeContextMenu);
return false; return false;
@ -1690,62 +1743,76 @@ define([
$contextMenu.on("click", "a", function(e) { $contextMenu.on("click", "a", function(e) {
e.stopPropagation(); e.stopPropagation();
var path = $(this).data('path'); var paths = $(this).data('paths');
var $element = $(this).data('element'); //var path = $(this).data('path');
if (!$element || !path || path.length < 2) { //var $element = $(this).data('element');
if (paths.length === 0) {
log(Messages.fm_forbidden); log(Messages.fm_forbidden);
debug("Directory context menu on a forbidden or unexisting element. ", $element, path); debug("Directory context menu on a forbidden or unexisting element. ", paths);
return; return;
} }
if ($(this).hasClass("rename")) { if ($(this).hasClass("rename")) {
displayRenameInput($element, path); if (paths.length !== 1) { return; }
displayRenameInput(paths[0].element, paths[0].path);
} }
else if($(this).hasClass("delete")) { else if($(this).hasClass("delete")) {
moveElements([path], [TRASH], false, refresh); var pathsList = [];
paths.forEach(function (p) { pathsList.push(p.path); });
moveElements(pathsList, [TRASH], false, refresh);
} }
else if ($(this).hasClass('open')) { else if ($(this).hasClass('open')) {
$element.click(); paths.forEach(function (p) {
$element.dblclick(); var $element = p.element;
$element.click();
$element.dblclick();
});
} }
else if ($(this).hasClass('open_ro')) { else if ($(this).hasClass('open_ro')) {
var el = filesOp.findElement(files, path); paths.forEach(function (p) {
if (filesOp.isFolder(el)) { return; } var el = filesOp.findElement(files, p.path);
var roUrl = getReadOnlyUrl(el); if (filesOp.isFolder(el)) { return; }
openFile(roUrl); var roUrl = getReadOnlyUrl(el);
openFile(roUrl, false);
});
} }
else if ($(this).hasClass('newfolder')) { else if ($(this).hasClass('newfolder')) {
if (paths.length !== 1) { return; }
var onCreated = function (info) { var onCreated = function (info) {
module.newFolder = info.newPath; module.newFolder = info.newPath;
module.displayDirectory(path); module.displayDirectory(path);
}; };
filesOp.createNewFolder(path, null, onCreated); filesOp.createNewFolder(paths[0].path, null, onCreated);
} }
module.hideMenu(); module.hideMenu();
}); });
$defaultContextMenu.on("click", "a", function(e) { $defaultContextMenu.on("click", "a", function(e) {
e.stopPropagation(); e.stopPropagation();
var path = $(this).data('path'); var paths = $(this).data('paths');
var $element = $(this).data('element'); if (paths.length === 0) {
if (!$element || !path || path.length < 2) {
log(Messages.fm_forbidden); log(Messages.fm_forbidden);
debug("Directory context menu on a forbidden or unexisting element. ", $element, path); debug("Context menu on a forbidden or unexisting element. ", paths);
return; return;
} }
if ($(this).hasClass('open')) { if ($(this).hasClass('open')) {
$element.dblclick(); paths.forEach(function (p) {
var $element = p.element;
$element.dblclick();
});
} }
else if ($(this).hasClass('open_ro')) { else if ($(this).hasClass('open_ro')) {
var el = filesOp.findElement(files, path); paths.forEach(function (p) {
if (filesOp.isPathInFilesData(path)) { var el = filesOp.findElement(files, p.path);
el = el.href; if (filesOp.isPathInFilesData(p.path)) { el = el.href; }
} if (!el || filesOp.isFolder(el)) { return; }
if (!el || filesOp.isFolder(el)) { return; } var roUrl = getReadOnlyUrl(el);
var roUrl = getReadOnlyUrl(el); openFile(roUrl, false);
openFile(roUrl); });
} }
else if ($(this).hasClass('delete')) { else if ($(this).hasClass('delete')) {
moveElements([path], [TRASH], false, refresh); var pathsList = [];
paths.forEach(function (p) { pathsList.push(p.path); });
moveElements(pathsList, [TRASH], false, refresh);
} }
module.hideMenu(); module.hideMenu();
}); });
@ -1770,11 +1837,10 @@ define([
$trashTreeContextMenu.on('click', 'a', function (e) { $trashTreeContextMenu.on('click', 'a', function (e) {
e.stopPropagation(); e.stopPropagation();
var path = $(this).data('path'); var paths = $(this).data('paths');
var $element = $(this).data('element'); if (paths.length !== 1 || !paths[0].element || !filesOp.comparePath(paths[0].path, [TRASH])) {
if (!$element || !filesOp.comparePath(path, [TRASH])) {
log(Messages.fm_forbidden); log(Messages.fm_forbidden);
debug("Trash tree context menu on a forbidden or unexisting element. ", $element, path); debug("Trash tree context menu on a forbidden or unexisting element. ", paths);
return; return;
} }
if ($(this).hasClass("empty")) { if ($(this).hasClass("empty")) {
@ -1788,22 +1854,34 @@ define([
$trashContextMenu.on('click', 'a', function (e) { $trashContextMenu.on('click', 'a', function (e) {
e.stopPropagation(); e.stopPropagation();
var path = $(this).data('path'); var paths = $(this).data('paths');
var $element = $(this).data('element'); if (paths.length === 0) {
if (!$element || !path || path.length < 2) {
log(Messages.fm_forbidden); log(Messages.fm_forbidden);
debug("Trash context menu on a forbidden or unexisting element. ", $element, path); debug("Trash context menu on a forbidden or unexisting element. ", paths);
return; return;
} }
var name = path[path.length - 1]; var path = paths[0].path;
var name = paths[0].path[paths[0].path.length - 1];
if ($(this).hasClass("remove")) { if ($(this).hasClass("remove")) {
if (path.length === 4) { name = path[1]; } if (paths.length === 1) {
Cryptpad.confirm(Messages._getKey("fm_removePermanentlyDialog", [name]), function(res) { if (path.length === 4) { name = path[1]; }
Cryptpad.confirm(Messages._getKey("fm_removePermanentlyDialog", [name]), function(res) {
if (!res) { return; }
filesOp.removeFromTrash(path, refresh);
});
return;
}
var pathsList = [];
paths.forEach(function (p) { pathsList.push(p.path); });
var msg = Messages._getKey("fm_removeSeveralPermanentlyDialog", [paths.length]);
Cryptpad.confirm(msg, function(res) {
if (!res) { return; } if (!res) { return; }
filesOp.removeFromTrash(path, refresh); filesOp.deletePathsPermanently(pathsList);
refresh();
}); });
} }
else if ($(this).hasClass("restore")) { else if ($(this).hasClass("restore")) {
if (paths.length !== 1) { return; }
if (path.length === 4) { name = path[1]; } if (path.length === 4) { name = path[1]; }
Cryptpad.confirm(Messages._getKey("fm_restoreDialog", [name]), function(res) { Cryptpad.confirm(Messages._getKey("fm_restoreDialog", [name]), function(res) {
if (!res) { return; } if (!res) { return; }
@ -1811,6 +1889,7 @@ define([
}); });
} }
else if ($(this).hasClass("properties")) { else if ($(this).hasClass("properties")) {
if (paths.length !== 1) { return; }
if (path.length !== 4) { return; } if (path.length !== 4) { return; }
var element = filesOp.getTrashElementData(path); var element = filesOp.getTrashElementData(path);
var sPath = stringifyPath(element.path); var sPath = stringifyPath(element.path);

Loading…
Cancel
Save