| /*- |
| * ============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========================================================= |
| */ |
| |
| 'use strict'; |
| import * as _ from "lodash"; |
| import {WorkspaceMode, ComponentState} from "./constants"; |
| import {IAppConfigurtaion, IAppMenu, Component} from "../models"; |
| import {ComponentFactory} from "./component-factory"; |
| import {ModalsHandler} from "./modals-handler"; |
| |
| export class MenuItem { |
| text:string; |
| callback:(...args:Array<any>) => ng.IPromise<boolean>; |
| state:string; |
| action:string; |
| params:any; |
| isDisabled:boolean; |
| disabledRoles:Array<string>; |
| blockedForTypes:Array<string>; // This item will not be shown for specific components types. |
| |
| //TODO check if needed |
| alertModal:string; |
| conformanceLevelModal: boolean; // Call validateConformanceLevel API and shows conformanceLevelModal if necessary, then continue with action or invokes another action |
| confirmationModal:string; // Open confirmation modal (user should select "OK" or "Cancel"), and continue with the action. |
| emailModal:string; // Open email modal (user should fill email details), and continue with the action. |
| url:string; // Data added to menu item, in case the function need to use it, example: for function "changeLifecycleState", I need to pass also the state "CHECKOUT" that I want the state to change to. |
| |
| |
| constructor(text:string, callback:(...args:Array<any>) => ng.IPromise<boolean>, state:string, action:string, params?:any, blockedForTypes?:Array<string>) { |
| this.text = text; |
| this.callback = callback; |
| this.state = state; |
| this.action = action; |
| this.params = params; |
| this.blockedForTypes = blockedForTypes; |
| } |
| } |
| |
| export class MenuItemGroup { |
| selectedIndex:number; |
| menuItems:Array<MenuItem>; |
| itemClick:boolean; |
| |
| constructor(selectedIndex?:number, menuItems?:Array<MenuItem>, itemClick?:boolean) { |
| this.selectedIndex = selectedIndex; |
| this.menuItems = menuItems; |
| this.itemClick = itemClick; |
| } |
| |
| public updateSelectedMenuItemText(newText:string) { |
| const selectedMenuItem = this.menuItems[this.selectedIndex]; |
| if (selectedMenuItem) { |
| this.menuItems[this.selectedIndex].text = newText; |
| } |
| } |
| } |
| |
| |
| export class MenuHandler { |
| |
| static '$inject' = [ |
| 'sdcConfig', |
| 'sdcMenu', |
| 'ComponentFactory', |
| '$filter', |
| 'ModalsHandler', |
| '$state', |
| '$q' |
| ]; |
| |
| constructor(private sdcConfig:IAppConfigurtaion, |
| private sdcMenu:IAppMenu, |
| private ComponentFactory:ComponentFactory, |
| private $filter:ng.IFilterService, |
| private ModalsHandler:ModalsHandler, |
| private $state:ng.ui.IStateService, |
| private $q:ng.IQService) { |
| |
| } |
| |
| |
| findBreadcrumbComponentIndex = (components:Array<Component>, selected:Component):number => { |
| let selectedItemIdx; |
| |
| // Search the component in all components by uuid (and not uniqueid, gives access to an assets's minor versions). |
| selectedItemIdx = _.findIndex(components, (item:Component) => { |
| return item.uuid === selected.uuid; |
| }); |
| |
| // If not found search by invariantUUID |
| if (selectedItemIdx === -1) { |
| selectedItemIdx = _.findIndex(components, (item:Component) => { |
| //invariantUUID && Certified State matches between major versions |
| return item.invariantUUID === selected.invariantUUID && item.lifecycleState === ComponentState.CERTIFIED; |
| }); |
| } |
| |
| // If not found search by name (name is unique). |
| if (selectedItemIdx === -1) { |
| selectedItemIdx = _.findIndex(components, (item:Component) => { |
| return item.name === selected.name && item.componentType === selected.componentType; |
| }); |
| } |
| |
| return selectedItemIdx; |
| }; |
| |
| generateBreadcrumbsModelFromComponents = (components:Array<Component>, selected:Component):MenuItemGroup => { |
| let result = new MenuItemGroup(0, [], false); |
| if (components) { |
| result.selectedIndex = this.findBreadcrumbComponentIndex(components, selected); |
| let clickItemCallback = (component:Component):ng.IPromise<boolean> => { |
| this.$state.go('workspace.general', { |
| id: component.uniqueId, |
| type: component.componentType.toLowerCase(), |
| mode: WorkspaceMode.VIEW |
| }); |
| return this.$q.when(true); |
| }; |
| |
| components.forEach((component:Component) => { |
| let menuItem = new MenuItem( |
| // component.name, |
| component.getComponentSubType() + ': ' + this.$filter('resourceName')(component.name), |
| clickItemCallback, |
| null, |
| null, |
| [component] |
| ); |
| // menuItem.text = component.name; |
| result.menuItems.push(menuItem); |
| }); |
| |
| result.selectedIndex = this.findBreadcrumbComponentIndex(components, selected); |
| |
| // if component does not exist, then add a temporary menu item for the current component |
| if (result.selectedIndex === -1) { |
| let menuItem = new MenuItem( |
| // component.name, |
| selected.getComponentSubType() + ': ' + this.$filter('resourceName')(selected.name), |
| clickItemCallback, |
| null, |
| null, |
| [selected] |
| ); |
| result.menuItems.unshift(menuItem); |
| result.selectedIndex = 0; |
| } |
| } |
| return result; |
| }; |
| } |