diff --git a/src/app/extensions/evaluators/core.evaluators.ts b/src/app/extensions/evaluators/core.evaluators.ts index cd0f88d99..f943c64b7 100644 --- a/src/app/extensions/evaluators/core.evaluators.ts +++ b/src/app/extensions/evaluators/core.evaluators.ts @@ -32,7 +32,7 @@ export function not(context: RuleContext, ...args: RuleParameter[]): boolean { return args .every(arg => { - const evaluator = context.evaluators[arg.value]; + const evaluator = context.getEvaluator(arg.value); if (!evaluator) { console.warn('evaluator not found: ' + arg.value); } @@ -47,7 +47,7 @@ export function every(context: RuleContext, ...args: RuleParameter[]): boolean { return args .every(arg => { - const evaluator = context.evaluators[arg.value]; + const evaluator = context.getEvaluator(arg.value); if (!evaluator) { console.warn('evaluator not found: ' + arg.value); } @@ -62,7 +62,7 @@ export function some(context: RuleContext, ...args: RuleParameter[]): boolean { return args .some(arg => { - const evaluator = context.evaluators[arg.value]; + const evaluator = context.getEvaluator(arg.value); if (!evaluator) { console.warn('evaluator not found: ' + arg.value); } diff --git a/src/app/extensions/extension.service.ts b/src/app/extensions/extension.service.ts index 81f6772b8..3b00abf3e 100644 --- a/src/app/extensions/extension.service.ts +++ b/src/app/extensions/extension.service.ts @@ -33,7 +33,7 @@ import { NavigationState } from '../store/states/navigation.state'; import { selectionWithFolder } from '../store/selectors/app.selectors'; import { NavBarGroupRef } from './navbar.extensions'; import { RouteRef } from './routing.extensions'; -import { RuleContext, RuleRef, RuleEvaluator } from './rule.extensions'; +import { RuleContext, RuleRef, RuleEvaluator, RuleParameter } from './rule.extensions'; import { ActionRef, ContentActionRef, ContentActionType } from './action.extensions'; import * as core from './evaluators/core.evaluators'; import { NodePermissionService } from '../services/node-permission.service'; @@ -440,16 +440,26 @@ export class ExtensionService implements RuleContext { return value; } + getEvaluator(key: string): RuleEvaluator { + if (key && key.startsWith('!')) { + const fn = this.evaluators[key.substring(1)]; + return (context: RuleContext, ...args: RuleParameter[]): boolean => { + return !fn(context, ...args); + }; + } + return this.evaluators[key]; + } + evaluateRule(ruleId: string): boolean { const ruleRef = this.rules.find(ref => ref.id === ruleId); if (ruleRef) { - const evaluator = this.evaluators[ruleRef.type]; + const evaluator = this.getEvaluator(ruleRef.type); if (evaluator) { return evaluator(this, ...ruleRef.parameters); } } else { - const evaluator = this.evaluators[ruleId]; + const evaluator = this.getEvaluator(ruleId); if (evaluator) { return evaluator(this); } diff --git a/src/app/extensions/rule.extensions.ts b/src/app/extensions/rule.extensions.ts index bbab0c3e2..c06e1d6c2 100644 --- a/src/app/extensions/rule.extensions.ts +++ b/src/app/extensions/rule.extensions.ts @@ -32,8 +32,9 @@ export type RuleEvaluator = (context: RuleContext, ...args: any[]) => boolean; export interface RuleContext { selection: SelectionState; navigation: NavigationState; - evaluators: { [key: string]: RuleEvaluator }; permissions: NodePermissions; + + getEvaluator(key: string): RuleEvaluator; } export class RuleRef {