[PORTAL-16 PORTAL-18] Widget ms; staging
[portal.git] / ecomp-portal-FE-os / client / src / views / functionalMenu / functionalMenu-dialog / menu-details.controller.js
index 09a8e75..140aea9 100644 (file)
-/*-\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
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+/**
+ * Created by nnaffar on 12/20/15.
+ */
+'use strict';
+(function () {
+    class MenuDetailsModalCtrl {
+        constructor($scope, $log, functionalMenuService, errorMessageByCode, ECOMP_URL_REGEX,$rootScope,confirmBoxService) {
+
+
+            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<this.menuItem.menuDetails.roles.length; i++){
+                                        var role = {"roleId":this.menuItem.menuDetails.roles[i]};
+                                        $log.debug('MenuDetailsModalCtrl::getAvailableRoles: adding role to preselected: ' + i + ': ' + JSON.stringify(role));
+                                        this.preSelectedRoles.roles.push(role);
+                                    }
+                            }
+                        }
+                        $rootScope.$broadcast('availableRolesReady');
+                        this.isSaving = false;
+                    }).catch(err => {
+                        $log.error("MenuDetailsModalCtrl::getAvailableRoles: error: " + err);
+                    });
+                } else {
+                    $log.debug("MenuDetailsModalCtrl::getAvailableRoles: appid was null");
+                }
+            };
+
+            let getAvailableApps = () => {
+                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);
+                }).finally(()=>{
+                    this.isSaving = false;
+                });
+            };
+
+            let init = () => {
+                $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.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.selectedApp={};
+                    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.updateSelectedApp = (appItem) => {
+                if (!appItem) {
+                    return;
+                }
+                $log.debug('MenuDetailsModalCtrl::updateSelectedApp: drop down app item = ' + JSON.stringify(appItem.index));
+                $log.debug("MenuDetailsModalCtrl::updateSelectedApp: appItem in updateSelectedApp: ");
+                $log.debug('MenuDetailsModalCtrl::updateSelectedApp: ',appItem);
+                this.selectedApp.isDisabled = ! appItem.enabled;
+                $log.debug("MenuDetailsModalCtrl::updateSelectedApp: isDisabled: "+this.selectedApp.isDisabled);
+                getAvailableRoles(appItem.index);
+            };
+
+            this.continue = () => {
+                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');
+                    activeMenuItem = {
+                        menuId:this.menuItem.menu.menuId,
+                        column:this.menuItem.menu.column,
+                        text:this.menutitle,
+                        parentMenuId:this.menuItem.menu.parentMenuId,
+                        url:this.menuItem.menu.url,
+                        appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,
+                        roles:this.selectedRole
+                    };
+                    // If we have removed the url and appid, we must remove the roles
+                    if (!activeMenuItem.appid && !activeMenuItem.url) {
+                        activeMenuItem.roles = null;
+                    }
+                    functionalMenuService.saveEditedMenuItem(activeMenuItem)
+                        .then(() => {
+                            $log.debug('MenuDetailsModalCtrl::saveChanges:  Menu Item saved');
+                            $scope.closeThisDialog(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 newMenuItem = {
+                        menuId:null, // this is a new menu item
+                        column:this.menuItem.menu.column,
+                        text:this.menutitle,
+                        // We are creating this new menu item under the menu item that was clicked on.
+                        parentMenuId:this.menuItem.menu.menuId,
+                        url:this.menuItem.menu.url,
+                        appid: angular.isUndefined(this.selectedApp) ? null:this.selectedApp.index,
+                        roles:this.selectedRole
+                    };
+
+                    $log.debug("MenuDetailsModalCtrl::saveChanges:  New Menu output will be: " + JSON.stringify(newMenuItem));
+                    functionalMenuService.saveMenuItem(newMenuItem)
+                        .then(() => {
+                            $log.debug('MenuDetailsModalCtrl::saveChanges:  Menu Item saved');
+                            $scope.closeThisDialog(true);
+                        }).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'];
+    angular.module('ecompApp').controller('MenuDetailsModalCtrl', MenuDetailsModalCtrl);
+
+    angular.module('ecompApp').directive('dropdownMultiselect', ['functionalMenuService',function(){
+        return {
+            restrict: 'E',
+            scope: {
+                model: '=',
+                options: '=',
+                populated_roles: '=preSelected',
+                dropdownTitle: '@',
+                source: '='
+            },
+            template: "<div class='btn-group' data-ng-class='{open: open}'>" +
+            "<button class='btn btn-medium'>{{dropdownTitle}}</button>" +
+            "<button class='btn dropdown-toggle' data-ng-click='open=!open;openDropDown()'><span class='caret'></span></button>" +
+            "<ul class='dropdown-menu dropdown-menu-medium' aria-labelledby='dropdownMenu'>" +
+            "<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>" +
+            "</ul>" +
+            "</div>",
+            controller: function ($scope) {
+                $scope.selectedItems = {};
+                $scope.checkAll = false;
+                $scope.$on('availableRolesReady', function() {
+                    init();
+                });
+
+                function init() {
+                    console.log('dropdownMultiselect init');
+                    $scope.dropdownTitle = $scope.source ==='view' ? 'View Roles' : 'Select Roles';
+                    console.log('$scope.populated_roles = ' + $scope.populated_roles);
+                }
+
+                $scope.$watch('populated_roles', function(){
+                    if ($scope.populated_roles && $scope.populated_roles.length>0) {
+                        for (var i = 0; i < $scope.populated_roles.length; i++) {
+                            $scope.model.push($scope.populated_roles[i].roleId);
+                            $scope.selectedItems[$scope.populated_roles[i].roleId] = true;
+                        }
+                        if ($scope.populated_roles.length === $scope.options.length) {
+                            $scope.checkAll = true;
+                        }
+                    }else{
+                        deselectAll();
+                    }
+                });
+
+                $scope.openDropDown = function () {
+
+                };
+
+                $scope.checkAllClicked = function () {
+                    if ($scope.checkAll) {
+                        selectAll();
+                    } else {
+                        deselectAll();
+                    }
+                };
+
+                function selectAll() {
+                    $scope.model = [];
+                    $scope.selectedItems = {};
+                    angular.forEach($scope.options, function (option) {
+                        $scope.model.push(option.roleId);
+                    });
+                    angular.forEach($scope.model, function (id) {
+                        $scope.selectedItems[id] = true;
+                    });
+                    console.log($scope.model);
+                };
+
+                function deselectAll() {
+                    $scope.model = [];
+                    $scope.selectedItems = {};
+                    console.log($scope.model);
+                };
+
+                $scope.setSelectedItem = function (id) {
+                    var filteredArray = [];
+                    if ($scope.selectedItems[id] === true) {
+                        $scope.model.push(id);
+                    } else {
+                        filteredArray = $scope.model.filter(function (value) {
+                            return value != id;
+                        });
+                        $scope.model = filteredArray;
+                        $scope.checkAll = false;
+                    }
+                    console.log(filteredArray);
+                    return false;
+                };
+
+                $scope.setDisable = function(source){
+                    return source ==='view' ? true : false;
+                }
+            }
+        }
+    }]);
+
+})();