Add data type view/workspace
[sdc.git] / catalog-ui / src / app / ng2 / pages / type-workspace / workspace-menu / workspace-menu.component.ts
1 /*
2  * -
3  *  ============LICENSE_START=======================================================
4  *  Copyright (C) 2022 Nordix Foundation.
5  *  ================================================================================
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *       http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  *
18  *  SPDX-License-Identifier: Apache-2.0
19  *  ============LICENSE_END=========================================================
20  */
21
22 import {Component, EventEmitter, Inject, Input, OnInit, Output} from '@angular/core';
23 import {MenuItem, MenuItemGroup} from "../../../../utils/menu-handler";
24 import {CacheService} from "../../../services/cache.service";
25 import {IAppMenu} from "../../../../models/app-config";
26 import {IUserProperties} from "../../../../models/user";
27 import {SdcMenuToken} from "../../../config/sdc-menu.config";
28
29 @Component({
30     selector: 'app-workspace-menu',
31     templateUrl: './workspace-menu.component.html',
32     styleUrls: ['./workspace-menu.component.less']
33 })
34 export class WorkspaceMenuComponent implements OnInit {
35
36     @Input() menuHeader: string = '';
37     @Output() onMenuUpdate: EventEmitter<MenuItemGroup> = new EventEmitter<MenuItemGroup>();
38     @Output() onClick: EventEmitter<MenuItem> = new EventEmitter<MenuItem>();
39
40     private role: string;
41     private user: IUserProperties;
42     private $state: ng.ui.IStateService;
43     private $q: ng.IQService;
44
45     leftBarTabs: MenuItemGroup = new MenuItemGroup();
46
47     constructor(private cacheService: CacheService, @Inject(SdcMenuToken) private sdcMenu: IAppMenu, @Inject('$injector') $injector) {
48         this.$state = $injector.get('$state');
49         this.$q = $injector.get('$q');
50     }
51
52     ngOnInit(): void {
53         this.user = this.cacheService.get('user');
54         this.role = this.user.role;
55         this.initMenuItems();
56     }
57
58     private initMenuItems(): void {
59         this.leftBarTabs = new MenuItemGroup();
60         const menuItemsObjects: MenuItem[] = this.updateMenuItemByRole(this.sdcMenu.component_workspace_menu_option["DataType"], this.role);
61
62         this.leftBarTabs.menuItems = menuItemsObjects.map((item: MenuItem) => {
63             const menuCallback = () => this[menuItem.action](menuItem);
64             const menuItem = new MenuItem(item.text, menuCallback, item.state, item.action, item.params, item.blockedForTypes, item.disabledCategory);
65             if (menuItem.params) {
66                 menuItem.params.state = menuItem.state;
67             } else {
68                 menuItem.params = {state: menuItem.state};
69             }
70             return menuItem;
71         });
72         this.updateSelectedMenuItem();
73         this.onMenuUpdate.emit(this.leftBarTabs);
74     }
75
76     isSelected(menuItem: MenuItem): boolean {
77         return this.leftBarTabs.selectedIndex === this.leftBarTabs.menuItems.indexOf(menuItem);
78     }
79
80     private onMenuItemPressed(menuItem: MenuItem): angular.IPromise<boolean> {
81         this.leftBarTabs.selectedIndex = this.leftBarTabs.menuItems.indexOf(menuItem);
82         this.onClick.emit(this.leftBarTabs.menuItems[this.leftBarTabs.selectedIndex]);
83         const deferred: ng.IDeferred<boolean> = this.$q.defer();
84         deferred.resolve(true);
85         return deferred.promise;
86     }
87
88     private updateMenuItemByRole(menuItems: MenuItem[], role: string): MenuItem[] {
89         const filteredMenuItems: MenuItem[] = [];
90         menuItems.forEach((item: any) => {
91             if (!(item.disabledRoles && item.disabledRoles.indexOf(role) > -1)) {
92                 filteredMenuItems.push(item);
93             }
94         });
95         return filteredMenuItems;
96     }
97
98     private updateSelectedMenuItem(): void {
99         const stateArray: Array<string> = this.$state.current.name.split('.', 2);
100         const stateWithoutInternalNavigate: string = stateArray[0] + '.' + stateArray[1];
101         const selectedItem: MenuItem = this.leftBarTabs.menuItems.find((item: MenuItem) => {
102             let itemStateArray: Array<string> = item.state.split('.', 2);
103             let itemStateWithoutNavigation: string = itemStateArray[0] + '.' + itemStateArray[1];
104             return (itemStateWithoutNavigation === stateWithoutInternalNavigate);
105         });
106         this.leftBarTabs.selectedIndex = selectedItem ? this.leftBarTabs.menuItems.indexOf(selectedItem) : 0;
107         this.onClick.emit(this.leftBarTabs.menuItems[this.leftBarTabs.selectedIndex]);
108     }
109
110 }