Trigger events before and after a file action is executed
In the same way that other elements can know when a FileAction is registered or a default action is set this commit makes possible to be notified before and after a FileAction is executed. This is achieved by wrapping the registered action handler in a custom function that notifies the listeners before and after executing the handler itself. Due to this approach only FileActions registered through "registerAction" trigger the events, although that is not a problem as this is how the actions should be added to the FileActions anyway. Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit is contained in:
parent
b01d20c0d7
commit
7760f16521
|
@ -142,7 +142,22 @@
|
||||||
var mime = action.mime;
|
var mime = action.mime;
|
||||||
var name = action.name;
|
var name = action.name;
|
||||||
var actionSpec = {
|
var actionSpec = {
|
||||||
action: action.actionHandler,
|
action: function(fileName, context) {
|
||||||
|
// Actions registered in one FileAction may be executed on a
|
||||||
|
// different one (for example, due to the "merge" function),
|
||||||
|
// so the listeners have to be updated on the FileActions
|
||||||
|
// from the context instead of on the one in which it was
|
||||||
|
// originally registered.
|
||||||
|
if (context && context.fileActions) {
|
||||||
|
context.fileActions._notifyUpdateListeners('beforeTriggerAction', {action: actionSpec, fileName: fileName, context: context});
|
||||||
|
}
|
||||||
|
|
||||||
|
action.actionHandler(fileName, context);
|
||||||
|
|
||||||
|
if (context && context.fileActions) {
|
||||||
|
context.fileActions._notifyUpdateListeners('afterTriggerAction', {action: actionSpec, fileName: fileName, context: context});
|
||||||
|
}
|
||||||
|
},
|
||||||
name: name,
|
name: name,
|
||||||
displayName: action.displayName,
|
displayName: action.displayName,
|
||||||
mime: mime,
|
mime: mime,
|
||||||
|
|
|
@ -112,9 +112,22 @@ describe('OCA.Files.App tests', function() {
|
||||||
App.initialize();
|
App.initialize();
|
||||||
|
|
||||||
var actions = App.fileList.fileActions.actions;
|
var actions = App.fileList.fileActions.actions;
|
||||||
expect(actions.all.OverwriteThis.action).toBe(actionStub);
|
var context = { fileActions: sinon.createStubInstance(OCA.Files.FileActions) };
|
||||||
expect(actions.all.LegacyTest.action).toBe(legacyActionStub);
|
actions.all.OverwriteThis.action('testFileName', context);
|
||||||
expect(actions.all.RegularTest.action).toBe(actionStub);
|
expect(actionStub.calledOnce).toBe(true);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.callCount).toBe(2);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.getCall(0).calledWith('beforeTriggerAction')).toBe(true);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.getCall(1).calledWith('afterTriggerAction')).toBe(true);
|
||||||
|
actions.all.LegacyTest.action('testFileName', context);
|
||||||
|
expect(legacyActionStub.calledOnce).toBe(true);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.callCount).toBe(4);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.getCall(2).calledWith('beforeTriggerAction')).toBe(true);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.getCall(3).calledWith('afterTriggerAction')).toBe(true);
|
||||||
|
actions.all.RegularTest.action('testFileName', context);
|
||||||
|
expect(actionStub.calledTwice).toBe(true);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.callCount).toBe(6);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.getCall(4).calledWith('beforeTriggerAction')).toBe(true);
|
||||||
|
expect(context.fileActions._notifyUpdateListeners.getCall(5).calledWith('afterTriggerAction')).toBe(true);
|
||||||
// default one still there
|
// default one still there
|
||||||
expect(actions.dir.Open.action).toBeDefined();
|
expect(actions.dir.Open.action).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
|
@ -299,6 +299,7 @@ describe('OCA.Files.FileActions tests', function() {
|
||||||
clock.restore();
|
clock.restore();
|
||||||
});
|
});
|
||||||
it('passes context to action handler', function() {
|
it('passes context to action handler', function() {
|
||||||
|
var notifyUpdateListenersSpy = sinon.spy(fileList.fileActions, '_notifyUpdateListeners');
|
||||||
$tr.find('.action-test').click();
|
$tr.find('.action-test').click();
|
||||||
expect(actionStub.calledOnce).toEqual(true);
|
expect(actionStub.calledOnce).toEqual(true);
|
||||||
expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
|
expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
|
||||||
|
@ -309,6 +310,22 @@ describe('OCA.Files.FileActions tests', function() {
|
||||||
expect(context.dir).toEqual('/subdir');
|
expect(context.dir).toEqual('/subdir');
|
||||||
expect(context.fileInfoModel.get('name')).toEqual('testName.txt');
|
expect(context.fileInfoModel.get('name')).toEqual('testName.txt');
|
||||||
|
|
||||||
|
expect(notifyUpdateListenersSpy.calledTwice).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.calledBefore(actionStub)).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.calledAfter(actionStub)).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(0).args[0]).toEqual('beforeTriggerAction');
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(0).args[1]).toEqual({
|
||||||
|
action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
|
||||||
|
fileName: 'testName.txt',
|
||||||
|
context: context
|
||||||
|
});
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(1).args[0]).toEqual('afterTriggerAction');
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(1).args[1]).toEqual({
|
||||||
|
action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
|
||||||
|
fileName: 'testName.txt',
|
||||||
|
context: context
|
||||||
|
});
|
||||||
|
|
||||||
// when data-path is defined
|
// when data-path is defined
|
||||||
actionStub.reset();
|
actionStub.reset();
|
||||||
$tr.attr('data-path', '/somepath');
|
$tr.attr('data-path', '/somepath');
|
||||||
|
@ -317,6 +334,7 @@ describe('OCA.Files.FileActions tests', function() {
|
||||||
expect(context.dir).toEqual('/somepath');
|
expect(context.dir).toEqual('/somepath');
|
||||||
});
|
});
|
||||||
it('also triggers action handler when calling triggerAction()', function() {
|
it('also triggers action handler when calling triggerAction()', function() {
|
||||||
|
var notifyUpdateListenersSpy = sinon.spy(fileList.fileActions, '_notifyUpdateListeners');
|
||||||
var model = new OCA.Files.FileInfoModel({
|
var model = new OCA.Files.FileInfoModel({
|
||||||
id: 1,
|
id: 1,
|
||||||
name: 'Test.txt',
|
name: 'Test.txt',
|
||||||
|
@ -331,7 +349,62 @@ describe('OCA.Files.FileActions tests', function() {
|
||||||
expect(actionStub.getCall(0).args[1].fileList).toEqual(fileList);
|
expect(actionStub.getCall(0).args[1].fileList).toEqual(fileList);
|
||||||
expect(actionStub.getCall(0).args[1].fileActions).toEqual(fileActions);
|
expect(actionStub.getCall(0).args[1].fileActions).toEqual(fileActions);
|
||||||
expect(actionStub.getCall(0).args[1].fileInfoModel).toEqual(model);
|
expect(actionStub.getCall(0).args[1].fileInfoModel).toEqual(model);
|
||||||
|
|
||||||
|
expect(notifyUpdateListenersSpy.calledTwice).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.calledBefore(actionStub)).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.calledAfter(actionStub)).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(0).args[0]).toEqual('beforeTriggerAction');
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(0).args[1]).toEqual({
|
||||||
|
action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
|
||||||
|
fileName: 'Test.txt',
|
||||||
|
context: {
|
||||||
|
fileActions: fileActions,
|
||||||
|
fileInfoModel: model,
|
||||||
|
dir: '/subdir',
|
||||||
|
fileList: fileList,
|
||||||
|
$file: fileList.findFileEl('Test.txt')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(1).args[0]).toEqual('afterTriggerAction');
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(1).args[1]).toEqual({
|
||||||
|
action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
|
||||||
|
fileName: 'Test.txt',
|
||||||
|
context: {
|
||||||
|
fileActions: fileActions,
|
||||||
|
fileInfoModel: model,
|
||||||
|
dir: '/subdir',
|
||||||
|
fileList: fileList,
|
||||||
|
$file: fileList.findFileEl('Test.txt')
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
it('triggers listener events when invoked directly', function() {
|
||||||
|
var context = {fileActions: new OCA.Files.FileActions()}
|
||||||
|
var notifyUpdateListenersSpy = sinon.spy(context.fileActions, '_notifyUpdateListeners');
|
||||||
|
var testAction = fileActions.get('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'];
|
||||||
|
|
||||||
|
testAction('Test.txt', context);
|
||||||
|
|
||||||
|
expect(actionStub.calledOnce).toEqual(true);
|
||||||
|
expect(actionStub.getCall(0).args[0]).toEqual('Test.txt');
|
||||||
|
expect(actionStub.getCall(0).args[1]).toBe(context);
|
||||||
|
|
||||||
|
expect(notifyUpdateListenersSpy.calledTwice).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.calledBefore(actionStub)).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.calledAfter(actionStub)).toEqual(true);
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(0).args[0]).toEqual('beforeTriggerAction');
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(0).args[1]).toEqual({
|
||||||
|
action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
|
||||||
|
fileName: 'Test.txt',
|
||||||
|
context: context
|
||||||
|
});
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(1).args[0]).toEqual('afterTriggerAction');
|
||||||
|
expect(notifyUpdateListenersSpy.getCall(1).args[1]).toEqual({
|
||||||
|
action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
|
||||||
|
fileName: 'Test.txt',
|
||||||
|
context: context
|
||||||
|
});
|
||||||
|
}),
|
||||||
describe('actions menu', function() {
|
describe('actions menu', function() {
|
||||||
it('shows actions menu inside row when clicking the menu trigger', function() {
|
it('shows actions menu inside row when clicking the menu trigger', function() {
|
||||||
expect($tr.find('td.filename .fileActionsMenu').length).toEqual(0);
|
expect($tr.find('td.filename .fileActionsMenu').length).toEqual(0);
|
||||||
|
|
Loading…
Reference in New Issue