diff options
author | Daniel Calviño Sánchez <danxuliu@gmail.com> | 2017-12-19 03:06:06 +0100 |
---|---|---|
committer | Daniel Calviño Sánchez <danxuliu@gmail.com> | 2017-12-19 18:33:34 +0100 |
commit | 7760f1652190474d1f62b590b6a57799c8ffd68d (patch) | |
tree | 8e473e460ab02514fe229abb968ad720ccb7fbcc /apps | |
parent | b01d20c0d7b76dc04fcbfa027c51b14d740dc67e (diff) | |
download | nextcloud-server-7760f1652190474d1f62b590b6a57799c8ffd68d.tar.gz nextcloud-server-7760f1652190474d1f62b590b6a57799c8ffd68d.zip |
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>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/files/js/fileactions.js | 17 | ||||
-rw-r--r-- | apps/files/tests/js/appSpec.js | 19 | ||||
-rw-r--r-- | apps/files/tests/js/fileactionsSpec.js | 73 |
3 files changed, 105 insertions, 4 deletions
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 6c031ab06d5..1b94ee15a61 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -142,7 +142,22 @@ var mime = action.mime; var name = action.name; 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, displayName: action.displayName, mime: mime, diff --git a/apps/files/tests/js/appSpec.js b/apps/files/tests/js/appSpec.js index b9c323e7c12..5728991e197 100644 --- a/apps/files/tests/js/appSpec.js +++ b/apps/files/tests/js/appSpec.js @@ -112,9 +112,22 @@ describe('OCA.Files.App tests', function() { App.initialize(); var actions = App.fileList.fileActions.actions; - expect(actions.all.OverwriteThis.action).toBe(actionStub); - expect(actions.all.LegacyTest.action).toBe(legacyActionStub); - expect(actions.all.RegularTest.action).toBe(actionStub); + var context = { fileActions: sinon.createStubInstance(OCA.Files.FileActions) }; + actions.all.OverwriteThis.action('testFileName', context); + 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 expect(actions.dir.Open.action).toBeDefined(); }); diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js index 75a18713696..2dc8bb50920 100644 --- a/apps/files/tests/js/fileactionsSpec.js +++ b/apps/files/tests/js/fileactionsSpec.js @@ -299,6 +299,7 @@ describe('OCA.Files.FileActions tests', function() { clock.restore(); }); it('passes context to action handler', function() { + var notifyUpdateListenersSpy = sinon.spy(fileList.fileActions, '_notifyUpdateListeners'); $tr.find('.action-test').click(); expect(actionStub.calledOnce).toEqual(true); 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.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 actionStub.reset(); $tr.attr('data-path', '/somepath'); @@ -317,6 +334,7 @@ describe('OCA.Files.FileActions tests', function() { expect(context.dir).toEqual('/somepath'); }); it('also triggers action handler when calling triggerAction()', function() { + var notifyUpdateListenersSpy = sinon.spy(fileList.fileActions, '_notifyUpdateListeners'); var model = new OCA.Files.FileInfoModel({ id: 1, 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].fileActions).toEqual(fileActions); 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() { it('shows actions menu inside row when clicking the menu trigger', function() { expect($tr.find('td.filename .fileActionsMenu').length).toEqual(0); |