/*-
* ============LICENSE_START=======================================================
* SDC
* ================================================================================
* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* 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.
* ============LICENSE_END=========================================================
*/
///
module Sdc.Directives {
'use strict';
export interface ITopNavScope extends ng.IScope {
topLvlSelectedIndex: number;
hideSearch: boolean;
searchBind: any;
menuModel: Array;
topLvlMenu: Utils.MenuItemGroup;
goToState(state:string, params:Array):ng.IPromise;
menuItemClick: Function;
user: Models.IUserProperties;
version:string;
}
export class TopNavDirective implements ng.IDirective {
constructor(private $templateCache:ng.ITemplateCacheService,
private $filter:ng.IFilterService,
private $state:ng.ui.IStateService,
private $q: ng.IQService,
private userResourceService: Sdc.Services.IUserResourceClass
) {
}
public replace = true;
public restrict = 'E';
public transclude = false;
scope = {
topLvlSelectedIndex: '@?',
hideSearch: '=',
searchBind: '=',
version: '@',
notificationIconCallback: '=',
menuModel: '=?',
};
template = ():string => {
return this.$templateCache.get('/app/scripts/directives/layout/top-nav/top-nav.html');
};
public link = (scope:ITopNavScope, $elem:ng.IAugmentedJQuery, $attrs:angular.IAttributes) => {
let getTopLvlSelectedIndexByState = ():number => {
if (!scope.topLvlMenu.menuItems) {
return 0;
}
let result = -1;
//set result to current state
scope.topLvlMenu.menuItems.forEach((item:Utils.MenuItem, index:number)=> {
if (item.state === this.$state.current.name) {
result = index;
}
});
//if it's a different state , checking previous state param
if (result === -1) {
scope.topLvlMenu.menuItems.forEach((item:Utils.MenuItem, index:number)=> {
if (item.state === this.$state.params['previousState']) {
result = index;
}
});
}
if (result === -1) {
result = 0;
}
return result;
};
scope.user = this.userResourceService.getLoggedinUser();
let tmpArray:Array = [
new Utils.MenuItem(this.$filter('translate')("TOP_MENU_HOME_BUTTON"), null, "dashboard", "goToState", null, null),
new Utils.MenuItem(this.$filter('translate')("TOP_MENU_CATALOG_BUTTON"), null, "catalog", "goToState", null, null)
];
// Only designer can perform onboarding
if (scope.user && scope.user.role === 'DESIGNER'){
tmpArray.push(new Utils.MenuItem(this.$filter('translate')("TOP_MENU_ON_BOARD_BUTTON"), null, "onboardVendor", "goToState", null, null));
}
scope.topLvlMenu = new Utils.MenuItemGroup(0, tmpArray , true );
scope.topLvlMenu.selectedIndex = isNaN(scope.topLvlSelectedIndex) ? getTopLvlSelectedIndexByState() : scope.topLvlSelectedIndex;
let generateMenu = () => {
if (scope.menuModel && scope.menuModel[0] !== scope.topLvlMenu) {
scope.menuModel.unshift(scope.topLvlMenu);
}
};
scope.$watch('menuModel', generateMenu);
generateMenu();
/////scope functions////
scope.goToState = (state:string, params:Array):ng.IPromise => {
let deferred = this.$q.defer();
this.$state.go(state, params && params.length > 0 ? [0] : undefined);
deferred.resolve(true);
return deferred.promise;
};
scope.menuItemClick = (itemGroup:Utils.MenuItemGroup, item:Utils.MenuItem) => {
itemGroup.itemClick = false;
let onSuccess = ():void => {
itemGroup.selectedIndex = itemGroup.menuItems.indexOf(item);
};
let onFailed = ():void => {};
if (item.callback) {
(item.callback.apply(undefined, item.params)).then(onSuccess, onFailed);
} else {
scope[item.action](item.state, item.params).then(onSuccess, onFailed);
}
};
};
public static factory = ($templateCache:ng.ITemplateCacheService, $filter:ng.IFilterService, $state:ng.ui.IStateService, $q: ng.IQService, userResourceService: Sdc.Services.IUserResourceClass)=> {
return new TopNavDirective($templateCache, $filter, $state,$q, userResourceService);
};
}
TopNavDirective.factory.$inject = ['$templateCache', '$filter', '$state','$q', 'Sdc.Services.UserResourceService'];
}