angular-sidebar-menu
Version:
The sources for this package are in the [Angular Sidebar Menu](https://github.com/mledour/angular-sidebar-menu) repo. Please file issues and pull requests against that repo.
478 lines (460 loc) • 27.5 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs'), require('rxjs/operators'), require('@angular/common'), require('@angular/router'), require('@angular/animations')) :
typeof define === 'function' && define.amd ? define('angular-sidebar-menu', ['exports', '@angular/core', 'rxjs', 'rxjs/operators', '@angular/common', '@angular/router', '@angular/animations'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['angular-sidebar-menu'] = {}, global.ng.core, global.rxjs, global.rxjs.operators, global.ng.common, global.ng.router, global.ng.animations));
}(this, (function (exports, core, rxjs, operators, common, router, animations) { 'use strict';
(function (Modes) {
Modes["EXPANDED"] = "expanded";
Modes["EXPANDABLE"] = "expandable";
Modes["MINI"] = "mini";
})(exports.Modes || (exports.Modes = {}));
var AnchorService = /** @class */ (function () {
function AnchorService() {
}
return AnchorService;
}());
AnchorService.decorators = [
{ type: core.Injectable }
];
var NodeService = /** @class */ (function () {
function NodeService() {
this.openedNode = new rxjs.Subject();
}
return NodeService;
}());
NodeService.decorators = [
{ type: core.Injectable }
];
var RoleService = /** @class */ (function () {
function RoleService() {
this.role$ = new rxjs.BehaviorSubject(undefined);
this.unAuthorizedVisibility$ = new rxjs.BehaviorSubject('hidden');
}
Object.defineProperty(RoleService.prototype, "role", {
set: function (role) {
this.role$.next(role);
},
enumerable: false,
configurable: true
});
Object.defineProperty(RoleService.prototype, "unAuthorizedVisibility", {
set: function (visibility) {
this.unAuthorizedVisibility$.next(visibility);
},
enumerable: false,
configurable: true
});
RoleService.prototype.showItem$ = function (roles) {
return this.itemVisibilityBase$(roles).pipe(operators.map(function (values) { return values.isAuthorized || (!values.isAuthorized && values.unAuthorizedVisibility !== 'hidden'); }));
};
RoleService.prototype.disableItem$ = function (roles) {
return this.itemVisibilityBase$(roles).pipe(operators.map(function (values) { return !values.isAuthorized && values.unAuthorizedVisibility === 'disabled'; }));
};
RoleService.prototype.itemVisibilityBase$ = function (roles) {
var _this = this;
return rxjs.combineLatest([
this.role$.pipe(operators.map(function (role) { return _this.isAuthorized(role, roles); })),
this.unAuthorizedVisibility$,
]).pipe(operators.map(function (value) { return ({ isAuthorized: value[0], unAuthorizedVisibility: value[1] }); }));
};
RoleService.prototype.isRole = function (role) {
return typeof role === 'string' || typeof role === 'number';
};
RoleService.prototype.isAuthorized = function (userRole, itemRoles) {
if (!this.isRole(userRole) || !itemRoles || itemRoles.length === 0) {
return true;
}
return itemRoles.includes(userRole);
};
return RoleService;
}());
RoleService.decorators = [
{ type: core.Injectable }
];
var SearchService = /** @class */ (function () {
function SearchService() {
this._search = new rxjs.Subject();
this.search$ = this._search.asObservable();
}
Object.defineProperty(SearchService.prototype, "search", {
set: function (value) {
this._search.next(value);
},
enumerable: false,
configurable: true
});
SearchService.prototype.filter = function (search, label) {
if (!search || !label) {
return false;
}
return !label.toLowerCase().includes(search.toLowerCase());
};
return SearchService;
}());
SearchService.decorators = [
{ type: core.Injectable }
];
var trackByItem = function (index, item) {
return item.id || index;
};
var SidebarMenuComponent = /** @class */ (function () {
function SidebarMenuComponent(anchorService, nodeService, searchService, roleService) {
this.anchorService = anchorService;
this.nodeService = nodeService;
this.searchService = searchService;
this.roleService = roleService;
this.mode = exports.Modes.EXPANDED;
this.modes = exports.Modes;
this.disableAnimations = true;
this.trackByItem = trackByItem;
}
Object.defineProperty(SidebarMenuComponent.prototype, "_menu", {
set: function (menu) {
var _this = this;
this.disableAnimations = true;
this.menu = menu;
setTimeout(function () {
_this.disableAnimations = false;
});
},
enumerable: false,
configurable: true
});
Object.defineProperty(SidebarMenuComponent.prototype, "iconClasses", {
set: function (cssClasses) {
this.anchorService.iconClasses = cssClasses;
},
enumerable: false,
configurable: true
});
Object.defineProperty(SidebarMenuComponent.prototype, "toggleIconClasses", {
set: function (cssClasses) {
this.nodeService.toggleIconClasses = cssClasses;
},
enumerable: false,
configurable: true
});
Object.defineProperty(SidebarMenuComponent.prototype, "role", {
set: function (role) {
this.roleService.role = role;
},
enumerable: false,
configurable: true
});
Object.defineProperty(SidebarMenuComponent.prototype, "unAuthorizedVisibility", {
set: function (visibility) {
this.roleService.unAuthorizedVisibility = visibility;
},
enumerable: false,
configurable: true
});
Object.defineProperty(SidebarMenuComponent.prototype, "search", {
set: function (value) {
this.searchService.search = value;
},
enumerable: false,
configurable: true
});
return SidebarMenuComponent;
}());
SidebarMenuComponent.decorators = [
{ type: core.Component, args: [{
selector: 'asm-angular-sidebar-menu',
providers: [NodeService, AnchorService, RoleService, SearchService],
changeDetection: core.ChangeDetectionStrategy.OnPush,
template: " <div class=\"asm-menu\" [ngClass]=\"'asm-menu--mode-' + mode\" [@.disabled]=\"disableAnimations\">\n <ng-content></ng-content>\n <ul class=\"asm-menu__node\">\n <ng-container *ngFor=\"let item of menu; trackBy: trackByItem\">\n <li\n asm-menu-item\n class=\"asm-menu-item asm-menu-item--root\"\n *ngIf=\"roleService.showItem$(item.roles) | async\"\n [menuItem]=\"item\"\n [level]=\"0\"\n ></li>\n </ng-container>\n </ul>\n </div>",
styles: [":host{display:block;overflow:hidden}:host:hover{overflow:visible}:host ::ng-deep .asm-menu-item,:host ::ng-deep ul{margin:0;padding:0}:host ::ng-deep li{line-height:0}:host ::ng-deep .asm-menu-anchor__label,:host ::ng-deep .asm-menu-item__header,:host ::ng-deep .asm-menu-node__label{white-space:nowrap}:host ::ng-deep .asm-menu-node__label{display:none}:host ::ng-deep .asm-menu-node:not(.asm-menu-node--open)>.ng-trigger-openClose,:host ::ng-deep .asm-menu-node>.ng-trigger-openClose.ng-animating{overflow:hidden}:host ::ng-deep .asm-menu-item--filtered{display:none}:host ::ng-deep .asm-menu,:host ::ng-deep .asm-menu-node ul{list-style:none}:host ::ng-deep .asm-menu-anchor a{-webkit-user-select:none;align-items:center;cursor:pointer;display:flex;position:relative;text-decoration:none;user-select:none}:host ::ng-deep .asm-menu-item__header{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .asm-menu-node .asm-menu-item__header{margin-left:-6px}:host ::ng-deep .asm-menu-anchor__icon{width:20px}:host ::ng-deep .asm-menu-anchor__pull.asm-badges,:host ::ng-deep .asm-menu-anchor__pull.asm-toggle{position:absolute;right:10px}:host ::ng-deep .asm-menu-anchor__pull.asm-badges .asm-badges__badge,:host ::ng-deep .asm-menu-anchor__pull.asm-badges .asm-toggle__icon,:host ::ng-deep .asm-menu-anchor__pull.asm-toggle .asm-badges__badge,:host ::ng-deep .asm-menu-anchor__pull.asm-toggle .asm-toggle__icon{float:right;margin-left:4px;text-align:center;white-space:nowrap}:host ::ng-deep .asm-menu-anchor__pull.asm-badges .asm-toggle__icon,:host ::ng-deep .asm-menu-anchor__pull.asm-toggle .asm-toggle__icon{margin:0 4px 0 8px}:host ::ng-deep .asm-menu--mode-expandable:not(:hover),:host ::ng-deep .asm-menu--mode-mini{width:50px}:host ::ng-deep .asm-menu--mode-expandable:not(:hover)>ul>.asm-menu-item>.asm-menu-anchor .asm-menu-anchor__label,:host ::ng-deep .asm-menu--mode-expandable:not(:hover)>ul>.asm-menu-item>.asm-menu-anchor .asm-menu-anchor__pull,:host ::ng-deep .asm-menu--mode-expandable:not(:hover)>ul>.asm-menu-item>.asm-menu-item__header,:host ::ng-deep .asm-menu--mode-expandable:not(:hover)>ul>.asm-menu-item>.asm-menu-node>.asm-menu-anchor .asm-menu-anchor__label,:host ::ng-deep .asm-menu--mode-expandable:not(:hover)>ul>.asm-menu-item>.asm-menu-node>.asm-menu-anchor .asm-menu-anchor__pull,:host ::ng-deep .asm-menu--mode-expandable:not(:hover)>ul>.asm-menu-item>.asm-menu-node>ul,:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item>.asm-menu-anchor .asm-menu-anchor__label,:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item>.asm-menu-anchor .asm-menu-anchor__pull,:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item>.asm-menu-item__header,:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item>.asm-menu-node>.asm-menu-anchor .asm-menu-anchor__label,:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item>.asm-menu-node>.asm-menu-anchor .asm-menu-anchor__pull,:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item>.asm-menu-node>ul{display:none}:host ::ng-deep .asm-menu--mode-mini .asm-menu-node__label{display:block}:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item{position:relative}:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item:hover>.asm-menu-anchor .asm-menu-anchor__label,:host ::ng-deep .asm-menu--mode-mini>ul>.asm-menu-item:hover>.asm-menu-node>ul{display:block!important;height:auto!important;left:100%;position:absolute;top:0;z-index:999}"]
},] }
];
SidebarMenuComponent.ctorParameters = function () { return [
{ type: AnchorService },
{ type: NodeService },
{ type: SearchService },
{ type: RoleService }
]; };
SidebarMenuComponent.propDecorators = {
_menu: [{ type: core.Input, args: ['menu',] }],
iconClasses: [{ type: core.Input }],
toggleIconClasses: [{ type: core.Input }],
role: [{ type: core.Input }],
unAuthorizedVisibility: [{ type: core.Input }],
search: [{ type: core.Input }],
mode: [{ type: core.Input }]
};
var TRANSITION_DURATION = 300;
var openCloseAnimation = animations.trigger('openClose', [
animations.state('true', animations.style({ height: animations.AUTO_STYLE })),
animations.state('false', animations.style({ height: 0 })),
animations.transition('false <=> true', animations.animate(TRANSITION_DURATION + "ms ease-in")),
]);
var rotateAnimation = animations.trigger('rotate', [
animations.state('true', animations.style({ transform: 'rotate(-90deg)' })),
animations.transition('false <=> true', animations.animate(TRANSITION_DURATION + "ms ease-out")),
]);
var ItemComponent = /** @class */ (function () {
function ItemComponent(router, roleService, searchService, changeDetectorRef) {
this.router = router;
this.roleService = roleService;
this.searchService = searchService;
this.changeDetectorRef = changeDetectorRef;
this.isRootNode = true;
this.disable = false;
this.onDestroy$ = new rxjs.Subject();
this.isActive = new rxjs.BehaviorSubject(false);
this.isFiltered = new rxjs.BehaviorSubject(false);
this.isActive$ = this.isActive.asObservable().pipe(operators.distinctUntilChanged(), operators.takeUntil(this.onDestroy$));
this.isFiltered$ = this.isFiltered.asObservable().pipe(operators.distinctUntilChanged(), operators.takeUntil(this.onDestroy$));
this.isItemFiltered = false;
this.isItemDisabled = false;
}
Object.defineProperty(ItemComponent.prototype, "filtered", {
get: function () {
return this.isItemFiltered;
},
enumerable: false,
configurable: true
});
Object.defineProperty(ItemComponent.prototype, "disabled", {
get: function () {
return this.isItemDisabled || this.disable;
},
enumerable: false,
configurable: true
});
ItemComponent.prototype.ngOnInit = function () {
this.routerItemActiveSubscription();
this.emitItemActive();
this.menuSearchSubscription();
this.disabledItemSubscription();
};
ItemComponent.prototype.ngOnDestroy = function () {
this.onDestroy$.next();
this.onDestroy$.complete();
};
ItemComponent.prototype.onNodeActive = function (event) {
this.isActive.next(event);
};
ItemComponent.prototype.onNodeFiltered = function (event) {
this.isItemFiltered = event;
this.isFiltered.next(event);
};
ItemComponent.prototype.routerItemActiveSubscription = function () {
var _this = this;
this.router.events
.pipe(operators.filter(function (e) { return e instanceof router.NavigationEnd; }), operators.takeUntil(this.onDestroy$))
.subscribe(function (e) {
_this.emitItemActive();
});
};
ItemComponent.prototype.menuSearchSubscription = function () {
var _this = this;
if (!this.menuItem.children) {
this.searchService.search$.pipe(operators.takeUntil(this.onDestroy$)).subscribe(function (search) {
_this.isItemFiltered = _this.searchService.filter(search, _this.menuItem.label || _this.menuItem.header);
_this.isFiltered.next(_this.isItemFiltered);
_this.changeDetectorRef.markForCheck();
});
}
};
ItemComponent.prototype.disabledItemSubscription = function () {
var _this = this;
this.roleService
.disableItem$(this.menuItem.roles)
.pipe(operators.takeUntil(this.onDestroy$))
.subscribe(function (disabled) { return (_this.isItemDisabled = disabled); });
};
ItemComponent.prototype.emitItemActive = function () {
if (this.menuItem.route) {
this.isActive.next(this.isActiveRoute(this.menuItem.route));
}
};
ItemComponent.prototype.isActiveRoute = function (route) {
return this.router.isActive(route, this.isItemLinkExact());
};
ItemComponent.prototype.isItemLinkExact = function () {
return this.menuItem.linkActiveExact === undefined ? true : this.menuItem.linkActiveExact;
};
return ItemComponent;
}());
ItemComponent.decorators = [
{ type: core.Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'li[asm-menu-item][menuItem]',
animations: [rotateAnimation],
changeDetection: core.ChangeDetectionStrategy.OnPush,
template: "\n <ng-container [ngSwitch]=\"true\">\n <span *ngSwitchCase=\"!!menuItem.header\" class=\"asm-menu-item__header\">{{ menuItem.header }}</span>\n <asm-menu-anchor\n *ngSwitchCase=\"!menuItem.children && !menuItem.header\"\n class=\"asm-menu-anchor\"\n [menuItem]=\"menuItem\"\n [disable]=\"disable || isItemDisabled\"\n ></asm-menu-anchor>\n <ng-container *ngSwitchCase=\"!!menuItem.children\">\n <asm-menu-anchor\n class=\"asm-menu-anchor\"\n [ngClass]=\"{ 'asm-menu-anchor--open': node.isOpen }\"\n [menuItem]=\"menuItem\"\n (clickAnchor)=\"node.onNodeToggleClick()\"\n [isActive]=\"node.isActiveChild\"\n ><i toggleIcon [@rotate]=\"node.isOpen\" [class]=\"node.nodeService.toggleIconClasses\"></i\n ></asm-menu-anchor>\n <asm-menu-node\n #node\n class=\"asm-menu-node\"\n [menuItem]=\"menuItem\"\n [level]=\"level\"\n [disable]=\"disable || isItemDisabled\"\n (isActive)=\"onNodeActive($event)\"\n (isFiltered)=\"onNodeFiltered($event)\"\n ></asm-menu-node>\n </ng-container>\n </ng-container>\n "
},] }
];
ItemComponent.ctorParameters = function () { return [
{ type: router.Router },
{ type: RoleService },
{ type: SearchService },
{ type: core.ChangeDetectorRef }
]; };
ItemComponent.propDecorators = {
menuItem: [{ type: core.Input }],
isRootNode: [{ type: core.Input }],
level: [{ type: core.Input }],
disable: [{ type: core.Input }],
filtered: [{ type: core.HostBinding, args: ['class.asm-menu-item--filtered',] }],
disabled: [{ type: core.HostBinding, args: ['class.asm-menu-item--disabled',] }]
};
var NodeComponent = /** @class */ (function () {
function NodeComponent(nodeService, roleService, changeDetectorRef) {
this.nodeService = nodeService;
this.roleService = roleService;
this.changeDetectorRef = changeDetectorRef;
this.disable = false;
this.isActive = new core.EventEmitter();
this.isFiltered = new core.EventEmitter();
this.isOpen = false;
this.isActiveChild = false;
this.trackByItem = trackByItem;
this.onDestroy$ = new rxjs.Subject();
}
Object.defineProperty(NodeComponent.prototype, "open", {
get: function () {
return this.isOpen;
},
enumerable: false,
configurable: true
});
NodeComponent.prototype.ngAfterViewInit = function () {
this.openedNodeSubscription();
this.activeItemsSubscription();
this.filterItemsSubscription();
};
NodeComponent.prototype.ngOnDestroy = function () {
this.onDestroy$.next();
this.onDestroy$.complete();
};
NodeComponent.prototype.onNodeToggleClick = function () {
this.isOpen = !this.isOpen;
this.nodeService.openedNode.next({ nodeComponent: this, nodeLevel: this.level });
this.changeDetectorRef.markForCheck();
};
NodeComponent.prototype.activeItemsSubscription = function () {
var _this = this;
var isChildrenItemsActive = this.menuItemComponents.map(function (item) { return item.isActive$; });
if (isChildrenItemsActive && isChildrenItemsActive.length) {
rxjs.combineLatest(isChildrenItemsActive)
.pipe(operators.takeUntil(this.onDestroy$))
.subscribe(function (itemsActiveState) {
_this.isOpen = _this.isActiveChild = itemsActiveState.includes(true);
_this.isActive.emit(_this.isOpen);
});
}
};
NodeComponent.prototype.filterItemsSubscription = function () {
var _this = this;
var isChildrenItemsFiltered = this.menuItemComponents.map(function (item) { return item.isFiltered$; });
if (isChildrenItemsFiltered && isChildrenItemsFiltered.length) {
rxjs.combineLatest(isChildrenItemsFiltered)
.pipe(operators.takeUntil(this.onDestroy$))
.subscribe(function (itemsFilteredState) {
var isItemsFiltered = itemsFilteredState.includes(false) === false;
_this.isFiltered.emit(isItemsFiltered);
});
}
};
NodeComponent.prototype.openedNodeSubscription = function () {
var _this = this;
this.nodeService.openedNode
.pipe(operators.filter(function () { return !!_this.isOpen; }), operators.filter(function (node) { return node.nodeComponent !== _this; }), operators.takeUntil(this.onDestroy$))
.subscribe(function (node) {
if (node.nodeLevel <= _this.level) {
_this.isOpen = false;
_this.changeDetectorRef.markForCheck();
}
});
};
return NodeComponent;
}());
NodeComponent.decorators = [
{ type: core.Component, args: [{
selector: 'asm-menu-node',
animations: [openCloseAnimation],
changeDetection: core.ChangeDetectionStrategy.OnPush,
template: "<ul [@openClose]=\"isOpen\">\n <li *ngIf=\"level === 0\" class=\"asm-menu-item\">\n <span class=\"asm-menu-node__label\">{{ menuItem.label }}</span>\n </li>\n <ng-container *ngFor=\"let childItem of menuItem.children; trackBy: trackByItem\">\n <li\n asm-menu-item\n class=\"asm-menu-item\"\n *ngIf=\"roleService.showItem$(childItem.roles) | async\"\n [menuItem]=\"childItem\"\n [level]=\"level + 1\"\n [disable]=\"disable\"\n ></li>\n </ng-container>\n </ul>"
},] }
];
NodeComponent.ctorParameters = function () { return [
{ type: NodeService },
{ type: RoleService },
{ type: core.ChangeDetectorRef }
]; };
NodeComponent.propDecorators = {
menuItem: [{ type: core.Input }],
level: [{ type: core.Input }],
disable: [{ type: core.Input }],
isActive: [{ type: core.Output }],
isFiltered: [{ type: core.Output }],
open: [{ type: core.HostBinding, args: ['class.asm-menu-node--open',] }],
menuItemComponents: [{ type: core.ViewChildren, args: [ItemComponent,] }]
};
var AnchorComponent = /** @class */ (function () {
function AnchorComponent(anchorService) {
this.anchorService = anchorService;
this.disable = false;
this.clickAnchor = new core.EventEmitter();
}
Object.defineProperty(AnchorComponent.prototype, "active", {
get: function () {
var _a;
return this.isActive || (!!((_a = this.routerLinActive) === null || _a === void 0 ? void 0 : _a.isActive) && !this.disable);
},
enumerable: false,
configurable: true
});
return AnchorComponent;
}());
AnchorComponent.decorators = [
{ type: core.Component, args: [{
selector: 'asm-menu-anchor',
changeDetection: core.ChangeDetectionStrategy.OnPush,
template: "<ng-container [ngSwitch]=\"true\">\n <a *ngSwitchCase=\"!!menuItem.children\" (click)=\"clickAnchor.emit()\">\n <ng-container *ngTemplateOutlet=\"innerItem\"></ng-container>\n </a>\n <a\n *ngSwitchCase=\"!!menuItem.route || menuItem.route === ''\"\n [routerLink]=\"disable ? undefined : menuItem.route\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"{ exact: menuItem.linkActiveExact === undefined ? true : menuItem.linkActiveExact }\"\n >\n <ng-container *ngTemplateOutlet=\"innerItem\"></ng-container>\n </a>\n <a *ngSwitchCase=\"!!menuItem.url\" [href]=\"menuItem.url\" [target]=\"menuItem.target\">\n <ng-container *ngTemplateOutlet=\"innerItem\"></ng-container>\n </a>\n </ng-container>\n\n <ng-template #innerItem>\n <i\n *ngIf=\"menuItem.iconClasses || anchorService.iconClasses\"\n [class]=\"menuItem.iconClasses || anchorService.iconClasses\"\n class=\"asm-menu-anchor__icon\"\n ></i>\n <span class=\"asm-menu-anchor__label\">{{ menuItem.label }}</span>\n <span\n *ngIf=\"menuItem.badges || menuItem.children\"\n class=\"asm-menu-anchor__pull\"\n [ngClass]=\"{ 'asm-badges': menuItem.badges, 'asm-toggle': menuItem.children }\"\n >\n <span *ngFor=\"let badge of menuItem.badges\" [class]=\"badge.classes\" class=\"asm-badges__badge\">{{\n badge.label\n }}</span>\n <span class=\"asm-toggle__icon\"><ng-content select=\"[toggleIcon]\"></ng-content></span>\n </span>\n </ng-template>"
},] }
];
AnchorComponent.ctorParameters = function () { return [
{ type: AnchorService }
]; };
AnchorComponent.propDecorators = {
menuItem: [{ type: core.Input }],
isActive: [{ type: core.Input }],
disable: [{ type: core.Input }],
clickAnchor: [{ type: core.Output }],
active: [{ type: core.HostBinding, args: ['class.asm-menu-anchor--active',] }],
routerLinActive: [{ type: core.ViewChild, args: ['rla',] }]
};
var SidebarMenuModule = /** @class */ (function () {
function SidebarMenuModule() {
}
return SidebarMenuModule;
}());
SidebarMenuModule.decorators = [
{ type: core.NgModule, args: [{
declarations: [SidebarMenuComponent, ItemComponent, NodeComponent, AnchorComponent],
imports: [router.RouterModule, common.CommonModule],
exports: [SidebarMenuComponent],
},] }
];
/*
* Public API Surface of angular-sidebar-menu
*/
/**
* Generated bundle index. Do not edit.
*/
exports.SidebarMenuComponent = SidebarMenuComponent;
exports.SidebarMenuModule = SidebarMenuModule;
exports.ɵa = NodeService;
exports.ɵb = AnchorService;
exports.ɵc = RoleService;
exports.ɵd = SearchService;
exports.ɵe = ItemComponent;
exports.ɵf = openCloseAnimation;
exports.ɵg = rotateAnimation;
exports.ɵh = NodeComponent;
exports.ɵi = AnchorComponent;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=angular-sidebar-menu.umd.js.map