Ability to remove window handlers added from the drive
This commit is contained in:
parent
b58b6fa691
commit
f17cdcda9f
@ -732,7 +732,8 @@ define([
|
||||
};
|
||||
$content.mousemove(sel.move);
|
||||
});
|
||||
$(window).on('mouseup', function (e) {
|
||||
|
||||
var onWindowMouseUp = function (e) {
|
||||
if (!sel.down) { return; }
|
||||
if (e.which !== 1) { return; }
|
||||
sel.down = false;
|
||||
@ -745,10 +746,146 @@ define([
|
||||
selectElement($(element));
|
||||
});
|
||||
e.stopPropagation();
|
||||
});
|
||||
};
|
||||
|
||||
var getSelectedPaths = function ($element) {
|
||||
var paths = [];
|
||||
if (!$element || $element.length === 0) { return paths; }
|
||||
if (findSelectedElements().length > 1) {
|
||||
var $selected = findSelectedElements();
|
||||
$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 removeInput = function (cancel) {
|
||||
if (!cancel && $('.cp-app-drive-element-row > input').length === 1) {
|
||||
var $input = $('.cp-app-drive-element-row > input');
|
||||
manager.rename($input.data('path'), $input.val(), APP.refresh);
|
||||
}
|
||||
$('.cp-app-drive-element-row > input').remove();
|
||||
$('.cp-app-drive-element-row > span:hidden').removeAttr('style');
|
||||
};
|
||||
|
||||
var getFileNameExtension = function (name) {
|
||||
var matched = /\.[^\. ]+$/.exec(name);
|
||||
if (matched && matched.length) { return matched[matched.length -1]; }
|
||||
return '';
|
||||
};
|
||||
|
||||
// Replace a file/folder name by an input to change its value
|
||||
var displayRenameInput = function ($element, path) {
|
||||
// NOTE: setTimeout(f, 0) otherwise the "rename" button in the toolbar is not working
|
||||
window.setTimeout(function () {
|
||||
if (!APP.editable) { return; }
|
||||
if (!path || path.length < 2) {
|
||||
logError("Renaming a top level element (root, trash or filesData) is forbidden.");
|
||||
return;
|
||||
}
|
||||
removeInput();
|
||||
var $name = $element.find('.cp-app-drive-element-name');
|
||||
if (!$name.length) {
|
||||
$name = $element.find('> .cp-app-drive-element');
|
||||
}
|
||||
$name.hide();
|
||||
var isFolder = $element.is(".cp-app-drive-element-folder:not(.cp-app-drive-element-sharedf)");
|
||||
var el = manager.find(path);
|
||||
var name = manager.isFile(el) ? manager.getTitle(el) : path[path.length - 1];
|
||||
if (manager.isSharedFolder(el)) {
|
||||
name = manager.getSharedFolderData(el).title;
|
||||
}
|
||||
var $input = $('<input>', {
|
||||
placeholder: name,
|
||||
value: name
|
||||
}).data('path', path);
|
||||
|
||||
|
||||
// Stop propagation on keydown to avoid issues with arrow keys
|
||||
$input.on('keydown', function (e) { e.stopPropagation(); });
|
||||
|
||||
$input.on('keyup', function (e) {
|
||||
e.stopPropagation();
|
||||
if (e.which === 13) {
|
||||
removeInput(true);
|
||||
var newName = $input.val();
|
||||
if (JSON.stringify(path) === JSON.stringify(currentPath)) {
|
||||
manager.rename(path, $input.val(), function () {
|
||||
if (isFolder) {
|
||||
LS.renameFoldersOpened(path, newName);
|
||||
path[path.length - 1] = newName;
|
||||
}
|
||||
APP.displayDirectory(path);
|
||||
});
|
||||
}
|
||||
else {
|
||||
manager.rename(path, $input.val(), function () {
|
||||
if (isFolder) {
|
||||
LS.renameFoldersOpened(path, newName);
|
||||
unselectElement($element);
|
||||
$element.data("path", $element.data("path").slice(0, -1).concat(newName));
|
||||
selectElement($element);
|
||||
}
|
||||
APP.refresh();
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (e.which === 27) {
|
||||
removeInput(true);
|
||||
}
|
||||
}).on('keypress', function (e) { e.stopPropagation(); });
|
||||
//$element.parent().append($input);
|
||||
$name.after($input);
|
||||
$input.focus();
|
||||
|
||||
var extension = getFileNameExtension(name);
|
||||
var input = $input[0];
|
||||
input.selectionStart = 0;
|
||||
input.selectionEnd = name.length - extension.length;
|
||||
|
||||
// We don't want to open the file/folder when clicking on the input
|
||||
$input.on('click dblclick', function (e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
// Remove the browser ability to drag text from the input to avoid
|
||||
// triggering our drag/drop event handlers
|
||||
$input.on('dragstart dragleave drag drop', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
});
|
||||
// Make the parent element non-draggable when selecting text in the field
|
||||
// since it would remove the input
|
||||
$input.on('mousedown', function (e) {
|
||||
e.stopPropagation();
|
||||
$input.parents('.cp-app-drive-element-row').attr("draggable", false);
|
||||
});
|
||||
$input.on('mouseup', function (e) {
|
||||
e.stopPropagation();
|
||||
$input.parents('.cp-app-drive-element-row').attr("draggable", true);
|
||||
});
|
||||
},0);
|
||||
};
|
||||
|
||||
|
||||
// Arrow keys to modify the selection
|
||||
$(window).keydown(function (e) {
|
||||
var onWindowKeydown = function (e) {
|
||||
var $searchBar = $tree.find('#cp-app-drive-tree-search-input');
|
||||
if (document.activeElement && document.activeElement.nodeName === 'INPUT') { return; }
|
||||
if ($searchBar.is(':focus') && $searchBar.val()) { return; }
|
||||
@ -784,6 +921,13 @@ define([
|
||||
return;
|
||||
}
|
||||
|
||||
// F2: rename selected element
|
||||
if (e.which === 113) {
|
||||
var paths = getSelectedPaths(findSelectedElements().first());
|
||||
if (paths.length !== 1) { return; }
|
||||
displayRenameInput(paths[0].element, paths[0].path);
|
||||
}
|
||||
|
||||
// [Left, Up, Right, Down]
|
||||
if ([37, 38, 39, 40].indexOf(e.which) === -1) { return; }
|
||||
e.preventDefault();
|
||||
@ -843,17 +987,6 @@ define([
|
||||
click($elements.get(Math.min(lastIndex+cols, length-1)));
|
||||
return;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
var removeInput = function (cancel) {
|
||||
if (!cancel && $('.cp-app-drive-element-row > input').length === 1) {
|
||||
var $input = $('.cp-app-drive-element-row > input');
|
||||
manager.rename($input.data('path'), $input.val(), APP.refresh);
|
||||
}
|
||||
$('.cp-app-drive-element-row > input').remove();
|
||||
$('.cp-app-drive-element-row > span:hidden').removeAttr('style');
|
||||
};
|
||||
|
||||
var compareDays = function (date1, date2) {
|
||||
@ -896,105 +1029,6 @@ define([
|
||||
APP.displayDirectory(currentPath);
|
||||
};
|
||||
|
||||
var getFileNameExtension = function (name) {
|
||||
var matched = /\.[^\. ]+$/.exec(name);
|
||||
if (matched && matched.length) { return matched[matched.length -1]; }
|
||||
return '';
|
||||
};
|
||||
|
||||
// Replace a file/folder name by an input to change its value
|
||||
var displayRenameInput = function ($element, path) {
|
||||
// NOTE: setTimeout(f, 0) otherwise the "rename" button in the toolbar is not working
|
||||
window.setTimeout(function () {
|
||||
if (!APP.editable) { return; }
|
||||
if (!path || path.length < 2) {
|
||||
logError("Renaming a top level element (root, trash or filesData) is forbidden.");
|
||||
return;
|
||||
}
|
||||
removeInput();
|
||||
var $name = $element.find('.cp-app-drive-element-name');
|
||||
if (!$name.length) {
|
||||
$name = $element.find('> .cp-app-drive-element');
|
||||
}
|
||||
$name.hide();
|
||||
var isFolder = $element.is(".cp-app-drive-element-folder:not(.cp-app-drive-element-sharedf)");
|
||||
var el = manager.find(path);
|
||||
var name = manager.isFile(el) ? manager.getTitle(el) : path[path.length - 1];
|
||||
if (manager.isSharedFolder(el)) {
|
||||
name = manager.getSharedFolderData(el).title;
|
||||
}
|
||||
var $input = $('<input>', {
|
||||
placeholder: name,
|
||||
value: name
|
||||
}).data('path', path);
|
||||
|
||||
|
||||
// Stop propagation on keydown to avoid issues with arrow keys
|
||||
$input.on('keydown', function (e) { e.stopPropagation(); });
|
||||
|
||||
$input.on('keyup', function (e) {
|
||||
e.stopPropagation();
|
||||
if (e.which === 13) {
|
||||
removeInput(true);
|
||||
var newName = $input.val();
|
||||
if (JSON.stringify(path) === JSON.stringify(currentPath)) {
|
||||
manager.rename(path, $input.val(), function () {
|
||||
if (isFolder) {
|
||||
LS.renameFoldersOpened(path, newName);
|
||||
path[path.length - 1] = newName;
|
||||
}
|
||||
APP.displayDirectory(path);
|
||||
});
|
||||
}
|
||||
else {
|
||||
manager.rename(path, $input.val(), function () {
|
||||
if (isFolder) {
|
||||
LS.renameFoldersOpened(path, newName);
|
||||
unselectElement($element);
|
||||
$element.data("path", $element.data("path").slice(0, -1).concat(newName));
|
||||
selectElement($element);
|
||||
}
|
||||
refresh();
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (e.which === 27) {
|
||||
removeInput(true);
|
||||
}
|
||||
}).on('keypress', function (e) { e.stopPropagation(); });
|
||||
//$element.parent().append($input);
|
||||
$name.after($input);
|
||||
$input.focus();
|
||||
|
||||
var extension = getFileNameExtension(name);
|
||||
var input = $input[0];
|
||||
input.selectionStart = 0;
|
||||
input.selectionEnd = name.length - extension.length;
|
||||
|
||||
// We don't want to open the file/folder when clicking on the input
|
||||
$input.on('click dblclick', function (e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
// Remove the browser ability to drag text from the input to avoid
|
||||
// triggering our drag/drop event handlers
|
||||
$input.on('dragstart dragleave drag drop', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
});
|
||||
// Make the parent element non-draggable when selecting text in the field
|
||||
// since it would remove the input
|
||||
$input.on('mousedown', function (e) {
|
||||
e.stopPropagation();
|
||||
$input.parents('.cp-app-drive-element-row').attr("draggable", false);
|
||||
});
|
||||
$input.on('mouseup', function (e) {
|
||||
e.stopPropagation();
|
||||
$input.parents('.cp-app-drive-element-row').attr("draggable", true);
|
||||
});
|
||||
},0);
|
||||
};
|
||||
|
||||
|
||||
var pickFolderColor = function ($element, currentColor, cb) {
|
||||
var colors = ["", "#f23c38", "#ff0073", "#da0eba", "#9d00ac", "#6c19b3", "#4a42b1", "#3d8af0", "#30a0f1", "#1fb9d1", "#009686", "#45b354", "#84c750", "#c6e144", "#faf147", "#fbc423", "#fc9819", "#fd5227", "#775549", "#9c9c9c", "#607a89"];
|
||||
@ -1206,33 +1240,6 @@ define([
|
||||
return filtered;
|
||||
};
|
||||
|
||||
var getSelectedPaths = function ($element) {
|
||||
var paths = [];
|
||||
if (!$element || $element.length === 0) { return paths; }
|
||||
if (findSelectedElements().length > 1) {
|
||||
var $selected = findSelectedElements();
|
||||
$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 () {
|
||||
if (manager.isPathIn(currentPath, [TRASH])) {
|
||||
$driveToolbar.find('cp-app-drive-toolbar-emptytrash').show();
|
||||
@ -3663,13 +3670,13 @@ define([
|
||||
};
|
||||
|
||||
// Disable middle click in the context menu to avoid opening /drive/inner.html# in new tabs
|
||||
$(window).click(function (e) {
|
||||
var onWindowClick = function (e) {
|
||||
if (!e.target || !$(e.target).parents('.cp-dropdown-content').length) { return; }
|
||||
if (e.which !== 1) {
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var getProperties = APP.getProperties = function (el, cb) {
|
||||
if (!manager.isFile(el) && !manager.isSharedFolder(el)) {
|
||||
@ -4111,13 +4118,15 @@ define([
|
||||
APP.hideMenu();
|
||||
});
|
||||
|
||||
$(window).on("keydown", function (e) {
|
||||
if (e.which === 113) { // if F2 key pressed
|
||||
var paths = getSelectedPaths(findSelectedElements().first());
|
||||
if (paths.length !== 1) { return; }
|
||||
displayRenameInput(paths[0].element, paths[0].path);
|
||||
}
|
||||
});
|
||||
$(window).on('mouseup', onWindowMouseUp);
|
||||
$(window).on('keydown', onWindowKeydown);
|
||||
$(window).on('click', onWindowClick);
|
||||
|
||||
var removeWindowListeners = function () {
|
||||
$(window).off('mouseup', onWindowMouseUp);
|
||||
$(window).off('keydown', onWindowKeydown);
|
||||
$(window).off('click', onWindowClick);
|
||||
};
|
||||
|
||||
// Chrome considers the double-click means "select all" in the window
|
||||
$content.on('mousedown', function (e) {
|
||||
@ -4342,7 +4351,10 @@ define([
|
||||
}
|
||||
|
||||
return {
|
||||
refresh: refresh
|
||||
refresh: refresh,
|
||||
close: function () {
|
||||
removeWindowListeners();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -89,7 +89,9 @@ define([
|
||||
APP.module.execCommand('SUBSCRIBE', null, function () {
|
||||
sframeChan.query('Q_SET_TEAM', null, function (err) {
|
||||
if (err) { return void console.error(err); }
|
||||
if (APP.drive && APP.drive.close) { APP.drive.close(); }
|
||||
APP.team = null;
|
||||
APP.drive = null;
|
||||
APP.buildUI(common);
|
||||
});
|
||||
});
|
||||
@ -206,6 +208,7 @@ define([
|
||||
updateSharedFolders: updateSharedFolders,
|
||||
APP: driveAPP
|
||||
});
|
||||
APP.drive = drive;
|
||||
driveAPP.refresh = drive.refresh;
|
||||
});
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user