/*- * ============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========================================================= */ /** * Created by obarda on 3/30/2016. */ /// module Sdc.ViewModels { 'use strict'; import Resource = Sdc.Models.Components.Resource; import ResourceType = Sdc.Utils.Constants.ResourceType; export interface IWorkspaceViewModelScope extends ng.IScope { isLoading: boolean; isCreateProgress: boolean; component: Models.Components.Component; originComponent: Models.Components.Component; componentType: string; importFile: any; leftBarTabs: Utils.MenuItemGroup; isNew: boolean; isFromImport: boolean; isValidForm: boolean; mode: Utils.Constants.WorkspaceMode; breadcrumbsModel: Array; sdcMenu: Models.IAppMenu; changeLifecycleStateButtons: any; version: string; versionsList: Array; changeVersion: any; isComposition: boolean; isDeployment: boolean; $state: ng.ui.IStateService; user: Models.IUserProperties; thirdParty: boolean; disabledButtons: boolean; menuComponentTitle: string; progressService: Sdc.Services.ProgressService; progressMessage: string; // leftPanelComponents:Array; //this is in order to load the left panel once, and not wait long time when moving to composition showChangeStateButton(): boolean; getComponent(): Sdc.Models.Components.Component; setComponent(component: Sdc.Models.Components.Component): void; onMenuItemPressed(state: string): ng.IPromise; save(): ng.IPromise; setValidState(isValid: boolean): void; revert(): void; changeLifecycleState(state: string): void; enabledTabs(): void isDesigner(): boolean; isViewMode(): boolean; isEditMode(): boolean; isCreateMode(): boolean; isDisableMode(): boolean; showFullIcons(): boolean; goToBreadcrumbHome(): void; onVersionChanged(selectedId: string): void; getLatestVersion(): void; getStatus(): string; showLifecycleIcon(): boolean; updateSelectedMenuItem(): void; uploadFileChangedInGeneralTab(): void; updateMenuComponentName(ComponentName: string): void; } export class WorkspaceViewModel { static '$inject' = [ '$scope', 'injectComponent', 'ComponentFactory', '$state', 'sdcMenu', '$q', 'MenuHandler', 'Sdc.Services.CacheService', 'ChangeLifecycleStateHandler', 'ModalsHandler', 'LeftPaletteLoaderService', '$filter', 'EventListenerService', 'Sdc.Services.EntityService', 'Notification', '$stateParams', 'Sdc.Services.ProgressService' ]; constructor(private $scope: IWorkspaceViewModelScope, private injectComponent: Models.Components.Component, private ComponentFactory: Utils.ComponentFactory, private $state: ng.ui.IStateService, private sdcMenu: Models.IAppMenu, private $q: ng.IQService, private MenuHandler: Utils.MenuHandler, private cacheService: Services.CacheService, private ChangeLifecycleStateHandler: Sdc.Utils.ChangeLifecycleStateHandler, private ModalsHandler: Sdc.Utils.ModalsHandler, private LeftPaletteLoaderService: Services.Components.LeftPaletteLoaderService, private $filter: ng.IFilterService, private EventListenerService: Services.EventListenerService, private EntityService: Sdc.Services.EntityService, private Notification: any, private $stateParams: any, private progressService: Sdc.Services.ProgressService) { this.initScope(); this.initAfterScope(); } private role: string; private components: Array; private initViewMode = (): Utils.Constants.WorkspaceMode => { let mode = Utils.Constants.WorkspaceMode.VIEW; if (!this.$state.params['id']) { //&& !this.$state.params['vspComponent'] mode = Utils.Constants.WorkspaceMode.CREATE; } else { if (this.$scope.component.lifecycleState === Utils.Constants.ComponentState.NOT_CERTIFIED_CHECKOUT && this.$scope.component.lastUpdaterUserId === this.cacheService.get("user").userId) { if (this.$scope.component.isProduct() && this.role == Utils.Constants.Role.PRODUCT_MANAGER) { mode = Utils.Constants.WorkspaceMode.EDIT; } if ((this.$scope.component.isService() || this.$scope.component.isResource()) && this.role == Utils.Constants.Role.DESIGNER) { mode = Utils.Constants.WorkspaceMode.EDIT; } } } return mode; }; private initChangeLifecycleStateButtons = (): void => { let state = this.$scope.component.isService() && (Utils.Constants.Role.OPS == this.role || Utils.Constants.Role.GOVERNOR == this.role) ? this.$scope.component.distributionStatus : this.$scope.component.lifecycleState; this.$scope.changeLifecycleStateButtons = this.sdcMenu.roles[this.role].changeLifecycleStateButtons[state]; }; private isNeedSave = (): boolean => { if (this.$scope.isEditMode() && //this is a workaround for onboarding - we need to get the artifact in order to avoid saving the vf when moving from their tabs (this.$state.current.name === Utils.Constants.States.WORKSPACE_MANAGEMENT_WORKFLOW || this.$state.current.name === Utils.Constants.States.WORKSPACE_NETWORK_CALL_FLOW)) { return true; } return this.$scope.isEditMode() && this.$state.current.data && this.$state.current.data.unsavedChanges; }; private initScope = (): void => { this.$scope.component = this.injectComponent; this.$scope.menuComponentTitle = this.$scope.component.name; this.$scope.disabledButtons = false; this.$scope.originComponent = this.ComponentFactory.createComponent(this.$scope.component); this.$scope.componentType = this.$scope.component.componentType; this.$scope.version = this.cacheService.get('version'); this.$scope.user = this.cacheService.get("user"); this.role = this.$scope.user.role; this.$scope.mode = this.initViewMode(); this.$scope.isValidForm = true; this.initChangeLifecycleStateButtons(); this.initVersionObject(); this.$scope.$state = this.$state; this.$scope.isLoading = false; this.$scope.isComposition = (this.$state.current.name.indexOf(Utils.Constants.States.WORKSPACE_COMPOSITION) > -1); this.$scope.isDeployment = (this.$state.current.name.indexOf(Utils.Constants.States.WORKSPACE_DEPLOYMENT) > -1); this.$scope.progressService = this.progressService; this.$scope.getComponent = (): Sdc.Models.Components.Component => { return this.$scope.component; }; this.$scope.updateMenuComponentName = (ComponentName: string): void => { this.$scope.menuComponentTitle = ComponentName; }; this.$scope.sdcMenu = this.sdcMenu; // Will be called from each step after save to update the resource. this.$scope.setComponent = (component: Sdc.Models.Components.Component): void => { this.$scope.component = component; }; this.$scope.uploadFileChangedInGeneralTab = (): void => { // In case user select browse file, and in update mode, need to disable submit for testing and checkin buttons. if (this.$scope.isEditMode() && this.$scope.component.isResource() && (this.$scope.component).resourceType == ResourceType.VF) { this.$scope.disabledButtons = true; } }; this.$scope.onMenuItemPressed = (state: string): ng.IPromise => { let deferred = this.$q.defer(); if (this.isNeedSave()) { if (this.$scope.isValidForm) { let onSuccess = (): void => { this.$state.go(state, { id: this.$scope.component.uniqueId, type: this.$scope.component.componentType.toLowerCase(), components: this.components }); deferred.resolve(true); }; this.$scope.save().then(onSuccess); } else { console.log('form is not valid'); deferred.reject(false); } } else { this.$state.go(state, { id: this.$scope.component.uniqueId, type: this.$scope.component.componentType.toLowerCase(), components: this.components }); deferred.resolve(true); } return deferred.promise; }; this.$scope.setValidState = (isValid: boolean): void => { this.$scope.isValidForm = isValid; }; this.$scope.onVersionChanged = (selectedId: string): void => { this.$scope.isLoading = true; if (this.$state.current.data && this.$state.current.data.unsavedChanges) { this.$scope.changeVersion.selectedVersion = _.find(this.$scope.versionsList, {versionId: this.$scope.component.uniqueId}); } this.$state.go(this.$state.current.name, { id: selectedId, type: this.$scope.componentType.toLowerCase(), mode: Utils.Constants.WorkspaceMode.VIEW, components: this.$state.params['components'] }); }; this.$scope.getLatestVersion = (): void => { this.$scope.onVersionChanged(_.first(this.$scope.versionsList).versionId); }; this.$scope.save = (state?: string): ng.IPromise => { this.EventListenerService.notifyObservers(Utils.Constants.EVENTS.ON_WORKSPACE_SAVE_BUTTON_CLICK); this.progressService.initCreateComponentProgress(this.$scope.component.uniqueId); let deferred = this.$q.defer(); let modalInstance: ng.ui.bootstrap.IModalServiceInstance; let onFailed = () => { this.EventListenerService.notifyObservers(Utils.Constants.EVENTS.ON_WORKSPACE_SAVE_BUTTON_ERROR); this.progressService.deleteProgressValue(this.$scope.component.uniqueId); modalInstance && modalInstance.close(); // Close the modal in case it is opened. this.$scope.isCreateProgress = false; this.$scope.isLoading = false; // stop the progress. this.$scope.setValidState(true); // Set the form valid (if sent form is valid, the error from server). if (!this.$scope.isCreateMode()) { this.$scope.component = this.$scope.originComponent; // Set the component back to the original. this.enableMenuItems(); // Enable the menu items (left tabs), so user can press on them. this.$scope.disabledButtons = false; // Enable "submit for testing" & checking buttons. } deferred.reject(false); }; let onSuccessCreate = (component: Models.Components.Component) => { this.EventListenerService.notifyObservers(Utils.Constants.EVENTS.ON_WORKSPACE_SAVE_BUTTON_SUCCESS); this.progressService.deleteProgressValue(this.$scope.component.uniqueId); //update components for breadcrumbs this.components.unshift(component); this.$state.go(Utils.Constants.States.WORKSPACE_GENERAL, { id: component.uniqueId, type: component.componentType.toLowerCase(), components: this.components }); deferred.resolve(true); }; let onSuccessUpdate = (component: Models.Components.Component) => { this.$scope.isCreateProgress = false; this.$scope.disabledButtons = false; this.EventListenerService.notifyObservers(Utils.Constants.EVENTS.ON_WORKSPACE_SAVE_BUTTON_SUCCESS); this.progressService.deleteProgressValue(this.$scope.component.uniqueId); // Stop the circle loader. this.$scope.isLoading = false; component.tags = _.reject(component.tags, (item)=> { return item === component.name }); // Update the components this.$scope.component = component; this.$scope.originComponent = this.ComponentFactory.createComponent(this.$scope.component); //update components for breadcrumbs this.components.unshift(component); // Enable left tags this.$scope.enabledTabs(); if (this.$state.current.data) { this.$state.current.data.unsavedChanges = false; } deferred.resolve(true); }; if (this.$scope.isCreateMode()) { this.$scope.progressMessage = "Creating Asset..."; // CREATE MODE this.$scope.isCreateProgress = true; // Start creating the component this.ComponentFactory.createComponentOnServer(this.$scope.component).then(onSuccessCreate, onFailed); // In case we import CSAR. Notify user that import VF will take long time (the create is performed in the background). if (this.$scope.component.isResource() && (this.$scope.component).csarUUID) { this.Notification.info({ message: this.$filter('translate')("IMPORT_VF_MESSAGE_CREATE_TAKES_LONG_TIME_DESCRIPTION"), title: this.$filter('translate')("IMPORT_VF_MESSAGE_CREATE_TAKES_LONG_TIME_TITLE") }); } } else { // UPDATE MODE this.$scope.isCreateProgress = true; this.$scope.progressMessage = "Updating Asset..."; this.disableMenuItems(); // Work around to change the csar version if (this.cacheService.get(Utils.Constants.CHANGE_COMPONENT_CSAR_VERSION_FLAG)) { (this.$scope.component).csarVersion = this.cacheService.get(Utils.Constants.CHANGE_COMPONENT_CSAR_VERSION_FLAG); this.cacheService.remove(Utils.Constants.CHANGE_COMPONENT_CSAR_VERSION_FLAG); } this.$scope.component.updateComponent().then(onSuccessUpdate, onFailed); } return deferred.promise; }; this.$scope.revert = (): void => { //in state of import file leave the file in place if (this.$scope.component.isResource() && (this.$scope.component).importedFile) { let tempFile: Sdc.Directives.FileUploadModel = (this.$scope.component).importedFile; this.$scope.component = this.ComponentFactory.createComponent(this.$scope.originComponent); (this.$scope.component).importedFile = tempFile; } else { this.$scope.component = this.ComponentFactory.createComponent(this.$scope.originComponent); } }; this.$scope.changeLifecycleState = (state: string): void => { if (this.isNeedSave() && state !== 'deleteVersion') { this.$scope.save().then(() => { changeLifecycleState(state); }) } else { changeLifecycleState(state); } }; let defaultActionAfterChangeLifecycleState = (): void => { if (this.$state.current.data && this.$state.current.data.unsavedChanges) { this.$state.current.data.unsavedChanges = false; } this.$state.go('dashboard'); }; let changeLifecycleState = (state: string) => { if ('monitor' === state) { this.$state.go('workspace.distribution'); return; } let data = this.$scope.changeLifecycleStateButtons[state]; let onSuccess = (component: Models.Components.Component): void => { //Updating the component from server response //the server returns only metaData (small component) except checkout (Full component) ,so we update only the statuses of distribution & lifecycle this.$scope.component.lifecycleState = component.lifecycleState; this.$scope.component.distributionStatus = component.distributionStatus; switch (data.url) { case 'lifecycleState/CHECKOUT': // only checkOut get the full component from server this.$scope.component = component; // Work around to change the csar version if (this.cacheService.get(Utils.Constants.CHANGE_COMPONENT_CSAR_VERSION_FLAG)) { (this.$scope.component).csarVersion = this.cacheService.get(Utils.Constants.CHANGE_COMPONENT_CSAR_VERSION_FLAG); } //when checking out a minor version uuid remains let bcComponent: Sdc.Models.Components.Component = _.find(this.components, (item) => { return item.uuid === component.uuid; }); if (bcComponent) { this.components[this.components.indexOf(bcComponent)] = component; } else { //when checking out a major(certified) version this.components.unshift(component); } this.$state.go(this.$state.current.name, { id: component.uniqueId, type: component.componentType.toLowerCase(), components: this.components }); this.Notification.success({ message: this.$filter('translate')("CHECKOUT_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("CHECKOUT_SUCCESS_MESSAGE_TITLE") }); break; case 'lifecycleState/CHECKIN': defaultActionAfterChangeLifecycleState(); this.Notification.success({ message: this.$filter('translate')("CHECKIN_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("CHECKIN_SUCCESS_MESSAGE_TITLE") }); break; case 'lifecycleState/UNDOCHECKOUT': defaultActionAfterChangeLifecycleState(); this.Notification.success({ message: this.$filter('translate')("DELETE_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("DELETE_SUCCESS_MESSAGE_TITLE") }); break; case 'lifecycleState/certificationRequest': defaultActionAfterChangeLifecycleState(); this.Notification.success({ message: this.$filter('translate')("SUBMIT_FOR_TESTING_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("SUBMIT_FOR_TESTING_SUCCESS_MESSAGE_TITLE") }); break; //Tester Role case 'lifecycleState/failCertification': defaultActionAfterChangeLifecycleState(); this.Notification.success({ message: this.$filter('translate')("REJECT_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("REJECT_SUCCESS_MESSAGE_TITLE") }); break; case 'lifecycleState/certify': defaultActionAfterChangeLifecycleState(); this.Notification.success({ message: this.$filter('translate')("ACCEPT_TESTING_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("ACCEPT_TESTING_SUCCESS_MESSAGE_TITLE") }); break; //DE203504 Bug Fix Start case 'lifecycleState/startCertification': this.initChangeLifecycleStateButtons(); this.Notification.success({ message: this.$filter('translate')("START_TESTING_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("START_TESTING_SUCCESS_MESSAGE_TITLE") }); break; case 'lifecycleState/cancelCertification': this.initChangeLifecycleStateButtons(); this.Notification.success({ message: this.$filter('translate')("CANCEL_TESTING_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("CANCEL_TESTING_SUCCESS_MESSAGE_TITLE") }); break; //Ops Role case 'distribution/PROD/activate': this.initChangeLifecycleStateButtons(); this.Notification.success({ message: this.$filter('translate')("DISTRIBUTE_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("DISTRIBUTE_SUCCESS_MESSAGE_TITLE") }); break; //Governor Role case 'distribution-state/reject': this.initChangeLifecycleStateButtons(); this.Notification.success({ message: this.$filter('translate')("REJECT_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("REJECT_SUCCESS_MESSAGE_TITLE") }); break; case 'distribution-state/approve': this.initChangeLifecycleStateButtons(); this.$state.go('catalog'); this.Notification.success({ message: this.$filter('translate')("APPROVE_SUCCESS_MESSAGE_TEXT"), title: this.$filter('translate')("APPROVE_SUCCESS_MESSAGE_TITLE") }); break; //DE203504 Bug Fix End default : defaultActionAfterChangeLifecycleState(); } if (data.url != 'lifecycleState/CHECKOUT') { this.$scope.isLoading = false; } }; //this.$scope.isLoading = true; this.ChangeLifecycleStateHandler.changeLifecycleState(this.$scope.component, data, this.$scope, onSuccess); }; this.$scope.enabledTabs = (): void => { this.$scope.leftBarTabs.menuItems.forEach((item: Utils.MenuItem) => { item.isDisabled = false; }); }; this.$scope.isViewMode = (): boolean => { return this.$scope.mode === Utils.Constants.WorkspaceMode.VIEW; }; this.$scope.isDesigner = (): boolean => { return this.role == Utils.Constants.Role.DESIGNER; }; this.$scope.isDisableMode = (): boolean => { return this.$scope.mode === Utils.Constants.WorkspaceMode.VIEW && this.$scope.component.lifecycleState === Utils.Constants.ComponentState.NOT_CERTIFIED_CHECKIN; }; this.$scope.showFullIcons = (): boolean => { //we show revert and save icons only in general\icon view return this.$state.current.name === Utils.Constants.States.WORKSPACE_GENERAL || this.$state.current.name === Utils.Constants.States.WORKSPACE_ICONS; }; this.$scope.isCreateMode = (): boolean => { return this.$scope.mode === Utils.Constants.WorkspaceMode.CREATE; }; this.$scope.isEditMode = (): boolean => { return this.$scope.mode === Utils.Constants.WorkspaceMode.EDIT; }; this.$scope.goToBreadcrumbHome = (): void => { let bcHome: Sdc.Utils.MenuItemGroup = this.$scope.breadcrumbsModel[0]; this.$state.go(bcHome.menuItems[bcHome.selectedIndex].state); }; this.$scope.showLifecycleIcon = (): boolean => { return this.role == Utils.Constants.Role.DESIGNER || this.role == Utils.Constants.Role.PRODUCT_MANAGER; }; this.$scope.getStatus = (): string => { if (this.$scope.isCreateMode()) { return 'IN DESIGN'; } return this.$scope.component.getStatus(this.sdcMenu); }; this.initMenuItems(); this.$scope.showChangeStateButton = (): boolean => { let result: boolean = true; if (!this.$scope.component.isLatestVersion() && Utils.Constants.Role.OPS != this.role && Utils.Constants.Role.GOVERNOR != this.role) { result = false; } if (this.role === Utils.Constants.Role.PRODUCT_MANAGER && !this.$scope.component.isProduct()) { result = false; } if ((this.role === Utils.Constants.Role.DESIGNER || this.role === Utils.Constants.Role.TESTER) && this.$scope.component.isProduct()) { result = false; } if (Utils.Constants.ComponentState.NOT_CERTIFIED_CHECKOUT === this.$scope.component.lifecycleState && this.$scope.isViewMode()) { result = false; } if (Utils.Constants.ComponentState.CERTIFIED != this.$scope.component.lifecycleState && (Utils.Constants.Role.OPS == this.role || Utils.Constants.Role.GOVERNOR == this.role)) { result = false; } return result; }; this.$scope.updateSelectedMenuItem = (): void => { let selectedItem: Sdc.Utils.MenuItem = _.find(this.$scope.leftBarTabs.menuItems, (item: Sdc.Utils.MenuItem) => { return item.state === this.$state.current.name; }); this.$scope.leftBarTabs.selectedIndex = selectedItem ? this.$scope.leftBarTabs.menuItems.indexOf(selectedItem) : 0; }; this.$scope.$watch('$state.current.name', (newVal: string): void => { if (newVal) { this.$scope.isComposition = (newVal.indexOf(Utils.Constants.States.WORKSPACE_COMPOSITION) > -1); this.$scope.isDeployment = (newVal.indexOf(Utils.Constants.States.WORKSPACE_DEPLOYMENT) > -1); } }); }; private initAfterScope = (): void => { // In case user select csar from the onboarding modal, need to disable checkout and submit for testing. if (this.$state.params['disableButtons'] === true) { this.$scope.uploadFileChangedInGeneralTab(); } }; private initVersionObject = (): void => { this.$scope.versionsList = (this.$scope.component.getAllVersionsAsSortedArray()).reverse(); this.$scope.changeVersion = {selectedVersion: _.find(this.$scope.versionsList, {versionId: this.$scope.component.uniqueId})}; }; private getNewComponentBreadcrumbItem = (): Utils.MenuItem => { let text = ""; if (this.$scope.component.isResource() && (this.$scope.component).isCsarComponent()) { text = this.$scope.component.getComponentSubType() + ': ' + this.$scope.component.name; } else { text = 'Create new ' + this.$state.params['type']; } return new Utils.MenuItem(text, null, Utils.Constants.States.WORKSPACE_GENERAL, 'goToState', [this.$state.params]); }; private updateMenuItemByRole = (menuItems: Array, role: string) => { let tempMenuItems: Array = new Array(); menuItems.forEach((item: Utils.MenuItem) => { //remove item if role is disabled if (!(item.disabledRoles && item.disabledRoles.indexOf(role) > -1)) { tempMenuItems.push(item); } }); return tempMenuItems; }; private initBreadcrumbs = () => { this.components = this.cacheService.get('breadcrumbsComponents'); let breadcrumbsComponentsLvl = this.MenuHandler.generateBreadcrumbsModelFromComponents(this.components, this.$scope.component); if (this.$scope.isCreateMode()) { let createItem = this.getNewComponentBreadcrumbItem(); if (!breadcrumbsComponentsLvl.menuItems) { breadcrumbsComponentsLvl.menuItems = []; } breadcrumbsComponentsLvl.menuItems.unshift(createItem); breadcrumbsComponentsLvl.selectedIndex = 0; } this.$scope.breadcrumbsModel = [breadcrumbsComponentsLvl, this.$scope.leftBarTabs]; }; private initMenuItems() { let inCreateMode = this.$scope.isCreateMode(); this.$scope.leftBarTabs = new Utils.MenuItemGroup(); this.$scope.leftBarTabs.menuItems = this.updateMenuItemByRole(this.sdcMenu.component_workspace_menu_option[this.$scope.component.getComponentSubType()], this.role); this.$scope.leftBarTabs.menuItems.forEach((item: Utils.MenuItem) => { item.params = [item.state]; item.callback = this.$scope.onMenuItemPressed; item.isDisabled = (inCreateMode && Utils.Constants.States.WORKSPACE_GENERAL != item.state) || (Utils.Constants.States.WORKSPACE_DEPLOYMENT === item.state && this.$scope.component.groups.length === 0 && this.$scope.component.isResource()); }); if (this.cacheService.get('breadcrumbsComponents')) { this.initBreadcrumbs(); } else { let onSuccess = (components: Array) => { this.cacheService.set('breadcrumbsComponents', components); this.initBreadcrumbs(); }; this.EntityService.getCatalog().then(onSuccess); //getAllComponents() doesnt return components from catalog } } private disableMenuItems() { this.$scope.leftBarTabs.menuItems.forEach((item: Utils.MenuItem) => { item.params = [item.state]; item.callback = this.$scope.onMenuItemPressed; item.isDisabled = (Utils.Constants.States.WORKSPACE_GENERAL != item.state); }); } private enableMenuItems() { this.$scope.leftBarTabs.menuItems.forEach((item: Utils.MenuItem) => { item.params = [item.state]; item.callback = this.$scope.onMenuItemPressed; item.isDisabled = false; }); } } }