@syncfusion/ej2-filemanager
Version:
Essential JS 2 FileManager Component
1,249 lines • 55.1 kB
JavaScript
import { Ajax, Fetch, createElement, select, extend } from '@syncfusion/ej2-base';
import { isNullOrUndefined as isNOU, setValue, getValue } from '@syncfusion/ej2-base';
import * as events from '../base/constant';
import { createDialog, createExtDialog } from '../pop-up/dialog';
import { fileType, setNodeId, getLocaleText, setDateObject, doPasteUpdate, getPathObject } from '../common/utility';
import { generatePath, getAccessDetails, getTargetPath } from '../common/utility';
import { getUid } from '@syncfusion/ej2-grids';
/* eslint-disable @typescript-eslint/no-explicit-any */
/**
* Function to read the content from given path in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} event - specifies the event.
* @param {string} path - specifies the path.
* @returns {void}
* @private
*/
export function read(parent, event, path) {
var itemData = parent.itemData;
for (var i = 0; i < itemData.length; i++) {
if (isNOU(getValue('hasChild', itemData[i]))) {
setValue('hasChild', false, itemData[i]);
}
}
var data = { action: 'read', path: path, showHiddenItems: parent.showHiddenItems, data: itemData };
createAjax(parent, data, readSuccess, event);
}
/**
* Function to create new folder in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} itemName - specifies the item name.
* @returns {void}
* @private
*/
export function createFolder(parent, itemName) {
var data = { action: 'create', path: parent.path, name: itemName, data: parent.itemData };
createAjax(parent, data, createSuccess, itemName);
}
/**
* Function to filter the files in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} event - specifies the event.
* @returns {void}
* @private
*/
export function filter(parent, event) {
var data = { action: 'filter', path: parent.path, showHiddenItems: parent.showHiddenItems, data: [getPathObject(parent)] };
var filterData;
var filterDataVal = parent.filterData ? extend(filterData, data, parent.filterData) : data;
createAjax(parent, filterDataVal, filterSuccess, event, getValue('action', filterDataVal));
}
/**
* Function to rename the folder/file in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} path - specifies the path.
* @param {string} itemNewName - specifies the item's new name.
* @returns {void}
* @private
*/
export function rename(parent, path, itemNewName) {
var name;
var newName;
if (parent.breadcrumbbarModule.searchObj.element.value === '' && !parent.isFiltered) {
name = parent.currentItemText;
newName = itemNewName;
}
else {
var fPath = parent.filterPath;
if (parent.hasId) {
name = parent.currentItemText;
newName = itemNewName;
}
else {
fPath = fPath.replace(/\\/g, '/');
name = fPath.replace(path, '') + parent.currentItemText;
newName = fPath.replace(path, '') + itemNewName;
}
}
var data = {
action: 'rename', path: path, name: name, newName: newName, data: parent.itemData, showFileExtension: parent.showFileExtension
};
createAjax(parent, data, renameSuccess, path);
}
/**
* Function to paste file's and folder's in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} path - specifies the path.
* @param {string[]} names - specifies the names.
* @param {string} targetPath - specifies the target path.
* @param {string} pasteOperation - specifies the paste operation.
* @param {string[]} renameItems - specifies the rename items.
* @param {Object[]} actionRecords - specifies the action records.
* @returns {void}
* @private
*/
export function paste(parent, path, names, targetPath, pasteOperation, renameItems, actionRecords) {
var data = {
action: pasteOperation, path: path, targetData: parent.itemData[0],
targetPath: targetPath, names: names, renameFiles: renameItems, data: actionRecords
};
parent.destinationPath = targetPath;
createAjax(parent, data, pasteSuccess, path, pasteOperation, targetPath);
}
/**
* Function to delete file's and folder's in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string[]} items - specifies the items.
* @param {string} path - specifies the path.
* @param {string} operation - specifies the operation.
* @returns {void}
* @private
*/
export function Delete(parent, items, path, operation) {
var data = { action: operation, path: path, names: items, data: parent.itemData };
createAjax(parent, data, deleteSuccess, path);
}
/* istanbul ignore next */
/**
* Function to get details of file's and folder's in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string[]} names - specifies the names.
* @param {string} path - specifies the path.
* @param {string} operation - specifies the operation data.
* @returns {void}
* @private
*/
export function GetDetails(parent, names, path, operation) {
var data = { action: operation, path: path, names: names, data: parent.itemData };
createAjax(parent, data, detailsSuccess, path, operation);
}
/**
* Checks whether fileSystemData is enabled.
*
* @param {IFileManager} parent - specifies the parent element.
* @returns {boolean} - returns the boolean value.
*/
export function isFileSystemData(parent) {
var isFileSystemData = parent.fileSystemData.length >= 0 && isNOU(parent.ajaxSettings.url);
return isFileSystemData;
}
/**
* Function to check whether file already exist or not.
*
* @param {Record<string, any>} fileSystemData - specifies the file data.
* @param {string} name - specifies the name.
* @returns {boolean} - returns the boolean value.
* @private
*/
function isFileExists(fileSystemData, name) {
var isExists = fileSystemData.some(function (item) { return item.name === name; });
return isExists;
}
/**
* Function to find the index value of a file or folder.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {number} id - specifies the id.
* @returns {number} - returns the index value.
* @private
*/
function findIndexById(parent, id) {
var index = parent.fileSystemData.findIndex(function (item) {
return !isNOU(item) && String(item.id) === String(id);
});
return index;
}
/**
* Function to get the entire data of a file or folder using id value.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {number | string} id - specifies the id.
* @returns {Object} - returns the data.
* @private
*/
function filterById(parent, id) {
var data = parent.fileSystemData.filter(function (item) { return String(item.id) === String(id); })[0];
return data;
}
/**
* Function to get the entire data of a file or folder for a parent.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {number | string} parentId - specifies the parent id.
* @returns {Object[]} - returns the data.
* @private
*/
function filterByParent(parent, parentId) {
var data = parent.fileSystemData.filter(function (item) { return String(item.parentId) === String(parentId); });
return data;
}
/**
* Function to create a new copied file or folder.
*
* @param {Record<string, any>} data - specifies the file or folder data.
* @param {Record<string, any>} target - specifies the target data.
* @param {string} itemName - specifies the item name.
* @param {boolean} isCopy - specifies the copy operation.
* @returns {Record<string, Object>} - returns the data.
* @private
*/
function createNewItem(data, target, itemName, isCopy) {
var newItem = {};
//Construct the new folder details.
for (var key in data) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
newItem[key] = null;
}
}
var currentDate = new Date();
var folderPath = String(target.id) !== String(0) && !isNOU(target.parentId) ? target.filterPath + target.name + '\\' : '\\';
Object.assign(newItem, {
dateCreated: currentDate,
dateModified: currentDate,
filterPath: folderPath,
hasChild: isCopy ? data.hasChild : false,
id: getUid(itemName === null ? data.name : itemName),
isFile: isCopy ? data.isFile : false,
name: itemName === null ? data.name : itemName,
parentId: target.id,
size: isCopy ? data.size : 0,
type: isCopy ? data.type : ''
});
if (!isNOU(target.filterId)) {
Object.assign(newItem, {
filterId: target.filterId + target.id + '/'
});
}
return newItem;
}
/**
* Function to create an error response.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} message - specifies the error message.
* @param {string} code - specifies the error code.
* @param {Object[]} fileName - specifies the file name.
* @returns {void}
* @private
*/
function createErrorObject(parent, message, code, fileName) {
parent.responseData = {
cwd: null,
details: null,
error: {
code: code,
message: message,
fileExists: fileName != null ? fileName : null
},
files: null
};
}
/**
* Function to trigger folder creation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} data - specifies the data.
* @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
* @returns {void}
* @private
*/
function triggerFolderCreation(parent, data, eventArgs) {
var createEventArgs = {
folderName: getValue('name', data),
cancel: false,
path: getValue('path', data),
parentFolder: getValue('data', data)
};
parent.trigger('beforeFolderCreate', createEventArgs, function (args) {
if (args.cancel) {
eventArgs.cancel = true;
return;
}
if (isFileSystemData(parent)) {
if (!isFileExists(parent.fileSystemData, args.folderName)) {
var data_1 = args.parentFolder[0];
var newObject = createNewItem(data_1, data_1, args.folderName, false);
parent.fileSystemData.push(newObject);
}
else {
var message = 'A file or folder with the name ' + args.folderName + ' already exists.';
createErrorObject(parent, message, '400', null);
}
}
});
}
/**
* Function to trigger delete operation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} data - specifies the data.
* @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
* @returns {void}
* @private
*/
function triggerDeleteOperation(parent, data, eventArgs) {
var deleteEventArgs = {
cancel: false,
itemData: getValue('data', data),
path: getValue('path', data)
};
parent.trigger('beforeDelete', deleteEventArgs, function (args) {
if (args.cancel) {
eventArgs.cancel = true;
return;
}
if (isFileSystemData(parent)) {
args.itemData.forEach(function (itemData) {
var index = findIndexById(parent, itemData.id);
if (index !== -1) {
parent.fileSystemData.splice(index, 1);
}
if (!itemData.isFile) {
var subItems = parent.fileSystemData.filter(function (obj) { return obj.filterPath.includes(itemData.name); });
subItems.forEach(function (subItem) {
var index = findIndexById(parent, subItem.id);
if (index !== -1) {
parent.fileSystemData.splice(index, 1);
}
});
}
});
}
});
}
/**
* Function to trigger rename operation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} data - specifies the data.
* @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
* @returns {void}
* @private
*/
function triggerRenameOperation(parent, data, eventArgs) {
var renameEventArgs = {
cancel: false,
newName: getValue('newName', data),
itemData: getValue('data', data),
path: getValue('path', data)
};
parent.trigger('beforeRename', renameEventArgs, function (args) {
if (args.cancel) {
eventArgs.cancel = true;
return;
}
if (isFileSystemData(parent)) {
if (!isFileExists(parent.fileSystemData, args.newName)) {
var fileData = filterById(parent, args.itemData[0].id);
var oldName = fileData.name;
fileData.name = args.newName;
updateChildrenFilterPath(parent, fileData.id, oldName, args.newName);
}
else {
var message = 'Cannot rename' + args.itemData[0].name + 'to' + args.newName + ': destination already exists.';
createErrorObject(parent, message, '400', null);
}
}
});
}
/**
* Function to update child item filter path.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string | number} parentId - specifies the parent id.
* @param {string} oldName - specifies the previous name.
* @param {string} newName - specifies the new name.
* @returns {void}
* @private
*/
function updateChildrenFilterPath(parent, parentId, oldName, newName) {
parent.fileSystemData.forEach(function (item) {
if (String(item.parentId) === String(parentId)) {
var oldPath = item.filterPath;
var newPath = oldPath.replace(oldName + '\\', newName + '\\');
item.filterPath = newPath;
updateChildrenFilterPath(parent, item.id, oldName, newName);
}
});
}
/**
* Function to trigger move or copy operation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} data - specifies the data.
* @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
* @returns {void}
* @private
*/
function triggerMoveOrCopyOperation(parent, data, eventArgs) {
var moveEventArgs = {
cancel: false,
itemData: getValue('data', data),
isCopy: getValue('action', data) === 'copy' ? true : false,
path: getValue('path', data),
targetData: getValue('targetData', data),
targetPath: getValue('targetPath', data)
};
parent.trigger('beforeMove', moveEventArgs, function (args) {
if (args.cancel) {
eventArgs.cancel = true;
return;
}
if (isFileSystemData(parent)) {
var message = 'File Already Exists';
var action = getValue('action', data);
var itemPermission = getAccessDetails(parent, args.itemData, action, false);
var pathPermission = getAccessDetails(parent, [args.targetData], action, true);
var file_1 = [];
parent.pasteNodes = [];
if (itemPermission === '' && pathPermission === '') {
if (args.isCopy) {
var folderSubItems_1 = filterByParent(parent, args.targetData.id);
var copiedFolders = args.itemData;
copiedFolders.forEach(function (itemData) {
if (!isFileExists(folderSubItems_1, itemData.name) || getValue('renameFiles', data).length > 0) {
if (getValue('renameFiles', data).length > 0) {
var names = itemData.name.split('.');
var name_1 = itemData.name.includes('.') ? names[0] + '(' + parent.existingFileCount + ').' + names[1] : names[0] + '(' + parent.existingFileCount + ')';
copyFolderItems(parent, itemData, args.targetData, name_1);
parent.responseData.error = null;
parent.existingFileCount++;
return;
}
copyFolderItems(parent, itemData, args.targetData, null);
}
else {
file_1.push(itemData.name);
}
});
if (file_1.length > 0) {
createErrorObject(parent, message, '400', file_1);
}
return;
}
var target_1 = args.targetData;
var getTargetFiles = filterByParent(parent, target_1.id);
for (var i = 0; i < args.itemData.length; i++) {
var currItem = args.itemData[i];
if (!isFileExists(getTargetFiles, currItem.name) || getValue('renameFiles', data).length > 0) {
if (!target_1.hasChild) {
target_1.hasChild = !currItem.isFile;
var targetItem = parent.fileSystemData
.filter(function (item) { return String(item.id) === String(target_1.id); });
if (targetItem.length > 0) {
targetItem[0].hasChild = target_1.hasChild;
}
}
if (!currItem.isFile) {
//Check whether the source folder include other sub folders or not.
var subItems = currItem.parentId !== 0
? filterByParent(parent, currItem.parentId) : [];
var itemData = filterById(parent, currItem.parentId);
itemData.hasChild = subItems.length > 1 ? true : false;
}
var fileData = filterById(parent, currItem.id);
if (getValue('renameFiles', data).length > 0) {
var names = currItem.name.split('.');
currItem.name = currItem.name.includes('.') ? names[0] + '(' + parent.existingFileCount + ').' + names[1] : names[0] + '(' + parent.existingFileCount + ')';
fileData.name = currItem.name;
parent.responseData.error = null;
parent.existingFileCount++;
parent.dropData = target_1;
parent.dropPath = args.path;
var pathArray = args.targetPath.replace(/^\/|\/$/g, '').split('/');
target_1 = filterById(parent, pathArray[pathArray.length - 1]);
}
fileData.parentId = target_1.id;
fileData.filterPath = target_1.id === 0 ? '\\' : target_1.filterPath + target_1.name + '\\';
if (!isNOU(target_1.filterId)) {
fileData.filterId = target_1.filterId + target_1.id + '/';
}
if (!currItem.isFile) {
updateMovedItemChildren(parent, fileData);
}
}
else {
file_1.push(currItem.name);
}
}
if (file_1.length > 0) {
createErrorObject(parent, message, '400', file_1);
}
}
}
});
}
/**
* Function to trigger search operation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} data - specifies the data.
* @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
* @returns {void}
* @private
*/
function triggerSearchOperation(parent, data, eventArgs) {
var searchEventArgs = {
searchResults: getValue('data', data),
cancel: false,
path: getValue('path', data),
searchText: getValue('searchString', data),
caseSensitive: getValue('caseSensitive', data),
showHiddenItems: getValue('showHiddenItems', data)
};
parent.trigger('search', searchEventArgs, function (args) {
setValue('data', args.searchResults, data);
if (args.cancel) {
eventArgs.cancel = true;
}
});
}
/**
* Function to trigger client side events.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} data - specifies the data.
* @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
* @returns {void}
* @private
*/
function triggerClientEvents(parent, data, eventArgs) {
switch (getValue('action', data)) {
case 'create': {
triggerFolderCreation(parent, data, eventArgs);
break;
}
case 'delete': {
triggerDeleteOperation(parent, data, eventArgs);
break;
}
case 'rename': {
triggerRenameOperation(parent, data, eventArgs);
break;
}
case 'move':
case 'copy': {
triggerMoveOrCopyOperation(parent, data, eventArgs);
break;
}
case 'search': {
triggerSearchOperation(parent, data, eventArgs);
break;
}
}
}
/**
* Creates an AJAX request for the file manager.
*
* @param {IFileManager} parent - The parent file manager instance.
* @param {Object} data - The data object for the AJAX request.
* @param {Function} fn - The callback function to be executed after the AJAX request.
* @param {string} [event] - The event type for the AJAX request.
* @param {string} [operation] - The operation type for the AJAX request.
* @param {string} [targetPath] - The target path for the AJAX request.
* @returns {void}
* @private
*/
function createAjax(parent, data, fn, event, operation, targetPath) {
var ajaxSettings = {
url: parent.ajaxSettings.url,
type: 'POST',
mode: true,
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(data),
onSuccess: null,
onFailure: null,
beforeSend: null
};
var eventArgs = { action: getValue('action', data), ajaxSettings: ajaxSettings, cancel: false };
triggerClientEvents(parent, data, eventArgs);
parent.trigger('beforeSend', eventArgs, function (beforeSendArgs) {
if (!beforeSendArgs.cancel) {
parent.notify(events.beforeRequest, {});
if (isFileSystemData(parent)) {
var filePath = event === 'node-expand' || event === 'finalize-end' || event === 'rename-end-parent'
? getValue('path', data) : parent.path;
var pathArray = filePath.replace(/^\/|\/$/g, '').split('/');
var idValue = event === 'rename-end-parent' || (event === 'path-changed' && getValue('data', data).length !== 0 && isNOU(parent.renamedItem))
? getValue('data', data)[0].id : pathArray[pathArray.length - 1];
var action = getValue('action', data);
var isFileOperation = (action === 'move' || action === 'rename' || action === 'copy' || action === 'delete' || action === 'search') && event !== 'rename-end';
if (action === 'read' || action === 'create' || event === 'rename-end') {
var rootId = parent.fileSystemData
.filter(function (item) { return isNOU(item.parentId); })
.length > 0
? parent.fileSystemData
.filter(function (item) { return isNOU(item.parentId); })[0].id
: 0;
parent.responseData = {
cwd: filterById(parent, parent.path === '/' && event !== 'node-expand' && event !== 'rename-end-parent' ? rootId : idValue),
details: null,
error: null,
files: filterByParent(parent, parent.path === '/' && event !== 'node-expand' && event !== 'rename-end-parent' ? rootId : idValue)
};
if (isNOU(parent.responseData.cwd)) {
var message = 'Cannot load empty data within the File Manager.';
createErrorObject(parent, message, '400', null);
}
}
else if (isFileOperation && parent.responseData.error === null) {
var itemData = action === 'search' || action === 'delete' ? getValue('data', data) : [];
if (itemData.length === 0) {
if (action === 'copy') {
itemData = parent.pasteNodes.map(function (item) { return filterById(parent, item); });
}
else {
itemData = getValue('data', data).map(function (item) { return filterById(parent, item.id); });
}
}
parent.responseData = {
cwd: null,
details: null,
error: null,
files: itemData
};
}
else if (getValue('action', data) === 'details') {
var itemData = getValue('data', data);
var details = itemData[0];
var isMultipleFiles = itemData.length > 1;
var itemNames = itemData.map(function (item) { return item.name; });
var totalSize = isMultipleFiles ? getSize(itemData.reduce(function (accumulator, currentObject) { return accumulator + (currentObject.size || 0); }, 0)) : getSize(details.size);
var path = (parent.pathNames.includes(details.name) || isMultipleFiles ? parent.pathNames.join('/') : parent.pathNames.join('/') + '/' + details.name);
parent.responseData.details = Object.assign({
location: path,
multipleFiles: isMultipleFiles,
name: itemNames.join(', '),
size: totalSize
}, isMultipleFiles ? {} : {
created: details.dateCreated,
isFile: details.isFile,
modified: details.dateModified,
permission: details.permission
});
}
performReadOperation(parent, parent.responseData, fn, data, event, operation, targetPath, beforeSendArgs);
return;
}
var ajax = new Ajax({
url: getValue('url', beforeSendArgs.ajaxSettings),
type: getValue('type', beforeSendArgs.ajaxSettings),
mode: getValue('mode', beforeSendArgs.ajaxSettings),
dataType: getValue('dataType', beforeSendArgs.ajaxSettings),
contentType: getValue('contentType', beforeSendArgs.ajaxSettings),
data: getValue('data', beforeSendArgs.ajaxSettings),
beforeSend: getValue('beforeSend', beforeSendArgs.ajaxSettings),
onSuccess: function (result) {
if (isNOU(result)) {
var result_1 = {
error: {
fileExists: null,
message: getLocaleText(parent, 'Server-Error') + ' ' + parent.ajaxSettings.url,
code: '406'
},
files: null
};
triggerAjaxFailure(parent, beforeSendArgs, fn, result_1, event, operation, targetPath);
return;
}
if (typeof (result) === 'string') {
result = JSON.parse(result);
}
performReadOperation(parent, result, fn, data, event, operation, targetPath, beforeSendArgs);
},
onFailure: function () {
var result = {
files: null,
error: {
code: '404',
message: getLocaleText(parent, 'Network-Error') + ' ' + parent.ajaxSettings.url,
fileExists: null
}
};
triggerAjaxFailure(parent, beforeSendArgs, fn, result, event, operation, targetPath);
}
});
ajax.send();
}
});
}
/**
* Function to get file size.
*
* @param {number} size - specifies the size.
* @returns {string} - returns the size.
* @private
*/
function getSize(size) {
var hz;
if (size < 1024) {
hz = size + ' B';
}
else if (size < 1024 * 1024) {
hz = (size / 1024).toFixed(2) + ' KB';
}
else if (size < 1024 * 1024 * 1024) {
hz = (size / 1024 / 1024).toFixed(2) + ' MB';
}
else {
hz = (size / 1024 / 1024 / 1024).toFixed(2) + ' GB';
}
return hz;
}
/**
* Function to perform read operation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {Function} fn - specifies the function.
* @param {Object} data - specifies the data.
* @param {string} event - specifies the event.
* @param {string} operation - specifies the operation.
* @param {string} targetPath - specifies the targetPath.
* @param {BeforeSendEventArgs} beforeSendArgs - specifies the eventArgs.
* @returns {void}
* @private
*/
function performReadOperation(parent, result, fn, data, event, operation, targetPath, beforeSendArgs) {
parent.notify(events.afterRequest, { action: 'success' });
var id = parent.expandedId ? parent.expandedId : parent.pathId[parent.pathId.length - 1];
if (!isNOU(result.cwd) && (getValue('action', data) === 'read')) {
result.cwd.name = (parent.pathId.length === 1) ? (parent.rootAliasName || result.cwd.name) : result.cwd.name;
setValue('_fm_id', id, result.cwd);
setValue(id, result.cwd, parent.feParent);
if (!isNOU(result.files) || result.error.code === '401') {
if ((event === 'finalize-end' || event === 'initial-end') && parent.pathNames.length === 0) {
var root = getValue(parent.pathId[0], parent.feParent);
parent.pathNames[0] = getValue('name', root);
parent.hasId = !isNOU(getValue('id', root));
}
if (event === 'finalize-end') {
generatePath(parent);
}
}
}
if (!isNOU(result.files)) {
setDateObject(result.files);
for (var i = 0, len = result.files.length; i < len; i++) {
var item = result.files[i];
setValue('_fm_iconClass', fileType(item), item);
}
if (getValue('action', data) === 'read') {
setNodeId(result, id);
setValue(id, result.files, parent.feFiles);
}
}
if (!isNOU(result.details) && !isNOU(parent.rootAliasName)) {
var rootName = parent.rootAliasName || getValue('name', result.details);
var location_1 = getValue('location', result.details).replace(new RegExp('/', 'g'), '\\');
if ((getValue('path', data) === '/') || (parent.hasId && getValue('path', data).match(/[/]/g).length === 1)) {
if (getValue('names', data).length === 0) {
setValue('name', rootName, result.details);
}
if (location_1.indexOf('\\') === -1) {
location_1 = rootName;
}
else {
location_1 = location_1.replace(location_1.substring(0, location_1.indexOf('\\')), rootName);
}
}
else {
location_1 = location_1.replace(location_1.substring(0, location_1.indexOf('\\')), rootName);
}
setValue('location', location_1, result.details);
}
fn(parent, result, event, operation, targetPath);
if (!isNOU(result.files) && (event === 'path-changed' || event === 'finalize-end' || event === 'open-end' || event === 'drop-path')) {
parent.notify(events.searchTextChange, result);
}
if (typeof getValue('onSuccess', beforeSendArgs.ajaxSettings) === 'function') {
getValue('onSuccess', beforeSendArgs.ajaxSettings)();
}
}
/**
* Function to copy operation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} data - specifies the data.
* @param {string} target - specifies the target.
* @param {string} itemName - specifies the item name.
* @returns {void}
* @private
*/
function copyFolderItems(parent, data, target, itemName) {
var newObject = createNewItem(data, target, itemName, true);
parent.fileSystemData.push(newObject);
parent.pasteNodes.push(newObject.id);
var copiedItems = filterByParent(parent, data.id);
for (var i = 0; i < copiedItems.length; i++) {
copyFolderItems(parent, copiedItems[i], newObject, null);
}
}
/**
* Function to move operation.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {Object} itemData - specifies the data.
* @returns {void}
* @private
*/
function updateMovedItemChildren(parent, itemData) {
var childItems = filterByParent(parent, itemData.id);
childItems.forEach(function (childItem) {
childItem.filterPath = itemData.filterPath + itemData.name + '\\';
if (!isNOU(itemData.filterId)) {
childItem.filterId = itemData.filterId + itemData.id + '/';
}
if (!childItem.isFile) {
updateMovedItemChildren(parent, childItem);
}
});
}
/**
* Function for trigger Ajax failure in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {BeforeSendEventArgs} beforeSendArgs - specifies the beforeSendArgs.
* @param {Function} fn - specifies the function.
* @param {ReadArgs} result - specifies the result.
* @param {string} event - specifies the event.
* @param {string} operation - specifies the operation.
* @param {string} targetPath - specifies the targetPath.
* @returns {void}
* @private
*/
function triggerAjaxFailure(parent, beforeSendArgs, fn, result, event, operation, targetPath) {
parent.notify(events.afterRequest, { action: 'failure' });
fn(parent, result, event, operation, targetPath);
if (typeof getValue('onFailure', beforeSendArgs.ajaxSettings) === 'function') {
getValue('onFailure', beforeSendArgs.ajaxSettings)();
}
}
/**
* Function for read success in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} event - specifies the event.
* @returns {void}
* @private
*/
function readSuccess(parent, result, event) {
try {
if (!isNOU(result.files)) {
parent.notify(event, result);
parent.notify(events.selectionChanged, {});
var args = { action: 'read', result: result };
parent.trigger('success', args);
}
else {
if (!isNOU(result.error) && result.error.code === '401') {
result.files = [];
parent.notify(event, result);
parent.notify(events.selectionChanged, {});
}
onFailure(parent, result, 'read');
parent.setProperties({ path: parent.oldPath }, true);
parent.pathNames.pop();
}
}
catch (error) {
handleCatchError(parent, error, 'read');
parent.setProperties({ path: parent.oldPath }, true);
parent.pathNames.pop();
}
if (parent.isDragDrop && parent.isDropEnd) {
if (parent.droppedObjects.length !== 0) {
var args = { fileDetails: parent.droppedObjects };
parent.trigger('fileDropped', args);
}
parent.isDropEnd = parent.isDragDrop = false;
}
}
/**
* Function for filter success in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} event - specifies the event.
* @param {string} action - specifies the action.
* @returns {void}
* @private
*/
function filterSuccess(parent, result, event, action) {
try {
if (!isNOU(result.files)) {
parent.notify(event, result);
var args = { action: action, result: result };
parent.trigger('success', args);
}
else {
onFailure(parent, result, action);
}
}
catch (error) {
handleCatchError(parent, error, action);
}
}
/* istanbul ignore next */
/**
* Function for create success in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} itemName - specifies the item name.
* @returns {void}
* @private
*/
function createSuccess(parent, result, itemName) {
try {
if (!isNOU(result.files)) {
if (parent.dialogObj && parent.dialogObj.visible) {
parent.dialogObj.hide();
}
parent.createdItem = isFileSystemData(parent) ? result.files[result.files.length - 1] : result.files[0];
parent.breadcrumbbarModule.searchObj.value = '';
var createEventArgs = {
folderName: itemName,
path: parent.path,
parentFolder: parent.itemData
};
parent.trigger('folderCreate', createEventArgs);
var args = { action: 'create', result: result };
parent.trigger('success', args);
parent.itemData = [getPathObject(parent)];
read(parent, events.createEnd, parent.path);
}
else {
if (result.error.code === '400') {
if (parent.dialogObj && parent.dialogObj.visible) {
var ele = select('#newname', parent.dialogObj.element);
var error = getLocaleText(parent, 'Validation-NewFolder-Exists').replace('{0}', '"' + ele.value + '"');
ele.parentElement.nextElementSibling.innerHTML = error;
}
else {
var result_2 = {
files: null,
error: {
code: '400',
message: getLocaleText(parent, 'Validation-NewFolder-Exists').replace('{0}', '"' + itemName + '"'),
fileExists: null
}
};
createDialog(parent, 'Error', result_2);
}
var args = { action: 'create', error: result.error };
parent.trigger('failure', args);
}
else {
if (parent.dialogObj && parent.dialogObj.visible) {
parent.dialogObj.hide();
}
onFailure(parent, result, 'create');
}
}
}
catch (error) {
if (parent.dialogObj && parent.dialogObj.visible) {
parent.dialogObj.hide();
}
handleCatchError(parent, error, 'create');
}
}
/* istanbul ignore next */
/**
* Function to rename the folder/file in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @returns {void}
* @private
*/
function renameSuccess(parent, result) {
try {
if (!isNOU(result.files)) {
if (!isNOU(parent.dialogObj)) {
parent.dialogObj.hide();
}
var args = { action: 'rename', result: result };
parent.trigger('success', args);
parent.renamedItem = Array.isArray(result.files) ? result.files[0] : result.files;
var renameEventArgs = {
newName: parent.renamedItem.name,
itemData: [parent.renamedItem],
path: parent.path
};
parent.trigger('rename', renameEventArgs);
if (parent.activeModule === 'navigationpane') {
var pathObject = getPathObject(parent);
var pathLevel = parent.pathId[parent.pathId.length - 1].split('_').length - 2;
parent.pathId.pop();
parent.itemData = [getValue(parent.pathId[parent.pathId.length - 1], parent.feParent)];
var renamePath = getTargetPath(parent, parent.renamedItem);
read(parent, events.renameEndParent, renamePath);
if (!isNOU(pathObject) && parent.pathNames.length > 1 && pathLevel <= parent.pathNames.length - 1) {
parent.pathNames[pathLevel] = parent.renameText;
if (!parent.hasId) {
parent.setProperties({ path: "/" + parent.pathNames.slice(1).join('/') + "/" }, true);
}
}
parent.itemData = parent.navigationpaneModule.previousSelected.length > 0
? parent.navigationpaneModule.treeObj.getTreeData(parent.navigationpaneModule.previousSelected[0]) : parent.itemData;
read(parent, events.pathChanged, parent.path);
parent.itemData[0] = parent.renamedItem;
parent.renamedItem = null;
}
else {
parent.itemData = [getPathObject(parent)];
if (parent.breadcrumbbarModule.searchObj.value !== '') {
Search(parent, events.renameEnd, parent.path, parent.searchWord, parent.showHiddenItems, !parent.searchSettings.ignoreCase);
}
else {
if (parent.isFiltered) {
filter(parent, events.renameEnd);
}
else {
read(parent, events.renameEnd, parent.path);
}
}
}
}
else {
if (result.error.code === '400' && parent.dialogObj && parent.dialogObj.visible) {
var ele = select('#rename', parent.dialogObj.element);
var error = getLocaleText(parent, 'Validation-Rename-Exists').replace('{0}', '"' + parent.currentItemText + '"');
error = error.replace('{1}', '"' + ele.value + '"');
ele.parentElement.nextElementSibling.innerHTML = error;
var args = { action: 'rename', error: result.error };
parent.trigger('failure', args);
}
else {
if (!isNOU(parent.dialogObj)) {
parent.dialogObj.hide();
}
onFailure(parent, result, 'rename');
}
}
}
catch (error) {
if (!isNOU(parent.dialogObj)) {
parent.dialogObj.hide();
}
handleCatchError(parent, error, 'rename');
}
}
/* istanbul ignore next */
/**
* Function to create new folder in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} path - specifies the path.
* @param {string} operation - specifies the operation.
* @returns {void}
* @private
*/
function pasteSuccess(parent, result, path, operation) {
try {
var moveorcopyEventArgs = {
itemData: result.files,
isCopy: operation === 'copy' ? true : false,
path: path,
targetData: parent.itemData[0],
targetPath: parent.path
};
parent.trigger('move', moveorcopyEventArgs);
if (result.error && result.error.fileExists) {
parent.fileLength = 0;
if (!isNOU(result.files)) {
parent.isPasteError = true;
doPasteUpdate(parent, operation, result);
}
createExtDialog(parent, 'DuplicateItems', result.error.fileExists);
if (result.error.code === '404') {
createDialog(parent, 'Error', result);
}
}
else if (!result.error && !isNOU(result.files)) {
parent.isPasteError = false;
doPasteUpdate(parent, operation, result);
}
else if (result.error && !isNOU(result.files)) {
parent.isPasteError = true;
doPasteUpdate(parent, operation, result);
createDialog(parent, 'Error', result);
}
else {
onFailure(parent, result, operation);
}
}
catch (error) {
handleCatchError(parent, error, operation);
}
}
/**
* Function to delete success in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} path - specifies the path.
* @returns {void}
* @private
*/
function deleteSuccess(parent, result, path) {
try {
var deleteEventArgs = {
itemData: result.files,
path: path
};
parent.trigger('delete', deleteEventArgs);
if (!isNOU(result.files)) {
parent.setProperties({ path: path }, true);
parent.itemData = [getPathObject(parent)];
read(parent, events.deleteEnd, parent.path);
if (result.error) {
onFailure(parent, result, 'delete');
}
else {
var args = { action: 'delete', result: result };
parent.trigger('success', args);
}
}
else {
onFailure(parent, result, 'delete');
}
}
catch (error) {
handleCatchError(parent, error, 'delete');
}
}
/**
* Function for details success in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} path - specifies the path.
* @param {string} operation - specifies the operation.
* @returns {void}
* @private
*/
function detailsSuccess(
// eslint:disable-next-line
parent, result, path, operation) {
try {
if (!isNOU(result.details)) {
createDialog(parent, operation, null, result.details);
var args = { action: 'details', result: result };
parent.trigger('success', args);
}
else {
onFailure(parent, result, 'details');
}
}
catch (error) {
handleCatchError(parent, error, 'details');
}
}
/**
* Function for on failure event in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} action - specifies the action.
* @returns {void}
* @private
*/
function onFailure(parent, result, action) {
createDialog(parent, 'Error', result);
var args = { action: action, error: result.error };
parent.trigger('failure', args);
}
/**
* Function for search in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} event - specifies the event.
* @param {string} path - specifies the path.
* @param {string} searchString - specifies the search string.
* @param {boolean} showHiddenItems - specifies the hidden items.
* @param {boolean} caseSensitive - specifies the casing of search text.
* @returns {void}
* @private
*/
export function Search(parent, event, path, searchString, showHiddenItems, caseSensitive) {
var data = {
action: 'search', path: path, searchString: searchString, showHiddenItems: showHiddenItems, caseSensitive: caseSensitive,
data: parent.itemData
};
createAjax(parent, data, searchSuccess, event);
}
/* istanbul ignore next */
/**
* Function for search success in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {ReadArgs} result - specifies the result.
* @param {string} event - specifies the event.
* @returns {void}
* @private
*/
function searchSuccess(parent, result, event) {
try {
if (!isNOU(result.files)) {
parent.notify(event, result);
var args = { action: 'search', result: result };
parent.trigger('success', args);
}
else {
onFailure(parent, result, 'search');
}
}
catch (error) {
handleCatchError(parent, error, 'search');
}
}
/* istanbul ignore next */
/**
* Function for download in File Manager.
*
* @param {IFileManager} parent - specifies the parent element.
* @param {string} path - specifies the path.
* @param {string[]} items - specifies the items.
* @returns {void}
* @private
*/
export function Download(parent, path, items) {
var downloadUrl = parent.ajaxSettings.downloadUrl ? parent.ajaxSettings.downloadUrl : parent.ajaxSettings.url;
var data = { 'action': 'download', 'path': path, 'names': items, 'data': parent.itemData };
var ajaxSettings = {
url: downloadUrl,
type: 'POST',
contentType: 'application/json',
responseType: 'blob',
data: JSON.stringify(data),
onSuccess: null,
onFailure: null,
beforeSend: null
};
var eventArgs = { data: data, cancel: false, useFormPost: true, ajaxSettings: ajaxSettings };
parent.trigger('beforeDownload', eventArgs, function (downloadArgs) {
if (!downloadArgs.cancel) {
if (downloadArgs