UNPKG

acha-framework

Version:

is a modular framework on both client (angular.js) and server (node.js) side, it provides security, orm, ioc, obfuscation and ...

509 lines 18.2 kB
(function ($, angular, underscore, window, document, undefined) { 'use strict'; angular.module('frontend.directives').factory('fileManagerService', [ 'apiService', function (apiService) { var getBackend = function (backend, action) { return '{0}/{1}'.format([ backend || 'file-manager', action ]).replace(/\/\//g, '/'); }; return { getBackend: getBackend, listDirectory: function (backend, path) { var url = getBackend(backend, 'listDirectory'); return apiService.post(url, { path: path }); }, newFolder: function (backend, name, path) { var url = getBackend(backend, 'newFolder'); return apiService.post(url, { path: path, name: name }); }, rename: function (backend, data, path) { var url = getBackend(backend, 'rename'); return apiService.post(url, { path: path, name: data.name, newName: data.newName }); }, 'delete': function (backend, items) { var url = getBackend(backend, 'delete'); return apiService.post(url, { items: items }); }, moveCopy: function (backend, clipboard) { var url = getBackend(backend, 'moveCopy'); return apiService.post(url, clipboard); }, upload: function (backend, options) { var url = getBackend(backend, 'upload'); return apiService.upload(url, options); }, zip: function (backend, options) { var url = getBackend(backend, 'zip'); return apiService.post(url, options); } }; } ]).directive('fileManager', [ '$q', 'fileManagerService', 'fileService', 'modalService', 'apiService', 'notificationService', function ($q, fileManagerService, fileService, modalService, apiService, notificationService) { return { restrict: 'E', replace: true, scope: { tag: '<?', disabled: '=?', visible: '=?', cssClass: '=?', toolbar: '=?', toolbarActions: '=?', toolbarActionsTitle: '<?', toolbarActionsTitleTranslate: '<?', toolbarTitle: '<?', toolbarTitleTranslate: '<?', searchTitle: '<?', searchTitleTranslate: '<?', multipleSelection: '=?', backend: '=?', uploadPattern: '=?', uploadAccept: '=?', uploadMultiple: '=?', uploadMaxSize: '=?', model: '=?' }, templateUrl: '/templates/framework/directives/file-manager/template.html', link: function (scope, element, attr) { scope.vm = { clipboard: null, treeToggle: true, waiting: false, path: '/', search: '', newFolder: false, uploadPercent: 0, uploading: false, ribbon: undefined, tree: [], fileExplorer: [], crumbNav: [], uploadInput: null }; scope.vm.init = function () { if (angular.isUndefined(scope.disabled)) { scope.disabled = false; } if (angular.isUndefined(scope.visible)) { scope.visible = true; } if (angular.isUndefined(scope.cssClass)) { scope.cssClass = ''; } if (angular.isUndefined(scope.toolbar)) { scope.toolbar = false; } if (angular.isUndefined(scope.model)) { scope.model = []; } scope.vm.bind(); }; scope.vm.bind = function () { scope.vm.uploadInput = $(document.createElement('input')); scope.vm.uploadInput.attr('type', 'file'); scope.vm.uploadInput.attr('multiple', 'multiple'); scope.vm.uploadInput.on('change', function (event) { scope.$timeout(function () { scope.vm.uploading = true; scope.vm.uploadPercent = 0; }); fileManagerService.upload(scope.backend, { data: { uploadedFiles: event.target.files, path: scope.vm.path }, onSuccess: function (res) { scope.$timeout(function () { scope.vm.uploading = false; scope.vm.uploadPercent = 0; scope.vm.refresh(); }); notificationService.success('general.success'); }, onError: function (err) { scope.$timeout(function () { scope.vm.uploading = false; scope.vm.uploadPercent = 0; }); notificationService.error('general.error'); }, onProgress: function (percent) { scope.$timeout(function () { scope.vm.uploadPercent = percent; }); } }); }); scope.$watchCollection('model', function (val, old) { if (!val && !old) return; if (!val || !val.length) { scope.vm.updateRibbon(); return; } scope.vm.updateRibbon(val[0].folder); }); scope.vm.refresh(); }; scope.vm.updateRibbon = function (isFolder) { scope.vm.ribbon[0].enabled = false; scope.vm.ribbon[1].enabled = scope.vm.clipboard !== null; scope.vm.ribbon[2].enabled = false; scope.vm.ribbon[3].enabled = false; scope.vm.ribbon[4].enabled = false; scope.vm.ribbon[5].enabled = true; scope.vm.ribbon[6].enabled = false; scope.vm.ribbon[7].enabled = true; scope.vm.ribbon[8].enabled = false; scope.vm.ribbon[9].enabled = false; scope.vm.ribbon[10].enabled = false; scope.vm.ribbon[11].enabled = false; if (isFolder === undefined) return; scope.vm.ribbon[0].enabled = true; scope.vm.ribbon[1].enabled = false; scope.vm.ribbon[2].enabled = true; scope.vm.ribbon[3].enabled = true; scope.vm.ribbon[4].enabled = true; scope.vm.ribbon[10].enabled = true; scope.vm.ribbon[6].enabled = true; if (!isFolder) { scope.vm.ribbon[8].enabled = true; scope.vm.ribbon[9].enabled = true; if (fileService.getExtention(scope.model[0].path) === '.zip') { scope.vm.ribbon[11].enabled = true; } } }; scope.vm.toggleExplorer = function ($event) { if ($event) { $event.stopPropagation(); $event.preventDefault(); } scope.vm.treeToggle = !scope.vm.treeToggle; }; scope.vm.onRibbonAction = function (button) { switch (scope.$eval(button.key)) { case 'select-all': scope.vm.fileExplorer.forEach(function (item) { item.selected = true; }); break; case 'select-none': scope.vm.fileExplorer.forEach(function (item) { item.selected = false; }); break; case 'select-invert': scope.vm.fileExplorer.forEach(function (item) { item.selected = !item.selected; }); break; case 'navigation-pane': scope.vm.toggleExplorer(); break; case 'xlarge-icons': scope.vm.mode = 'x-large'; break; case 'medium-icons': scope.vm.mode = 'medium'; break; case 'details-icons': scope.vm.mode = 'detailed'; break; case 'large-icons': scope.vm.mode = 'large'; break; case 'small-icons': scope.vm.mode = 'small'; break; case 'tiles-icons': scope.vm.mode = 'tiles'; break; case 'copy': scope.vm.onCopyCommand(); break; case 'paste': scope.vm.onPasteCommand(); break; case 'cut': scope.vm.onCutCommand(); break; case 'delete': scope.vm.onDeleteCommand(); break; case 'rename': scope.vm.onRenameCommand(); break; case 'new-folder': scope.vm.newFolder = true; break; case 'upload': scope.vm.onUploadCommand(); break; case 'download': scope.vm.onDownloadCommand(); break; case 'open': scope.vm.onOpenCommand(); break; case 'preview': scope.vm.onPreviewCommand(); break; case 'zip': scope.vm.onZipCommand(); break; case 'extract-all': scope.vm.onExtractAllCommand(); break; case 'extract-seprate': scope.vm.onExtractSeprateCommand(); break; } }; scope.vm.onUploadCommand = function () { scope.vm.uploadInput.trigger('click'); }; scope.vm.onDownloadCommand = function () { var backend = fileManagerService.getBackend(scope.backend, 'download'); fileService.download(apiService.PREFIX + backend, { items: scope.model.pluck('path'), folder: scope.model[0].folder }); }; scope.vm.onOpenCommand = function () { }; scope.vm.onPreviewCommand = function () { }; scope.vm.onZipCommand = function () { fileManagerService.zip(scope.backend, { items: scope.model.pluck('path'), path: scope.vm.path }).then(function (res) { if (!res.data.status) { notificationService.error('general.failed'); return; } notificationService.success('general.success'); scope.vm.refresh(); }); }; scope.vm.onExtractAllCommand = function () { }; scope.vm.onExtractSeprateCommand = function () { }; scope.vm.onCopyCommand = function () { if (!scope.model || scope.model.length !== 1) return; scope.vm.clipboard = { mode: 'copy', source: scope.model.pluck('path') }; scope.vm.ribbon[1].enabled = true; scope.model.forEach(function (item) { item.selected = false; }); scope.model = []; }; scope.vm.onPasteCommand = function () { var operation = {}; angular.extend(operation, scope.vm.clipboard); operation.destination = scope.vm.path; scope.vm.clipboard = null; scope.vm.ribbon[1].enabled = false; fileManagerService.moveCopy(scope.backend, operation).then(function (res) { if (!res.data.status) { notificationService.error('general.failed'); return; } scope.vm.refresh(); }); }; scope.vm.onCutCommand = function () { if (!scope.model || scope.model.length !== 1) return; scope.vm.clipboard = { mode: 'move', source: scope.model.pluck('path') }; scope.vm.ribbon[1].enabled = true; scope.model.forEach(function (item) { item.selected = false; }); scope.model = []; }; scope.vm.onRenameCommand = function () { if (!scope.model || scope.model.length !== 1) return; scope.model[0].newName = scope.model[0].name; scope.model[0].editting = true; }; scope.vm.onDeleteCommand = function () { var selectedItems = scope.model.copy(); modalService.confirm({ titleTranslate: 'general.confirm_delete_title', messageTranslate: 'general.confirm_delete_message' }).then(function (result) { if (!result) return; fileManagerService.delete(scope.backend, selectedItems.pluck('path')).then(function (res) { if (!res.data.status) { notificationService.error('general.failed'); return; } selectedItems.forEach(function (item) { if (res.data.data.indexOf(item.path) !== -1) { scope.model.del(item); scope.vm.fileExplorer.del(item); } }); }); }); }; scope.vm.onNodeExpand = function (node) { if (node.waiting || node.items && node.item.length) return; if (node.folder) { node.waiting = true; fileManagerService.listDirectory(scope.backend, node.path).then(function (res) { if (res.data.status) { node.expanded = true; node.items = res.data.data.content.filter(function (item) { return item.folder; }).map(function (item) { return { title: item.name, expandable: true, path: item.path, folder: true }; }); } node.waiting = false; }); } }; scope.vm.onNodeSelect = function (node) { if (node.items && node.items.length) return; if (node.folder) { scope.vm.path = node.path; scope.vm.refresh(); } }; scope.vm.onCrumbFolderPicked = function (node) { scope.vm.path = node.path; scope.vm.refresh(); }; scope.vm.onCrumbRefresh = function () { scope.vm.refresh(); }; scope.vm.onExplorerParent = function () { if (scope.vm.crumbNav.length === 2) { scope.vm.path = '/'; scope.vm.refresh(); } else if (scope.vm.crumbNav.length > 2) { scope.vm.onCrumbFolderPicked(scope.vm.crumbNav.length - 3); } }; scope.vm.onExplorerDoubleSelect = function (node) { if (node.folder) { scope.vm.path = node.path; scope.vm.refresh(); } }; scope.vm.onExplorerSelect = function (item) { scope.model = item; }; scope.vm.onExplorerNewFolder = function (name) { return $q(function (resolve, reject) { fileManagerService.newFolder(scope.backend, name, scope.vm.path).then(function (res) { if (!res.data.status) { notificationService.error(res.data.error.name[0]); reject(); return; } scope.vm.fileExplorer.push(res.data.data); resolve(); }); }); }; scope.vm.onExplorerRename = function (item) { return $q(function (resolve, reject) { fileManagerService.rename(scope.backend, item, scope.vm.path).then(function (res) { if (!res.data.status) { notificationService.error(res.data.error.name[0]); reject(); return; } item.path.replace(item.name, item.newName); item.name = item.newName; item.newName = ''; resolve(); }); }); }; scope.vm.onAction = function (action) { if (action.action) { action.action(action); } }; scope.vm.refresh = function () { scope.vm.waiting = true; fileManagerService.listDirectory(scope.backend, scope.vm.path).then(function (res) { if (res.data.status) { scope.vm.path = res.data.data.path; scope.vm.fileExplorer = res.data.data.content; scope.vm.crumbNav = []; if (scope.vm.path === '/') { scope.vm.tree = res.data.data.content.filter(function (item) { return item.folder; }).map(function (item) { return { title: item.name, expandable: true, path: item.path, folder: true }; }); } else { scope.vm.generateCrumb(); } } scope.vm.waiting = false; }); }; scope.vm.generateCrumb = function () { var split = scope.vm.path.split('/'); for (var i = 1; i < split.length; i++) { scope.vm.crumbNav.push({ path: split.concat([]).splice(0, i + 1).join('/'), title: split[i] }); } }; scope.vm.prepareUpload = function ($files) { }; scope.vm.init(); } }; } ]); }(jQuery, angular, _, window, document));