UNPKG

@syncfusion/ej2-filemanager

Version:
1,480 lines 56.9 kB
import * as CLS from '../base/classes'; import * as events from '../base/constant'; import { read, paste, Search, filter, Download, Delete, isFileSystemData } from '../common/operations'; import { getValue, setValue, isNullOrUndefined as isNOU, matches, select, createElement, isNullOrUndefined } from '@syncfusion/ej2-base'; import { closest, detach } from '@syncfusion/ej2-base'; import { DataManager, Query } from '@syncfusion/ej2-data'; import { createDialog } from '../pop-up/dialog'; /** * Utility function to compare two strings in a way similar to Windows Explorer. * Files and folders are sorted separately, with folders coming before files. * * @param {string} reference - The first string to compare. This could be a file or folder name. * @param {string} comparer - The second string to compare. This could be a file or folder name. * @returns {number} - A negative number if `reference` should come before `comparer`, a positive number if `comparer` should come before `reference`, and 0 if they are considered equal. */ export function sortComparer(reference, comparer) { // Check if reference and comparer are files or folders var referenceIsFile = /\.\S+/.test(reference); var comparerIsFile = /\.\S+/.test(comparer); // If one is a file and the other is a folder, the folder should come first if (referenceIsFile && !comparerIsFile) { return 1; } if (!referenceIsFile && comparerIsFile) { return -1; } var referenceParts = []; var comparerParts = []; (reference + '').replace(/(\d+)|(\D+)/g, function (_, $1, $2) { referenceParts.push([$1 || Infinity, $2 || '']); return ''; }); (comparer + '').replace(/(\d+)|(\D+)/g, function (_, $1, $2) { comparerParts.push([$1 || Infinity, $2 || '']); return ''; }); // Compare each part of reference and comparer while (referenceParts.length && comparerParts.length) { var referencePart = referenceParts.shift(); var comparerPart = comparerParts.shift(); if (referencePart && comparerPart) { var comparisonResult = referencePart[0] - comparerPart[0] || referencePart[1].localeCompare(comparerPart[1]); if (comparisonResult) { return comparisonResult; } } } return referenceParts.length - comparerParts.length; } /** * Utility file for common actions * * @param {HTMLLIElement} node - specifies the node. * @param {Object} data - specifies the data. * @param {IFileManager} instance - specifies the control instance. * @returns {void} * @private */ export function updatePath(node, data, instance) { var text = getValue('name', data); var id = node.getAttribute('data-id'); var newText = isNOU(id) ? text : id; instance.setProperties({ path: getPath(node, newText, instance.hasId) }, true); instance.pathId = getPathId(node); instance.pathNames = getPathNames(node, text); } /** * Functions for get path in FileManager * * @param {Element | Node} element - specifies the element. * @param {string} text - specifies the text. * @param {boolean} hasId - specifies the id. * @returns {string} returns the path. * @private */ export function getPath(element, text, hasId) { var matched = getParents(element, text, false, hasId); var path = '/'; var len = matched.length - (2); for (var i = len; i >= 0; i--) { path += matched[i] + '/'; } return path; } /** * Functions for get path id in FileManager * * @param {Element} node - specifies the node element. * @returns {string[]} returns the path ids. * @private */ export function getPathId(node) { var matched = getParents(node, node.getAttribute('data-uid'), true); var ids = []; for (var i = matched.length - 1; i >= 0; i--) { ids.push(matched[i]); } return ids; } /** * Functions for get path names in FileManager * * @param {Element} element - specifies the node element. * @param {string} text - specifies the text. * @returns {string[]} returns the path names. * @private */ export function getPathNames(element, text) { var matched = getParents(element, text, false); var names = []; for (var i = matched.length - 1; i >= 0; i--) { names.push(matched[i]); } return names; } /** * Functions for get path id in FileManager * * @param {Element} element - specifies the node element. * @param {string} text - specifies the text. * @param {boolean} isId - specifies the id. * @param {boolean} hasId - checks the id exists. * @returns {string[]} returns parent element. * @private */ export function getParents(element, text, isId, hasId) { var matched = [text]; var el = element.parentNode; while (!isNOU(el)) { if (matches(el, '.' + CLS.LIST_ITEM)) { var parentText = isId ? el.getAttribute('data-uid') : (hasId ? el.getAttribute('data-id') : select('.' + CLS.LIST_TEXT, el).textContent); matched.push(parentText); } el = el.parentNode; if (el.classList.contains(CLS.TREE_VIEW)) { break; } } return matched; } /** * Functions for generate path * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function generatePath(parent) { var key = parent.hasId ? 'id' : 'name'; var newPath = '/'; var i = 1; for (i; i < parent.pathId.length; i++) { var data = getValue(parent.pathId[parseInt(i.toString(), 10)], parent.feParent); newPath += getValue(key, data) + '/'; } parent.setProperties({ path: newPath }, true); } /** * Functions for remove active element * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function removeActive(parent) { if (parent.isCut) { removeBlur(parent); parent.selectedNodes = []; parent.actionRecords = []; parent.enablePaste = false; parent.notify(events.hidePaste, {}); } } /** * Selects active element in File Manager * * @param {string} action - specifies the action. * @param {IFileManager} parent - specifies the parent element. * @returns {boolean} - returns active element. * @private */ export function activeElement(action, parent) { parent.isSearchCut = false; parent.actionRecords = []; parent.activeElements = []; parent.notify(events.cutCopyInit, {}); if (parent.activeElements.length === 0) { return false; } removeBlur(parent); var blurEle = parent.activeElements; if (parent.activeModule !== 'navigationpane') { parent.targetPath = parent.path; } else { parent.targetPath = getParentPath(parent.path); } var i = 0; if (blurEle) { getModule(parent, blurEle[0]); if (action === 'cut') { while (i < blurEle.length) { addBlur(blurEle[i]); i++; } } } i = 0; parent.selectedNodes = []; parent.enablePaste = true; parent.notify(events.showPaste, {}); while (i < parent.activeRecords.length) { parent.actionRecords.push(parent.activeRecords[i]); parent.selectedNodes.push(getValue('name', parent.activeRecords[i])); i++; } if ((parent.breadcrumbbarModule.searchObj.element.value !== '' || parent.isFiltered) && parent.activeModule !== 'navigationpane') { parent.selectedNodes = []; parent.isSearchCut = true; var i_1 = 0; while (i_1 < parent.selectedItems.length) { parent.selectedNodes.push(parent.selectedItems[i_1]); i_1++; } } return true; } /** * Adds blur to the elements * * @param {Element} nodes - specifies the nodes. * @returns {void} * @private */ export function addBlur(nodes) { nodes.classList.add(CLS.BLUR); } /** * Removes blur from elements * * @param {IFileManager} parent - specifies the parent element. * @param {string} hover - specifies the hover string. * @returns {void} * @private */ export function removeBlur(parent, hover) { var blurEle = (!hover) ? parent.element.querySelectorAll('.' + CLS.BLUR) : parent.element.querySelectorAll('.' + CLS.HOVER); var i = 0; while (i < blurEle.length) { blurEle[i].classList.remove((!hover) ? CLS.BLUR : CLS.HOVER); i++; } } /** * Gets module name * * @param {IFileManager} parent - specifies the parent element. * @param {Element} element - specifies the element. * @returns {void} * @private */ export function getModule(parent, element) { if (element) { if (element.classList.contains(CLS.ROW)) { parent.activeModule = 'detailsview'; } else if (closest(element, '.' + CLS.LARGE_ICON)) { parent.activeModule = 'largeiconsview'; } else { parent.activeModule = 'navigationpane'; } } } /** * Get all child items * * @param {IFileManager} parent - specifies the parent element. * @param {string | number} parentId - specifies the parent ID. * @returns {Object[]} An array of child items * @private */ export function getAllChildItems(parent, parentId) { var children = parent.fileSystemData.filter(function (item) { return String(item.parentId) === String(parentId); }); var allChildren = children.slice(); children.forEach(function (child) { var childId = child.id; allChildren = allChildren.concat(getAllChildItems(parent, childId)); }); return allChildren; } /** * Gets module name * * @param {IFileManager} parent - specifies the parent element. * @param {string} value - specifies the value. * @param {boolean} isLayoutChange - specifies the layout change. * @returns {void} * @private */ export function searchWordHandler(parent, value, isLayoutChange) { var searchWord; if (value.length === 0 && !parent.isFiltered) { parent.notify(events.pathColumn, { args: parent }); } if (isFileSystemData(parent)) { if (value === '') { parent.itemData = parent.fileSystemData; read(parent, isLayoutChange ? events.layoutChange : events.search, parent.path); } else { parent.searchSettings.filterType = isNOU(parent.searchSettings.filterType) ? 'contains' : parent.searchSettings.filterType; var currData = getValue(parent.pathId[parent.pathId.length - 1], parent.feParent); var parentId = getValue('id', currData); var filteredData = getAllChildItems(parent, parentId); var data = new DataManager(filteredData). executeLocal(new Query().where('name', parent.searchSettings.filterType, value, parent.searchSettings.ignoreCase)); var searchValue = parent.searchSettings.ignoreCase ? value.toLowerCase() : value; parent.itemData = data; Search(parent, isLayoutChange ? events.layoutChange : events.search, parent.path, searchValue, parent.showHiddenItems, !parent.searchSettings.ignoreCase); } return; } if (parent.searchSettings.filterType === 'startsWith') { searchWord = value + '*'; } else if (parent.searchSettings.filterType === 'endsWith') { searchWord = '*' + value; } else { searchWord = '*' + value + '*'; } parent.searchWord = searchWord; parent.itemData = [getPathObject(parent)]; if (value.length > 0) { var caseSensitive = parent.searchSettings.ignoreCase; var hiddenItems = parent.showHiddenItems; Search(parent, isLayoutChange ? events.layoutChange : events.search, parent.path, searchWord, hiddenItems, !caseSensitive); } else { if (!parent.isFiltered) { if (parent.isSortByClicked) { parent.notify(events.layoutChange, { files: (parent.oldView === 'Details') ? parent.detailsviewModule.gridObj.dataSource : parent.largeiconsviewModule.allItems }); parent.isSortByClicked = false; } else { read(parent, isLayoutChange ? events.layoutChange : events.search, parent.path); } } else { filter(parent, events.layoutChange); } } } /** * Gets updated layout * * @param {IFileManager} parent - specifies the parent element. * @param {string} view - specifies the view. * @returns {void} * @private */ export function updateLayout(parent, view) { parent.oldView = parent.view; parent.setProperties({ view: view }, true); if (parent.breadcrumbbarModule.searchObj.element.value !== '' || parent.isFiltered) { parent.layoutSelectedItems = parent.selectedItems; } var searchWord = ''; if (parent.breadcrumbbarModule.searchObj.element.value) { searchWord = parent.breadcrumbbarModule.searchObj.element.value; } parent.isLayoutChange = true; searchWordHandler(parent, searchWord, true); } /* istanbul ignore next */ /** * Gets updated layout * * @param {IFileManager} parent - specifies the parent element. * @param {Element} element - specifies the element. * @returns {void} * @private */ export function getTargetModule(parent, element) { var tartgetModule = ''; if (element) { if (closest(element, '.' + CLS.ROOT + '.' + CLS.CONTROL + ' .' + CLS.GRID_CONTENT)) { tartgetModule = 'detailsview'; } else if (closest(element, '.' + CLS.LARGE_ICONS)) { tartgetModule = 'largeiconsview'; } else if (element.classList.contains('e-fullrow') || element.classList.contains('e-icon-expandable')) { tartgetModule = 'navigationpane'; } else if (closest(element, '.e-address-list-item')) { tartgetModule = 'breadcrumbbar'; } else { tartgetModule = ''; } } parent.targetModule = tartgetModule; } /* istanbul ignore next */ /** * refresh the layout * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function refresh(parent) { parent.itemData = [getPathObject(parent)]; if (!hasReadAccess(parent.itemData[0])) { createDeniedDialog(parent, parent.itemData[0], events.permissionRead); } else { read(parent, events.refreshEnd, parent.path); } } /** * open action in the layout * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function openAction(parent) { read(parent, events.openEnd, parent.path); } /** * open action in the layout * * @param {IFileManager} parent - specifies the parent element. * @returns {Object} - returns the path data. * @private */ export function getPathObject(parent) { return getValue(parent.pathId[parent.pathId.length - 1], parent.feParent); } /** * Copy files * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function copyFiles(parent) { if (!activeElement('copy', parent)) { return; } else { parent.fileAction = 'copy'; } } /** * Cut files * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function cutFiles(parent) { if (!activeElement('cut', parent)) { return; } else { parent.isCut = true; parent.fileAction = 'move'; } } /** * To add class for fileType * * @param {Object} file - specifies the file. * @returns {string} - returns the file type. * @private */ export function fileType(file) { var isFile = getValue('isFile', file); if (!isFile) { return CLS.FOLDER; } var imageFormat = ['bmp', 'dib', 'jpg', 'jpeg', 'jpe', 'jfif', 'gif', 'tif', 'tiff', 'png', 'ico']; var audioFormat = ['mp3', 'wav', 'aac', 'ogg', 'wma', 'aif', 'fla', 'm4a']; var videoFormat = ['webm', 'mkv', 'flv', 'vob', 'ogv', 'ogg', 'avi', 'wmv', 'mp4', '3gp']; var knownFormat = ['css', 'exe', 'html', 'js', 'msi', 'pdf', 'pptx', 'ppt', 'rar', 'zip', 'txt', 'docx', 'doc', 'xlsx', 'xls', 'xml', 'rtf', 'php']; var filetype = getValue('type', file); filetype = filetype.toLowerCase(); if (filetype.indexOf('.') !== -1) { filetype = filetype.split('.').join(''); } var iconType; if (imageFormat.indexOf(filetype) !== -1) { iconType = CLS.ICON_IMAGE; } else if (audioFormat.indexOf(filetype) !== -1) { iconType = CLS.ICON_MUSIC; } else if (videoFormat.indexOf(filetype) !== -1) { iconType = CLS.ICON_VIDEO; } else if (knownFormat.indexOf(filetype) !== -1) { iconType = 'e-fe-' + filetype; } else { iconType = 'e-fe-unknown e-fe-' + filetype; } return iconType; } /* istanbul ignore next */ /** * To get the image URL * * @param {IFileManager} parent - specifies the parent element. * @param {Object} item - specifies the item. * @returns {string} - returns the image url. * @private */ export function getImageUrl(parent, item) { var imgUrl = isFileSystemData(parent) ? getValue('imageUrl', item) : ''; if (isFileSystemData(parent)) { var eventArgs_1 = { fileDetails: [item], imageUrl: imgUrl }; parent.trigger('beforeImageLoad', eventArgs_1); return eventArgs_1.imageUrl; } var baseUrl = parent.ajaxSettings.getImageUrl ? parent.ajaxSettings.getImageUrl : parent.ajaxSettings.url; var pathUrl = (baseUrl.indexOf('?') !== -1) ? '&path=' : '?path='; var fileName = encodeURIComponent(getValue('name', item)); var fPath = getValue('filterPath', item); if (parent.hasId) { var imgId = getValue('id', item); imgUrl = baseUrl + pathUrl + parent.path + '&id=' + imgId; } else if (!isNOU(fPath)) { imgUrl = baseUrl + pathUrl + encodeURIComponent(fPath.replace(/\\/g, '/')) + fileName; } else { imgUrl = baseUrl + pathUrl + parent.path + fileName; } imgUrl = imgUrl + '&time=' + (new Date().getTime()).toString(); var eventArgs = { fileDetails: [item], imageUrl: imgUrl }; parent.trigger('beforeImageLoad', eventArgs); return eventArgs.imageUrl; } /* istanbul ignore next */ /** * Gets the full path * * @param {IFileManager} parent - specifies the parent element. * @param {Object} data - specifies the data. * @param {string} path - specifies the path. * @returns {string} - returns the image url. * @private */ export function getFullPath(parent, data, path) { var filePath = getValue(parent.hasId ? 'id' : 'name', data) + '/'; var fPath = getValue(parent.hasId ? 'filterId' : 'filterPath', data); if (!isNOU(fPath)) { return fPath.replace(/\\/g, '/').replace(/^.*?(?=\/)/, '') + filePath; } else { return path + filePath; } } /** * Gets the name * * @param {IFileManager} parent - specifies the parent element. * @param {Object} data - specifies the data. * @returns {string} - returns the name. * @private */ export function getName(parent, data) { var name = getValue('name', data); var fPath = getValue('filterPath', data); if ((parent.breadcrumbbarModule.searchObj.element.value !== '' || parent.isFiltered) && !isNOU(fPath)) { fPath = fPath.replace(/\\/g, '/'); name = fPath.replace(parent.path, '') + name; } return name; } /** * Gets the name * * @param {IFileManager} parent - specifies the parent element. * @param {Object[]} items - specifies the item elements. * @returns {Object[]} - returns the sorted data. * @private */ export function getSortedData(parent, items) { if (items.length === 0) { return items; } var query; if (parent.sortOrder !== 'None' && !isNullOrUndefined(parent.sortOrder)) { query = new Query().sortBy(parent.sortBy, parent.sortOrder.toLowerCase(), true).group('isFile'); } else { query = new Query().group('isFile'); } var lists = new DataManager(items).executeLocal(query); return getValue('records', lists); } /** * Gets the data object * * @param {IFileManager} parent - specifies the parent element. * @param {string} key - specifies the key. * @param {string} value - specifies the value. * @returns {Object} - returns the sorted data. * @private */ export function getObject(parent, key, value) { var currFiles = getValue(parent.pathId[parent.pathId.length - 1], parent.feFiles); var result = currFiles.filter(function (data) { return data[key].toString() === value; }); return result[0]; } /** * Creates empty element * * @param {IFileManager} parent - specifies the parent element. * @param {HTMLElement} element - specifies the element. * @param {ReadArgs | SearchArgs} args - specifies the args. * @returns {void} * @private */ export function createEmptyElement(parent, element, args) { var top; var layoutElement = select('#' + parent.element.id + CLS.LAYOUT_ID, parent.element); var addressBarHeight = select('#' + parent.element.id + CLS.BREADCRUMBBAR_ID, layoutElement).offsetHeight; top = layoutElement.offsetHeight - addressBarHeight; if (parent.view === 'Details') { top = top - select('.' + CLS.GRID_HEADER, layoutElement).offsetHeight; } if (isNOU(element.querySelector('.' + CLS.EMPTY))) { var emptyDiv = createElement('div', { className: CLS.EMPTY }); var emptyFolder = createElement('div', { className: CLS.LARGE_EMPTY_FOLDER }); var emptyEle = createElement('div', { className: CLS.EMPTY_CONTENT }); var dragFile = createElement('div', { className: CLS.EMPTY_INNER_CONTENT }); if (parent.view === 'Details') { element.querySelector('.' + CLS.GRID_VIEW).appendChild(emptyDiv); } else { element.appendChild(emptyDiv); } emptyDiv.appendChild(emptyFolder); emptyDiv.appendChild(emptyEle); emptyDiv.appendChild(dragFile); } if (element.querySelector('.' + CLS.EMPTY)) { if (!isNOU(args.error)) { element.querySelector('.' + CLS.EMPTY_CONTENT).innerHTML = getLocaleText(parent, 'Access-Denied'); element.querySelector('.' + CLS.EMPTY_INNER_CONTENT).innerHTML = getLocaleText(parent, 'Access-Details'); } else if (parent.isFiltered) { element.querySelector('.' + CLS.EMPTY_CONTENT).innerHTML = getLocaleText(parent, 'Filter-Empty'); element.querySelector('.' + CLS.EMPTY_INNER_CONTENT).innerHTML = getLocaleText(parent, 'Filter-Key'); } else if (parent.breadcrumbbarModule.searchObj.element.value !== '') { element.querySelector('.' + CLS.EMPTY_CONTENT).innerHTML = getLocaleText(parent, 'Search-Empty'); element.querySelector('.' + CLS.EMPTY_INNER_CONTENT).innerHTML = getLocaleText(parent, 'Search-Key'); } else { element.querySelector('.' + CLS.EMPTY_CONTENT).innerHTML = getLocaleText(parent, 'Folder-Empty'); element.querySelector('.' + CLS.EMPTY_INNER_CONTENT).innerHTML = getLocaleText(parent, 'File-Upload'); } } var eDiv = select('.' + CLS.EMPTY, element); top = (top - eDiv.offsetHeight) / 2; eDiv.style.marginTop = top + 'px'; } /** * Gets the directories * * @param {Object[]} files - specifies the file object. * @returns {Object[]} - returns the sorted data. * @private */ export function getDirectories(files) { return new DataManager(files).executeLocal(new Query().where(events.isFile, 'equal', false, false)); } /** * set the Node ID * * @param {ReadArgs} result - specifies the result. * @param {string} rootId - specifies the rootId. * @returns {void} * @private */ export function setNodeId(result, rootId) { var dirs = getDirectories(result.files); for (var i = 0, len = dirs.length; i < len; i++) { setValue('_fm_id', rootId + '_' + i, dirs[i]); } } /** * set the date object * * @param {Object[]} args - specifies the file object. * @returns {void} * @private */ export function setDateObject(args) { for (var i = 0; i < args.length; i++) { var createdDate = new Date(getValue('dateCreated', args[i])); var modifiedDate = new Date(getValue('dateModified', args[i])); setValue('_fm_created', createdDate, args[i]); setValue('_fm_modified', modifiedDate, args[i]); } } /** * get the locale text * * @param {IFileManager} parent - specifies the parent element. * @param {string} text - specifies the text. * @returns {string} - returns the locale text. * @private */ export function getLocaleText(parent, text) { var locale = parent.localeObj.getConstant(text); return (locale === '') ? text : locale; } /** * get the CSS class * * @param {IFileManager} parent - specifies the parent element. * @param {string} css - specifies the css. * @returns {string} - returns the css classes. * @private */ export function getCssClass(parent, css) { var cssClass = parent.cssClass; cssClass = (isNOU(cssClass) || cssClass === '') ? css : (cssClass + ' ' + css); return cssClass; } /** * sort on click * * @param {IFileManager} parent - specifies the parent element. * @param {MenuEventArgs} args - specifies the menu event arguements. * @returns {void} * @private */ export function sortbyClickHandler(parent, args) { var tick; parent.isSortByClicked = true; if (args.item.id.indexOf('ascending') !== -1 || args.item.id.indexOf('descending') !== -1 || args.item.id.indexOf('none') !== -1) { tick = true; } else { tick = false; } if (!tick) { parent.sortBy = getSortField(args.item.id, parent); } else { parent.sortOrder = getSortField(args.item.id); } parent.itemData = [getPathObject(parent)]; if (parent.view === 'Details') { if (parent.isMobile) { updateLayout(parent, 'Details'); } else { parent.notify(events.sortColumn, { module: 'detailsview' }); parent.isSortByClicked = false; } } if (parent.view === 'LargeIcons') { updateLayout(parent, 'LargeIcons'); } parent.notify(events.sortByChange, {}); } /** * Gets the sorted fields * * @param {string} id - specifies the id. * @param {IFileManager} [parent] - optional parameter representing the parent IFileManager. * @returns {string} - returns the sorted fields * @private */ export function getSortField(id, parent) { var text = id.substring(id.lastIndexOf('_') + 1); var field = text; var column; if (parent) { column = parent.detailsViewSettings.columns; } switch (text) { case 'date': for (var i = 0, len = column.length; i < len; i++) { if (column[i].field === 'dateModified' || column[i].field === 'dateCreated') { field = column[i].field; break; } else { field = '_fm_modified'; } } break; case 'ascending': field = 'Ascending'; break; case 'descending': field = 'Descending'; break; case 'none': field = 'None'; break; } return field; } /** * Sets the next path * * @param {IFileManager} parent - specifies the parent element. * @param {string} path - specifies the path. * @returns {void} * @private */ export function setNextPath(parent, path) { var currfolders = path.split('/'); var folders = parent.originalPath.split('/'); var root = getValue(parent.pathId[0], parent.feParent); var key = isNOU(getValue('id', root)) ? 'name' : 'id'; for (var i = currfolders.length - 1, len = folders.length - 1; i < len; i++) { var eventName = (folders[i + 1] === '') ? events.finalizeEnd : events.initialEnd; var newPath = (folders[i] === '') ? '/' : (parent.path + folders[i] + '/'); var data = getObject(parent, key, folders[parseInt(i.toString(), 10)]); var id = getValue('_fm_id', data); parent.setProperties({ path: newPath }, true); if (!isNullOrUndefined(id)) { parent.pathId.push(id); } parent.itemData = [data]; parent.pathNames.push(getValue('name', data)); read(parent, eventName, parent.path); break; } } /** * Opens the searched folder * * @param {IFileManager} parent - specifies the parent element. * @param {Object} data - specifies the data * @returns {void} * @private */ export function openSearchFolder(parent, data) { parent.originalPath = getFullPath(parent, data, parent.path); var root = getValue(parent.pathId[0], parent.feParent); var navData = parent.feParent[getValue('_fm_id', parent.itemData[0])]; var isRoot = isNullOrUndefined(navData) || getValue('_fm_id', navData) === 'fe_tree'; var key = isNOU(getValue('id', root)) ? 'name' : 'id'; var searchData = getObject(parent, key, isFileSystemData(parent) ? getValue('id', data) : getValue('name', data)); if (isNullOrUndefined(searchData)) { if (!isRoot) { parent.notify(events.clearPathInit, { selectedNode: parent.pathId[parent.pathId.length - 1] }); } else { setNextPath(parent, parent.path); return; } } else { var id = getValue('_fm_id', searchData); parent.setProperties({ path: parent.originalPath }, true); parent.pathId.push(id); parent.itemData = [searchData]; parent.pathNames.push(getValue('name', searchData)); } read(parent, (parent.path !== parent.originalPath) ? events.initialEnd : events.finalizeEnd, parent.path); } /** * Paste handling function * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function pasteHandler(parent) { parent.isDragDrop = false; if (parent.selectedNodes.length !== 0 && parent.enablePaste) { var path = (parent.folderPath === '') ? parent.path : parent.folderPath; if (parent.activeModule === 'navigationpane' && !parent.selectedNodes[0].includes('/')) { parent.targetPath = getTargetPath(parent, parent.actionRecords[0]); } var subFolder = validateSubFolder(parent, parent.actionRecords, path, parent.path); if (!subFolder) { if ((parent.fileAction === 'move' && parent.targetPath !== path) || parent.fileAction === 'copy') { parent.notify(events.pasteInit, {}); paste(parent, parent.targetPath, parent.selectedNodes, path, parent.fileAction, [], parent.actionRecords); } else { parent.enablePaste = false; parent.notify(events.hidePaste, {}); removeBlur(parent); var result = { files: null, error: { code: '402', message: getLocaleText(parent, 'Same-Folder-Error'), fileExists: null } }; createDialog(parent, 'Error', result); } } } } /** * Validates the sub folders * * @param {IFileManager} parent - specifies the parent element. * @param {'{ [key: string]: Object; }[]'} data - specifies the data. * @param {string} dropPath - specifies the drop path. * @param {string} dragPath - specifies the drag path. * @returns {boolean} - returns the validated sub folder. * @private */ export function validateSubFolder(parent, data, dropPath, dragPath) { var subFolder = false; for (var i = 0; i < data.length; i++) { if (!getValue('isFile', data[i])) { var tempTarget = getFullPath(parent, data[i], dragPath); if (dropPath.indexOf(tempTarget) === 0) { var result = { files: null, error: { code: '402', message: getLocaleText(parent, 'Sub-Folder-Error'), fileExists: null } }; createDialog(parent, 'Error', result); subFolder = true; break; } } else { var name_1 = parent.dragData[i] ? parent.dragData[i].name : null; var srcData = isFileSystemData(parent) ? name_1 : parent.dragNodes[i]; var len = 0; if (srcData) { len = srcData.lastIndexOf('/'); } var path = ''; if (len > 0) { path = dragPath + srcData.substring(0, len + 1); } if (path === dropPath) { var result = { files: null, error: { code: '402', message: getLocaleText(parent, 'Same-Folder-Error'), fileExists: null } }; createDialog(parent, 'Error', result); subFolder = true; break; } } } return subFolder; } /** * Validates the drop handler * * @param {IFileManager} parent - specifies the parent element. * @returns {void} * @private */ export function dropHandler(parent) { parent.isDragDrop = true; if (parent.dragData.length !== 0) { parent.dragPath = parent.dragPath.replace(/\\/g, '/'); parent.dropPath = parent.dropPath.replace(/\\/g, '/'); var subFolder = validateSubFolder(parent, parent.dragData, parent.dropPath, parent.dragPath); if (!subFolder && (parent.dragPath !== parent.dropPath)) { parent.itemData = [parent.dropData]; paste(parent, parent.dragPath, parent.dragNodes, parent.dropPath, 'move', [], parent.dragData); parent.notify(events.pasteInit, {}); } } } /** * Gets the parent path * * @param {string} oldPath - specifies the old path. * @returns {string} - returns the parent path. * @private */ export function getParentPath(oldPath) { var path = oldPath.split('/'); var newPath = path[0] + '/'; for (var i = 1; i < path.length - 2; i++) { newPath += path[i] + '/'; } return newPath; } /** * Gets the directory path * * @param {IFileManager} parent - specifies the parent. * @param {ReadArgs} args - returns the read arguements. * @returns {string} - returns the directory path * @private */ export function getDirectoryPath(parent, args) { var filePath = getValue(parent.hasId ? 'id' : 'name', args.cwd) + '/'; var fPath = getValue(parent.hasId && !isNullOrUndefined(parent.ajaxSettings.url) ? 'filterId' : 'filterPath', args.cwd); if (!isNOU(fPath)) { if (fPath === '') { return '/'; } return fPath.replace(/\\/g, '/').replace(/^.*?(?=\/)/, '') + filePath; } else { return isFileSystemData(parent) ? filePath : parent.path + filePath; } } /** * Gets the do paste path * * @param {IFileManager} parent - specifies the parent. * @param {string} operation - specifies the operations. * @param {ReadArgs} result - returns the result. * @returns {void} * @private */ export function doPasteUpdate(parent, operation, result) { if (operation === 'move') { if (!parent.isDragDrop) { parent.enablePaste = false; parent.notify(events.hidePaste, {}); parent.notify(events.cutEnd, result); } else { parent.notify(events.dragEnd, result); } } if (parent.duplicateItems.length === 0) { parent.pasteNodes = []; } var flag = false; for (var count = 0; (count < result.files.length) && !flag; count++) { parent.pasteNodes.push(result.files[count][parent.hasId ? 'id' : 'name']); if (parent.isDragDrop) { parent.droppedObjects.push(result.files[count]); } } parent.duplicateItems = []; parent.duplicateRecords = []; if (parent.isDragDrop && !parent.isPasteError) { parent.isDropEnd = true; } else { parent.isDropEnd = false; } parent.trigger('success', { action: operation, result: result }); if (!parent.isDragDrop || (parent.path === parent.dragPath) || (parent.path === parent.dropPath) || parent.isSearchDrag) { parent.isPathDrag = false; read(parent, events.pasteEnd, parent.path); } else { readDropPath(parent); } } /** * Reads the drop path * * @param {IFileManager} parent - specifies the parent. * @returns {void} * @private */ export function readDropPath(parent) { var pathId = getValue('_fm_id', parent.dropData); parent.expandedId = pathId; parent.itemData = [parent.dropData]; if (parent.isPathDrag) { parent.notify(events.pathDrag, parent.itemData); } else { if (parent.navigationpaneModule) { var node = select('[data-uid="' + pathId + '"]', parent.navigationpaneModule.treeObj.element); if (!node) { var liElement = document.querySelector('[data-id = "' + getValue('id', parent.dropData) + '"]'); pathId = liElement.getAttribute('data-uid'); node = select('[data-uid="' + pathId + '"]', parent.navigationpaneModule.treeObj.element); } updatePath(node, parent.dropData, parent); } read(parent, events.dropPath, parent.dropPath); } } /** * Gets the duplicated path * * @param {IFileManager} parent - specifies the parent. * @param {string} name - specifies the name. * @returns {object} - returns the duplicated path. * @private */ export function getDuplicateData(parent, name) { var data = null; var records = parent.isDragDrop ? parent.dragData : parent.actionRecords; for (var i = 0; i < records.length; i++) { if (getValue('name', records[i]) === name) { data = records[i]; break; } } return data; } /** * Gets the create the virtual drag element * * @param {IFileManager} parent - specifies the parent. * @returns {void} * @private */ export function createVirtualDragElement(parent) { parent.isSearchDrag = false; if (parent.breadcrumbbarModule.searchObj.element.value !== '') { parent.isSearchDrag = true; } if (parent.activeModule !== 'navigationpane') { parent.dragNodes = []; var i = 0; while (i < parent.selectedItems.length) { parent.dragNodes.push(parent.selectedItems[i]); i++; } if (parent.selectedItems.length === 0 && parent.dragData && parent.dragData.length === 1) { parent.dragNodes.push(getItemName(parent, parent.dragData[0])); } } var cloneIcon = parent.createElement('div', { className: 'e-fe-icon ' + fileType(parent.dragData[0]) }); var cloneName = parent.createElement('div', { className: 'e-fe-name', innerHTML: parent.dragData[0].name }); var virtualEle = parent.createElement('div', { className: 'e-fe-content' }); virtualEle.appendChild(cloneIcon); virtualEle.appendChild(cloneName); var ele = parent.createElement('div', { className: CLS.CLONE }); ele.appendChild(virtualEle); if (parent.dragNodes.length > 1) { var badge = parent.createElement('span', { className: 'e-fe-count', innerHTML: (parent.dragNodes.length).toString(10) }); ele.appendChild(badge); } parent.virtualDragElement = ele; parent.element.appendChild(parent.virtualDragElement); } /** * Drops the stop handler * * @param {IFileManager} parent - specifies the parent. * @param {DragEventArgs} args - specifies the drag event arguements. * @returns {void} * @private */ export function dragStopHandler(parent, args) { var dragArgs = args; dragArgs.cancel = false; if (parent.treeExpandTimer != null) { window.clearTimeout(parent.treeExpandTimer); parent.treeExpandTimer = null; } removeDropTarget(parent); parent.element.classList.remove('e-fe-drop', 'e-no-drop'); removeBlur(parent); parent.uploadObj.dropArea = select('#' + parent.element.id + CLS.CONTENT_ID, parent.element); var virtualEle = select('.' + CLS.CLONE, parent.element); if (virtualEle) { detach(virtualEle); } getTargetModule(parent, args.target); parent.notify(events.dropInit, args); removeBlur(parent, 'hover'); dragArgs.fileDetails = parent.dragData; parent.trigger('fileDragStop', dragArgs, function (dragArgs) { if (!dragArgs.cancel && !isNOU(parent.targetModule) && parent.targetModule !== '' && parent.dragCount > 2) { dropHandler(parent); } parent.dragCount = 0; }); } /** * Drag the start handler * * @param {IFileManager} parent - specifies the parent. * @param {'DragEventArgs'} args - specifies the drag event arguements. * @param {Draggable} dragObj - specifies the drag event arguements. * @returns {void} * @private */ export function dragStartHandler(parent, args, dragObj) { var dragArgs = args; dragArgs.cancel = false; dragArgs.fileDetails = parent.dragData; parent.dragCount = 0; parent.droppedObjects = []; if (!parent.allowDragAndDrop || ((parent.activeModule === 'navigationpane') && (closest(args.element, 'li').getAttribute('data-uid') === parent.pathId[0]))) { dragArgs.cancel = true; } if ((parent.activeModule === 'navigationpane') && (parent.pathId.indexOf(closest(args.element, 'li').getAttribute('data-uid')) !== -1)) { parent.isPathDrag = true; } else { parent.isPathDrag = false; } removeBlur(parent); if (dragArgs.cancel) { dragObj.intDestroy(args.event); dragCancel(parent); } else if (!dragArgs.cancel) { var i = 0; while (i < parent.activeElements.length) { addBlur(parent.activeElements[i]); i++; } parent.trigger('fileDragStart', dragArgs, function (dragArgs) { if (dragArgs.cancel) { dragObj.intDestroy(args.event); dragCancel(parent); } else { parent.uploadObj.dropArea = null; } }); } } /** * Drag the cancel handler * * @param {IFileManager} parent - specifies the parent. * @returns {void} * @private */ export function dragCancel(parent) { removeBlur(parent); var virtualEle = select('.' + CLS.CLONE, parent.element); if (virtualEle) { detach(virtualEle); } } /** * Remove drop target handler * * @param {IFileManager} parent - specifies the parent. * @returns {void} * @private */ export function removeDropTarget(parent) { removeItemClass(parent, CLS.DROP_FOLDER); removeItemClass(parent, CLS.DROP_FILE); } /** * Remove item class handler * * @param {IFileManager} parent - specifies the parent. * @param {string} value - specifies the value. * @returns {void} * @private */ export function removeItemClass(parent, value) { var ele = parent.element.querySelectorAll('.' + value); for (var i = 0; i < ele.length; i++) { ele[i].classList.remove(value); } } /** * Remove item class handler * * @param {Element} scrollParent - specifies the scrolling target. * @param {IFileManager} parent - specifies the parent. * @param {string} nodeClass - specifies the node class. * @param {number} clientY - specifies the vertical (Y) coordinate of the mouse cursor position relative to the target element. * @returns {void} * @private */ export function scrollHandler(scrollParent, parent, nodeClass, clientY) { var position; var elementData = scrollParent.getBoundingClientRect(); var node = select('.' + nodeClass, scrollParent); if ((clientY >= (elementData.top + scrollParent.clientHeight - 30)) && !isNullOrUndefined(node)) { position = (parent.targetModule === 'navigationpane' || parent.targetModule === 'detailsview') ? node.offsetHeight / 2.5 : node.offsetHeight / 4.5; scrollParent.scrollBy(0, position); } if (!isNullOrUndefined(node) && (clientY <= (elementData.top + 30))) { position = (parent.targetModule === 'navigationpane' || parent.targetModule === 'detailsview') ? node.offsetHeight / 2.5 : node.offsetHeight / 4.5; scrollParent.scrollBy(0, -position); } } /** * Dragging handler * * @param {IFileManager} parent - specifies the parent. * @param {DragEventArgs} args - specifies the arguements. * @returns {void} * @private */ export function draggingHandler(parent, args) { var dragArgs = args; dragArgs.fileDetails = parent.dragData; var canDrop = false; getTargetModule(parent, args.target); removeDropTarget(parent); if (parent.treeExpandTimer != null) { window.clearTimeout(parent.treeExpandTimer); parent.treeExpandTimer = null; } removeBlur(parent, 'hover'); var node = null; var scrollParent; if (parent.targetModule === 'navigationpane') { node = closest(args.target, 'li'); node.classList.add(CLS.HOVER, CLS.DROP_FOLDER); canDrop = true; /* istanbul ignore next */ parent.treeExpandTimer = window.setTimeout(function () { parent.notify(events.dragging, args); }, 800); scrollParent = parent.navigationpaneModule.treeObj.element.parentElement; scrollHandler(scrollParent, parent, 'e-level-2', args.event.y); } else if (parent.targetModule === 'detailsview') { node = closest(args.target, 'tr'); if (node && node.querySelector('.' + CLS.FOLDER) && !node.classList.contains(CLS.BLUR)) { node.classList.add(CLS.DROP_FOLDER); } else if (node && !node.querySelector('.' + CLS.FOLDER) && !node.classList.contains(CLS.BLUR)) { node.classList.add(CLS.DROP_FILE); } canDrop = true; scrollParent = parent.detailsviewModule.gridObj.element.querySelector('.e-content'); scrollHandler(scrollParent, parent, 'e-row', args.event.y); } else if (parent.targetModule === 'largeiconsview') { node = closest(args.target, 'li'); if (node && node.querySelector('.' + CLS.FOLDER) && !node.classList.contains(CLS.BLUR)) { node.classList.add(CLS.HOVER, CLS.DROP_FOLDER); } canDrop = true; scrollParent = parent.largeiconsviewModule.element.firstElementChild; scrollHandler(scrollParent, parent, 'e-large-icon', args.event.y); /* istanbul ignore next */ } else if (parent.targetModule === 'breadcrumbbar') { canDrop = true; } parent.element.classList.remove('e-fe-drop', 'e-no-drop'); parent.element.classList.add(canDrop ? 'e-fe-drop' : 'e-no-drop'); parent.dragCount = parent.dragCount + 1; parent.trigger('fileDragging', dragArgs); } /** * Object to string handler * * @param {Object} data - specifies the data. * @returns {string} returns string converted from Object. * @private */ // Ignored the message key value in permission object export function objectToString(data) { var str = ''; var keys = Object.keys(data); for (var i = 0; i < keys.length; i++) { if (keys[i] !== 'message') { str += (i === 0 ? '' : ', ') + keys[i] + ': ' + getValue(keys[i], data); } } return str; } /** * Get item name handler * * @param {IFileManager} parent - specifies the parent. * @param {Object} data - specifies the data. * @returns {string} returns the item name. * @private */ export function getItemName(parent, data) { if (parent.hasId) { return getValue('id', data); } return getName(parent, data); } /** * Get item name handler * * @param {IFileManager} parent - specifies the parent. * @param {Object} data - specifies the data. * @returns {void} * @private */ export function updateRenamingData(parent, data) { parent.itemData = [data]; parent.currentItemText = getValue('name', data); parent.isFile = getValue('isFile', data); parent.filterPath = getValue('filterPath', data); } /** * Get item name handler * * @param {IFileManager} parent - specifies the parent. * @returns {void} * @private */ export function doRename(parent) { if (!hasEditAccess(parent.itemData[0])) { createDeniedDialog(parent, parent.itemData[0], events.permissionEdit); } else { createDialog(parent, 'Rename'); } } /* istanbul ignore next */ /** * Download handler * * @param {IFileManager} parent - specifies the parent. * @returns {void} * @private */ export function doDownload(parent) { var items = parent.itemData; for (var i = 0; i < items.length; i++) { if (!hasDownloadAccess(items[i])) { createDeniedDialog(parent, items[i], events.permissionDownload); return; } } if (parent.selectedItems.length > 0) { Download(parent, parent.path, parent.selectedItems); } } /** * Delete Files handler * * @param {IFileManager} parent - specifies the parent. * @param {Object[]} data - specifies the data. * @param {string[]} newIds - specifies the new Ids. * @returns {void} * @private */ export function doDeleteFiles(parent, data, newIds) { for (var i = 0; i < data.length; i++) { if (!hasEditAccess(data[i])) { createDeniedDialog(parent, data[i], events.permissionEdit); return; } } parent.itemData = data; De