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" }
+ ]
}
],