summaryrefslogtreecommitdiffstats
path: root/apps/files/js/fileactions.js
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2014-05-08 22:06:30 +0200
committerVincent Petry <pvince81@owncloud.com>2014-05-15 17:51:04 +0200
commit9d38e3602b2faf37d861729c52690ce51b8fee97 (patch)
tree5da63d26db4a4e8ec356dee45fc8f7804c6fe38a /apps/files/js/fileactions.js
parentfb10bf4048aaf5b2a9665fc9dff217c790efe005 (diff)
downloadnextcloud-server-9d38e3602b2faf37d861729c52690ce51b8fee97.tar.gz
nextcloud-server-9d38e3602b2faf37d861729c52690ce51b8fee97.zip
Namespacing for FileList, FileActions and trashbin app
- FileList is now an instantiable class - FileActions is now in namespace - added App class for trashbin app - moved trashbin overrides into classes extending FileList - replaced many static calls with "this." or "self." to make the classes reusable/extendable - new URL parameter "view" to specify which view is shown, for example "files" or "trashbin" - added OC.Util.History utility class in core for handling history - moved URL handling/routing to OCA.Files.App - popstate will correctly update the current view and notify the view of the URL change so it can update the current dir - added JS unitt tests for the trashbin app - fixed public app to work with the new namespaces
Diffstat (limited to 'apps/files/js/fileactions.js')
-rw-r--r--apps/files/js/fileactions.js433
1 files changed, 222 insertions, 211 deletions
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index ecdfa72a477..7be599871e4 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -8,242 +8,253 @@
*
*/
-/* global OC, FileList, Files */
/* global trashBinApp */
-var FileActions = {
- actions: {},
- defaults: {},
- icons: {},
- currentFile: null,
- register: function (mime, name, permissions, icon, action, displayName) {
- if (!FileActions.actions[mime]) {
- FileActions.actions[mime] = {};
- }
- if (!FileActions.actions[mime][name]) {
- FileActions.actions[mime][name] = {};
- }
- if (!displayName) {
- displayName = t('files', name);
- }
- FileActions.actions[mime][name]['action'] = action;
- FileActions.actions[mime][name]['permissions'] = permissions;
- FileActions.actions[mime][name]['displayName'] = displayName;
- FileActions.icons[name] = icon;
- },
- setDefault: function (mime, name) {
- FileActions.defaults[mime] = name;
- },
- get: function (mime, type, permissions) {
- var actions = this.getActions(mime, type, permissions);
- var filteredActions = {};
- $.each(actions, function (name, action) {
- filteredActions[name] = action.action;
- });
- return filteredActions;
- },
- getActions: function (mime, type, permissions) {
- var actions = {};
- if (FileActions.actions.all) {
- actions = $.extend(actions, FileActions.actions.all);
- }
- if (type) {//type is 'dir' or 'file'
- if (FileActions.actions[type]) {
- actions = $.extend(actions, FileActions.actions[type]);
+(function() {
+
+ var FileActions = {
+ actions: {},
+ defaults: {},
+ icons: {},
+ currentFile: null,
+ register: function (mime, name, permissions, icon, action, displayName) {
+ if (!this.actions[mime]) {
+ this.actions[mime] = {};
}
- }
- if (mime) {
- var mimePart = mime.substr(0, mime.indexOf('/'));
- if (FileActions.actions[mimePart]) {
- actions = $.extend(actions, FileActions.actions[mimePart]);
+ if (!this.actions[mime][name]) {
+ this.actions[mime][name] = {};
}
- if (FileActions.actions[mime]) {
- actions = $.extend(actions, FileActions.actions[mime]);
+ if (!displayName) {
+ displayName = t('files', name);
}
- }
- var filteredActions = {};
- $.each(actions, function (name, action) {
- if (action.permissions & permissions) {
- filteredActions[name] = action;
+ this.actions[mime][name]['action'] = action;
+ this.actions[mime][name]['permissions'] = permissions;
+ this.actions[mime][name]['displayName'] = displayName;
+ this.icons[name] = icon;
+ },
+ clear: function() {
+ this.actions = {};
+ this.defaults = {};
+ this.icons = {};
+ this.currentFile = null;
+ },
+ setDefault: function (mime, name) {
+ this.defaults[mime] = name;
+ },
+ get: function (mime, type, permissions) {
+ var actions = this.getActions(mime, type, permissions);
+ var filteredActions = {};
+ $.each(actions, function (name, action) {
+ filteredActions[name] = action.action;
+ });
+ return filteredActions;
+ },
+ getActions: function (mime, type, permissions) {
+ var actions = {};
+ if (this.actions.all) {
+ actions = $.extend(actions, this.actions.all);
}
- });
- return filteredActions;
- },
- getDefault: function (mime, type, permissions) {
- var mimePart;
- if (mime) {
- mimePart = mime.substr(0, mime.indexOf('/'));
- }
- var name = false;
- if (mime && FileActions.defaults[mime]) {
- name = FileActions.defaults[mime];
- } else if (mime && FileActions.defaults[mimePart]) {
- name = FileActions.defaults[mimePart];
- } else if (type && FileActions.defaults[type]) {
- name = FileActions.defaults[type];
- } else {
- name = FileActions.defaults.all;
- }
- var actions = this.get(mime, type, permissions);
- return actions[name];
- },
- /**
- * Display file actions for the given element
- * @param parent "td" element of the file for which to display actions
- * @param triggerEvent if true, triggers the fileActionsReady on the file
- * list afterwards (false by default)
- */
- display: function (parent, triggerEvent) {
- FileActions.currentFile = parent;
- var actions = FileActions.getActions(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions());
- var file = FileActions.getCurrentFile();
- var nameLinks;
- if (FileList.findFileEl(file).data('renaming')) {
- return;
- }
+ if (type) {//type is 'dir' or 'file'
+ if (this.actions[type]) {
+ actions = $.extend(actions, this.actions[type]);
+ }
+ }
+ if (mime) {
+ var mimePart = mime.substr(0, mime.indexOf('/'));
+ if (this.actions[mimePart]) {
+ actions = $.extend(actions, this.actions[mimePart]);
+ }
+ if (this.actions[mime]) {
+ actions = $.extend(actions, this.actions[mime]);
+ }
+ }
+ var filteredActions = {};
+ $.each(actions, function (name, action) {
+ if (action.permissions & permissions) {
+ filteredActions[name] = action;
+ }
+ });
+ return filteredActions;
+ },
+ getDefault: function (mime, type, permissions) {
+ var mimePart;
+ if (mime) {
+ mimePart = mime.substr(0, mime.indexOf('/'));
+ }
+ var name = false;
+ if (mime && this.defaults[mime]) {
+ name = this.defaults[mime];
+ } else if (mime && this.defaults[mimePart]) {
+ name = this.defaults[mimePart];
+ } else if (type && this.defaults[type]) {
+ name = this.defaults[type];
+ } else {
+ name = this.defaults.all;
+ }
+ var actions = this.get(mime, type, permissions);
+ return actions[name];
+ },
+ /**
+ * Display file actions for the given element
+ * @param parent "td" element of the file for which to display actions
+ * @param triggerEvent if true, triggers the fileActionsReady on the file
+ * list afterwards (false by default)
+ */
+ display: function (parent, triggerEvent) {
+ this.currentFile = parent;
+ var self = this;
+ var actions = this.getActions(this.getCurrentMimeType(), this.getCurrentType(), this.getCurrentPermissions());
+ var file = this.getCurrentFile();
+ var nameLinks;
+ if (parent.closest('tr').data('renaming')) {
+ return;
+ }
+
+ // recreate fileactions
+ nameLinks = parent.children('a.name');
+ nameLinks.find('.fileactions, .nametext .action').remove();
+ nameLinks.append('<span class="fileactions" />');
+ var defaultAction = this.getDefault(this.getCurrentMimeType(), this.getCurrentType(), this.getCurrentPermissions());
- // recreate fileactions
- nameLinks = parent.children('a.name');
- nameLinks.find('.fileactions, .nametext .action').remove();
- nameLinks.append('<span class="fileactions" />');
- var defaultAction = FileActions.getDefault(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions());
+ var actionHandler = function (event) {
+ event.stopPropagation();
+ event.preventDefault();
- var actionHandler = function (event) {
- event.stopPropagation();
- event.preventDefault();
+ self.currentFile = event.data.elem;
+ var file = self.getCurrentFile();
- FileActions.currentFile = event.data.elem;
- var file = FileActions.getCurrentFile();
+ event.data.actionFunc(file);
+ };
- event.data.actionFunc(file);
- };
+ var addAction = function (name, action, displayName) {
- var addAction = function (name, action, displayName) {
+ if ((name === 'Download' || action !== defaultAction) && name !== 'Delete') {
- if ((name === 'Download' || action !== defaultAction) && name !== 'Delete') {
+ var img = self.icons[name],
+ actionText = displayName,
+ actionContainer = 'a.name>span.fileactions';
- var img = FileActions.icons[name],
- actionText = displayName,
- actionContainer = 'a.name>span.fileactions';
+ if (name === 'Rename') {
+ // rename has only an icon which appears behind
+ // the file name
+ actionText = '';
+ actionContainer = 'a.name span.nametext';
+ }
+ if (img.call) {
+ img = img(file);
+ }
+ var html = '<a href="#" class="action action-' + name.toLowerCase() + '" data-action="' + name + '">';
+ if (img) {
+ html += '<img class ="svg" src="' + img + '" />';
+ }
+ html += '<span> ' + actionText + '</span></a>';
- if (name === 'Rename') {
- // rename has only an icon which appears behind
- // the file name
- actionText = '';
- actionContainer = 'a.name span.nametext';
+ var element = $(html);
+ element.data('action', name);
+ element.on('click', {a: null, elem: parent, actionFunc: actions[name].action}, actionHandler);
+ parent.find(actionContainer).append(element);
}
+
+ };
+
+ $.each(actions, function (name, action) {
+ if (name !== 'Share') {
+ displayName = action.displayName;
+ ah = action.action;
+
+ addAction(name, ah, displayName);
+ }
+ });
+ if(actions.Share){
+ displayName = t('files', 'Share');
+ addAction('Share', actions.Share, displayName);
+ }
+
+ // remove the existing delete action
+ parent.parent().children().last().find('.action.delete').remove();
+ if (actions['Delete']) {
+ var img = self.icons['Delete'];
+ var html;
if (img.call) {
img = img(file);
}
- var html = '<a href="#" class="action action-' + name.toLowerCase() + '" data-action="' + name + '">';
- if (img) {
- html += '<img class ="svg" src="' + img + '" />';
+ if (typeof trashBinApp !== 'undefined' && trashBinApp) {
+ html = '<a href="#" original-title="' + t('files', 'Delete permanently') + '" class="action delete delete-icon" />';
+ } else {
+ html = '<a href="#" class="action delete delete-icon" />';
}
- html += '<span> ' + actionText + '</span></a>';
-
var element = $(html);
- element.data('action', name);
- element.on('click', {a: null, elem: parent, actionFunc: actions[name].action}, actionHandler);
- parent.find(actionContainer).append(element);
+ element.data('action', actions['Delete']);
+ element.on('click', {a: null, elem: parent, actionFunc: actions['Delete'].action}, actionHandler);
+ parent.parent().children().last().append(element);
}
- };
+ if (triggerEvent){
+ $('#fileList').trigger(jQuery.Event("fileActionsReady"));
+ }
+ },
+ getCurrentFile: function () {
+ return this.currentFile.parent().attr('data-file');
+ },
+ getCurrentMimeType: function () {
+ return this.currentFile.parent().attr('data-mime');
+ },
+ getCurrentType: function () {
+ return this.currentFile.parent().attr('data-type');
+ },
+ getCurrentPermissions: function () {
+ return this.currentFile.parent().data('permissions');
+ },
- $.each(actions, function (name, action) {
- if (name !== 'Share') {
- displayName = action.displayName;
- ah = action.action;
+ /**
+ * Register the actions that are used by default for the files app.
+ */
+ registerDefaultActions: function(fileList) {
+ this.register('all', 'Delete', OC.PERMISSION_DELETE, function () {
+ return OC.imagePath('core', 'actions/delete');
+ }, function (filename) {
+ fileList.do_delete(filename);
+ $('.tipsy').remove();
+ });
- addAction(name, ah, displayName);
- }
- });
- if(actions.Share){
- displayName = t('files', 'Share');
- addAction('Share', actions.Share, displayName);
- }
+ // t('files', 'Rename')
+ this.register('all', 'Rename', OC.PERMISSION_UPDATE, function () {
+ return OC.imagePath('core', 'actions/rename');
+ }, function (filename) {
+ fileList.rename(filename);
+ });
- // remove the existing delete action
- parent.parent().children().last().find('.action.delete').remove();
- if (actions['Delete']) {
- var img = FileActions.icons['Delete'];
- var html;
- if (img.call) {
- img = img(file);
- }
- if (typeof trashBinApp !== 'undefined' && trashBinApp) {
- html = '<a href="#" original-title="' + t('files', 'Delete permanently') + '" class="action delete delete-icon" />';
+ this.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename) {
+ var dir = fileList.getCurrentDirectory();
+ if (dir !== '/') {
+ dir = dir + '/';
+ }
+ fileList.changeDirectory(dir + filename);
+ });
+
+ this.setDefault('dir', 'Open');
+ var downloadScope;
+ if ($('#allowZipDownload').val() == 1) {
+ downloadScope = 'all';
} else {
- html = '<a href="#" class="action delete delete-icon" />';
+ downloadScope = 'file';
}
- var element = $(html);
- element.data('action', actions['Delete']);
- element.on('click', {a: null, elem: parent, actionFunc: actions['Delete'].action}, actionHandler);
- parent.parent().children().last().append(element);
- }
- if (triggerEvent){
- $('#fileList').trigger(jQuery.Event("fileActionsReady"));
+ this.register(downloadScope, 'Download', OC.PERMISSION_READ, function () {
+ return OC.imagePath('core', 'actions/download');
+ }, function (filename) {
+ var url = OCA.Files.Files.getDownloadUrl(filename, fileList.getCurrentDirectory());
+ if (url) {
+ OC.redirect(url);
+ }
+ });
+
+ fileList.$fileList.trigger(jQuery.Event("fileActionsReady"));
}
- },
- getCurrentFile: function () {
- return FileActions.currentFile.parent().attr('data-file');
- },
- getCurrentMimeType: function () {
- return FileActions.currentFile.parent().attr('data-mime');
- },
- getCurrentType: function () {
- return FileActions.currentFile.parent().attr('data-type');
- },
- getCurrentPermissions: function () {
- return FileActions.currentFile.parent().data('permissions');
- }
-};
-
-$(document).ready(function () {
- var downloadScope;
- if ($('#allowZipDownload').val() == 1) {
- downloadScope = 'all';
- } else {
- downloadScope = 'file';
- }
-
- if (typeof disableDownloadActions == 'undefined' || !disableDownloadActions) {
- FileActions.register(downloadScope, 'Download', OC.PERMISSION_READ, function () {
- return OC.imagePath('core', 'actions/download');
- }, function (filename) {
- var url = Files.getDownloadUrl(filename);
- if (url) {
- OC.redirect(url);
- }
- });
- }
- $('#fileList tr').each(function () {
- FileActions.display($(this).children('td.filename'));
- });
-
- $('#fileList').trigger(jQuery.Event("fileActionsReady"));
-
-});
-
-FileActions.register('all', 'Delete', OC.PERMISSION_DELETE, function () {
- return OC.imagePath('core', 'actions/delete');
-}, function (filename) {
- FileList.do_delete(filename);
- $('.tipsy').remove();
-});
-
-// t('files', 'Rename')
-FileActions.register('all', 'Rename', OC.PERMISSION_UPDATE, function () {
- return OC.imagePath('core', 'actions/rename');
-}, function (filename) {
- FileList.rename(filename);
-});
-
-FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename) {
- var dir = $('#dir').val() || '/';
- if (dir !== '/') {
- dir = dir + '/';
- }
- FileList.changeDirectory(dir + filename);
-});
-
-FileActions.setDefault('dir', 'Open');
+ };
+
+ OCA.Files.FileActions = FileActions;
+})();
+
+// for backward compatibility
+window.FileActions = OCA.Files.FileActions;
+