blob: 7ed02d075facb0a6314c398f5a34db7a19d7847a [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <reference path="../../../../typings/index.d.ts" />
import * as _ from 'lodash';
import {IXosStyleConfig} from '../../../index';
export interface IXosNavigationRoute {
label: string;
state?: string;
url?: string;
parent?: string;
children?: [IXosNavigationRoute];
opened?: boolean;
}
export interface IXosNavigationService {
query(): IXosNavigationRoute[];
add(route: IXosNavigationRoute): void;
}
export class IXosNavigationService {
static $inject = ['$log', 'StyleConfig'];
private routes: IXosNavigationRoute[];
constructor(
private $log: ng.ILogService,
private StyleConfig: IXosStyleConfig
) {
const defaultRoutes = [
{
label: 'Home',
state: 'xos.dashboard'
},
{
label: 'Core',
state: 'xos.core'
}
];
// adding configuration defined routes
// this.routes = StyleConfig.routes.concat(defaultRoutes).reverse();
this.routes = defaultRoutes;
this.StyleConfig.routes.forEach(r => {
this.add(r);
});
}
query() {
return this.routes;
}
add(route: IXosNavigationRoute, override: boolean = false) {
if (angular.isDefined(route.state) && angular.isDefined(route.url)) {
throw new Error('[XosNavigation] You can\'t provide both state and url');
}
// NOTE factor this out in a separate method an eventually use recursion since we can nest more routes
let preExisting = null;
const routeExist = _.findIndex(this.routes, (r: IXosNavigationRoute) => {
if (r.label === route.label && (r.state === route.state || override) && r.parent === route.parent) {
preExisting = r;
return true;
}
else if (_.findIndex(r.children, route) > -1) {
preExisting = r;
return true;
}
return false;
}) > -1;
if (routeExist && !override) {
this.$log.warn(`[XosNavigation] Route with label: ${route.label}, state: ${route.state} and parent: ${route.parent} already exists`);
return;
}
if (angular.isDefined(route.parent)) {
// route parent should be a state for now
const parentRoute = _.find(this.routes, {state: route.parent});
if (angular.isDefined(parentRoute)) {
if (angular.isArray(parentRoute.children)) {
if (override) {
_.remove(parentRoute.children, r => r === preExisting);
}
parentRoute.children.push(route);
}
else {
parentRoute.children = [route];
}
}
else {
this.$log.warn(`[XosNavigation] Parent State (${route.parent}) for state: ${route.state} does not exist`);
return;
}
}
else {
if (override) {
_.remove(this.routes, r => r === preExisting);
}
this.routes.push(route);
}
}
}