mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2026-09-09 18:02:54 +00:00
merge utils back to extension service
This commit is contained in:
@@ -34,7 +34,6 @@ import { Store } from '@ngrx/store';
|
|||||||
import { NavigationExtension } from './navigation.extension';
|
import { NavigationExtension } from './navigation.extension';
|
||||||
import { Route } from '@angular/router';
|
import { Route } from '@angular/router';
|
||||||
import { Node, MinimalNodeEntity } from 'alfresco-js-api';
|
import { Node, MinimalNodeEntity } from 'alfresco-js-api';
|
||||||
import { reduceSeparators, sortByOrder, filterEnabled, copyAction, reduceEmptyMenus } from './utils';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ExtensionService {
|
export class ExtensionService {
|
||||||
@@ -71,7 +70,7 @@ export class ExtensionService {
|
|||||||
'extensions.core.features.content.actions',
|
'extensions.core.features.content.actions',
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
.sort(sortByOrder);
|
.sort(this.sortByOrder);
|
||||||
|
|
||||||
this.openWithActions = this.config
|
this.openWithActions = this.config
|
||||||
.get<Array<OpenWithExtension>>(
|
.get<Array<OpenWithExtension>>(
|
||||||
@@ -79,14 +78,14 @@ export class ExtensionService {
|
|||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
.filter(entry => !entry.disabled)
|
.filter(entry => !entry.disabled)
|
||||||
.sort(sortByOrder);
|
.sort(this.sortByOrder);
|
||||||
|
|
||||||
this.createActions = this.config
|
this.createActions = this.config
|
||||||
.get<Array<ContentActionExtension>>(
|
.get<Array<ContentActionExtension>>(
|
||||||
'extensions.core.features.create',
|
'extensions.core.features.create',
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
.sort(sortByOrder);
|
.sort(this.sortByOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
getRouteById(id: string): RouteExtension {
|
getRouteById(id: string): RouteExtension {
|
||||||
@@ -179,7 +178,7 @@ export class ExtensionService {
|
|||||||
|
|
||||||
// evaluates create actions for the folder node
|
// evaluates create actions for the folder node
|
||||||
getFolderCreateActions(folder: Node): Array<ContentActionExtension> {
|
getFolderCreateActions(folder: Node): Array<ContentActionExtension> {
|
||||||
return this.createActions.filter(filterEnabled).map(action => {
|
return this.createActions.filter(this.filterEnabled).map(action => {
|
||||||
if (
|
if (
|
||||||
action.target &&
|
action.target &&
|
||||||
action.target.permissions &&
|
action.target.permissions &&
|
||||||
@@ -206,89 +205,24 @@ export class ExtensionService {
|
|||||||
parentNode: Node
|
parentNode: Node
|
||||||
): Array<ContentActionExtension> {
|
): Array<ContentActionExtension> {
|
||||||
return this.contentActions
|
return this.contentActions
|
||||||
.filter(filterEnabled)
|
.filter(this.filterEnabled)
|
||||||
.filter(action => this.filterByTarget(nodes, action))
|
.filter(action => this.filterByTarget(nodes, action))
|
||||||
.filter(action => this.filterByPermission(nodes, action, parentNode))
|
.filter(action => this.filterByPermission(nodes, action, parentNode))
|
||||||
.reduce(reduceSeparators, [])
|
.reduce(this.reduceSeparators, [])
|
||||||
.map(action => {
|
.map(action => {
|
||||||
if (action.type === ContentActionType.menu) {
|
if (action.type === ContentActionType.menu) {
|
||||||
const copy = copyAction(action);
|
const copy = this.copyAction(action);
|
||||||
if (copy.children && copy.children.length > 0) {
|
if (copy.children && copy.children.length > 0) {
|
||||||
copy.children = copy.children
|
copy.children = copy.children
|
||||||
.filter(childAction => this.filterByTarget(nodes, childAction))
|
.filter(childAction => this.filterByTarget(nodes, childAction))
|
||||||
.filter(childAction => this.filterByPermission(nodes, childAction, parentNode))
|
.filter(childAction => this.filterByPermission(nodes, childAction, parentNode))
|
||||||
.reduce(reduceSeparators, []);
|
.reduce(this.reduceSeparators, []);
|
||||||
}
|
}
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
return action;
|
return action;
|
||||||
})
|
})
|
||||||
.reduce(reduceEmptyMenus, []);
|
.reduce(this.reduceEmptyMenus, []);
|
||||||
}
|
|
||||||
|
|
||||||
private filterByTarget(
|
|
||||||
nodes: MinimalNodeEntity[],
|
|
||||||
action: ContentActionExtension
|
|
||||||
): boolean {
|
|
||||||
|
|
||||||
if (!action) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!action.target) {
|
|
||||||
return action.type === ContentActionType.separator
|
|
||||||
|| action.type === ContentActionType.menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
const types = action.target.types;
|
|
||||||
|
|
||||||
if (!types || types.length === 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nodes && nodes.length > 0) {
|
|
||||||
|
|
||||||
if (nodes.length === 1) {
|
|
||||||
if (types.includes('folder')) {
|
|
||||||
return nodes.every(node => node.entry.isFolder);
|
|
||||||
}
|
|
||||||
if (types.includes('file')) {
|
|
||||||
return nodes.every(node => node.entry.isFile);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
if (types.length === 1) {
|
|
||||||
if (types.includes('folder')) {
|
|
||||||
if (action.target.multiple) {
|
|
||||||
return nodes.every(node => node.entry.isFolder);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (types.includes('file')) {
|
|
||||||
if (action.target.multiple) {
|
|
||||||
return nodes.every(node => node.entry.isFile);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return types.some(type => {
|
|
||||||
if (type === 'folder') {
|
|
||||||
return action.target.multiple
|
|
||||||
? nodes.some(node => node.entry.isFolder)
|
|
||||||
: nodes.every(node => node.entry.isFolder);
|
|
||||||
}
|
|
||||||
if (type === 'file') {
|
|
||||||
return action.target.multiple
|
|
||||||
? nodes.some(node => node.entry.isFile)
|
|
||||||
: nodes.every(node => node.entry.isFile);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: support multiple selected nodes
|
// todo: support multiple selected nodes
|
||||||
@@ -349,4 +283,128 @@ export class ExtensionService {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private reduceSeparators(
|
||||||
|
acc: ContentActionExtension[],
|
||||||
|
el: ContentActionExtension,
|
||||||
|
i: number,
|
||||||
|
arr: ContentActionExtension[]
|
||||||
|
): ContentActionExtension[] {
|
||||||
|
// remove duplicate separators
|
||||||
|
if (i > 0) {
|
||||||
|
const prev = arr[i - 1];
|
||||||
|
if (
|
||||||
|
prev.type === ContentActionType.separator &&
|
||||||
|
el.type === ContentActionType.separator
|
||||||
|
) {
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// remove trailing separator
|
||||||
|
if (i === arr.length - 1) {
|
||||||
|
if (el.type === ContentActionType.separator) {
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return acc.concat(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
private reduceEmptyMenus(
|
||||||
|
acc: ContentActionExtension[],
|
||||||
|
el: ContentActionExtension
|
||||||
|
): ContentActionExtension[] {
|
||||||
|
if (el.type === ContentActionType.menu) {
|
||||||
|
if ((el.children || []).length === 0) {
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return acc.concat(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
private sortByOrder(
|
||||||
|
a: { order?: number | undefined },
|
||||||
|
b: { order?: number | undefined }
|
||||||
|
) {
|
||||||
|
const left = a.order === undefined ? Number.MAX_SAFE_INTEGER : a.order;
|
||||||
|
const right = b.order === undefined ? Number.MAX_SAFE_INTEGER : b.order;
|
||||||
|
return left - right;
|
||||||
|
}
|
||||||
|
|
||||||
|
private filterEnabled(entry: { disabled?: boolean }): boolean {
|
||||||
|
return !entry.disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
private copyAction(
|
||||||
|
action: ContentActionExtension
|
||||||
|
): ContentActionExtension {
|
||||||
|
return {
|
||||||
|
...action,
|
||||||
|
children: (action.children || []).map(child => this.copyAction(child))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private filterByTarget(
|
||||||
|
nodes: MinimalNodeEntity[],
|
||||||
|
action: ContentActionExtension
|
||||||
|
): boolean {
|
||||||
|
if (!action) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!action.target) {
|
||||||
|
return (
|
||||||
|
action.type === ContentActionType.separator ||
|
||||||
|
action.type === ContentActionType.menu
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const types = action.target.types;
|
||||||
|
|
||||||
|
if (!types || types.length === 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodes && nodes.length > 0) {
|
||||||
|
if (nodes.length === 1) {
|
||||||
|
if (types.includes('folder')) {
|
||||||
|
return nodes.every(node => node.entry.isFolder);
|
||||||
|
}
|
||||||
|
if (types.includes('file')) {
|
||||||
|
return nodes.every(node => node.entry.isFile);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (types.length === 1) {
|
||||||
|
if (types.includes('folder')) {
|
||||||
|
if (action.target.multiple) {
|
||||||
|
return nodes.every(node => node.entry.isFolder);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (types.includes('file')) {
|
||||||
|
if (action.target.multiple) {
|
||||||
|
return nodes.every(node => node.entry.isFile);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return types.some(type => {
|
||||||
|
if (type === 'folder') {
|
||||||
|
return action.target.multiple
|
||||||
|
? nodes.some(node => node.entry.isFolder)
|
||||||
|
: nodes.every(node => node.entry.isFolder);
|
||||||
|
}
|
||||||
|
if (type === 'file') {
|
||||||
|
return action.target.multiple
|
||||||
|
? nodes.some(node => node.entry.isFile)
|
||||||
|
: nodes.every(node => node.entry.isFile);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
/*!
|
|
||||||
* @license
|
|
||||||
* Alfresco Example Content Application
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 - 2018 Alfresco Software Limited
|
|
||||||
*
|
|
||||||
* This file is part of the Alfresco Example Content Application.
|
|
||||||
* If the software was purchased under a paid Alfresco license, the terms of
|
|
||||||
* the paid license agreement will prevail. Otherwise, the software is
|
|
||||||
* provided under the following open source license terms:
|
|
||||||
*
|
|
||||||
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import {
|
|
||||||
ContentActionExtension,
|
|
||||||
ContentActionType
|
|
||||||
} from './content-action.extension';
|
|
||||||
|
|
||||||
export function reduceSeparators(
|
|
||||||
acc: ContentActionExtension[],
|
|
||||||
el: ContentActionExtension,
|
|
||||||
i: number,
|
|
||||||
arr: ContentActionExtension[]
|
|
||||||
): ContentActionExtension[] {
|
|
||||||
// remove duplicate separators
|
|
||||||
if (i > 0) {
|
|
||||||
const prev = arr[i - 1];
|
|
||||||
if (
|
|
||||||
prev.type === ContentActionType.separator &&
|
|
||||||
el.type === ContentActionType.separator
|
|
||||||
) {
|
|
||||||
return acc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// remove trailing separator
|
|
||||||
if (i === arr.length - 1) {
|
|
||||||
if (el.type === ContentActionType.separator) {
|
|
||||||
return acc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return acc.concat(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export function reduceEmptyMenus(
|
|
||||||
acc: ContentActionExtension[],
|
|
||||||
el: ContentActionExtension
|
|
||||||
): ContentActionExtension[] {
|
|
||||||
if (el.type === ContentActionType.menu) {
|
|
||||||
if ((el.children || []).length === 0) {
|
|
||||||
return acc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return acc.concat(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function sortByOrder(
|
|
||||||
a: { order?: number | undefined },
|
|
||||||
b: { order?: number | undefined }
|
|
||||||
) {
|
|
||||||
const left = a.order === undefined ? Number.MAX_SAFE_INTEGER : a.order;
|
|
||||||
const right = b.order === undefined ? Number.MAX_SAFE_INTEGER : b.order;
|
|
||||||
return left - right;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function filterEnabled(entry: { disabled?: boolean }): boolean {
|
|
||||||
return !entry.disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function copyAction(action: ContentActionExtension): ContentActionExtension {
|
|
||||||
return {
|
|
||||||
...action,
|
|
||||||
children: (action.children || []).map(copyAction)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user