2 * Created by nnaffar on 12/20/15.
6 class MenuDetailsModalCtrl {
7 constructor($scope, $log, functionalMenuService, errorMessageByCode, ECOMP_URL_REGEX,$rootScope,confirmBoxService) {
9 $scope.isAllApplications = false;
17 let getAvailableRoles = (appid) => {
20 $log.debug("MenuDetailsModalCtrl::getAvailableRoles: About to call getManagedRolesMenu");
21 functionalMenuService.getManagedRolesMenu(appid).then(rolesObj => {
22 $log.debug("MenuDetailsModalCtrl::getAvailableRoles: Roles returned = " + JSON.stringify(rolesObj))
23 this.availableRoles = rolesObj;
24 this.preSelectedRoles = {roles:[]};
26 if(($scope.ngDialogData.source==='edit') && this.isMidLevelMenuItem()){
27 // in Edit flow , for Midlevel menu item no need to preSelect.
28 this.preSelectedRoles = {roles:[]};
29 }else if(!angular.isUndefined(this.menuItem.menuDetails) &&
30 $scope.ngDialogData.source==='edit' && this.isLeafMenuItem() &&
31 this.menuItem.menuDetails.appid!=appid) {
32 // in Edit flow , for LeafMenuItem, if appid changed then no need to preSelect.
33 this.preSelectedRoles = {roles:[]};
35 if((!angular.isUndefined(this.menuItem.menuDetails)) &&
36 (!angular.isUndefined(this.menuItem.menuDetails.roles))){
37 $log.debug('menuDetails.roles: ' + this.menuItem.menuDetails.roles);
38 for(var i=0; i<this.menuItem.menuDetails.roles.length; i++){
39 var role = {"roleId":this.menuItem.menuDetails.roles[i]};
40 $log.debug('MenuDetailsModalCtrl::getAvailableRoles: adding role to preselected: ' + i + ': ' + JSON.stringify(role));
41 this.preSelectedRoles.roles.push(role);
45 $rootScope.$broadcast('availableRolesReady');
46 this.isSaving = false;
48 $log.error("MenuDetailsModalCtrl::getAvailableRoles: error: " + err);
51 $log.debug("MenuDetailsModalCtrl::getAvailableRoles: appid was null");
55 let getAvailableApps = () => {
56 $scope.isAllApplications = true;
57 functionalMenuService.getAvailableApplications().then(apps => {
58 $log.debug("MenuDetailsModalCtrl::getAvailableApps: Apps returned = " + JSON.stringify(apps))
59 this.availableApps = apps;
60 // Keep track of whether or not the selected app is disabled
61 if (angular.isDefined(this.selectedApp) && angular.isDefined(this.selectedApp.index)) {
62 for (var i = 0; i < apps.length; i++) {
63 if (apps[i].index === this.selectedApp.index) {
64 $log.debug("MenuDetailsModalCtrl::getAvailableApps: found app with index: " + this.selectedApp.index);
65 $log.debug("MenuDetailsModalCtrl::getAvailableApps: setting isDisabled to: " + !apps[i].enabled);
66 this.selectedApp.isDisabled = !apps[i].enabled;
70 $log.debug("didn't find index: " + this.selectedApp.index);
72 })['catch'](function (err) {
73 confirmBoxService.showInformation('There was a problem retrieving the Applications. ' +
74 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});
75 $log.error("MenuDetailsModalCtrl::getAvailableApps: getAvailableApps error: " + err);
76 $scope.isAllApplications = false;
78 this.isSaving = false;
79 $scope.isAllApplications = false;
84 $scope.isAllApplications = false;
85 $log.info('MenuDetailsModalCtrl::init');
86 this.saveOrContinueBtnText = "Save";
87 this.isSaving = false;
88 this.displayRoles = $scope.ngDialogData.source==='view' ? true : false;
89 this.formEditable = $scope.ngDialogData.source==='view' ? false : true;
90 this.selectedRole = [];
91 this.availableRoles = [];
92 this.menuItem = _.clone($scope.ngDialogData.menuItem);
93 $log.info('MenuDetailsModalCtrl::getAvailableApps: Within init, about to check menuDetails for defined');
94 if(!angular.isUndefined(this.menuItem.menuDetails) &&
95 ($scope.ngDialogData.source==='view' ||
96 ($scope.ngDialogData.source==='edit') && this.isLeafMenuItem() )){
98 $log.debug("MenuDetailsModalCtrl::init: menuItem: ");
99 $log.debug('MenuDetailsModalCtrl::init: ',this.menuItem);
100 this.menuItem.menu.url = this.menuItem.menuDetails.url;
102 this.selectedApp.index = this.menuItem.menuDetails.appid;
103 getAvailableRoles(this.selectedApp.index);
107 if($scope.ngDialogData.source==='view' || $scope.ngDialogData.source==='edit'){
108 this.menutitle = this.menuItem.menu.name;
109 this.menuLocation = this.isParentMenuItem() ? this.menuItem.menu.name : this.menuItem.menu.parent.name;
112 this.menuLocation = this.menuItem.menu.name;
114 // Temporarily passing 0 as dummy for getAvailableRoles incase of this.selectedApp is not there i.e., in Add flow
115 // getAvailableRoles(angular.isUndefined(this.selectedApp) ? 0: this.selectedApp.index );
117 $log.debug("MenuDetailsModalCtrl::init: Menu details: " + JSON.stringify(this.menuItem.menuDetails));
121 this.ECOMP_URL_REGEX = ECOMP_URL_REGEX;
123 //This part handles conflict errors (409)
124 this.conflictMessages = {};
126 let handleConflictErrors = err => {
130 if(!err.data.length){ //support objects
131 err.data = [err.data]
133 $log.debug('MenuDetailsModalCtrl::handleConflictErrors: err.data = ' + JSON.stringify(err.data));
134 _.forEach(err.data, item => {
135 _.forEach(item.fields, field => {
136 //set conflict message
137 this.conflictMessages[field.name] = errorMessageByCode[item.errorCode];
138 //set field as invalid
139 $log.debug('MenuDetailsModalCtrl::handleConflictErrors: fieldName = ' + field.name);
140 $scope.functionalMenuForm[field.name].$setValidity('conflict', false);
141 //set watch once to clear error after user correction
142 watchOnce[field.name]();
145 this.scrollApi.scrollTop();
148 let resetConflict = fieldName => {
149 delete this.conflictMessages[fieldName];
150 $log.debug('MenuDetailsModalCtrl::resetConflict: $setValidity(true) = ' + fieldName);
151 if($scope.functionalMenuForm[fieldName]){
152 $scope.functionalMenuForm[fieldName].$setValidity('conflict', true);
158 let unregisterName = $scope.$watch('functionalMenuDetails.menutitle', (newVal, oldVal) => {
159 // $log.debug('title:: newVal, oldVal = ' + newVal.toLowerCase() + " | " + oldVal.toLowerCase());
160 if(newVal.toLowerCase() !== oldVal.toLowerCase()){
161 resetConflict('text');
167 let unregisterUrl = $scope.$watch('functionalMenuDetails.menuItem.menu.url', (newVal, oldVal) => {
168 if(newVal.toLowerCase() !== oldVal.toLowerCase()){
169 resetConflict('url');
176 //***************************
178 this.isLeafMenuItem = () => {
179 return this.menuItem.menu.children.length>0 ? false : true;
182 this.isMidLevelMenuItem = () => {
183 return this.menuItem.menu.parentMenuId!=null && this.menuItem.menu.children.length>0 ? true : false;
186 this.isParentMenuItem = () => {
187 return this.menuItem.menu.parentMenuId!=null ? false : true;
190 this.updateSelectedApp = (appItem) => {
194 $log.debug('MenuDetailsModalCtrl::updateSelectedApp: drop down app item = ' + JSON.stringify(appItem.index));
195 $log.debug("MenuDetailsModalCtrl::updateSelectedApp: appItem in updateSelectedApp: ");
196 $log.debug('MenuDetailsModalCtrl::updateSelectedApp: ',appItem);
197 this.selectedApp.isDisabled = ! appItem.enabled;
198 $log.debug("MenuDetailsModalCtrl::updateSelectedApp: isDisabled: "+this.selectedApp.isDisabled);
199 getAvailableRoles(appItem.index);
202 this.continue = () => {
203 this.displayRoles = true;
204 this.formEditable = false;
207 this.saveChanges = () => {
209 //todo : form validation was commented as dialog message is kept for error validations
210 /*if($scope.functionalMenuForm.$invalid){
214 if(!!this.menuItem.menu.url && (angular.isUndefined(this.selectedApp) || !this.selectedApp.index>0)) {
215 confirmBoxService.showInformation('Please select the appropriate app, or remove the url').then(isConfirmed => {});
217 }else if(!this.menuItem.menu.url && !angular.isUndefined(this.selectedApp) && this.selectedApp.index>0){
218 confirmBoxService.showInformation('Please enter url, or select "No Application"').then(isConfirmed => {});
220 }else if(!this.menutitle){
221 confirmBoxService.showInformation('Please enter the Menu title').then(isConfirmed => {});
225 this.isSaving = true;
226 var activeMenuItem = {};
228 if ($scope.ngDialogData.source === 'edit') { // Edit Menu Item
229 $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving an edit menu item');
231 menuId:this.menuItem.menu.menuId,
232 column:this.menuItem.menu.column,
234 parentMenuId:this.menuItem.menu.parentMenuId,
235 url:this.menuItem.menu.url,
236 appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,
237 roles:this.selectedRole
239 // If we have removed the url and appid, we must remove the roles
240 if (!activeMenuItem.appid && !activeMenuItem.url) {
241 activeMenuItem.roles = null;
243 functionalMenuService.saveEditedMenuItem(activeMenuItem)
245 $log.debug('MenuDetailsModalCtrl::saveChanges: Menu Item saved');
246 $scope.closeThisDialog(true);
248 if(err.status === 409){//Conflict
249 handleConflictErrors(err);
251 confirmBoxService.showInformation('There was a problem saving your change. ' +
252 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});
254 $log.error('MenuDetailsModalCtrl::saveChanges: error - ',err);
256 this.isSaving = false;
259 $log.debug("MenuDetailsModalCtrl::saveChanges: Edit Menu output will be: " + JSON.stringify(activeMenuItem));
260 } else { // New Menu Item
261 $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving a New menu item');
263 menuId:null, // this is a new menu item
264 column:this.menuItem.menu.column,
266 // We are creating this new menu item under the menu item that was clicked on.
267 parentMenuId:this.menuItem.menu.menuId,
268 url:this.menuItem.menu.url,
269 appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,
270 roles:this.selectedRole
273 $log.debug("MenuDetailsModalCtrl::saveChanges: New Menu output will be: " + JSON.stringify(newMenuItem));
274 functionalMenuService.saveMenuItem(newMenuItem)
276 $log.debug('MenuDetailsModalCtrl::saveChanges: Menu Item saved');
277 $scope.closeThisDialog(true);
279 if(err.status === 409){//Conflict
280 handleConflictErrors(err);
282 confirmBoxService.showInformation('There was a problem saving your menu. ' +
283 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});
285 $log.error('MenuDetailsModalCtrl::saveChanges error: ', err);
287 this.isSaving = false;
295 $scope.$on('$stateChangeStart', e => {
296 //Disable navigation when modal is opened
301 MenuDetailsModalCtrl.$inject = ['$scope', '$log', 'functionalMenuService', 'errorMessageByCode', 'ECOMP_URL_REGEX','$rootScope','confirmBoxService'];
302 angular.module('ecompApp').controller('MenuDetailsModalCtrl', MenuDetailsModalCtrl);
304 angular.module('ecompApp').directive('dropdownMultiselect', ['functionalMenuService',function(){
310 populated_roles: '=preSelected',
314 template: "<div class='btn-group' data-ng-class='{open: open}'>" +
315 "<button class='btn btn-medium'>{{dropdownTitle}}</button>" +
316 "<button class='btn dropdown-toggle' data-ng-click='open=!open;openDropDown()'><span class='caret'></span></button>" +
317 "<ul class='dropdown-menu dropdown-menu-medium' aria-labelledby='dropdownMenu'>" +
318 "<li data-ng-repeat='option in options'> <input ng-disabled='setDisable(source)' type='checkbox' data-ng-change='setSelectedItem(option.roleId)' ng-model='selectedItems[option.roleId]'>{{option.rolename}}</li>" +
321 controller: function ($scope) {
322 $scope.selectedItems = {};
323 $scope.checkAll = false;
324 $scope.$on('availableRolesReady', function() {
329 console.log('dropdownMultiselect init');
330 $scope.dropdownTitle = $scope.source ==='view' ? 'View Roles' : 'Select Roles';
331 console.log('$scope.populated_roles = ' + $scope.populated_roles);
334 $scope.$watch('populated_roles', function(){
335 if ($scope.populated_roles && $scope.populated_roles.length>0) {
336 for (var i = 0; i < $scope.populated_roles.length; i++) {
337 $scope.model.push($scope.populated_roles[i].roleId);
338 $scope.selectedItems[$scope.populated_roles[i].roleId] = true;
340 if ($scope.populated_roles.length === $scope.options.length) {
341 $scope.checkAll = true;
348 $scope.openDropDown = function () {
352 $scope.checkAllClicked = function () {
353 if ($scope.checkAll) {
360 function selectAll() {
362 $scope.selectedItems = {};
363 angular.forEach($scope.options, function (option) {
364 $scope.model.push(option.roleId);
366 angular.forEach($scope.model, function (id) {
367 $scope.selectedItems[id] = true;
369 console.log($scope.model);
372 function deselectAll() {
374 $scope.selectedItems = {};
375 console.log($scope.model);
378 $scope.setSelectedItem = function (id) {
379 var filteredArray = [];
380 if ($scope.selectedItems[id] === true) {
381 $scope.model.push(id);
383 filteredArray = $scope.model.filter(function (value) {
386 $scope.model = filteredArray;
387 $scope.checkAll = false;
389 console.log(filteredArray);
393 $scope.setDisable = function(source){
394 return source ==='view' ? true : false;