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
JavaScript
(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));