mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-07-24 17:31:52 +00:00
[ACA-2746] Side Navigation - conditionally render group of items (#1197)
* filter groups based on rule * test * update docs
This commit is contained in:
@@ -208,6 +208,34 @@ Navigation definition also supports custom components to be dynamically render.
|
||||
]
|
||||
```
|
||||
|
||||
Navigation items or group of navigation items can be conditional render based on defined rules.
|
||||
|
||||
```json
|
||||
"navbar": [
|
||||
{
|
||||
"id": "custom-group-1",
|
||||
"rules": {
|
||||
"visible": "rule-reference-id"
|
||||
},
|
||||
"items": [ ... ]
|
||||
},
|
||||
{
|
||||
"id": "custom-group-2",
|
||||
"items": [
|
||||
{
|
||||
"id": "itemId",
|
||||
"rules": {
|
||||
"visible": "rule-reference-id"
|
||||
},
|
||||
...
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
For more informations about rules checkout [Rules](../extending/rules.md) section.
|
||||
|
||||
Note that components must be declared as entryComponents under the app module.
|
||||
|
||||
For more information about the content of a custom page see [Document List Layout](/features/document-list-layout) section.
|
||||
|
@@ -694,6 +694,62 @@ describe('AppExtensionService', () => {
|
||||
{ items: [{ children: [] }] }
|
||||
]);
|
||||
});
|
||||
|
||||
it('should filter out items based on rule', () => {
|
||||
spyOn(service, 'filterVisible').and.callFake(item => {
|
||||
if (item.rules) {
|
||||
return item.rules.visible;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
const navigation = service.getApplicationNavigation([
|
||||
{
|
||||
id: 'groupId',
|
||||
items: [
|
||||
{
|
||||
id: 'itemId',
|
||||
route: 'route1',
|
||||
rules: { visible: false }
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
||||
|
||||
expect(navigation).toEqual([{ id: 'groupId', items: [] }]);
|
||||
});
|
||||
|
||||
it('should filter out group based on rule', () => {
|
||||
spyOn(service, 'filterVisible').and.callFake(item => {
|
||||
if (item.rules) {
|
||||
return item.rules.visible;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
const navigation = service.getApplicationNavigation([
|
||||
{
|
||||
id: 'group1',
|
||||
rules: {
|
||||
visible: false
|
||||
},
|
||||
items: [
|
||||
{
|
||||
id: 'item1',
|
||||
route: 'route1'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'group2',
|
||||
items: []
|
||||
}
|
||||
]);
|
||||
|
||||
expect(navigation).toEqual([{ id: 'group2', items: [] }]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getSharedLinkViewerToolbarActions', () => {
|
||||
|
@@ -235,71 +235,73 @@ export class AppExtensionService implements RuleContext {
|
||||
}
|
||||
|
||||
getApplicationNavigation(elements) {
|
||||
return elements.map(group => {
|
||||
return {
|
||||
...group,
|
||||
items: (group.items || [])
|
||||
.filter(entry => !entry.disabled)
|
||||
.filter(item => this.filterVisible(item))
|
||||
.sort(sortByOrder)
|
||||
.map(item => {
|
||||
if (item.children && item.children.length > 0) {
|
||||
item.children = item.children
|
||||
.filter(entry => !entry.disabled)
|
||||
.filter(child => this.filterVisible(child))
|
||||
.sort(sortByOrder)
|
||||
.map(child => {
|
||||
if (child.component) {
|
||||
return {
|
||||
...child
|
||||
};
|
||||
}
|
||||
return elements
|
||||
.filter(group => this.filterVisible(group))
|
||||
.map(group => {
|
||||
return {
|
||||
...group,
|
||||
items: (group.items || [])
|
||||
.filter(entry => !entry.disabled)
|
||||
.filter(item => this.filterVisible(item))
|
||||
.sort(sortByOrder)
|
||||
.map(item => {
|
||||
if (item.children && item.children.length > 0) {
|
||||
item.children = item.children
|
||||
.filter(entry => !entry.disabled)
|
||||
.filter(child => this.filterVisible(child))
|
||||
.sort(sortByOrder)
|
||||
.map(child => {
|
||||
if (child.component) {
|
||||
return {
|
||||
...child
|
||||
};
|
||||
}
|
||||
|
||||
if (!child.click) {
|
||||
const childRouteRef = this.extensions.getRouteById(
|
||||
child.route
|
||||
);
|
||||
const childUrl = `/${
|
||||
childRouteRef ? childRouteRef.path : child.route
|
||||
}`;
|
||||
return {
|
||||
...child,
|
||||
url: childUrl
|
||||
};
|
||||
}
|
||||
|
||||
if (!child.click) {
|
||||
const childRouteRef = this.extensions.getRouteById(
|
||||
child.route
|
||||
);
|
||||
const childUrl = `/${
|
||||
childRouteRef ? childRouteRef.path : child.route
|
||||
}`;
|
||||
return {
|
||||
...child,
|
||||
url: childUrl
|
||||
action: child.click
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
...child,
|
||||
action: child.click
|
||||
};
|
||||
});
|
||||
return {
|
||||
...item
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
...item
|
||||
};
|
||||
}
|
||||
if (item.component) {
|
||||
return { ...item };
|
||||
}
|
||||
|
||||
if (item.component) {
|
||||
return { ...item };
|
||||
}
|
||||
if (!item.click) {
|
||||
const routeRef = this.extensions.getRouteById(item.route);
|
||||
const url = `/${routeRef ? routeRef.path : item.route}`;
|
||||
return {
|
||||
...item,
|
||||
url
|
||||
};
|
||||
}
|
||||
|
||||
if (!item.click) {
|
||||
const routeRef = this.extensions.getRouteById(item.route);
|
||||
const url = `/${routeRef ? routeRef.path : item.route}`;
|
||||
return {
|
||||
...item,
|
||||
url
|
||||
action: item.click
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
...item,
|
||||
action: item.click
|
||||
};
|
||||
})
|
||||
.reduce(reduceEmptyMenus, [])
|
||||
};
|
||||
});
|
||||
})
|
||||
.reduce(reduceEmptyMenus, [])
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
loadContentMetadata(config: ExtensionConfig): any {
|
||||
|
Reference in New Issue
Block a user