/** * Created by nnaffar on 12/20/15. */ 'use strict'; (function () { class MenuDetailsModalCtrl { constructor($scope, $log, functionalMenuService, errorMessageByCode, ECOMP_URL_REGEX,$rootScope,confirmBoxService,items) { $scope.ngDialogData=items; $scope.isAllApplications = false; let newMenuModel = { name: null, menuId: null, parentMenuId: null, url: null }; let getAvailableRoles = (appid) => { this.isSaving = true; if (appid != null) { $log.debug("MenuDetailsModalCtrl::getAvailableRoles: About to call getManagedRolesMenu"); functionalMenuService.getManagedRolesMenu(appid).then(rolesObj => { $log.debug("MenuDetailsModalCtrl::getAvailableRoles: Roles returned = " + JSON.stringify(rolesObj)) this.availableRoles = rolesObj; this.preSelectedRoles = {roles:[]}; if(($scope.ngDialogData.source==='edit') && this.isMidLevelMenuItem()){ // in Edit flow , for Midlevel menu item no need to preSelect. this.preSelectedRoles = {roles:[]}; }else if(!angular.isUndefined(this.menuItem.menuDetails) && $scope.ngDialogData.source==='edit' && this.isLeafMenuItem() && this.menuItem.menuDetails.appid!=appid) { // in Edit flow , for LeafMenuItem, if appid changed then no need to preSelect. this.preSelectedRoles = {roles:[]}; }else{ if((!angular.isUndefined(this.menuItem.menuDetails)) && (!angular.isUndefined(this.menuItem.menuDetails.roles))){ $log.debug('menuDetails.roles: ' + this.menuItem.menuDetails.roles); for(var i=0; i { $log.error("MenuDetailsModalCtrl::getAvailableRoles: error: " + err); }); } else { $log.debug("MenuDetailsModalCtrl::getAvailableRoles: appid was null"); } }; let getAvailableApps = () => { $scope.isAllApplications = true; functionalMenuService.getAvailableApplications().then(apps => { $log.debug("MenuDetailsModalCtrl::getAvailableApps: Apps returned = " + JSON.stringify(apps)) this.availableApps = apps; // Keep track of whether or not the selected app is disabled if (angular.isDefined(this.selectedApp) && angular.isDefined(this.selectedApp.index)) { for (var i = 0; i < apps.length; i++) { if (apps[i].index === this.selectedApp.index) { $log.debug("MenuDetailsModalCtrl::getAvailableApps: found app with index: " + this.selectedApp.index); $log.debug("MenuDetailsModalCtrl::getAvailableApps: setting isDisabled to: " + !apps[i].enabled); this.selectedApp.isDisabled = !apps[i].enabled; break; } } $log.debug("didn't find index: " + this.selectedApp.index); } })['catch'](function (err) { confirmBoxService.showInformation('There was a problem retrieving the Applications. ' + 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {}); $log.error("MenuDetailsModalCtrl::getAvailableApps: getAvailableApps error: " + err); $scope.isAllApplications = false; }).finally(()=>{ this.isSaving = false; $scope.isAllApplications = false; }); }; let init = () => { $scope.isAllApplications = false; $log.info('MenuDetailsModalCtrl::init'); this.saveOrContinueBtnText = "Save"; this.isSaving = false; this.displayRoles = $scope.ngDialogData.source==='view' ? true : false; this.formEditable = $scope.ngDialogData.source==='view' ? false : true; this.selectedRole = []; this.availableRoles = []; this.selectedApp={}; this.menuItem = _.clone($scope.ngDialogData.menuItem); $log.info('MenuDetailsModalCtrl::getAvailableApps: Within init, about to check menuDetails for defined'); if(!angular.isUndefined(this.menuItem.menuDetails) && ($scope.ngDialogData.source==='view' || ($scope.ngDialogData.source==='edit') && this.isLeafMenuItem() )){ $log.debug("MenuDetailsModalCtrl::init: menuItem: "); $log.debug('MenuDetailsModalCtrl::init: ',this.menuItem); this.menuItem.menu.url = this.menuItem.menuDetails.url; this.selectedAppIndex=this.menuItem.menuDetails.appid; this.selectedApp.index = this.menuItem.menuDetails.appid; getAvailableRoles(this.selectedApp.index); } if($scope.ngDialogData.source==='view' || $scope.ngDialogData.source==='edit'){ this.menutitle = this.menuItem.menu.name; this.menuLocation = this.isParentMenuItem() ? this.menuItem.menu.name : this.menuItem.menu.parent.name; }else{ this.menutitle = ''; this.menuLocation = this.menuItem.menu.name; } // Temporarily passing 0 as dummy for getAvailableRoles incase of this.selectedApp is not there i.e., in Add flow // getAvailableRoles(angular.isUndefined(this.selectedApp) ? 0: this.selectedApp.index ); getAvailableApps(); $log.debug("MenuDetailsModalCtrl::init: Menu details: " + JSON.stringify(this.menuItem.menuDetails)); }; this.ECOMP_URL_REGEX = ECOMP_URL_REGEX; //This part handles conflict errors (409) this.conflictMessages = {}; this.scrollApi = {}; let handleConflictErrors = err => { if(!err.data){ return; } if(!err.data.length){ //support objects err.data = [err.data] } $log.debug('MenuDetailsModalCtrl::handleConflictErrors: err.data = ' + JSON.stringify(err.data)); _.forEach(err.data, item => { _.forEach(item.fields, field => { //set conflict message this.conflictMessages[field.name] = errorMessageByCode[item.errorCode]; //set field as invalid $log.debug('MenuDetailsModalCtrl::handleConflictErrors: fieldName = ' + field.name); $scope.functionalMenuForm[field.name].$setValidity('conflict', false); //set watch once to clear error after user correction watchOnce[field.name](); }); }); this.scrollApi.scrollTop(); }; let resetConflict = fieldName => { delete this.conflictMessages[fieldName]; $log.debug('MenuDetailsModalCtrl::resetConflict: $setValidity(true) = ' + fieldName); if($scope.functionalMenuForm[fieldName]){ $scope.functionalMenuForm[fieldName].$setValidity('conflict', true); } }; let watchOnce = { text: () => { let unregisterName = $scope.$watch('functionalMenuDetails.menutitle', (newVal, oldVal) => { // $log.debug('title:: newVal, oldVal = ' + newVal.toLowerCase() + " | " + oldVal.toLowerCase()); if(newVal.toLowerCase() !== oldVal.toLowerCase()){ resetConflict('text'); unregisterName(); } }); }, url: () => { let unregisterUrl = $scope.$watch('functionalMenuDetails.menuItem.menu.url', (newVal, oldVal) => { if(newVal.toLowerCase() !== oldVal.toLowerCase()){ resetConflict('url'); unregisterUrl(); } }); } }; //*************************** this.isLeafMenuItem = () => { return this.menuItem.menu.children.length>0 ? false : true; }; this.isMidLevelMenuItem = () => { return this.menuItem.menu.parentMenuId!=null && this.menuItem.menu.children.length>0 ? true : false; }; this.isParentMenuItem = () => { return this.menuItem.menu.parentMenuId!=null ? false : true; }; this.isRoleSelected=()=>{ var selectedRoleIds=[]; for(var i=0;i { /*var appItemobj= JSON.parse(appItem); this.selectedApp=JSON.parse(this.selectedApp);*/ if (!appItem) { return; } var appobj={}; for(var i=0;i { this.displayRoles = true; this.formEditable = false; }; this.saveChanges = () => { //todo : form validation was commented as dialog message is kept for error validations /*if($scope.functionalMenuForm.$invalid){ return; }*/ if(!!this.menuItem.menu.url && (angular.isUndefined(this.selectedApp) || !this.selectedApp.index>0)) { confirmBoxService.showInformation('Please select the appropriate app, or remove the url').then(isConfirmed => {}); return; }else if(!this.menuItem.menu.url && !angular.isUndefined(this.selectedApp) && this.selectedApp.index>0){ confirmBoxService.showInformation('Please enter url, or select "No Application"').then(isConfirmed => {}); return; }else if(!this.menutitle){ confirmBoxService.showInformation('Please enter the Menu title').then(isConfirmed => {}); return; } this.isSaving = true; var activeMenuItem = {}; if ($scope.ngDialogData.source === 'edit') { // Edit Menu Item $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving an edit menu item'); var selectedRoleIds=[]; for(var i=0;i { $log.debug('MenuDetailsModalCtrl::saveChanges: Menu Item saved'); $scope.$close(true); }).catch(err => { if(err.status === 409){//Conflict handleConflictErrors(err); } else { confirmBoxService.showInformation('There was a problem saving your change. ' + 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {}); } $log.error('MenuDetailsModalCtrl::saveChanges: error - ',err); }).finally(()=>{ this.isSaving = false; }); $log.debug("MenuDetailsModalCtrl::saveChanges: Edit Menu output will be: " + JSON.stringify(activeMenuItem)); } else { // New Menu Item $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving a New menu item'); var selectedRoleIds=[]; for(var i=0;i { $log.debug('MenuDetailsModalCtrl::saveChanges: Menu Item saved'); // $scope.closeThisDialog(true); $scope.$dismiss('cancel'); }).catch(err => { if(err.status === 409){//Conflict handleConflictErrors(err); } else { confirmBoxService.showInformation('There was a problem saving your menu. ' + 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {}); } $log.error('MenuDetailsModalCtrl::saveChanges error: ', err); }).finally(()=>{ this.isSaving = false; }); } }; init(); $scope.$on('$stateChangeStart', e => { //Disable navigation when modal is opened e.preventDefault(); }); } } MenuDetailsModalCtrl.$inject = ['$scope', '$log', 'functionalMenuService', 'errorMessageByCode', 'ECOMP_URL_REGEX','$rootScope','confirmBoxService','items']; angular.module('ecompApp').controller('MenuDetailsModalCtrl', MenuDetailsModalCtrl); })();