diff --git a/docs/extending/application-features.md b/docs/extending/application-features.md index 7eea45a9f..6b318815d 100644 --- a/docs/extending/application-features.md +++ b/docs/extending/application-features.md @@ -420,6 +420,22 @@ Every custom component receives the following properties at runtime: | url | string | File content URL. | | extension | string | File name extension. | +#### Rules + +You can also provide a rule for the `disabled` state. +That allows to provide conditional availability for Viewer extensions based on external factors. + +```json +{ + "id": "app.viewer.pdf", + "fileExtension": "png", + "component": "app.components.tabs.metadata", + "rules": { + "disabled": "isViewerDisabled" + } +} +``` + ### Toolbar actions The default toolbar actions from the ACA viewer can be customized through extensions to be replaced, modified or disabled. diff --git a/src/app/extensions/extension.service.ts b/src/app/extensions/extension.service.ts index 44b88c47e..9ecc54e67 100644 --- a/src/app/extensions/extension.service.ts +++ b/src/app/extensions/extension.service.ts @@ -153,10 +153,11 @@ export class AppExtensionService implements AppRuleContext { config, 'features.viewer.shared.toolbarActions' ); - this.viewerContentExtensions = this.loader.getElements( - config, - 'features.viewer.content' - ); + + this.viewerContentExtensions = this.loader + .getElements(config, 'features.viewer.content') + .filter(ref => !this.isViewerExtensionDisabled(ref)); + this.contextMenuActions = this.loader.getContentActions( config, 'features.contextMenu' @@ -457,6 +458,20 @@ export class AppExtensionService implements AppRuleContext { return true; } + isViewerExtensionDisabled(extension: any): boolean { + if (extension) { + if (extension.disabled) { + return true; + } + + if (extension.rules && extension.rules.disabled) { + return this.extensions.evaluateRule(extension.rules.disabled, this); + } + } + + return false; + } + runActionById(id: string) { const action = this.extensions.getActionById(id); if (action) {