| Index: ui/file_manager/file_manager/foreground/js/file_manager_commands.js
|
| diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
|
| index e998bffc213ae5ea823ad03c5858bf64ecf67870..d85c6f7d3dd3f3e06d821232574c9d176d12c420 100644
|
| --- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
|
| +++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
|
| @@ -515,86 +515,125 @@ CommandHandler.COMMANDS_['format'] = /** @type {Command} */ ({
|
| * Initiates new folder creation.
|
| * @type {Command}
|
| */
|
| -CommandHandler.COMMANDS_['new-folder'] = /** @type {Command} */ ({
|
| +CommandHandler.COMMANDS_['new-folder'] = (function() {
|
| + /**
|
| + * @constructor
|
| + * @struct
|
| + */
|
| + var NewFolderCommand = function() {};
|
| +
|
| /**
|
| * @param {!Event} event Command event.
|
| * @param {!FileManager} fileManager FileManager to use.
|
| */
|
| - execute: function(event, fileManager) {
|
| - var defaultName = str('DEFAULT_NEW_FOLDER_NAME');
|
| -
|
| - // Find a name that doesn't exist in the data model.
|
| - var files = fileManager.directoryModel.getFileList();
|
| - var hash = {};
|
| - for (var i = 0; i < files.length; i++) {
|
| - var name = files.item(i).name;
|
| - // Filtering names prevents from conflicts with prototype's names
|
| - // and '__proto__'.
|
| - if (name.substring(0, defaultName.length) == defaultName)
|
| - hash[name] = 1;
|
| - }
|
| -
|
| - var baseName = defaultName;
|
| - var separator = '';
|
| - var suffix = '';
|
| - var index = '';
|
| -
|
| - var advance = function() {
|
| - separator = ' (';
|
| - suffix = ')';
|
| - index++;
|
| - };
|
| -
|
| - var current = function() {
|
| - return baseName + separator + index + suffix;
|
| - };
|
| + NewFolderCommand.prototype.execute = function(event, fileManager) {
|
| + var targetDirectory;
|
| + var executedFromDirectoryTree;
|
|
|
| - // Accessing hasOwnProperty is safe since hash properties filtered.
|
| - while (hash.hasOwnProperty(current())) {
|
| - advance();
|
| + if (event.target instanceof DirectoryTree) {
|
| + targetDirectory = event.target.selectedItem.entry;
|
| + executedFromDirectoryTree = true;
|
| + } else if (event.target instanceof DirectoryItem) {
|
| + targetDirectory = event.target.entry;
|
| + executedFromDirectoryTree = true;
|
| + } else {
|
| + targetDirectory = fileManager.directoryModel.getCurrentDirEntry();
|
| + executedFromDirectoryTree = false;
|
| }
|
|
|
| - var list = fileManager.ui.listContainer.currentList;
|
| -
|
| - var onSuccess = function(entry) {
|
| - metrics.recordUserAction('CreateNewFolder');
|
| - list.selectedItem = entry;
|
| -
|
| - fileManager.ui.listContainer.endBatchUpdates();
|
| -
|
| - fileManager.namingController.initiateRename();
|
| - };
|
| -
|
| - var onError = function(error) {
|
| - fileManager.ui.listContainer.endBatchUpdates();
|
| + var directoryModel = fileManager.directoryModel;
|
| + var directoryTree = fileManager.ui.directoryTree;
|
| + var listContainer = fileManager.ui.listContainer;
|
| +
|
| + this.generateNewDirectoryName_(targetDirectory).then(function(newName) {
|
| + if (!executedFromDirectoryTree)
|
| + listContainer.startBatchUpdates();
|
| +
|
| + return new Promise(targetDirectory.getDirectory.bind(targetDirectory,
|
| + newName,
|
| + {create: true, exclusive: true})).then(function(newDirectory) {
|
| + metrics.recordUserAction('CreateNewFolder');
|
| +
|
| + // Select new directory and start rename operation.
|
| + if (executedFromDirectoryTree) {
|
| + directoryTree.updateAndSelectNewDirectory(
|
| + targetDirectory, newDirectory);
|
| + fileManager.getDirectoryTreeNamingController().attachAndStart(
|
| + assert(fileManager.ui.directoryTree.selectedItem));
|
| + } else {
|
| + directoryModel.updateAndSelectNewDirectory(
|
| + newDirectory).then(function() {
|
| + listContainer.endBatchUpdates();
|
| + fileManager.namingController.initiateRename();
|
| + }, function() {
|
| + listContainer.endBatchUpdates();
|
| + });
|
| + }
|
| + }, function(error) {
|
| + if (!executedFromDirectoryTree)
|
| + listContainer.endBatchUpdates();
|
| +
|
| + fileManager.ui.alertDialog.show(
|
| + strf('ERROR_CREATING_FOLDER',
|
| + newName,
|
| + util.getFileErrorString(error.name)),
|
| + null, null);
|
| + });
|
| + });
|
| + };
|
|
|
| - fileManager.ui.alertDialog.show(
|
| - strf('ERROR_CREATING_FOLDER',
|
| - current(),
|
| - util.getFileErrorString(error.name)),
|
| - null, null);
|
| - };
|
| + /**
|
| + * Generates new directory name.
|
| + * @param {!DirectoryEntry} parentDirectory
|
| + * @param {number=} opt_index
|
| + * @private
|
| + */
|
| + NewFolderCommand.prototype.generateNewDirectoryName_ = function(
|
| + parentDirectory, opt_index) {
|
| + var index = opt_index || 0;
|
|
|
| - var onAbort = function() {
|
| - fileManager.ui.listContainer.endBatchUpdates();
|
| - };
|
| + var defaultName = str('DEFAULT_NEW_FOLDER_NAME');
|
| + var newName = index === 0 ? defaultName :
|
| + defaultName + ' (' + index + ')';
|
| +
|
| + return new Promise(parentDirectory.getDirectory.bind(
|
| + parentDirectory, newName, {create: false})).then(function(newEntry) {
|
| + return this.generateNewDirectoryName_(parentDirectory, index + 1);
|
| + }.bind(this)).catch(function() {
|
| + return newName;
|
| + });
|
| + };
|
|
|
| - fileManager.ui.listContainer.startBatchUpdates();
|
| - fileManager.directoryModel.createDirectory(
|
| - current(), onSuccess, onError, onAbort);
|
| - },
|
| /**
|
| * @param {!Event} event Command event.
|
| * @param {!FileManager} fileManager FileManager to use.
|
| */
|
| - canExecute: function(event, fileManager) {
|
| - var directoryModel = fileManager.directoryModel;
|
| - event.canExecute = !fileManager.isOnReadonlyDirectory() &&
|
| - !fileManager.namingController.isRenamingInProgress() &&
|
| - !directoryModel.isSearching() &&
|
| - !directoryModel.isScanning();
|
| - }
|
| -});
|
| + NewFolderCommand.prototype.canExecute = function(event, fileManager) {
|
| + if (event.target instanceof DirectoryItem ||
|
| + event.target instanceof DirectoryTree) {
|
| + var entry = CommandUtil.getCommandEntry(event.target);
|
| + if (!entry || !CommandUtil.shouldShowMenuItemForEntry(
|
| + fileManager.volumeManager, entry)) {
|
| + event.canExecute = false;
|
| + event.command.setHidden(true);
|
| + return;
|
| + }
|
| +
|
| + var locationInfo = fileManager.volumeManager.getLocationInfo(entry);
|
| + event.canExecute = locationInfo && !locationInfo.isReadOnly;
|
| + event.command.setHidden(false);
|
| + } else {
|
| + var directoryModel = fileManager.directoryModel;
|
| + event.canExecute = !fileManager.isOnReadonlyDirectory() &&
|
| + !fileManager.namingController.isRenamingInProgress() &&
|
| + !directoryModel.isSearching() &&
|
| + !directoryModel.isScanning();
|
| + event.command.setHidden(false);
|
| + }
|
| + };
|
| +
|
| + return new NewFolderCommand();
|
| +})();
|
|
|
| /**
|
| * Initiates new window creation.
|
|
|