/*- * ================================================================================ * 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. * ================================================================================ */ 'use strict'; (function () { class userNotificationsModalCtrl { constructor($scope, $log, functionalMenuService, confirmBoxService, notificationService, $modal, ngDialog, $state, $filter,items) { this.debug = false; $scope.newNotifModel = { 'isOnlineUsersOnly': null, 'isForAllRolesOptions': null, 'selectedPriority': null, 'isActive': null, 'startTime': '', 'endTime': '', 'msgHeader': null, 'msgDescription': null, 'roleIds': null, 'anyTreeItemSelected':false, 'roleObj': {notificationRoleIds:null} }; $scope.notificationId = null; $scope.selectedCat = null; $scope.selectedEcompFunc = null; this.YN_index_mapping = { "Y": 0, "N": 1 } $scope.onlineAllUsersOptions = [ { "index": 0, "value": "Y", "title": "Online Users Only" }, { "index": 1, "value": "N", "title": "Online & Offline Users" } ]; $scope.isForAllRolesOptions = [ { "index": 0, "value": "Y", "title": "Yes" }, { "index": 1, "value": "N", "title": "No" } ]; $scope.priorityOptions = [ { "index": 0, "value": 1, "title": "Normal" }, { "index": 1, "value": 2, "title": "Important" } ]; $scope.isActiveOptions = [ { "index": 0, "value": "Y", "title": "Yes" }, { "index": 1, "value": "N", "title": "No" } ]; $scope.newNotifModel.isActive = $scope.isActiveOptions[0]; $scope.newNotifModel.selectPriority = $scope.priorityOptions[0]; $scope.newNotifModel.isOnlineUsersOnly = $scope.onlineAllUsersOptions[1]; $scope.newNotifModel.isForAllRoles=$scope.isForAllRolesOptions[0].value; $scope.newNotifModel.isFunctionalMenu ="Y"; $scope.newNotifModel.selectedPriority=$scope.priorityOptions[0].value; $scope.newNotifModel.msgHeader = ''; $scope.newNotifModel.msgDescription = ''; $scope.newNotifModel.treeTitle="Functional Menu"; $scope.newNotifModel.notifObj= {isCategoriesFunctionalMenu:true}; let init = () => { if(this.debug) $log.debug('userNotificationsModalCtrl::init'); this.isSaving = false; var today = new Date(); $scope.minDate = today.toISOString().substring(0, 10); var threeMonthsFromNow = new Date(); threeMonthsFromNow.setMonth(threeMonthsFromNow.getMonth() + 3); $scope.maxDate = threeMonthsFromNow.toISOString().substring(0, 10); if (items && items.notif) { if(this.debug) $log.debug('userNotificationsModalCtrl:init:: Edit notification mode for', items.notif); $scope.isEditMode = true; $scope.editModeObj = {isEditMode: true}; this.notif = _.clone(items.notif); $scope.modalPgTitle = 'View Notification' $scope.newNotifModel.isOnlineUsersOnly = $scope.onlineAllUsersOptions[this.YN_index_mapping[this.notif.isForOnlineUsers]]; $scope.newNotifModel.isForAllRoles = $scope.isForAllRolesOptions[this.YN_index_mapping[this.notif.isForAllRoles]].value; $scope.newNotifModel.isActive = $scope.isActiveOptions[this.YN_index_mapping[this.notif.activeYn]]; $scope.newNotifModel.selectedPriority = $scope.priorityOptions[this.notif.priority - 1].value; $scope.newNotifModel.startTime = new Date(this.notif.startTime); $scope.newNotifModel.endTime = new Date(this.notif.endTime); $scope.newNotifModel.msgHeader = this.notif.msgHeader; $scope.newNotifModel.msgDescription = this.notif.msgDescription; $scope.notificationId = this.notif.notificationId; $scope.newNotifModel.notificationRoleIds = this.notif.roleIds; $scope.roleObj = {notificationRoleIds:this.notif.roleIds}; } else { if(this.debug) $log.debug('AppDetailsModalCtrl:init:: New app mode'); $scope.isEditMode = false; $scope.editModeObj = {isEditMode: false}; $scope.modalPgTitle = 'Add a New Notification' this.notif = _.clone($scope.newNotifModel); $scope.roleObj = {notificationRoleIds:null}; } }; this.conflictMessages = {}; this.scrollApi = {}; let handleConflictErrors = err => { if(!err.data){ return; } if(!err.data.length){ // support objects err.data = [err.data] } _.forEach(err.data, item => { _.forEach(item.fields, field => { // set conflict message this.conflictMessages[field.name] = errorMessageByCode[item.errorCode]; // set field as invalid $scope.appForm[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]; if($scope.appForm[fieldName]){ $scope.appForm[fieldName].$setValidity('conflict', true); } }; $scope.addUserNotificationValidation = function () { // // pre-processing if (!($scope.isEditMode)) { var validation=false; if($scope.isDateValid($scope.newNotifModel.startTime) && $scope.isDateValid($scope.newNotifModel.endTime) && $scope.newNotifModel.msgHeader != '' && $scope.newNotifModel.msgDescription != '' && ($scope.newNotifModel.startTime<$scope.newNotifModel.endTime)){ validation=true; if( $scope.newNotifModel.isForAllRoles=='N'){ validation = $scope.checkTreeSelect(); } } else{ validation=false; } return !validation; } } /* format the value for viewing a notification */ $scope.formatStartDate = function () { if ($scope.newNotifModel.startTime) { $scope.newNotifModel.startTime = $filter('date')($scope.startTime, 'medium'); } } /* format the value for viewing a notification */ $scope.formatEndDate = function () { if($scope.newNotifModel.endTime){ $scope.newNotifModel.endTime = $filter('date')($scope.endTime, 'medium'); } } $scope.isDateValid = function (time) { if(time == undefined){ return false; } if(typeof time == 'object'){ return true; } var startDateformat =time.split('/'); if (startDateformat.length != 3) return false; var day = startDateformat[1]; var month = startDateformat[0]; month= parseInt(month)-1; var year = startDateformat[2]; if(year.length!=4) return false; var composedDate = new Date(year, month, day); return composedDate.getDate() == day && composedDate.getMonth() == month && composedDate.getFullYear() == year; }; $scope.addUserNotification = function () { $scope.notificationRoleIds = []; // pre-processing for(var fi=0;fi<$scope.treedata.length;fi++){ var fLevel = $scope.treedata[fi]; if(fLevel){ var fLevelChild = fLevel.child; for(var si=0;si { if(this.debug) $log.debug('NotificationService:updateAdminNotification:: Admin notification update succeeded!'); $scope.closeThisDialog(true); }).catch(err => { $log.error('notificationService.updateAdminNotfication failed: ' + JSON.stringify(err)); switch (err.status) { case '409': // Conflict // handleConflictErrors(err); break; case '500': // Internal Server Error confirmBoxService.showInformation('There was a problem updating the notification. ' + 'Please try again later. Error: ' + err.status).then(isConfirmed => { }); break; case '403': // Forbidden... possible // webjunction error to // try again confirmBoxService.showInformation('There was a problem updating the notification. ' + 'Please try again. If the problem persists, then try again later. Error: ' + err.status).then(isConfirmed => { }); break; default: confirmBoxService.showInformation('There was a problem updating the notification. ' + 'Please try again. If the problem persists, then try again later. Error: ' + err.status).then(isConfirmed => { }); } }).finally(() => { // for bug in IE 11 var objOffsetVersion = objAgent.indexOf("MSIE"); if (objOffsetVersion != -1) { if(this.debug) $log.debug('AppDetailsModalCtrl:updateOnboardingApp:: Browser is IE, forcing Refresh'); $window.location.reload(); } // for bug in IE 11 }); } else { notificationService.addAdminNotification(this.newUserNotification) .then((res) => { if(this.debug) $log.debug('notificationService:addAdminNotification:: Admin notification creation succeeded!,',res); if(res.status=='ERROR'){ confirmBoxService.showInformation('There was a problem adding the notification. ' + ' Error: ' + res.response).then(isConfirmed => { }); } else{ //$scope.closeThisDialog(true); $scope.$dismiss('cancel'); } // emptyCookies(); }).catch(err => { switch (err.status) { case '409': // Conflict // handleConflictErrors(err); break; case '500': // Internal Server Error confirmBoxService.showInformation('There was a problem adding the notification. ' + 'Please try again later. Error: ' + err.status).then(isConfirmed => { }); break; default: confirmBoxService.showInformation('There was a problem adding the notification. ' + 'Please try again. If the problem persists, then try again later. Error: ' + err.status).then(isConfirmed => { }); } $log.error('notificationService:addAdminNotification error:: ' + JSON.stringify(err)); }) } } else { $log.warn('please fill in all required fields'); confirmBoxService.showInformation('Please fill in all required fields').then(isConfirmed => { }); } } $scope.functionalMenuRes={}; $scope.checkTreeSelect = function(){ if($scope.treedata){ for(var fi=0; fi<$scope.treedata.length;fi++){ var fLevel = $scope.treedata[fi]; if(fLevel.isSelected){ return true; } var sLevel = fLevel.child; if(sLevel){ for(var si=0;si { this.isLoadingTable = true; if(this.debug) $log.debug('getFunctionalMenu:init'); functionalMenuService.getFunctionalMenuRole().then(role_res => { var menu_role_dict = {}; if(this.debug) $log.debug('functionalMenuService:getFunctionalMenuRole:: getting result', role_res); for (var i in role_res) { // if first time appear in menu_role_dict if (!(role_res[i].menuId in menu_role_dict)) { menu_role_dict[role_res[i].menuId] = [role_res[i].roleId]; } else { menu_role_dict[role_res[i].menuId].push(role_res[i].roleId); } } functionalMenuService.getManagedFunctionalMenuForNotificationTree().then(res => { if(this.debug) $log.debug('functionalMenuService:getManagedFunctionalMenuForNotificationTree:: getting result', res); var exclude_list = ['Favorites']; let actualData=[]; $scope.functionalMenuRes=res; //Adding children and label attribute to all objects in res for(let i = 0; i < res.length; i++){ res[i].child=[]; res[i].name=res[i].text; res[i].id=res[i].text; res[i].displayCheckbox= true; $scope.checkBoxObj = {isAnyRoleSelected:false}; res[i].roleId = menu_role_dict[res[i].menuId]; res[i].onSelect = function () { $scope.$apply(function () { $scope.newNotifModel.anyTreeItemSelected=$scope.checkTreeSelect(); }) }; if (res[i].roleId && res[i].roleId.length==_.intersection(res[i].roleId, $scope.roleObj.notificationRoleIds).length){ res[i].isSelected= true; res[i].selected= true; res[i].indeterminate= false; }else{ /*default*/ res[i].isSelected= false; res[i].selected= false; res[i].indeterminate= false; } } // Adding actual child items to children array in res // objects $scope.parentChildDict ={}; $scope.parentChildRoleIdDict ={}; for (let i = 0; i < res.length; i++) { let parentId = res[i].menuId; $scope.parentChildDict[parentId] = []; $scope.parentChildRoleIdDict[parentId]=[]; for (let j = 0; j < res.length; j++) { let childId = res[j].parentMenuId; if (parentId === childId) { res[i].child.push(res[j]); $scope.parentChildDict[parentId].push(res[j].menuId); //if res[j].roleId is defined if (res[j].roleId) { for (let k in res[j].roleId) { $scope.parentChildRoleIdDict[parentId].push(res[j].roleId[k]); } } } } } //check if grand children exist for (var key in $scope.parentChildDict){ var child = $scope.parentChildDict[key]; var isGrandParent = false; if (child.length>0) { for (var i in child) { if ($scope.parentChildDict[child[i]].length>0){ isGrandParent = true; break; } } } if (isGrandParent) { for (var i in child) { // if the child has children if ($scope.parentChildDict[child[i]].length>0) { for (var j in $scope.parentChildRoleIdDict[child[i]]) { if ($scope.parentChildRoleIdDict[key].indexOf($scope.parentChildRoleIdDict[child[i]][j]) === -1) { $scope.parentChildRoleIdDict[key].push($scope.parentChildRoleIdDict[child[i]][j]); } } } } } }; // Sort the top-level menu items in order based on the column res.sort(function(a, b) { return a.column-b.column; }); // Sort all the child in order based on the column for(let i = 0; i < res.length; i++){ res[i].child.sort(function(a, b){ return a.column-b.column; }); } //Forming actual parent items for(let i = 0; i < res.length; i++){ let parentId=res[i].parentMenuId; if(parentId===null){ actualData.push(res[i]); } } var treedata = actualData[0].child; $scope.treedata = []; /*Remove favorite from the list */ for (var i in treedata) { if (!(treedata[i].name.indexOf(exclude_list) > -1)) { $scope.treedata.push(treedata[i]) } } //setting b2b tree parameter $scope.settingTreeParam(); }).catch(err => { $log.error('FunctionalMenuCtrl:getFunctionalMenu:: error ', err); }).finally(() => { this.isLoadingTable = false; }) }).catch(err => { $log.error('FunctionalMenuCtrl:getFunctionalMenu:: error ', err); }) ; } let getAppRoleIds = () => { $scope.notifObj= {isCategoriesFunctionalMenu:false}; notificationService.getAppRoleIds().then(res => { if(this.debug) $log.debug('notificationService:getAppRoleIds:: getting result', res); res = res.data; let actualData = []; var app_id_name_list = {}; $scope.checkBoxObj = {isAnyRoleSelected:false}; for (let i = 0; i < res.length; i++) { if (!(res[i].appId in app_id_name_list)) { app_id_name_list[res[i].appId] = res[i].appName; } res[i].child=[]; res[i].name=res[i].roleName; res[i].displayCheckbox= true; res[i].id = res[i].roleId; res[i].menuId = res[i].roleId; res[i].parentMenuId = res[i].appId; res[i].can_check = true; res[i].roleId = [res[i].roleId]; res[i].onSelect = function () { $scope.$apply(function () { $scope.newNotifModel.anyTreeItemSelected=$scope.checkTreeSelect(); }) }; /*assigning selected value*/ if (res[i].roleId && res[i].roleId.length==_.intersection(res[i].roleId, $scope.roleObj.notificationRoleIds).length){ res[i].isSelected= true; res[i].selected= true; res[i].indeterminate= false; }else{ /*default*/ res[i].isSelected= false; res[i].selected= false; res[i].indeterminate= false; } } for (var app_id in app_id_name_list) { var new_res = {}; new_res.child = []; new_res.name = app_id_name_list[app_id]; new_res.id = app_id; new_res.displayCheckbox= true; new_res.menuId = app_id; new_res.parentMenuId = null; new_res.appId = null; new_res.can_check = true; new_res.roleId = null; new_res.onSelect = function () { $scope.$apply(function () { $scope.newNotifModel.anyTreeItemSelected=$scope.checkTreeSelect(); }) }; res.push(new_res); } $scope.parentChildRoleIdDict ={}; //Adding actual child items to child array in res objects for (let i = 0; i < res.length; i++) { let parentId = res[i].menuId; $scope.parentChildRoleIdDict[parentId]=[]; for (let j = 0; j < res.length; j++) { let childId = res[j].parentMenuId; if (parentId == childId) { res[i].child.push(res[j]); if (res[j].roleId) { for (let k in res[j].roleId) { $scope.parentChildRoleIdDict[parentId].push(res[j].roleId[k]); } } } } } //Forming actual parent items for (let i = 0; i < res.length; i++) { let parentId = res[i].parentMenuId; if (parentId === null) { actualData.push(res[i]); } } $scope.treedata = actualData; //setting correct parameters for b2b tree $scope.settingTreeParam(); }).catch(err => { $log.error('FunctionalMenuCtrl:getFunctionalMenu:: error ', err); }).finally(() => { this.isLoadingTable = false; }) } $scope.getFunctionalMenu= function() { $scope.treeTitle="Functional Menu"; getFunctionalMenu(); } $scope.getAppRoleIds = function() { $scope.treeTitle="Applications/Roles"; getAppRoleIds(); } $scope.settingTreeParam = function(){ /**************first level****************/ for(var fi=0; fi<$scope.treedata.length;fi++){ var fLevel = $scope.treedata[fi]; var sLevel = $scope.treedata[fi].child; var sLevelSelectedCount =0; var sLevelChildNumber =0 if(fLevel.child.length==0 && fLevel.roleId==null){ delete fLevel.child; }else if(sLevel){ /**************Second level****************/ var sLevelDelArray=[]; for(var si=0;si0){ sLevel[si].indeterminate=true; sLevel[si].active=true; } /*Cleanup unused third level items*/ for(var i=0;i0){ fLevel.indeterminate=true; fLevel.active=true; }else{ //fLevel.active=false; fLevel.indeterminate=false; } /*Cleanup unused second level items*/ for(var i=0;i'; $element.removeAttr('att-datepicker-custom'); $element.removeAttr('ng-model'); $element.attr('ng-value', '$parent.current | date:"EEEE, MMMM d, y"'); $element.attr('aria-describedby', 'datepicker'); $element.attr('maxlength', 10); var wrapperElement = angular.element('
'); wrapperElement.attr('datepicker-popup', ''); wrapperElement.attr('current', 'current'); datepickerService.setAttributes($attrs, wrapperElement); datepickerService.bindScope($attrs, $scope); wrapperElement.html(''); wrapperElement.append($element.prop('outerHTML')); if (navigator.userAgent.match(/MSIE 8/) === null) { wrapperElement.append(selectedDateMessage); } var elm = wrapperElement.prop('outerHTML'); elm = $compile(elm)($scope); $element.replaceWith(elm); }], link: function(scope, elem, attr, ctrl) { if (!ctrl) { // do nothing if no ng-model $log.error("ng-model is required."); return; } scope.$watch('current', function(value) { ctrl.$setViewValue(value); }); ctrl.$render = function() { scope.current = ctrl.$viewValue; }; } }; }]); })();