--- /dev/null
+/*-\r
+ * ================================================================================\r
+ * ECOMP Portal\r
+ * ================================================================================\r
+ * Copyright (C) 2017 AT&T Intellectual Property\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ================================================================================\r
+ */\r
+/**\r
+ * Created by nnaffar on 12/20/15.\r
+ */\r
+'use strict';\r
+(function () {\r
+ class MenuDetailsModalCtrl {\r
+ constructor($scope, $log, functionalMenuService, errorMessageByCode, ECOMP_URL_REGEX,$rootScope,confirmBoxService) {\r
+\r
+\r
+ let newMenuModel = {\r
+ name: null,\r
+ menuId: null,\r
+ parentMenuId: null,\r
+ url: null\r
+ };\r
+\r
+ let getAvailableRoles = (appid) => {\r
+ this.isSaving = true;\r
+ if (appid != null) {\r
+ $log.debug("MenuDetailsModalCtrl::getAvailableRoles: About to call getManagedRolesMenu");\r
+ functionalMenuService.getManagedRolesMenu(appid).then(rolesObj => {\r
+ $log.debug("MenuDetailsModalCtrl::getAvailableRoles: Roles returned = " + JSON.stringify(rolesObj))\r
+ this.availableRoles = rolesObj;\r
+ this.preSelectedRoles = {roles:[]};\r
+\r
+ if(($scope.ngDialogData.source==='edit') && this.isMidLevelMenuItem()){\r
+ // in Edit flow , for Midlevel menu item no need to preSelect.\r
+ this.preSelectedRoles = {roles:[]};\r
+ }else if(!angular.isUndefined(this.menuItem.menuDetails) &&\r
+ $scope.ngDialogData.source==='edit' && this.isLeafMenuItem() &&\r
+ this.menuItem.menuDetails.appid!=appid) {\r
+ // in Edit flow , for LeafMenuItem, if appid changed then no need to preSelect.\r
+ this.preSelectedRoles = {roles:[]};\r
+ }else{\r
+ if((!angular.isUndefined(this.menuItem.menuDetails)) &&\r
+ (!angular.isUndefined(this.menuItem.menuDetails.roles))){\r
+ $log.debug('menuDetails.roles: ' + this.menuItem.menuDetails.roles);\r
+ for(var i=0; i<this.menuItem.menuDetails.roles.length; i++){\r
+ var role = {"roleId":this.menuItem.menuDetails.roles[i]};\r
+ $log.debug('MenuDetailsModalCtrl::getAvailableRoles: adding role to preselected: ' + i + ': ' + JSON.stringify(role));\r
+ this.preSelectedRoles.roles.push(role);\r
+ }\r
+ }\r
+ }\r
+ $rootScope.$broadcast('availableRolesReady');\r
+ this.isSaving = false;\r
+ }).catch(err => {\r
+ $log.error("MenuDetailsModalCtrl::getAvailableRoles: error: " + err);\r
+ });\r
+ } else {\r
+ $log.debug("MenuDetailsModalCtrl::getAvailableRoles: appid was null");\r
+ }\r
+ };\r
+\r
+ let getAvailableApps = () => {\r
+ functionalMenuService.getAvailableApplications().then(apps => {\r
+ $log.debug("MenuDetailsModalCtrl::getAvailableApps: Apps returned = " + JSON.stringify(apps))\r
+ this.availableApps = apps;\r
+ // Keep track of whether or not the selected app is disabled\r
+ if (angular.isDefined(this.selectedApp) && angular.isDefined(this.selectedApp.index)) {\r
+ for (var i = 0; i < apps.length; i++) {\r
+ if (apps[i].index === this.selectedApp.index) {\r
+ $log.debug("MenuDetailsModalCtrl::getAvailableApps: found app with index: " + this.selectedApp.index);\r
+ $log.debug("MenuDetailsModalCtrl::getAvailableApps: setting isDisabled to: " + !apps[i].enabled);\r
+ this.selectedApp.isDisabled = !apps[i].enabled;\r
+ break;\r
+ }\r
+ }\r
+ $log.debug("didn't find index: " + this.selectedApp.index);\r
+ }\r
+ })['catch'](function (err) {\r
+ confirmBoxService.showInformation('There was a problem retrieving the Applications. ' +\r
+ 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});\r
+ $log.error("MenuDetailsModalCtrl::getAvailableApps: getAvailableApps error: " + err);\r
+ }).finally(()=>{\r
+ this.isSaving = false;\r
+ });\r
+ };\r
+\r
+ let init = () => {\r
+ $log.info('MenuDetailsModalCtrl::init');\r
+ this.saveOrContinueBtnText = "Save";\r
+ this.isSaving = false;\r
+ this.displayRoles = $scope.ngDialogData.source==='view' ? true : false;\r
+ this.formEditable = $scope.ngDialogData.source==='view' ? false : true;\r
+ this.selectedRole = [];\r
+ this.availableRoles = [];\r
+ this.menuItem = _.clone($scope.ngDialogData.menuItem);\r
+ $log.info('MenuDetailsModalCtrl::getAvailableApps: Within init, about to check menuDetails for defined');\r
+ if(!angular.isUndefined(this.menuItem.menuDetails) &&\r
+ ($scope.ngDialogData.source==='view' ||\r
+ ($scope.ngDialogData.source==='edit') && this.isLeafMenuItem() )){\r
+\r
+ $log.debug("MenuDetailsModalCtrl::init: menuItem: ");\r
+ $log.debug('MenuDetailsModalCtrl::init: ',this.menuItem);\r
+ this.menuItem.menu.url = this.menuItem.menuDetails.url;\r
+ this.selectedApp={};\r
+ this.selectedApp.index = this.menuItem.menuDetails.appid;\r
+ getAvailableRoles(this.selectedApp.index);\r
+\r
+ }\r
+\r
+ if($scope.ngDialogData.source==='view' || $scope.ngDialogData.source==='edit'){\r
+ this.menutitle = this.menuItem.menu.name;\r
+ this.menuLocation = this.isParentMenuItem() ? this.menuItem.menu.name : this.menuItem.menu.parent.name;\r
+ }else{\r
+ this.menutitle = '';\r
+ this.menuLocation = this.menuItem.menu.name;\r
+ }\r
+ // Temporarily passing 0 as dummy for getAvailableRoles incase of this.selectedApp is not there i.e., in Add flow\r
+ // getAvailableRoles(angular.isUndefined(this.selectedApp) ? 0: this.selectedApp.index );\r
+ getAvailableApps();\r
+ $log.debug("MenuDetailsModalCtrl::init: Menu details: " + JSON.stringify(this.menuItem.menuDetails));\r
+ };\r
+\r
+\r
+ this.ECOMP_URL_REGEX = ECOMP_URL_REGEX;\r
+\r
+ //This part handles conflict errors (409)\r
+ this.conflictMessages = {};\r
+ this.scrollApi = {};\r
+ let handleConflictErrors = err => {\r
+ if(!err.data){\r
+ return;\r
+ }\r
+ if(!err.data.length){ //support objects\r
+ err.data = [err.data]\r
+ }\r
+ $log.debug('MenuDetailsModalCtrl::handleConflictErrors: err.data = ' + JSON.stringify(err.data));\r
+ _.forEach(err.data, item => {\r
+ _.forEach(item.fields, field => {\r
+ //set conflict message\r
+ this.conflictMessages[field.name] = errorMessageByCode[item.errorCode];\r
+ //set field as invalid\r
+ $log.debug('MenuDetailsModalCtrl::handleConflictErrors: fieldName = ' + field.name);\r
+ $scope.functionalMenuForm[field.name].$setValidity('conflict', false);\r
+ //set watch once to clear error after user correction\r
+ watchOnce[field.name]();\r
+ });\r
+ });\r
+ this.scrollApi.scrollTop();\r
+ };\r
+\r
+ let resetConflict = fieldName => {\r
+ delete this.conflictMessages[fieldName];\r
+ $log.debug('MenuDetailsModalCtrl::resetConflict: $setValidity(true) = ' + fieldName);\r
+ if($scope.functionalMenuForm[fieldName]){\r
+ $scope.functionalMenuForm[fieldName].$setValidity('conflict', true);\r
+ }\r
+ };\r
+\r
+ let watchOnce = {\r
+ text: () => {\r
+ let unregisterName = $scope.$watch('functionalMenuDetails.menutitle', (newVal, oldVal) => {\r
+ // $log.debug('title:: newVal, oldVal = ' + newVal.toLowerCase() + " | " + oldVal.toLowerCase());\r
+ if(newVal.toLowerCase() !== oldVal.toLowerCase()){\r
+ resetConflict('text');\r
+ unregisterName();\r
+ }\r
+ });\r
+ },\r
+ url: () => {\r
+ let unregisterUrl = $scope.$watch('functionalMenuDetails.menuItem.menu.url', (newVal, oldVal) => {\r
+ if(newVal.toLowerCase() !== oldVal.toLowerCase()){\r
+ resetConflict('url');\r
+ unregisterUrl();\r
+ }\r
+ });\r
+ }\r
+ };\r
+\r
+ //***************************\r
+\r
+ this.isLeafMenuItem = () => {\r
+ return this.menuItem.menu.children.length>0 ? false : true;\r
+ };\r
+\r
+ this.isMidLevelMenuItem = () => {\r
+ return this.menuItem.menu.parentMenuId!=null && this.menuItem.menu.children.length>0 ? true : false;\r
+ };\r
+\r
+ this.isParentMenuItem = () => {\r
+ return this.menuItem.menu.parentMenuId!=null ? false : true;\r
+ };\r
+\r
+ this.updateSelectedApp = (appItem) => {\r
+ if (!appItem) {\r
+ return;\r
+ }\r
+ $log.debug('MenuDetailsModalCtrl::updateSelectedApp: drop down app item = ' + JSON.stringify(appItem.index));\r
+ $log.debug("MenuDetailsModalCtrl::updateSelectedApp: appItem in updateSelectedApp: ");\r
+ $log.debug('MenuDetailsModalCtrl::updateSelectedApp: ',appItem);\r
+ this.selectedApp.isDisabled = ! appItem.enabled;\r
+ $log.debug("MenuDetailsModalCtrl::updateSelectedApp: isDisabled: "+this.selectedApp.isDisabled);\r
+ getAvailableRoles(appItem.index);\r
+ };\r
+\r
+ this.continue = () => {\r
+ this.displayRoles = true;\r
+ this.formEditable = false;\r
+ };\r
+\r
+ this.saveChanges = () => {\r
+\r
+ //todo : form validation was commented as dialog message is kept for error validations\r
+ /*if($scope.functionalMenuForm.$invalid){\r
+ return;\r
+ }*/\r
+\r
+ if(!!this.menuItem.menu.url && (angular.isUndefined(this.selectedApp) || !this.selectedApp.index>0)) {\r
+ confirmBoxService.showInformation('Please select the appropriate app, or remove the url').then(isConfirmed => {});\r
+ return;\r
+ }else if(!this.menuItem.menu.url && !angular.isUndefined(this.selectedApp) && this.selectedApp.index>0){\r
+ confirmBoxService.showInformation('Please enter url, or select "No Application"').then(isConfirmed => {});\r
+ return;\r
+ }else if(!this.menutitle){\r
+ confirmBoxService.showInformation('Please enter the Menu title').then(isConfirmed => {});\r
+ return;\r
+ }\r
+\r
+ this.isSaving = true;\r
+ var activeMenuItem = {};\r
+\r
+ if ($scope.ngDialogData.source === 'edit') { // Edit Menu Item\r
+ $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving an edit menu item');\r
+ activeMenuItem = {\r
+ menuId:this.menuItem.menu.menuId,\r
+ column:this.menuItem.menu.column,\r
+ text:this.menutitle,\r
+ parentMenuId:this.menuItem.menu.parentMenuId,\r
+ url:this.menuItem.menu.url,\r
+ appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,\r
+ roles:this.selectedRole\r
+ };\r
+ // If we have removed the url and appid, we must remove the roles\r
+ if (!activeMenuItem.appid && !activeMenuItem.url) {\r
+ activeMenuItem.roles = null;\r
+ }\r
+ functionalMenuService.saveEditedMenuItem(activeMenuItem)\r
+ .then(() => {\r
+ $log.debug('MenuDetailsModalCtrl::saveChanges: Menu Item saved');\r
+ $scope.closeThisDialog(true);\r
+ }).catch(err => {\r
+ if(err.status === 409){//Conflict\r
+ handleConflictErrors(err);\r
+ } else {\r
+ confirmBoxService.showInformation('There was a problem saving your change. ' +\r
+ 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});\r
+ }\r
+ $log.error('MenuDetailsModalCtrl::saveChanges: error - ',err);\r
+ }).finally(()=>{\r
+ this.isSaving = false;\r
+ });\r
+\r
+ $log.debug("MenuDetailsModalCtrl::saveChanges: Edit Menu output will be: " + JSON.stringify(activeMenuItem));\r
+ } else { // New Menu Item\r
+ $log.debug('MenuDetailsModalCtrl::saveChanges: Will be saving a New menu item');\r
+ var newMenuItem = {\r
+ menuId:null, // this is a new menu item\r
+ column:this.menuItem.menu.column,\r
+ text:this.menutitle,\r
+ // We are creating this new menu item under the menu item that was clicked on.\r
+ parentMenuId:this.menuItem.menu.menuId,\r
+ url:this.menuItem.menu.url,\r
+ appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,\r
+ roles:this.selectedRole\r
+ };\r
+\r
+ $log.debug("MenuDetailsModalCtrl::saveChanges: New Menu output will be: " + JSON.stringify(newMenuItem));\r
+ functionalMenuService.saveMenuItem(newMenuItem)\r
+ .then(() => {\r
+ $log.debug('MenuDetailsModalCtrl::saveChanges: Menu Item saved');\r
+ $scope.closeThisDialog(true);\r
+ }).catch(err => {\r
+ if(err.status === 409){//Conflict\r
+ handleConflictErrors(err);\r
+ } else {\r
+ confirmBoxService.showInformation('There was a problem saving your menu. ' +\r
+ 'Please try again later. Error Status: '+ err.status).then(isConfirmed => {});\r
+ }\r
+ $log.error('MenuDetailsModalCtrl::saveChanges error: ', err);\r
+ }).finally(()=>{\r
+ this.isSaving = false;\r
+ });\r
+\r
+ }\r
+ };\r
+\r
+ init();\r
+\r
+ $scope.$on('$stateChangeStart', e => {\r
+ //Disable navigation when modal is opened\r
+ e.preventDefault();\r
+ });\r
+ }\r
+ }\r
+ MenuDetailsModalCtrl.$inject = ['$scope', '$log', 'functionalMenuService', 'errorMessageByCode', 'ECOMP_URL_REGEX','$rootScope','confirmBoxService'];\r
+ angular.module('ecompApp').controller('MenuDetailsModalCtrl', MenuDetailsModalCtrl);\r
+\r
+ angular.module('ecompApp').directive('dropdownMultiselect', ['functionalMenuService',function(){\r
+ return {\r
+ restrict: 'E',\r
+ scope: {\r
+ model: '=',\r
+ options: '=',\r
+ populated_roles: '=preSelected',\r
+ dropdownTitle: '@',\r
+ source: '='\r
+ },\r
+ template: "<div class='btn-group' data-ng-class='{open: open}'>" +\r
+ "<button class='btn btn-medium'>{{dropdownTitle}}</button>" +\r
+ "<button class='btn dropdown-toggle' data-ng-click='open=!open;openDropDown()'><span class='caret'></span></button>" +\r
+ "<ul class='dropdown-menu dropdown-menu-medium' aria-labelledby='dropdownMenu'>" +\r
+ "<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>" +\r
+ "</ul>" +\r
+ "</div>",\r
+ controller: function ($scope) {\r
+ $scope.selectedItems = {};\r
+ $scope.checkAll = false;\r
+ $scope.$on('availableRolesReady', function() {\r
+ init();\r
+ });\r
+\r
+ function init() {\r
+ console.log('dropdownMultiselect init');\r
+ $scope.dropdownTitle = $scope.source ==='view' ? 'View Roles' : 'Select Roles';\r
+ console.log('$scope.populated_roles = ' + $scope.populated_roles);\r
+ }\r
+\r
+ $scope.$watch('populated_roles', function(){\r
+ if ($scope.populated_roles && $scope.populated_roles.length>0) {\r
+ for (var i = 0; i < $scope.populated_roles.length; i++) {\r
+ $scope.model.push($scope.populated_roles[i].roleId);\r
+ $scope.selectedItems[$scope.populated_roles[i].roleId] = true;\r
+ }\r
+ if ($scope.populated_roles.length === $scope.options.length) {\r
+ $scope.checkAll = true;\r
+ }\r
+ }else{\r
+ deselectAll();\r
+ }\r
+ });\r
+\r
+ $scope.openDropDown = function () {\r
+\r
+ };\r
+\r
+ $scope.checkAllClicked = function () {\r
+ if ($scope.checkAll) {\r
+ selectAll();\r
+ } else {\r
+ deselectAll();\r
+ }\r
+ };\r
+\r
+ function selectAll() {\r
+ $scope.model = [];\r
+ $scope.selectedItems = {};\r
+ angular.forEach($scope.options, function (option) {\r
+ $scope.model.push(option.roleId);\r
+ });\r
+ angular.forEach($scope.model, function (id) {\r
+ $scope.selectedItems[id] = true;\r
+ });\r
+ console.log($scope.model);\r
+ };\r
+\r
+ function deselectAll() {\r
+ $scope.model = [];\r
+ $scope.selectedItems = {};\r
+ console.log($scope.model);\r
+ };\r
+\r
+ $scope.setSelectedItem = function (id) {\r
+ var filteredArray = [];\r
+ if ($scope.selectedItems[id] === true) {\r
+ $scope.model.push(id);\r
+ } else {\r
+ filteredArray = $scope.model.filter(function (value) {\r
+ return value != id;\r
+ });\r
+ $scope.model = filteredArray;\r
+ $scope.checkAll = false;\r
+ }\r
+ console.log(filteredArray);\r
+ return false;\r
+ };\r
+\r
+ $scope.setDisable = function(source){\r
+ return source ==='view' ? true : false;\r
+ }\r
+ }\r
+ }\r
+ }]);\r
+\r
+})();\r