mirror of
https://github.com/akveo/ngx-admin.git
synced 2025-12-18 08:20:13 +01:00
dynamic menu items
This commit is contained in:
parent
6571796ca6
commit
91c652166d
3 changed files with 57 additions and 48 deletions
|
|
@ -9,20 +9,47 @@ import {PageTop, Sidebar} from '../theme';
|
||||||
* Top Level Component
|
* Top Level Component
|
||||||
*/
|
*/
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'pages',
|
selector: 'pages',
|
||||||
encapsulation: ViewEncapsulation.None,
|
encapsulation: ViewEncapsulation.None,
|
||||||
styles: [],
|
styles: [],
|
||||||
directives: [PageTop, Sidebar],
|
directives: [PageTop, Sidebar],
|
||||||
template: `<sidebar></sidebar><page-top></page-top><router-outlet></router-outlet>`
|
template: `<sidebar [routes]="getRoutes()"></sidebar><page-top></page-top><router-outlet></router-outlet>`
|
||||||
})
|
})
|
||||||
@RouteConfig([
|
@RouteConfig([
|
||||||
{ path: '/dashboard', name: 'Dashboard', component: Dashboard, useAsDefault: true },
|
{
|
||||||
|
path: '/dashboard',
|
||||||
|
name: 'Dashboard',
|
||||||
|
component: Dashboard,
|
||||||
|
useAsDefault: true,
|
||||||
|
data: {
|
||||||
|
title: 'Dashboard',
|
||||||
|
selected: true,
|
||||||
|
expanded: true,
|
||||||
|
sidebarMeta: {
|
||||||
|
icon: 'ion-android-home',
|
||||||
|
order: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
])
|
])
|
||||||
export class Pages {
|
export class Pages {
|
||||||
constructor() {}
|
|
||||||
|
|
||||||
ngOnInit() {
|
private _routeConfig;
|
||||||
console.log('Pages');
|
|
||||||
|
constructor(private _router: Router) { }
|
||||||
|
|
||||||
|
ngOnInit() { }
|
||||||
|
|
||||||
|
getRoutes() {
|
||||||
|
|
||||||
|
if (!this._routeConfig) {
|
||||||
|
this._routeConfig = Reflect.getMetadata('annotations', this.constructor)
|
||||||
|
.filter(a => {
|
||||||
|
return a.constructor.name === 'RouteConfig';
|
||||||
|
})
|
||||||
|
.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return this._routeConfig;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import {Component, ElementRef, HostListener, ViewEncapsulation} from 'angular2/core';
|
import {Component, ElementRef, HostListener, ViewEncapsulation, Input} from 'angular2/core';
|
||||||
import {Router} from 'angular2/router';
|
import {Router} from 'angular2/router';
|
||||||
|
|
||||||
import {layoutSizes} from '../theme.constants';
|
import {layoutSizes} from '../theme.constants';
|
||||||
|
|
@ -16,6 +16,8 @@ import {SidebarStateService} from './sidebarState.service';
|
||||||
})
|
})
|
||||||
export class Sidebar {
|
export class Sidebar {
|
||||||
|
|
||||||
|
@Input('routes') routes;
|
||||||
|
|
||||||
menuItems: Array<any>;
|
menuItems: Array<any>;
|
||||||
menuHeight: number;
|
menuHeight: number;
|
||||||
isMenuCollapsed: boolean;
|
isMenuCollapsed: boolean;
|
||||||
|
|
@ -28,12 +30,13 @@ export class Sidebar {
|
||||||
|
|
||||||
isMenuShouldCollapsed: boolean = false;
|
isMenuShouldCollapsed: boolean = false;
|
||||||
|
|
||||||
constructor(private elementRef: ElementRef, private router: Router, private _sidebarService: SidebarService, private _sidebarStateService: SidebarStateService) {
|
constructor(private elementRef: ElementRef,
|
||||||
|
private router: Router,
|
||||||
this.menuItems = this._sidebarService.getMenuItems();
|
private _sidebarService: SidebarService,
|
||||||
}
|
private _sidebarStateService: SidebarStateService) { }
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
this.menuItems = this._sidebarService.getMenuItems(this.routes);
|
||||||
this.selectMenuItem();
|
this.selectMenuItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,54 +53,33 @@ export class SidebarService {
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}];
|
}];
|
||||||
|
|
||||||
getMenuItems() {
|
constructor() { }
|
||||||
var states = this.defineMenuItemStates();
|
|
||||||
var menuItems = states.filter(function(item) {
|
|
||||||
return item.level == 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
menuItems.forEach(function(item) {
|
getMenuItems(routes) {
|
||||||
var children = states.filter(function(child) {
|
|
||||||
return child.level == 1 && child.name.indexOf(item.name) === 0;
|
|
||||||
});
|
|
||||||
item.subMenu = children.length ? children : null;
|
|
||||||
});
|
|
||||||
|
|
||||||
return menuItems.concat(this.staticMenuItems);
|
let menuItems = routes.configs
|
||||||
};
|
|
||||||
|
|
||||||
defineMenuItemStates() {
|
|
||||||
|
|
||||||
// TODO mock state object
|
|
||||||
var state = [{
|
|
||||||
name: 'Dashboard',
|
|
||||||
title: 'Dashboard',
|
|
||||||
selected: false,
|
|
||||||
expanded: false,
|
|
||||||
sidebarMeta: {
|
|
||||||
icon: 'ion-android-home',
|
|
||||||
order: 0,
|
|
||||||
}
|
|
||||||
}];
|
|
||||||
|
|
||||||
return state
|
|
||||||
.filter(function(s) {
|
.filter(function(s) {
|
||||||
return s.sidebarMeta != null;
|
return s.data.sidebarMeta != null;
|
||||||
})
|
})
|
||||||
.map(function(s) {
|
.map(function(s) {
|
||||||
var meta = s.sidebarMeta;
|
var meta = s.data.sidebarMeta;
|
||||||
return {
|
return {
|
||||||
|
title: s.data.title,
|
||||||
name: s.name,
|
name: s.name,
|
||||||
title: s.title,
|
level: 0,
|
||||||
level: (s.name.match(/\./g) || []).length,
|
|
||||||
order: meta.order,
|
order: meta.order,
|
||||||
icon: meta.icon
|
icon: meta.icon
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
.sort(function(a, b) {
|
.sort(function(a, b) {
|
||||||
return (a.level - b.level) * 100 + a.order - b.order;
|
return (a.level - b.level) * 100 + a.order - b.order;
|
||||||
|
})
|
||||||
|
.filter(function(item) {
|
||||||
|
return item.level == 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return menuItems.concat(this.staticMenuItems);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue