2  * ============LICENSE_START==========================================
 
   4  * ===================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ===================================================================
 
   8  * Unless otherwise specified, all software contained herein is licensed
 
   9  * under the Apache License, Version 2.0 (the "License");
 
  10  * you may not use this software except in compliance with the License.
 
  11  * You may obtain a copy of the License at
 
  13  *             http://www.apache.org/licenses/LICENSE-2.0
 
  15  * Unless required by applicable law or agreed to in writing, software
 
  16  * distributed under the License is distributed on an "AS IS" BASIS,
 
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  18  * See the License for the specific language governing permissions and
 
  19  * limitations under the License.
 
  21  * Unless otherwise specified, all documentation contained herein is licensed
 
  22  * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
 
  23  * you may not use this documentation except in compliance with the License.
 
  24  * You may obtain a copy of the License at
 
  26  *             https://creativecommons.org/licenses/by/4.0/
 
  28  * Unless required by applicable law or agreed to in writing, documentation
 
  29  * distributed under the License is distributed on an "AS IS" BASIS,
 
  30  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  31  * See the License for the specific language governing permissions and
 
  32  * limitations under the License.
 
  34  * ============LICENSE_END============================================
 
  36  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
 
  40     class MenuDetailsModalCtrl {
 
  41         constructor($scope, $log, functionalMenuService, errorMessageByCode, $modalInstance, ECOMP_URL_REGEX,$rootScope,confirmBoxService,items) {
 
  42                 $scope.ngDialogData=items;
 
  43                 $scope.isAllApplications = false;
 
  51             let getAvailableRoles = (appid) => {
 
  53                     $log.debug("MenuDetailsModalCtrl::getAvailableRoles: About to call getManagedRolesMenu");
 
  54                     functionalMenuService.getManagedRolesMenu(appid).then(rolesObj => {
 
  55                         $log.debug("MenuDetailsModalCtrl::getAvailableRoles: Roles returned = " + JSON.stringify(rolesObj))
 
  56                         this.availableRoles = rolesObj;
 
  59                         this.preSelectedRoles = {roles:[]};
 
  61                         if(($scope.ngDialogData.source==='edit') && this.isMidLevelMenuItem()){
 
  62                             // in Edit flow , for Midlevel menu item no need to preSelect.
 
  63                             this.preSelectedRoles = {roles:[]};
 
  64                         }else if(!angular.isUndefined(this.menuItem.menuDetails) &&
 
  65                             $scope.ngDialogData.source==='edit' && this.isLeafMenuItem() &&
 
  66                             this.menuItem.menuDetails.appid!=appid) {
 
  67                             // in Edit flow , for LeafMenuItem, if appid changed then no need to preSelect.
 
  68                             this.preSelectedRoles = {roles:[]};
 
  70                             if((!angular.isUndefined(this.menuItem.menuDetails)) &&
 
  71                                 (!angular.isUndefined(this.menuItem.menuDetails.roles))){
 
  72                                     $log.debug('menuDetails.roles: ' + this.menuItem.menuDetails.roles);
 
  73                                     for(var i=0; i<this.menuItem.menuDetails.roles.length; i++){
 
  74                                         var role = {"roleId":this.menuItem.menuDetails.roles[i]};
 
  75                                         $log.debug('MenuDetailsModalCtrl::getAvailableRoles: adding role to preselected: ' + i + ': ' + JSON.stringify(role));
 
  76                                         this.preSelectedRoles.roles.push(role);
 
  81                         $rootScope.$broadcast('availableRolesReady');
 
  82                         for(var i=0; i<rolesObj.length;i++){
 
  83                                 this.availableRoles[i].isApplied = false;
 
  84                                 for(var j=0;j<this.preSelectedRoles.roles.length;j++){
 
  85                                         if(this.preSelectedRoles.roles[j].roleId==this.availableRoles[i].roleId){
 
  86                                                 this.availableRoles[i].isApplied=true;
 
  94                         $log.error("MenuDetailsModalCtrl::getAvailableRoles: error: " + err);
 
  97                     $log.debug("MenuDetailsModalCtrl::getAvailableRoles: appid was null");
 
 101             let getAvailableApps = () => {
 
 102                 $scope.isAllApplications = true;
 
 103                 functionalMenuService.getAvailableApplications().then(apps => {
 
 104                     $log.debug("MenuDetailsModalCtrl::getAvailableApps: Apps returned = " + JSON.stringify(apps))
 
 105                     this.availableApps = apps;
 
 106                     // Keep track of whether or not the selected app is disabled
 
 107                     if (angular.isDefined(this.selectedApp) && angular.isDefined(this.selectedApp.index)) {
 
 108                         for (var i = 0; i < apps.length; i++) {
 
 109                             if (apps[i].index === this.selectedApp.index) {
 
 110                                 $log.debug("MenuDetailsModalCtrl::getAvailableApps: found app with index: " + this.selectedApp.index);
 
 111                                 $log.debug("MenuDetailsModalCtrl::getAvailableApps: setting isDisabled to: " + !apps[i].enabled);
 
 112                                 this.selectedApp.isDisabled = !apps[i].enabled;
 
 116                         $log.debug("didn't find index: " + this.selectedApp.index);
 
 118                 })['catch'](function (err) {
 
 119                     confirmBoxService.showInformation('There was a problem retrieving the Applications. ' +
 
 120                         'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});
 
 121                     $log.error("MenuDetailsModalCtrl::getAvailableApps: getAvailableApps error: " + err);
 
 122                     $scope.isAllApplications = false;
 
 124                     this.isSaving = false;
 
 125                     $scope.isAllApplications = false;
 
 130                 $scope.isAllApplications = false;
 
 131                 $log.info('MenuDetailsModalCtrl::init');
 
 132                 this.saveOrContinueBtnText = "Save";
 
 133                 this.isSaving = false;
 
 134                 this.displayRoles = $scope.ngDialogData.source==='view' ? true : false;
 
 135                 this.formEditable = $scope.ngDialogData.source==='view' ? false : true;
 
 136                 this.selectedRole = [];
 
 137                 this.availableRoles = [];
 
 139                 this.menuItem = _.clone($scope.ngDialogData.menuItem);
 
 140                 $log.info('MenuDetailsModalCtrl::getAvailableApps: Within init, about to check menuDetails for defined');
 
 141                 if(!angular.isUndefined(this.menuItem.menuDetails) &&
 
 142                     ($scope.ngDialogData.source==='view' ||
 
 143                     ($scope.ngDialogData.source==='edit') && this.isLeafMenuItem() )){
 
 145                     $log.debug("MenuDetailsModalCtrl::init: menuItem: ");
 
 146                     $log.debug('MenuDetailsModalCtrl::init: ',this.menuItem);
 
 147                     this.menuItem.menu.url = this.menuItem.menuDetails.url;
 
 148                     this.selectedAppIndex=this.menuItem.menuDetails.appid;
 
 149                     this.selectedApp.index = this.menuItem.menuDetails.appid;
 
 150                     getAvailableRoles(this.selectedApp.index);
 
 154                 if($scope.ngDialogData.source==='view' || $scope.ngDialogData.source==='edit'){
 
 155                     this.menutitle = this.menuItem.menu.name;
 
 156                     this.menuLocation = this.isParentMenuItem() ? this.menuItem.menu.name : this.menuItem.menu.parent.name;
 
 159                     this.menuLocation = this.menuItem.menu.name;
 
 161                 // Temporarily passing 0 as dummy for getAvailableRoles incase of this.selectedApp is not there i.e., in Add flow
 
 162                 //  getAvailableRoles(angular.isUndefined(this.selectedApp) ? 0: this.selectedApp.index );
 
 164                 $log.debug("MenuDetailsModalCtrl::init: Menu details: " +  JSON.stringify(this.menuItem.menuDetails));
 
 168             this.ECOMP_URL_REGEX = ECOMP_URL_REGEX;
 
 170             //This part handles conflict errors (409)
 
 171             this.conflictMessages = {};
 
 173             let handleConflictErrors = err => {
 
 177                 if(!err.data.length){ //support objects
 
 178                     err.data = [err.data]
 
 180                 $log.debug('MenuDetailsModalCtrl::handleConflictErrors: err.data = ' + JSON.stringify(err.data));
 
 181                 _.forEach(err.data, item => {
 
 182                     _.forEach(item.fields, field => {
 
 183                         //set conflict message
 
 184                         this.conflictMessages[field.name] = errorMessageByCode[item.errorCode];
 
 185                         //set field as invalid
 
 186                         $log.debug('MenuDetailsModalCtrl::handleConflictErrors: fieldName = ' + field.name);
 
 187                         $scope.functionalMenuForm[field.name].$setValidity('conflict', false);
 
 188                         //set watch once to clear error after user correction
 
 189                         watchOnce[field.name]();
 
 192                 this.scrollApi.scrollTop();
 
 195             let resetConflict = fieldName => {
 
 196                 delete this.conflictMessages[fieldName];
 
 197                 $log.debug('MenuDetailsModalCtrl::resetConflict: $setValidity(true) = ' + fieldName);
 
 198                 if($scope.functionalMenuForm[fieldName]){
 
 199                     $scope.functionalMenuForm[fieldName].$setValidity('conflict', true);
 
 205                     let unregisterName = $scope.$watch('functionalMenuDetails.menutitle', (newVal, oldVal) => {
 
 206                         // $log.debug('title:: newVal, oldVal = ' + newVal.toLowerCase() + " | " + oldVal.toLowerCase());
 
 207                         if(newVal.toLowerCase() !== oldVal.toLowerCase()){
 
 208                             resetConflict('text');
 
 214                     let unregisterUrl = $scope.$watch('functionalMenuDetails.menuItem.menu.url', (newVal, oldVal) => {
 
 215                         if(newVal.toLowerCase() !== oldVal.toLowerCase()){
 
 216                             resetConflict('url');
 
 223             //***************************
 
 225             this.isLeafMenuItem = () => {
 
 226                 return this.menuItem.menu.children.length>0 ? false : true;
 
 229             this.isMidLevelMenuItem = () => {
 
 230                 return this.menuItem.menu.parentMenuId!=null && this.menuItem.menu.children.length>0 ? true : false;
 
 233             this.isParentMenuItem = () => {
 
 234                 return this.menuItem.menu.parentMenuId!=null ? false : true;
 
 237             this.isRoleSelected=()=>{
 
 238                 var selectedRoleIds=[];
 
 239                  for(var i=0;i<this.availableRoles.length;i++){
 
 240                         if(this.availableRoles[i].isApplied){
 
 241                         selectedRoleIds.push(this.availableRoles[i].roleId);
 
 249             this.updateSelectedApp = (appItem) => {
 
 250                 /*var appItemobj= JSON.parse(appItem);
 
 251                 this.selectedApp=JSON.parse(this.selectedApp);*/
 
 256                 for(var i=0;i<this.availableApps.length;i++ ){
 
 257                         if(this.availableApps[i].index==appItem){
 
 258                                 appobj=this.availableApps[i];
 
 262                 $log.debug('MenuDetailsModalCtrl::updateSelectedApp: drop down app item = ' + JSON.stringify(appItem.index));
 
 263                 $log.debug("MenuDetailsModalCtrl::updateSelectedApp: appItem in updateSelectedApp: ");
 
 264                 $log.debug('MenuDetailsModalCtrl::updateSelectedApp: ',appItem);
 
 265                 if (appItem !== "Select Application"){
 
 266                                 this.selectedApp.isDisabled = ! appobj.enabled;
 
 268                 this.selectedApp.index=appobj.index;
 
 269                  $log.debug("MenuDetailsModalCtrl::updateSelectedApp: isDisabled: "+this.selectedApp.isDisabled);
 
 270                 getAvailableRoles(appobj.index);
 
 273             this.continue = () => {
 
 274                 this.displayRoles = true;
 
 275                 this.formEditable = false;
 
 278             this.saveChanges = () => {
 
 280                 //todo : form validation was commented as dialog message is kept for error validations
 
 281                 /*if($scope.functionalMenuForm.$invalid){
 
 284                 if(!!this.menuItem.menu.url && (angular.isUndefined(this.selectedApp) || !this.selectedApp.index>0)) {
 
 285                     confirmBoxService.showInformation('Please select the appropriate app, or remove the url').then(isConfirmed => {});
 
 287                 }else if(!this.menuItem.menu.url && !angular.isUndefined(this.selectedApp) && this.selectedApp.index>0){
 
 288                     confirmBoxService.showInformation('Please enter url, or select "No Application"').then(isConfirmed => {});
 
 290                 }else if(!this.menutitle){
 
 291                     confirmBoxService.showInformation('Please enter the Menu title').then(isConfirmed => {});
 
 295                 this.isSaving = true;
 
 296                 var activeMenuItem = {};
 
 298                 if ($scope.ngDialogData.source === 'edit') {     // Edit Menu Item
 
 299                     $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving an edit menu item');
 
 300                     var selectedRoleIds=[];
 
 301                     for(var i=0;i<this.availableRoles.length;i++){
 
 302                         if(this.availableRoles[i].isApplied){
 
 303                         selectedRoleIds.push(this.availableRoles[i].roleId);
 
 307                         menuId:this.menuItem.menu.menuId,
 
 308                         column:this.menuItem.menu.column,
 
 310                         parentMenuId:this.menuItem.menu.parentMenuId,
 
 311                         url:this.menuItem.menu.url,
 
 313                         appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,
 
 315                         roles:selectedRoleIds
 
 318                    // alert(activeMenuItem);
 
 319                     // If we have removed the url and appid, we must remove the roles
 
 320                     if (!activeMenuItem.appid && !activeMenuItem.url) {
 
 321                         activeMenuItem.roles = null;
 
 323                     functionalMenuService.saveEditedMenuItem(activeMenuItem)
 
 325                             $log.debug('MenuDetailsModalCtrl::saveChanges:  Menu Item saved');
 
 328                         if(err.status === 409){//Conflict
 
 329                             handleConflictErrors(err);
 
 331                             confirmBoxService.showInformation('There was a problem saving your change. ' +
 
 332                                 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});
 
 334                         $log.error('MenuDetailsModalCtrl::saveChanges: error - ',err);
 
 336                         this.isSaving = false;
 
 339                     $log.debug("MenuDetailsModalCtrl::saveChanges: Edit Menu output will be: " + JSON.stringify(activeMenuItem));
 
 340                 } else {   // New Menu Item
 
 341                     $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving a New menu item');
 
 342                     var selectedRoleIds=[];
 
 343                     for(var i=0;i<this.availableRoles.length;i++){
 
 344                         if(this.availableRoles[i].isApplied){
 
 345                         selectedRoleIds.push(this.availableRoles[i].roleId);
 
 349                         menuId:null, // this is a new menu item
 
 350                         column:this.menuItem.menu.column,
 
 352                         // We are creating this new menu item under the menu item that was clicked on.
 
 353                         parentMenuId:this.menuItem.menu.menuId,
 
 354                         url:this.menuItem.menu.url,
 
 355                         appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,
 
 356                         roles:selectedRoleIds
 
 359                     $log.debug("MenuDetailsModalCtrl::saveChanges:  New Menu output will be: " + JSON.stringify(newMenuItem));
 
 360                     functionalMenuService.saveMenuItem(newMenuItem)
 
 362                             $log.debug('MenuDetailsModalCtrl::saveChanges:  Menu Item saved');
 
 363                            // $scope.closeThisDialog(true);
 
 364                             $modalInstance.close("confirmed");
 
 366                         if(err.status === 409){//Conflict
 
 367                             handleConflictErrors(err);
 
 369                             confirmBoxService.showInformation('There was a problem saving your menu. ' +
 
 370                                 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});
 
 372                         $log.error('MenuDetailsModalCtrl::saveChanges error: ', err);
 
 374                         this.isSaving = false;
 
 382             $scope.$on('$stateChangeStart', e => {
 
 383                 //Disable navigation when modal is opened
 
 388     MenuDetailsModalCtrl.$inject = ['$scope', '$log', 'functionalMenuService', 'errorMessageByCode', '$modalInstance', 'ECOMP_URL_REGEX','$rootScope','confirmBoxService','items'];
 
 389     angular.module('ecompApp').controller('MenuDetailsModalCtrl', MenuDetailsModalCtrl);