diff --git a/docs/content-services/components/content-action.component.md b/docs/content-services/components/content-action.component.md index b05ca17818b..4cec8ef2bec 100644 --- a/docs/content-services/components/content-action.component.md +++ b/docs/content-services/components/content-action.component.md @@ -430,6 +430,10 @@ funcName = (parameters): boolean => { } ``` +#### Clearing actions cache + +The actions visibility and disabled states are evaluated once for each node and then cached by [Document List component](document-list.component.md) for futurs uses. If your actions states might have changed since the first evaluation of the node, you should call `clearActionsCache()`. + ### Customizing built-in actions The built-in actions are defined in the [Document Actions service](../services/document-actions.service.md) and diff --git a/docs/content-services/components/document-list.component.md b/docs/content-services/components/document-list.component.md index 867cc759f42..9e7852c55d9 100644 --- a/docs/content-services/components/document-list.component.md +++ b/docs/content-services/components/document-list.component.md @@ -691,6 +691,8 @@ export class MyView { This single extra line in the template enables context menu items for documents and folders. +The actions visibility and disabled states are evaluated once for each node and then cached by [Document List component](document-list.component.md) for futurs uses. If your actions states might have changed since the first evaluation of the node, you should call `clearActionsCache()`. + ### Navigation mode By default, the [Document List component](document-list.component.md) uses 'double-click' mode for navigation. diff --git a/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts b/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts index cdcf8701f4a..1666f6e3f0c 100644 --- a/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts +++ b/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts @@ -531,6 +531,56 @@ describe('DocumentList', () => { expect(actions[1].disabled).toBe(false); }); + it('should revaluate conditional disabled state for content action after cache clearing', () => { + documentList.actions = [ + new ContentActionModel({ + target: 'document', + title: 'Action1', + disabled: (node): boolean => node.entry.name === 'custom' + }) + ]; + + let actions = documentList.getNodeActions({ entry: { id: 1, isFile: true, name: 'xyz' } }); + + expect(actions.length).toBe(1); + expect(actions[0].disabled).toBe(false); + + actions = documentList.getNodeActions({ entry: { id: 1, isFile: true, name: 'custom' } }); + + expect(actions.length).toBe(1); + expect(actions[0].disabled).toBe(false); + + documentList.clearActionsCache(); + + actions = documentList.getNodeActions({ entry: { id: 1, isFile: true, name: 'custom' } }); + expect(actions.length).toBe(1); + expect(actions[0].disabled).toBe(true); + }); + + it('should revaluate conditional visibility state for content action after cache clearing', () => { + documentList.actions = [ + new ContentActionModel({ + target: 'document', + title: 'Action1', + visible: (node): boolean => node.entry.name === 'custom' + }) + ]; + + let actions = documentList.getNodeActions({ entry: { id: 1, isFile: true, name: 'xyz' } }); + + expect(actions.length).toBe(0); + + actions = documentList.getNodeActions({ entry: { id: 1, isFile: true, name: 'custom' } }); + + expect(actions.length).toBe(0); + + documentList.clearActionsCache(); + + actions = documentList.getNodeActions({ entry: { id: 1, isFile: true, name: 'custom' } }); + expect(actions.length).toBe(1); + expect(actions[0].visible).toBe(true); + }); + it('should not disable the action if there is copy permission', () => { const documentMenu = new ContentActionModel({ disableWithNoPermission: true, diff --git a/lib/content-services/src/lib/document-list/components/document-list.component.ts b/lib/content-services/src/lib/document-list/components/document-list.component.ts index 8f94cd59ba2..e08f4b54015 100644 --- a/lib/content-services/src/lib/document-list/components/document-list.component.ts +++ b/lib/content-services/src/lib/document-list/components/document-list.component.ts @@ -610,6 +610,13 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On return []; } + /** + * Clear the actions cache. This should be called before .reload() when the actions available on the nodes might have changed. + */ + clearActionsCache(): void { + this.rowMenuCache = {}; + } + private refreshAction(action: ContentActionModel, node: NodeEntry) { action.disabled = this.isActionDisabled(action, node); action.visible = this.isActionVisible(action, node);