2014-01-30 13:41:04 +04:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2014
|
|
|
|
*
|
|
|
|
* This file is licensed under the Affero General Public License version 3
|
|
|
|
* or later.
|
|
|
|
*
|
|
|
|
* See the COPYING-README file.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* global trashBinApp */
|
2014-05-09 00:06:30 +04:00
|
|
|
(function() {
|
|
|
|
|
|
|
|
var FileActions = {
|
|
|
|
actions: {},
|
|
|
|
defaults: {},
|
|
|
|
icons: {},
|
|
|
|
currentFile: null,
|
|
|
|
register: function (mime, name, permissions, icon, action, displayName) {
|
|
|
|
if (!this.actions[mime]) {
|
|
|
|
this.actions[mime] = {};
|
2011-06-04 22:16:44 +04:00
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
if (!this.actions[mime][name]) {
|
|
|
|
this.actions[mime][name] = {};
|
2011-06-04 22:16:44 +04:00
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
if (!displayName) {
|
|
|
|
displayName = t('files', name);
|
2011-06-04 22:16:44 +04:00
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
this.actions[mime][name]['action'] = action;
|
|
|
|
this.actions[mime][name]['permissions'] = permissions;
|
|
|
|
this.actions[mime][name]['displayName'] = displayName;
|
|
|
|
this.icons[name] = icon;
|
|
|
|
},
|
2014-05-19 17:20:44 +04:00
|
|
|
/**
|
|
|
|
* Clones the current file actions handler including the already
|
|
|
|
* registered actions.
|
|
|
|
*/
|
|
|
|
clone: function() {
|
|
|
|
var fileActions = _.extend({}, this);
|
|
|
|
// need to deep copy the actions as well
|
|
|
|
fileActions.actions = _.extend({}, this.actions);
|
|
|
|
fileActions.defaults = _.extend({}, this.defaults);
|
|
|
|
//fileActions.icons = _.extend({}, this.icons);
|
|
|
|
return fileActions;
|
|
|
|
},
|
2014-05-09 00:06:30 +04:00
|
|
|
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);
|
2012-07-26 00:33:08 +04:00
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
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)
|
2014-05-19 15:18:44 +04:00
|
|
|
* @param fileList OCA.Files.FileList instance on which the action is
|
|
|
|
* done, defaults to OCA.Files.App.fileList
|
2014-05-09 00:06:30 +04:00
|
|
|
*/
|
2014-05-19 15:18:44 +04:00
|
|
|
display: function (parent, triggerEvent, fileList) {
|
|
|
|
if (!fileList) {
|
|
|
|
console.warn('FileActions.display() MUST be called with a OCA.Files.FileList instance');
|
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
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());
|
2013-09-18 15:09:47 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
var actionHandler = function (event) {
|
|
|
|
event.stopPropagation();
|
|
|
|
event.preventDefault();
|
2013-01-14 23:30:39 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
self.currentFile = event.data.elem;
|
|
|
|
var file = self.getCurrentFile();
|
2012-11-14 19:05:24 +04:00
|
|
|
|
2014-05-19 15:18:44 +04:00
|
|
|
event.data.actionFunc(file, {
|
|
|
|
$file: $(this).closest('tr'),
|
|
|
|
fileList: fileList || OCA.Files.App.fileList,
|
|
|
|
fileActions: self
|
|
|
|
});
|
2014-05-09 00:06:30 +04:00
|
|
|
};
|
2013-01-14 23:30:39 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
var addAction = function (name, action, displayName) {
|
2013-01-14 23:30:39 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
if ((name === 'Download' || action !== defaultAction) && name !== 'Delete') {
|
2013-01-14 23:30:39 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
var img = self.icons[name],
|
|
|
|
actionText = displayName,
|
|
|
|
actionContainer = 'a.name>span.fileactions';
|
2014-03-17 23:15:10 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
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>';
|
2013-10-02 23:09:03 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
var element = $(html);
|
|
|
|
element.data('action', name);
|
|
|
|
element.on('click', {a: null, elem: parent, actionFunc: actions[name].action}, actionHandler);
|
|
|
|
parent.find(actionContainer).append(element);
|
2013-10-02 23:09:03 +04:00
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
$.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;
|
2012-10-28 14:51:54 +04:00
|
|
|
if (img.call) {
|
|
|
|
img = img(file);
|
2011-08-12 01:21:30 +04:00
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
if (typeof trashBinApp !== 'undefined' && trashBinApp) {
|
|
|
|
html = '<a href="#" original-title="' + t('files', 'Delete permanently') + '" class="action delete delete-icon" />';
|
|
|
|
} else {
|
2014-05-28 22:27:28 +04:00
|
|
|
html = '<a href="#" original-title="' + t('files', 'Delete') + '" class="action delete delete-icon" />';
|
2012-10-28 14:51:54 +04:00
|
|
|
}
|
|
|
|
var element = $(html);
|
2014-05-09 00:06:30 +04:00
|
|
|
element.data('action', actions['Delete']);
|
|
|
|
element.on('click', {a: null, elem: parent, actionFunc: actions['Delete'].action}, actionHandler);
|
|
|
|
parent.parent().children().last().append(element);
|
2011-07-28 01:23:46 +04:00
|
|
|
}
|
2013-01-14 23:30:39 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
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');
|
|
|
|
},
|
2013-02-11 19:09:04 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
/**
|
|
|
|
* Register the actions that are used by default for the files app.
|
|
|
|
*/
|
2014-05-19 17:20:44 +04:00
|
|
|
registerDefaultActions: function() {
|
2014-05-12 21:54:20 +04:00
|
|
|
// TODO: try to find a way to not make it depend on fileList,
|
|
|
|
// maybe get a handler or listener to trigger events on
|
2014-05-09 00:06:30 +04:00
|
|
|
this.register('all', 'Delete', OC.PERMISSION_DELETE, function () {
|
|
|
|
return OC.imagePath('core', 'actions/delete');
|
2014-05-19 17:20:44 +04:00
|
|
|
}, function (filename, context) {
|
|
|
|
context.fileList.do_delete(filename);
|
2014-05-09 00:06:30 +04:00
|
|
|
$('.tipsy').remove();
|
|
|
|
});
|
2014-03-17 23:15:10 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
// t('files', 'Rename')
|
|
|
|
this.register('all', 'Rename', OC.PERMISSION_UPDATE, function () {
|
|
|
|
return OC.imagePath('core', 'actions/rename');
|
2014-05-19 17:20:44 +04:00
|
|
|
}, function (filename, context) {
|
|
|
|
context.fileList.rename(filename);
|
2014-05-09 00:06:30 +04:00
|
|
|
});
|
2013-01-14 23:30:39 +04:00
|
|
|
|
2014-05-19 17:20:44 +04:00
|
|
|
this.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
|
|
|
|
var dir = context.fileList.getCurrentDirectory();
|
2014-05-09 00:06:30 +04:00
|
|
|
if (dir !== '/') {
|
|
|
|
dir = dir + '/';
|
|
|
|
}
|
2014-05-19 17:20:44 +04:00
|
|
|
context.fileList.changeDirectory(dir + filename);
|
2014-05-09 00:06:30 +04:00
|
|
|
});
|
|
|
|
|
|
|
|
this.setDefault('dir', 'Open');
|
|
|
|
var downloadScope;
|
|
|
|
if ($('#allowZipDownload').val() == 1) {
|
|
|
|
downloadScope = 'all';
|
2012-09-07 08:01:52 +04:00
|
|
|
} else {
|
2014-05-09 00:06:30 +04:00
|
|
|
downloadScope = 'file';
|
2012-09-07 08:01:52 +04:00
|
|
|
}
|
2013-10-17 13:59:13 +04:00
|
|
|
|
2014-05-09 00:06:30 +04:00
|
|
|
this.register(downloadScope, 'Download', OC.PERMISSION_READ, function () {
|
|
|
|
return OC.imagePath('core', 'actions/download');
|
2014-05-19 17:20:44 +04:00
|
|
|
}, function (filename, context) {
|
|
|
|
var url = context.fileList.getDownloadUrl(filename, context.fileList.getCurrentDirectory());
|
2014-05-09 00:06:30 +04:00
|
|
|
if (url) {
|
|
|
|
OC.redirect(url);
|
|
|
|
}
|
|
|
|
});
|
2013-10-17 13:59:13 +04:00
|
|
|
}
|
2014-05-09 00:06:30 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
OCA.Files.FileActions = FileActions;
|
|
|
|
})();
|
|
|
|
|
|
|
|
// for backward compatibility
|
|
|
|
window.FileActions = OCA.Files.FileActions;
|
|
|
|
|