You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.5 KiB
145 lines
3.5 KiB
/* |
|
* Copyright (c) 2014 |
|
* |
|
* This file is licensed under the Affero General Public License version 3 |
|
* or later. |
|
* |
|
* See the COPYING-README file. |
|
* |
|
*/ |
|
|
|
(function() { |
|
|
|
/** |
|
* Construct a new FileActionsMenu instance |
|
* @constructs FileActionsMenu |
|
* @memberof OCA.Files |
|
*/ |
|
var FileActionsMenu = OC.Backbone.View.extend({ |
|
tagName: 'div', |
|
className: 'fileActionsMenu popovermenu bubble hidden open menu', |
|
|
|
/** |
|
* Current context |
|
* |
|
* @type OCA.Files.FileActionContext |
|
*/ |
|
_context: null, |
|
|
|
events: { |
|
'click a.action': '_onClickAction' |
|
}, |
|
|
|
template: function(data) { |
|
return OCA.Files.Templates['fileactionsmenu'](data); |
|
}, |
|
|
|
/** |
|
* Event handler whenever an action has been clicked within the menu |
|
* |
|
* @param {Object} event event object |
|
*/ |
|
_onClickAction: function(event) { |
|
var $target = $(event.target); |
|
if (!$target.is('a')) { |
|
$target = $target.closest('a'); |
|
} |
|
var fileActions = this._context.fileActions; |
|
var actionName = $target.attr('data-action'); |
|
var actions = fileActions.getActions( |
|
fileActions.getCurrentMimeType(), |
|
fileActions.getCurrentType(), |
|
fileActions.getCurrentPermissions() |
|
); |
|
var actionSpec = actions[actionName]; |
|
var fileName = this._context.$file.attr('data-file'); |
|
|
|
event.stopPropagation(); |
|
event.preventDefault(); |
|
|
|
OC.hideMenus(); |
|
|
|
actionSpec.action( |
|
fileName, |
|
this._context |
|
); |
|
}, |
|
|
|
/** |
|
* Renders the menu with the currently set items |
|
*/ |
|
render: function() { |
|
var self = this; |
|
var fileActions = this._context.fileActions; |
|
var actions = fileActions.getActions( |
|
fileActions.getCurrentMimeType(), |
|
fileActions.getCurrentType(), |
|
fileActions.getCurrentPermissions() |
|
); |
|
|
|
var defaultAction = fileActions.getDefaultFileAction( |
|
fileActions.getCurrentMimeType(), |
|
fileActions.getCurrentType(), |
|
fileActions.getCurrentPermissions() |
|
); |
|
|
|
var items = _.filter(actions, function(actionSpec) { |
|
return !defaultAction || actionSpec.name !== defaultAction.name; |
|
}); |
|
items = _.map(items, function(item) { |
|
if (_.isFunction(item.displayName)) { |
|
item = _.extend({}, item); |
|
item.displayName = item.displayName(self._context); |
|
} |
|
if (_.isFunction(item.iconClass)) { |
|
var fileName = self._context.$file.attr('data-file'); |
|
item = _.extend({}, item); |
|
item.iconClass = item.iconClass(fileName, self._context); |
|
} |
|
if (_.isFunction(item.icon)) { |
|
var fileName = self._context.$file.attr('data-file'); |
|
item = _.extend({}, item); |
|
item.icon = item.icon(fileName, self._context); |
|
} |
|
item.inline = item.type === OCA.Files.FileActions.TYPE_INLINE |
|
return item; |
|
}); |
|
items = items.sort(function(actionA, actionB) { |
|
var orderA = actionA.order || 0; |
|
var orderB = actionB.order || 0; |
|
if (orderB === orderA) { |
|
return OC.Util.naturalSortCompare(actionA.displayName, actionB.displayName); |
|
} |
|
return orderA - orderB; |
|
}); |
|
|
|
items = _.map(items, function(item) { |
|
item.nameLowerCase = item.name.toLowerCase(); |
|
return item; |
|
}); |
|
|
|
this.$el.html(this.template({ |
|
items: items |
|
})); |
|
}, |
|
|
|
/** |
|
* Displays the menu under the given element |
|
* |
|
* @param {OCA.Files.FileActionContext} context context |
|
* @param {Object} $trigger trigger element |
|
*/ |
|
show: function(context) { |
|
this._context = context; |
|
|
|
this.render(); |
|
this.$el.removeClass('hidden'); |
|
|
|
OC.showMenu(null, this.$el); |
|
} |
|
}); |
|
|
|
OCA.Files.FileActionsMenu = FileActionsMenu; |
|
|
|
})(); |
|
|
|
|