From 85c0e42047417c30b10d967207da8b3c3098bdc9 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Mon, 9 Jul 2018 07:25:49 +0100 Subject: [PATCH] extensions: support multiselection for content actions --- src/app.config.json | 5 ++- .../extensions/content-action.extension.ts | 1 + src/app/extensions/extension.service.ts | 44 ++++++++++++++++--- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/app.config.json b/src/app.config.json index a63abcfcc..77853272d 100644 --- a/src/app.config.json +++ b/src/app.config.json @@ -212,9 +212,10 @@ "title": "APP.ACTIONS.DOWNLOAD", "icon": "get_app", "target": { - "types": ["folder", "file"], + "types": ["file", "folder"], "permissions": [], - "action": "aca:actions/download" + "action": "aca:actions/download", + "multiple": true } }, { diff --git a/src/app/extensions/content-action.extension.ts b/src/app/extensions/content-action.extension.ts index 2209dd4ac..5126b09f2 100644 --- a/src/app/extensions/content-action.extension.ts +++ b/src/app/extensions/content-action.extension.ts @@ -33,5 +33,6 @@ export interface ContentActionExtension { types: Array; permissions: Array, action: string; + multiple?: boolean; }; } diff --git a/src/app/extensions/extension.service.ts b/src/app/extensions/extension.service.ts index 3463a646a..7aa9afce2 100644 --- a/src/app/extensions/extension.service.ts +++ b/src/app/extensions/extension.service.ts @@ -237,12 +237,46 @@ export class ExtensionService { return true; } - if (selection && selection.folder && types.includes('folder')) { - return true; - } + if (selection && !selection.isEmpty) { - if (selection && selection.file && types.includes('file')) { - return true; + if (selection.nodes.length === 1) { + if (selection.folder && types.includes('folder')) { + return true; + } + if (selection.file && types.includes('file')) { + return true; + } + return false; + } else { + if (types.length === 1) { + if (types.includes('folder')) { + if (action.target.multiple) { + return selection.nodes.every(node => node.entry.isFolder); + } + return false; + } + if (types.includes('file')) { + if (action.target.multiple) { + return selection.nodes.every(node => node.entry.isFile); + } + return false; + } + } else { + return types.some(type => { + if (type === 'folder') { + return action.target.multiple + ? selection.nodes.some(node => node.entry.isFolder) + : selection.nodes.every(node => node.entry.isFolder); + } + if (type === 'file') { + return action.target.multiple + ? selection.nodes.some(node => node.entry.isFile) + : selection.nodes.every(node => node.entry.isFile); + } + return false; + }); + } + } } return false;