diff --git a/extension.schema.json b/extension.schema.json index 7eb2f11c8..e666aadb2 100644 --- a/extension.schema.json +++ b/extension.schema.json @@ -36,6 +36,12 @@ "value": { "description": "Rule parameter value", "type": "string" + }, + "parameters": { + "description": "Parameters", + "type": "array", + "items": { "$ref": "#/definitions/ruleParameter" }, + "minItems": 1 } } }, diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 30a1c2292..90a9c9a62 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -41,7 +41,8 @@ import { SetLanguagePickerAction, SetLogoPathAction, SetSharedUrlAction, - SnackbarErrorAction + SnackbarErrorAction, + SetCurrentUrlAction } from './store/actions'; import { AppStore } from './store/states/app.state'; @@ -89,6 +90,8 @@ export class AppComponent implements OnInit { const data: any = snapshot.data || {}; pageTitle.setTitle(data.title || ''); + + this.store.dispatch(new SetCurrentUrlAction(router.url)); }); this.router.config.unshift(...this.extensions.getApplicationRoutes()); diff --git a/src/app/extensions/core.extensions.module.ts b/src/app/extensions/core.extensions.module.ts index 58719ddee..1cfbf3371 100644 --- a/src/app/extensions/core.extensions.module.ts +++ b/src/app/extensions/core.extensions.module.ts @@ -23,21 +23,15 @@ * along with Alfresco. If not, see . */ -import { NgModule, ModuleWithProviders, APP_INITIALIZER } from '@angular/core'; import { AuthGuardEcm, CoreModule } from '@alfresco/adf-core'; -import { ExtensionService } from './extension.service'; -import { LayoutComponent } from '../components/layout/layout.component'; -import { ToolbarActionComponent } from './components/toolbar-action/toolbar-action.component'; import { CommonModule } from '@angular/common'; -import { every, some } from './evaluators/core.evaluators'; -import { - canCreateFolder, - hasFolderSelected, - canUpdateSelectedFolder, - hasFileSelected, - canDownloadSelection -} from './evaluators/app.evaluators'; +import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; +import { LayoutComponent } from '../components/layout/layout.component'; import { TrashcanComponent } from '../components/trashcan/trashcan.component'; +import { ToolbarActionComponent } from './components/toolbar-action/toolbar-action.component'; +import * as app from './evaluators/app.evaluators'; +import * as core from './evaluators/core.evaluators'; +import { ExtensionService } from './extension.service'; export function setupExtensions(extensions: ExtensionService): Function { return () => @@ -47,19 +41,25 @@ export function setupExtensions(extensions: ExtensionService): Function { .setComponent('app.components.trashcan', TrashcanComponent) .setAuthGuard('app.auth', AuthGuardEcm) - .setEvaluator('core.every', every) - .setEvaluator('core.some', some) - .setEvaluator('app.selection.canDownload', canDownloadSelection) - .setEvaluator('app.selection.file', hasFileSelected) - .setEvaluator('app.selection.folder', hasFolderSelected) + .setEvaluator('core.every', core.every) + .setEvaluator('core.some', core.some) + .setEvaluator('core.not', core.not) + .setEvaluator( + 'app.selection.canDownload', + app.canDownloadSelection + ) + .setEvaluator('app.selection.file', app.hasFileSelected) + .setEvaluator('app.selection.folder', app.hasFolderSelected) .setEvaluator( 'app.selection.folder.canUpdate', - canUpdateSelectedFolder + app.canUpdateSelectedFolder ) .setEvaluator( 'app.navigation.folder.canCreate', - canCreateFolder - ); + app.canCreateFolder + ) + .setEvaluator('app.navigation.isTrashcan', app.isTrashcan) + .setEvaluator('app.navigation.isNotTrashcan', app.isNotTrashcan); resolve(true); }); diff --git a/src/app/extensions/evaluators/app.evaluators.ts b/src/app/extensions/evaluators/app.evaluators.ts index 14681183c..131e1edf6 100644 --- a/src/app/extensions/evaluators/app.evaluators.ts +++ b/src/app/extensions/evaluators/app.evaluators.ts @@ -26,6 +26,15 @@ import { Node } from 'alfresco-js-api'; import { RuleContext, RuleParameter } from '../rule.extensions'; +export function isTrashcan(context: RuleContext, ...args: RuleParameter[]): boolean { + const { url } = context.navigation; + return url && url.startsWith('/trashcan'); +} + +export function isNotTrashcan(context: RuleContext, ...args: RuleParameter[]): boolean { + return !isTrashcan(context, ...args); +} + export function canCreateFolder(context: RuleContext, ...args: RuleParameter[]): boolean { const folder = context.navigation.currentFolder; if (folder) { @@ -37,7 +46,7 @@ export function canCreateFolder(context: RuleContext, ...args: RuleParameter[]): export function canDownloadSelection(context: RuleContext, ...args: RuleParameter[]): boolean { if (!context.selection.isEmpty) { return context.selection.nodes.every(node => { - return node.entry && (node.entry.isFile || node.entry.isFolder); + return node.entry && (node.entry.isFile || node.entry.isFolder || !!node.entry.nodeId); }); } return false; diff --git a/src/app/extensions/evaluators/core.evaluators.ts b/src/app/extensions/evaluators/core.evaluators.ts index 9125688f2..cd0f88d99 100644 --- a/src/app/extensions/evaluators/core.evaluators.ts +++ b/src/app/extensions/evaluators/core.evaluators.ts @@ -25,14 +25,34 @@ import { RuleContext, RuleParameter } from '../rule.extensions'; +export function not(context: RuleContext, ...args: RuleParameter[]): boolean { + if (!args || args.length === 0) { + return false; + } + + return args + .every(arg => { + const evaluator = context.evaluators[arg.value]; + if (!evaluator) { + console.warn('evaluator not found: ' + arg.value); + } + return !evaluator(context, ...arg.parameters); + }); +} + export function every(context: RuleContext, ...args: RuleParameter[]): boolean { if (!args || args.length === 0) { return false; } return args - .map(arg => context.evaluators[arg.value]) - .every(evaluator => evaluator(context)); + .every(arg => { + const evaluator = context.evaluators[arg.value]; + if (!evaluator) { + console.warn('evaluator not found: ' + arg.value); + } + return evaluator(context, ...arg.parameters); + }); } export function some(context: RuleContext, ...args: RuleParameter[]): boolean { @@ -41,6 +61,11 @@ export function some(context: RuleContext, ...args: RuleParameter[]): boolean { } return args - .map(arg => context.evaluators[arg.value]) - .some(evaluator => evaluator(context)); + .some(arg => { + const evaluator = context.evaluators[arg.value]; + if (!evaluator) { + console.warn('evaluator not found: ' + arg.value); + } + return evaluator(context, ...arg.parameters); + }); } diff --git a/src/app/extensions/rule.extensions.ts b/src/app/extensions/rule.extensions.ts index cc3fbe769..37ffd4d49 100644 --- a/src/app/extensions/rule.extensions.ts +++ b/src/app/extensions/rule.extensions.ts @@ -43,4 +43,5 @@ export class RuleRef { export interface RuleParameter { type: string; value: any; + parameters?: Array; } diff --git a/src/app/store/actions/app.actions.ts b/src/app/store/actions/app.actions.ts index 9c8c2dd5a..33662ba14 100644 --- a/src/app/store/actions/app.actions.ts +++ b/src/app/store/actions/app.actions.ts @@ -32,6 +32,7 @@ export const SET_LOGO_PATH = 'SET_LOGO_PATH'; export const SET_LANGUAGE_PICKER = 'SET_LANGUAGE_PICKER'; export const SET_SHARED_URL = 'SET_SHARED_URL'; export const SET_CURRENT_FOLDER = 'SET_CURRENT_FOLDER'; +export const SET_CURRENT_URL = 'SET_CURRENT_URL'; export class SetAppNameAction implements Action { readonly type = SET_APP_NAME; @@ -62,3 +63,8 @@ export class SetCurrentFolderAction implements Action { readonly type = SET_CURRENT_FOLDER; constructor(public payload: Node) {} } + +export class SetCurrentUrlAction implements Action { + readonly type = SET_CURRENT_URL; + constructor(public payload: string) {} +} diff --git a/src/app/store/effects/router.effects.ts b/src/app/store/effects/router.effects.ts index d90e4b2bf..0c63076b7 100644 --- a/src/app/store/effects/router.effects.ts +++ b/src/app/store/effects/router.effects.ts @@ -32,9 +32,12 @@ import { NavigateRouteAction, NavigateToParentFolder, NAVIGATE_PARENT_FOLDER, - NAVIGATE_ROUTE + NAVIGATE_ROUTE, + NavigateToFolder, + NAVIGATE_FOLDER, + NavigateUrlAction, + NAVIGATE_URL } from '../actions'; -import { NavigateToFolder, NAVIGATE_FOLDER, NavigateUrlAction, NAVIGATE_URL } from '../actions/router.actions'; @Injectable() export class RouterEffects { diff --git a/src/app/store/reducers/app.reducer.ts b/src/app/store/reducers/app.reducer.ts index 208bca31c..2d789c5a9 100644 --- a/src/app/store/reducers/app.reducer.ts +++ b/src/app/store/reducers/app.reducer.ts @@ -40,9 +40,10 @@ import { SetLanguagePickerAction, SET_SHARED_URL, SetSharedUrlAction, - SET_CURRENT_FOLDER + SET_CURRENT_FOLDER, + SetCurrentFolderAction, + SET_CURRENT_URL, SetCurrentUrlAction } from '../actions'; -import { SetCurrentFolderAction } from '../actions/app.actions'; export function appReducer( state: AppState = INITIAL_APP_STATE, @@ -81,6 +82,9 @@ export function appReducer( action )); break; + case SET_CURRENT_URL: + newState = updateCurrentUrl(state, action); + break; default: newState = Object.assign({}, state); } @@ -158,6 +162,12 @@ function updateCurrentFolder(state: AppState, action: SetCurrentFolderAction) { return newState; } +function updateCurrentUrl(state: AppState, action: SetCurrentUrlAction) { + const newState = Object.assign({}, state); + newState.navigation.url = action.payload; + return newState; +} + function updateSelectedNodes( state: AppState, action: SetSelectedNodesAction @@ -179,7 +189,9 @@ function updateSelectedNodes( if (nodes.length === 1) { file = nodes.find(entity => { // workaround Shared - return (entity.entry.isFile || entity.entry.nodeId) ? true : false; + return entity.entry.isFile || entity.entry.nodeId + ? true + : false; }); folder = nodes.find(entity => entity.entry.isFolder); } diff --git a/src/app/store/states/navigation.state.ts b/src/app/store/states/navigation.state.ts index dd41681fe..b1b31d4ab 100644 --- a/src/app/store/states/navigation.state.ts +++ b/src/app/store/states/navigation.state.ts @@ -27,4 +27,5 @@ import { Node } from 'alfresco-js-api'; export interface NavigationState { currentFolder?: Node; + url?: string; } diff --git a/src/assets/app.extensions.json b/src/assets/app.extensions.json index f7df9b1a3..52769e6c7 100644 --- a/src/assets/app.extensions.json +++ b/src/assets/app.extensions.json @@ -22,11 +22,28 @@ }, { "id": "app.toolbar.canViewFile", - "type": "app.selection.file" + "type": "core.every", + "parameters": [ + { + "type": "rule", + "value": "app.selection.file" + }, + { + "type": "rule", + "value": "core.not", + "parameters": [ + { "type": "rule", "value": "app.navigation.isTrashcan" } + ] + } + ] }, { "id": "app.toolbar.canDownload", - "type": "app.selection.canDownload" + "type": "core.every", + "parameters": [ + { "type": "rule", "value": "app.selection.canDownload" }, + { "type": "rule", "value": "app.navigation.isNotTrashcan" } + ] } ],