\r\nexport default /*@ngInject*/ function ($interpolate) {\r\n return {\r\n restrict: 'A',\r\n priority: Number.MIN_SAFE_INTEGER, // execute last, after all other directives if any.\r\n link: function ($scope, $element, $attributes) {\r\n var expressions = $attributes.whenReady.split(';');\r\n var waitForInterpolation = false;\r\n\r\n function evalExpressions(expressions) {\r\n expressions.forEach(function (expression) {\r\n $scope.$eval(expression);\r\n });\r\n }\r\n\r\n if ($attributes.whenReady.trim().length == 0) { return; }\r\n\r\n if (expressions.length > 1) {\r\n if ($scope.$eval(expressions.pop())) {\r\n waitForInterpolation = true;\r\n }\r\n }\r\n\r\n if (waitForInterpolation) {\r\n requestAnimationFrame(function checkIfInterpolated() {\r\n if ($element.text().indexOf($interpolate.startSymbol()) >= 0) { // if the text still has {{placeholders}}\r\n requestAnimationFrame(checkIfInterpolated);\r\n }\r\n else {\r\n evalExpressions(expressions);\r\n }\r\n });\r\n }\r\n else {\r\n evalExpressions(expressions);\r\n }\r\n }\r\n };\r\n}","import angular from 'angular';\r\nimport * as directives from './Directives/customDirectives';\r\nimport * as inspinia from './Functions/directives';\r\nimport whenReadyDirective from './Directives/whenReadyDirective';\r\nimport oraclePasswordDirective from './Directives/oracle-password.directive';\r\nimport navRepeatDirective from './Directives/navRepeat.directive';\r\n\r\nexport default angular\r\n .module('app.shared.directives', [])\r\n // directives\r\n .directive('navRepeatDirective', navRepeatDirective)\r\n .directive('onEnter', directives.onEnter)\r\n .directive('complexPassword', directives.complexPassword)\r\n .directive('pwdReqCapitalLetter', directives.pwdReqCapitalLetter)\r\n .directive('pwdReqNumber', directives.pwdReqNumber)\r\n .directive('pwdReqSymbol', directives.pwdReqSymbol)\r\n .directive('errSrc', directives.errSrc)\r\n .directive('pwCheck', directives.pwCheck)\r\n .directive('setStyle', directives.setStyle)\r\n .directive('numbersOnly', directives.numbersOnly)\r\n .directive('globalEvents', directives.globalEvents)\r\n .directive('stopProp', directives.stopProp)\r\n .directive('showTemp', directives.showTemp)\r\n .directive('focusMe', directives.focusMe)\r\n .directive('inlineSaver', directives.inlineSaver)\r\n .directive('packery', directives.packery)\r\n .directive('whenReady', whenReadyDirective)\r\n .directive('oraclePassword', oraclePasswordDirective)\r\n .directive('component', directives.component)\r\n // inspinia directives\r\n .directive('pageTitle', inspinia.pageTitle)\r\n .directive('sideNavigation', inspinia.sideNavigation)\r\n .directive('iboxTools', inspinia.iboxTools)\r\n .directive('minimalizaSidebar', inspinia.minimalizaSidebar)\r\n .directive('vectorMap', inspinia.vectorMap)\r\n .directive('sparkline', inspinia.sparkline)\r\n .directive('icheck', inspinia.icheck)\r\n .directive('ionRangeSlider', inspinia.ionRangeSlider)\r\n .directive('dropZone', inspinia.dropZone)\r\n .directive('responsiveVideo', inspinia.responsiveVideo)\r\n .directive('chatSlimScroll', inspinia.chatSlimScroll)\r\n .directive('customValid', inspinia.customValid)\r\n .directive('fullScroll', inspinia.fullScroll)\r\n .directive('closeOffCanvas', inspinia.closeOffCanvas)\r\n .directive('clockPicker', inspinia.clockPicker)\r\n .directive('landingScrollspy', inspinia.landingScrollspy)\r\n .directive('fitHeight', inspinia.fitHeight)\r\n .directive('iboxToolsFullScreen', inspinia.iboxToolsFullScreen)\r\n .directive('slimScroll', inspinia.slimScroll)\r\n .name;","export default /*@ngInject*/ function () {\r\n return function (scope, element, attrs, compile) {\r\n if (scope.$last) {\r\n angular.element('#side-menu').addClass(\"nav metismenu\");\r\n angular.element('#side-menu').metisMenu();\r\n }\r\n };\r\n}","/**\r\n * @desc directive to validate oracle password requirements\r\n * @example
\r\n */\r\nexport default function () {\r\n var directive = {\r\n link: link,\r\n require: 'ngModel'\r\n };\r\n return directive;\r\n\r\n function link(scope, elm, attrs, ctrl) {\r\n ctrl.$parsers.unshift(function (password) {\r\n var hasNumbers = /\\d/.test(password);\r\n\r\n if (password.length === 0) {\r\n ctrl.$setValidity('complexity', true);\r\n return password;\r\n } else {\r\n if (password.length >= 8 && hasNumbers) {\r\n ctrl.$setValidity('complexity', true);\r\n return password;\r\n }\r\n else {\r\n ctrl.$setValidity('complexity', false);\r\n return undefined;\r\n }\r\n }\r\n\r\n });\r\n }\r\n}","import '../../ExternalScripts/RaygunSetup';\r\nimport 'jquery';\r\nimport angular from 'angular';\r\nimport 'angular-applicationinsights';\r\nimport 'angular-animate';\r\nimport '../../ExternalScripts/angular-elastic-builder/dist/angular-elastic-builder';\r\nimport 'angular-bootstrap-contextmenu';\r\nimport 'angular-file-saver';\r\nimport 'angular-listview/angular-listview.min';\r\nimport 'angular-recursion';\r\nimport 'angular-resizable';\r\nimport 'angular-route';\r\nimport 'angular-sanitize';\r\nimport 'angular-spinner';\r\nimport 'angular-translate';\r\nimport 'angular-ui-bootstrap';\r\nimport 'angular-wizard';\r\nimport 'bootstrap';\r\nimport FusionCharts from 'fusioncharts';\r\nimport 'angularjs-fusioncharts';\r\nimport Charts from 'fusioncharts/fusioncharts.charts';\r\nimport OceanTheme from 'fusioncharts/themes/fusioncharts.theme.ocean';\r\nimport 'bootstrap';\r\nimport 'metismenu';\r\nimport 'ng-Packery';\r\nimport 'oi.select';\r\nimport '../../ExternalScripts/fastpath-select-tpls';\r\nimport 'v-accordion';\r\nimport '@flowjs/ng-flow/dist/ng-flow-standalone.min';\r\nimport swal from 'sweetalert2';\r\nimport '../../ExternalScripts/Inspina/inspinia';\r\nimport 'sugar/sugar.min';\r\n\r\n//controller imports\r\nimport navCtrl from './Controllers/navController';\r\nimport pageWrapperCtrl from './Controllers/pageWrapper.controller';\r\nimport loginCtrl from './Controllers/login.controller';\r\nimport redirectController from './Controllers/redirectController';\r\nimport callbackController from './Controllers/callback.controller';\r\nimport rootController from '../app.report.rootViewModel';\r\nimport sideNavController from './Controllers/rightSideNavController';\r\nimport { reportToolbarController } from './Controllers/ReportToolbarViewModel';\r\nimport BackNavigationBarController from '../Components/NavigationBar/BackNavigationBarController';\r\nimport dynamicTabController from '../Components/DynamicReports/DynamicTabViewModel';\r\n\r\n//component imports\r\nimport home from '../Components/home/home.component';\r\nimport myDownloads from '../Components/myDownloads/myDownloads.component';\r\nimport signReportFromEmail from '../Components/signReportFromEmail/signReportFromEmail.component';\r\n\r\n//css imports\r\nimport '../../css/site.scss';\r\n\r\n//config imports\r\nimport routeConfig from '../app.route';\r\nimport raygunConfig from './Config/raygun.config';\r\nimport churnZero from './Config/churnZero.config';\r\nimport helpObjectConfig from './Config/helpObject.config';\r\nimport appInsightsConfig from './Config/applicationInsights.config';\r\nimport spinnerConfig from './Config/spinner.config';\r\nimport translationConfig from './Config/translation.config';\r\nimport tenantInterceptorConfig from './Interceptors/tenantInterceptor';\r\nimport authInterceptor from './Interceptors/authInterceptor';\r\nimport responseErrorInterceptorConfig from './Interceptors/responseErrorInterceptor';\r\nimport flowJsConfig from './Config/flowJs.config';\r\nimport locationConfig from './Config/location.config';\r\n\r\n//provider imports\r\nimport dialogsProvider from './Functions/dialogs';\r\nimport modal from 'angular-ui-bootstrap/src/modal';\r\n\r\n//module imports\r\nimport kendoModule from './kendo.module';\r\nimport sharedServicesModule from './sharedServices.module';\r\nimport sharedFactoriesModule from './sharedFactories.module';\r\nimport signalRModule from './signalr.module';\r\nimport sharedComponentsModule from './sharedComponents.module';\r\nimport dashboardReportsModule from './dashboardReports.module';\r\nimport sharedFiltersModule from './sharedFilters.module ';\r\nimport sharedDirectivesModule from './sharedDirectives.module';\r\nimport npsQuestionModalController from './Controllers/npsQuestionModal.controller';\r\n\r\nCharts(FusionCharts);\r\nOceanTheme(FusionCharts);\r\nFusionCharts.options.license({\r\n key: 'KqA8ydjB3B3E2A3B15B10A7E6E6F4C1H2C1nqsB1F2F5cE4F3B9vulC4E3A3jnA-21A5A1B3E-11fbI2J3A4A6A2B4A2A3G1D2G1emoE6E1e1D4akzD7E6F4kzE3MG1B6vpaB2E3C1F3H3A8A6D4A3D3E3B2A12A32y==',\r\n creditLabel: false,\r\n});\r\n\r\nswal.setDefaults({\r\n allowOutsideClick: false,\r\n reverseButtons: true,\r\n confirmButtonClass: 'swal-confirm-button',\r\n cancelButtonClass: 'swal-cancel-button'\r\n\r\n});\r\n\r\n\r\nexport default angular\r\n .module('app.shared', [\r\n 'ngRoute',\r\n 'ngAnimate',\r\n 'flow',\r\n 'kendo.directives',\r\n 'ui.bootstrap',\r\n 'ui.bootstrap.contextMenu',\r\n 'ngFileSaver',\r\n 'oi.select',\r\n 'ngSanitize',\r\n 'mgo-angular-wizard',\r\n 'angularSpinner',\r\n 'angularResizable',\r\n 'ApplicationInsightsModule',\r\n 'listview',\r\n 'vAccordion',\r\n 'ng-fusioncharts',\r\n 'RecursionHelper',\r\n 'ngPackery',\r\n 'angular-elastic-builder',\r\n 'pascalprecht.translate',\r\n modal,\r\n kendoModule,\r\n sharedServicesModule,\r\n sharedFactoriesModule,\r\n sharedComponentsModule,\r\n sharedFiltersModule,\r\n sharedDirectivesModule,\r\n signalRModule,\r\n dashboardReportsModule\r\n ])\r\n\r\n // components\r\n .component(\"home\", home)\r\n .component(\"myDownloads\", myDownloads)\r\n .component(\"signReportFromEmail\", signReportFromEmail)\r\n\r\n // controllers\r\n .controller('navCtrl', navCtrl)\r\n .controller('pageWrapperCtrl', pageWrapperCtrl)\r\n .controller('loginCtrl', loginCtrl)\r\n .controller('redirectCtrl', redirectController)\r\n .controller('callbackCtrl', callbackController)\r\n .controller('rootViewModel', rootController)\r\n .controller('sideNavCtrl', sideNavController)\r\n .controller(\"dynamicTabViewModel\", dynamicTabController)\r\n .controller(\"reportToolbarViewModel\", reportToolbarController)\r\n .controller(\"BackNavigationBarController\", BackNavigationBarController)\r\n .controller(\"npsQuestionModalController\", npsQuestionModalController)\r\n\r\n // configs\r\n .config(routeConfig)\r\n .config(appInsightsConfig)\r\n .config(spinnerConfig)\r\n .config(translationConfig)\r\n .config(tenantInterceptorConfig)\r\n .config(responseErrorInterceptorConfig)\r\n .config(authInterceptor)\r\n .config(flowJsConfig)\r\n //providers\r\n .provider('dialogs', [dialogsProvider])\r\n // runs\r\n .run(raygunConfig)\r\n .run(churnZero)\r\n .run(helpObjectConfig)\r\n .run(locationConfig)\r\n .name;","export default function () {\r\n var _b = 'static'; // backdrop\r\n var _k = true; // keyboard\r\n var _w = 'dialogs-default'; // windowClass\r\n var _bdc = 'dialogs-backdrop-default'; // backdropClass\r\n var _copy = true; // controls use of angular.copy\r\n var _wTmpl = null; // window template\r\n var _wSize = 'md'; // large modal window default\r\n var _animation = true; // true/false to use animation\r\n\r\n var _fa = false; // fontawesome flag\r\n\r\n var _setOpts = function (opts) {\r\n var _opts = {};\r\n opts = opts || {};\r\n _opts.kb = angular.isDefined(opts.keyboard) ? !!opts.keyboard : _k; // values: true,false\r\n _opts.bd = angular.isDefined(opts.backdrop) ? opts.backdrop : _b; // values: 'static',true,false\r\n _opts.bdc = angular.isDefined(opts.backdropClass) ? opts.backdropClass : _bdc; // additional CSS class(es) to be added to the modal backdrop\r\n _opts.ws = angular.isDefined(opts.size) && (opts.size === 'sm' || opts.size === 'lg' || opts.size === 'md') ? opts.size : _wSize; // values: 'sm', 'lg', 'md'\r\n _opts.wc = angular.isDefined(opts.windowClass) ? opts.windowClass : _w; // additional CSS class(es) to be added to a modal window\r\n _opts.anim = angular.isDefined(opts.animation) ? !!opts.animation : _animation; // values: true,false\r\n return _opts;\r\n }; // end _setOpts\r\n\r\n\r\n this.$get = ['$uibModal', function ($uibModal) {\r\n\r\n return {\r\n\r\n create: function (url, ctrlr, data, opts, ctrlAs) {\r\n var copy = opts && angular.isDefined(opts.copy) ? opts.copy : _copy;\r\n opts = _setOpts(opts);\r\n\r\n return $uibModal.open({\r\n templateUrl: url,\r\n controller: ctrlr,\r\n controllerAs: ctrlAs,\r\n keyboard: opts.kb,\r\n backdrop: opts.bd,\r\n backdropClass: opts.bdc,\r\n windowClass: opts.wc,\r\n size: opts.ws,\r\n animation: opts.anim,\r\n resolve: {\r\n data: function () {\r\n if (copy) {\r\n return angular.copy(data);\r\n }\r\n else {\r\n return data;\r\n }\r\n }\r\n }\r\n }); // end modal.open\r\n } // end create\r\n\r\n }; // end return\r\n\r\n }]; // end $get\r\n} // end provider dialogs\r\n//== Dialogs.Main Module =====================================================//\r\n\r\n/**\r\n * Include this module 'dialogs.main' in your module's dependency list where you\r\n * intend to use it. Then inject the 'dialogs' service in your controllers that\r\n * need it.\r\n */","import { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $filter, SavedReportSelectorService, dataService, buildRoleBPPostBody, objectIdDataService, CustomReportServices, $http, $location, helperService, reportsDataService, reportsService, risksDataService, businessProcessDataService) {\r\n\r\n var vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.roleSelectedIds = [];\r\n vm.allRolesOption = true;\r\n vm.updateRoleDataSource = updateRoleDataSource;\r\n vm.urlString = \"\";\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n vm.runSavedReport = runSavedReport;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n\r\n vm.businessProcessDropdownChange = businessProcessDropdownChange;\r\n vm.rulesetDropdownChange = rulesetDropdownChange;\r\n vm.productDropdownChange = productDropdownChange;\r\n\r\n $scope.deleteFilter = deleteFilter;\r\n $scope.clearAllFilters = clearAllFilters;\r\n $scope.saveReportLayoutButton = saveReportLayoutButton;\r\n $scope.applySelectedFilter = applySelectedFilter;\r\n $scope.populateCriteriaModel = populateCriteriaModel;\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n if ($location.path().includes('Detailed')) {\r\n vm.isDetailed = true;\r\n } else {\r\n vm.isDetailed = false;\r\n }\r\n\r\n function activate() {\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n $scope.reportId = securityObject.ReportID;\r\n\r\n // --- Grid initialization ---\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n getReportMetadata().then(_ => {\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n });\r\n // ---\r\n\r\n getRulesets()\r\n .then(_ => {\r\n return getBusinessProcesses();\r\n });\r\n });\r\n }\r\n\r\n activate();\r\n\r\n\r\n function runSavedReport() {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && vm.productsDataSource && vm.roleDataSource && vm.objectDataSource && vm.filterCriteria.fields) {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && vm.productsDataSource && vm.roleDataSource && vm.objectDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n }\r\n\r\n function applySelectedFilter() {\r\n helperService.applyFilterCatchError($scope);\r\n }\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n IsAssigned: { type: \"boolean\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n var data = buildRoleBPPostBody.generateBody($scope.ObjectId, vm.selectedProductId, vm.roles, vm.selectedBusinessProcesses, $scope.reportId, vm.selectedObject.Identifier, vm.selectedRuleset.RulesetId);\r\n\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: vm.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(response => {\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type);\r\n\r\n if (securityObject) {\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedProduct || !vm.selectedBusinessProcesses || !vm.roleSelectedIds || !vm.selectedRuleset || !vm.selectedObject) {\r\n return;\r\n }\r\n vm.product = vm.selectedProduct;\r\n vm.roles = vm.roleSelectedIds;//.map(function (el) { return el.ID; });\r\n vm.ruleset = vm.selectedRuleset;\r\n vm.selectedProductId = [];\r\n vm.businessProcesses = vm.selectedBusinessProcesses;\r\n vm.securityObject = vm.selectedObject;\r\n\r\n var criteria = [];\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObject\", 'SecurityObject', vm.securityObject.AltName, { \"Id\": vm.selectedObject.Identifier }));\r\n\r\n vm.roleSelectedIds.forEach(function (role, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityRoleIdentifier\", 'Role', role.Name, role.Identifier));\r\n });\r\n\r\n vm.selectedBusinessProcesses.forEach(bp => {\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProcessId\", 'BusinessProcessId', bp.Name, bp.Id));\r\n });\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"RulesetId\", 'Ruleset', vm.ruleset.Name, vm.ruleset.RulesetId));\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', vm.product.Name, vm.product.ID));\r\n vm.selectedProductId.push(vm.product.ID);\r\n $scope.reportDetailsModel = criteria;\r\n\r\n vm.urlString = vm.isDetailed ? apiUrl + \"api/arm/sap/places/rolebusinessprocessaccessdetailed\" : apiUrl + \"api/arm/places/rolebusinessprocessaccess\";\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n }\r\n\r\n function setColumns() {\r\n if (vm.isDetailed && vm.selectedProduct.ID === \"SAP\") {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleType\", title: \"Role Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectId\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetLow\", title: \"Ruleset Low\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetHigh\", title: \"RulesetHigh\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"IsAssigned\", width: 180, filterable: customBooleanFilter }\r\n ];\r\n } else {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleType\", title: \"Role Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectId\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"ProductName\", title: \"Product\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n setLayout();\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, null);\r\n }\r\n }\r\n\r\n function deleteFilter(id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n }\r\n\r\n function clearAllFilters() {\r\n $scope.gridDataSource.filter({});\r\n }\r\n\r\n function saveReportLayoutButton() {\r\n CustomReportServices.saveGridLayout($scope, null);\r\n }\r\n\r\n function productDropdownChange() {\r\n setColumns();\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n dataService.getProducts().then(function (response) {\r\n response.data = response.data.filter(p => p.UserHasAccess === true);\r\n vm.productsDataSource = response.data;\r\n let defaultProduct = vm.productsDataSource.find(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n let defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProduct = vm.productsDataSource[defaultProductSelected];\r\n } else {\r\n vm.selectedProduct = response.data[0];\r\n }\r\n\r\n vm.selectedProduct = SavedReportSelectorService.checkSavedReportForSingleProduct($rootScope.loadedSavedReport, response.data, vm.selectedProduct);\r\n productDropdownChange();\r\n runSavedReport();\r\n });\r\n\r\n function getRulesets() {\r\n return risksDataService.getRulesets()\r\n .then(response => {\r\n response.data = $filter('filter')(response.data, { IsEnabled: true });\r\n vm.rulesetDataSource = response.data;\r\n vm.rulesetDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedRuleset = SavedReportSelectorService.checkSavedReportForRuleset($rootScope.loadedSavedReport, response.data, vm.rulesetDataSource);\r\n runSavedReport();\r\n });\r\n }\r\n\r\n function getBusinessProcesses() {\r\n businessProcessDataService.getBusinessProcessesByRiskRuleset(vm.selectedRuleset.RulesetId).then(response => {\r\n var businessProcesses = response.data;\r\n businessProcesses = $filter('orderBy')(response.data, 'Name');\r\n\r\n if (businessProcesses.length > 0) {\r\n vm.allBusinessProcessesDropdownObject = { \"Name\": \"All Business Processes\", \"Id\": \"AllObjectsInMultiSelect\", \"Type\": \"BP\", \"Objects\": [], \"DisplayName\": \"All Business Processes\" };\r\n businessProcesses.unshift(vm.allBusinessProcessesDropdownObject);\r\n }\r\n\r\n vm.businessProcessDataSource = businessProcesses;\r\n\r\n vm.selectedBusinessProcesses = [vm.allBusinessProcessesDropdownObject];\r\n vm.selectedBusinessProcesses = SavedReportSelectorService.checkSavedReportForBusinessProcesses($rootScope.loadedSavedReport, response.data, vm.selectedBusinessProcesses);\r\n businessProcessDropdownChange();\r\n runSavedReport();\r\n });\r\n }\r\n\r\n function businessProcessDropdownChange() {\r\n vm.selectedBusinessProcesses = helperService.deselectAllObjectsIfOtherIsClicked(vm.selectedBusinessProcesses, vm.allBusinessProcessesDropdownObject);\r\n\r\n if (vm.selectedBusinessProcesses) {\r\n\r\n vm.objectDataSource = [];\r\n\r\n if (vm.selectedBusinessProcesses.some(bp => bp.Id === \"AllObjectsInMultiSelect\")) {\r\n vm.businessProcessDataSource.forEach(function (row) {\r\n row.Objects.forEach(function (row) {\r\n vm.objectDataSource.push(row.SecurityObject);\r\n });\r\n });\r\n\r\n vm.objectDataSource = vm.objectDataSource.unique();\r\n } else {\r\n vm.selectedBusinessProcesses.forEach(bp => {\r\n bp.Objects.forEach(object => vm.objectDataSource.push(object.SecurityObject));\r\n });\r\n }\r\n\r\n vm.objectDataSource = $filter('orderBy')(vm.objectDataSource, 'AltName');\r\n vm.objectDataSource.unshift({ \"Id\": null, \"AltName\": \"All Objects\" });\r\n vm.selectedObject = vm.objectDataSource[0];\r\n vm.selectedObject = SavedReportSelectorService.checkSavedReportForObjects($rootScope.loadedSavedReport, vm.objectDataSource, vm.selectedObject);\r\n runSavedReport();\r\n }\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n async function rulesetDropdownChange() {\r\n await getBusinessProcesses();\r\n if (vm.filterCriteria.query && vm.filterCriteria.query.some(criteria => criteria.CriteriaDisplayName.includes(\"Business Process\"))) {\r\n vm.filterCriteria.query = vm.filterCriteria.query.filter(criteria => {\r\n if (criteria.CriteriaDisplayName) {\r\n return !criteria.CriteriaDisplayName.includes(\"Business Process\");\r\n } else {\r\n return criteria;\r\n }\r\n });\r\n vm.filterCriteria.needsUpdate = true;\r\n }\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n function updateRoleDataSource(roleDataSource, roleSelectedIds) {\r\n vm.roleDataSource = roleDataSource;\r\n vm.roleSelectedIds = roleSelectedIds;\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n}","import { customAutoCompleteFilter, standardGridPageSize, customBooleanFilter, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, $filter, dataService, objectIdDataService, CustomReportServices, $http, $location, helperService, reportsDataService, reportsService) {\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n $scope.runSavedReport();\r\n }\r\n });\r\n\r\n var vm = $scope.vm = {};\r\n\r\n vm.allRolesOption = false;\r\n\r\n $scope.helperService = helperService;\r\n\r\n vm.updateRoleDataSource = updateRoleDataSource;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n $scope.$watch('vm.roleSelectedIds', function () {\r\n $scope.populateCriteriaModel();\r\n }, true);\r\n\r\n objectIdDataService.getObjectID().then(async function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n await aLAPluginActive();\r\n\r\n dataService.getProducts().then(function (response) {\r\n vm.multiSelect = true;\r\n response.data = response.data.filter(p => p.UserHasAccess === true);\r\n vm.productsDataSource = response.data;\r\n let defaultProduct = vm.productsDataSource.find(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n let defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if ($scope.isDetailed) {\r\n vm.multiSelect = false;\r\n vm.productsDataSource = vm.productsDataSource.filter(product => product.Type === 'AC' || product.Type === 'AX5' || product.Type === \"AX\" || product.Type === \"AX7\" || product.Type === \"AAD\" || product.Type === 'PS' || product.Type === 'GP' || product.Type === 'D365Bc' || product.Type === 'D365S' || product.Type === 'SL' || product.Type === 'NAV' || product.Type === 'SAPB1' || product.Type === 'JDE' || product.Type === 'CPA' || product.Type === 'SF' || product.Type === 'NS' || product.Type === 'WD' || product.Type === 'INT' || product.Type === 'ORFC' || product.Type === 'Zuo' || product.Type === 'SAP');\r\n let defaultProductExists = vm.productsDataSource.some(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n if (defaultProductExists) {\r\n defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProduct = vm.productsDataSource[defaultProductSelected];\r\n } else {\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n } else {\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n } else {\r\n vm.multiSelect = true;\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProduct = vm.productsDataSource[defaultProductSelected];\r\n } else {\r\n vm.selectedProduct = angular.copy(vm.productsDataSource);\r\n }\r\n }\r\n\r\n vm.selectedProduct = SavedReportSelectorService.checkSavedReportForSingleProduct($rootScope.loadedSavedReport, response.data, vm.selectedProduct);\r\n\r\n if ($scope.isDetailed) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n } else {\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n vm.roleSelectedIds = [];\r\n vm.setColumns();\r\n $scope.runSavedReport();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n getReportMetadata().then(_ => {\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n $scope.runSavedReport();\r\n }\r\n });\r\n // ---\r\n\r\n });\r\n });\r\n\r\n if ($location.path().has('Detailed')) {\r\n $scope.isDetailed = true;\r\n } else {\r\n $scope.isDetailed = false;\r\n }\r\n\r\n $scope.runSavedReport = function () {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && vm.productsDataSource && vm.riskDataSource && vm.roleDataSource && vm.filterCriteria.fields) {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n $scope.generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && vm.productsDataSource && vm.riskDataSource && vm.roleDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n };\r\n\r\n async function aLAPluginActive() {\r\n let response = await $http.get(`${apiUrl}/api/core/plugins`);\r\n vm.aLAPluginActive = response.data.some(plugin => plugin.Id === 9 && plugin.Active);\r\n }\r\n\r\n $scope.productDropdownChange = function () {\r\n if ($scope.isDetailed) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n getReportMetadata();\r\n }\r\n\r\n vm.roleSelectedIds = [];\r\n vm.setColumns();\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n $scope.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n $scope.mainGridOptions.autoBind = false;\r\n\r\n $scope.applySelectedFilter = function () {\r\n helperService.applyFilterCatchError($scope);\r\n };\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n DefaultMitigation: { type: \"boolean\" },\r\n AutoMitigated: { type: \"boolean\" },\r\n RiskId: { type: \"number\" },\r\n IsDefaultRuleset: { type: \"boolean\" },\r\n LastUsed: { type: \"date\" },\r\n ProcessID: { type: \"number\" },\r\n RulesetId: { type: \"number\" },\r\n IsAssigned: { type: \"boolean\" },\r\n ViewCount: { type: \"number\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n var data = { 'RoleIds': $scope.roles, 'RiskIds': $scope.risks, 'RulesetId': vm.selectedRuleset.RulesetId, 'ProductId': $scope.product.ID };\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: $scope.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n if ($scope.isDetailed) {\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type);\r\n\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.populateCriteriaModel = function () {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedProduct || vm.riskSelectedIds === undefined || vm.roleSelectedIds === undefined || !vm.selectedRuleset) {\r\n return;\r\n }\r\n var criteria = [];\r\n\r\n $scope.product = vm.selectedProduct;\r\n if (vm.roleSelectedIds && vm.riskSelectedIds) {\r\n $scope.roles = vm.roleSelectedIds.map(role => role.Identifier);\r\n\r\n $scope.risks = helperService.returnNullIfAllIsFound(vm.riskSelectedIds.map(function (el) { return el.Id; }));\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', $scope.product.Name, $scope.product.ID));\r\n\r\n vm.roleSelectedIds.forEach(function (row, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityRoleIdentifier\", 'Role', row.Name, row.Identifier));\r\n });\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"RulesetId\", 'Ruleset', vm.selectedRuleset.Name, vm.selectedRuleset.RulesetId));\r\n\r\n vm.riskSelectedIds.forEach(function (row, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"RiskId\", 'Risk', row.Name, row.Id));\r\n });\r\n }\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n if ($scope.isDetailed === true) {\r\n let productString = vm.selectedProduct.Type === 'SAP' ? 'SAP' : vm.selectedProduct.ID;\r\n $scope.urlString = apiUrl + 'api/arm/' + productString + '/places/rolerisk';\r\n } else {\r\n $scope.urlString = apiUrl + 'api/arm/places/rolerisk';\r\n }\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n };\r\n\r\n $scope.generateGridWithSelectedValues = function () {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n $scope.populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n };\r\n\r\n vm.setColumns = function () {\r\n\r\n if ($scope.isDetailed === true) {\r\n if (vm.selectedProduct.Type === 'AX' || vm.selectedProduct.Type === 'AX7') {\r\n $scope.mainGridColumns = [\r\n { field: \"RulesetId\", title: \"Ruleset Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsDefaultRuleset\", title: \"Default Ruleset\", width: 150, filterable: customBooleanFilter },\r\n { field: \"RiskId\", title: \"Risk Id\", width: 50, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleSystemName\", title: \"Role System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SubRoleSystemName\", title: \"Sub Role System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DutyName\", title: \"Duty Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DutySystemName\", title: \"Duty System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeSystemName\", title: \"Privilege System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Security Object Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter }\r\n ]; \r\n\r\n if (vm.aLAPluginActive && vm.selectedProduct.Type === 'AX7') {\r\n const lastUsedCol = { field: \"LastUsed\", title: \"Last Used\", template: \"{{ dataItem.LastUsed | date:'short'}}\", width: 200, filterable: customDatePickerFilter },\r\n viewCountCol = { field: \"ViewCount\", title: \"View Count\", width: 130, filterable: customAutoCompleteFilter };\r\n\r\n $scope.mainGridColumns.push(lastUsedCol);\r\n $scope.mainGridColumns.push(viewCountCol);\r\n }\r\n } else if (vm.selectedProduct.Type === 'AAD') {\r\n $scope.mainGridColumns = [\r\n { field: \"RulesetId\", title: \"Ruleset Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsDefaultRuleset\", title: \"Default Ruleset\", width: 150, filterable: customBooleanFilter },\r\n { field: \"RiskId\", title: \"Risk Id\", width: 50, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Permission\", title: \"Permission\", width: 120, filterable: customAutoCompleteFilter }, \r\n { field: \"SecurityObjectName\", title: \"Security Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'GP') {\r\n $scope.mainGridColumns = [\r\n { field: \"RulesetId\", title: \"Ruleset Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsDefaultRuleset\", title: \"Default Ruleset\", width: 150, filterable: customBooleanFilter },\r\n { field: \"RiskId\", title: \"Risk Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"SecurityRoleID\", title: \"Security Role Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleName\", title: \"Security Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleTypeName\", title: \"Security Role Type\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"TaskName\", title: \"Task\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Series\", title: \"Series\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'AX5') {\r\n $scope.mainGridColumns = [\r\n { field: \"RulesetId\", title: \"Ruleset Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsDefaultRuleset\", title: \"Default Ruleset\", width: 150, filterable: customBooleanFilter },\r\n { field: \"RiskId\", title: \"Risk Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"DomainId\", title: \"Domain Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DomainName\", title: \"Domain\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleID\", title: \"Security Group Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleName\", title: \"Security Group\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleTypeName\", title: \"Security Role Type\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"ProcessID\", title: \"Business Process Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n }\r\n else if (vm.selectedProduct.Type === 'SAPB1' || vm.selectedProduct.Type === 'AC' || vm.selectedProduct.Type === 'D365Bc' || vm.selectedProduct.Type === 'D365S' || vm.selectedProduct.Type === 'NAV' || vm.selectedProduct.Type === 'SL' || vm.selectedProduct.Type === 'INT' || vm.selectedProduct.Type === 'Zuo') {\r\n $scope.mainGridColumns = [\r\n { field: \"RulesetId\", title: \"Ruleset Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsDefaultRuleset\", title: \"Default Ruleset\", width: 150, filterable: customBooleanFilter },\r\n { field: \"RiskId\", title: \"Risk Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"SecurityRoleID\", title: \"Security Role Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleName\", title: \"Security Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleTypeName\", title: \"Security Role Type\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'SAP') {\r\n $scope.mainGridColumns = [\r\n { field: \"RulesetId\", title: \"Ruleset Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsDefaultRuleset\", title: \"Default Ruleset\", width: 150, filterable: customBooleanFilter },\r\n { field: \"RiskId\", title: \"Risk Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"SecurityRoleID\", title: \"Security Role Id\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleName\", title: \"Security Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleTypeName\", title: \"Security Role Type\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetLow\", title: \"Ruleset Low\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetHigh\", title: \"Ruleset High\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"TehnicalLow\", title: \"Technical Low\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"TehnicalHigh\", title: \"Technical High\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'PS') {\r\n $scope.mainGridColumns = [\r\n { field: \"RiskId\", title: \"Risk Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PermissionListId\", title: \"Permission List\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"BarName\", title: \"Bar Name\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"ComponentName\", title: \"Component\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MarketName\", title: \"Market\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Security Object Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectLabel\", title: \"Security Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AutoMitigated\", title: \"Auto Mitigated\", width: 120, filterable: customBooleanFilter, hidden: true },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigated\", width: 150, filterable: customBooleanFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'JDE' || vm.selectedProduct.Type === 'SF' || vm.selectedProduct.Type === 'NS' || vm.selectedProduct.Type === 'WD') {\r\n $scope.mainGridColumns = [\r\n { field: \"RiskId\", title: \"Risk Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleName\", title: \"Security Role\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleTypeName\", title: \"Security Role Type\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'CPA' || vm.selectedProduct.Type === 'ORFC') {\r\n $scope.mainGridColumns = [\r\n { field: \"RiskId\", title: \"Risk Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessName\", title: \"Business Process Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleName\", title: \"Security Role\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleTypeName\", title: \"Security Role Type\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectType\", title: \"Security Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 150, filterable: customBooleanFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n }\r\n } else {\r\n $scope.mainGridColumns = [\r\n { field: \"RiskId\", title: \"Risk ID\", width: 50, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 240, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigation\", title: \"Default Mitigation\", width: 75, filterable: customBooleanFilter },\r\n { field: \"BusinessCycleName\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.mainGridOptions.sortable = false;\r\n\r\n $scope.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.setLayout();\r\n };\r\n\r\n vm.setLayout = function () {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, vm.selectedProduct.ID);\r\n }\r\n };\r\n\r\n\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n $scope.deleteFilter = function (id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n };\r\n\r\n $scope.clearAllFilters = function () {\r\n $scope.gridDataSource.filter({});\r\n };\r\n\r\n $scope.saveReportLayoutButton = function () {\r\n CustomReportServices.saveGridLayout($scope, vm.selectedProduct.ID);\r\n };\r\n\r\n vm.deselectSelectedRisk = function () {\r\n vm.riskSelectedIds = helperService.deselectAllObjectsIfOtherIsClicked(vm.riskSelectedIds, vm.allRisksDropdownObject);\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n $http.get(apiUrl + 'api/arm/riskrulesets')\r\n .then(function (response) {\r\n response.data = $filter('filter')(response.data, { IsEnabled: true });\r\n vm.rulesetDataSource = response.data;\r\n vm.rulesetDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedRuleset = SavedReportSelectorService.checkSavedReportForRuleset($rootScope.loadedSavedReport, response.data, vm.rulesetDataSource);\r\n getRisks();\r\n });\r\n\r\n $scope.rulesetDropdownChange = function () {\r\n getRisks();\r\n if (vm.filterCriteria.query && vm.filterCriteria.query.some(criteria => criteria.CriteriaDisplayName.includes(\"Business Process\"))) {\r\n vm.filterCriteria.query = vm.filterCriteria.query.filter(criteria => {\r\n if (criteria.CriteriaDisplayName) {\r\n return !criteria.CriteriaDisplayName.includes(\"Business Process\");\r\n } else {\r\n return criteria;\r\n }\r\n });\r\n vm.filterCriteria.needsUpdate = true;\r\n }\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n function getRisks() {\r\n $http.get(apiUrl + 'api/arm/risks/ruleset/' + vm.selectedRuleset.RulesetId).then(function (response) {\r\n response.data = $filter('filter')(response.data, { Enabled: true });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.allRisksDropdownObject = { \"Name\": \"All Risks\", \"Id\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(vm.allRisksDropdownObject);\r\n vm.riskDataSource = response.data;\r\n vm.riskSelectedIds = [vm.allRisksDropdownObject];\r\n vm.riskSelectedIds = SavedReportSelectorService.checkSavedReportForRisks($rootScope.loadedSavedReport, response.data, vm.riskSelectedIds);\r\n $scope.runSavedReport();\r\n });\r\n }\r\n\r\n function updateRoleDataSource(roleDataSource, roleSelectedIds) {\r\n vm.roleDataSource = roleDataSource;\r\n vm.roleSelectedIds = roleSelectedIds;\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $filter, $location, SavedReportSelectorService, dataService, buildUserBPPostBody, objectIdDataService, CustomReportServices, $http, helperService, reportsDataService, reportsService, risksDataService, businessProcessDataService) {\r\n\r\n var vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.roleSelectedIds = [];\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n vm.selectedCompanies = [];\r\n vm.selectedProducts = [];\r\n\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n\r\n vm.companyDropdownChange = companyDropdownChange;\r\n vm.businessProcessDropdownChange = businessProcessDropdownChange;\r\n vm.productDropdownChange = productDropdownChange;\r\n vm.rulesetDropdownChange = rulesetDropdownChange;\r\n vm.updateUserDataSource = updateUserDataSource;\r\n vm.runSavedReport = runSavedReport;\r\n\r\n $scope.deleteFilter = deleteFilter;\r\n $scope.clearAllFilters = clearAllFilters;\r\n $scope.saveReportLayoutButton = saveReportLayoutButton;\r\n $scope.applySelectedFilter = applySelectedFilter;\r\n $scope.populateCriteriaModel = populateCriteriaModel;\r\n\r\n $scope.$on('kendoWidgetCreated', function (event, widget) {\r\n if (widget === $scope.grid) {\r\n $scope.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n // --- Grid initialization ---\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n activate();\r\n\r\n async function activate() {\r\n\r\n $scope.ObjectId = await objectIdDataService.getObjectID();\r\n await aLAPluginActive();\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n const securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n if ($location.path().has('Detailed')) vm.isDetailed = true;\r\n else vm.isDetailed = false;\r\n\r\n let products = await dataService.getProducts();\r\n products.data = products.data.filter(p => p.UserHasAccess === true);\r\n vm.productsDataSource = products.data;\r\n let defaultProduct = vm.productsDataSource.find(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n let defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if (vm.isDetailed) {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProducts = [vm.productsDataSource[defaultProductSelected]];\r\n } else {\r\n vm.selectedProducts = [vm.productsDataSource[0]];\r\n }\r\n } else {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProducts = [vm.productsDataSource[defaultProductSelected]];\r\n } else {\r\n vm.selectedProducts = angular.copy(vm.productsDataSource);\r\n }\r\n }\r\n\r\n vm.selectedProducts = SavedReportSelectorService.checkSavedReportForProducts($rootScope.loadedSavedReport, products.data, vm.selectedProducts);\r\n\r\n if (vm.isDetailed) {\r\n if (vm.selectedProducts[0].IsCustom) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\").ReportID;\r\n } else {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type).ReportID;\r\n }\r\n } else {\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n await setColumns();\r\n await getCompanies();\r\n await getRulesets();\r\n await getBusinessProcesses();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n await getReportMetadata();\r\n // ---\r\n\r\n runSavedReport();\r\n }\r\n\r\n function runSavedReport() {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && vm.productsDataSource && vm.objectDataSource && vm.companyDataSource && vm.rulesetDataSource && vm.businessProcessDataSource && vm.filterCriteria.fields) {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && vm.productsDataSource && vm.objectDataSource && vm.companyDataSource && vm.rulesetDataSource && vm.businessProcessDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n }\r\n\r\n async function aLAPluginActive() {\r\n let response = await $http.get(`${apiUrl}/api/core/plugins`);\r\n vm.aLAPluginActive = response.data.some(plugin => plugin.Id === 9 && plugin.Active);\r\n }\r\n\r\n function applySelectedFilter() {\r\n helperService.applyFilterCatchError($scope);\r\n }\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n LastRun: { type: \"date\" },\r\n LastUsed: { type: \"date\" },\r\n UseCount: { type: \"number\" },\r\n ViewCount: { type: \"number\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n var data = buildUserBPPostBody.generateBody(vm.selectedCompanies, vm.selectedRuleset, vm.selectedBusinessProcesses, $scope.ObjectId, vm.selectedProducts, vm.selectedObject, vm.selectedUserIds, $scope.reportId);\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: vm.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(response => {\r\n var data = response.data._embedded.reportData;\r\n\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n if (data.length > 0) {\r\n vm.dynamicSideGridDataSource = null;\r\n }\r\n if (vm.isDetailed) {\r\n let securityObject;\r\n if (vm.selectedProducts[0].IsCustom) {\r\n // the security object for custom products has null for product type so we can't send the real product type\r\n securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\");\r\n } else {\r\n securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type);\r\n }\r\n if (securityObject) {\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n }\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n vm.dynamicSideGridOptions = helperService.setNonPageableGridOptions([]);\r\n\r\n function updateUserDataSource(selectedUsers, selectedUserIds, userDataSource) {\r\n vm.users = selectedUsers;\r\n vm.selectedUserIds = selectedUserIds;\r\n vm.userDataSource = userDataSource;\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n function continuePopulateCriteriaModel() {\r\n return vm.selectedProducts && vm.selectedUserIds && vm.selectedCompanies && vm.selectedRuleset && vm.selectedBusinessProcesses && vm.selectedObject;\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // only continue if the proper criteria are loaded\r\n if (continuePopulateCriteriaModel()) {\r\n\r\n vm.products = vm.selectedProducts;\r\n vm.ruleset = vm.selectedRuleset;\r\n vm.users = vm.users?.length ? vm.users : [{ \"Name\": \"All Users\", \"ID\": null }];\r\n vm.businessProcesses = vm.selectedBusinessProcesses;\r\n vm.securityObject = vm.selectedObject;\r\n\r\n var criteria = [];\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObject\", 'SecurityObject', vm.securityObject.AltName, { \"Id\": vm.selectedObject.Identifier }));\r\n\r\n vm.selectedBusinessProcesses.forEach(bp => {\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProcessId\", 'BusinessProcessId', bp.Name, bp.Id));\r\n });\r\n\r\n vm.products.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', row.Name, row.ID));\r\n });\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"RulesetId\", 'Ruleset', vm.ruleset.Name, vm.ruleset.RulesetId));\r\n\r\n vm.users.forEach(function (user) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"UserMasterId\", 'User', user.Name, user.ID));\r\n });\r\n\r\n vm.selectedCompanies.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"CompanyMasterId\", 'Company', row.Name, row.ID));\r\n });\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n vm.urlString = apiUrl + 'api/arm/places/userbusinessprocessaccess';\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n }\r\n\r\n function setColumns() {\r\n if (vm.selectedProducts) {\r\n\r\n if (vm.selectedProducts.length === 1 && vm.isDetailed === true) {\r\n if (vm.selectedProducts[0].Type === 'OR') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserMenuName\", title: \"User Menu Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"UserSubMenuName\", title: \"User Sub Menu Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubMenuName\", title: \"Sub Menu Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Prompt\", title: \"Prompt\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (!helperService.convertConfigValueToTrueFalse('OR_RBACEnabled')) {\r\n vm.mainGridColumns.splice(6, 0, { field: \"Role\", title: \"Role\", width: 180, filterable: customAutoCompleteFilter }, { field: \"RoleCode\", title: \"Role Code\", width: 180, filterable: customAutoCompleteFilter }, { field: \"RoleType\", title: \"Role Type\", width: 180, filterable: customAutoCompleteFilter });\r\n } else {\r\n vm.mainGridColumns.splice(6, 0, { field: \"Responsibility\", title: \"Responsibility\", width: 180, filterable: customAutoCompleteFilter }, { field: \"ResponsibilityID\", title: \"Responsibility ID\", width: 180, filterable: customAutoCompleteFilter }, { field: \"ResponsibilityKey\", title: \"Responsibility Key\", width: 180, filterable: customAutoCompleteFilter });\r\n }\r\n\r\n } else if (vm.selectedProducts[0].Type === 'INT') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Module\", title: \"Module\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n } else if (vm.selectedProducts[0].Type === 'NS') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'NAV') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"FullName\", title: \"Full Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'D365Bc') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'Zuo' || vm.selectedProducts[0].IsCustom) {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'CPA') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AX7') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleSystemName\", title: \"Role System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubRoleSystemName\", title: \"Sub Role System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DutySystemName\", title: \"Duty System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DutyName\", title: \"Duty Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeSystemName\", title: \"Privilege System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"LicenseType\", title: \"License Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (vm.aLAPluginActive) {\r\n const lastUsedCol = { field: \"LastUsed\", title: \"Last Used\", template: \"{{ dataItem.LastUsed | date:'short'}}\", width: 200, filterable: customDatePickerFilter },\r\n viewCountCol = { field: \"ViewCount\", title: \"View Count\", width: 130, filterable: customAutoCompleteFilter };\r\n\r\n vm.mainGridColumns.push(lastUsedCol);\r\n vm.mainGridColumns.push(viewCountCol);\r\n }\r\n } else if (vm.selectedProducts[0].Type === 'AX') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName\", title: \"Sub Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DutyName\", title: \"Duty Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DutyPhysicalName\", title: \"Duty Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegePhysicalName\", title: \"Privilege Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"EntryPointName\", title: \"Entry Point Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"EntryPointPhysicalName\", title: \"Entry Point Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"EntryPointAccessName\", title: \"Entry Point Access\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"EntryPointTypeName\", title: \"Entry Point Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectHelpText\", title: \"Object Help Text\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SAP') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserGroup\", title: \"User Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserType\", title: \"User Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Name\", title: \"Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetLow\", title: \"Ruleset Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetHigh\", title: \"Ruleset High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"UseCount\", title: \"Use Count\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"LastRun\", title: \"Last Run Date\", width: 200, filterable: customDatePickerFilter },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Department\", title: \"Department\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Location\", title: \"Location\", width: 200, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SAPB1') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AuthorizationSource\", title: \"Authorization Source\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SF') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserFullName\", title: \"User Full Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedByType\", title: \"Assigned by Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedByName\", title: \"Assigned by Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Module\", title: \"Module\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'GP') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TaskName\", title: \"Task Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Series\", title: \"Series\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AC') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'PS') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PermissionListId\", title: \"Permission List\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BarName\", title: \"Bar Name\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"ComponentName\", title: \"Component\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MarketName\", title: \"Market\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'JDE') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Version\", title: \"Version\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessSource\", title: \"Access Source\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'ORFC') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName\", title: \"Sub Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegePhysicalName\", title: \"Privilege Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RolePath\", title: \"Role Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AX5') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DomainId\", title: \"Domain\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AXGroup\", title: \"Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SL') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessSource\", title: \"Access Source\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'WD') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityGroup\", title: \"Security Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessType\", title: \"Business Process Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessDefinition\", title: \"Business Process Definition\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"StepOrder\", title: \"Step Order\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoutingRestrictions\", title: \"Routing Restrictions\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Condition\", title: \"Condition\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'D365S') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TeamName\", title: \"Team Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n else if (vm.selectedProducts[0].Type === 'AD') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserId\", title: \"User Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubGroupName\", title: \"Sub-Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n else if (vm.selectedProducts[0].Type === 'AAD') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserId\", title: \"User Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubGroupName\", title: \"Sub-Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'OREPM') {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserID\", title: \"User Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Enabled\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Service\", title: \"Service\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GrantedThroughGroup\", title: \"Granted Through Group\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n } else {\r\n vm.mainGridColumns = [\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"Description\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"CompanyName\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 180, filterable: customAutoCompleteFilter, hidden: true }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n\r\n setLayout();\r\n }\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, null);\r\n }\r\n }\r\n\r\n vm.changeRowSelected = function (kendoEvent) {\r\n\r\n vm.sideGridIsNew = false;\r\n vm.sideGridLoading = true;\r\n vm.dynamicSideGridDataSource = [];\r\n\r\n vm.dynamicSideGridOptions = helperService.setNonPageableGridOptions([]);\r\n vm.sideGridIsNew = true;\r\n var grid = kendoEvent.sender;\r\n vm.sideGridHeader = grid.dataItem(grid.select()).ProductName;\r\n CustomReportServices.getAccessDetailsForRow($scope, grid).then(response => {\r\n if (response.data.length > 0) {\r\n vm.dynamicSideGridColumns = Object.keys(response.data[0]).map(f => {\r\n var column = {};\r\n column.field = f;\r\n column.title = helperService.headerStringTransformer(f);\r\n if (f === 'LastUsed') {\r\n column.template = \"{{ dataItem.LastUsed | date:'short'}}\";\r\n }\r\n return column;\r\n });\r\n vm.dynamicSideGridDataSource = new kendo.data.DataSource({\r\n data: response.data\r\n });\r\n }\r\n });\r\n vm.sideGridLoading = false;\r\n\r\n };\r\n\r\n function deleteFilter(id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n }\r\n\r\n function clearAllFilters() {\r\n $scope.gridDataSource.filter({});\r\n }\r\n\r\n function saveReportLayoutButton() {\r\n CustomReportServices.saveGridLayout($scope, null);\r\n }\r\n\r\n function productDropdownChange() {\r\n if (vm.isDetailed) {\r\n if (vm.selectedProducts && vm.selectedProducts.length > 1) {\r\n vm.selectedProducts.remove(vm.selectedProducts[0]);\r\n }\r\n if (vm.selectedProducts) {\r\n if (vm.selectedProducts[0].IsCustom) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\").ReportID;\r\n } else {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type).ReportID;\r\n }\r\n getReportMetadata();\r\n }\r\n }\r\n setColumns();\r\n }\r\n\r\n function rolesDropdownChange() {\r\n vm.roleSelectedIds = helperService.deselectAllObjectsIfOtherIsClicked(vm.roleSelectedIds, vm.allRolesDropdownObject);\r\n }\r\n\r\n function rulesetDropdownChange() {\r\n getBusinessProcesses();\r\n if (vm.filterCriteria.query && vm.filterCriteria.query.some(criteria => criteria.CriteriaDisplayName.includes(\"Business Process\"))) {\r\n vm.filterCriteria.query = vm.filterCriteria.query.filter(criteria => {\r\n if (criteria.CriteriaDisplayName) {\r\n return !criteria.CriteriaDisplayName.includes(\"Business Process\");\r\n } else {\r\n return criteria;\r\n }\r\n });\r\n vm.filterCriteria.needsUpdate = true;\r\n }\r\n }\r\n\r\n function getCompanies() {\r\n risksDataService.getCompanies().then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.allCompaniesDropdownObject = { \"Name\": \"All Companies\", \"ID\": \"AllObjectsInMultiSelect\" };\r\n response.data = response.data.filter(c => c.UserHasAccess === true);\r\n response.data.unshift(vm.allCompaniesDropdownObject);\r\n vm.companyDataSource = response.data;\r\n let defaultCompany = response.data.find(obj => obj.Name === $rootScope.UserPreferences.PreferredCompany);\r\n let defaultCompanySelected = vm.companyDataSource.indexOf(defaultCompany);\r\n if ($rootScope.UserPreferences.PreferredCompany !== null) {\r\n vm.selectedCompanies = [vm.companyDataSource[defaultCompanySelected]];\r\n } else {\r\n vm.selectedCompanies = [vm.allCompaniesDropdownObject];\r\n }\r\n vm.selectedCompanies = SavedReportSelectorService.checkSavedReportForCompanies($rootScope.loadedSavedReport, response.data, vm.selectedCompanies);\r\n companyDropdownChange();\r\n runSavedReport();\r\n });\r\n }\r\n\r\n function getRulesets() {\r\n return risksDataService.getRulesets()\r\n .then(response => {\r\n response.data = $filter('filter')(response.data, { IsEnabled: true });\r\n vm.rulesetDataSource = response.data;\r\n vm.rulesetDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedRuleset = SavedReportSelectorService.checkSavedReportForRuleset($rootScope.loadedSavedReport, response.data, vm.rulesetDataSource);\r\n runSavedReport();\r\n });\r\n }\r\n\r\n async function getBusinessProcesses() {\r\n if (vm.selectedBusinessProcesses) {\r\n vm.selectedBusinessProcesses = null;\r\n }\r\n let response = await businessProcessDataService.getBusinessProcessesByRiskRuleset(vm.selectedRuleset.RulesetId);\r\n let businessProcesses = response.data;\r\n businessProcesses = $filter('orderBy')(response.data, 'Name');\r\n\r\n if (businessProcesses.length > 0) {\r\n vm.invalidRuleset = false;\r\n vm.allBusinessProcessesDropdownObject = { \"Name\": \"All Business Processes\", \"Id\": \"AllObjectsInMultiSelect\", \"Type\": \"BP\", \"Objects\": [], \"DisplayName\": \"All Business Processes\" };\r\n businessProcesses.unshift(vm.allBusinessProcessesDropdownObject); vm.businessProcessDataSource = businessProcesses;\r\n vm.selectedBusinessProcesses = [vm.allBusinessProcessesDropdownObject];\r\n vm.selectedBusinessProcesses = SavedReportSelectorService.checkSavedReportForBusinessProcesses($rootScope.loadedSavedReport, response.data, vm.selectedBusinessProcesses);\r\n businessProcessDropdownChange();\r\n runSavedReport();\r\n } else {\r\n vm.invalidRuleset = true;\r\n }\r\n }\r\n\r\n function businessProcessDropdownChange() {\r\n vm.selectedBusinessProcesses = helperService.deselectAllObjectsIfOtherIsClicked(vm.selectedBusinessProcesses, vm.allBusinessProcessesDropdownObject);\r\n\r\n if (vm.selectedBusinessProcesses) {\r\n\r\n vm.objectDataSource = [];\r\n\r\n if (vm.selectedBusinessProcesses.some(bp => bp.Id === \"AllObjectsInMultiSelect\")) {\r\n vm.businessProcessDataSource.forEach(function (row) {\r\n row.Objects.forEach(function (row) {\r\n vm.objectDataSource.push(row.SecurityObject);\r\n });\r\n });\r\n\r\n vm.objectDataSource = vm.objectDataSource.unique();\r\n } else {\r\n vm.selectedBusinessProcesses.forEach(bp => {\r\n bp.Objects.forEach(object => vm.objectDataSource.push(object.SecurityObject));\r\n });\r\n vm.objectDataSource = vm.objectDataSource.unique();\r\n }\r\n\r\n vm.objectDataSource = $filter('orderBy')(vm.objectDataSource, 'AltName');\r\n vm.objectDataSource.unshift({ \"Id\": null, \"AltName\": \"All Objects\" });\r\n vm.selectedObject = vm.objectDataSource[0];\r\n vm.selectedObject = SavedReportSelectorService.checkSavedReportForObjects($rootScope.loadedSavedReport, vm.objectDataSource, vm.selectedObject);\r\n runSavedReport();\r\n }\r\n }\r\n\r\n function companyDropdownChange(companies) {\r\n if (companies) {\r\n vm.selectedCompanies = helperService.deselectAllObjectsIfOtherIsClicked(companies, vm.allCompaniesDropdownObject);\r\n } else {\r\n vm.selectedCompanies = helperService.deselectAllObjectsIfOtherIsClicked(vm.selectedCompanies, vm.allCompaniesDropdownObject);\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n if (vm.selectedProducts.some(product => product.Type === 'OR')) {\r\n if (helperService.convertConfigValueToTrueFalse('OR_RBACEnabled')) {\r\n vm.reportMetadata.Columns = vm.reportMetadata.Columns.filter(column => column.FieldName !== \"Role\" && column.FieldName !== \"RoleCode\" && column.FieldName !== \"RoleType\");\r\n } else {\r\n vm.reportMetadata.Columns = vm.reportMetadata.Columns.filter(column => column.FieldName !== \"Responsibility\" && column.FieldName !== \"ResponsibilityID\" && column.FieldName !== \"ResponsibilityKey\");\r\n }\r\n }\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, $filter, $timeout, helperService, $http, statusDataService, controlLibraryDataService, FileSaver) {\r\n\r\n var vm = $scope.vm = {};\r\n const riskToMitigate = $scope.riskToMitigate;\r\n\r\n $scope.originalMitigation = riskToMitigate.MitigationID;\r\n $scope.originalStatus = riskToMitigate.StatusID;\r\n $scope.originalMitigationNotes = riskToMitigate.MitigationNotes;\r\n $scope.originalExpirationDate = riskToMitigate.ExpirationDate;\r\n $scope.deleteRiskMitigationRecord = deleteRiskMitigationRecord;\r\n $scope.okMitigateRisk = okMitigateRisk;\r\n $scope.deselectSelectedCompany = deselectSelectedCompany;\r\n $scope.saveAttachments = saveAttachments;\r\n $scope.removeFile = removeFile;\r\n $scope.downloadFile = downloadFile;\r\n $scope.minimumExpiryDate = new Date();\r\n\r\n $http.get(apiUrl + 'api/core/configuration/ARM_StandardMitigations').then(function (response) {\r\n $scope.standardMitigations = response.data;\r\n });\r\n\r\n $scope.controlsLoading = true;\r\n $http.get(apiUrl + 'api/arm/controls').then(function (response) {\r\n $scope.controlLibrary = response.data;\r\n if (riskToMitigate.Status != 'New') {\r\n $http.get(apiUrl + 'api/arm/usermitigations/risk/' + riskToMitigate.RiskId + '/user/' + riskToMitigate.UserMasterID + '/company/' + riskToMitigate.CompanyMasterID).then(function (response) {\r\n $scope.selectedControls = new Array();\r\n $scope.originalControls = new Array();\r\n if (response.data.Controls != null && response.data.Controls != undefined && response.data.Controls.length > 0) {\r\n for (var i = 0; i < response.data.Controls.length; ++i) {\r\n var matchingControl = $scope.controlLibrary.find(x => x.Identifier === response.data.Controls[i].ControlId);\r\n if (matchingControl != null && matchingControl != undefined) {\r\n $scope.selectedControls.push(matchingControl);\r\n $scope.originalControls.push(matchingControl);\r\n }\r\n }\r\n }\r\n if (response.data.Attachments.length > 0) {\r\n $scope.riskToMitigate.attachments = [...response.data.Attachments];\r\n }\r\n if (response.data.ExpirationDate) {\r\n $scope.originalExpirationDate = response.data.ExpirationDate.slice();\r\n $scope.riskToMitigate.ExpirationDate = response.data.ExpirationDate.slice();\r\n }\r\n $scope.controlsLoading = false;\r\n });\r\n }\r\n else {\r\n $scope.riskToMitigate.StatusID = \"\";\r\n $scope.selectedControls = new Array();\r\n $scope.originalControls = new Array();\r\n $scope.controlsLoading = false;\r\n }\r\n });\r\n\r\n $http.get(apiUrl + 'api/universal/companies/user/' + riskToMitigate.UserMasterID + '/risk/' + riskToMitigate.RiskId).then(function (response) {\r\n var index = -1;\r\n for (var i = 0, len = response.data.length; i < len; i++) {\r\n if (response.data[i].ID === riskToMitigate.CompanyMasterID) {\r\n index = i;\r\n response.data.splice(index, 1);\r\n break;\r\n }\r\n }\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.mitigateAddtionalDataSource = response.data;\r\n\r\n if ($scope.mitigateAddtionalDataSource.length > 1) {\r\n\r\n $scope.allCompaniesDropdownObject = {\r\n Name: 'All Companies',\r\n ID: 'AllObjectsInMultiSelect'\r\n };\r\n $scope.mitigateAddtionalDataSource.unshift($scope.allCompaniesDropdownObject);\r\n }\r\n });\r\n\r\n $http.get(apiUrl + 'api/arm/risks/' + riskToMitigate.RiskId).then(function (response) {\r\n $scope.riskObjects = response.data;\r\n });\r\n\r\n if ($scope.riskToMitigate.Status === 'New') {\r\n $http.get(`${apiUrl}api/arm/usermitigations/user/${$scope.riskToMitigate.UserMasterID}/company/${$scope.riskToMitigate.CompanyMasterID}/risk/${$scope.riskToMitigate.RiskId}`).then(response => {\r\n $scope.expiredMitigationsDataSource = response.data;\r\n });\r\n }\r\n\r\n $scope.similarMitigationsDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/arm/usermitigations/risk/' + riskToMitigate.RiskId + '/user/' + riskToMitigate.UserMasterID + '/similar').then(function (response) {\r\n options.success(response.data);\r\n $scope.similarMitigations = response.data;\r\n }, function (response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (riskToMitigate.UserMitigationID) {\r\n $http.get(apiUrl + 'api/arm/usermitigations/' + riskToMitigate.UserMitigationID + '/history').then(function (response) {\r\n $scope.mitigationHistoryDataSource = response.data;\r\n });\r\n }\r\n\r\n $scope.mitigatedRisk = {\r\n selectedMitigateAddtional: '',\r\n companyIds: ''\r\n };\r\n\r\n var similarMitigationColumns = [\r\n { field: \"UseMitigation\", title: \" \", template: \"
Apply\", width: 80, filterable: false },\r\n { field: \"UserMasterName\", title: \"User Name\", width: 105, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyMasterName\", title: \"Company Name\", width: 175, filterable: customAutoCompleteFilter },\r\n { field: \"StatusName\", title: \"Status\", width: 125, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationName\", title: \"Mitigation\", width: 105, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 155, filterable: customAutoCompleteFilter },\r\n { field: \"ControlsString\", title: \"Controls\", width: 165, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n $scope.similarMitigationsGridOptions = helperService.setMainGridOptions(similarMitigationColumns);\r\n\r\n\r\n $http.get(apiUrl + 'api/arm/mitigations').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.mitigations = response.data;\r\n });\r\n\r\n statusDataService.getStatuses().then(function (response) {\r\n response.data = $filter('filter')(response.data, { CanCurrentUserAccess: true });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.statuses = response.data;\r\n\r\n $scope.statuses.unshift({\r\n ID: \"\",\r\n Name: \"-- Select a Status --\"\r\n })\r\n\r\n });\r\n\r\n $scope.companyIds = {};\r\n\r\n $scope.useMitigation = function (risk) {\r\n $scope.similarIsCollapsed = false;\r\n $timeout(function () {\r\n riskToMitigate.StatusID = risk.StatusID;\r\n riskToMitigate.MitigationID = risk.MitigationID;\r\n riskToMitigate.MitigationNotes = risk.MitigationNotes;\r\n var newCons = new Array();\r\n if (risk.Controls != null && risk.Controls != undefined && risk.Controls.length > 0) {\r\n riskToMitigate.MitigationID = null;\r\n for (var i = 0; i < risk.Controls.length; ++i) {\r\n var matchingControl = $scope.controlLibrary.find(x => x.Identifier === risk.Controls[i].ControlId);\r\n if (matchingControl != null && matchingControl != undefined) {\r\n newCons.push(matchingControl);\r\n }\r\n }\r\n }\r\n $scope.selectedControls = newCons;\r\n }, 500);\r\n };\r\n\r\n $scope.controlsEqual = function () {\r\n if ($scope.originalControls == undefined || $scope.selectedControls == undefined) return true;\r\n if ($scope.originalControls.length != $scope.selectedControls.length) return false;\r\n if ($scope.originalControls.map(x => x.Identifier).sort().join(',') === $scope.selectedControls.map(x => x.Identifier).sort().join(',')) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n function okMitigateRisk() {\r\n\r\n var methodType = '';\r\n var data = '';\r\n var url = '';\r\n\r\n if (riskToMitigate.Status != 'New') {\r\n\r\n methodType = 'PUT';\r\n url = apiUrl + 'api/arm/usermitigations/' + riskToMitigate.UserMitigationID;\r\n\r\n data = {\r\n \"ID\": riskToMitigate.UserMitigationID,\r\n \"CompanyMasterIds\": [riskToMitigate.CompanyMasterID],\r\n \"RiskId\": riskToMitigate.RiskId,\r\n \"IsAutoMitigated\": riskToMitigate.AutoMitigated,\r\n \"MitigationID\": riskToMitigate.MitigationID,\r\n \"MitigationNotes\": riskToMitigate.MitigationNotes,\r\n \"StatusID\": riskToMitigate.StatusID,\r\n \"UserMasterID\": riskToMitigate.UserMasterID,\r\n \"Controls\": $scope.selectedControls.map(x => x.Identifier),\r\n \"ExpirationDate\": riskToMitigate.ExpirationDate\r\n };\r\n } else {\r\n\r\n methodType = 'POST';\r\n url = apiUrl + 'api/arm/usermitigations';\r\n\r\n data = {\r\n \"CompanyMasterIds\": [riskToMitigate.CompanyMasterID],\r\n \"RiskId\": riskToMitigate.RiskId,\r\n \"IsAutoMitigated\": riskToMitigate.AutoMitigated,\r\n \"MitigationID\": riskToMitigate.MitigationID,\r\n \"MitigationNotes\": riskToMitigate.MitigationNotes,\r\n \"StatusID\": riskToMitigate.StatusID,\r\n \"UserMasterID\": riskToMitigate.UserMasterID,\r\n \"Controls\": $scope.selectedControls.map(x => x.Identifier),\r\n \"ExpirationDate\": riskToMitigate.ExpirationDate\r\n };\r\n }\r\n\r\n $scope.updateInProgress = new createSpinner();\r\n $http({\r\n method: methodType,\r\n url: url,\r\n data: data\r\n }).then(function successCallback(response) {\r\n\r\n switch (methodType) {\r\n case 'PUT':\r\n saveAttachments($scope.vm.attachments.flow.files, riskToMitigate.UserMitigationID);\r\n mitigateInAdditionalCompanies(riskToMitigate.UserMitigationID);\r\n break;\r\n case 'POST':\r\n saveAttachments($scope.vm.attachments.flow.files, response.data);\r\n mitigateInAdditionalCompanies(response.data[0]);\r\n break;\r\n\r\n }\r\n\r\n\r\n $timeout(function () {\r\n $scope.killModal = true;\r\n\r\n helperService.successfulSaveButton($scope.updateInProgress).then(function (result) {\r\n $scope.$parent.gridDataSource.read();\r\n $uibModalInstance.close();\r\n });\r\n\r\n }, 2000);\r\n\r\n }, function errorCallback(response) {\r\n $scope.updateInProgress.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n\r\n async function saveAttachments(files, userMitigationId, companies) {\r\n if (files.length === 0) {\r\n return;\r\n }\r\n let fd = new FormData();\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"UserMitigation\");\r\n\r\n if (companies) {\r\n fd.append('DataTypeId', companies);\r\n await controlLibraryDataService.addAttachments(fd);\r\n }\r\n else {\r\n fd.append('DataTypeId', [userMitigationId]);\r\n await controlLibraryDataService.addAttachments(fd);\r\n }\r\n }\r\n\r\n async function removeFile(file) {\r\n $scope.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n const index = $scope.riskToMitigate.attachments.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n $scope.riskToMitigate.attachments.splice(index, 1);\r\n $scope.fileActionPending = false;\r\n } catch (_) {\r\n $scope.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function downloadFile(file) {\r\n $scope.fileActionPending = true;\r\n\r\n try {\r\n let response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n $scope.fileActionPending = false;\r\n } catch (_) {\r\n $scope.fileActionPending = false;\r\n }\r\n }\r\n\r\n function mitigateInAdditionalCompanies(mitigationId) {\r\n if ($scope.mitigatedRisk !== '' && $scope.mitigatedRisk.companyIds !== '') {\r\n let id = mitigationId;\r\n\r\n $scope.additionalCompanies = [];\r\n\r\n if ($scope.mitigatedRisk.companyIds[0].Name === 'All Companies') {\r\n $scope.mitigateAddtionalDataSource.forEach(company => $scope.additionalCompanies.push(company.ID));\r\n $scope.additionalCompanies.shift();\r\n } else {\r\n $scope.mitigatedRisk.companyIds.forEach(company => { $scope.additionalCompanies.push(company.ID); });\r\n }\r\n\r\n let data = {\r\n \"ID\": id,\r\n \"CompanyMasterIds\": $scope.additionalCompanies,\r\n \"RiskId\": riskToMitigate.RiskId,\r\n \"IsAutoMitigated\": riskToMitigate.AutoMitigated,\r\n \"MitigationID\": riskToMitigate.MitigationID,\r\n \"MitigationNotes\": riskToMitigate.MitigationNotes,\r\n \"StatusID\": riskToMitigate.StatusID,\r\n \"UserMasterID\": riskToMitigate.UserMasterID,\r\n \"Controls\": $scope.selectedControls.map(x => x.Identifier),\r\n \"ExpirationDate\": riskToMitigate.ExpirationDate\r\n };\r\n\r\n $http({ method: 'PUT', url: apiUrl + 'api/arm/usermitigations/' + id, data: data })\r\n .then(response => {\r\n return;\r\n \r\n }).catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n }\r\n\r\n function deselectSelectedCompany(companies) {\r\n if (companies) {\r\n $scope.mitigatedRisk.companyIds = helperService.deselectAllObjectsIfOtherIsClicked(companies, $scope.allCompaniesDropdownObject);\r\n } else {\r\n $scope.mitigatedRisk.companyIds = helperService.deselectAllObjectsIfOtherIsClicked($scope.mitigatedRisk.companyIds, $scope.allCompaniesDropdownObject);\r\n }\r\n }\r\n\r\n function deleteRiskMitigationRecord() {\r\n swal(helperService.areYouSureParams('Delete Risk Mitigation', 'Are you sure you want to delete Default this risk mitigation record?', 'Delete'))\r\n .then(_ => {\r\n $scope.deleteInProgress = new createSpinner();\r\n $http.delete(apiUrl + 'api/arm/usermitigations/' + riskToMitigate.UserMitigationID);\r\n $timeout(_ => {\r\n $scope.killModal = true;\r\n helperService.successfulSaveButton($scope.deleteInProgress)\r\n .then(result => {\r\n $scope.$parent.gridDataSource.read();\r\n $uibModalInstance.close();\r\n });\r\n }, 2000);\r\n })\r\n .catch(dismiss => {\r\n return;\r\n });\r\n }\r\n\r\n $scope.cancel = function () { $uibModalInstance.close(); };\r\n\r\n}\r\n","import userRisksMitigationModalController from \"./userRisksMitigationModal.controller\";\r\nimport { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $uibModal, SavedReportSelectorService, CustomReportServices, BuildUserRisksPostBody, dataService, objectIdDataService, configurationDataService, $filter, $http, $location, helperService, risksDataService, reportsDataService, reportsService) {\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n $scope.helperService = helperService;\r\n $scope.populateCriteriaModel = populateCriteriaModel;\r\n\r\n var vm = $scope.vm = {};\r\n\r\n vm.selectedCompanies = [];\r\n vm.riskSelectedIds = [];\r\n vm.selectedProducts = [];\r\n vm.dynamicSideGridDataSourceArray = [];\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.productDropdownChange = productDropdownChange;\r\n vm.companyDropdownChange = companyDropdownChange;\r\n vm.rulesetDropdownChange = rulesetDropdownChange;\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.updateUserDataSource = updateUserDataSource;\r\n vm.runSavedReport = runSavedReport;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n activate();\r\n\r\n function activate() {\r\n aLAPluginActive();\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n $scope.reportId = securityObject.ReportID;\r\n\r\n dataService.getProducts().then(async response => {\r\n response.data = response.data.filter(p => p.UserHasAccess === true);\r\n vm.productsDataSource = response.data;\r\n let defaultProduct = vm.productsDataSource.find(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n let defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if (vm.isDetailed || vm.isRoleDetail) {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProducts = [vm.productsDataSource[defaultProductSelected]];\r\n } else {\r\n vm.productsDataSource = vm.productsDataSource.filter(p => p.Type !== 'AD')\r\n vm.selectedProducts = [vm.productsDataSource[0]];\r\n }\r\n } else {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProducts = [vm.productsDataSource[defaultProductSelected]];\r\n } else {\r\n vm.selectedProducts = angular.copy(vm.productsDataSource);\r\n }\r\n runSavedReport();\r\n }\r\n\r\n vm.selectedProducts = SavedReportSelectorService.checkSavedReportForProducts($rootScope.loadedSavedReport, response.data, vm.selectedProducts);\r\n\r\n if (vm.selectedProducts[0].Type === 'SAP') {\r\n let { data: s4Enabled } = await configurationDataService.getProductConfigurationValueByName('SAP', 'SAP_ErpType');\r\n vm.s4Enabled = s4Enabled.Value === 'S4';\r\n }\r\n\r\n if (vm.isDetailed || (vm.isRoleDetail && vm.selectedProducts[0].Type === 'SAP')) {\r\n if (vm.selectedProducts[0].IsCustom) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\").ReportID;\r\n } else {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type).ReportID;\r\n }\r\n\r\n } else {\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n vm.setColumns();\r\n runSavedReport();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n getReportMetadata().then(_ => {\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n });\r\n // ---\r\n });\r\n\r\n });\r\n\r\n getCompanies();\r\n getRulesets()\r\n .then(_ => {\r\n return getRisks();\r\n });\r\n }\r\n\r\n if ($location.path().has('Detailed')) {\r\n vm.isDetailed = true;\r\n } else {\r\n vm.isDetailed = false;\r\n }\r\n\r\n if ($location.path().has('RoleDetail')) {\r\n vm.isRoleDetail = true;\r\n } else {\r\n vm.isRoleDetail = false;\r\n }\r\n\r\n function runSavedReport() {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && vm.productsDataSource && vm.companyDataSource && vm.userDataSource && vm.riskDataSource && vm.rulesetDataSource && vm.filterCriteria.fields) {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.generateGridWithSelectedValues();\r\n vm.filterCriteria.needsUpdate = true;\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && vm.productsDataSource && vm.companyDataSource && vm.userDataSource && vm.riskDataSource && vm.rulesetDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n }\r\n\r\n // Used in App\\Shared\\Partials\\PageHeader.html(26)\r\n $scope.changeView = function () {\r\n if (vm.isDetailed === true) {\r\n $location.path('/AccessControl/Place/UserRisk').search('');\r\n } else {\r\n $location.path('/AccessControl/Place/UserRiskDetailed').search('');\r\n }\r\n };\r\n\r\n // Used in App\\Shared\\Partials\\FilterManagerModal.html(10)\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n vm.dynamicSideGridOptions = helperService.setNonPageableGridOptions([]);\r\n\r\n // Used in App\\Shared\\Partials\\ReportToolbar.html(8)\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n // Used in App\\Shared\\Partials\\ReportToolbar.html(10)\r\n $scope.applySelectedFilter = function () {\r\n helperService.applyFilterCatchError($scope);\r\n };\r\n\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n $scope.openModal = function () {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/userRisk/userRisksMitigationModal.html',\r\n controller: userRisksMitigationModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n $scope.mitigateRisk = function (dataItem) {\r\n $scope.riskToMitigate = angular.copy(dataItem);\r\n $scope.openModal();\r\n };\r\n\r\n vm.deselectSelectedRisk = function () {\r\n vm.riskSelectedIds = helperService.deselectAllObjectsIfOtherIsClicked(vm.riskSelectedIds, vm.allRisksDropdownObject);\r\n };\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n DefaultMitigated: { type: \"boolean\" },\r\n DefaultMitigationCondition: { type: \"boolean\" },\r\n AutoMitigated: { type: \"boolean\" },\r\n RiskId: { type: \"number\" },\r\n LastRun: { type: \"date\" },\r\n LastUsed: { type: \"date\" },\r\n UseCount: { type: \"number\" },\r\n ViewCount: { type: \"number\" },\r\n UserLastUpdatedDate: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n var data = BuildUserRisksPostBody.generateBody($scope.ObjectId, vm.selectedUserIds, $scope.companies, $scope.risks, $scope.products, vm.selectedRuleset.RulesetId);\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: $scope.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n var data = response.data._embedded.reportData;\r\n\r\n data = $filter('orderBy')(data, 'UserName');\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n if (vm.isDetailed) {\r\n let securityObject;\r\n if (vm.selectedProducts[0].IsCustom) {\r\n // the security object for custom products has null for product type so we can't send the real product type\r\n securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\");\r\n } else {\r\n securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type);\r\n }\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n if (data.length > 0) {\r\n vm.dynamicSideGridDataSourceArray = [];\r\n }\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n function updateUserDataSource(selectedUsers, selectedUserIds, userDataSource) {\r\n vm.users = selectedUsers;\r\n vm.selectedUserIds = selectedUserIds;\r\n vm.userDataSource = userDataSource;\r\n populateCriteriaModel();\r\n }\r\n\r\n function continuePopulateCriteriaModel() {\r\n return vm.selectedProducts && vm.selectedUserIds && vm.selectedCompanies && vm.riskSelectedIds;\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // only continue if the proper criteria are loaded\r\n if (continuePopulateCriteriaModel()) {\r\n\r\n var criteria = [];\r\n\r\n $scope.products = vm.selectedProducts;\r\n $scope.users = vm.users?.length ? vm.users : [{ \"Name\": \"All Users\", \"ID\": null }];\r\n $scope.companies = vm.selectedCompanies;\r\n $scope.risks = vm.riskSelectedIds;\r\n\r\n $scope.products.forEach(function (row, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', row.Name, row.ID));\r\n });\r\n\r\n $scope.users.forEach(function (user) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"UserMasterId\", 'User', user.Name, user.ID));\r\n });\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"RulesetId\", 'Ruleset', vm.selectedRuleset.Name, vm.selectedRuleset.RulesetId));\r\n\r\n $scope.companies.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"CompanyMasterId\", 'Company', row.Name, row.ID));\r\n });\r\n\r\n $scope.risks.forEach(function (row, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"RiskId\", 'Risk', row.Name, row.Id));\r\n });\r\n\r\n if (vm.isRoleDetail) {\r\n if (vm.selectedProducts[0].Type === 'SAP') {\r\n $scope.urlString = `${apiUrl}api/arm/sap/places/userriskroledetail`;\r\n } else {\r\n $scope.urlString = `${apiUrl}api/arm/places/userriskroledetail`;\r\n }\r\n } else if (vm.selectedProducts.length === 1) {\r\n setSingleProductRoute()\r\n } else {\r\n setMultiProductRoute();\r\n }\r\n\r\n function setSingleProductRoute() {\r\n if (vm.isDetailed) {\r\n let productString = vm.selectedProducts[0].Type === 'SAP' ? 'SAP' : vm.selectedProducts[0].ID;\r\n $scope.urlString = `${apiUrl}api/arm/${productString}/places/userrisk`;\r\n } else {\r\n $scope.urlString = `${apiUrl}api/arm/places/userrisk`;\r\n }\r\n }\r\n\r\n function setMultiProductRoute() {\r\n $scope.urlString = `${apiUrl}api/arm/places/userrisk`;\r\n }\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n }\r\n\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n }\r\n\r\n vm.setColumns = function () {\r\n if (vm.selectedProducts) {\r\n\r\n if (vm.selectedProducts.length === 1 && vm.isDetailed === true) {\r\n if (vm.selectedProducts[0].Type === 'OR') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Responsibility\", title: \"Responsibility\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ResponsibilityKey\", title: \"Responsibility Key\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ResponsibilityID\", title: \"Responsibility ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserMenuName\", title: \"User Menu Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu Name\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"UserSubMenuName\", title: \"User Sub Menu Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubMenuName\", title: \"Sub Menu Name\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"User Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"FunctionDescription\", title: \"Object Description\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AutoMitigated\", title: \"Auto Mitigated\", width: 180, filterable: customBooleanFilter },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Prompt\", title: \"Prompt\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (!helperService.convertConfigValueToTrueFalse('OR_RBACEnabled')) {\r\n $scope.mainGridColumns.splice(14, 0, { field: \"Role\", title: \"Role\", width: 180, filterable: customAutoCompleteFilter }, { field: \"RoleCode\", title: \"Role Code\", width: 180, filterable: customAutoCompleteFilter });\r\n $scope.mainGridColumns.splice(17, 0, { field: \"AssignmentType\", title: \"Assignment Type\", width: 180, filterable: customAutoCompleteFilter })\r\n }\r\n\r\n } else if (vm.selectedProducts[0].Type === 'INT') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object Label\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ApplicationName\", title: \"Application Name\", width: 180, filterable: customAutoCompleteFilter, hidden: !helperService.convertConfigValueToTrueFalse(\"INT_RoleBasedSecurity\") },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter, hidden: helperService.convertConfigValueToTrueFalse(\"INT_RoleBasedSecurity\") },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n } else if (vm.selectedProducts[0].Type === 'NS') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserType\", title: \"User Type\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle \", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description \", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Security Object\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"AccessType\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Role\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'NAV') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"FullName\", title: \"Full Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle \", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevel\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description \", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'D365Bc') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle \", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevel\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description \", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'Zuo') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle \", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevel\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description \", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'CPA') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle \", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description \", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AX7') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectID\", title: \"Security Object ID\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleSystemName\", title: \"Role System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubRoleSystemName\", title: \"Sub Role System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DutyName\", title: \"Duty\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"DutySystemName\", title: \"Duty System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeSystemName\", title: \"Privilege System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Policy\", title: \"Policy\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (vm.aLAPluginActive) {\r\n const lastUsedCol = { field: \"LastUsed\", title: \"Last Used\", template: \"{{ dataItem.LastUsed | date:'short'}}\", width: 200, filterable: customDatePickerFilter },\r\n viewCountCol = { field: \"ViewCount\", title: \"View Count\", width: 130, filterable: customAutoCompleteFilter };\r\n\r\n $scope.mainGridColumns.push(lastUsedCol);\r\n $scope.mainGridColumns.push(viewCountCol);\r\n }\r\n } else if (vm.selectedProducts[0].Type === 'SAP') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserGroup\", title: \"User Group\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserType\", title: \"User Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Role\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompositeRole\", title: \"Composite Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Label\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetLow\", title: \"Ruleset Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetHigh\", title: \"Ruleset High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AutoMitigated\", title: \"Auto Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"UseCount\", title: \"Use Count\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"LastRun\", title: \"Last Run Date\", template: \"{{ dataItem.LastRun | date:'short'}}\", width: 200, filterable: customDatePickerFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SAPB1') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AuthorizationSource\", title: \"Authorization Source\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SF') {\r\n $scope.mainGridColumns = [\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductModule\", title: \"Module\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedByType\", title: \"Access by Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedBy\", title: \"Access By\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter }\r\n\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'GP') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TaskId\", title: \"Task ID\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TaskName\", title: \"Task\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Series\", title: \"Series\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Alt Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AX') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName\", title: \"Sub Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DutyName\", title: \"Duty\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"DutyPhysicalName\", title: \"Duty Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegePhysicalName\", title: \"Privilege Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"EntryPointName\", title: \"Entry Point Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"EntryPointID\", title: \"Entry Point Physical Name\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"EntryPointTypeName\", title: \"Entry Point Type Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"EntryPointAccess\", title: \"Entry Point Access\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object Alt Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AC') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object Label\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'PS') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", filterable: customAutoCompleteFilter, width: 90 },\r\n { field: \"SecurityObjectProductName\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object Label\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"PermissionListId\", title: \"Permission List\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"BarName\", title: \"Bar Name\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"ComponentName\", title: \"Component\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MarketName\", title: \"Market\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'JDE') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object Label\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Version\", title: \"Version\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessSource\", title: \"Access Source\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'ORFC') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"DefaultMitigationCondition\", title: \"Default Mitigation Condition\", width: 180, filterable: customBooleanFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName\", title: \"Sub Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AutoMitigated\", title: \"Auto Mitigated\", width: 180, filterable: customBooleanFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserLastUpdatedBy\", title: \"User Last Updated By\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"UserLastUpdatedDate\", title: \"User Last Updated Date\", template: \"{{ dataItem.UserLastUpdatedDate | date:'short'}}\", width: 200, filterable: customDatePickerFilter },\r\n { field: \"RolePath\", title: \"Role Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AX5') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupId\", title: \"AX Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DomainId\", title: \"AX Domain\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AAD') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Role\", title: \"Role\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Group\", title: \"Entra ID Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubGroup\", title: \"Entra ID SubGroup\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SL') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessSource\", title: \"Access Source\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'WD') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: \"Object Product Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityGroup\", title: \"Security Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessType\", title: \"Business Process Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessDefinition\", title: \"Business Process Definition\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"StepOrder\", title: \"Step Order\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoutingRestrictions\", title: \"Routing Restrictions\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Condition\", title: \"Condition\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CostCenter\", title: \"Cost Center\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Country\", title: \"Country\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"JobProfile\", title: \"Job Profile\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Manager\", title: \"Manager\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"WorkerStatus\", title: \"Worker Status\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'D365S') {\r\n $scope.mainGridColumns = [\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TeamName\", title: \"Team Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeName\", title: \"Privilege\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Alt Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'OREPM') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: 'User Id', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: 'User Name', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: 'Risk Id', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: 'Risk Name', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: 'Description', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: 'Risk', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: 'Policy', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: 'Business Cycle', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: 'Default Mitigated', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: 'Assigned User', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: 'Mitigation', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: 'Mitigation Controls', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: 'Mitigation Notes', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: 'Business Process', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: 'Group Name', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: 'Group Type', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProductName\", title: 'Object Product', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: 'Object Label', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: 'Object Name', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: 'Object Type', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Service\", title: 'Service', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"GrantedThroughGroup\", title: 'Granted Through Group', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: 'User Enabled', width: 190, filterable: customAutoCompleteFilter },\r\n ];\r\n } else if (vm.selectedProducts[0].IsCustom === true) {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 320, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleType\", title: \"Role Type\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Role\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectProductName\", title: 'Object Product', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: 'Object Label', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: 'Object Name', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: 'Object Type', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: 'Access Type', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: 'Access Level', width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"AutoMitigated\", title: \"Auto Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"DefaultMitigationCondition\", title: \"Default Mitigation Condition\", width: 180, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", filterable: customAutoCompleteFilter, width: 190 },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n } else if (vm.isRoleDetail) {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 320, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleType\", title: \"Role Type\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Role\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AutoMitigated\", title: \"Auto Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"DefaultMitigationCondition\", title: \"Default Mitigation Condition\", width: 180, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", filterable: customAutoCompleteFilter, width: 190 },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n if (vm.selectedProducts[0].Type === 'SAP') {\r\n let roleIndex = $scope.mainGridColumns.findIndex(column => column.field === 'Role');\r\n $scope.mainGridColumns.splice(roleIndex + 1, 0, { field: \"RoleDescription\", title: \"Role Description\", width: 130, filterable: customAutoCompleteFilter }, { field: \"CompositeRole\", title: \"Composite Role\", width: 130, filterable: customAutoCompleteFilter }, { field: \"CompositeRoleDescription\", title: \"Composite Role Description\", width: 320, filterable: customAutoCompleteFilter });\r\n if (vm.s4Enabled) {\r\n $scope.mainGridColumns.splice(roleIndex + 4, 0, { field: \"Catalog\", title: \"Catalog\", width: 130, filterable: customAutoCompleteFilter }, { field: \"CatalogDescription\", title: \"Catalog Description\", width: 130, filterable: customAutoCompleteFilter })\r\n }\r\n\r\n let mitigationNotesIndex = $scope.mainGridColumns.findIndex(column => column.field === 'MitigationNotes');\r\n $scope.mainGridColumns.splice(mitigationNotesIndex + 1, 0,\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Department\", title: \"Department\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Location\", title: \"Location\", width: 200, filterable: customAutoCompleteFilter }\r\n );\r\n }\r\n } else {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 320, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Department\", title: \"Department\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Location\", title: \"Location\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AutoMitigated\", title: \"Auto Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"DefaultMitigated\", title: \"Default Mitigated\", width: 130, filterable: customBooleanFilter, hidden: true },\r\n { field: \"Status\", title: \"Status\", template: \"
{{dataItem.Status}}{{dataItem.Status}}\", filterable: customAutoCompleteFilter, width: 190 },\r\n { field: \"Company\", title: \"Company\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyIds\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUser\", title: \"Assigned User\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n setLayout();\r\n }\r\n };\r\n\r\n function setLayout() {\r\n\r\n var productId;\r\n if (vm.isDetailed === true && vm.selectedProducts.length === 1) {\r\n productId = vm.selectedProducts[0].ID;\r\n }\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, productId);\r\n }\r\n }\r\n\r\n function productDropdownChange() {\r\n if (vm.isDetailed) {\r\n if (vm.selectedProducts && vm.selectedProducts.length > 1) {\r\n vm.selectedProducts.remove(vm.selectedProducts[0]);\r\n }\r\n }\r\n if (vm.isRoleDetail) {\r\n if (vm.selectedProducts && vm.selectedProducts.length > 1) {\r\n // check to see if all products have same product Type\r\n if (vm.selectedProducts.some(product => product.Type !== vm.selectedProducts[0].Type)) {\r\n // if the last added product doesn't match type, we need to replace the array with the new product\r\n vm.selectedProducts = [vm.selectedProducts[vm.selectedProducts.length - 1]];\r\n }\r\n }\r\n }\r\n if (vm.isDetailed || vm.isRoleDetail) {\r\n if (vm.selectedProducts) {\r\n if ((vm.selectedProducts[0].Type === 'SAP' && vm.isRoleDetail) || vm.isDetailed) {\r\n if (vm.selectedProducts[0].IsCustom) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\").ReportID;\r\n } else {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type).ReportID\r\n }\r\n } else {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId).ReportID;\r\n }\r\n getReportMetadata();\r\n }\r\n }\r\n vm.setColumns();\r\n }\r\n\r\n async function aLAPluginActive() {\r\n let response = await $http.get(`${apiUrl}/api/core/plugins`);\r\n vm.aLAPluginActive = response.data.some(plugin => plugin.Id === 9 && plugin.Active);\r\n }\r\n\r\n function getCompanies() {\r\n return risksDataService.getCompanies()\r\n .then(response => {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.allCompaniesDropdownObject = { \"Name\": \"All Companies\", \"ID\": \"AllObjectsInMultiSelect\" };\r\n response.data = response.data.filter(c => c.UserHasAccess === true);\r\n response.data.unshift(vm.allCompaniesDropdownObject);\r\n vm.companyDataSource = response.data;\r\n let defaultCompany = response.data.find(obj => obj.Name === $rootScope.UserPreferences.PreferredCompany);\r\n let defaultCompanySelected = vm.companyDataSource.indexOf(defaultCompany);\r\n if ($rootScope.UserPreferences.PreferredCompany !== null) {\r\n vm.selectedCompanies = [vm.companyDataSource[defaultCompanySelected]];\r\n } else {\r\n vm.selectedCompanies = [vm.allCompaniesDropdownObject];\r\n }\r\n vm.selectedCompanies = SavedReportSelectorService.checkSavedReportForCompanies($rootScope.loadedSavedReport, response.data, vm.selectedCompanies);\r\n vm.companyDropdownChange();\r\n runSavedReport();\r\n });\r\n }\r\n\r\n function getRulesets() {\r\n return risksDataService.getRulesets()\r\n .then(response => {\r\n response.data = $filter('filter')(response.data, { IsEnabled: true });\r\n vm.rulesetDataSource = response.data;\r\n vm.rulesetDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedRuleset = SavedReportSelectorService.checkSavedReportForRuleset($rootScope.loadedSavedReport, response.data, vm.rulesetDataSource);\r\n runSavedReport();\r\n });\r\n }\r\n\r\n function getRisks() {\r\n return risksDataService.getRisks(vm.selectedRuleset.RulesetId)\r\n .then(response => {\r\n response.data = $filter('filter')(response.data, { Enabled: true });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.allRisksDropdownObject = { \"Name\": \"All Risks\", \"Id\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(vm.allRisksDropdownObject);\r\n vm.riskDataSource = response.data;\r\n vm.riskSelectedIds = [vm.allRisksDropdownObject];\r\n vm.riskSelectedIds = SavedReportSelectorService.checkSavedReportForRisks($rootScope.loadedSavedReport, response.data, vm.riskSelectedIds);\r\n runSavedReport();\r\n });\r\n }\r\n\r\n function companyDropdownChange(companies) {\r\n if (companies) {\r\n vm.selectedCompanies = helperService.deselectAllObjectsIfOtherIsClicked(companies, vm.allCompaniesDropdownObject);\r\n } else {\r\n vm.selectedCompanies = helperService.deselectAllObjectsIfOtherIsClicked(vm.selectedCompanies, vm.allCompaniesDropdownObject);\r\n }\r\n }\r\n\r\n function rulesetDropdownChange() {\r\n getRisks();\r\n if (vm.filterCriteria.query && vm.filterCriteria.query.some(criteria => criteria.CriteriaDisplayName.includes(\"Business Process\"))) {\r\n vm.filterCriteria.query = vm.filterCriteria.query.filter(criteria => {\r\n if (criteria.CriteriaDisplayName) {\r\n return !criteria.CriteriaDisplayName.includes(\"Business Process\");\r\n } else {\r\n return criteria;\r\n }\r\n });\r\n vm.filterCriteria.needsUpdate = true;\r\n }\r\n }\r\n\r\n function changeRowSelected(kendoEvent) {\r\n vm.sideGridIsNew = false;\r\n vm.sideGridLoading = true;\r\n vm.dynamicSideGridDataSourceArray = [];\r\n vm.dynamicSideGridDataSource = [];\r\n\r\n vm.dynamicSideGridOptions = helperService.setNonPageableGridOptions([]);\r\n vm.sideGridIsNew = true;\r\n var grid = kendoEvent.sender;\r\n $scope.sideGridHeader = grid.dataItem(grid.select()).ProductName;\r\n CustomReportServices.getATChangeCountForRow($scope, grid);\r\n CustomReportServices.getAccessDetailsForRowUserRisks(vm, grid).then(response => {\r\n if (response.data.length > 0) {\r\n CustomReportServices.getAccessDetailsForEachProduct(response.data, grid).then(productAccessDetailsResponse => {\r\n vm.accessDetailsForEachProduct = productAccessDetailsResponse;\r\n vm.accessDetailsForEachProduct = vm.accessDetailsForEachProduct.filter(row => row.DataSource.length > 0);\r\n createDataSources();\r\n });\r\n }\r\n\r\n function createDataSources() {\r\n\r\n vm.accessDetailsForEachProduct.forEach((row, i) => {\r\n let dynamicSideGridColumns = Object.keys(row.DataSource[0]).map(f => {\r\n var column = {};\r\n column.field = f;\r\n column.title = helperService.headerStringTransformer(f);\r\n if (f === 'LastUsed') {\r\n column.template = \"{{ dataItem.LastUsed | date:'short'}}\";\r\n }\r\n return column;\r\n });\r\n vm.dynamicSideGridDataSource = new kendo.data.DataSource({\r\n data: row.DataSource\r\n });\r\n vm.dynamicSideGridDataSourceArray.push({ 'Columns': dynamicSideGridColumns, 'Product': row.Product, 'DataSource': vm.dynamicSideGridDataSource });\r\n });\r\n vm.sideGridLoading = false;\r\n }\r\n });\r\n }\r\n\r\n // Used in App\\Shared\\Services\\reportService.js(16)\r\n $scope.deleteFilter = function (id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n };\r\n\r\n // Used in App\\Shared\\Partials\\ReportToolbar.html(85)\r\n $scope.clearAllFilters = function () {\r\n $scope.gridDataSource.filter({});\r\n };\r\n\r\n // Used in App\\Shared\\Partials\\ReportToolbar.html(48)\r\n $scope.saveReportLayoutButton = function () {\r\n var productId;\r\n if (vm.isDetailed === true && vm.selectedProducts.length === 1) {\r\n productId = vm.selectedProducts[0].ID;\r\n }\r\n CustomReportServices.saveGridLayout($scope, productId);\r\n };\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n if (vm.selectedProducts.some(product => product.Type === 'OR')) {\r\n if (helperService.convertConfigValueToTrueFalse('OR_RBACEnabled')) {\r\n vm.reportMetadata.Columns = vm.reportMetadata.Columns.filter(column => column.FieldName !== \"Role\" && column.FieldName !== \"RoleCode\" && column.FieldName !== \"RoleType\");\r\n } else {\r\n vm.reportMetadata.Columns = vm.reportMetadata.Columns.filter(column => column.FieldName !== \"Responsibility\" && column.FieldName !== \"ResponsibilityID\" && column.FieldName !== \"ResponsibilityKey\");\r\n }\r\n }\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n\r\n}","import { customAutoCompleteFilter, customDatePickerFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $uibModalInstance, $http, helperService) {\r\n $scope.cancel = _ => {\r\n $uibModalInstance.close();\r\n };\r\n\r\n var report = $scope.report;\r\n\r\n var data = {\r\n \"TransactionId\": report.TransactionInternalID,\r\n \"Date\": report.LastTransactionModifiedDate,\r\n \"MasterDataId\": report.MasterDataID\r\n };\r\n var url = \"\";\r\n\r\n if ($rootScope.NSQuantDetailViewOptions.viewBy === \"byUser\" || $rootScope.NSQuantDetailViewOptions.viewBy === \"byRisk\") {\r\n data[\"UserId\"] = report.UserInternalID;\r\n url = 'api/arm/ns/quantification/details/user';\r\n } else if ($rootScope.NSQuantDetailViewOptions.viewBy === \"byRole\") {\r\n data[\"RoleId\"] = report.RoleID;\r\n url = 'api/arm/ns/quantification/details/role';\r\n }\r\n\r\n $scope.reportDetailsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Date: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: options => {\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + url,\r\n data: data\r\n }).then(response => {\r\n options.success(response.data.TransactionChanges);\r\n });\r\n }\r\n }\r\n });\r\n\r\n getReportDetailsGridColumns();\r\n $scope.reportDetailsGridOptions = helperService.setMainGridOptions($scope.reportDetailsGridColumns, 400);\r\n $scope.reportDetailsGridOptions.selectable = false;\r\n\r\n function getReportDetailsGridColumns() {\r\n $scope.reportDetailIdentifier;\r\n if (report.RoleID) {\r\n $scope.reportDetailIdentifier = \"User\";\r\n } else {\r\n $scope.reportDetailIdentifier = \"Role\";\r\n }\r\n\r\n $scope.reportDetailsGridColumns = [\r\n { field: $scope.reportDetailIdentifier, title: $scope.reportDetailIdentifier, filterable: customAutoCompleteFilter },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"Context\", title: \"Context\", filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\nimport NSQuantificationViewDetailsModalController from \"./NSQuantificationViewDetailsModalController\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, KPIGeneratorService, ViewProductImportPageService, objectIdDataService, $http, helperService, $uibModal) {\r\n\r\n var vm = $scope.vm = {};\r\n var initialLoad = true;\r\n\r\n objectIdDataService.getObjectID().then(objectId => {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n $http.get(apiUrl + 'api/core/charts')\r\n .then(response => {\r\n $scope.charts = response.data;\r\n $scope.chartType = $scope.getChartType();\r\n });\r\n\r\n if (!$rootScope.NSQuantDetailViewOptions) {\r\n $rootScope.NSQuantDetailViewOptions = {\r\n viewBy: \"byUser\",\r\n riskType: \"actual\"\r\n };\r\n }\r\n\r\n $scope.NSQuantValues = {\r\n byUserActual: {\r\n chartId: \"11329697-D17B-43D9-8260-F6761D05AA32\",\r\n reportId: 16221,\r\n detailId: 16217\r\n },\r\n byUserPotential: {\r\n chartId: \"84AC0CBC-C2AB-442F-98D6-ECCC871B1D08\",\r\n reportId: 16222,\r\n detailId: 16215\r\n },\r\n byRoleActual: {\r\n chartId: \"DDE440F5-0542-4566-8838-B244657C2957\",\r\n reportId: 16219,\r\n detailId: 16218\r\n },\r\n byRolePotential: {\r\n chartId: \"1B65B9C0-EE5F-4347-BF09-49D78746B7D3\",\r\n reportId: 16220,\r\n detailId: 16216\r\n },\r\n byRiskActual: {\r\n chartId: \"A7BA97A3-4011-4017-A802-FDBE432A57FC\",\r\n reportId: 16221,\r\n detailId: 16217\r\n },\r\n byRiskPotential: {\r\n chartId: \"B3A5EB46-1D18-4A2F-85AD-7CA43F20DC90\",\r\n reportId: 16222,\r\n detailId: 16215\r\n }\r\n };\r\n\r\n // Helper functions\r\n\r\n $scope.getViewOptions = _ => {\r\n return $rootScope.NSQuantDetailViewOptions.viewBy + $scope.convertUpperCase($rootScope.NSQuantDetailViewOptions.riskType);\r\n };\r\n\r\n $scope.getChartId = _ => {\r\n return $scope.NSQuantValues[$scope.getViewOptions()].chartId;\r\n };\r\n\r\n $scope.getReportObjectId = _ => {\r\n return $scope.NSQuantValues[$scope.getViewOptions()].reportId;\r\n };\r\n\r\n $scope.getDetailObjectId = _ => {\r\n return $scope.NSQuantValues[$scope.getViewOptions()].detailId;\r\n };\r\n\r\n $scope.convertTitleCase = string => {\r\n return string.replace(/^[a-z]|[A-Z]/g, (v, i) => {\r\n return i === 0 ? v.toUpperCase() : \" \" + v.toUpperCase();\r\n });\r\n };\r\n\r\n $scope.convertUpperCase = string => {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n };\r\n\r\n $scope.getChartType = _ => {\r\n var selectedChartId = $scope.getChartId().toLowerCase().toString();\r\n var selectedChart = $scope.charts.find(chart => chart.Id === selectedChartId);\r\n\r\n return selectedChart.ChartType;\r\n };\r\n\r\n // Chart\r\n\r\n $scope.getChart = _ => {\r\n $scope.chartLoading = true;\r\n $scope.selectedItem = null;\r\n $scope.showDetailsGrid = false;\r\n $scope.chartDataSource = {\r\n chart: {\r\n caption: $scope.convertUpperCase($rootScope.NSQuantDetailViewOptions.riskType + \" \" + $scope.convertTitleCase($rootScope.NSQuantDetailViewOptions.viewBy)),\r\n theme: \"ocean\",\r\n valueFontSize: \"11\"\r\n },\r\n data: []\r\n };\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/core/charts/' + $scope.getChartId() + '/data'\r\n }).then(response => {\r\n $scope.chartDataSource.data = response.data;\r\n $scope.chartLoading = false;\r\n });\r\n };\r\n\r\n $scope.getChart();\r\n\r\n // Chart sub summary\r\n\r\n function highlightSelectedItem(ev, props) {\r\n var dataSource = ev.sender.args.dataSource.data;\r\n for (var i = 0; i < dataSource.length; i++) {\r\n if (i === props.index) {\r\n dataSource[i].color = \"#4F7E98\";\r\n } else {\r\n delete dataSource[i].color;\r\n }\r\n }\r\n ev.sender.args.dataSource.data = dataSource;\r\n ev.sender.setJSONData(ev.sender.args.dataSource);\r\n }\r\n\r\n $scope.fusionChartEvents = {\r\n dataPlotClick: (ev, props) => {\r\n var row = ev.sender.args.dataSource.data[props.index];\r\n $scope.selectItem(row, $rootScope.NSQuantDetailViewOptions.viewBy);\r\n highlightSelectedItem(ev, props);\r\n }\r\n };\r\n\r\n $scope.createPartialSavedReportAndNavigate = (filters, objectId) => {\r\n $rootScope.loadedSavedReport = KPIGeneratorService.createSavedReportStub(filters, objectId);\r\n ViewProductImportPageService.launchReportByObjectId(objectId);\r\n };\r\n\r\n $scope.selectItem = (row, type) => {\r\n $scope.selectedItem = row;\r\n $scope.showDetailsGrid = false;\r\n $scope.selectedChartLoading = true;\r\n var data = { Filters: [], Sorts: [], DateFilters: [] };\r\n var filter = {};\r\n $scope.filterFieldName = \"RiskName\";\r\n\r\n if ($rootScope.NSQuantDetailViewOptions.viewBy === \"byRole\") {\r\n filter = { FieldName: \"RoleName\", Operator: \"Contains\", Value: row.Label };\r\n data.Filters.push(filter);\r\n } else if ($rootScope.NSQuantDetailViewOptions.viewBy === \"byUser\") {\r\n filter = { FieldName: \"UserName\", Operator: \"Contains\", Value: row.Label };\r\n data.Filters.push(filter);\r\n } else if ($rootScope.NSQuantDetailViewOptions.viewBy === \"byRisk\") {\r\n $scope.filterFieldName = \"UserName\";\r\n filter = { FieldName: \"RiskName\", Operator: \"Contains\", Value: row.Label };\r\n data.Filters.push(filter);\r\n }\r\n\r\n $http.post(apiUrl + 'api/core/reports/execute/' + $scope.getReportObjectId(), data).then(response => {\r\n $scope.selectedItemData = response.data._embedded.reportData;\r\n $scope.selectedChartLoading = false;\r\n }).catch(response => {\r\n $scope.selectedChartLoading = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.getDetails = row => {\r\n $scope.showDetailsGrid = true;\r\n $scope.selectedRow = row;\r\n var viewOptions = $scope.getViewOptions();\r\n $scope.detailsGridColumns = [];\r\n\r\n function getColumns() {\r\n\r\n if (viewOptions === 'byUserActual' || viewOptions === 'byRiskActual') {\r\n $scope.detailsGridColumns = [\r\n { field: \"UserInternalID\", title: \"User Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionInternalID\", title: \"Transaction Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionRecordName\", title: \"Transaction\", template: \"
{{dataItem.TransactionRecordName}}\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionCurrency\", title: \"Transaction Currency\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionValue\", title: \"Transaction Value\", filterable: customAutoCompleteFilter },\r\n { field: \"LastTransactionModifiedDate\", title: \"Transaction Last Modified\", template: \"{{dataItem.LastTransactionModifiedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"MasterDataInternalID\", title: \"Master Data Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"MasterDataRecordName\", title: \"Master Data\", template: \"
{{dataItem.MasterDataRecordName}}\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n } else if (viewOptions === 'byUserPotential' || viewOptions === 'byRiskPotential') {\r\n $scope.detailsGridColumns = [\r\n { field: \"UserInternalID\", title: \"User Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionInternalID\", title: \"Transaction Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionRecordName\", title: \"Transaction\", template: \"
{{dataItem.TransactionRecordName}}\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionCurrency\", title: \"Transaction Currency\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionValue\", title: \"Transaction Value\", filterable: customAutoCompleteFilter },\r\n { field: \"LastTransactionModifiedDate\", title: \"Transaction Last Modified\", template: \"{{dataItem.LastTransactionModifiedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n } else if (viewOptions === 'byRoleActual') {\r\n $scope.detailsGridColumns = [\r\n { field: \"RoleID\", title: \"Role Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionInternalID\", title: \"Transaction Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionRecordName\", title: \"Transaction\", template: \"
{{dataItem.TransactionRecordName}}\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionCurrency\", title: \"Transaction Currency\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionValue\", title: \"Transaction Value\", filterable: customAutoCompleteFilter },\r\n { field: \"LastTransactionModifiedDate\", title: \"Transaction Last Modified\", template: \"{{dataItem.LastTransactionModifiedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"MasterDataInternalID\", title: \"Master Data Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"MasterDataRecordName\", title: \"Master Data\", template: \"
{{dataItem.MasterDataRecordName}}\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (viewOptions === 'byRolePotential') {\r\n $scope.detailsGridColumns = [\r\n { field: \"RoleID\", title: \"Role Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionInternalID\", title: \"Transaction Internal ID\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionRecordName\", title: \"Transaction\", template: \"
{{dataItem.TransactionRecordName}}\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionCurrency\", title: \"Transaction Currency\", filterable: customAutoCompleteFilter },\r\n { field: \"TransactionValue\", title: \"Transaction Value\", filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 90, filterable: customAutoCompleteFilter },\r\n { field: \"LastTransactionModifiedDate\", title: \"Transaction Last Modified\", template: \"{{dataItem.LastTransactionModifiedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n\r\n var detailsColumn = { field: \"Details\", title: \"Details\", template: \"
View Details\", filterable: customAutoCompleteFilter };\r\n $scope.detailsGridColumns.unshift(detailsColumn);\r\n\r\n }\r\n\r\n function setGridOptions() {\r\n $scope.detailsGridOptions = helperService.setMainGridOptions($scope.detailsGridColumns, 400);\r\n $scope.detailsGridOptions.selectable = false;\r\n }\r\n\r\n getColumns();\r\n setGridOptions();\r\n if (!initialLoad) {\r\n $scope.detailsGridDataSource.page(1);\r\n }\r\n };\r\n\r\n $scope.detailsGridDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n LastTransactionModifiedDate: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n\r\n read: options => {\r\n var selectedFilter = {};\r\n\r\n $scope.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n $scope.sortsAndFilters.Filters.push({ FieldName: \"RiskName\", Operator: \"Contains\", Value: $scope.selectedRow.RiskName });\r\n\r\n if ($rootScope.NSQuantDetailViewOptions.viewBy === \"byRole\") {\r\n selectedFilter = { FieldName: \"RoleName\", Operator: \"Contains\", Value: $scope.selectedRow.RoleName };\r\n $scope.sortsAndFilters.Filters.push(selectedFilter);\r\n } else if ($rootScope.NSQuantDetailViewOptions.viewBy === \"byUser\" || $rootScope.NSQuantDetailViewOptions.viewBy === \"byRisk\") {\r\n selectedFilter = { FieldName: \"UserName\", Operator: \"Contains\", Value: $scope.selectedRow.UserName };\r\n $scope.sortsAndFilters.Filters.push(selectedFilter);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/core/reports/execute/' + $scope.getDetailObjectId(),\r\n data: $scope.sortsAndFilters,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(response => {\r\n options.success(response.data);\r\n $scope.enableGrid = true;\r\n }).catch(response => options.error());\r\n }\r\n },\r\n requestEnd: function() {\r\n initialLoad = false;\r\n }\r\n });\r\n\r\n $scope.viewDetails = dataItem => {\r\n $scope.report = angular.copy(dataItem);\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteArmQuantification/ViewDetailsModal.html',\r\n controller: NSQuantificationViewDetailsModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n}","import { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, objectIdDataService, $http, $location, helperService) {\r\n\r\n objectIdDataService.getObjectID().then(objectId => {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n $scope.$evalAsync();\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n\r\n $scope.showSetup = false;\r\n\r\n vm.selectDetailView = (viewBy, riskType) => {\r\n $rootScope.NSQuantDetailViewOptions = {\r\n viewBy: viewBy,\r\n riskType: riskType\r\n };\r\n $location.path('/AccessControl/Place/NetSuiteRiskQuantification/Details').search({});\r\n };\r\n\r\n // Setup\r\n\r\n $scope.helperService.getConfigurationValue('NS_QuantificationThreshold').then(data => vm.QuantificationThreshold = data);\r\n\r\n $scope.helperService.getConfigurationValue('NS_QuantificationLastDays').then(data => vm.QuantificationLastDays = data);\r\n\r\n var columnsForRiskRuleset = [\r\n { template: \"
\", width: 55, filterable: false },\r\n { field: \"RiskName\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n $scope.riskGridOptions = helperService.setNonPageableGridOptions(columnsForRiskRuleset, 600);\r\n\r\n // Setup functions\r\n\r\n $scope.riskGridDataSource = new kendo.data.DataSource({\r\n sort: { field: \"RiskName\", dir: \"asc\" },\r\n transport: {\r\n\r\n read: options => {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/arm/ns/quantification/risks'\r\n }).then(response => options.success(response.data));\r\n }\r\n }\r\n });\r\n\r\n $scope.toggleValue = dataItem => {\r\n\r\n var selectedCheckboxValue = dataItem.RiskQuantifiable;\r\n\r\n if (selectedCheckboxValue === true) {\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/arm/risks/' + dataItem.RiskId + '/quantification',\r\n data: {}\r\n }).then(response => { return; }).catch(response => helperService.showErrorMessage(response.data));\r\n } else {\r\n $http({\r\n method: 'DELETE',\r\n url: apiUrl + 'api/arm/risks/' + dataItem.RiskId + '/quantification'\r\n }).then(response => { return; }).catch(response => helperService.showErrorMessage(response.data));\r\n }\r\n };\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $uibModal, $filter, objectIdDataService, $http, helperService) {\r\n\r\n $scope.helperService = helperService;\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n var vm = $scope.vm = {};\r\n\r\n $scope.selectedDetailView = 'User';\r\n $scope.simulationViewToShow = 1;\r\n\r\n $scope.saveAsExcel = function (simulation) {\r\n\r\n var postData = {\r\n \"NsRsHeaderId\": simulation.Id\r\n };\r\n\r\n $http.post(apiUrl + '/api/arm/ns/risks/export', postData).then(function successCallback(response) {\r\n\r\n response.data = { ExportId: response.data };\r\n\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.menuOptions = [\r\n {\r\n text: 'Verify',\r\n click: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n $scope.deploySimulation(simulation);\r\n },\r\n enabled: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n var result = simulation.StatusName === 'Ready' ? true : false;\r\n return result;\r\n }\r\n },\r\n {\r\n text: 'Export to Excel',\r\n click: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n $scope.saveAsExcel(simulation);\r\n },\r\n enabled: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n var result = simulation.StatusName === 'Ready' ? true : false;\r\n return result;\r\n }\r\n },\r\n {\r\n text: 'Reprocess',\r\n click: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n $scope.reprocessSimulation(simulation);\r\n },\r\n enabled: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n var result = simulation.StatusName === 'Error' || simulation.StatusName === 'Ready' ? true : false;\r\n return result;\r\n }\r\n },\r\n null,\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n $scope.editSimulation(simulation);\r\n },\r\n enabled: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n var result = simulation.StatusName === 'Ready' ? true : false;\r\n return result;\r\n }\r\n },\r\n {\r\n text: '
Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n var simulation = modelValue;\r\n $scope.deleteSimulation(simulation);\r\n }\r\n }\r\n ];\r\n\r\n $scope.toggleNewSimulation = function (value) {\r\n $scope.simulationViewToShow = value;\r\n };\r\n\r\n $scope.editSimulation = function (simulation) {\r\n $rootScope.simulationToEdit = angular.copy(simulation);\r\n $scope.simulationViewToShow = 2;\r\n };\r\n\r\n $scope.deploySimulation = function (simulation) {\r\n $rootScope.simulationToDeploy = angular.copy(simulation);\r\n $scope.simulationViewToShow = 3;\r\n };\r\n\r\n $scope.changeSort = function (sortClicked) {\r\n $scope.selectedSort = { field: sortClicked.Id, reverse: sortClicked.reverse };\r\n };\r\n\r\n $scope.selectedSort = { field: \"Name\", reverse: false };\r\n\r\n $scope.availableToSorts = [\r\n { Name: \"Name\", Id: \"Name\", reverse: false },\r\n { Name: \"Created Date\", Id: \"DateCreated\", reverse: true },\r\n //{ Name: \"Deployment Date\", Id: 3, reverse: true },\r\n { Name: \"Status\", Id: \"StatusName\", reverse: false },\r\n { Name: \"User\", Id: \"CreatedByName\", reverse: false }\r\n ];\r\n\r\n $scope.reprocessSimulation = function (simulation) {\r\n\r\n simulation.StatusId = 2;\r\n simulation.StatusName = \"Analyzing\";\r\n $scope.selectedSimulation = null;\r\n\r\n var putBody = { \"NsRsHeaderId\": simulation.Id };\r\n\r\n $http.put(apiUrl + 'api/arm/ns/risks/reprocess', putBody).then(function (response) {\r\n return;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n };\r\n\r\n $scope.deleteSimulation = function (simulation) {\r\n swal(helperService.areYouSureParams('Delete Security Model', 'Are you sure you want to delete this Security Model?', 'Delete')).then(function () {\r\n $http.delete(apiUrl + 'api/arm/ns/risks/' + simulation.Id).then(function (response) {\r\n return;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n vm.listOfSimulations.remove(function (el) { return el.Id === simulation.Id; });\r\n $scope.selectedSimulation = null;\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n $scope.selectSimulationIf = function (simulation) {\r\n if ($scope.selectedSimulation === simulation) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n $scope.determineLabelClass = function (ActionName) {\r\n if (ActionName === 'Modify') {\r\n return 'label-modify';\r\n } else if (ActionName === 'Add') {\r\n return 'label-add';\r\n } else if (ActionName === 'Remove') {\r\n return 'label-remove';\r\n }\r\n\r\n };\r\n\r\n $scope.determineStatusLabelClass = function (ActionName) {\r\n if (ActionName === 'Ready') {\r\n return 'label-sim-ready';\r\n } else if (ActionName === 'Pending Analysis') {\r\n return 'label-sim-analyzing';\r\n } else if (ActionName === 'Draft') {\r\n return 'label-sim-draft';\r\n } else if (ActionName === 'Analyzing') {\r\n return 'label-sim-analyzing';\r\n } else if (ActionName === 'Deployed') {\r\n return 'label-sim-deployed';\r\n } else if (ActionName === 'Error') {\r\n return 'label-remove';\r\n }\r\n };\r\n\r\n $scope.changeSimulationSatusTo = function (simulation, statusId) {\r\n var postData = {\r\n \"NsRsHeaderId\": simulation.Id,\r\n \"StatusId\": statusId\r\n };\r\n $http.put(apiUrl + '/api/arm/ns/risks/status', postData).then(function successCallback(response) {\r\n $scope.getSimulations();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.changeRoleSelected = function (dataItem) {\r\n $scope.selectedRole = dataItem;\r\n };\r\n\r\n function populateSelectedSimulation(dataItem) {\r\n $scope.selectedRole = null;\r\n $scope.loadingSelectedSimulation = true;\r\n $scope.selectedSimulation = dataItem;\r\n\r\n $http.get(apiUrl + '/api/arm/ns/risks/' + dataItem.Id).then(function successCallback(response) {\r\n vm.riskSnapshot = response.data;\r\n });\r\n\r\n $http.get(apiUrl + '/api/arm/ns/risks/results/' + dataItem.Id).then(function successCallback(response) {\r\n vm.riskResults = response.data;\r\n $scope.loadingSelectedSimulation = false;\r\n }, function (response) {\r\n $scope.loadingSelectedSimulation = false;\r\n });\r\n }\r\n\r\n $scope.changeRowSelected = function (dataItem) {\r\n if (!$scope.selectedSimulation) {\r\n populateSelectedSimulation(dataItem);\r\n } else if (dataItem.Id !== $scope.selectedSimulation.Id || dataItem.StatusId !== $scope.selectedSimulation.StatusId) {\r\n populateSelectedSimulation(dataItem);\r\n }\r\n };\r\n\r\n $scope.selectedRoleFilter = \"Subsidiaries\";\r\n\r\n vm.selectedSimulationView = \"Results\";\r\n\r\n\r\n $scope.getSimulations = function () {\r\n $scope.simulationsAreLoading = true;\r\n $http.get(apiUrl + 'api/arm/ns/risks/list').then(function successCallback(response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.listOfSimulations = response.data;\r\n $scope.simulationsAreLoading = false;\r\n }, function (response) {\r\n $scope.simulationsAreLoading = false;\r\n });\r\n };\r\n\r\n $scope.getSimulations();\r\n\r\n $scope.viewSimulationRoleRisks = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteSecurityDesigner/SimulationRisksModal.html',\r\n controller: viewSimulationRoleRisksController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n $scope.viewSimulationUserRisks = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteSecurityDesigner/SimulationRisksModal.html',\r\n controller: viewSimulationUserRisksController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n}\r\n\r\nfunction viewSimulationRoleRisksController($scope, $uibModalInstance, $http, helperService, $filter) {\r\n\r\n $scope.modalName = 'Role Risks';\r\n\r\n $scope.gridIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/arm/ns/risks/results/' + $scope.vm.riskResults.Id + '/rolerisk').then(function successCallback(response) {\r\n $scope.gridIsLoading = false;\r\n response.data = $filter('orderBy')(response.data, 'RoleName');\r\n $scope.roleRisksResults = response.data;\r\n $scope.risksGridDataSource.read();\r\n }, function (response) {\r\n $scope.gridIsLoading = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n $scope.risksGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n DefaultMitigation: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n options.success($scope.roleRisksResults);\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"Action\", field: \"ActionName\", filterable: customAutoCompleteFilter },\r\n { title: \"Role\", field: \"RoleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Description\", field: \"RiskDescription\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Level\", field: \"RiskLevelName\", filterable: customAutoCompleteFilter },\r\n { title: \"Business Cycle\", field: \"BusinessCycleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Policy\", field: \"Policy\", filterable: customAutoCompleteFilter },\r\n { title: \"Default Mitigation\", field: \"DefaultMitigation\", filterable: customBooleanFilter }\r\n ];\r\n\r\n $scope.risksGridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.risksGridOptions.autoBind = false;\r\n $scope.risksGridOptions.selectable = false;\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction viewSimulationUserRisksController($scope, $uibModalInstance, $http, helperService, $filter) {\r\n\r\n $scope.modalName = 'User Risks';\r\n\r\n $scope.gridIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/arm/ns/risks/results/' + $scope.vm.riskResults.Id + '/userrisk').then(function successCallback(response) {\r\n $scope.gridIsLoading = false;\r\n response.data = $filter('orderBy')(response.data, 'RiskName');\r\n $scope.roleRisksResults = response.data;\r\n $scope.risksGridDataSource.read();\r\n }, function (response) {\r\n $scope.gridIsLoading = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n $scope.risksGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n DefaultMitigation: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n options.success($scope.roleRisksResults);\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"Action\", field: \"ActionName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Description\", field: \"RiskDescription\", filterable: customAutoCompleteFilter },\r\n { title: \"User Name\", field: \"UserName\", filterable: customAutoCompleteFilter },\r\n { title: \"Company Name\", field: \"CompanyName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Level\", field: \"RiskLevelName\", filterable: customAutoCompleteFilter },\r\n { title: \"Business Cycle\", field: \"BusinessCycleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Policy\", field: \"Policy\", filterable: customAutoCompleteFilter },\r\n { title: \"Default Mitigation\", field: \"DefaultMitigation\", filterable: customBooleanFilter }\r\n ];\r\n\r\n $scope.risksGridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.risksGridOptions.autoBind = false;\r\n $scope.risksGridOptions.selectable = false;\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $filter, $route, $http, helperService) {\r\n\r\n var newVm = $scope.newVm = {};\r\n\r\n newVm.newSimulationName = $rootScope.simulationToDeploy.Name;\r\n newVm.simulationId = $rootScope.simulationToDeploy.Id;\r\n delete $rootScope.simulationToDeploy;\r\n\r\n newVm.loadingValidation = true;\r\n\r\n $http.get(apiUrl + '/api/arm/ns/risks/deployment/' + $scope.newVm.simulationId + '/steps').then(function successCallback(response) {\r\n $scope.simulationRoleDeploymentSteps = response.data;\r\n $scope.validateResponse();\r\n }, function errorCallback(response) {\r\n newVm.loadingValidation = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n $scope.markAsDeployed = function () {\r\n $scope.postSimulationInProgress = new createSpinner();\r\n var postData = {\r\n \"NsRsHeaderId\": newVm.simulationId,\r\n \"StatusId\": 4\r\n };\r\n $http.put(apiUrl + '/api/arm/ns/risks/status', postData).then(function successCallback(response) {\r\n $scope.killModal = true;\r\n helperService.successfulSaveButton($scope.postSimulationInProgress).then(function (result) {\r\n $route.reload();\r\n });\r\n }, function errorCallback(response) {\r\n $scope.postSimulationInProgress.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n function addPassedValidationProperty(array) {\r\n array.forEach(function (row) {\r\n var element = $scope.validationResponse.filter(e => e.StepId === row.StepId)[0];\r\n\r\n if (element) {\r\n row['PassedValidation'] = element.PassedValidation;\r\n }\r\n });\r\n }\r\n\r\n function calculateSteps(steps) {\r\n var array = [];\r\n steps.forEach(function (row) {\r\n if (row.ActionName === \"Modify\" || row.ActionName === \"Add\") {\r\n row.PermissionDeploymentSteps.forEach(function (item) {\r\n array.push({ StepId: item.StepId, PassedValidation: item.PassedValidation });\r\n });\r\n row.SubsidiaryDeploymentSteps.forEach(function (item) {\r\n array.push({ StepId: item.StepId, PassedValidation: item.PassedValidation });\r\n });\r\n row.UserDeploymentSteps.forEach(function (item) {\r\n array.push({ StepId: item.StepId, PassedValidation: item.PassedValidation });\r\n });\r\n } else if (row.ActionName === \"Remove\") {\r\n array.push({ StepId: row.StepId, PassedValidation: row.PassedValidation });\r\n }\r\n });\r\n\r\n $scope.maxStepsComplete = array.length;\r\n $scope.totalStepsComplete = $filter('filter')(array, { PassedValidation: true }).length;\r\n }\r\n\r\n $scope.validateResponse = function () {\r\n\r\n newVm.loadingValidation = true;\r\n var postData = angular.copy($scope.simulationRoleDeploymentSteps.RoleDeploymentSteps);\r\n\r\n $http.post(apiUrl + '/api/arm/ns/risks/deployment/validate', postData).then(function successCallback(response) {\r\n $scope.validationResponse = response.data;\r\n\r\n $scope.simulationRoleDeploymentSteps.RoleDeploymentSteps.forEach(function (row) {\r\n var element = $scope.validationResponse.filter(e => e.StepId === row.StepId)[0];\r\n\r\n if (element) {\r\n row['PassedValidation'] = element.PassedValidation;\r\n }\r\n\r\n addPassedValidationProperty(row.PermissionDeploymentSteps);\r\n addPassedValidationProperty(row.SubsidiaryDeploymentSteps);\r\n addPassedValidationProperty(row.UserDeploymentSteps);\r\n\r\n });\r\n calculateSteps($scope.simulationRoleDeploymentSteps.RoleDeploymentSteps);\r\n newVm.loadingValidation = false;\r\n\r\n }, function errorCallback(response) {\r\n newVm.loadingValidation = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n}\r\n","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $uibModal, $route, $http, helperService) {\r\n\r\n var newVm = $scope.newVm = {};\r\n newVm.selectedListOption = 'Roles';\r\n newVm.securityModelUsers = [];\r\n\r\n if ($rootScope.simulationToEdit) {\r\n newVm.newSimulationName = $rootScope.simulationToEdit.Name;\r\n newVm.simulationId = $rootScope.simulationToEdit.Id;\r\n delete $rootScope.simulationToEdit;\r\n\r\n $http.get(apiUrl + '/api/arm/ns/risks/' + $scope.newVm.simulationId).then(function successCallback(response) {\r\n response.data.Roles.forEach(function (row) {\r\n row.Permissions.forEach(function (permission) { delete permission['AccessLevelName']; });\r\n row.Users.forEach(function (user) {\r\n user.RoleId = row.Id;\r\n if (!newVm.securityModelUsers.some(u => u.Name === user.Name && u.Id === user.Id)) {\r\n newVm.securityModelUsers.push(user);\r\n }\r\n });\r\n });\r\n newVm.currentSecurityModel = response.data;\r\n });\r\n\r\n } else {\r\n $scope.loadingNewSimulation = true;\r\n\r\n $http.get(apiUrl + '/api/arm/ns/risks').then(function successCallback(response) {\r\n\r\n response.data.Roles.forEach(function (row) {\r\n row.Permissions.forEach(function (permission) { delete permission['AccessLevelName']; });\r\n row.Users.forEach(function (user) {\r\n user.RoleId = row.Id;\r\n if (!newVm.securityModelUsers.some(u => u.Name === user.Name && u.Id === user.Id)) {\r\n newVm.securityModelUsers.push(user);\r\n }\r\n });\r\n });\r\n\r\n newVm.currentSecurityModel = response.data;\r\n $scope.loadingNewSimulation = false;\r\n });\r\n }\r\n\r\n $scope.listOptionSelectionChanged = function () {\r\n if ($scope.selectedNewUser) { $scope.selectedNewUser = null; }\r\n if ($scope.selectedNewRole) { $scope.selectedNewRole = null; }\r\n };\r\n\r\n $scope.changeNewRoleSelected = function (dataItem) {\r\n if ($scope.selectedNewUser) { $scope.selectedNewUser = null; }\r\n $scope.selectedNewRole = dataItem;\r\n };\r\n\r\n $scope.changeNewUserSelected = function (dataItem) {\r\n if ($scope.selectedNewRole) { $scope.selectedNewRole = null; }\r\n let selectedUser = Object.assign({}, dataItem);\r\n selectedUser.Roles = newVm.currentSecurityModel.Roles.filter(role => role.Users.some(user => user.Id === dataItem.Id));\r\n $scope.selectedNewUser = selectedUser;\r\n };\r\n\r\n $scope.addRoleToNewSimulation = function () {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteSecurityDesigner/SimulationNewAddRole.html',\r\n controller: viewSimulationUserRisks,\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n perspective: () => newVm.selectedListOption === 'Roles' ? 'Role' : 'User'\r\n }\r\n });\r\n };\r\n\r\n $scope.addPermissionsToSelectedRole = function () {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteSecurityDesigner/AddPropertiesToRolesModal.html',\r\n controller: addPermissionsToSelectedRoleModalController,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n };\r\n\r\n $scope.addSubsidiariesToSelectedRole = function () {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteSecurityDesigner/AddPropertiesToRolesModal.html',\r\n controller: addSubsidiariesToSelectedRoleModalController,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n };\r\n\r\n $scope.addUsersToSelectedRole = function () {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteSecurityDesigner/AddPropertiesToRolesModal.html',\r\n controller: addUsersToSelectedRoleModalController,\r\n backdrop: 'static',\r\n scope: $scope,\r\n size: 'lg'\r\n });\r\n };\r\n\r\n $scope.addRolesToSelectedUser = function () {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteSecurityDesigner/AddRolesToUserModal.html',\r\n controller: addRolesToSelectedUserModalController,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n };\r\n\r\n $scope.selectedNewRoleFilter = \"Subsidiaries\";\r\n\r\n $scope.permissionLevels = [{ Name: 'View', Id: 2 }, { Name: 'Create', Id: 3 }, { Name: 'Edit', Id: 4 }, { Name: 'Full', Id: 5 }];\r\n\r\n $http.get(apiUrl + '/api/arm/ns/risks/subsidiaries/').then(function successCallback(response) {\r\n newVm.subsidiaries = response.data;\r\n });\r\n $http.get(apiUrl + '/api/arm/ns/risks/users/').then(function successCallback(response) {\r\n newVm.users = response.data;\r\n });\r\n $http.get(apiUrl + '/api/arm/ns/risks/permissions/').then(function successCallback(response) {\r\n newVm.permissions = response.data;\r\n });\r\n\r\n $scope.removeUserFromRole = function (dataItem) {\r\n $scope.selectedNewRole.Users.remove(function (el) {\r\n return el.Id === dataItem.Id;\r\n });\r\n };\r\n\r\n $scope.removeRoleFromUser = function (role, user) {\r\n const currentRole = newVm.currentSecurityModel.Roles.find(function (r) { return r.Id === role.Id; });\r\n currentRole.Users.remove(function (u) {\r\n return u.Id === user.Id;\r\n });\r\n $scope.selectedNewUser.Roles.remove(function (r) {\r\n return r.Id === role.Id;\r\n });\r\n };\r\n\r\n $scope.removeSubsidiaryFromRole = function (dataItem) {\r\n $scope.selectedNewRole.Subsidiaries.remove(function (el) {\r\n return el.Id === dataItem.Id;\r\n });\r\n };\r\n\r\n $scope.removePermissionFromRole = function (dataItem) {\r\n $scope.selectedNewRole.Permissions.remove(function (el) {\r\n return el.Name === dataItem.Name;\r\n });\r\n };\r\n\r\n $scope.removeRole = function (dataItem) {\r\n $scope.newVm.currentSecurityModel.Roles.remove(function (el) {\r\n return el.Name === dataItem.Name;\r\n });\r\n if ($scope.selectedNewRole) {\r\n if ($scope.selectedNewRole.Name === dataItem.Name) {\r\n $scope.selectedNewRole = null;\r\n }\r\n }\r\n };\r\n\r\n $scope.removeUser = function (dataItem) {\r\n $scope.newVm.securityModelUsers.remove(function (el) {\r\n return el.Name === dataItem.Name;\r\n });\r\n $scope.newVm.currentSecurityModel.Roles.forEach(role => {\r\n role.Users = role.Users.filter(user => user.Id !== dataItem.Id);\r\n });\r\n if ($scope.selectedNewUser) {\r\n if ($scope.selectedNewUser.Name === dataItem.Name) {\r\n $scope.selectedNewUser = null;\r\n }\r\n }\r\n };\r\n\r\n $scope.saveSimulation = function () {\r\n $scope.postSimulationInProgress = new createSpinner();\r\n\r\n var modifiedSecurityModel = angular.copy(newVm.currentSecurityModel);\r\n\r\n //If Id is populated it will edit otherwise create a new one\r\n var postBody = {\r\n \"Id\": newVm.simulationId,\r\n \"Name\": $scope.newVm.newSimulationName,\r\n \"Roles\": modifiedSecurityModel.Roles\r\n };\r\n\r\n $http.post(apiUrl + 'api/arm/ns/risks/', postBody).then(async function (response) {\r\n $scope.killModal = true;\r\n await helperService.successfulSaveButton($scope.postSimulationInProgress).then(function (result) {\r\n $route.reload();\r\n });\r\n\r\n }, function errorCallback(response) {\r\n $scope.postSimulationInProgress.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n\r\n}\r\n\r\nfunction viewSimulationUserRisks($scope, $uibModalInstance, helperService, perspective) {\r\n\r\n $scope.perspective = perspective;\r\n if (perspective === 'Role') {\r\n $scope.role = {};\r\n } else {\r\n $scope.user = {};\r\n }\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.addRole = async function () {\r\n $scope.saving = new createSpinner();\r\n const role = {\r\n \"Id\": 0,\r\n \"Name\": $scope.role.name,\r\n \"Subsidiaries\": [\r\n ],\r\n \"Users\": [],\r\n \"Permissions\": [],\r\n \"New\": true\r\n };\r\n\r\n const nameAlreadyExists = $scope.newVm.currentSecurityModel.Roles.filter(e => e.Name.toLowerCase() === $scope.role.name.toLowerCase())[0];\r\n\r\n if (nameAlreadyExists) {\r\n $scope.saving.loadingValue = false;\r\n helperService.showErrorMessage('A role with this name already exists');\r\n } else {\r\n $scope.newVm.currentSecurityModel.Roles.unshift(role);\r\n $scope.changeNewRoleSelected(role);\r\n await helperService.successfulSaveButton($scope.saving);\r\n $scope.cancel();\r\n }\r\n };\r\n\r\n $scope.addUser = async function () {\r\n $scope.saving = new createSpinner();\r\n const user = {\r\n \"DefaultSubsidiaryId\": $scope.user.defaultSubsidiary.Id,\r\n \"DefaultSubsidiaryName\": $scope.user.defaultSubsidiary.Name,\r\n \"Email\": $scope.user.email,\r\n \"Name\": $scope.user.name,\r\n \"New\": true,\r\n \"Id\": Math.max.apply(Math, $scope.newVm.securityModelUsers.map(function (e) { return e.Id; })) + 1\r\n };\r\n\r\n const nameAlreadyExists = $scope.newVm.securityModelUsers.filter(e => e.Name.toLowerCase() === $scope.user.name.toLowerCase())[0];\r\n const emailAlreadyExists = $scope.newVm.securityModelUsers.filter(e => e.Email.toLowerCase() === $scope.user.email.toLowerCase())[0];\r\n\r\n if (nameAlreadyExists) {\r\n $scope.saving.loadingValue = false;\r\n helperService.showErrorMessage('A user with this name already exists');\r\n } else if (emailAlreadyExists) {\r\n $scope.saving.loadingValue = false;\r\n helperService.showErrorMessage('A user with this email already exists');\r\n } else {\r\n $scope.newVm.securityModelUsers.unshift(user);\r\n $scope.changeNewUserSelected(user);\r\n await helperService.successfulSaveButton($scope.saving);\r\n $scope.cancel();\r\n }\r\n };\r\n\r\n\r\n}\r\n\r\nfunction addPermissionsToSelectedRoleModalController($scope, $uibModalInstance, helperService, $filter) {\r\n\r\n $scope.modalName = \"Permissions\";\r\n\r\n var columns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"
\", title: \" \", width: 20 }\r\n ];\r\n\r\n $scope.gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.gridOptions.selectable = false;\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: 1000,\r\n transport: {\r\n read: function (options) {\r\n var available = angular.copy($scope.newVm.permissions);\r\n\r\n $scope.selectedNewRole.Permissions.forEach(function (row) {\r\n available.remove(function (el) {\r\n return el.Name === row.Name;\r\n });\r\n });\r\n available = $filter('orderBy')(available, 'Name');\r\n options.success(available);\r\n }\r\n }\r\n });\r\n\r\n $scope.addItemToRole = function (dataItem) {\r\n $scope.selectedNewRole.Permissions.push(dataItem);\r\n $scope.gridDataSource.read();\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n\r\n}\r\n\r\nfunction addSubsidiariesToSelectedRoleModalController($scope, $uibModalInstance, helperService, $filter) {\r\n\r\n $scope.modalName = \"Subsidiaries\";\r\n\r\n var columns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"
\", title: \" \", width: 20 }\r\n ];\r\n\r\n $scope.gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.gridOptions.selectable = false;\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: 1000,\r\n transport: {\r\n read: function (options) {\r\n\r\n var available = angular.copy($scope.newVm.subsidiaries);\r\n\r\n $scope.selectedNewRole.Subsidiaries.forEach(function (row) {\r\n available.remove(function (el) {\r\n return el.Id === row.Id;\r\n });\r\n });\r\n available = $filter('orderBy')(available, 'Name');\r\n options.success(available);\r\n\r\n }\r\n }\r\n });\r\n\r\n $scope.addItemToRole = function (dataItem) {\r\n $scope.selectedNewRole.Subsidiaries.push(dataItem);\r\n $scope.gridDataSource.read();\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n\r\n}\r\n\r\nfunction addUsersToSelectedRoleModalController($scope, $uibModalInstance, helperService, $filter) {\r\n\r\n $scope.modalName = \"Users\";\r\n\r\n var columns = [\r\n { title: \"Internal ID\", field: \"Id\", filterable: customAutoCompleteFilter },\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Email\", field: \"Email\", filterable: customAutoCompleteFilter },\r\n { title: \"Default Subsidiary\", field: \"DefaultSubsidiaryName\", filterable: customAutoCompleteFilter },\r\n { template: \"
\", title: \" \", width: 20 }\r\n ];\r\n\r\n $scope.gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.gridOptions.selectable = false;\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: 1000,\r\n transport: {\r\n read: function (options) {\r\n\r\n var available = angular.copy($scope.newVm.users);\r\n\r\n $scope.selectedNewRole.Users.forEach(function (row) {\r\n available.remove(function (el) {\r\n return el.Id === row.Id;\r\n });\r\n });\r\n available = $filter('orderBy')(available, 'Name');\r\n options.success(available);\r\n }\r\n }\r\n });\r\n\r\n $scope.addItemToRole = function (dataItem) {\r\n $scope.selectedNewRole.Users.push(dataItem);\r\n $scope.gridDataSource.read();\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n\r\n}\r\n\r\nfunction addRolesToSelectedUserModalController($scope, $uibModalInstance, helperService, $filter) {\r\n\r\n var columns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"
\", title: \" \", width: 20 }\r\n ];\r\n\r\n $scope.gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.gridOptions.selectable = false;\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: 1000,\r\n transport: {\r\n read: function (options) {\r\n\r\n var available = angular.copy($scope.newVm.currentSecurityModel.Roles);\r\n\r\n $scope.selectedNewUser.Roles.forEach(function (row) {\r\n available.remove(function (el) {\r\n return el.Id === row.Id;\r\n });\r\n });\r\n available = $filter('orderBy')(available, 'Name');\r\n options.success(available);\r\n }\r\n }\r\n });\r\n\r\n $scope.addItemToUser = function (dataItem) {\r\n dataItem = dataItem.toJSON();\r\n $scope.selectedNewUser.Roles.push(dataItem);\r\n $scope.gridDataSource.read();\r\n let roleToModify = $scope.newVm.currentSecurityModel.Roles.find(function (role) {\r\n return role.Id === dataItem.Id;\r\n });\r\n const userToAdd = Object.assign({}, $scope.selectedNewUser);\r\n delete userToAdd.Roles;\r\n roleToModify.Users.push(userToAdd);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n\r\n}","import angular from 'angular';\r\nimport NetSuiteArmQuantificationViewModel from '../Components/NetSuiteArmQuantification/NetSuiteArmQuantificationViewModel';\r\nimport NSQuantificationSelection from '../Components/NetSuiteArmQuantification/NSQuantificationSelection';\r\nimport NetSuiteSecurityDesignerViewModel from '../Components/NetSuiteSecurityDesigner/NetSuiteSecurityDesignerViewModel';\r\nimport NetSuiteSecurityDesignerDeploymentController from '../Components/NetSuiteSecurityDesigner/Deployment/NetSuiteSecurityDesignerDeploymentController';\r\nimport SimulationNewController from '../Components/NetSuiteSecurityDesigner/SimulationNewController';\r\n\r\nexport default angular\r\n .module('app.accessRiskMonitor.netSuite', [])\r\n .controller(\"NetSuiteArmQuantificationViewModel\", NetSuiteArmQuantificationViewModel)\r\n .controller(\"nsQuantificationSelection\", NSQuantificationSelection)\r\n .controller(\"NetSuiteSecurityDesignerViewModel\", NetSuiteSecurityDesignerViewModel)\r\n .controller(\"NetSuiteSecurityDesignerDeploymentController\", NetSuiteSecurityDesignerDeploymentController)\r\n .controller(\"SimulationNewController\", SimulationNewController)\r\n .name;","export default /*@ngInject*/ function (helperService) {\r\n const factory = {\r\n generateBody\r\n };\r\n\r\n return factory;\r\n\r\n function generateBody(objectId, productId, roles, businessProcesses, reportId, securityObject, rulesetId) {\r\n\r\n var selectedRoles;\r\n\r\n var result = helperService.returnNullIfAllIsFound(roles.map(role => role.ID));\r\n if (result) {\r\n selectedRoles = roles.map(role => role.Identifier);\r\n } else {\r\n selectedRoles = null;\r\n }\r\n var businessProcessesSelected = helperService.returnNullIfAllIsFound(businessProcesses.map(function (el) { return el.Id; }));\r\n\r\n if (businessProcessesSelected) {\r\n businessProcessesSelected = businessProcesses.map(bp => bp.Id);\r\n }\r\n\r\n var data = {\r\n \"ObjectId\": objectId,\r\n \"ProductIds\": productId,\r\n \"Roles\": selectedRoles,\r\n \"BusinessProcessIds\": businessProcessesSelected,\r\n \"ReportId\": reportId,\r\n \"SecurityObject\": securityObject,\r\n \"RulesetId\": rulesetId\r\n };\r\n\r\n return data;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getCompanies,\r\n getUsers,\r\n getRulesets,\r\n getRiskTypes,\r\n getRisks,\r\n getAllRisks\r\n };\r\n\r\n return factory;\r\n\r\n async function getCompanies() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/companymaster`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getUsers(data, params) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/universal/usermaster`,\r\n data: data,\r\n params: params\r\n });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRulesets() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/riskrulesets`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRiskTypes() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/risks/types`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n\r\n async function getRisks(rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/risks/ruleset/${rulesetId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAllRisks() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/risks`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}\r\n","export default /*@ngInject*/ function (helperService) {\r\n const factory = {\r\n generateBody\r\n };\r\n\r\n return factory;\r\n\r\n function generateBody(companies, ruleset, businessProcesses, objectId, products, securityObject, users, reportId) {\r\n\r\n var companiesSelected = helperService.returnNullIfAllIsFound(companies.map(function (el) { return el.ID; }));\r\n var businessProcessesSelected = helperService.returnNullIfAllIsFound(businessProcesses.map(function (el) { return el.Id; }));\r\n\r\n if (businessProcessesSelected) {\r\n businessProcessesSelected = businessProcesses.map(bp => bp.Id);\r\n }\r\n\r\n var data = {\r\n \"CompanyMasterIds\": companiesSelected,\r\n \"RulesetId\": ruleset.RulesetId,\r\n \"BusinessProcessIds\": businessProcessesSelected,\r\n \"ObjectId\": objectId,\r\n \"ProductIds\": products.map(function (el) { return el.ID; }),\r\n \"SecurityObjects\": [securityObject.Identifier],\r\n \"UserMasterIds\": users.length ? users : null,\r\n \"ReportId\": reportId\r\n };\r\n\r\n if (securityObject.Id === null) {\r\n data.SecurityObjects = null;\r\n }\r\n\r\n return data;\r\n }\r\n\r\n}","export default /*@ngInject*/ function (helperService) {\r\n const factory = {\r\n generateBody\r\n };\r\n\r\n return factory;\r\n\r\n function generateBody (ObjectId, users, selectedCompanies, riskSelectedIds, selectedProducts, ruleset) {\r\n\r\n var risksSelected = helperService.returnNullIfAllIsFound(riskSelectedIds.map(function (el) { return el.Id; }));\r\n var companiesSelected = helperService.returnNullIfAllIsFound(selectedCompanies.map(function (el) { return el.ID; }));\r\n var products = selectedProducts.map(function (el) { return el.ID; });\r\n\r\n\r\n var data = {\r\n \"ProductIds\": products,\r\n \"ObjectId\": ObjectId,\r\n \"UserMasterIds\": users.length ? users : null,\r\n \"CompanyMasterIds\": companiesSelected,\r\n \"RiskIds\": risksSelected,\r\n \"RulesetId\": ruleset\r\n };\r\n\r\n return data;\r\n }\r\n\r\n}","export default /*@ngInject*/ function (helperService) {\r\n\r\n const factory = {\r\n generateBody\r\n };\r\n\r\n return factory;\r\n\r\n function generateBody (ObjectId, responsibilities, risks, individual, ruleset) {\r\n\r\n var selectedResponsibilities;\r\n\r\n var result = helperService.returnNullIfAllIsFound(responsibilities.map(resp => resp.ID));\r\n if (result) {\r\n selectedResponsibilities = responsibilities.map(resp => resp.Identifier);\r\n } else {\r\n selectedResponsibilities = null;\r\n }\r\n\r\n var data = {\r\n \"ObjectId\": ObjectId,\r\n \"RoleIds\": selectedResponsibilities,\r\n \"RiskIds\": risks,\r\n \"Individual\": individual,\r\n \"RulesetId\": ruleset\r\n };\r\n\r\n return data;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var factory = {\r\n getControls,\r\n deleteControl,\r\n addNewControl,\r\n editControl,\r\n exportControls,\r\n getMitigations,\r\n getProducts,\r\n getBusinessProcesses,\r\n deleteAttachment,\r\n downloadAttachment,\r\n getAttachmentsList,\r\n addAttachments,\r\n importControlLibrary,\r\n importControlsFromPluginAPI\r\n };\r\n\r\n return factory;\r\n\r\n async function getControls() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/controls`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteControl(controlId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/controls/${controlId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addNewControl(control) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/controls`, control);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function editControl(control) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/controls/${control.Identifier}`, control);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportControls() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/controls/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getMitigations() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/mitigations`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getProducts() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/products`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getBusinessProcesses() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteAttachment(identifier) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/attachments/${identifier}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function downloadAttachment(identifier) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/attachments/${identifier}/download`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getAttachmentsList(dataTypeIdentifier) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/cases/data-type/3/identifier/${dataTypeIdentifier}`); \r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addAttachments(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/core/attachments/`, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importControlLibrary(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/controls/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importControlsFromPluginAPI(plugin) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/controls/import/${plugin}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var factory = {\r\n getBusinessCycles,\r\n addBusinessCycle,\r\n modifyBusinessCycle,\r\n removeBusinessCycle\r\n };\r\n\r\n return factory;\r\n\r\n async function getBusinessCycles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businesscycles`);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function addBusinessCycle(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/businesscycles`, data);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function modifyBusinessCycle(businessCycleId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/businesscycles/${businessCycleId}`, data);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function removeBusinessCycle(businessCycleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/businesscycles/${businessCycleId}`);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var service = {\r\n getMitigations,\r\n addMitigation,\r\n modifyMitigation,\r\n removeMitigation\r\n };\r\n\r\n return service;\r\n\r\n async function getMitigations() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/mitigations`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addMitigation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/mitigations`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function modifyMitigation(mitigationId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/mitigations/${mitigationId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeMitigation(mitigationId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/mitigations/${mitigationId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getRiskLevels,\r\n createRiskLevel,\r\n renameRiskLevel,\r\n deleteRiskLevel\r\n };\r\n\r\n return service;\r\n\r\n async function getRiskLevels() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/risklevels`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createRiskLevel(postData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/risklevels`, postData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function renameRiskLevel(putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/risklevels/${putData.Id}`, putData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteRiskLevel(riskLevelId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/risklevels/${riskLevelId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getStatuses,\r\n addStatus,\r\n modifyStatus,\r\n removeStatus\r\n };\r\n\r\n return service;\r\n\r\n async function getStatuses() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/statuses`);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function addStatus(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/statuses`, data);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function modifyStatus(businessCycleId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/statuses/${businessCycleId}`, data);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function removeStatus(businessCycleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/statuses/${businessCycleId}`);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n importAutoMitigationRuleset,\r\n exportAutoMitigationRuleset\r\n };\r\n\r\n return factory;\r\n\r\n function importAutoMitigationRuleset(data) {\r\n return $http.put(apiUrl + 'api/assure/or/exclusions/import', data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n })\r\n .then(workComplete)\r\n .catch(response => errorsDataService.catch(response));\r\n }\r\n\r\n function exportAutoMitigationRuleset() {\r\n return $http.get(apiUrl + 'api/assure/or/exclusions/export', { responseType: \"blob\" })\r\n .then(workComplete)\r\n .catch(response => errorsDataService.catch(response));\r\n }\r\n\r\n function workComplete(response) {\r\n return response;\r\n }\r\n\r\n}\r\n","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var service = {\r\n getAutoMitigations,\r\n getObjects,\r\n getObjectsByUrl,\r\n addAutoMitigation,\r\n modifyMitigation,\r\n removeAutoMitigation,\r\n applyAutoMitigations\r\n };\r\n\r\n return service;\r\n\r\n async function getAutoMitigations() {\r\n try {\r\n return await $http.get(apiUrl + 'api/assure/ps/automitigations');\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function getObjects(body, params) {\r\n try {\r\n return await $http.post(apiUrl + 'api/universal/securityobjects/producttype/ps/type/Page', body, { params: params });\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function getObjectsByUrl(url) {\r\n try {\r\n return await $http.get(url);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function addAutoMitigation(data) {\r\n try {\r\n return await $http.post(apiUrl + 'api/assure/ps/automitigations', data);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function modifyMitigation(autoMitigationId, data) {\r\n try {\r\n return await $http.put(apiUrl + 'api/assure/ps/automitigations/' + autoMitigationId, data);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function removeAutoMitigation(autoMitigationId) {\r\n try {\r\n return await $http.delete(apiUrl + 'api/assure/ps/automitigations/' + autoMitigationId);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function applyAutoMitigations() {\r\n try {\r\n return await $http.put(apiUrl + 'api/arm/usermitigations/product/PS/applyautomitigations');\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getAutoMitigations,\r\n addAutoMitigation,\r\n modifyMitigation,\r\n deleteAutoMitigation,\r\n applyAutoMitigations,\r\n importAutoMitigationRuleset,\r\n exportAutoMitigationRuleset\r\n };\r\n\r\n return service;\r\n\r\n async function getAutoMitigations(productType) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/assure/${productType}/objectexclusions`);\r\n return res;\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function addAutoMitigation(productType, body) {\r\n return $http.post(`${apiUrl}api/assure/${productType}/objectexclusions`, body)\r\n .then(addAutoMitigationComplete)\r\n .catch(addAutoMitigationFailed);\r\n\r\n function addAutoMitigationComplete(response) {\r\n return response;\r\n }\r\n\r\n function addAutoMitigationFailed(response) {\r\n errorsDataService.catch(response);\r\n }\r\n }\r\n\r\n function modifyMitigation(productType, mitigationId, body) {\r\n return $http.put(`${apiUrl}api/assure/${productType}/objectexclusions/${mitigationId}`, body)\r\n .then(modifyMitigationComplete)\r\n .catch(modifyMitigationFailed);\r\n\r\n function modifyMitigationComplete(response) {\r\n return response;\r\n }\r\n\r\n function modifyMitigationFailed(response) {\r\n errorsDataService.catch(response);\r\n }\r\n }\r\n\r\n async function importAutoMitigationRuleset(productType, body) {\r\n try {\r\n return await $http.put(`${apiUrl}api/assure/${productType}/objectexclusions/import`, body, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportAutoMitigationRuleset(productType) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/assure/${productType}/objectexclusions/export`, { responseType: 'blob' });\r\n return res;\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteAutoMitigation(productType, mitigationId) {\r\n try {\r\n await $http.delete(`${apiUrl}api/assure/${productType}/objectexclusions/${mitigationId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function applyAutoMitigations(productType) {\r\n try {\r\n await $http.put(`${apiUrl}api/arm/usermitigations/product/${productType}/applyautomitigations`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getBusinessProcesses,\r\n getBusinessProcessesByRiskRuleset,\r\n getBusinessProcessesObjectsByGroup,\r\n getBusinessProcessObjects,\r\n getBpGroups,\r\n getBpGroupObjects,\r\n getSapFioriApplications,\r\n getSapFioriAppServices,\r\n createBusinessProcess,\r\n createBusinessProcessGroup,\r\n addObjectToBpGroup,\r\n updateBusinessProcess,\r\n updateBusinessProcessGroup,\r\n deleteBusinessProcess,\r\n deleteBpGroup,\r\n removeBusinessProcessObjectsFromGroup\r\n };\r\n\r\n return factory;\r\n\r\n //GET Requests\r\n async function getBusinessProcesses() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getBusinessProcessesByRiskRuleset(riskRulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses/ruleset/${riskRulesetId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getBusinessProcessesObjectsByGroup(id) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses/${id}/objects`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getBusinessProcessObjects(id) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses/${id}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getBpGroups(bpId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses/${bpId}/groups`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getBpGroupObjects(bpId, bpGroupId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses/${bpId}/groups/${bpGroupId}/objects`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSapFioriApplications(productId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/sap/${productId}/fioriapplications`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSapFioriAppServices(productId, appId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/sap/${productId}/services/${appId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n //POST Requests\r\n\r\n async function createBusinessProcess(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/businessprocesses`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createBusinessProcessGroup(data) {\r\n try {\r\n if (data.AppId) {\r\n return await $http.post(`${apiUrl}api/sap/${data.ProductId}/businessprocesses/${data.BusinessProcessId}/groups`, data);\r\n } else {\r\n return await $http.post(`${apiUrl}api/arm/businessprocesses/${data.BusinessProcessId}/groups`, data);\r\n }\r\n\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addObjectToBpGroup(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/businessprocesses/${data.BusinessProcessID}/objects`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n //PUT Requests\r\n async function updateBusinessProcess(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/businessprocesses/${data.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateBusinessProcessGroup(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/businessprocesses/${data.BusinessProcessId}/groups/${data.ID}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n\r\n //DELETE Requests\r\n async function deleteBusinessProcess(id) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/businessprocesses/${id}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteBpGroup(bpId, bpGroupId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/businessprocesses/${bpId}/groups/${bpGroupId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeBusinessProcessObjectsFromGroup(bpId, bpObjectId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/businessprocesses/${bpId}/objects/${bpObjectId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}\r\n","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getRisks,\r\n getBusinessProcesses,\r\n getRiskRulesetList,\r\n downloadRulesetTemplate,\r\n cloneRiskRuleset,\r\n importRiskRuleset,\r\n setDefaultRiskRuleset,\r\n updateRiskRuleset,\r\n addNewRiskRuleset,\r\n deleteRiskRuleset,\r\n addNewRisk,\r\n updateRisk,\r\n copyObjectsToRuleset,\r\n addNewRiskObject\r\n };\r\n\r\n return factory;\r\n\r\n\r\n // GET Requests\r\n async function getRisks(rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/risks/ruleset/${rulesetId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getBusinessProcesses(rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/businessprocesses/ruleset/${rulesetId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getRiskRulesetList() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/riskrulesets`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function downloadRulesetTemplate(product) {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/riskrulesets/download`, { responseType: \"blob\", params: {productType: product}});\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // POST Requests\r\n async function cloneRiskRuleset(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/riskrulesets/clone`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addNewRiskRuleset(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/riskrulesets`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addNewRisk(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/risks`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addNewRiskObject(riskId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/risks/${riskId}/objects`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function copyObjectsToRuleset(objectType, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/arm/riskrulesets/copy-${objectType}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // PUT Requests\r\n async function importRiskRuleset(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/risks/import`, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function setDefaultRiskRuleset(rulesetId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/riskrulesets/default/${rulesetId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateRiskRuleset(rulesetId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/riskrulesets/${rulesetId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateRisk(riskId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/risks/${riskId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // DELETE Requests\r\n async function deleteRiskRuleset(rulesetId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/riskrulesets/${rulesetId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getAssignedRisks,\r\n assignRiskByUser,\r\n assignByRisk,\r\n removeAssignedRiskByUser\r\n };\r\n\r\n return factory;\r\n\r\n async function getAssignedRisks() {\r\n try {\r\n return await $http.get(`${apiUrl}api/arm/assignrisks/user`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function assignRiskByUser(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/assignrisks/user`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function assignByRisk(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/arm/assignrisks/risk`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeAssignedRiskByUser(userMasterId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/arm/assignrisks/user/${userMasterId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}\r\n","export default /*@ngInject*/ function (helperService) {\r\n const factory = {\r\n generateBody\r\n };\r\n\r\n return factory;\r\n\r\n function generateBody(objectId, productIds, roles, securityObject, securityObjectType, isDetailed) {\r\n let selectedRoles,\r\n result = helperService.returnNullIfAllIsFound(roles.map(role => role.ID)),\r\n data = {\r\n \"ObjectId\": objectId,\r\n \"SecurityObjectTypes\": [securityObjectType.Identifier],\r\n \"SecurityObjects\": [securityObject.Identifier]\r\n };\r\n\r\n if (result) {\r\n selectedRoles = roles.map(role => role.Identifier);\r\n } else {\r\n selectedRoles = null;\r\n }\r\n\r\n data.ProductIds = productIds;\r\n data.Roles = selectedRoles;\r\n\r\n if (securityObjectType.ID === null) {\r\n data.SecurityObjectTypes = null;\r\n }\r\n if (securityObject.Id === null) {\r\n data.SecurityObjects = null;\r\n }\r\n\r\n return data;\r\n }\r\n}","export default /*@ngInject*/ function (helperService) {\r\n const factory = {\r\n generateBody\r\n };\r\n\r\n return factory;\r\n\r\n function generateBody(selectedProducts, reportId, securityObjectType, users, selectedCompanies, securityObject) {\r\n\r\n var companiesSelected = helperService.returnNullIfAllIsFound(selectedCompanies.map(function (el) { return el.ID; }));\r\n var products = selectedProducts.map(function (el) { return el.ID; });\r\n\r\n var data = {\r\n \"ProductIds\": selectedProducts.map(function (el) { return el.ID; }),\r\n \"ObjectId\": reportId,\r\n \"SecurityObjectTypes\": [securityObjectType.Identifier],\r\n \"UserMasterIds\": users.length ? users : null,\r\n \"CompanyMasterIds\": companiesSelected,\r\n \"SecurityObjects\": [securityObject.Identifier]\r\n };\r\n\r\n if (securityObjectType.ID === null) {\r\n data.SecurityObjectTypes = null;\r\n }\r\n\r\n if (securityObject.Id === null) {\r\n data.SecurityObjects = null;\r\n }\r\n\r\n return data;\r\n }\r\n\r\n}","export default /*@ngInject*/ function BuildResponsibilityAccessPostBody(helperService) {\r\n const factory = {\r\n generateBody\r\n };\r\n\r\n return factory;\r\n\r\n function generateBody(ObjectId, responsibilities, securityObjectType, securityObject) {\r\n\r\n var selectedResponsibilities;\r\n\r\n var result = helperService.returnNullIfAllIsFound(responsibilities.map(resp => resp.ID));\r\n if (result) {\r\n selectedResponsibilities = responsibilities.map(resp => resp.Identifier);\r\n } else {\r\n selectedResponsibilities = null;\r\n }\r\n\r\n var data = {\r\n \"ObjectId\": ObjectId,\r\n \"Roles\": selectedResponsibilities,\r\n \"SecurityObjects\": [securityObject.Identifier],\r\n \"SecurityObjectTypes\": [securityObjectType.Identifier]\r\n };\r\n\r\n if (securityObject.Id === null) {\r\n data.SecurityObjects = null;\r\n }\r\n\r\n return data;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getProfiles,\r\n getSensitiveProfiles,\r\n exportProfiles,\r\n updateProfiles,\r\n importProfiles,\r\n deleteProfile\r\n };\r\n\r\n return service;\r\n\r\n async function getProfiles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/assure/sap/profilemaster`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSensitiveProfiles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/assure/sap/sensitiveprofile/`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function exportProfiles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/assure/sap/sensitiveprofile/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateProfiles(postData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/assure/sap/sensitiveprofile/`, postData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importProfiles(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}api/assure/sap/sensitiveprofile/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteProfile(id) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/assure/sap/sensitiveprofile/${id}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","import angular from 'angular';\r\nimport buildRoleBPPostBodyFactory from '../Components/roleBusinessProcess/buildRoleBPPostBody.factory';\r\nimport risksDataServiceFactory from '../APICalls/risksDataService.factory';\r\nimport buildUserBPPostBodyFactory from '../Components/userBusinessProcess/buildUserBPPostBody.factory';\r\nimport BuildUserRisksPostBody from '../Components/userRisk/BuildUserRisksPostBody';\r\nimport responsibilityRiskPostBody from '../Components/responsibilityRisk/responsibilityRiskPostBody';\r\nimport controlLibraryDataServiceFactory from '../Components/controlLibrary/controlLibraryDataService.factory';\r\nimport businessCyclesDataServiceFactory from '../Components/maintainBusinessCycles/businessCyclesDataService.factory';\r\nimport mitigationsDataServiceFactory from '../Components/maintainMitigations/mitigationsDataService.factory';\r\nimport riskLevelsFactory from '../Components/maintainRiskLevels/riskLevels.factory';\r\nimport statusDataServiceFactory from '../Components/maintainStatuses/statusDataService.factory';\r\nimport AutoMitigationDataService from '../APICalls/AutoMitigationDataService';\r\nimport peoplesoftAutoMitigationsDataService from '../Components/Peoplesoft/autoMitigations/autoMitigationsDataService.factory';\r\nimport autoMitigationsDataServiceFactory from '../Components/AutoMitigations/autoMitigationsDataService.factory';\r\nimport businessProcessDataServiceFactory from '../Components/MaintainBusinessProcess/businessProcessDataService.factory';\r\nimport riskRulesetDataServiceFactory from '../Components/maintainRiskRuleset/riskRulesetDataService.factory';\r\nimport riskRulesetMapperService from '../Components/maintainRiskRuleset/objects/riskRulesetMapper.service';\r\nimport assignRisksDataServiceFactory from '../Components/assignRisks/assignRisksDataService.factory';\r\nimport BuildRoleAccessPostBody from '../Components/roleAccess/BuildRoleAccessPostBody';\r\nimport BuildUserAccessPostBody from '../Components/userAccess/BuildUserAccessPostBody';\r\nimport BuildResponsibilityAccessPostBody from '../Components/responsibilityAccess/responsibilityAccessPostBody';\r\nimport maintainProfilesDataServiceFactory from '../Components/maintainProfiles/maintainProfilesDataService.factory';\r\n\r\nexport default angular\r\n .module('app.accessRiskMonitor.factories', [])\r\n .factory('buildRoleBPPostBody', buildRoleBPPostBodyFactory)\r\n .factory('risksDataService', risksDataServiceFactory)\r\n .factory('businessProcessDataService', businessProcessDataServiceFactory)\r\n .factory('buildUserBPPostBody', buildUserBPPostBodyFactory)\r\n .factory('BuildUserRisksPostBody', BuildUserRisksPostBody)\r\n .factory('buildResponsibilityRiskPostBody', responsibilityRiskPostBody)\r\n .factory('controlLibraryDataService', controlLibraryDataServiceFactory)\r\n .factory('businessCyclesDataService', businessCyclesDataServiceFactory)\r\n .factory('riskRulesetService', riskRulesetDataServiceFactory)\r\n .factory('riskRulesetMapper', riskRulesetMapperService)\r\n .factory('mitigationsDataService', mitigationsDataServiceFactory)\r\n .factory('riskLevelsData', riskLevelsFactory)\r\n .factory('statusDataService', statusDataServiceFactory)\r\n .factory('AutoMitigationDataService', AutoMitigationDataService)\r\n .factory('peoplesoftAutoMitigationsDataService', peoplesoftAutoMitigationsDataService)\r\n .factory('autoMitigationsDataService', autoMitigationsDataServiceFactory)\r\n .factory('assignRisksDataService', assignRisksDataServiceFactory)\r\n .factory('BuildRoleAccessPostBody', BuildRoleAccessPostBody)\r\n .factory('BuildUserAccessPostBody', BuildUserAccessPostBody)\r\n .factory('BuildResponsibilityAccessPostBody', BuildResponsibilityAccessPostBody)\r\n .factory('maintainProfilesDataService', maintainProfilesDataServiceFactory)\r\n .name;","export default function () {\r\n const service = {\r\n mapBusinessProcesses,\r\n mapSecurityObjects\r\n };\r\n\r\n return service;\r\n\r\n function Object(Id, RiskId, ProductType, ProductName, BusinessProcessId, BusinessProcessName, BusinessProcessDescription, SecurityObjectTypeId, SecurityObjectTypeName, SecurityObjectModuleName) {\r\n this.Id = Id;\r\n this.RiskId = RiskId;\r\n this.ProductType = ProductType;\r\n this.ProductName = ProductName;\r\n this.BusinessProcessId = BusinessProcessId;\r\n this.BusinessProcessName = BusinessProcessName;\r\n this.BusinessProcessDescription = BusinessProcessDescription;\r\n this.SecurityObjectTypeId = SecurityObjectTypeId;\r\n this.SecurityObjectTypeName = SecurityObjectTypeName;\r\n this.SecurityObjectModuleName = SecurityObjectModuleName;\r\n\r\n }\r\n\r\n function mapBusinessProcesses(data) {\r\n\r\n let newArray = [];\r\n data.forEach(function (row) {\r\n var item = new Object(null, null, null, null, row.Id.toString(), row.Name, row.Description, row.Type, 'Business Process', null);\r\n newArray.push(item);\r\n });\r\n\r\n return newArray;\r\n }\r\n\r\n function mapSecurityObjects(data) {\r\n\r\n let newArray = [];\r\n data.forEach(function (row) {\r\n var item = new Object(null, null, row.ProductType, row.ProductName, row.Id.toString(), row.Name, row.AltName, row.SecurityObjectTypeId, row.SecurityObjectTypeName, row.ModuleName);\r\n newArray.push(item);\r\n });\r\n\r\n return newArray;\r\n }\r\n}","import { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, KPIGeneratorService, ViewProductImportPageService, objectIdDataService, CustomReportServices, $http, helperService) {\r\n\r\n var vm = this;\r\n vm.showSetup = false;\r\n\r\n vm.helperService = helperService;\r\n vm.createPartialSavedReportAndNavigate = createPartialSavedReportAndNavigate;\r\n vm.toggleValue = toggleValue;\r\n\r\n function activate() {\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n helperService.getConfigurationValue('AX7_QuantificationThreshold').then(function (data) {\r\n vm.QuantificationThreshold = data;\r\n });\r\n\r\n helperService.getConfigurationValue('AX7_QuantificationLastDays').then(function (data) {\r\n vm.QuantificationLastDays = data;\r\n });\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/core/charts/' + 'B7E53CC5-2EE6-4F19-8691-D161CAAAC6CA' + '/data'\r\n }).then(function (response) {\r\n //response.data.forEach(function (row) { row.link = \"j-\" })\r\n vm.myDataSourceByRisk.data = response.data;\r\n });\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/core/charts/' + 'CB14500A-085D-4F52-9A6E-F344E900331C' + '/data'\r\n }).then(function (response) {\r\n //response.data.forEach(function (row) { row.link = \"j-\" })\r\n vm.myDataSourceByUser.data = response.data;\r\n\r\n });\r\n\r\n }\r\n activate();\r\n\r\n var columnsForRiskRuleset = [\r\n { template: \"
\", width: 55, filterable: false },\r\n { field: \"RiskName\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.gridOptions = helperService.setNonPageableGridOptions(columnsForRiskRuleset, 600);\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n sort: { field: \"RiskName\", dir: \"asc\" },\r\n transport: {\r\n\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + '/api/arm/ax7/quantification/risks'\r\n }).then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n function toggleValue(dataItem) {\r\n\r\n var selectedCheckboxValue = dataItem.Enabled;\r\n\r\n if (selectedCheckboxValue === true) {\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/arm/risks/' + dataItem.RiskId + '/quantification',\r\n data: {}\r\n }).then()\r\n .catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n selectedCheckboxValue = false;\r\n });\r\n } else {\r\n $http({\r\n method: 'DELETE',\r\n url: apiUrl + 'api/arm/risks/' + dataItem.RiskId + '/quantification'\r\n }).then()\r\n .catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n selectedCheckboxValue = true;\r\n });\r\n }\r\n }\r\n\r\n function highlightSelectedItem(ev, props) {\r\n var dataSource = ev.sender.args.dataSource.data;\r\n for (var i = 0; i < dataSource.length; i++) {\r\n if (i === props.index) {\r\n dataSource[i].color = \"#4F7E98\";\r\n } else {\r\n delete dataSource[i].color;\r\n }\r\n }\r\n ev.sender.args.dataSource.data = dataSource;\r\n ev.sender.setJSONData(ev.sender.args.dataSource);\r\n }\r\n\r\n vm.fusionChartByRiskEvents = {\r\n dataPlotClick: function (ev, props) {\r\n var row = ev.sender.args.dataSource.data[props.index];\r\n selectItem(row, 'risk');\r\n highlightSelectedItem(ev, props);\r\n }\r\n };\r\n\r\n vm.fusionChartByUserEvents = {\r\n dataPlotClick: function (ev, props) {\r\n var row = ev.sender.args.dataSource.data[props.index];\r\n selectItem(row, 'user');\r\n highlightSelectedItem(ev, props);\r\n }\r\n };\r\n\r\n function createPartialSavedReportAndNavigate(filters, objectId) {\r\n $rootScope.loadedSavedReport = KPIGeneratorService.createSavedReportStub(filters, objectId);\r\n ViewProductImportPageService.launchReportByObjectId(objectId);\r\n }\r\n\r\n vm.selectedRiskData = null;\r\n\r\n function selectItem(row, type) {\r\n if (type === 'risk') {\r\n vm.selectedRisk = row;\r\n vm.selectedRiskLoading = true;\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/core/charts/CB14500A-085D-4F52-9A6E-F344E900331C/data',\r\n params: { 'filterField': 'RiskName', 'filterValue': row.Label }\r\n }).then(function (response) {\r\n vm.selectedRiskData = response.data;\r\n vm.selectedRiskLoading = false;\r\n });\r\n\r\n } else if (type === 'user') {\r\n vm.selectedUser = row;\r\n vm.selectedUserLoading = true;\r\n\r\n $http.get(apiUrl + 'api/core/charts/B7E53CC5-2EE6-4F19-8691-D161CAAAC6CA/data?filterField=UserName&filterValue=' + row.Label).then(function (response) {\r\n vm.selectedUserData = response.data;\r\n vm.selectedUserLoading = false;\r\n\r\n });\r\n\r\n }\r\n }\r\n\r\n vm.myDataSourceByRisk = {\r\n chart: {\r\n caption: \"By Risk\",\r\n //subCaption: \"Top 5 stores in last month by revenue\",\r\n numberPrefix: \"$\",\r\n theme: \"ocean\"\r\n },\r\n data: []\r\n };\r\n\r\n vm.myDataSourceByUser = {\r\n chart: {\r\n caption: \"By User\",\r\n //subCaption: \"Top 5 stores in last month by revenue\",\r\n numberPrefix: \"$\",\r\n theme: \"ocean\",\r\n enableSlicing: 0\r\n },\r\n data: []\r\n };\r\n\r\n}","import { standardGridPageSize, customAutoCompleteFilter, customNotStringEmptyFilter, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $filter, SavedReportSelectorService, buildResponsibilityRiskPostBody, objectIdDataService, CustomReportServices, $http, $location, helperService, reportsDataService, reportsService, errorsDataService) {\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n $scope.runSavedReport();\r\n }\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n\r\n vm.allRolesOption = true;\r\n\r\n vm.selectedResponsibilities = [];\r\n vm.updateRoleDataSource = updateRoleDataSource;\r\n vm.intraResponsibilityToggleClicked = intraResponsibilityToggleClicked;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n $scope.intraResponsibilityOnly = false;\r\n $scope.intraResponsibilityOnly = SavedReportSelectorService.checkSavedReportForIntraResponsibility($rootScope.loadedSavedReport, $scope.intraResponsibilityOnly);\r\n\r\n $scope.hasDetailedVersion = true;\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n $scope.reportId = securityObject.ReportID;\r\n\r\n vm.selectedProduct = {};\r\n vm.selectedProduct.ID = $scope.pageInfo.ProductType;\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, null);\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n getReportMetadata().then(_ => {\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n $scope.runSavedReport();\r\n }\r\n });\r\n // ---\r\n\r\n });\r\n if ($location.path().has('Detailed')) {\r\n $scope.isDetailed = true;\r\n } else {\r\n $scope.isDetailed = false;\r\n }\r\n\r\n $scope.runSavedReport = function () {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && $scope.vm.responsibilityDataSource && $scope.vm.riskDataSource && vm.filterCriteria.fields) {\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n $scope.generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && $scope.vm.selectedResponsibilities && $scope.vm.riskDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n };\r\n\r\n $scope.changeView = function () {\r\n if ($scope.isDetailed === true) {\r\n $location.path('/AccessControl/Place/ResponsibilityRisk').search('');\r\n } else {\r\n $location.path('/AccessControl/Place/ResponsibilityRiskDetailed').search('');\r\n }\r\n };\r\n\r\n vm.deselectSelectedRisk = function () {\r\n vm.riskSelectedIds = helperService.deselectAllObjectsIfOtherIsClicked(vm.riskSelectedIds, vm.allRisksDropdownObject);\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n $scope.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n $scope.mainGridOptions.autoBind = false;\r\n\r\n\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n $scope.applySelectedFilter = function () {\r\n helperService.applyFilterCatchError($scope);\r\n };\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n AssignedUsers: { type: \"number\" },\r\n IsAssigned: { type: \"boolean\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n var data = buildResponsibilityRiskPostBody.generateBody($scope.ObjectId, $scope.responsibilities, $scope.risks, $scope.savedIntraResponsibilityOnly, vm.selectedRuleset.RulesetId);\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: $scope.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.populateCriteriaModel = function () {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedResponsibilities || vm.riskSelectedIds === undefined || $scope.intraResponsibilityOnly === undefined || !vm.selectedRuleset) {\r\n return;\r\n }\r\n var criteria = [];\r\n\r\n $scope.responsibilities = vm.selectedResponsibilities;\r\n\r\n $scope.risks = helperService.returnNullIfAllIsFound(vm.riskSelectedIds.map(function (el) { return el.Id; }));\r\n\r\n $scope.savedIntraResponsibilityOnly = $scope.intraResponsibilityOnly;\r\n\r\n $scope.vm.selectedResponsibilities.forEach(function (row, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityRoleIdentifier\", 'Role', row.Name, row.Identifier));\r\n });\r\n\r\n vm.riskSelectedIds.forEach(function (row, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"RiskId\", 'Risk', row.Name, row.Id));\r\n });\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"Individual\", 'IntraResponsibilityOnly', $scope.intraResponsibilityOnly, $scope.intraResponsibilityOnly));\r\n criteria.push(CustomReportServices.CreateCriteria(\"RulesetId\", 'Ruleset', vm.selectedRuleset.Name, vm.selectedRuleset.RulesetId));\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n if ($scope.isDetailed === true) {\r\n $scope.urlString = apiUrl + 'api/arm/or/places/responsibilityrisk/detailed';\r\n } else if ($scope.isDetailed === false) {\r\n $scope.urlString = apiUrl + 'api/arm/or/places/responsibilityrisk';\r\n }\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n };\r\n\r\n $scope.generateGridWithSelectedValues = function () {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n $scope.populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n };\r\n\r\n vm.setColumns = function () {\r\n\r\n if ($scope.isDetailed === false && $scope.intraResponsibilityOnly === false) {\r\n $scope.mainGridColumns = [\r\n { field: \"RiskName\", title: \"Risk Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n\r\n } else if ($scope.isDetailed === false && $scope.intraResponsibilityOnly === true) {\r\n $scope.mainGridColumns = [\r\n { field: \"ResponsibilityName\", title: \"Responsibility\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ResponsibilityID\", title: \"Responsibility ID\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"ResponsibilityKey\", title: \"Responsibility Key\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedUsers\", title: \"Assigned Users\", width: 140, filterable: customNotStringEmptyFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n\r\n } else if ($scope.isDetailed === true) {\r\n $scope.mainGridColumns = [\r\n { field: \"ResponsibilityName\", title: \"Responsibility\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ResponsibilityID\", title: \"Responsibility ID\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"ResponsibilityKey\", title: \"Responsibility Key\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AssignedUsers\", title: \"Assigned Users\", width: 140, filterable: customNotStringEmptyFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 140, filterable: customAutoCompleteFilter },\r\n { field: \"UserMenuName\", title: \"User Menu Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu Name\", width: 200, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"UserSubMenuName\", title: \"User Sub Menu Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SubMenuName\", title: \"Sub Menu Name\", width: 200, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"User Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Prompt\", title: \"Prompt\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.mainGridOptions.sortable = false;\r\n\r\n $scope.mainGridOptions.filterable = false;\r\n }\r\n };\r\n\r\n vm.setColumns();\r\n\r\n vm.EnableIntraResponsibility = function (selection) {\r\n if (!selection?.length) {\r\n $scope.intraResponsibilityOnly = true;\r\n vm.allResponsibilitiesSelected = true;\r\n } else {\r\n $scope.intraResponsibilityOnly = false;\r\n vm.allResponsibilitiesSelected = false;\r\n }\r\n vm.setColumns();\r\n };\r\n\r\n $scope.deleteFilter = function (id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n };\r\n\r\n $scope.splitHeaderText = function () {\r\n helperService.splitHeaderText(angular);\r\n };\r\n\r\n $scope.clearAllFilters = function () {\r\n $scope.gridDataSource.filter({});\r\n };\r\n\r\n $scope.saveReportLayoutButton = function () {\r\n CustomReportServices.saveGridLayout($scope, null);\r\n };\r\n\r\n $http.get(`${apiUrl}api/arm/riskrulesets`)\r\n .then(function (response) {\r\n response.data = $filter('filter')(response.data, { IsEnabled: true });\r\n vm.rulesetDataSource = response.data;\r\n vm.rulesetDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedRuleset = SavedReportSelectorService.checkSavedReportForRuleset($rootScope.loadedSavedReport, response.data, vm.rulesetDataSource);\r\n getRisks();\r\n });\r\n\r\n $scope.rulesetDropdownChange = function () {\r\n getRisks();\r\n $scope.populateCriteriaModel;\r\n };\r\n\r\n async function getRisks() {\r\n try {\r\n let response = await $http.get(apiUrl + 'api/arm/risks/ruleset/' + vm.selectedRuleset.RulesetId);\r\n response.data = $filter('filter')(response.data, { Enabled: true });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.allRisksDropdownObject = { \"Name\": \"All Risks\", \"Id\": 'AllObjectsInMultiSelect', 'Enabled': true };\r\n response.data.unshift(vm.allRisksDropdownObject);\r\n vm.riskDataSource = response.data;\r\n vm.riskSelectedIds = [vm.allRisksDropdownObject];\r\n vm.riskSelectedIds = await SavedReportSelectorService.checkSavedReportForRisks($rootScope.loadedSavedReport, response.data, vm.riskSelectedIds);\r\n $scope.runSavedReport();\r\n }\r\n catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n function updateRoleDataSource(roleDataSource, roleSelectedIds) {\r\n $scope.vm.responsibilityDataSource = roleDataSource;\r\n vm.responsibilities = roleSelectedIds;\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n\r\n vm.reportMetadata = data.data._embedded.reportData; \r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n\r\n function intraResponsibilityToggleClicked() {\r\n vm.setColumns();\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n}\r\n","import { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, dataService, $http, helperService, errorsDataService, riskRulesetService) {\r\n const DEFAULT_SAP_OBJECTID = 20211; \r\n const DEFAULT_SAP_GRC_OBJECTID = 37130202; \r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n $scope.$on('CodeChecker', _ => $scope.vm.codeCheckerDataSource.read());\r\n\r\n vm.showDropdown = false;\r\n\r\n vm.rulesets = [\r\n { name: 'SAP GRC Ruleset', value: 2 }\r\n ];\r\n\r\n var columnsVM =\r\n [\r\n { field: \"Product\", title: \"Product\", filterable: customAutoCompleteFilter },\r\n { field: \"TCode\", title: \"TCode\", filterable: customAutoCompleteFilter },\r\n { field: \"Object\", title: \"Object\", filterable: customAutoCompleteFilter },\r\n { field: \"ZTCode\", title: \"ZTCode\", filterable: customAutoCompleteFilter },\r\n { field: \"Function\", title: \"Function\", filterable: customAutoCompleteFilter },\r\n { field: \"BAPI\", title: \"BAPI\", filterable: customBooleanFilter },\r\n { field: \"Type\", title: \"Type\", filterable: customBooleanFilter },\r\n { field: \"ProcessName\", title: \"Business Process\", filterable: customBooleanFilter },\r\n {\r\n field: \"ExistsInBP\", title: \"Exists in Business Process\",\r\n template: `
\r\n {{ dataItem.ExistsInBP }}\r\n
\r\n \r\n \r\n
`,\r\n filterable: customBooleanFilter\r\n }\r\n ];\r\n\r\n activate();\r\n\r\n function activate() {\r\n initializeRulesetInfo();\r\n setBpDropdownVisibility();\r\n }\r\n\r\n $scope.runCodeCheckerConfirmation = function () {\r\n swal(helperService.areYouSureParams('Run Code Checker', 'This process will analyze your custom programs and includes for TCodes in the ruleset.', 'Run')).then(function () {\r\n $http.post(apiUrl + 'api/assure/sap/SAP/codechecker/run')\r\n .then(function (response) {\r\n return;\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n\r\n });\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n $scope.vm.addLink = function (dataItem) {\r\n if (dataItem.ZTCode && dataItem.ProcessName && dataItem.ExistsInBP === 'No') return true;\r\n else return false;\r\n };\r\n\r\n $scope.vm.addObjectToBusinessProcess = async function (dataItem) {\r\n\r\n let newGroupData = {\r\n BusinessProcessID: dataItem.ProcessID,\r\n BusinessProcessGroupID: dataItem.GroupID,\r\n Name: dataItem.ZTCode,\r\n Type: \"And\"\r\n };\r\n\r\n createNewGroup(newGroupData);\r\n };\r\n\r\n $scope.changeRuleset = function () {\r\n $scope.vm.codeCheckerDataSource.read();\r\n };\r\n\r\n async function setBpDropdownVisibility() {\r\n let products = await dataService.getProducts();\r\n vm.showDropdown = products.data.sum(product => product.ID === 'SapGrc');\r\n }\r\n\r\n async function createNewGroup(data) {\r\n try {\r\n await $http.post(apiUrl + 'api/assure/sap/SAP/codechecker/businessprocessgroups', data);\r\n $scope.vm.codeCheckerDataSource.read();\r\n } catch (error) { errorsDataService.catch(error); }\r\n }\r\n \r\n $scope.vm.codeCheckerGridOptions = helperService.setMainGridOptions(columnsVM, 600);\r\n\r\n async function initializeRulesetInfo() {\r\n let response = await riskRulesetService.getRiskRulesetList();\r\n if (response && response.data.length > 0) {\r\n let defaultRuleset = response.data.find(r => r.IsDefault === true);\r\n if (defaultRuleset) {\r\n vm.rulesets.unshift({\r\n name: defaultRuleset == null ? 'Fastpath Default Ruleset' : defaultRuleset.Name,\r\n value: 1\r\n });\r\n }\r\n else {\r\n vm.rulesets.unshift({\r\n name: response.data[0].Name,\r\n value: 1\r\n }); \r\n }\r\n }\r\n else {\r\n //If we didn't get any rulesets we will default to old functionality with generic name\r\n vm.rulesets.unshift({\r\n name: 'Fastpath Default Ruleset',\r\n value: 1\r\n });\r\n }\r\n\r\n vm.selectedRuleset = vm.rulesets[0];\r\n\r\n $scope.vm.codeCheckerDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n\r\n read: function (options) {\r\n\r\n var sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n let objectId = vm.selectedRuleset.value === 1 ? DEFAULT_SAP_OBJECTID : DEFAULT_SAP_GRC_OBJECTID;\r\n\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/core/reports/execute/' + objectId,\r\n data: sortsAndFilters,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n\r\n var data = response.data._embedded.reportData;\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n }, function (response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n}","import { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, KPIGeneratorService, ViewProductImportPageService, objectIdDataService, CustomReportServices, $http, helperService) {\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n var vm = $scope.vm = {};\r\n\r\n $scope.showSetup = false;\r\n\r\n $scope.helperService.getConfigurationValue('QuantificationThreshold').then(function (data) {\r\n vm.QuantificationThreshold = data;\r\n });\r\n\r\n $scope.helperService.getConfigurationValue('QuantificationLastDays').then(function (data) {\r\n vm.QuantificationLastDays = data;\r\n });\r\n\r\n var columnsForRiskRuleset = [\r\n { template: \"
\", width: 55, filterable: false },\r\n { field: \"Name\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Risk Description\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n $scope.gridOptions = helperService.setNonPageableGridOptions(columnsForRiskRuleset, 600);\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/arm/risks'\r\n }).then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.toggleValue = function (dataItem) {\r\n\r\n var selectedCheckboxValue = dataItem.Quantifiable;\r\n\r\n if (selectedCheckboxValue === true) {\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/arm/risks/' + dataItem.Id + '/quantification',\r\n data: {}\r\n }).then(function successCallback(response) {\r\n return;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n } else {\r\n $http({\r\n method: 'DELETE',\r\n url: apiUrl + 'api/arm/risks/' + dataItem.Id + '/quantification'\r\n }).then(function successCallback(response) {\r\n return;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n\r\n });\r\n }\r\n };\r\n\r\n function highlightSelectedItem(ev, props) {\r\n var dataSource = ev.sender.args.dataSource.data;\r\n for (var i = 0; i < dataSource.length; i++) {\r\n if (i === props.index) {\r\n dataSource[i].color = \"#4F7E98\";\r\n } else {\r\n delete dataSource[i].color;\r\n }\r\n }\r\n ev.sender.args.dataSource.data = dataSource;\r\n ev.sender.setJSONData(ev.sender.args.dataSource);\r\n }\r\n\r\n $scope.fusionChartByRiskEvents = {\r\n dataPlotClick: function (ev, props) {\r\n var row = ev.sender.args.dataSource.data[props.index];\r\n $scope.selectItem(row, 'risk');\r\n highlightSelectedItem(ev, props);\r\n }\r\n };\r\n\r\n $scope.fusionChartByUserEvents = {\r\n dataPlotClick: function (ev, props) {\r\n var row = ev.sender.args.dataSource.data[props.index];\r\n $scope.selectItem(row, 'user');\r\n highlightSelectedItem(ev, props);\r\n }\r\n };\r\n\r\n $scope.createPartialSavedReportAndNavigate = function (filters, objectId) {\r\n $rootScope.loadedSavedReport = KPIGeneratorService.createSavedReportStub(filters, objectId);\r\n ViewProductImportPageService.launchReportByObjectId(objectId);\r\n };\r\n\r\n $scope.selectedRiskData = null;\r\n\r\n $scope.selectItem = function (row, type) {\r\n if (type === 'risk') {\r\n $scope.selectedRisk = row;\r\n $scope.selectedRiskLoading = true;\r\n\r\n $http.get(apiUrl + 'api/core/charts/12350565-69B1-4424-810A-BDD3B7CCFDD7/data?filterField=RiskName&filterValue=' + row.Label).then(function (response) {\r\n $scope.selectedRiskData = response.data;\r\n $scope.selectedRiskLoading = false;\r\n });\r\n\r\n } else if (type === 'user') {\r\n $scope.selectedUser = row;\r\n $scope.selectedUserLoading = true;\r\n\r\n $http.get(apiUrl + 'api/core/charts/B7BB0BE0-94EA-46E9-B8A1-09BA6CBEB933/data?filterField=UserName&filterValue=' + row.Label).then(function (response) {\r\n $scope.selectedUserData = response.data;\r\n\r\n $scope.selectedUserLoading = false;\r\n\r\n });\r\n\r\n }\r\n };\r\n\r\n $scope.myDataSourceByRisk = {\r\n chart: {\r\n caption: \"By Risk\",\r\n numberPrefix: \"$\",\r\n theme: \"ocean\"\r\n },\r\n data: []\r\n };\r\n\r\n $scope.myDataSourceByUser = {\r\n chart: {\r\n caption: \"By User\",\r\n numberPrefix: \"$\",\r\n theme: \"ocean\",\r\n enableSlicing: 0\r\n },\r\n data: []\r\n };\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/core/charts/' + 'B7BB0BE0-94EA-46E9-B8A1-09BA6CBEB933' + '/data'\r\n }).then(function (response) {\r\n $scope.myDataSourceByRisk.data = response.data;\r\n });\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/core/charts/' + '12350565-69B1-4424-810A-BDD3B7CCFDD7' + '/data'\r\n }).then(function (response) {\r\n $scope.myDataSourceByUser.data = response.data;\r\n\r\n });\r\n\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (sapAuthFieldGroupsDataService, $uibModalInstance, group, helperService, isEditingValues, objectId) {\r\n const vm = this;\r\n\r\n vm.dismiss = dismiss;\r\n vm.createFieldValue = createFieldValue;\r\n vm.deleteFieldValue = deleteFieldValue;\r\n vm.groupFormSubmit = groupFormSubmit;\r\n\r\n vm.group = { ...group };\r\n vm.isEditingValues = isEditingValues;\r\n vm.objectId = objectId;\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n async function createFieldValue(newField) { \r\n vm.fieldProcessing = true;\r\n let data = newField;\r\n newField.ProcessObjectId = vm.group.ProcessObjectId;\r\n newField.AuthFieldGroupId = vm.group.Id;\r\n try {\r\n let response = await sapAuthFieldGroupsDataService.createFieldValue(data);\r\n newField.Id = response.data;\r\n vm.group.AuthFieldValues.push(newField);\r\n vm.newField = null;\r\n vm.fieldProcessing = false;\r\n } catch (error) {\r\n vm.fieldProcessing = false;\r\n }\r\n }\r\n\r\n async function deleteFieldValue(field) {\r\n vm.fieldProcessing = true;\r\n try {\r\n await sapAuthFieldGroupsDataService.deleteFieldValue(field.Id);\r\n const fieldIndex = vm.group.AuthFieldValues.findIndex(value => value.Id === field.Id);\r\n vm.group.AuthFieldValues.splice(fieldIndex, 1);\r\n vm.fieldProcessing = false;\r\n } catch {\r\n vm.fieldProcessing = false;\r\n }\r\n }\r\n\r\n async function updateGroupInfo() {\r\n let data = { ...vm.group };\r\n delete data.AuthFieldValues;\r\n delete data.$$hashKey;\r\n try {\r\n await sapAuthFieldGroupsDataService.updateGroup(data);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n async function createGroup() {\r\n let data = { ...vm.group };\r\n data.ProcessObjectId = vm.objectId;\r\n try {\r\n await sapAuthFieldGroupsDataService.createGroup(data);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n function groupFormSubmit() {\r\n vm.saving = new createSpinner();\r\n if (vm.group.Id) {\r\n updateGroupInfo();\r\n } else {\r\n createGroup();\r\n }\r\n }\r\n}","import groupModalController from \"./groupModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, sapAuthFieldGroupsDataService) {\r\n const vm = this;\r\n\r\n vm.openManageGroupModal = openManageGroupModal;\r\n vm.deleteGroup = deleteGroup;\r\n\r\n vm.groupMenuOptions = [\r\n {\r\n text: 'Edit Group Info',\r\n click: function (modelValue) {\r\n vm.openManageGroupModal(modelValue.group, false);\r\n }\r\n },\r\n {\r\n text: 'Edit Field Values',\r\n click: function (modelValue) {\r\n vm.openManageGroupModal(modelValue.group, true);\r\n }\r\n },\r\n {\r\n text: '
Delete Group',\r\n click: function (modelValue) {\r\n vm.deleteGroup(modelValue.group.Id);\r\n }\r\n }\r\n ];\r\n\r\n async function openManageGroupModal(group, isEditingValues) {\r\n let groupModal = $uibModal.open({\r\n templateUrl: '/App/Components/MaintainBusinessProcess/SAPAuthFieldGroups/groupModal.tmpl.html',\r\n controller: groupModalController,\r\n controllerAs: 'gmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n group: () => group,\r\n isEditingValues: () => isEditingValues,\r\n objectId: () => vm.object.BusinessProcessObjectId\r\n }\r\n });\r\n\r\n try {\r\n await groupModal.result;\r\n vm.onGroupUpdated();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteGroup(groupId) {\r\n try {\r\n await sapAuthFieldGroupsDataService.deleteGroup(groupId);\r\n vm.onGroupUpdated();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","import sapAuthFieldGroupsController from \"./sapAuthFieldGroups.controller\";\r\n\r\n/* sapAuthFieldGroups.component.js */\r\n\r\n/**\r\n * @desc component for viewing and managing SAP Auth Field Groups\r\n * @example
\r\n */\r\n\r\nconst sapAuthFieldGroups = {\r\n bindings: {\r\n object: '<',\r\n isCustomRuleset: '<',\r\n onGroupUpdated: '&'\r\n },\r\n controller: sapAuthFieldGroupsController,\r\n controllerAs: 'safgvm',\r\n templateUrl: '/App/Components/MaintainBusinessProcess/SAPAuthFieldGroups/sapAuthFieldGroups.tmpl.html'\r\n};\r\n\r\nexport default sapAuthFieldGroups;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n createGroup,\r\n createFieldValue,\r\n updateGroup,\r\n deleteGroup,\r\n deleteFieldValue\r\n };\r\n\r\n return factory;\r\n\r\n // POST Requests\r\n async function createGroup(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/assure/sap/authfieldgroups`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createFieldValue(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/assure/sap/authfieldvalues`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // PUT Requests\r\n async function updateGroup(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/assure/sap/authfieldgroups/${data.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // DELETE Requests\r\n async function deleteGroup(groupId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/assure/sap/authfieldgroups/${groupId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteFieldValue(fieldId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/assure/sap/authfieldvalues/${fieldId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","import { standardGridPageSize, customAutoCompleteFilter } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, maintainProfilesDataService, helperService, isImport, existingProfiles) {\r\n\r\n const vm = this;\r\n\r\n vm.addProfile = addProfile;\r\n vm.cancel = cancel;\r\n vm.importProfiles = importProfiles;\r\n vm.isImport = isImport;\r\n vm.existingProfiles = [...existingProfiles];\r\n\r\n activate();\r\n\r\n function activate() {\r\n createAvailableProfilesGrid();\r\n }\r\n\r\n async function addProfile({ ProfileName, ProductId }) {\r\n kendo.ui.progress(vm.availableProfilesGrid.element, true);\r\n let postData = {\r\n ProfileName: ProfileName,\r\n ProductId: ProductId\r\n };\r\n\r\n try {\r\n await maintainProfilesDataService.updateProfiles(postData);\r\n vm.existingProfiles.push(postData);\r\n kendo.ui.progress(vm.availableProfilesGrid.element, false);\r\n await vm.availableProfilesGridDataSource.read();\r\n } catch {\r\n kendo.ui.progress(vm.availableProfilesGrid.element, false);\r\n }\r\n }\r\n\r\n function createAvailableProfilesGrid() {\r\n var availableGridColumns = [\r\n { title: \"Profile\", field: \"ProfileName\", filterable: customAutoCompleteFilter },\r\n { title: \"Product\", field: \"ProductName\", filterable: customAutoCompleteFilter },\r\n { template: \"
\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableProfilesGridOptions = helperService.setMainGridOptions(availableGridColumns, null);\r\n vm.availableProfilesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let { data } = await maintainProfilesDataService.getProfiles();\r\n data = $filter(\"orderBy\")(data, \"ProfileName\");\r\n data = data.filter(profile => !vm.existingProfiles.some(existingProfile => existingProfile.ProfileName === profile.ProfileName && existingProfile.ProductId === profile.ProductId));\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function importProfiles(files) {\r\n vm.importPending = new createSpinner();\r\n let fd = new FormData();\r\n files.forEach(file => {\r\n fd.append(file.file.name, file.file);\r\n });\r\n if (files.length > 0) {\r\n vm.disableButton = true;\r\n try {\r\n await maintainProfilesDataService.importProfiles(fd);\r\n await helperService.successfulSaveButton(vm.importPending);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.importPending.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport maintainProfilesModalController from \"../maintainProfilesModal/maintainProfilesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModal, maintainProfilesDataService, helperService, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = createMaintainProfilesGrid();\r\n\r\n vm.openMaintainProfilesModal = openMaintainProfilesModal;\r\n vm.deleteProfile = deleteProfile;\r\n vm.exportProfiles = exportProfiles;\r\n\r\n function createMaintainProfilesGrid() {\r\n let maintainProfilesGridColumns =\r\n [\r\n { field: \"ProfileName\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", filterable: customAutoCompleteFilter },\r\n { template: `
Delete`, \"title\": \"Delete\", width: 90 }\r\n\r\n ];\r\n\r\n vm.maintainProfilesGridOptions = helperService.setMainGridOptions(maintainProfilesGridColumns, 600);\r\n vm.maintainProfilesGridOptions.selectable = false;\r\n\r\n vm.maintainProfilesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let { data } = await maintainProfilesDataService.getSensitiveProfiles();\r\n data = $filter('orderBy')(data, 'ProfileName');\r\n vm.existingProfiles = data;\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function exportProfiles() {\r\n vm.exportUpdatePending = new createSpinner();\r\n\r\n try {\r\n let { data } = await maintainProfilesDataService.exportProfiles();\r\n await helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(data, 'Profiles.xlsx');\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function deleteProfile({ ProfileName, Id }) {\r\n try {\r\n await swal(helperService.areYouSureParamsWithHTML('Delete Profile',\r\n `
Are you sure you want to delete profile\r\n
${ProfileName}?
\r\n
`, 'Delete'));\r\n await maintainProfilesDataService.deleteProfile(Id);\r\n vm.profile = null;\r\n vm.maintainProfilesGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n\r\n async function openMaintainProfilesModal(isImport) {\r\n let profileModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainProfiles/maintainProfilesModal/maintainProfilesModal.tmpl.html',\r\n controller: maintainProfilesModalController,\r\n controllerAs: 'mpmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n isImport: () => isImport,\r\n existingProfiles: () => vm.existingProfiles\r\n }\r\n });\r\n\r\n try {\r\n await profileModal.result;\r\n vm.maintainProfilesGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}","/* maintainProfilesGrid.component.js */\r\n\r\nimport maintainProfilesGridController from \"./maintainProfilesGrid.controller\";\r\n\r\n/**\r\n * @desc component to display, add, delete, import and export SAP users that are assigned to powerful profiles\r\n * @example
\r\n */\r\n\r\nconst maintainProfilesGrid = {\r\n controller: maintainProfilesGridController,\r\n controllerAs: 'mpgvm',\r\n templateUrl: '/App/Components/maintainProfiles/maintainProfilesGrid/maintainProfilesGrid.tmpl.html'\r\n};\r\n\r\nexport default maintainProfilesGrid;","import angular from 'angular';\r\nimport SAPCodeCheckerViewModel from '../Components/SAPCodeChecker/SAPCodeCheckerViewModel';\r\nimport SAPRiskQuantificationViewModel from '../Components/SAPRiskQuantification/SAPRiskQuantificationViewModel';\r\nimport sapAuthFieldGroups from '../Components/MaintainBusinessProcess/SAPAuthFieldGroups/sapAuthFieldGroups.component';\r\nimport sapAuthFieldGroupsDataServiceFactory from '../Components/MaintainBusinessProcess/SAPAuthFieldGroups/sapAuthFieldGroupsDataService.factory';\r\nimport maintainProfilesGrid from '../Components/maintainProfiles/maintainProfilesGrid/maintainProfilesGrid.component';\r\nimport maintainProfiles from '../Components/maintainProfiles/maintainProfiles.component';\r\n\r\n\r\nexport default angular\r\n .module('app.accessRiskMonitor.sap', [])\r\n .controller(\"sapCodeCheckerViewModel\", SAPCodeCheckerViewModel)\r\n .controller(\"SAPRiskQuantificationViewModel\", SAPRiskQuantificationViewModel)\r\n .component(\"sapAuthFieldGroups\", sapAuthFieldGroups)\r\n .factory(\"sapAuthFieldGroupsDataService\", sapAuthFieldGroupsDataServiceFactory)\r\n .component('maintainProfiles', maintainProfiles)\r\n .component('maintainProfilesGrid', maintainProfilesGrid)\r\n .name;","/* maintainProfiles.component.js */\r\n\r\n/**\r\n * @desc component to configure profiles in SAP\r\n * @example
\r\n */\r\n\r\nconst maintainProfiles = {\r\n template: `
`\r\n};\r\n\r\nexport default maintainProfiles;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($filter, errorsDataService, $http, helperService) {\r\n const vm = this,\r\n columns = [\r\n { field: \"RiskName\", title: \"Risk Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \" Ruleset Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", filterable: customAutoCompleteFilter },\r\n { field: \"Control\", title: \"Control\", filterable: customAutoCompleteFilter },\r\n { field: \"Status\", title: \"Status\", filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.applyDefaultMitigations = applyDefaultMitigations;\r\n vm.helperService = helperService;\r\n vm.DefaultMitigationsOverwriteCurrent;\r\n vm.ApplyDefaultMitigationsAfterImport;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.DefaultMitigationsOverwriteCurrent = await vm.helperService.getConfigurationValue('DefaultMitigationsOverwriteCurrent');\r\n vm.ApplyDefaultMitigationsAfterImport = await vm.helperService.getConfigurationValue('ApplyDefaultMitigationsAfterImport');\r\n vm.mainGridOptions = helperService.setMainGridOptions(columns, 600);\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n selectable: false,\r\n transport: {\r\n read: async options => {\r\n let sortsAndFilters = helperService.prepareSortsAndFilters(options),\r\n response;\r\n\r\n try {\r\n response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/core/reports/execute/10203',\r\n data: sortsAndFilters,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n });\r\n\r\n $filter('filter')(response.data._embedded.reportData, { DefaultMitigation: 'True' });\r\n\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function applyDefaultMitigations() {\r\n try {\r\n await swal(helperService.areYouSureParams('Apply Default Mitigations', 'Are you sure you want to apply Default Mitigations to all risks?', 'Apply'));\r\n await $http.put(`${apiUrl}api/arm/usermitigations/applydefaultmitigations`, {});\r\n } catch (error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n}\r\n","import controller from \"./applyDefaultMitigations.controller\";\r\n\r\n/* applyDefaultMitigations.component.js */\r\n\r\n/**\r\n * @desc component for applying default mitigations\r\n * @example
\r\n */\r\n\r\nconst applyDefaultMitigations = {\r\n controller: controller,\r\n controllerAs: 'admvm',\r\n templateUrl: '/App/Components/applyDefaultMitigations/applyDefaultMitigations.tmpl.html'\r\n};\r\n\r\nexport default applyDefaultMitigations;","import { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, helperService, dataService, risksDataService, assignRisksDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.assignByUserDropdownChange = assignByUserDropdownChange;\r\n vm.assignByRiskDropdownChange = assignByRiskDropdownChange;\r\n vm.removeAssignByUser = removeAssignByUser;\r\n vm.assignByUser = assignByUser;\r\n vm.assignByRisk = assignByRisk;\r\n\r\n //Arrays to hold the current list of assigned users and risks\r\n vm.AssignByUserList = [];\r\n vm.AssignByRiskList = [];\r\n vm.risk = {};\r\n vm.AssignedUser = {\r\n AssignedUser: '',\r\n Active: false,\r\n Domain: '',\r\n Email: '',\r\n IsSystemAccount: false,\r\n UserID: '',\r\n UserLogonName: ''\r\n };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.userDataSource = await getUsers();\r\n vm.riskManageType = await getRiskManageType();\r\n setupAssignByUserGrid();\r\n setupAssignByRiskGrid();\r\n }\r\n\r\n function getRiskManageType() {\r\n return helperService.getConfigurationValue('RiskManageType');\r\n }\r\n\r\n async function getUsers() {\r\n let response = await dataService.getUsers();\r\n response.data = response.data.filter(user => user.Active);\r\n response.data = $filter('orderBy')(response.data, 'UserLogonName');\r\n return response.data;\r\n }\r\n\r\n function setupAssignByUserGrid() {\r\n const userGridColumns = [\r\n { template: `
`, width: 65, minResizableWidth: 65, title: \" \" },\r\n { field: \"User\", title: \"User Name\", filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", filterable: customAutoCompleteFilter },\r\n { template: `
{{dataItem.AssignedUserName}}`, title: \"Assigned User\", width: 160, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.userGridOptions = helperService.setMainGridOptions(userGridColumns, 600);\r\n vm.userGridOptions.selectable = false;\r\n\r\n vm.userGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await assignRisksDataService.getAssignedRisks();\r\n response.data.forEach(risk => risk.isAssigned = false);\r\n response.data = $filter('orderBy')(response.data, 'User');\r\n options.success(response.data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function setupAssignByRiskGrid() {\r\n const riskGridColumns = [\r\n { template: `
`, width: 65, minResizableWidth: 65, title: \" \" },\r\n { field: \"RulesetName\", title: \"Ruleset\", filterable: customAutoCompleteFilter },\r\n { field: \"RulesetEnabled\", title: \"Ruleset Enabled\", width: 140, filterable: customBooleanFilter },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"ID\", title: \"Id\", filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel.Name\", title: \"Risk\", filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"Risk Enabled\", width: 140, filterable: customBooleanFilter },\r\n { template: `
{{dataItem.AssignedUser.UserLogonName}}`, title: \"Assigned User\", width: 160, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.riskGridOptions = helperService.setMainGridOptions(riskGridColumns, 600);\r\n vm.riskGridOptions.selectable = false;\r\n\r\n vm.riskGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n RulesetEnabled: { type: \"boolean\" },\r\n Enabled: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n filter: [{ field: 'RulesetEnabled', operator: 'equal', value: true }, { field: 'Enabled', operator: 'equal', value: true }],\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await risksDataService.getAllRisks();\r\n response.data.forEach(risk => {\r\n if (risk.AssignedUser === null) {\r\n risk.AssignedUser = vm.AssignedUser;\r\n }\r\n risk.isAssigned = false;\r\n });\r\n\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n\r\n }\r\n });\r\n }\r\n\r\n function assignByUserDropdownChange() {\r\n let userGridDataSource = vm.userGridDataSource.data()\r\n userGridDataSource.forEach(user => {\r\n user.isAssigned = user.UserMasterID === vm.risk.selectedAssignByUserUser.UserID;\r\n });\r\n }\r\n\r\n function assignByRiskDropdownChange() {\r\n let riskGridDataSource = vm.riskGridDataSource.data()\r\n riskGridDataSource.forEach(risk => {\r\n if (risk.isAssigned) {\r\n risk.isAssigned = false;\r\n }\r\n });\r\n }\r\n\r\n async function removeAssignByUser(dataItem) {\r\n kendo.ui.progress(vm.userGrid.element, true);\r\n try {\r\n await assignRisksDataService.removeAssignedRiskByUser(dataItem.UserMasterID);\r\n dataItem.AssignedUserId = null;\r\n dataItem.AssignedUserName = null;\r\n dataItem.isAssigned = false;\r\n kendo.ui.progress(vm.userGrid.element, false);\r\n } catch {\r\n kendo.ui.progress(vm.userGrid.element, false);\r\n }\r\n }\r\n\r\n async function assignByUser(dataItem) {\r\n kendo.ui.progress(vm.userGrid.element, true);\r\n if (vm.risk.selectedAssignByUserUser && vm.risk.selectedAssignByUserUser !== '') {\r\n const data = {\r\n 'AssignedUserId': vm.risk.selectedAssignByUserUser.UserID,\r\n 'UserMasterId': dataItem.UserMasterID\r\n };\r\n\r\n try {\r\n await assignRisksDataService.assignRiskByUser(data);\r\n dataItem.AssignedUserId = data.AssignedUserId;\r\n dataItem.AssignedUserName = vm.risk.selectedAssignByUserUser.UserLogonName;\r\n kendo.ui.progress(vm.userGrid.element, false);\r\n } catch {\r\n kendo.ui.progress(vm.userGrid.element, false);\r\n }\r\n }\r\n }\r\n\r\n async function assignByRisk(dataItem, remove) {\r\n kendo.ui.progress(vm.riskGrid.element, true);\r\n const data = {\r\n 'Id': dataItem.Id,\r\n 'AssignedUserId': remove ? null : vm.risk.selectedAssignByRiskUser.UserID\r\n };\r\n\r\n try {\r\n await assignRisksDataService.assignByRisk(data);\r\n if (remove) {\r\n dataItem.AssignedUser = vm.AssignedUser;\r\n dataItem.isAssigned = false;\r\n } else {\r\n dataItem.AssignedUser = vm.risk.selectedAssignByRiskUser;\r\n }\r\n kendo.ui.progress(vm.riskGrid.element, false);\r\n } catch {\r\n kendo.ui.progress(vm.riskGrid.element, false);\r\n }\r\n }\r\n}\r\n","import assignRisksController from \"./assignRisks.controller\";\r\n\r\n/* assignRisks.component.js */\r\n\r\n/**\r\n * @desc component for assigning risks\r\n * @example \r\n */\r\n\r\nconst assignRisks = {\r\n controller: assignRisksController,\r\n controllerAs: 'arvm',\r\n templateUrl: '/App/Components/assignRisks/assignRisks.tmpl.html'\r\n};\r\n\r\nexport default assignRisks;","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, controlLibraryDataService, activeControlPlugins) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.importControlLibrary = importControlLibrary;\r\n vm.importControlsFromPluginAPI = importControlsFromPluginAPI;\r\n\r\n vm.disableButton = false;\r\n vm.auditBoardActive = activeControlPlugins.some(plugin => plugin === 'AuditBoard');\r\n vm.workivaActive = activeControlPlugins.some(plugin => plugin === 'Workiva');\r\n vm.importType = \"InsertNewOnly\";\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n function successCallback(response) {\r\n vm.disableButton = false;\r\n vm.cancel();\r\n }\r\n\r\n // Import control functions\r\n\r\n async function importControlLibrary(file) {\r\n vm.pendingImport = new createSpinner();\r\n vm.pendingImport.loadingValue = true;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n fd.append(\"ImportType\", vm.importType);\r\n\r\n vm.disableButton = true;\r\n\r\n try {\r\n let response = await controlLibraryDataService.importControlLibrary(fd);\r\n successCallback(response);\r\n vm.pendingImport.loadingValue = false;\r\n } catch {\r\n vm.pendingImport.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n\r\n async function importControlsFromPluginAPI(plugin) {\r\n vm.disableButton = true;\r\n try {\r\n await swal(helperService.areYouSureParams(`Import via ${plugin} API`, `Are you sure you want to import controls via ${plugin} API?`, 'Import'));\r\n let response = await controlLibraryDataService.importControlsFromPluginAPI(plugin);\r\n successCallback(response);\r\n } catch {\r\n vm.disableButton = false;\r\n }\r\n }\r\n\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, FileSaver, helperService, controlLibraryDataService, item, dataService) {\r\n const vm = this;\r\n vm.saveControl = saveControl;\r\n vm.cancel = cancel;\r\n vm.removeFile = removeFile;\r\n vm.downloadFile = downloadFile;\r\n\r\n activate();\r\n\r\n function activate() {\r\n setMitigations();\r\n setProducts();\r\n setUsers();\r\n setBusinessProcesses();\r\n\r\n vm.shouldBeOpen = true;\r\n\r\n if (item.Id) {\r\n vm.control = { ...item.toJSON() };\r\n // get any attachments that our control already has\r\n if (vm.control.Attachments.length) {\r\n vm.existingFilesDataSource = [...vm.control.Attachments];\r\n }\r\n }\r\n }\r\n\r\n // Functions for loading dropdown data\r\n async function setMitigations() {\r\n vm.mitigationDropdownLoading = true;\r\n let response = await controlLibraryDataService.getMitigations();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.mitigationDataSource = response.data;\r\n vm.mitigationDropdownLoading = false;\r\n }\r\n\r\n async function setProducts() {\r\n vm.productDropdownLoading = true;\r\n let response = await controlLibraryDataService.getProducts();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.productDataSource = response.data;\r\n vm.productDropdownLoading = false;\r\n }\r\n\r\n async function setUsers() {\r\n vm.userDropdownLoading = true;\r\n let response = await dataService.getUsers()\r\n response.data = response.data.filter(user => user.Active);\r\n response.data = $filter('orderBy')(response.data, 'UserLogonName');\r\n vm.usersDataSource = response.data;\r\n vm.userDropdownLoading = false;\r\n }\r\n\r\n async function setBusinessProcesses() {\r\n vm.businessProcessDropdownLoading = true;\r\n let response = await controlLibraryDataService.getBusinessProcesses();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.businessProcessDataSource = response.data.map(bp => {\r\n let noObjectsBp = {\r\n \"Id\": bp.Id,\r\n \"Name\": bp.Name,\r\n \"Description\": bp.Description,\r\n \"Type\": bp.Type,\r\n \"Objects\": [],\r\n \"RulesetId\": bp.RulesetId,\r\n \"RulesetName\": bp.RulesetName\r\n };\r\n return noObjectsBp;\r\n });\r\n vm.businessProcessDropdownLoading = false;\r\n }\r\n\r\n // Common modal functions\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n function close() { $uibModalInstance.close(); }\r\n\r\n async function saveControl(control) {\r\n vm.savePending = new createSpinner();\r\n if (control.BusinessProcesses) {\r\n control.selectedBusinessProcesses = control.BusinessProcesses.map(bp => bp.Id);\r\n }\r\n\r\n let controlToSave = {\r\n 'Id': control.Id,\r\n 'Name': control.Name,\r\n 'Description': control.Description,\r\n 'OwnerId': control.OwnerId,\r\n 'PerformerId': control.PerformerId,\r\n 'MitigationId': control.MitigationId,\r\n 'ProductType': control.ProductType,\r\n 'BusinessProcessIds': control.selectedBusinessProcesses\r\n };\r\n\r\n if (vm.control.Identifier) {\r\n controlToSave.Identifier = control.Identifier;\r\n }\r\n\r\n try {\r\n var controlData;\r\n if (vm.control.Identifier) {\r\n await controlLibraryDataService.editControl(controlToSave);\r\n controlData = item.Identifier;\r\n } else {\r\n var { data: controlData } = await controlLibraryDataService.addNewControl(controlToSave);\r\n }\r\n\r\n if (vm.attachments.flow.files.length) {\r\n uploadNewFiles(vm.attachments.flow.files, controlData);\r\n } else {\r\n await helperService.successfulSaveButton(vm.savePending)\r\n close();\r\n }\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function removeFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n const index = vm.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.existingFilesDataSource.splice(index, 1);\r\n vm.fileActionPending = false;\r\n } catch {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function downloadFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n const response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n vm.fileActionPending = false;\r\n } catch {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function uploadNewFiles(files, controlId) {\r\n let fd = new FormData();\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"Control\");\r\n fd.append(\"DataTypeId\", controlId);\r\n\r\n try {\r\n await controlLibraryDataService.addAttachments(fd);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport importControlModalController from \"./importControlModal.controller\";\r\nimport newEditControlModalController from \"./newEditControlModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, FileSaver, $uibModal, helperService, controlLibraryDataService, configurationDataService) {\r\n\r\n const vm = this;\r\n vm.deleteControl = deleteControl;\r\n vm.exportControls = exportControls;\r\n vm.openNewEditModal = openNewEditModal;\r\n vm.openImportModal = openImportModal;\r\n vm.helperService = helperService;\r\n\r\n $scope.$on('ImportControlsLibrary', (event, args) => vm.gridDataSource.read());\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.activeControlPlugins = await getActiveControlPlugins();\r\n let columnsFromVM = [\r\n { field: \"Id\", title: \"Control ID\", filterable: customAutoCompleteFilter },\r\n { field: \"Name\", title: \"Control Name\", filterable: customAutoCompleteFilter },\r\n { field: \"PerformerName\", title: \"Control Performer\", filterable: customAutoCompleteFilter },\r\n { field: \"OwnerName\", title: \"Control Owner\", filterable: customAutoCompleteFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 }\r\n ];\r\n\r\n if (vm.activeControlPlugins.length > 0) {\r\n vm.activeControlPlugins.forEach(plugin => {\r\n columnsFromVM.splice(3, 0, { field: `Is${plugin}Control`, title: `Imported from ${plugin}`, filterable: customBooleanFilter, width: 150 });\r\n });\r\n }\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(columnsFromVM, 600);\r\n vm.mainGridOptions.selectable = false;\r\n }\r\n\r\n async function getActiveControlPlugins() {\r\n let pluginsArray = [];\r\n // individually get config values for specific plugins until we have a better way to accomplish this\r\n const workivaActive = await configurationDataService.getConfigurationValueByName(\"WORKIVA_Active\");\r\n const auditBoardActive = await configurationDataService.getConfigurationValueByName(\"AUDITBOARD_Active\");\r\n if (workivaActive.data) {\r\n pluginsArray.push('Workiva');\r\n }\r\n if (auditBoardActive.data) {\r\n pluginsArray.push('AuditBoard');\r\n }\r\n return pluginsArray;\r\n }\r\n\r\n function deleteControl(control) {\r\n controlLibraryDataService.deleteControl(control)\r\n .then(response => {\r\n vm.gridDataSource.read();\r\n }).catch(errorCallback);\r\n }\r\n\r\n function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n\r\n function exportControls() {\r\n\r\n vm.exportUpdatePending = new createSpinner();\r\n\r\n controlLibraryDataService.exportControls()\r\n .then(response => {\r\n helperService.successfulSaveButton(vm.exportUpdatePending)\r\n .then(result => {\r\n FileSaver.saveAs(response.data, 'Controls.xlsx');\r\n vm.exportUpdatePending.loadingValue = false;\r\n });\r\n }).catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n vm.exportUpdatePending.loadingValue = false;\r\n });\r\n }\r\n\r\n async function openNewEditModal(item) {\r\n let newEditModal = $uibModal.open({\r\n templateUrl: '/App/Components/controlLibrary/newEditControlModal.html',\r\n controller: newEditControlModalController,\r\n controllerAs: 'necvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n item: () => item || {}\r\n }\r\n });\r\n\r\n try {\r\n await newEditModal.result;\r\n vm.gridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function openImportModal() {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/controlLibrary/importControlModal.html',\r\n controller: importControlModalController,\r\n controllerAs: 'icmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n activeControlPlugins: () => vm.activeControlPlugins\r\n }\r\n });\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n IsWorkivaControl: { type: \"boolean\" },\r\n IsAuditBoardControl: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await controlLibraryDataService.getControls();\r\n options.success(response.data);\r\n } catch (error) {\r\n options.error(error);\r\n }\r\n }\r\n }\r\n });\r\n\r\n}","/* controlLibrary.component.js */\r\n\r\nimport controlLibraryController from \"./controlLibrary.controller\";\r\n\r\n/**\r\n * @desc component for Control Library\r\n * @example \r\n */\r\n\r\nconst controlLibrary = {\r\n controller: controlLibraryController,\r\n controllerAs: 'clvm',\r\n templateUrl: '/App/Components/controlLibrary/controlLibrary.html'\r\n};\r\n\r\nexport default controlLibrary;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, businessCyclesDataService, businessCycle) {\r\n\r\n const vm = this;\r\n\r\n vm.dismiss = dismiss;\r\n vm.saveBusinessCycle = saveBusinessCycle;\r\n\r\n function activate() {\r\n vm.shouldBeOpen = true;\r\n\r\n if (businessCycle.ID) {\r\n vm.businessCycle = Object.assign({}, businessCycle.toJSON());\r\n }\r\n }\r\n\r\n activate();\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n //Save BusinessCycle\r\n function saveBusinessCycle() {\r\n vm.saving = new createSpinner();\r\n if (vm.businessCycle.ID) {\r\n modifyBusinessCycle(vm.businessCycle.ID, vm.businessCycle);\r\n } else {\r\n addBusinessCycle(vm.businessCycle);\r\n }\r\n }\r\n\r\n async function modifyBusinessCycle(businessCycleId, businessCycle) {\r\n try {\r\n await businessCyclesDataService.modifyBusinessCycle(businessCycleId, businessCycle);\r\n await helperService.successfulSaveButton(vm.saving);\r\n close();\r\n }\r\n catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n async function addBusinessCycle(businessCycle) {\r\n try {\r\n businessCycle.ID = '';\r\n await businessCyclesDataService.addBusinessCycle(businessCycle);\r\n await helperService.successfulSaveButton(vm.saving);\r\n close();\r\n }\r\n catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport businessCycleModalController from \"./businessCycleModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, businessCyclesDataService, $uibModal, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.shouldBeOpen = true;\r\n\r\n vm.deleteItem = deleteItem;\r\n vm.openModal = openModal;\r\n\r\n activate();\r\n\r\n function activate() {\r\n createBusinessCycleGrid();\r\n }\r\n\r\n function createBusinessCycleGrid() {\r\n const businessCyclesGridColumns =\r\n [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 }\r\n\r\n ];\r\n\r\n vm.businessCyclesGridOptions = helperService.setMainGridOptions(businessCyclesGridColumns, 600);\r\n vm.businessCyclesGridOptions.selectable = false;\r\n\r\n vm.businessCyclesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let { data } = await businessCyclesDataService.getBusinessCycles();\r\n data = $filter('orderBy')(data, 'Name');\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function deleteItem(id) {\r\n try {\r\n kendo.ui.progress(vm.businessCyclesGrid.element, true);\r\n await businessCyclesDataService.removeBusinessCycle(id);\r\n kendo.ui.progress(vm.businessCyclesGrid.element, false);\r\n vm.businessCyclesGridDataSource.read();\r\n } catch {\r\n kendo.ui.progress(vm.businessCyclesGrid.element, false);\r\n }\r\n }\r\n\r\n async function openModal(businessCycle) {\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainBusinessCycles/businessCycleModal.html',\r\n controller: businessCycleModalController,\r\n controllerAs: 'bcmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n businessCycle: () => businessCycle || {}\r\n }\r\n });\r\n\r\n try {\r\n await openModal.result;\r\n vm.businessCyclesGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","/* maintainBusinessCycles.component.js */\r\n\r\nimport maintainBusinessCyclesController from \"./maintainBusinessCycles.controller\";\r\n\r\n/**\r\n * @desc component to maintain Business Cycles\r\n * @example \r\n */\r\n\r\nconst maintainBusinessCycles = {\r\n controller: maintainBusinessCyclesController,\r\n controllerAs: 'bcvm',\r\n templateUrl: '/App/Components/maintainBusinessCycles/maintainBusinessCycles.html'\r\n};\r\n\r\nexport default maintainBusinessCycles;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, riskRulesetService, $filter, riskRuleset, isCloning, dataService, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n vm.newRiskRulesetIsDefault = false;\r\n vm.isImport = false;\r\n vm.loadingImport = false;\r\n vm.importType = \"New\";\r\n vm.gridView = 'BusinessProcesses';\r\n vm.ineligibileBusinessProcessIds = [];\r\n\r\n vm.riskRuleset = Object.assign({}, riskRuleset);\r\n vm.riskRuleset.IsDefault = vm.riskRuleset.IsDefault !== undefined ? vm.riskRuleset.IsDefault : false;\r\n vm.riskRuleset.IsEnabled = vm.riskRuleset.IsEnabled !== undefined ? vm.riskRuleset.IsEnabled : true;\r\n vm.riskRuleset.BypassSecurityObjectValidation = vm.riskRuleset.BypassSecurityObjectValidation !== undefined ? vm.riskRuleset.BypassSecurityObjectValidation : false;\r\n vm.isCloning = isCloning;\r\n vm.downloadTemplate = downloadTemplate;\r\n\r\n\r\n vm.importChecked = importChecked;\r\n vm.getCustomRulesets = getCustomRulesets;\r\n vm.rulesetFormSubmit = rulesetFormSubmit;\r\n vm.addNewRiskRuleset = addNewRiskRuleset;\r\n vm.updateIneligibleBusinessProcessIds = updateIneligibleBusinessProcessIds;\r\n vm.hasIneligibleBusinessProcessId = hasIneligibleBusinessProcessId;\r\n vm.cancel = cancel;\r\n vm.checkDefaultEnabled = checkDefaultEnabled;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await hasSAP();\r\n if (vm.isCloning) {\r\n vm.actionTitle = 'Clone';\r\n setupCloningGrids();\r\n } else if (vm.riskRuleset.RulesetId) {\r\n vm.actionTitle = 'Edit';\r\n } else {\r\n vm.actionTitle = 'Create';\r\n }\r\n }\r\n\r\n function rulesetFormSubmit() {\r\n vm.disableSubmit = true;\r\n if (vm.isCloning) {\r\n cloneRiskRuleset();\r\n } else if (vm.riskRuleset.RulesetId) {\r\n updateRiskRuleset();\r\n } else if (vm.isImport) {\r\n importRiskRuleset(vm.files.files);\r\n } else {\r\n addNewRiskRuleset();\r\n }\r\n }\r\n\r\n // ----- CREATE RULESET -----\r\n function importChecked() {\r\n if (vm.isImport && !vm.customRiskRulesetDataSource) {\r\n getCustomRulesets();\r\n }\r\n }\r\n\r\n async function getCustomRulesets() {\r\n vm.loadingRiskRulesets = true;\r\n let response = await riskRulesetService.getRiskRulesetList();\r\n vm.loadingRiskRulesets = false;\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.customRiskRulesetDataSource = response.data.filter(ruleset => ruleset.IsCustom);\r\n }\r\n\r\n\r\n async function updateRiskRuleset() {\r\n vm.savingRiskRuleset = new createSpinner();\r\n const putBody = {\r\n \"RulesetId\": vm.riskRuleset.RulesetId,\r\n \"Name\": vm.riskRuleset.Name,\r\n \"Description\": vm.riskRuleset.Description,\r\n \"IsDefault\": vm.riskRuleset.IsDefault,\r\n \"IsEnabled\": vm.riskRuleset.IsEnabled\r\n };\r\n\r\n try {\r\n await riskRulesetService.updateRiskRuleset(vm.riskRuleset.RulesetId, putBody);\r\n await helperService.successfulSaveButton(vm.savingRiskRuleset);\r\n close();\r\n vm.disableSubmit = false;\r\n } catch (_) {\r\n vm.savingRiskRuleset.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n async function hasSAP() {\r\n let response = await dataService.getProducts();\r\n vm.hasSAP = response.data.some(product => product.Type === 'SAP');\r\n }\r\n\r\n async function downloadTemplate() {\r\n try {\r\n if (vm.hasSAP) {\r\n let response = await riskRulesetService.downloadRulesetTemplate('SAP');\r\n saveFile(response.data);\r\n } else {\r\n let response = await riskRulesetService.downloadRulesetTemplate();\r\n saveFile(response.data);\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function saveFile(file) {\r\n FileSaver.saveAs(file, 'RiskRuleset.xlsx');\r\n }\r\n\r\n async function importRiskRuleset(file) {\r\n vm.savingRiskRuleset = new createSpinner();\r\n let fd = new FormData();\r\n const fileName = file[0].name;\r\n file = file[0].file;\r\n fd.append(fileName, file);\r\n\r\n if (vm.importType === 'New') {\r\n fd.append(\"RulesetName\", vm.riskRuleset.Name);\r\n fd.append(\"RulesetDescription\", vm.riskRuleset.Description);\r\n fd.append(\"IsDefaultRuleset\", vm.riskRuleset.IsDefault);\r\n fd.append(\"BypassSecurityObjectValidation\", vm.riskRuleset.BypassSecurityObjectValidation);\r\n fd.append(\"IsEnabled\", vm.riskRuleset.IsEnabled);\r\n } else {\r\n fd.append(\"RulesetId\", vm.selectedRiskRulesetToOverwrite.RulesetId);\r\n }\r\n\r\n try {\r\n let response = await riskRulesetService.importRiskRuleset(fd);\r\n await helperService.successfulSaveButton(vm.savingRiskRuleset);\r\n close(response.data);\r\n } catch (_) {\r\n vm.savingRiskRuleset.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n async function addNewRiskRuleset() {\r\n vm.savingRiskRuleset = new createSpinner();\r\n const postBody = {\r\n \"Name\": vm.riskRuleset.Name,\r\n \"Description\": vm.riskRuleset.Description,\r\n \"IsDefault\": vm.riskRuleset.IsDefault,\r\n \"IsEnabled\": vm.riskRuleset.IsEnabled\r\n };\r\n\r\n try {\r\n let response = await riskRulesetService.addNewRiskRuleset(postBody);\r\n await helperService.successfulSaveButton(vm.savingRiskRuleset);\r\n close(response.data);\r\n vm.disableSubmit = false;\r\n } catch (_) {\r\n vm.savingRiskRuleset.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n\r\n // ----- CLONE RULESET -----\r\n function setupCloningGrids() {\r\n vm.cloneRiskRulesetRisksGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: async options => {\r\n let response = await riskRulesetService.getRisks(vm.riskRuleset.RulesetId);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n response.data.forEach(obj => {\r\n obj.isSelected = true;\r\n });\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n\r\n vm.cloneRiskRulesetBusinessProcessesGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: async options => {\r\n let response = await riskRulesetService.getBusinessProcesses(vm.riskRuleset.RulesetId);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n response.data.forEach(obj => {\r\n obj.isSelected = true;\r\n });\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n\r\n let businessProcessesGridOptions = [\r\n { template: \"\", width: 55, filterable: false },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n let risksGridOptions = [\r\n { template: \"\", width: 55, filterable: false },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.cloneRiskRulesetBusinessProcessGridOptions = helperService.setNonPageableGridOptions(businessProcessesGridOptions, 300);\r\n vm.cloneRiskRulesetBusinessProcessGridOptions.noRecords = {\r\n template: \"No Business Processes exist for this ruleset
\"\r\n };\r\n\r\n vm.cloneRiskRulesetRisksGridOptions = helperService.setNonPageableGridOptions(risksGridOptions, 300);\r\n vm.cloneRiskRulesetRisksGridOptions.noRecords = {\r\n template: \"No Risks exist for this ruleset
\"\r\n };\r\n }\r\n\r\n async function cloneRiskRuleset() {\r\n vm.disableSubmit = true;\r\n\r\n if (vm.cloneRiskRulesetRisksGridDataSource._data.length === 0) {\r\n await vm.cloneRiskRulesetRisksGridDataSource.read();\r\n }\r\n\r\n vm.selectedBusinessProcessIds = vm.cloneRiskRulesetBusinessProcessesGridDataSource._data.filter(businessProcess => businessProcess.isSelected).map(businessProcess => businessProcess.Id);\r\n vm.selectedRiskIds = vm.cloneRiskRulesetRisksGridDataSource._data.filter(risk => risk.isSelected).map(risk => risk.Id);\r\n\r\n const data = {\r\n \"Name\": vm.riskRuleset.Name,\r\n \"Description\": vm.riskRuleset.Description,\r\n \"IsDefault\": vm.riskRuleset.IsDefault,\r\n \"RiskIds\": vm.selectedRiskIds,\r\n \"BusinessProcessIds\": vm.selectedBusinessProcessIds,\r\n \"IsEnabled\": vm.riskRuleset.IsEnabled\r\n };\r\n\r\n try {\r\n await riskRulesetService.cloneRiskRuleset(data);\r\n vm.disableSubmit = false;\r\n cancel();\r\n } catch (_) {\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n function updateIneligibleBusinessProcessIds(businessProcess) {\r\n const businessProcessId = businessProcess.Id;\r\n if (businessProcess.isSelected) {\r\n const index = vm.ineligibileBusinessProcessIds.indexOf(businessProcessId);\r\n if (index > -1) {\r\n vm.ineligibileBusinessProcessIds.splice(index, 1);\r\n }\r\n } else {\r\n vm.ineligibileBusinessProcessIds.push(businessProcessId);\r\n }\r\n }\r\n\r\n function hasIneligibleBusinessProcessId(risk) {\r\n let hasIneligibleIds = false;\r\n\r\n risk.Objects.forEach(object => {\r\n if (vm.ineligibileBusinessProcessIds.includes(object.BusinessProcessId)) {\r\n hasIneligibleIds = true;\r\n }\r\n });\r\n if (hasIneligibleIds) {\r\n risk.isSelected = false;\r\n }\r\n return hasIneligibleIds;\r\n }\r\n\r\n function checkDefaultEnabled() {\r\n if (!vm.riskRuleset.IsEnabled) {\r\n vm.riskRuleset.IsDefault = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, FileSaver, riskLevelsData, businessCyclesDataService, mitigationsDataService, statusDataService, controlLibraryDataService, configurationDataService, riskRulesetService, risk, rulesetId) {\r\n\r\n const vm = this;\r\n vm.attachments = {};\r\n vm.risk = Object.assign({}, risk);\r\n\r\n // Set up form fields for create or edit\r\n if (!vm.risk.Id) {\r\n vm.risk.IsDefaultMitigated = false;\r\n vm.risk.Enabled = true;\r\n vm.risk.BusinessCycle = null;\r\n } else {\r\n vm.risk.RiskLevel = vm.risk.RiskLevel ? vm.risk.RiskLevel.Id : vm.risk.RiskLevel;\r\n vm.risk.Status = vm.risk.Status ? vm.risk.Status.ID : vm.risk.Status;\r\n vm.risk.Mitigation = vm.risk.Mitigation ? vm.risk.Mitigation.ID : vm.risk.Mitigation;\r\n vm.risk.BusinessCycle = vm.risk.BusinessCycle ? vm.risk.BusinessCycle.ID : vm.risk.BusinessCycle;\r\n }\r\n\r\n vm.riskFormSubmit = riskFormSubmit;\r\n vm.removeFile = removeFile;\r\n vm.downloadFile = downloadFile;\r\n vm.cancel = cancel;\r\n vm.clearDefaultMitigationFields = clearDefaultMitigationFields;\r\n\r\n vm.riskTypesDataSource = [\r\n {\r\n Name: 'Segregation of Duties',\r\n Id: 1\r\n },\r\n {\r\n Name: 'Sensitive Access',\r\n Id: 2\r\n }\r\n ];\r\n\r\n activate();\r\n\r\n function activate() {\r\n getStandardMitigations();\r\n getRiskLevels();\r\n getBusinessCycles();\r\n getMitigations();\r\n getStatuses();\r\n getControls();\r\n }\r\n\r\n function riskFormSubmit() {\r\n vm.savingRisk = new createSpinner();\r\n vm.disableSubmit = true;\r\n if (vm.risk.Id) {\r\n updateRisk();\r\n } else {\r\n addNewRisk();\r\n }\r\n }\r\n\r\n async function getStandardMitigations() {\r\n const response = await configurationDataService.getStandardMitigations();\r\n vm.standardMitigations = response.data;\r\n }\r\n\r\n async function getRiskLevels() {\r\n const response = await riskLevelsData.getRiskLevels();\r\n vm.riskLevelDataSource = response.data;\r\n }\r\n\r\n async function getBusinessCycles() {\r\n const response = await businessCyclesDataService.getBusinessCycles();\r\n vm.businessCycleDataSource = response.data;\r\n }\r\n\r\n async function getMitigations() {\r\n const response = await mitigationsDataService.getMitigations();\r\n vm.mitigationDataSource = response.data;\r\n }\r\n\r\n async function getStatuses() {\r\n const response = await statusDataService.getStatuses();\r\n vm.statusDataSource = response.data;\r\n\r\n vm.canCurrentUserAccess = response.data.some(data => data.CanCurrentUserAccess === true);\r\n }\r\n\r\n async function getControls() {\r\n const response = await controlLibraryDataService.getControls();\r\n vm.controlLibrary = response.data;\r\n }\r\n\r\n async function addNewRisk() {\r\n const postBody = {\r\n \"AssignedUserId\": null,\r\n \"Name\": vm.risk.Name,\r\n \"Description\": vm.risk.Description,\r\n \"IsDefaultMitigated\": vm.risk.IsDefaultMitigated,\r\n \"MitigationId\": vm.risk.Mitigation,\r\n \"MitigationNotes\": vm.risk.MitigationNotes,\r\n \"RiskLevelId\": vm.risk.RiskLevel,\r\n \"StatusId\": vm.risk.Status,\r\n \"BusinessCycle\": vm.risk.BusinessCycle,\r\n \"RiskObjects\": vm.risk.Objects,\r\n \"Policy\": vm.risk.Policy === \"\" ? null : vm.risk.Policy,\r\n 'Enabled': vm.risk.Enabled,\r\n 'RulesetId': rulesetId,\r\n 'Controls': vm.risk.Controls ? vm.risk.Controls.map(control => control.Identifier) : null,\r\n 'RiskType': vm.risk.RiskType\r\n };\r\n\r\n try {\r\n const response = await riskRulesetService.addNewRisk(postBody);\r\n if (vm.attachments.flow.files.length) {\r\n uploadNewFiles(vm.attachments.flow.files, response.data, true);\r\n } else {\r\n vm.successText = 'created';\r\n await helperService.successfulSaveButton(vm.savingRisk);\r\n vm.disableSubmit = false;\r\n close({ riskId: response.data, isNewRecord: true });\r\n }\r\n } catch (_) {\r\n vm.savingRisk.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n async function updateRisk() {\r\n\r\n const putBody = {\r\n \"Id\": vm.risk.Id,\r\n \"Name\": vm.risk.Name,\r\n \"Description\": vm.risk.Description,\r\n \"IsDefaultMitigated\": vm.risk.IsDefaultMitigated,\r\n \"MitigationId\": vm.risk.Mitigation,\r\n \"MitigationNotes\": vm.risk.MitigationNotes,\r\n \"RiskLevelId\": vm.risk.RiskLevel,\r\n \"StatusId\": vm.risk.Status,\r\n \"BusinessCycle\": vm.risk.BusinessCycle,\r\n \"Policy\": vm.risk.Policy === \"\" ? null : vm.risk.Policy,\r\n 'Enabled': vm.risk.Enabled,\r\n 'Controls': vm.risk.Controls ? vm.risk.Controls.map(control => control.Identifier) : null,\r\n 'RiskType': vm.risk.RiskType\r\n };\r\n\r\n try {\r\n await riskRulesetService.updateRisk(vm.risk.Id, putBody);\r\n if (vm.attachments.flow.files.length) {\r\n uploadNewFiles(vm.attachments.flow.files, vm.risk.Id, false);\r\n } else {\r\n vm.successText = 'updated';\r\n await helperService.successfulSaveButton(vm.savingRisk);\r\n vm.disableSubmit = false;\r\n close({ riskId: vm.risk.Id, isNewRecord: false });\r\n }\r\n } catch (_) {\r\n vm.savingRisk.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n function clearDefaultMitigationFields() {\r\n vm.risk.Mitigation = null;\r\n vm.risk.Status = null;\r\n vm.risk.MitigationNotes = null;\r\n }\r\n\r\n function close(risk) {\r\n $uibModalInstance.close(risk);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n async function removeFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n const index = vm.risk.Attachments.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.risk.Attachments.splice(index, 1);\r\n vm.fileActionPending = false;\r\n } catch (_) {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function downloadFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n let response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n vm.fileActionPending = false;\r\n } catch (_) {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function uploadNewFiles(files, riskId, isNewRecord) {\r\n let fd = new FormData();\r\n files.forEach((file, i) => {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"Risk\");\r\n fd.append(\"DataTypeId\", riskId);\r\n\r\n try {\r\n await controlLibraryDataService.addAttachments(fd);\r\n vm.successText = isNewRecord ? 'created' : 'updated';\r\n await helperService.successfulSaveButton(vm.savingRisk);\r\n vm.disableSubmit = false;\r\n close({ riskId: riskId, isNewRecord: isNewRecord });\r\n } catch (_) {\r\n vm.savingRisk.loadingValue = false;\r\n vm.disableSubmit = false;\r\n return;\r\n }\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, helperService, riskRulesetService, riskRulesetMapper, riskRuleset, risk) {\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.addBusinessProcessToSelectedGrid = addBusinessProcessToSelectedGrid;\r\n vm.risk = risk;\r\n\r\n activate();\r\n\r\n function activate() {\r\n setUpObjectsGrid();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function setUpObjectsGrid() {\r\n const availableObjectsGridColumns = [\r\n { title: \"Name\", field: \"BusinessProcessName\", filterable: customAutoCompleteFilter },\r\n { title: \"Description\", field: \"BusinessProcessDescription\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableObjectsGridOptions = helperService.setMainGridOptions(availableObjectsGridColumns, null);\r\n vm.availableObjectsGridOptions.selectable = false;\r\n\r\n vm.availableObjectsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await riskRulesetService.getBusinessProcesses(riskRuleset.RulesetId);\r\n vm.originalObjects = riskRulesetMapper.mapBusinessProcesses(response.data);\r\n vm.availableObjects = vm.originalObjects.slice();\r\n vm.showBpGrid = true;\r\n\r\n risk.Objects.forEach(function (row, i) {\r\n const Id = row.BusinessProcessId;\r\n vm.availableObjects.forEach(el => {\r\n if (Id.toString() === el.BusinessProcessId) {\r\n vm.availableObjects.remove(el);\r\n }\r\n });\r\n\r\n });\r\n vm.availableObjects = $filter('orderBy')(vm.availableObjects, 'BusinessProcessName');\r\n options.success(vm.availableObjects);\r\n }\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n async function addBusinessProcessToSelectedGrid(dataItem) {\r\n vm.processingBPAdd = true;\r\n\r\n const data = {\r\n \"RiskId\": risk.Id,\r\n \"BusinessProcessId\": dataItem.BusinessProcessId\r\n };\r\n\r\n try {\r\n const response = await riskRulesetService.addNewRiskObject(risk.Id, data);\r\n dataItem.Id = response.data;\r\n dataItem.ConditionList = [];\r\n risk.Objects.push(dataItem);\r\n vm.availableObjectsGridDataSource.read();\r\n vm.processingBPAdd = false;\r\n } catch (_) {\r\n vm.processingBPAdd = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, helperService, businessProcessDataService, selectedBusinessProcess) {\r\n\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n createObjectsGrid();\r\n }\r\n\r\n\r\n function createObjectsGrid() {\r\n const objectsDataGridColumns = [\r\n { field: \"GroupName\", title: \"Group\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObject.AltName\", title: \"Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObject.Name\", title: \"Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObject.SecurityObjectTypeName\", title: \"Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObject.ProductName\", title: \"Product\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.objectsDataGridOptions = helperService.setMainGridOptions(objectsDataGridColumns, 250);\r\n vm.objectsDataGridOptions.selectable = false;\r\n\r\n vm.objectsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await businessProcessDataService.getBusinessProcessObjects(selectedBusinessProcess.BusinessProcessId);\r\n vm.businessProcess = await response.data;\r\n vm.objects = await response.data.Objects;\r\n vm.objects = $filter('orderBy')(vm.objects, 'Group');\r\n vm.objects = $filter('orderBy')(vm.objects, 'SecurityObject.AltName');\r\n options.success(vm.objects);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n}","import createSpinner from \"../../Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, objects, ruleset, riskRulesetService, helperService) {\r\n const vm = this;\r\n\r\n vm.close = close;\r\n vm.objects = objects;\r\n vm.ruleset = ruleset;\r\n vm.deleteObject = deleteObject;\r\n vm.copyObjects = copyObjects;\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n\r\n activate();\r\n\r\n function activate() {\r\n getRiskRulesetsList();\r\n vm.objectType = vm.objects[0].RiskType ? 'risks' : 'bps';\r\n }\r\n\r\n // ----- Risk Ruleset -----\r\n async function getRiskRulesetsList() {\r\n vm.loadingRiskRulesetList = true;\r\n try {\r\n let { data: riskRulesets } = await riskRulesetService.getRiskRulesetList();\r\n const defaultRulesetId = 1;\r\n vm.riskRulesetDataSource = riskRulesets.filter(ruleset => ruleset.RulesetId !== vm.ruleset.RulesetId && ruleset.RulesetId !== defaultRulesetId);\r\n vm.loadingRiskRulesetList = false;\r\n } catch (error) {\r\n vm.loadingRiskRulesetList = false;\r\n }\r\n }\r\n\r\n function deleteObject(deletedObject) {\r\n vm.objects = vm.objects.filter(object => object.Id !== deletedObject.Id);\r\n }\r\n\r\n async function copyObjects() {\r\n vm.copyPending = new createSpinner();\r\n let data = {\r\n DestinationRulesetId: vm.destinationRuleset.RulesetId,\r\n SourceRulesetId: ruleset.RulesetId\r\n };\r\n if (vm.objectType === 'risks') {\r\n data.Risks = vm.objects.map(object => object.Id);\r\n data.IncludeBPs = vm.copyRiskBPs;\r\n }\r\n else {\r\n data.BusinessProcesses = vm.objects.map(object => {\r\n return object.BusinessProcessId ? object.BusinessProcessId : object.Id\r\n });\r\n }\r\n try {\r\n await riskRulesetService.copyObjectsToRuleset(vm.objectType, data);\r\n await helperService.successfulSaveButton(vm.copyPending);\r\n close();\r\n }\r\n catch {\r\n vm.copyPending.loadingValue = false;\r\n }\r\n }\r\n}","import riskRulesetModalController from \"./riskRulesetModal.controller\";\r\nimport swal from \"sweetalert2\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport riskModalController from \"./risksModal/riskModal.controller\";\r\nimport availableObjectsForRiskModalController from \"./Objects/availableObjectsForRiskModal.controller\";\r\nimport businessProcessObjectsModalController from \"./Objects/businessProcessObjectsModal.controller\";\r\nimport rulesetObjectCopyModalController from \"../../Shared/Components/rulesetObjectCopyModal/rulesetObjectCopyModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, FileSaver, $http, $uibModal, helperService, riskRulesetService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.updatePending = false;\r\n\r\n vm.changeRulesetRowSelectedFromRiskRulesetTable = changeRulesetRowSelectedFromRiskRulesetTable;\r\n vm.changeRiskRowSelectedFromRiskTable = changeRiskRowSelectedFromRiskTable;\r\n vm.openManageConditionsModal = openManageConditionsModal;\r\n vm.openRiskRulesetModal = openRiskRulesetModal;\r\n vm.openRulesetObjectCopyModal = openRulesetObjectCopyModal;\r\n vm.deleteRiskRuleset = deleteRiskRuleset;\r\n vm.exportRiskRuleset = exportRiskRuleset;\r\n\r\n vm.openRiskModal = openRiskModal;\r\n vm.changeRiskSelected = changeRiskSelected;\r\n vm.deleteRisk = deleteRisk;\r\n\r\n vm.openBusinessProcessObjectsModal = openBusinessProcessObjectsModal;\r\n vm.removeFromSelectedRiskObjects = removeFromSelectedRiskObjects;\r\n vm.openAvailableObjectsModal = openAvailableObjectsModal;\r\n vm.selectObject = selectObject;\r\n vm.selectAllObjects = selectAllObjects;\r\n\r\n $scope.$on('ImportRiskRuleset', (event, args) => getRiskRulesetsList());\r\n $scope.$on('CloneRiskRuleset', (event, args) => getRiskRulesetsList());\r\n\r\n vm.riskRulesetMenuOptions = [\r\n {\r\n text: 'Clone',\r\n click: function ($itemScope, $event, modelValue) {\r\n const riskRuleset = modelValue;\r\n vm.openRiskRulesetModal(riskRuleset, true);\r\n }\r\n },\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n const riskRuleset = modelValue;\r\n vm.openRiskRulesetModal(riskRuleset, false);\r\n },\r\n displayed: function (modelValue) {\r\n return true;\r\n }\r\n },\r\n {\r\n text: 'Export',\r\n click: function ($itemScope, $event, modelValue) {\r\n const riskRuleset = modelValue;\r\n vm.exportRiskRuleset(riskRuleset);\r\n }\r\n },\r\n {\r\n text: 'Set as Default',\r\n click: async function ($itemScope, $event, modelValue) {\r\n const riskRulesetId = modelValue.RulesetId;\r\n const data = {\r\n \"RulesetId\": riskRulesetId\r\n };\r\n await riskRulesetService.setDefaultRiskRuleset(riskRulesetId, data);\r\n getRiskRulesetsList();\r\n },\r\n displayed: function (modelValue) {\r\n return !modelValue.riskRuleset.IsDefault && modelValue.riskRuleset.IsEnabled;\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n const riskRuleset = modelValue;\r\n vm.deleteRiskRuleset(riskRuleset);\r\n },\r\n displayed: function (modelValue) {\r\n return modelValue.riskRuleset.IsCustom;\r\n }\r\n }\r\n ];\r\n\r\n vm.riskMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n const risk = modelValue;\r\n vm.openRiskModal(risk);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n const risk = modelValue;\r\n vm.deleteRisk(risk);\r\n }\r\n }\r\n ];\r\n\r\n vm.selectedRisks = [];\r\n vm.selectedBPs = [];\r\n\r\n activate();\r\n\r\n function activate() {\r\n getRiskRulesetsList();\r\n }\r\n\r\n // ----- Risk Ruleset -----\r\n async function getRiskRulesetsList(mostRecentRulesetId) {\r\n if (vm.riskRulesetsDataSource) { vm.riskRulesetsDataSource = null; }\r\n vm.loadingRiskRulesetList = true;\r\n try {\r\n let response = await riskRulesetService.getRiskRulesetList();\r\n if (mostRecentRulesetId) {\r\n let mostRecentRuleset = response.data.find(r => r.RulesetId === mostRecentRulesetId);\r\n response.data = response.data.filter(i => i.RulesetId !== mostRecentRuleset.RulesetId);\r\n response.data.unshift(mostRecentRuleset);\r\n vm.changeRulesetRowSelectedFromRiskRulesetTable(mostRecentRuleset);\r\n }\r\n vm.riskRulesetsDataSource = response.data;\r\n vm.loadingRiskRulesetList = false;\r\n } catch (error) {\r\n vm.loadingRiskRulesetList = false;\r\n }\r\n }\r\n\r\n function changeRulesetRowSelectedFromRiskRulesetTable(riskRuleset) {\r\n // only do something if a new ruleset is selected\r\n if (!vm.selectedRiskRuleset || vm.selectedRiskRuleset.RulesetId !== riskRuleset.RulesetId) {\r\n vm.selectedRisk = null;\r\n vm.selectedRiskRuleset = riskRuleset;\r\n vm.riskSearchBox = \"\";\r\n clearObjectSelection();\r\n changeRiskRulesetSelected(riskRuleset);\r\n }\r\n }\r\n\r\n function clearObjectSelection(showRiskSelection) {\r\n // clear selected property for bps because new data isnt being fetched\r\n if (vm.selectedBPs.length) {\r\n vm.selectedRisk.Objects.forEach(object => object.copy = false);\r\n }\r\n\r\n if (!showRiskSelection) {\r\n vm.selectedRisks = vm.selectedRisks.map(risk => {\r\n risk.copy = false;\r\n\r\n return risk;\r\n });\r\n\r\n vm.selectedRisks = [];\r\n vm.selectRisksMode = false;\r\n vm.allRisksSelected = false;\r\n }\r\n vm.selectBPsMode = false;\r\n vm.selectedBPs = [];\r\n vm.allBPsSelected = false;\r\n }\r\n\r\n function changeRiskRulesetSelected() {\r\n getRisksList(null, true, true);\r\n }\r\n\r\n async function openRiskRulesetModal(riskRuleset, isCloning) {\r\n let riskRulesetModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainRiskRuleset/riskRulesetModal.html',\r\n controller: riskRulesetModalController,\r\n controllerAs: 'rrmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n riskRuleset: () => riskRuleset || null,\r\n isCloning: () => isCloning || null\r\n }\r\n });\r\n\r\n try {\r\n let result = await riskRulesetModal.result;\r\n getRiskRulesetsList(result);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteRiskRuleset(riskRuleset) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Risk Ruleset', 'Are you sure you want to delete ' + riskRuleset.Name + '?', 'Delete'));\r\n await riskRulesetService.deleteRiskRuleset(riskRuleset.RulesetId);\r\n vm.selectedRiskRuleset = null;\r\n vm.selectedRisk = null;\r\n getRiskRulesetsList();\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function exportRiskRuleset(riskRuleset) {\r\n riskRuleset.exportUpdatePending = new createSpinner();\r\n try {\r\n let response = await $http.get(`${apiUrl}api/arm/risks/export/ruleset/${riskRuleset.RulesetId}`, { responseType: \"blob\" });\r\n FileSaver.saveAs(response.data, 'RiskRuleset.xlsx');\r\n riskRuleset.exportUpdatePending.loadingValue = false;\r\n } catch (error) {\r\n helperService.showErrorMessage(error.data);\r\n riskRuleset.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n // ----- END Risk Ruleset -----\r\n\r\n\r\n // ----- Risk -----\r\n async function getRisksList(preselect, isNewRecord, isRulesetChanged) {\r\n vm.selectedRisk = null;\r\n if (vm.risksDataSource && isNewRecord && isRulesetChanged) { vm.risksDataSource = null; }\r\n vm.loadingRiskList = true;\r\n try {\r\n let response = await riskRulesetService.getRisks(vm.selectedRiskRuleset.RulesetId);\r\n if (preselect) {\r\n response.data.forEach(function (row, i) {\r\n if (row.Id === preselect) {\r\n if (isNewRecord) {\r\n row['NewRecord'] = true;\r\n } else {\r\n row['NewRecord'] = false;\r\n }\r\n vm.selectedRisk = row;\r\n vm.changeRiskSelected();\r\n } else {\r\n row['NewRecord'] = false;\r\n }\r\n });\r\n\r\n }\r\n //Bubble New Record to top if possible\r\n response.data = $filter('orderBy')(response.data, ['-NewRecord', 'Name']);\r\n vm.risksDataSource = response.data;\r\n vm.loadingRiskList = false;\r\n } catch (error) {\r\n vm.loadingRiskList = false;\r\n }\r\n }\r\n\r\n function changeRiskRowSelectedFromRiskTable(risk) {\r\n vm.selectedRisk = risk;\r\n vm.searchBoxSelectedObjects = \"\";\r\n vm.changeRiskSelected();\r\n }\r\n\r\n function changeRiskSelected() {\r\n if (vm.selectedRisk) {\r\n clearObjectSelection(true);\r\n vm.selectedRisk.Objects.forEach(function (row, i) {\r\n $http.get(`${apiUrl}api/arm/defaultmitigationconditions/riskobjectId/${row.Id}`).then(function (response) {\r\n row.ConditionList = response.data;\r\n });\r\n });\r\n }\r\n }\r\n\r\n async function openRiskModal(risk) {\r\n let riskModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainRiskRuleset/risksModal/riskModal.html',\r\n controller: riskModalController,\r\n controllerAs: 'rmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n risk: () => risk || null,\r\n rulesetId: () => vm.selectedRiskRuleset.RulesetId\r\n }\r\n });\r\n\r\n try {\r\n const result = await riskModal.result;\r\n getRisksList(result.riskId, result.isNewRecord, result.isRulesetChanged);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function openRulesetObjectCopyModal(objects) {\r\n let objectCopyModal = $uibModal.open({\r\n templateUrl: '/App/Shared/Components/rulesetObjectCopyModal/rulesetObjectCopyModal.html',\r\n controller: rulesetObjectCopyModalController,\r\n controllerAs: 'rocmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n objects: () => objects,\r\n ruleset: () => vm.selectedRiskRuleset\r\n }\r\n });\r\n try {\r\n await objectCopyModal.result;\r\n clearObjectSelection();\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteRisk(risk) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Risk', 'Are you sure you want to delete ' + risk.Name + '?', 'Delete'));\r\n try {\r\n vm.updatePending = true; \r\n await $http.delete(`${apiUrl}api/arm/risks/${risk.Id}`);\r\n vm.selectedRisk = null;\r\n getRisksList(null, false, false);\r\n vm.updatePending = false;\r\n } catch (error) {\r\n helperService.showErrorMessage(error.data);\r\n vm.updatePending = false;\r\n }\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n // ----- END Risk -----\r\n\r\n\r\n // ----- Objects -----\r\n async function openManageConditionsModal(object) {\r\n const manageConditionsModal = $uibModal.open({\r\n component: 'manageConditions',\r\n backdrop: 'static',\r\n size: 'xl',\r\n resolve: {\r\n object: () => object\r\n }\r\n });\r\n\r\n try {\r\n await manageConditionsModal.result;\r\n getRisksList(vm.selectedRisk.Id, false, false);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function removeFromSelectedRiskObjects(businessProcess) {\r\n try {\r\n await swal(helperService.areYouSureParamsWithHTML('Remove Object', `Are you sure you want to remove ${businessProcess.BusinessProcessName} from ${vm.selectedRisk.Name}?
This will also remove any associated conditions.
`, 'Remove'));\r\n await $http.delete(`${apiUrl}api/arm/risks/${vm.selectedRisk.Id}/objects/${businessProcess.Id}`);\r\n getRisksList(vm.selectedRisk.Id, false, false);\r\n } catch (_) {\r\n return;\r\n }\r\n\r\n\r\n }\r\n\r\n async function openAvailableObjectsModal() {\r\n let availableObjectsModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainRiskRuleset/objects/availableObjectsForRiskModal.html',\r\n controller: availableObjectsForRiskModalController,\r\n controllerAs: 'aocvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n riskRuleset: () => vm.selectedRiskRuleset,\r\n risk: () => vm.selectedRisk\r\n }\r\n });\r\n\r\n try {\r\n await availableObjectsModal.result;\r\n getRisksList(vm.selectedRisk.Id, false, false);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n function openBusinessProcessObjectsModal(businessProcess) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/maintainRiskRuleset/objects/businessProcessObjectsModal.html',\r\n controller: businessProcessObjectsModalController,\r\n controllerAs: 'bpovm',\r\n backdrop: 'static',\r\n resolve: {\r\n selectedBusinessProcess: () => businessProcess\r\n },\r\n size: 'lg'\r\n });\r\n }\r\n\r\n function selectObject(object, selectedObjects) {\r\n\r\n if (object.copy) {\r\n selectedObjects.push(object);\r\n }\r\n else {\r\n selectedObjects.splice(selectedObjects.indexOf(object), 1);\r\n }\r\n vm.allRisksSelected = vm.risksDataSource.every(object => object.copy);\r\n vm.allBPsSelected = vm.selectedRisk?.Objects.every(object => object.copy);\r\n }\r\n\r\n function selectAllObjects(objectType) {\r\n if (objectType === 'risk') {\r\n vm.risksDataSource.forEach(risk => risk.copy = vm.allRisksSelected);\r\n vm.selectedRisks = vm.risksDataSource.filter(object => object.copy);\r\n }\r\n else {\r\n vm.selectedRisk.Objects.forEach(object => object.copy = vm.allBPsSelected);\r\n vm.selectedBPs = vm.selectedRisk.Objects.filter(object => object.copy);\r\n }\r\n }\r\n // ----- END Objects -----\r\n\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, mitigationsDataService, mitigation) {\r\n const vm = this;\r\n\r\n vm.dismiss = dismiss;\r\n vm.saveMitigation = saveMitigation;\r\n\r\n function activate() {\r\n vm.shouldBeOpen = true;\r\n\r\n if (mitigation.ID) {\r\n vm.mitigation = Object.assign({}, mitigation.toJSON());\r\n }\r\n }\r\n\r\n activate();\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n //Save Mitigation\r\n function saveMitigation() {\r\n vm.saving = new createSpinner();\r\n if (vm.mitigation.ID) {\r\n modifyMitigation(vm.mitigation.ID, vm.mitigation);\r\n } else {\r\n addMitigation(vm.mitigation);\r\n }\r\n }\r\n\r\n async function modifyMitigation(mitigationId, mitigation) {\r\n try {\r\n await mitigationsDataService.modifyMitigation(mitigationId, mitigation);\r\n await helperService.successfulSaveButton(vm.saving);\r\n close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n async function addMitigation(mitigation) {\r\n mitigation.ID = '';\r\n try {\r\n await mitigationsDataService.addMitigation(mitigation);\r\n await helperService.successfulSaveButton(vm.saving);\r\n close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport mitigationModalController from \"./mitigationModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, helperService, mitigationsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.shouldBeOpen = true;\r\n\r\n vm.deleteItem = deleteItem;\r\n vm.openModal = openModal;\r\n\r\n function activate() {\r\n const mitigationsGridColumns =\r\n [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 }\r\n\r\n ];\r\n\r\n vm.mitigationsGridOptions = helperService.setMainGridOptions(mitigationsGridColumns, 600);\r\n vm.mitigationsGridOptions.selectable = false;\r\n\r\n vm.mitigationsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let { data } = await mitigationsDataService.getMitigations();\r\n data = $filter('orderBy')(data, 'Name');\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n activate();\r\n\r\n async function deleteItem(id) {\r\n kendo.ui.progress(vm.mitigationsGrid.element, true);\r\n\r\n try {\r\n await mitigationsDataService.removeMitigation(id);\r\n kendo.ui.progress(vm.mitigationsGrid.element, false);\r\n vm.mitigationsGridDataSource.read(); \r\n } catch {\r\n kendo.ui.progress(vm.mitigationsGrid.element, false);\r\n }\r\n }\r\n\r\n async function openModal(mitigation) {\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainMitigations/mitigationModal.html',\r\n controller: mitigationModalController,\r\n controllerAs: 'mmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n mitigation: () => mitigation || {}\r\n }\r\n });\r\n\r\n try {\r\n await openModal.result;\r\n vm.mitigationsGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}","/* maintainMitigations.component.js */\r\n\r\nimport maintainMitigationsController from \"./maintainMitigations.controller\";\r\n\r\n/**\r\n * @desc component to display Maintain Mitigations\r\n * @example \r\n */\r\n\r\nconst maintainMitigations = {\r\n controller: maintainMitigationsController,\r\n controllerAs: 'mvm',\r\n templateUrl: '/App/Components/maintainMitigations/maintainMitigations.html'\r\n};\r\n\r\nexport default maintainMitigations;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, statusDataService, status) {\r\n\r\n const vm = this;\r\n\r\n vm.dismiss = dismiss;\r\n vm.saveStatus = saveStatus;\r\n\r\n function activate() {\r\n vm.shouldBeOpen = true;\r\n\r\n if (status.ID) {\r\n vm.status = Object.assign({}, status.toJSON());\r\n }\r\n }\r\n\r\n activate();\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n //Save status\r\n function saveStatus() {\r\n vm.saving = new createSpinner();\r\n if (vm.status.ID) {\r\n modifyStatus(vm.status.ID, vm.status);\r\n } else {\r\n addStatus(vm.status);\r\n }\r\n }\r\n\r\n async function modifyStatus(statusId, status) {\r\n try {\r\n await statusDataService.modifyStatus(statusId, status);\r\n await helperService.successfulSaveButton(vm.saving);\r\n close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n async function addStatus(status) {\r\n try {\r\n status.ID = '';\r\n await statusDataService.addStatus(status);\r\n await helperService.successfulSaveButton(vm.saving);\r\n close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport statusModalController from \"./statusModal.controller\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, helperService, statusDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.shouldBeOpen = true;\r\n\r\n vm.deleteItem = deleteItem;\r\n vm.openModal = openModal;\r\n\r\n function activate() {\r\n const statusGridColumns =\r\n [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 }\r\n ];\r\n vm.statusGridOptions = helperService.setMainGridOptions(statusGridColumns, 600);\r\n vm.statusGridOptions.selectable = false;\r\n\r\n vm.statusGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let { data } = await statusDataService.getStatuses();\r\n data = $filter('filter')(data, { CanCurrentUserAccess: true });\r\n data = $filter('orderBy')(data, 'Name');\r\n options.success(data);\r\n } catch {\r\n return;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n activate();\r\n\r\n async function deleteItem(id) {\r\n try {\r\n await statusDataService.removeStatus(id)\r\n vm.statusGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openModal(status) {\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainStatuses/statusModal.html',\r\n controller: statusModalController,\r\n controllerAs: 'smvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n status: () => status || {}\r\n }\r\n });\r\n\r\n try {\r\n await openModal.result;\r\n vm.statusGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}","/* maintainStatuses.component.js */\r\n\r\nimport maintainStatusesController from \"./maintainStatuses.controller\";\r\n\r\n/**\r\n * @desc component to display Maintain Statuses\r\n * @example \r\n */\r\n\r\nconst maintainStatuses = {\r\n controller: maintainStatusesController,\r\n controllerAs: 'msvm',\r\n templateUrl: '/App/Components/maintainStatuses/maintainStatuses.html'\r\n};\r\n\r\nexport default maintainStatuses;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, objectIdDataService, $http, helperService, dataService) {\r\n\r\n $scope.shouldBeOpen = true;\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n\r\n $scope.vm.archive = {\r\n id: '',\r\n name: ''\r\n };\r\n\r\n $scope.rowArchive = {\r\n id: '',\r\n name: ''\r\n };\r\n\r\n var columnsFromVM = [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"\", \"title\": \"Restore\", width: 100 },\r\n { template: \"\", \"title\": \"Apply\", width: 100 },\r\n { template: \"\", \"title\": \"Delete\", width: 100 }\r\n ];\r\n\r\n //Archive Grid\r\n $scope.mainGridOptions = helperService.setMainGridOptions(columnsFromVM, 600);\r\n $scope.mainGridOptions.selectable = false;\r\n\r\n\r\n\r\n var gridDataSourceDefault = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/assure/archive').then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.vm.gridDataSource = gridDataSourceDefault;\r\n\r\n //Update Archive\r\n $scope.restoreArchive = function (dataItem) {\r\n $scope.restoreBeingApplied = dataItem.ID;\r\n\r\n $scope.restoreArchiveInProgress = true;\r\n var id = dataItem.ID;\r\n var data = { ID: id };\r\n\r\n $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/assure/archive/' + id + '/restore',\r\n data: data\r\n\r\n }).then(function successCallback(response) {\r\n $scope.restoreArchiveInProgress = false;\r\n\r\n helperService.showConfirmationMessage(\"Success\", \"Archive Restored\");\r\n resetNew();\r\n }, function errorCallback(response) {\r\n $scope.restoreArchiveInProgress = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n };\r\n\r\n //Apply Archive\r\n function applyArchive(id, reapplyAutoMitigations, reapplyDefaultMitigations) {\r\n $scope.archiveBeingApplied = id;\r\n $scope.applyArchiveInProgress = true;\r\n var data = { ID: id, ReapplyAutoMitigations: reapplyAutoMitigations, ReapplyDefaultMitigations: reapplyDefaultMitigations };\r\n\r\n $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/assure/archive/' + id + '/apply',\r\n data: data\r\n\r\n }).then(function successCallback(response) {\r\n $scope.applyArchiveInProgress = false;\r\n helperService.showConfirmationMessage(\"Success\", \"Archive Applied\");\r\n resetNew();\r\n }, function errorCallback(response) {\r\n $scope.applyArchiveInProgress = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n }\r\n\r\n $scope.reapplyAutoMitigationsConfirm = async function (dataItem) {\r\n let productTypes = await dataService.getProductTypes()\r\n let showReApplyAutoMitigations = productTypes.data.some(p => p.Type === 'OR' || p.Type === 'PS' || p.Type === 'ORFC' || p.Type === 'SAP');\r\n\r\n let applyModal = $uibModal.open({\r\n templateUrl: '/App/Components/ManageArchives/applyArchiveModal.html',\r\n controller: applyArchiveModalController,\r\n controllerAs: 'aamvm',\r\n backdrop: 'static',\r\n resolve: {\r\n showReApplyAutoMitigations: () => showReApplyAutoMitigations\r\n }\r\n });\r\n\r\n try {\r\n let response = await applyModal.result;\r\n applyArchive(dataItem.ID, response.reapplyAutoMitigations, response.reapplyDefaultMitigations);\r\n } catch {\r\n return;\r\n }\r\n };\r\n\r\n //Delete Archive\r\n $scope.deleteArchive = function (dataItem) {\r\n\r\n var id = dataItem;\r\n\r\n $http({\r\n method: 'DELETE',\r\n url: apiUrl + 'api/assure/archive/' + id\r\n }).then(function successCallback(response) {\r\n\r\n //Remove item from datasource\r\n var datasourcedata = $scope.vm.gridDataSource.data();\r\n\r\n for (var i = 0; i < datasourcedata.length; i++) {\r\n if (datasourcedata[i].ID === id) {\r\n $scope.vm.gridDataSource.remove(datasourcedata[i]);\r\n break;\r\n }\r\n }\r\n\r\n resetNew();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openNewArchiveModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/NewArchiveModal.html',\r\n controller: newArchiveModalController,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n };\r\n\r\n function resetNew() {\r\n $scope.vm.archive.name = '';\r\n }\r\n\r\n}\r\n\r\nfunction newArchiveModalController($scope, $uibModalInstance, $http, $route, helperService) {\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n //Save Archive\r\n $scope.saveArchive = function (e, archiveName) {\r\n\r\n var isValid = true;\r\n if (archiveName === \"\") {\r\n isValid = false;\r\n }\r\n if (isValid) {\r\n var data = { Name: archiveName };\r\n\r\n $scope.pleaseWait = new createSpinner();\r\n\r\n $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/assure/archive/archive',\r\n data: data\r\n\r\n }).then(async function successCallback(response) {\r\n $scope.killModal = true;\r\n\r\n await helperService.successfulSaveButton($scope.pleaseWait).then(function (result) {\r\n //ID is not being returned from API so reload is required\r\n $route.reload();\r\n $scope.cancel();\r\n });\r\n\r\n }, function errorCallback(response) {\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n };\r\n\r\n}\r\n\r\nfunction applyArchiveModalController($scope, $uibModalInstance, showReApplyAutoMitigations) {\r\n\r\n $scope.showReApplyAutoMitigations = showReApplyAutoMitigations;\r\n\r\n $scope.applyArchiveOptions = {\r\n reapplyAutoMitigations: true,\r\n reapplyDefaultMitigations: true\r\n }\r\n\r\n $scope.dismiss = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n //Save Archive\r\n $scope.applyArchive = function () {\r\n $uibModalInstance.close($scope.applyArchiveOptions);\r\n };\r\n\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (dataService, $http, helperService) {\r\n const vm = this;\r\n\r\n vm.startNewAudit = startNewAudit;\r\n\r\n vm.show = false;\r\n vm.showReApplyAutoMitigations = false;\r\n\r\n vm.audit = {\r\n Name: '',\r\n ReapplyAutoMitigations: true,\r\n ReapplyDefaultMitigations: true\r\n };\r\n\r\n activate();\r\n\r\n function activate() {\r\n showReapply();\r\n }\r\n\r\n function clear() {\r\n vm.audit.Name = '';\r\n vm.audit.ReapplyAutoMitigations = true;\r\n vm.audit.ReapplyDefaultMitigations = true;\r\n }\r\n\r\n //Check if we should show Reapply Auto Mitigations toggle\r\n async function showReapply() {\r\n let productTypes = await dataService.getProductTypes();\r\n\r\n vm.showReApplyAutoMitigations = productTypes.data.some(p => p.Type === 'OR' || p.Type === 'PS' || p.Type === 'ORFC');\r\n }\r\n\r\n\r\n\r\n //Start New Audit\r\n async function startNewAudit() {\r\n vm.updatePending = new createSpinner();\r\n\r\n try {\r\n await $http.put(`${apiUrl}api/assure/archive/startnewaudit`, vm.audit);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n clear();\r\n } catch (error) {\r\n vm.updatePending.loadingValue = false;\r\n helperService.showErrorMessage(error.data);\r\n }\r\n }\r\n\r\n}\r\n","import startNewAuditController from \"./startNewAudit.controller\";\r\n\r\n/* startNewAudit.component.js */\r\n\r\n/**\r\n * @desc component for start new audit\r\n * @example \r\n */\r\n\r\nconst startNewAudit = {\r\n controller: startNewAuditController,\r\n controllerAs: 'snavm',\r\n templateUrl: '/App/Components/startNewAudit/startNewAudit.tmpl.html'\r\n};\r\n\r\nexport default startNewAudit;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (autoMitigationsDataService, product, $uibModalInstance, AutoMitigationDataService, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.product = product;\r\n\r\n vm.shouldBeOpen = true;\r\n vm.cancel = cancel;\r\n vm.importRuleset = importRuleset;\r\n vm.dismiss = dismiss;\r\n\r\n function importRuleset(file) {\r\n vm.importInProgress = new createSpinner();\r\n\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n\r\n if (vm.product) {\r\n importDynamicProductAutoMitigationRuleset(vm.product, fd);\r\n } else {\r\n importOracleAutoMitigationRuleset(fd);\r\n }\r\n }\r\n\r\n async function importDynamicProductAutoMitigationRuleset(product, file) {\r\n try {\r\n await autoMitigationsDataService.importAutoMitigationRuleset(product, file);\r\n await helperService.successfulSaveButton(vm.importInProgress);\r\n cancel();\r\n } catch {\r\n vm.importInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n async function importOracleAutoMitigationRuleset(file) {\r\n try {\r\n await AutoMitigationDataService.importAutoMitigationRuleset(file);\r\n await helperService.successfulSaveButton(vm.importInProgress);\r\n cancel();\r\n } catch {\r\n vm.importInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../Shared/kendo.module\";\r\nimport importAutoMitigationRulesetModalController from \"../../AutoMitigations/ImportAutoMitigationRulesetModal/importAutoMitigationRulesetModal.controller\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, objectIdDataService, dialogs, $uibModal, $http, helperService, AutoMitigationDataService, FileSaver) {\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n $scope.$on('ImportExclusions', (event, args) => $scope.vm.systemGridDataSource.read());\r\n $scope.$on('ImportExclusions', (event, args) => $scope.vm.objectGridDataSource.read());\r\n\r\n var vm = $scope.vm = {};\r\n\r\n $scope.openImportAutoMitigationRulesetModal = function () {\r\n $uibModal.open({\r\n templateUrl: 'App/Components/AutoMitigations/ImportAutoMitigationRulesetModal/importAutoMitigationRulesetModal.tmpl.html',\r\n controller: importAutoMitigationRulesetModalController,\r\n controllerAs: 'iamrmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n product: () => null\r\n }\r\n });\r\n };\r\n\r\n $scope.exportAutoMitigationRuleset = function () {\r\n vm.rulesetExportPending = true;\r\n\r\n AutoMitigationDataService.exportAutoMitigationRuleset().then(response => {\r\n FileSaver.saveAs(response.data, 'AutoMitigationRuleset.xlsx');\r\n vm.rulesetExportPending = false;\r\n }).catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n vm.rulesetExportPending = false;\r\n });\r\n };\r\n\r\n $scope.applyAutoMitigationConfirmation = function () {\r\n swal(helperService.areYouSureParams('Apply Auto Mitigation', 'This process will apply the defined Auto Mitigation Rules to the user risks that have not already been mitigated.', 'Apply')).then(function () {\r\n $http.put(apiUrl + 'api/arm/usermitigations/product/OR/applyautomitigations')\r\n .then(function (response) {\r\n return;\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n //--System Auto Mitigation\r\n\r\n var systemColumnsFromVM =\r\n [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", filterable: customAutoCompleteFilter },\r\n { field: \"Condition\", title: \"Condition\", filterable: customAutoCompleteFilter },\r\n { field: \"DisplayValue\", title: \"Display Value\", filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"Enabled\", width: 125, filterable: customBooleanFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 }\r\n\r\n ];\r\n\r\n $scope.vm.systemExclusionGridOptions = helperService.setMainGridOptions(systemColumnsFromVM, 275);\r\n\r\n $scope.vm.systemGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Enabled: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/assure/or/systemexclusions')\r\n .then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n //Update AutoMitigation\r\n $scope.editSystemAutoMitigation = async function (dataItem) {\r\n $scope.vm.isCreate = false;\r\n $scope.vm.ModuleType = 'Edit';\r\n let { data } = await $http.get(`${apiUrl}api/assure/or/menus`);\r\n $scope.vm.autoMitigation = {\r\n Attachments: dataItem.Attachments,\r\n Id: 0,\r\n name: '',\r\n description: '',\r\n selectedType: { id: 0, name: '' },\r\n selectedCondition: { Id: 0, Name: '' },\r\n selectedValue: { Id: 0, Name: '' },\r\n value: '',\r\n excludedMenuItems: dataItem.ExcludedMenuItems,\r\n availableMenuItems: data\r\n };\r\n\r\n $scope.vm.autoMitigation.Id = dataItem.Id;\r\n\r\n $scope.vm.autoMitigation.name = dataItem.Name;\r\n $scope.vm.autoMitigation.description = dataItem.Description;\r\n\r\n $scope.vm.autoMitigation.selectedType.id = dataItem.TypeId;\r\n $scope.vm.autoMitigation.selectedType.name = dataItem.Type;\r\n\r\n $scope.vm.autoMitigation.selectedCondition.id = dataItem.ConditionId;\r\n $scope.vm.autoMitigation.selectedCondition.name = dataItem.Condition;\r\n\r\n if (dataItem.TechName !== '') {\r\n $scope.vm.autoMitigation.selectedValue.Id = dataItem.Value;\r\n $scope.vm.autoMitigation.selectedValue.Name = dataItem.TechName;\r\n $scope.vm.showValueDropdown = true;\r\n }\r\n else {\r\n $scope.vm.autoMitigation.Value = dataItem.Value;\r\n $scope.vm.showValueDropdown = false;\r\n }\r\n\r\n $scope.vm.autoMitigation.Enabled = dataItem.Enabled;\r\n\r\n var dlg = dialogs.create('/App/Components/Oracle/ApplyAutoMitigation/NewSystemAutoMitigationModal.html', newSystemAutoMitigationModalController, $scope.vm, { size: 'lg' });\r\n };\r\n\r\n //Delete AutoMitigation\r\n $scope.deleteSystemAutoMitigation = function (dataItem) {\r\n\r\n var id = dataItem.Id;\r\n\r\n $http({\r\n method: 'DELETE',\r\n url: apiUrl + 'api/assure/or/systemexclusions/' + id\r\n }).then(function successCallback(response) {\r\n\r\n //Remove item from datasource\r\n var datasourcedata = $scope.vm.systemGridDataSource.data();\r\n\r\n for (var i = 0; i < datasourcedata.length; i++) {\r\n if (datasourcedata[i].Id === id) {\r\n $scope.vm.systemGridDataSource.remove(datasourcedata[i]);\r\n break;\r\n }\r\n }\r\n\r\n resetNew();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openNewSystemAutoMitigationModal = async function () {\r\n $scope.vm.isCreate = true;\r\n $scope.vm.ModuleType = 'Create';\r\n let { data } = await $http.get(`${apiUrl}api/assure/or/menus`);\r\n $scope.vm.availableMenuItems = data;\r\n $scope.vm.autoMitigation = {\r\n Id: 0,\r\n name: '',\r\n description: '',\r\n selectedType: { id: 0, name: '' },\r\n selectedCondition: { Id: 0, Name: '' },\r\n selectedValue: { Id: 0, Name: '' },\r\n value: '',\r\n Enabled: true,\r\n availableMenuItems: $scope.vm.availableMenuItems\r\n };\r\n\r\n $scope.vm.autoMitigation.Id = null;\r\n\r\n $scope.vm.autoMitigation.selectedType = null;\r\n\r\n $scope.vm.autoMitigation.selectedCondition = null;\r\n\r\n $scope.vm.autoMitigation.selectedValue = null;\r\n\r\n\r\n var dlg = dialogs.create('/App/Components/Oracle/ApplyAutoMitigation/NewSystemAutoMitigationModal.html', newSystemAutoMitigationModalController, $scope.vm, { size: 'lg' });\r\n\r\n };\r\n\r\n function resetNew() {\r\n $scope.autoMitigation.name = '';\r\n }\r\n\r\n //--End System Auto Mitigation\r\n\r\n //--Object Auto Mitigation\r\n\r\n var objectColumnsFromVM =\r\n [\r\n { field: \"ExcludeObjectType\", title: \"Excluded Object Type\", filterable: customAutoCompleteFilter },\r\n { field: \"ExcludeObjectName\", title: \"Excluded Object\", filterable: customAutoCompleteFilter },\r\n { field: \"FromObjectType\", title: \"From Object Type\", filterable: customAutoCompleteFilter },\r\n { field: \"FromObjectName\", title: \"From Object\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"Enabled\", width: 125, filterable: customBooleanFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 }\r\n\r\n ];\r\n\r\n $scope.vm.objectExclusionGridOptions = helperService.setMainGridOptions(objectColumnsFromVM, 275);\r\n\r\n $scope.vm.objectGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Enabled: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/assure/or/objectexclusions')\r\n .then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n\r\n //Update AutoMitigation\r\n $scope.editObjectAutoMitigation = function (dataItem) {\r\n $scope.vm.isCreate = false;\r\n $scope.vm.ModuleType = 'Edit';\r\n\r\n $scope.vm.autoMitigation = {\r\n Attachments: dataItem.Attachments,\r\n Id: 0,\r\n description: '',\r\n selectedExcludeType: { id: 0, name: '' },\r\n selectedFromType: { id: 0, name: '' },\r\n excludeObject: { Id: 0, Name: '' },\r\n fromObject: { Id: 0, Name: '' }\r\n };\r\n\r\n $scope.vm.autoMitigation.Id = dataItem.Id;\r\n\r\n $scope.vm.autoMitigation.selectedExcludeType.id = dataItem.ExcludeObjectTypeId;\r\n $scope.vm.autoMitigation.selectedExcludeType.name = dataItem.ExcludeObjectType;\r\n\r\n $scope.vm.autoMitigation.selectedFromType.id = dataItem.FromObjectTypeId;\r\n $scope.vm.autoMitigation.selectedFromType.name = dataItem.FromObjectType;\r\n\r\n $scope.vm.autoMitigation.excludeObject.Id = dataItem.ExcludeObjectId;\r\n $scope.vm.autoMitigation.excludeObject.Name = dataItem.ExcludeObjectName;\r\n\r\n\r\n $scope.vm.autoMitigation.fromObject.Id = dataItem.FromObjectId;\r\n $scope.vm.autoMitigation.fromObject.Name = dataItem.FromObjectName;\r\n\r\n $scope.vm.autoMitigation.description = dataItem.Description;\r\n $scope.vm.autoMitigation.Enabled = dataItem.Enabled;\r\n\r\n var dlg = dialogs.create('/App/Components/Oracle/ApplyAutoMitigation/NewObjectAutoMitigationModal.html', newObjectAutoMitigationModalController, $scope.vm);\r\n\r\n };\r\n\r\n //Delete AutoMitigation\r\n $scope.deleteObjectAutoMitigation = function (dataItem) {\r\n\r\n var id = dataItem.Id;\r\n\r\n $http({\r\n method: 'DELETE',\r\n url: apiUrl + 'api/assure/or/objectexclusions/' + id\r\n }).then(function successCallback(response) {\r\n\r\n //Remove item from datasource\r\n var datasourcedata = $scope.vm.objectGridDataSource.data();\r\n\r\n for (var i = 0; i < datasourcedata.length; i++) {\r\n if (datasourcedata[i].Id === id) {\r\n $scope.vm.objectGridDataSource.remove(datasourcedata[i]);\r\n break;\r\n }\r\n }\r\n\r\n resetNew();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openNewObjectAutoMitigationModal = function () {\r\n $scope.vm.isCreate = true;\r\n $scope.vm.ModuleType = 'Create';\r\n\r\n $scope.vm.autoMitigation = {\r\n Id: 0,\r\n Description: '',\r\n selectedExcludeType: { id: 0, name: '' },\r\n selectedFromType: { id: 0, name: '' },\r\n excludeObject: { Id: 0, Name: '' },\r\n fromObject: { Id: 0, Name: '' },\r\n Enabled: true\r\n };\r\n\r\n $scope.vm.autoMitigation.Id = null;\r\n\r\n $scope.vm.autoMitigation.selectedExcludeType = null;\r\n\r\n $scope.vm.autoMitigation.selectedFromType = null;\r\n\r\n $scope.vm.autoMitigation.excludeObject = null;\r\n\r\n $scope.vm.autoMitigation.fromObject = null;\r\n\r\n var dlg = dialogs.create('/App/Components/Oracle/ApplyAutoMitigation/NewObjectAutoMitigationModal.html', newObjectAutoMitigationModalController, $scope.vm);\r\n\r\n };\r\n\r\n function resetNew() {\r\n if ($scope.autoMitigation) {\r\n $scope.autoMitigation.name = '';\r\n }\r\n }\r\n //--End Object Auto Mitigation\r\n\r\n}\r\n\r\n/*@ngInject*/ function newObjectAutoMitigationModalController($scope, $uibModalInstance, $filter, data, $http, $route, helperService, FileSaver) {\r\n\r\n var vm = $scope.vm = data;\r\n\r\n $scope.removeFile = removeFile;\r\n $scope.downloadFile = downloadFile;\r\n\r\n if (!$scope.vm.isCreate) {\r\n if ($scope.vm.autoMitigation.Attachments.length > 0) {\r\n $scope.existingFilesDataSource = [];\r\n $scope.vm.autoMitigation.Attachments.forEach(attachment => $scope.existingFilesDataSource.push(attachment));\r\n }\r\n }\r\n\r\n $scope.attachments = {};\r\n\r\n $scope.init = function () {\r\n if ($scope.vm.autoMitigation) {\r\n $scope.vm.excludeTypeDropdownChange();\r\n $scope.vm.fromTypeDropdownChange();\r\n }\r\n };\r\n\r\n $scope.vm.excludeDropdownOptions = {\r\n dataSource: [\r\n { id: 1, name: \"Function\" },\r\n { id: 2, name: \"Menu\" },\r\n { id: 4, name: 'Concurrent Program' }\r\n ],\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n optionLabel: \"--Select an item--\"\r\n };\r\n\r\n $scope.vm.fromDropdownOptions = {\r\n dataSource: $scope.vm.fromDropdownDataSource,\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n optionLabel: \"--Select an item--\"\r\n };\r\n\r\n $scope.vm.excludeObjectDropdownOptions = {\r\n template: '{{dataItem.AltName}} | {{dataItem.Name}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.ProductId}}',\r\n filter: \"contains\",\r\n autoBind: false,\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325\r\n };\r\n\r\n $scope.vm.fromObjectDropdownOptions = {\r\n template: '{{dataItem.AltName}} | {{dataItem.Name}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.ProductId}}',\r\n filter: \"contains\",\r\n autoBind: false,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325\r\n };\r\n\r\n $scope.vm.fromDropdownDataSource = new kendo.data.DataSource({\r\n data: [{ id: 0, name: \"-- Select Exclude Type --\" }]\r\n });\r\n\r\n vm.fromFunctionDropdownDataSource = new kendo.data.DataSource({\r\n data: [{ id: 2, name: \"Menu\" },\r\n { id: 3, name: \"Responsibility\" }]\r\n });\r\n\r\n vm.fromMenuDropdownDataSource = new kendo.data.DataSource({\r\n data: [{ id: 2, name: \"Menu\" },\r\n { id: 3, name: \"Responsibility\" }]\r\n });\r\n\r\n vm.fromFunctionDropdownOptions = {\r\n dataSource: vm.fromFunctionDropdownDataSource,\r\n dataTextField: \"name\",\r\n dataValueField: \"id\"\r\n };\r\n\r\n vm.fromMenuDropdownOptions = {\r\n dataSource: vm.fromMenuDropdownDataSource,\r\n dataTextField: \"name\",\r\n dataValueField: \"id\"\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n $route.reload();\r\n }; // end done\r\n\r\n //Save Auto Mitigation\r\n $scope.saveAutoMitigation = function (e, enabled, description, excludeObjectType, excludeObject, fromObjectType, fromObject) {\r\n\r\n $scope.savingAutoMitigation = new createSpinner();\r\n\r\n let fromObjectID;\r\n let fromObjectRespApp = null;\r\n let fromName;\r\n\r\n if (fromObject.Id) {\r\n fromObjectID = fromObject.Id;\r\n }\r\n\r\n if (fromObject.ID) {\r\n fromObjectID = fromObject.ID;\r\n }\r\n\r\n if (fromObject.Name) {\r\n fromName = fromObject.Name;\r\n }\r\n\r\n if (fromObjectType.name === 'Responsibility') {\r\n fromObjectRespApp = fromObject.ApplicationId;\r\n }\r\n\r\n var data = {\r\n Enabled: $scope.vm.autoMitigation.Enabled,\r\n Description: description,\r\n ExcludeObjectID: excludeObject.Id,\r\n ExcludeObjectTechName: excludeObject.Name,\r\n ExcludeObjectType: excludeObjectType.id,\r\n FromObjectID: fromObjectID,\r\n FromObjectTechName: fromName,\r\n FromObjectRespApp: fromObjectRespApp,\r\n FromObjectType: fromObjectType.id\r\n };\r\n\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/assure/or/objectexclusions',\r\n data: data\r\n\r\n }).then(async function successCallback(response) {\r\n await helperService.successfulSaveButton($scope.savingAutoMitigation);\r\n if ($scope.attachments.flow.files.length) {\r\n uploadNewFiles($scope.attachments.flow.files, response.data);\r\n data.ID = response.data;\r\n } else {\r\n data.id = response.data;\r\n $route.reload();\r\n $scope.cancel();\r\n }\r\n\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n $scope.savingAutoMitigation.loadingValue = false;\r\n });\r\n\r\n };\r\n\r\n //Save Auto Mitigation\r\n $scope.updateAutoMitigation = function (e, enabled, description, id) {\r\n\r\n $scope.savingAutoMitigation = new createSpinner();\r\n\r\n var data = {\r\n ExclusionId: id,\r\n Enabled: enabled,\r\n Description: description\r\n };\r\n\r\n $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/assure/or/objectexclusions/' + id,\r\n data: data\r\n\r\n }).then(async function successCallback(response) {\r\n await helperService.successfulSaveButton($scope.savingAutoMitigation);\r\n if ($scope.attachments.flow.files.length) {\r\n uploadNewFiles($scope.attachments.flow.files, id);\r\n data.ID = response.data;\r\n } else {\r\n data.id = response.data;\r\n $route.reload();\r\n $scope.cancel();\r\n }\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n $scope.savingAutoMitigation.loadingValue = false;\r\n });\r\n\r\n };\r\n\r\n\r\n $scope.vm.excludeTypeDropdownChange = function () {\r\n if ($scope.vm.isCreate) {\r\n $scope.vm.autoMitigation.excludeObject = null;\r\n }\r\n\r\n if ($scope.vm.autoMitigation.selectedExcludeType) {\r\n //Reset from object type datasource\r\n vm.fromFunctionDropdownDataSource = new kendo.data.DataSource({\r\n data: [{ id: 2, name: \"Menu\" },\r\n { id: 3, name: \"Responsibility\" }]\r\n });\r\n //Function\r\n if ($scope.vm.autoMitigation.selectedExcludeType.id === 1) {\r\n\r\n $scope.vm.excludeObjectDropdown.options.dataValueField = \"Identifier\";\r\n $scope.vm.fromDropdown.setOptions(vm.fromFunctionDropdownOptions);\r\n $scope.vm.fromDropdown.setDataSource(vm.fromFunctionDropdownDataSource);\r\n\r\n $scope.vm.autoMitigation.excludeObjectDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n }\r\n let params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/universal/securityobjects/producttype/OR/type/FUNC',\r\n data: data,\r\n params: params\r\n }).then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n\r\n }\r\n //Menu\r\n else if ($scope.vm.autoMitigation.selectedExcludeType.id === 2) {\r\n\r\n $scope.vm.excludeObjectDropdown.options.dataValueField = \"Id\";\r\n $scope.vm.fromDropdown.setOptions(vm.fromMenuDropdownOptions);\r\n $scope.vm.fromDropdown.setDataSource(vm.fromMenuDropdownDataSource);\r\n\r\n $scope.vm.autoMitigation.excludeObjectDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/assure/or/menus'\r\n }).then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'AltName');\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n }\r\n //Concurrent Program\r\n else if ($scope.vm.autoMitigation.selectedExcludeType.id === 4) {\r\n\r\n $scope.vm.excludeObjectDropdown.options.dataValueField = \"Identifier\";\r\n $scope.vm.fromDropdown.setOptions(vm.fromFunctionDropdownOptions);\r\n vm.fromFunctionDropdownDataSource = new kendo.data.DataSource({\r\n data: [\r\n { id: 3, name: \"Responsibility\" }\r\n ]\r\n });\r\n $scope.vm.fromDropdown.setDataSource(vm.fromFunctionDropdownDataSource);\r\n\r\n $scope.vm.autoMitigation.excludeObjectDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n }\r\n let params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n $http({\r\n method: 'POST',\r\n data: data,\r\n params: params,\r\n url: apiUrl + 'api/universal/securityobjects/producttype/OR/type/CP'\r\n }).then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n }\r\n $scope.vm.autoMitigation.excludeObjectDataSource.read();\r\n\r\n }\r\n\r\n if ($scope.vm.autoMitigation.selectedFromType) {\r\n $scope.vm.fromDropdown.value($scope.vm.autoMitigation.selectedFromType.id);\r\n }\r\n };\r\n\r\n $scope.vm.fromTypeDropdownChange = function () {\r\n if ($scope.vm.isCreate) {\r\n $scope.vm.autoMitigation.fromObject = null;\r\n }\r\n\r\n //Function\r\n\r\n if ($scope.vm.autoMitigation.selectedFromType) {\r\n if ($scope.vm.autoMitigation.selectedFromType.id === 1) {\r\n\r\n $scope.vm.autoMitigation.fromObjectDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n }\r\n let params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n $http({\r\n method: 'POST',\r\n data: data,\r\n params: params,\r\n url: apiUrl + 'api/universal/securityobjects/producttype/OR/type/FUNC'\r\n }).then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n //Menu\r\n else if ($scope.vm.autoMitigation.selectedFromType.id === 2) {\r\n\r\n $scope.vm.autoMitigation.fromObjectDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/assure/or/menus'\r\n }).then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'AltName');\r\n options.success(response.data);\r\n\r\n });\r\n }\r\n }\r\n });\r\n }\r\n //Responsibility\r\n else if ($scope.vm.autoMitigation.selectedFromType.id === 3) {\r\n\r\n $scope.vm.autoMitigation.fromObjectDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"RESPONSIBILITY_NAME\";\r\n }\r\n let params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/assure/or/responsibilities',\r\n data: data,\r\n params: params\r\n }).then(function (response) {\r\n response.data._embedded.reportData.forEach(function (row, i) {\r\n row['AltName'] = row.Name;\r\n row['Name'] = row.Key;\r\n });\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.vm.autoMitigation.fromObjectDataSource.read();\r\n }\r\n };\r\n\r\n function errorCallBack(error) {\r\n helperService.showErrorMessage(error);\r\n }\r\n\r\n function removeFile(file) {\r\n $scope.fileActionPending = true;\r\n\r\n $http.delete(apiUrl + 'api/core/attachments/' + file.Identifier)\r\n .then(response => {\r\n var index = $scope.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n $scope.existingFilesDataSource.splice(index, 1);\r\n $scope.fileActionPending = false;\r\n $scope.vm.objectGridDataSource.read();\r\n $scope.vm.systemGridDataSource.read();\r\n }).catch(response => {\r\n errorCallBack(response.data);\r\n $scope.fileActionPending = false;\r\n });\r\n }\r\n\r\n function downloadFile(file) {\r\n $scope.fileActionPending = true;\r\n\r\n $http.get(apiUrl + 'api/core/attachments/' + file.Identifier + '/download', { responseType: \"blob\" })\r\n .then(response => {\r\n FileSaver.saveAs(response.data, file.FileName);\r\n $scope.fileActionPending = false;\r\n })\r\n .catch(response => {\r\n errorCallBack(response.data);\r\n $scope.fileActionPending = false;\r\n });\r\n }\r\n\r\n function uploadNewFiles(files, autoMitigationId) {\r\n var fd = new FormData();\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"EbsAutoMitigationRule\");\r\n fd.append(\"DataTypeId\", autoMitigationId);\r\n\r\n $http.put(apiUrl + 'api/core/attachments/', fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n }).then(response => {\r\n $route.reload();\r\n $scope.cancel();\r\n }).catch(response => errorCallBack(response.data));\r\n }\r\n\r\n}\r\n\r\n/*@ngInject*/ function newSystemAutoMitigationModalController($scope, $uibModalInstance, $filter, data, $http, $route, helperService, FileSaver, errorsDataService) {\r\n\r\n $scope.vm = data;\r\n\r\n $scope.cancel = cancel;\r\n $scope.removeFile = removeFile;\r\n $scope.downloadFile = downloadFile;\r\n $scope.vm.addMenuToList = addMenuToList;\r\n $scope.vm.deleteSelectedMenu = deleteSelectedMenu;\r\n $scope.vm.addAllMenus = addAllMenus;\r\n $scope.vm.deleteAllSelectedMenus = deleteAllSelectedMenus;\r\n $scope.vm.allMenusStatus = 0;\r\n $scope.vm.listOfSelectedMenus = $scope.vm.autoMitigation.excludedMenuItems || [];\r\n $scope.vm.listOfAvailableMenus = $scope.vm.autoMitigation.availableMenuItems || [];\r\n $scope.vm.listOfAvailableMenus = $scope.vm.listOfAvailableMenus.filter(itemA => {\r\n return !$scope.vm.listOfSelectedMenus.some(itemB => itemA.Id === itemB.Id);\r\n });\r\n $scope.vm.listOfSelectedMenuIds = $scope.vm.autoMitigation.excludedMenuItems\r\n ? $scope.vm.autoMitigation.excludedMenuItems.map(item => item.Id)\r\n : []\r\n ;\r\n\r\n if (!$scope.vm.isCreate) {\r\n if ($scope.vm.autoMitigation.Attachments.length > 0) {\r\n $scope.existingFilesDataSource = [];\r\n $scope.vm.autoMitigation.Attachments.forEach(attachment => $scope.existingFilesDataSource.push(attachment));\r\n }\r\n }\r\n\r\n $scope.attachments = {};\r\n\r\n $scope.vm.exclusionTypeDropdownOptions = {\r\n dataSource: [\r\n { id: 1, name: \"Function Name\" },\r\n { id: 2, name: \"Menu Name\" },\r\n { id: 3, name: \"Responsibility Name\" },\r\n { id: 4, name: \"User Name\" },\r\n { id: 5, name: \"Function Menu Prompt\" },\r\n { id: 6, name: \"Function Query Only\" },\r\n { id: 7, name: \"Concurrent Program Name\" }\r\n\r\n ],\r\n dataTextField: \"name\",\r\n dataValueField: \"id\"\r\n };\r\n\r\n // if RBAC is enabled - add Role Name to the exclusion dropdown\r\n if (JSON.parse(localStorage.getItem(\"ConfigurationValues\")).OR_RBACEnabled === '1') {\r\n $scope.vm.exclusionTypeDropdownOptions.dataSource.push({ id: 8, name: \"Role Name\" });\r\n }\r\n\r\n $scope.vm.searchDropdownOptions = {\r\n template: '{{dataItem.Name}} | {{dataItem.AltName}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.ProductId}} | {{dataItem.DisplayName}} ',\r\n filter: \"contains\",\r\n autoBind: false,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n dataTextField: \"Name\",\r\n dataValueField: \"Id\",\r\n height: 325\r\n };\r\n\r\n $scope.vm.exclusionConditionDropdownOptions = {\r\n dataSource: [\r\n { id: 0, name: \"Equals\" },\r\n { id: 1, name: \"Contains\" },\r\n { id: 2, name: \"Is\" }\r\n ],\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n index: 0\r\n };\r\n\r\n $scope.vm.conditionIsDropdownDataSource = new kendo.data.DataSource({\r\n data: [{ id: 2, name: \"Is\" }]\r\n });\r\n\r\n $scope.vm.conditionNoIsDropdownDataSource = new kendo.data.DataSource({\r\n data: [{ id: 0, name: \"Equals\" },\r\n { id: 1, name: \"Contains\" }]\r\n });\r\n\r\n $scope.vm.conditionContainsDropdownOptions = {\r\n dataSource: $scope.vm.conditionIsDropdownDataSource,\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n minLength: 3\r\n };\r\n\r\n $scope.vm.conditionNoContainsDropdownOptions = {\r\n dataSource: $scope.vm.conditionNoIsDropdownDataSource,\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n minLength: 3\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n $route.reload();\r\n }; // end done\r\n\r\n\r\n //Save Auto Mitigation\r\n $scope.saveAutoMitigation = async function (e, enabled, name, description, type, condition, textValue, comboBoxValue, excludedMenuIds) {\r\n\r\n $scope.savingAutoMitigation = new createSpinner();\r\n\r\n var objectRespApp;\r\n var objectName;\r\n var value;\r\n\r\n if (comboBoxValue) {\r\n value = comboBoxValue.Id ? comboBoxValue.Id : comboBoxValue.Name;\r\n objectName = comboBoxValue.Name;\r\n objectRespApp = comboBoxValue.ApplicationId;\r\n } else if (textValue !== '') {\r\n value = textValue;\r\n }\r\n\r\n var data = {\r\n\r\n Name: name,\r\n Description: description,\r\n Enabled: enabled,\r\n Type: type.id,\r\n Condition: condition.id,\r\n Value: value,\r\n TechName: objectName,\r\n RespApp: objectRespApp,\r\n ExcludedMenuIds: excludedMenuIds\r\n };\r\n\r\n try {\r\n let response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/assure/or/systemexclusions',\r\n data: data\r\n\r\n });\r\n await helperService.successfulSaveButton($scope.savingAutoMitigation);\r\n if ($scope.attachments.flow.files.length) {\r\n uploadNewFiles($scope.attachments.flow.files, response.data);\r\n data.ID = response.data;\r\n } else {\r\n data.ID = response.data;\r\n $route.reload();\r\n $scope.cancel();\r\n }\r\n //resetNew();\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n $scope.savingAutoMitigation.loadingValue = false;\r\n }\r\n\r\n };\r\n\r\n //Save Auto Mitigation\r\n $scope.updateAutoMitigation = async function (e, enabled, id, name, description, excludedMenuIds) {\r\n\r\n $scope.savingAutoMitigation = createSpinner();\r\n\r\n var data = {\r\n ExclusionId: id,\r\n Name: name,\r\n Description: description,\r\n Enabled: enabled,\r\n ExcludedMenuIds: excludedMenuIds\r\n };\r\n\r\n try {\r\n let response = await $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/assure/or/systemexclusions/' + id,\r\n data: data\r\n\r\n });\r\n await helperService.successfulSaveButton($scope.savingAutoMitigation);\r\n if ($scope.attachments.flow.files.length) {\r\n uploadNewFiles($scope.attachments.flow.files, id);\r\n data.ID = response.data;\r\n } else {\r\n data.id = response.data;\r\n $route.reload();\r\n $scope.cancel();\r\n }\r\n\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n $scope.savingAutoMitigation.loadingValue = false;\r\n }\r\n\r\n };\r\n\r\n\r\n //Product Dropdown\r\n\r\n $scope.vm.typeDropdownChange = function () {\r\n if ($scope.vm.isCreate) {\r\n $scope.vm.autoMitigation.selectedValue = null;\r\n $scope.vm.autoMitigation.selectedCondition = null;\r\n }\r\n\r\n //Function Menu Prompt Or Function Query Only\r\n if ($scope.vm.autoMitigation.selectedType.id === 5 || $scope.vm.autoMitigation.selectedType.id === 6) {\r\n $scope.vm.conditionDropdown.setOptions($scope.vm.conditionContainsDropdownOptions);\r\n $scope.vm.conditionDropdown.setDataSource($scope.vm.conditionIsDropdownDataSource);\r\n\r\n $scope.vm.showValueDropdown = false;\r\n }\r\n else {\r\n\r\n $scope.vm.conditionDropdown.setOptions($scope.vm.conditionNoContainsDropdownOptions);\r\n $scope.vm.conditionDropdown.setDataSource($scope.vm.conditionNoIsDropdownDataSource);\r\n\r\n $scope.vm.showValueDropdown = false;\r\n }\r\n\r\n $scope.vm.ChangeUpdateValueControl();\r\n $scope.vm.EnableUpdate();\r\n };\r\n\r\n $scope.vm.conditionDropdownChange = function () {\r\n if ($scope.vm.isCreate) {\r\n $scope.vm.autoMitigation.selectedValue = null;\r\n }\r\n $scope.vm.ChangeUpdateValueControl();\r\n $scope.vm.EnableUpdate();\r\n\r\n };\r\n\r\n $scope.vm.ChangeUpdateValueControl = async function () {\r\n $scope.vm.showValueDropdown = false;\r\n $scope.vm.disableValueTextBox = true;\r\n\r\n if (($scope.vm.autoMitigation.selectedValue || $scope.vm.autoMitigation.selectedType) && $scope.vm.autoMitigation.selectedCondition) {\r\n //Responsibility Name && Equals\r\n if ($scope.vm.autoMitigation.selectedType.id === 3 && $scope.vm.autoMitigation.selectedCondition.id === 0) {\r\n $scope.vm.showValueDropdown = true;\r\n\r\n $scope.vm.searchDropdownOptions.dataTextField = \"Name\";\r\n $scope.vm.searchDropdownOptions.dataValueField = \"Id\";\r\n\r\n $scope.vm.autoMitigation.searchObjectDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"RESPONSIBILITY_NAME\";\r\n }\r\n let params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/assure/or/responsibilities',\r\n data: data,\r\n params: params\r\n }).then(function (response) {\r\n response.data._embedded.reportData.forEach(function (row, i) {\r\n row['AltName'] = row.Name;\r\n row['Name'] = row.Key;\r\n });\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n //Menu Name && Equals\r\n else if ($scope.vm.autoMitigation.selectedType.id === 2 && $scope.vm.autoMitigation.selectedCondition.id === 0) {\r\n $scope.vm.showValueDropdown = true;\r\n\r\n $scope.vm.searchDropdownOptions.dataTextField = \"AltName\";\r\n $scope.vm.searchDropdownOptions.dataValueField = \"Id\";\r\n\r\n $scope.vm.autoMitigation.searchObjectDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/assure/or/menus'\r\n }).then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'AltName');\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n //Function Name && Equals\r\n else if ($scope.vm.autoMitigation.selectedType.id === 1 && $scope.vm.autoMitigation.selectedCondition.id === 0) {\r\n $scope.vm.showValueDropdown = true;\r\n\r\n $scope.vm.searchDropdownOptions.dataTextField = \"AltName\";\r\n $scope.vm.searchDropdownOptions.dataValueField = \"Identifier\";\r\n\r\n $scope.vm.autoMitigation.searchObjectDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n }\r\n let params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n $http({\r\n method: 'POST',\r\n data: data,\r\n params: params,\r\n url: apiUrl + 'api/universal/securityobjects/producttype/OR/type/FUNC'\r\n }).then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n //Concurrent Program Name && Equals\r\n else if ($scope.vm.autoMitigation.selectedType.id === 7 && $scope.vm.autoMitigation.selectedCondition.id === 0) {\r\n $scope.vm.showValueDropdown = true;\r\n\r\n $scope.vm.searchDropdownOptions.dataTextField = \"AltName\";\r\n $scope.vm.searchDropdownOptions.dataValueField = \"Identifier\";\r\n\r\n $scope.vm.autoMitigation.searchObjectDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n }\r\n let params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n $http({\r\n method: 'POST',\r\n data: data,\r\n params: params,\r\n url: apiUrl + 'api/universal/securityobjects/producttype/OR/type/CP'\r\n }).then(function (response) {\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n //Function Menu Prompt && Is\r\n else if ($scope.vm.autoMitigation.selectedType.id === 5 &&\r\n $scope.vm.autoMitigation.selectedCondition.id === 2) {\r\n $scope.vm.showValueDropdown = false;\r\n let response = await $http.get(`${apiUrl}api/assure/or/menus`);\r\n $scope.vm.listOfAvailableMenus = response.data;\r\n $scope.vm.autoMitigation.Value = \"BLANK\";\r\n $scope.vm.disableValueTextBox = true;\r\n\r\n }\r\n //Function Query Only && Is\r\n else if ($scope.vm.autoMitigation.selectedType.id === 6 &&\r\n $scope.vm.autoMitigation.selectedCondition.id === 2) {\r\n $scope.vm.showValueDropdown = false;\r\n\r\n $scope.vm.autoMitigation.Value = \"TRUE\";\r\n $scope.vm.disableValueTextBox = true;\r\n }\r\n //Role Name && Equals\r\n else if ($scope.vm.autoMitigation.selectedType.id === 8 && $scope.vm.autoMitigation.selectedCondition.id === 0) {\r\n $scope.vm.showValueDropdown = true;\r\n\r\n $scope.vm.searchDropdownOptions.dataTextField = \"Name\";\r\n $scope.vm.searchDropdownOptions.dataValueField = \"Id\";\r\n\r\n\r\n $scope.vm.autoMitigation.searchObjectDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/assure/or/roles'\r\n }).then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n $scope.vm.showValueDropdown = false;\r\n $scope.vm.disableValueTextBox = false;\r\n }\r\n }\r\n else {\r\n $scope.vm.showValueDropdown = false;\r\n }\r\n\r\n };\r\n\r\n $scope.vm.EnableUpdate = function () {\r\n if ($scope.vm.autoMitigation.selectedValue) {\r\n $scope.vm.autoMitigationvalue = $scope.vm.autoMitigation.selectedValue.Id;\r\n }\r\n\r\n if ($scope.vm.autoMitigation.Value) {\r\n $scope.vm.autoMitigationvalue = $scope.vm.autoMitigation.Value.Id;\r\n }\r\n\r\n };\r\n\r\n if (data.showValueDropdown) {\r\n $scope.vm.showValueDropdown = data.showValueDropdown;\r\n $scope.vm.ChangeUpdateValueControl();\r\n $scope.vm.EnableUpdate();\r\n }\r\n else {\r\n $scope.vm.showValueDropdown = false;\r\n }\r\n\r\n function errorCallBack(error) {\r\n helperService.showErrorMessage(error);\r\n }\r\n\r\n function removeFile(file) {\r\n $scope.fileActionPending = true;\r\n\r\n $http.delete(apiUrl + 'api/core/attachments/' + file.Identifier)\r\n .then(response => {\r\n var index = $scope.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n $scope.existingFilesDataSource.splice(index, 1);\r\n $scope.fileActionPending = false;\r\n $scope.vm.objectGridDataSource.read();\r\n $scope.vm.systemGridDataSource.read();\r\n }).catch(response => {\r\n errorCallBack(response.data);\r\n $scope.fileActionPending = false;\r\n });\r\n }\r\n\r\n function downloadFile(file) {\r\n $scope.fileActionPending = true;\r\n\r\n $http.get(apiUrl + 'api/core/attachments/' + file.Identifier + '/download', { responseType: \"blob\" })\r\n .then(response => {\r\n FileSaver.saveAs(response.data, file.FileName);\r\n $scope.fileActionPending = false;\r\n })\r\n .catch(response => {\r\n errorCallBack(response.data);\r\n $scope.fileActionPending = false;\r\n });\r\n }\r\n\r\n function uploadNewFiles(files, autoMitigationId) {\r\n var fd = new FormData();\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"EbsAutoMitigationRule\");\r\n fd.append(\"DataTypeId\", autoMitigationId);\r\n\r\n $http.put(apiUrl + 'api/core/attachments/', fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n }).then(response => {\r\n $route.reload();\r\n $scope.cancel();\r\n }).catch(response => errorCallBack(response.data));\r\n }\r\n\r\n function addMenuToList(menu) {\r\n $scope.vm.listOfAvailableMenus.forEach(function (row, i) {\r\n if (row.Id === menu.Id) {\r\n $scope.vm.listOfAvailableMenus.splice(i, 1);\r\n $scope.vm.listOfSelectedMenus.push(row);\r\n $scope.vm.listOfSelectedMenuIds.push(row.Id);\r\n }\r\n });\r\n }\r\n\r\n function deleteSelectedMenu(menu) {\r\n $scope.vm.listOfSelectedMenus.forEach(function (row, i) {\r\n if (row.Id === menu.Id) {\r\n $scope.vm.listOfSelectedMenus.splice(i, 1);\r\n $scope.vm.listOfSelectedMenuIds.splice(i, 1);\r\n $scope.vm.listOfAvailableMenus.push(row);\r\n }\r\n });\r\n }\r\n\r\n function addAllMenus() {\r\n let selectedIds = $scope.vm.listOfAvailableMenus.map(menu => menu.Id);\r\n $scope.vm.listOfSelectedMenuIds.push.apply($scope.vm.listOfSelectedMenuIds, selectedIds);\r\n $scope.vm.listOfSelectedMenus.push.apply($scope.vm.listOfSelectedMenus, $scope.vm.listOfAvailableMenus);\r\n $scope.vm.listOfAvailableMenus.length = 0;\r\n $scope.vm.allMenusStatus = 1;\r\n }\r\n\r\n function deleteAllSelectedMenus() {\r\n $scope.vm.listOfAvailableMenus.push.apply($scope.vm.listOfAvailableMenus, $scope.vm.listOfSelectedMenus);\r\n $scope.vm.listOfSelectedMenus = [];\r\n $scope.vm.listOfSelectedMenuIds.length = 0;\r\n $scope.vm.allMenusStatus = 2;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();;\r\n }\r\n}","export default /*@ngInject*/ function ($scope, FileSaver, objectIdDataService, $http, helperService) {\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n\r\n $scope.vm.showLoading = false;\r\n\r\n function enableDownloadButton(fileToDownload) {\r\n if (fileToDownload === \"RiskRuleset\") {\r\n $scope.riskRulesetDownloadInProgress = false;\r\n }\r\n if (fileToDownload === \"AutoMitigationRuleset\") {\r\n $scope.autoMitigationRulesetDownloadInProgress = false;\r\n }\r\n }\r\n\r\n $scope.exportFiles = function (fileToDownload) {\r\n\r\n function downloadFile(url, fileName) {\r\n $http.get(apiUrl + url, { responseType: \"blob\" })\r\n .then(function successCallback(response) {\r\n\r\n FileSaver.saveAs(response.data, fileName + '.xlsx');\r\n enableDownloadButton(fileToDownload);\r\n\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n enableDownloadButton(fileToDownload);\r\n });\r\n }\r\n\r\n if (fileToDownload === \"RiskRuleset\") {\r\n var url = 'api/arm/risks/export';\r\n downloadFile(url, fileToDownload);\r\n $scope.riskRulesetDownloadInProgress = true;\r\n }\r\n if (fileToDownload === \"AutoMitigationRuleset\") {\r\n var url = 'api/assure/or/exclusions/export';\r\n downloadFile(url, fileToDownload);\r\n $scope.autoMitigationRulesetDownloadInProgress = true;\r\n }\r\n };\r\n\r\n function enableUploadButton(fileToUpload) {\r\n if (fileToUpload === \"RiskRuleset\") {\r\n $scope.riskRulesetUploadInProgress = false;\r\n vm.importRiskRulesetFlow.files = [];\r\n\r\n }\r\n if (fileToUpload === \"AutoMitigationRuleset\") {\r\n $scope.autoMitigationRulesetUploadInProgress = false;\r\n vm.importAutoMitigationRuleset.files = [];\r\n }\r\n }\r\n\r\n $scope.upload = function (files, fileToUpload) {\r\n\r\n function uploadFile(url) {\r\n $http.put(apiUrl + url, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n })\r\n .then(function successCallback(response) {\r\n enableUploadButton(fileToUpload);\r\n\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n enableUploadButton(fileToUpload);\r\n });\r\n }\r\n\r\n var fd = new FormData();\r\n var fileName = files[0].file.name;\r\n var file = files[0].file;\r\n fd.append(fileName, file);\r\n\r\n if (fileToUpload === \"RiskRuleset\") {\r\n uploadFile('api/arm/risks/import');\r\n $scope.riskRulesetUploadInProgress = true;\r\n }\r\n if (fileToUpload === \"AutoMitigationRuleset\") {\r\n uploadFile('api/assure/or/exclusions/import');\r\n $scope.autoMitigationRulesetUploadInProgress = true;\r\n }\r\n\r\n };\r\n\r\n}","import { halSchemaKendoGrid } from \"../../../Shared/kendo.module\";\r\nimport { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, peoplesoftAutoMitigationsDataService, autoMitigation) {\r\n\r\n const vm = this;\r\n\r\n vm.needsSelectedExcludedObjectType = true;\r\n vm.needsSelectedFromObjectType = true;\r\n vm.updateAutoMitigation = updateAutoMitigation;\r\n vm.saveAutoMitigation = saveAutoMitigation;\r\n vm.dismiss = dismiss;\r\n vm.excludeTypeDropdownChange = excludeTypeDropdownChange;\r\n vm.fromTypeDropdownChange = fromTypeDropdownChange;\r\n vm.excludeDropdownOptions = {\r\n dataSource: [{\r\n id: 1, name: \"Page\"\r\n }],\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n optionLabel: \"--Select an item--\"\r\n };\r\n vm.fromDropdownOptions = {\r\n dataSource: [\r\n { id: 5, name: \"Bar Name\" },\r\n { id: 4, name: \"Component\" },\r\n { id: 2, name: \"Menu\" },\r\n { id: 3, name: \"Permission List\" }\r\n ],\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n optionLabel: \"--Select an item--\"\r\n };\r\n vm.excludeObjectDropdownOptions = {\r\n template: '{{dataItem.AltName}} | {{dataItem.Name}} | {{dataItem.SecurityObjectTypeName}} ',\r\n filter: \"contains\",\r\n autoBind: false,\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325\r\n };\r\n vm.fromObjectDropdownOptions = {\r\n template: `\r\n \r\n {{dataItem.BarName}}\r\n \r\n \r\n {{ dataItem.ComponentDescription }}\r\n | {{ dataItem.ComponentName }}\r\n | {{ dataItem.MarketId }}\r\n \r\n \r\n {{ dataItem.MenuLabel }}\r\n | {{ dataItem.MenuName }}\r\n \r\n \r\n {{ dataItem.Id }}\r\n | {{ dataItem.Name }}\r\n \r\n `,\r\n filter: \"contains\",\r\n autoBind: false\r\n };\r\n vm.fromFunctionDropdownOptions = {\r\n dataTextField: \"name\",\r\n dataValueField: \"id\"\r\n };\r\n\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (autoMitigation.uid) {\r\n vm.isCreate = false;\r\n vm.moduleType = 'Edit';\r\n vm.autoMitigation = {\r\n description: autoMitigation.Description,\r\n ruleId: autoMitigation.RuleId,\r\n Enabled: autoMitigation.Enabled,\r\n selectedExcludeType: {\r\n name: autoMitigation.AutoMitigationObjectType\r\n },\r\n excludeObject: {\r\n Name: autoMitigation.AutoMitigationObjectName\r\n },\r\n selectedFromType: {\r\n name: autoMitigation.FromObjectType\r\n },\r\n fromObject: {\r\n Name: autoMitigation.FromObjectName\r\n }\r\n };\r\n } else {\r\n vm.isCreate = true;\r\n vm.moduleType = 'Create';\r\n vm.autoMitigation = autoMitigation;\r\n vm.autoMitigation.Enabled = true;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function getFromObjectId(autoMitigation) {\r\n let id;\r\n\r\n switch (autoMitigation.selectedFromType.id) {\r\n case 5:\r\n id = autoMitigation.fromObject.Id;\r\n break;\r\n case 4:\r\n id = autoMitigation.fromObject.ComponentName;\r\n break;\r\n case 3:\r\n id = autoMitigation.fromObject.Id;\r\n break;\r\n case 2:\r\n id = autoMitigation.fromObject.MenuName;\r\n break;\r\n default:\r\n id = undefined;\r\n break;\r\n }\r\n\r\n return id;\r\n }\r\n\r\n //Save Auto Mitigation\r\n async function saveAutoMitigation() {\r\n let data = {\r\n AutoMitigationObjectId: vm.autoMitigation.excludeObject.Name,\r\n AutoMitigationObjectType: vm.autoMitigation.selectedExcludeType.id,\r\n FromObjectId: getFromObjectId(vm.autoMitigation),\r\n FromObjectType: Number(vm.autoMitigation.selectedFromType.id),\r\n Enabled: vm.autoMitigation.Enabled,\r\n Description: vm.autoMitigation.description\r\n };\r\n\r\n vm.savingAutoMitigation = new createSpinner();\r\n \r\n try {\r\n await peoplesoftAutoMitigationsDataService.addAutoMitigation(data);\r\n await helperService.successfulSaveButton(vm.savingAutoMitigation);\r\n\r\n cancel();\r\n } catch {\r\n vm.savingAutoMitigation.loadingValue = false;\r\n }\r\n }\r\n\r\n //Update Auto Mitigation\r\n async function updateAutoMitigation() {\r\n let data = {\r\n RuleId: vm.autoMitigation.ruleId,\r\n Enabled: vm.autoMitigation.Enabled,\r\n Description: vm.autoMitigation.description\r\n };\r\n\r\n vm.savingAutoMitigation = new createSpinner();\r\n\r\n try {\r\n await peoplesoftAutoMitigationsDataService.modifyMitigation(vm.autoMitigation.ruleId, data);\r\n await helperService.successfulSaveButton(vm.savingAutoMitigation);\r\n\r\n cancel();\r\n } catch {\r\n vm.savingAutoMitigation.loadingValue = false;\r\n }\r\n }\r\n\r\n function excludeTypeDropdownChange() {\r\n if (!vm.autoMitigation.Id) {\r\n vm.autoMitigation.excludeObject = null;\r\n }\r\n\r\n if (vm.autoMitigation?.selectedExcludeType?.id === 1) {\r\n vm.autoMitigation.excludeObjectDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: async (options) => {\r\n let body = helperService.prepareSortsAndFilters(options),\r\n params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n\r\n if (body.Filters.length > 0) {\r\n body.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n }\r\n let { data } = await peoplesoftAutoMitigationsDataService.getObjects(body, params);\r\n\r\n if (vm.autoMitigation.excludeObjectDataSource._data.length === 0) {\r\n vm.needsSelectedExcludedObjectType = false;\r\n vm.excludedObjectsDropdownList.setOptions({ optionLabel: '--Select an item--' });\r\n }\r\n options.success(data);\r\n }\r\n }\r\n });\r\n\r\n vm.autoMitigation.excludeObjectDataSource.read();\r\n\r\n } else if (!vm.autoMitigation.selectedExcludeType.id) {\r\n vm.needsSelectedExcludedObjectType = true;\r\n vm.autoMitigation.excludeObjectDataSource = [];\r\n }\r\n }\r\n\r\n function fromTypeDropdownChange() {\r\n if (!vm.autoMitigation.Id) {\r\n vm.autoMitigation.fromObject = null;\r\n }\r\n\r\n if (vm.autoMitigation?.selectedFromType?.id) {\r\n // String == number\r\n if (vm.autoMitigation.selectedFromType.id === 5) {\r\n vm.selectedFromObjectTypeRoute = apiUrl + 'api/assure/ps/barnames';\r\n vm.fromObjectDropdownList.setOptions({ dataTextField: 'BarName' });\r\n } else if (vm.autoMitigation.selectedFromType.id === 4) {\r\n vm.selectedFromObjectTypeRoute = apiUrl + 'api/assure/ps/components';\r\n vm.fromObjectDropdownList.setOptions({ dataTextField: 'ComponentName' });\r\n } else if (vm.autoMitigation.selectedFromType.id === 2) {\r\n vm.selectedFromObjectTypeRoute = apiUrl + 'api/assure/ps/menus';\r\n vm.fromObjectDropdownList.setOptions({ dataTextField: 'MenuName' });\r\n } else if (vm.autoMitigation.selectedFromType.id === 3) {\r\n vm.selectedFromObjectTypeRoute = apiUrl + 'api/assure/ps/permissionlists';\r\n vm.fromObjectDropdownList.setOptions({ dataTextField: 'Id' });\r\n }\r\n\r\n vm.autoMitigation.fromObjectDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: async (options) => {\r\n let { data } = await peoplesoftAutoMitigationsDataService.getObjectsByUrl(vm.selectedFromObjectTypeRoute);\r\n\r\n vm.needsSelectedFromObjectType = false;\r\n vm.fromObjectDropdownList.setOptions({ optionLabel: '--Select an item--' });\r\n options.success(helperService.generateRandomUuid(data));\r\n }\r\n }\r\n });\r\n\r\n vm.autoMitigation.fromObjectDataSource.read();\r\n\r\n } else if (!vm.autoMitigation.selectedFromType.id) {\r\n vm.needsSelectedFromObjectType = true;\r\n vm.autoMitigation.fromObjectDataSource = [];\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport addMitigationRuleModalController from \"./addMitigationRuleModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModal, helperService, peoplesoftAutoMitigationsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.openAutoMitigationModal = openAutoMitigationModal;\r\n vm.removeMitigation = removeMitigation;\r\n vm.applyAutoMitigationConfirmation = applyAutoMitigationConfirmation;\r\n\r\n activate();\r\n\r\n function activate() {\r\n var autoMitigationRulesGridColumns = [\r\n { field: \"AutoMitigationObjectType\", title: \"Auto Mitigation Object Type\", filterable: customAutoCompleteFilter },\r\n { field: \"AutoMitigationObjectName\", title: \"Auto Mitigation Object Name\", filterable: customAutoCompleteFilter },\r\n { field: \"FromObjectType\", title: \"From Object Type\", filterable: customAutoCompleteFilter },\r\n { field: \"FromObjectName\", title: \"From Object Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"Enabled\", width: 125, filterable: customBooleanFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Remove`, \"title\": \"Remove\", width: 90 }\r\n ];\r\n\r\n vm.autoMitigationRulesGridOptions = helperService.setMainGridOptions(autoMitigationRulesGridColumns, 275);\r\n vm.autoMitigationRulesGridOptions.selectable = false;\r\n\r\n vm.autoMitigationRulesGridDatasource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Enabled: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async (options) => {\r\n let { data } = await peoplesoftAutoMitigationsDataService.getAutoMitigations();\r\n\r\n data = $filter('orderBy')(data, 'Name');\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function applyAutoMitigationConfirmation() {\r\n await swal(helperService.areYouSureParams('Apply Auto Mitigation', 'This process will apply the defined Auto Mitigation Rules to the user conflicts that have not already been mitigated.', 'Apply'));\r\n\r\n await peoplesoftAutoMitigationsDataService.applyAutoMitigations();\r\n }\r\n\r\n //Update AutoMitigation\r\n async function openAutoMitigationModal(autoMitigation) {\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/Peoplesoft/autoMitigations/addMitigationRuleModal.html',\r\n controller: addMitigationRuleModalController,\r\n controllerAs: 'amrmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n autoMitigation: () => autoMitigation || {}\r\n }\r\n });\r\n\r\n await openModal.result;\r\n\r\n vm.autoMitigationRulesGridDatasource.read();\r\n }\r\n\r\n async function removeMitigation(dataItem) {\r\n await peoplesoftAutoMitigationsDataService.removeAutoMitigation(dataItem.RuleId);\r\n \r\n vm.autoMitigationRulesGridDatasource.read();\r\n }\r\n}","import controller from \"./autoMitigations.controller\";\r\n\r\n/* autoMitigations.component.js */\r\n\r\n/**\r\n * @desc component for peoplesoft auto mitigations\r\n * @example \r\n */\r\n\r\nconst autoMitigations = {\r\n controller: controller,\r\n controllerAs: 'amvm',\r\n templateUrl: '/App/Components/Peoplesoft/autoMitigations/autoMitigations.tmpl.html'\r\n};\r\n\r\nexport default autoMitigations;","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, helperService, autoMitigationsDataService, FileSaver, mitigation, product, $uibModalInstance) {\r\n\r\n const vm = this;\r\n\r\n vm.needsSelectedExcludedObjectType = true;\r\n vm.needsSelectedFromObjectType = true;\r\n vm.removedFiles = [];\r\n\r\n vm.$onInit = onInit;\r\n\r\n vm.saveAutoMitigation = saveAutoMitigation;\r\n vm.updateAutoMitigation = updateAutoMitigation;\r\n vm.excludeTypeDropdownChange = excludeTypeDropdownChange;\r\n vm.fromTypeDropdownChange = fromTypeDropdownChange;\r\n vm.remove = remove;\r\n vm.downloadFile = downloadFile;\r\n\r\n vm.product = product;\r\n\r\n vm.dismiss = dismiss;\r\n vm.close = close;\r\n\r\n function onInit() {\r\n if (mitigation.uid) {\r\n vm.action = 'Edit';\r\n vm.isCreate = false;\r\n vm.mitigation = {\r\n description: mitigation.Description,\r\n selectedExcludeType: {},\r\n excludeObject: {},\r\n selectedFromType: {},\r\n fromObject: {}\r\n };\r\n vm.mitigation.selectedExcludeType.name = mitigation.ExcludeObjectType;\r\n vm.mitigation.excludeObject.Name = mitigation.ExcludeObjectName;\r\n vm.mitigation.selectedFromType.name = mitigation.FromObjectType;\r\n vm.mitigation.ruleId = mitigation.Id;\r\n vm.mitigation.fromObject.Name = mitigation.FromObjectName;\r\n vm.mitigation.Enabled = mitigation.Enabled;\r\n if (mitigation.Attachments.length > 0) {\r\n vm.existingFilesDataSource = [];\r\n mitigation.Attachments.forEach(attachment => vm.existingFilesDataSource.push(attachment));\r\n }\r\n } else {\r\n vm.action = 'Create';\r\n vm.isCreate = true;\r\n vm.mitigation = mitigation;\r\n vm.mitigation.Enabled = true;\r\n }\r\n\r\n vm.excludeDropdownOptions = {\r\n dataSource: [\r\n { id: 1, name: \"Privileges\" }\r\n ],\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n optionLabel: \"-- Select an item --\"\r\n };\r\n\r\n vm.fromDropdownOptions = {\r\n dataSource: [\r\n { id: 2, name: \"Roles\" }\r\n ],\r\n dataTextField: \"name\",\r\n dataValueField: \"id\",\r\n optionLabel: \"-- Select an item --\"\r\n };\r\n\r\n vm.excludeObjectDropdownOptions = {\r\n template: `\r\n {{dataItem.AltName}}\r\n | {{dataItem.Name}}\r\n | {{dataItem.SecurityObjectTypeName}} \r\n `,\r\n filter: \"contains\",\r\n autoBind: false,\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325\r\n };\r\n\r\n vm.fromObjectDropdownOptions = {\r\n template: `\r\n \r\n {{ dataItem.Name }}\r\n | {{ dataItem.Code }}\r\n \r\n `,\r\n filter: \"contains\",\r\n autoBind: false,\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325\r\n };\r\n\r\n vm.fromFunctionDropdownOptions = {\r\n dataTextField: \"name\",\r\n dataValueField: \"id\"\r\n };\r\n }\r\n\r\n //Save Auto Mitigation\r\n async function saveAutoMitigation() {\r\n vm.savingAutoMitigation = new createSpinner();\r\n const data = {\r\n ExcludeObjectId: vm.mitigation.excludeObject.Id,\r\n ExcludeObjectType: vm.mitigation.selectedExcludeType.id,\r\n FromObjectId: vm.mitigation.fromObject.Code,\r\n FromObjectType: vm.mitigation.selectedFromType.id,\r\n Enabled: vm.mitigation.Enabled,\r\n Description: vm.mitigation.description\r\n };\r\n try {\r\n let response = await autoMitigationsDataService.addAutoMitigation(vm.product, data);\r\n await helperService.successfulSaveButton(vm.savingAutoMitigation);\r\n if (vm.attachments.flow.files.length > 0) {\r\n await uploadNewFiles(vm.attachments.flow.files, response.data);\r\n }\r\n vm.close();\r\n } catch {\r\n vm.savingAutoMitigation.loadingValue = false;\r\n }\r\n }\r\n\r\n //Update Auto Mitigation\r\n async function updateAutoMitigation() {\r\n vm.savingAutoMitigation = new createSpinner();\r\n const data = {\r\n ExclusionId: vm.mitigation.ruleId,\r\n Enabled: vm.mitigation.Enabled,\r\n Description: vm.mitigation.description\r\n };\r\n try {\r\n await autoMitigationsDataService.modifyMitigation(vm.product, data.ExclusionId, data);\r\n await helperService.successfulSaveButton(vm.savingAutoMitigation);\r\n if (vm.removedFiles.length > 0) {\r\n vm.removedFiles.forEach(file => removeFile(file));\r\n }\r\n if (vm.attachments.flow.files.length > 0) {\r\n await uploadNewFiles(vm.attachments.flow.files, data.ExclusionId);\r\n }\r\n vm.close();\r\n } catch {\r\n vm.savingAutoMitigation.loadingValue = false;\r\n }\r\n }\r\n\r\n\r\n function excludeTypeDropdownChange() {\r\n if (vm.mitigation.selectedExcludeType.id) {\r\n if (vm.mitigation.selectedExcludeType.id === 1) {\r\n vm.mitigation.excludeObjectDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: async function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n }\r\n const params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n\r\n let response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/assure/orfc/privileges',\r\n data: data,\r\n params: params\r\n });\r\n if (vm.mitigation.excludeObjectDataSource._data.length === 0) {\r\n vm.needsSelectedExcludedObjectType = false;\r\n vm.excludeObjectDropdown.setOptions({ optionLabel: '-- Select an item --' });\r\n }\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n\r\n vm.mitigation.excludeObjectDataSource.read();\r\n }\r\n\r\n else if (!vm.mitigation.selectedExcludeType.id) {\r\n vm.needsSelectedExcludedObjectType = true;\r\n vm.mitigation.excludeObjectDataSource = [];\r\n }\r\n }\r\n }\r\n\r\n function fromTypeDropdownChange() {\r\n if (vm.mitigation.selectedFromType.id) {\r\n vm.mitigation.fromObjectDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: async function (options) {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters[0].FieldName = \"Name\";\r\n }\r\n const params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n let response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/assure/orfc/roles',\r\n data: data,\r\n params: params\r\n });\r\n if (vm.mitigation.fromObjectDataSource._data.length === 0) {\r\n vm.needsSelectedFromObjectType = false;\r\n vm.fromObjectDropdown.setOptions({ optionLabel: '-- Select an item --' });\r\n }\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n vm.mitigation.fromObjectDataSource.read();\r\n }\r\n\r\n else if (!vm.mitigation.selectedFromType.id) {\r\n vm.needsSelectedFromObjectType = true;\r\n vm.mitigation.fromObjectDataSource = [];\r\n }\r\n }\r\n\r\n function errorCallBack(error) {\r\n helperService.showErrorMessage(error);\r\n }\r\n\r\n function remove(identifier) {\r\n vm.removedFiles.push(identifier);\r\n var index = vm.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === identifier);\r\n vm.existingFilesDataSource.splice(index, 1);\r\n }\r\n\r\n async function removeFile(identifier) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await $http.delete(apiUrl + 'api/core/attachments/' + identifier);\r\n vm.fileActionPending = false;\r\n } catch (err) {\r\n errorCallBack(err.data);\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function downloadFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n let response = await $http.get(apiUrl + 'api/core/attachments/' + file.Identifier + '/download', { responseType: \"blob\" });\r\n FileSaver.saveAs(response.data, file.FileName);\r\n vm.fileActionPending = false;\r\n } catch (err) {\r\n errorCallBack(err.data);\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function uploadNewFiles(files, autoMitigationId) {\r\n let fd = new FormData();\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"OracleCloudAutoMitigationRule\");\r\n fd.append(\"DataTypeId\", autoMitigationId);\r\n\r\n try {\r\n await $http.put(apiUrl + 'api/core/attachments/', fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n vm.close();\r\n } catch (err) {\r\n errorCallBack(err.data);\r\n }\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n}","import { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport importAutoMitigationRulesetModalController from \"./ImportAutoMitigationRulesetModal/importAutoMitigationRulesetModal.controller\";\r\nimport autoMitigationModalController from \"./AutoMitigationModal/autoMitigationModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModal, FileSaver, helperService, autoMitigationsDataService, $scope) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = onInit;\r\n\r\n vm.helperService = helperService;\r\n vm.openAutoMitigationModal = openAutoMitigationModal;\r\n vm.deleteSystemAutoMitigation = deleteSystemAutoMitigation;\r\n vm.applyAutoMitigationConfirmation = applyAutoMitigationConfirmation;\r\n vm.openImportAutoMitigationRulesetModal = openImportAutoMitigationRulesetModal;\r\n vm.exportAutoMitigationRuleset = exportAutoMitigationRuleset;\r\n\r\n $scope.$on('ImportExclusions', (event, args) => vm.autoMitigationRulesGridDatasource.read());\r\n\r\n function onInit() {\r\n const autoMitigationRulesGridColumns =\r\n [\r\n { field: \"ExcludeObjectType\", title: \"Exclude Object Type\", filterable: customAutoCompleteFilter },\r\n { field: \"ExcludeObjectId\", title: \"Exclude Object Id\", filterable: customAutoCompleteFilter },\r\n { field: \"ExcludeObjectName\", title: \"Exclude Object Name\", filterable: customAutoCompleteFilter },\r\n { field: \"FromObjectType\", title: \"From Object Type\", filterable: customAutoCompleteFilter },\r\n { field: \"FromObjectId\", title: \"From Object Id\", filterable: customAutoCompleteFilter },\r\n { field: \"FromObjectName\", title: \"From Object Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"Enabled\", width: 125, filterable: customBooleanFilter },\r\n { template:\r\n `Edit`,\r\n title: \"Edit\",\r\n width: 90\r\n },\r\n { template:\r\n `Delete`,\r\n title: \"Delete\",\r\n width: 90\r\n }\r\n ];\r\n\r\n vm.autoMitigationRulesGridOptions = helperService.setMainGridOptions(autoMitigationRulesGridColumns, 275);\r\n vm.autoMitigationRulesGridOptions.selectable = false;\r\n\r\n vm.autoMitigationRulesGridDatasource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Enabled: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n try {\r\n const res = await autoMitigationsDataService.getAutoMitigations(vm.product);\r\n let { data } = res;\r\n data = $filter('orderBy')(data, 'Name');\r\n options.success(data);\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function applyAutoMitigationConfirmation() {\r\n try {\r\n await swal(\r\n helperService.areYouSureParams(\r\n 'Apply Auto Mitigation',\r\n 'This process will apply the defined Auto Mitigation Rules to the user risks that have not already been mitigated.',\r\n 'Apply'\r\n )\r\n );\r\n autoMitigationsDataService.applyAutoMitigations(vm.product.toUpperCase());\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n function openImportAutoMitigationRulesetModal() {\r\n $uibModal.open({\r\n controller: importAutoMitigationRulesetModalController,\r\n controllerAs: 'iamrmvm',\r\n templateUrl: 'App/Components/AutoMitigations/ImportAutoMitigationRulesetModal/importAutoMitigationRulesetModal.tmpl.html',\r\n backdrop: 'static',\r\n resolve: {\r\n product: () => vm.product\r\n }\r\n });\r\n }\r\n\r\n async function exportAutoMitigationRuleset() {\r\n vm.rulesetExportPending = true;\r\n try {\r\n const res = await autoMitigationsDataService.exportAutoMitigationRuleset(vm.product);\r\n FileSaver.saveAs(res.data, 'AutoMitigationRuleset.xlsx');\r\n vm.rulesetExportPending = false;\r\n } catch (err) {\r\n vm.rulesetExportPending = false;\r\n }\r\n }\r\n\r\n async function openAutoMitigationModal(mitigation) {\r\n const modal = $uibModal.open({\r\n controller: autoMitigationModalController,\r\n controllerAs: 'ammvm',\r\n templateUrl: '/App/Components/AutoMitigations/AutoMitigationModal/autoMitigationModal.tmpl.html',\r\n backdrop: 'static',\r\n resolve: {\r\n mitigation: () => mitigation || {},\r\n product: () => vm.product\r\n }\r\n });\r\n try {\r\n await modal.result;\r\n vm.autoMitigationRulesGridDatasource.read();\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteSystemAutoMitigation(dataItem) {\r\n const { Id: mitigationId } = dataItem;\r\n try {\r\n await autoMitigationsDataService.deleteAutoMitigation(vm.product, mitigationId);\r\n vm.autoMitigationRulesGridDatasource.read();\r\n } catch (err) {\r\n return;\r\n }\r\n }\r\n\r\n}","import autoMitigationsController from \"./autoMitigations.controller\";\r\n\r\n/* autoMitigations.component.js */\r\n\r\n/**\r\n * @desc component for managing auto mitigations in ORFC and Peoplesoft\r\n * @example \r\n */\r\n\r\nconst autoMitigations = {\r\n bindings: {\r\n product: '<'\r\n },\r\n controller: autoMitigationsController,\r\n controllerAs: 'amvm',\r\n templateUrl: '/App/Components/AutoMitigations/autoMitigations.tmpl.html'\r\n};\r\n\r\nexport default autoMitigations;","import { standardGridPageSize, customAutoCompleteFilter } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function (dataService, $http, $filter, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = onInit;\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.typeDropdownChange = typeDropdownChange;\r\n vm.productTypesDropdownChange = productTypesDropdownChange;\r\n vm.productsDropdownChange = productsDropdownChange;\r\n vm.addCondition = addCondition;\r\n vm.removeFromListOfConditions = removeFromListOfConditions;\r\n vm.cancel = cancel;\r\n\r\n async function onInit() {\r\n vm.object = { ...vm.resolve.object };\r\n\r\n if (!vm.object.ProductType) {\r\n await getProductTypes();\r\n } else {\r\n vm.selectedProduct = { 'Type': vm.object.ProductType };\r\n vm.selectedProductType = { 'Type': vm.object.ProductType };\r\n await getProducts();\r\n }\r\n }\r\n\r\n function typeDropdownChange() {\r\n setupGrids();\r\n }\r\n\r\n function productTypesDropdownChange() {\r\n getProducts();\r\n }\r\n\r\n function productsDropdownChange() {\r\n getTypes();\r\n }\r\n\r\n\r\n async function addCondition(role) {\r\n const data = {\r\n \"RiskObjectId\": vm.object.Id,\r\n \"ProductId\": vm.selectedProduct.ID,\r\n \"SecurityRoleTypeId\": vm.selectedType.ID,\r\n \"SecurityRoleId\": role.ID,\r\n \"ProductType\": vm.selectedProductType.Type\r\n };\r\n\r\n let response = await $http.post(apiUrl + 'api/arm/defaultmitigationconditions', data);\r\n\r\n // Add to list displayed in modal\r\n const newCondition = {\r\n \"RiskObjectId\": vm.object.Id,\r\n \"Id\": response.data,\r\n \"ProductId\": vm.selectedProduct.ID,\r\n \"SecurityRoleId\": role.ID,\r\n \"SecurityRoleName\": role.Name,\r\n \"SecurityRoleTypeId\": vm.selectedType.ID,\r\n \"SecurityRoleTypeName\": vm.selectedType.Name,\r\n \"SecurityRoleDescription\": role.Description\r\n };\r\n\r\n vm.object.ConditionList.push(newCondition);\r\n vm.object.ConditionList = $filter('orderBy')(vm.object.ConditionList, 'SecurityRoleName');\r\n\r\n await vm.availableConditionsGridDataSource.read();\r\n await vm.selectedConditionsGridDataSource.read();\r\n\r\n }\r\n\r\n async function getProductTypes() {\r\n let response = await dataService.getProductTypes();\r\n vm.productTypesDataSource = response.data;\r\n vm.selectedProductType = response.data[0];\r\n getProducts();\r\n }\r\n\r\n async function getProducts() {\r\n let response = await $http.get(apiUrl + 'api/universal/products/producttype/' + vm.selectedProductType.Type);\r\n vm.productsDataSource = response.data;\r\n vm.selectedProduct = response.data[0];\r\n vm.selectedProductForCondition = response.data[0];\r\n getTypes();\r\n }\r\n\r\n async function getTypes() {\r\n if (vm.selectedProductForCondition) {\r\n let response = await $http.get(apiUrl + 'api/universal/securityroletypes/producttype/' + vm.selectedProduct.Type);\r\n vm.typeDataSource = response.data;\r\n vm.selectedType = response.data[0];\r\n setupGrids();\r\n }\r\n }\r\n\r\n function setupGrids() {\r\n const availableConditionsGridColumns = [\r\n { field: \"Name\", title: \"Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n const selectedConditionsGridColumns = [\r\n { field: \"SecurityRoleName\", title: \"Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityRoleDescription\", title: \"Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableConditionsGridOptions = helperService.setMainGridOptions(availableConditionsGridColumns, 500);\r\n vm.selectedConditionsGridOptions = helperService.setMainGridOptions(selectedConditionsGridColumns, 500);\r\n vm.availableConditionsGridOptions.selectable = false;\r\n vm.selectedConditionsGridOptions.selectable = false;\r\n\r\n vm.availableConditionsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n data.Filters.forEach(filter => {\r\n filter.FieldName = filter.FieldName === 'Name' ? 'SecurityRoleName' : 'SecurityRoleDescription';\r\n });\r\n }\r\n let response = await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/universal/securityroles/product/${vm.selectedProduct.ID}/type/${vm.selectedType.ID}`,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n });\r\n vm.object.ConditionList.forEach(condition => {\r\n response.data._embedded.reportData = response.data._embedded.reportData.filter(role => role.ID !== condition.SecurityRoleId);\r\n });\r\n response.data._embedded.reportData = $filter('orderBy')(response.data._embedded.reportData, 'Name');\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n\r\n vm.selectedConditionsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: options => {\r\n vm.object.ConditionList = $filter('orderBy')(vm.object.ConditionList, 'Name');\r\n options.success(vm.object.ConditionList);\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n async function removeFromListOfConditions(role) {\r\n role = role.toJSON();\r\n\r\n await $http.delete(apiUrl + 'api/arm/defaultmitigationconditions/' + role.Id);\r\n\r\n const roleIndex = vm.object.ConditionList.findIndex(condition => condition.SecurityRoleId === role.SecurityRoleId);\r\n vm.object.ConditionList.splice(roleIndex, 1);\r\n\r\n await vm.selectedConditionsGridDataSource.read();\r\n await vm.availableConditionsGridDataSource.read();\r\n }\r\n\r\n function cancel() {\r\n vm.modalInstance.close();\r\n }\r\n\r\n}","import manageConditionsController from \"./manageConditions.controller\";\r\n\r\n/* manageConditions.component.js */\r\n\r\n/**\r\n * @desc component for managing conditions in Maintain Risk Ruleset\r\n * @example \r\n */\r\n\r\nconst manageConditions = {\r\n bindings: {\r\n resolve: '<',\r\n modalInstance: '<'\r\n },\r\n controller: manageConditionsController,\r\n controllerAs: 'mcvm',\r\n templateUrl: '/App/Components/maintainRiskRuleset/objects/manageConditions/manageConditions.tmpl.html'\r\n};\r\n\r\nexport default manageConditions;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, riskLevelsData, helperService, riskLevel) {\r\n\r\n const vm = this;\r\n\r\n if (riskLevel) {\r\n vm.riskLevel = { ...riskLevel };\r\n }\r\n\r\n vm.cancel = cancel;\r\n vm.submitForm = submitForm;\r\n\r\n async function createRiskLevel() {\r\n vm.loading = new createSpinner();\r\n let postData = { Name: vm.riskLevel.Name };\r\n try {\r\n let response = await riskLevelsData.createRiskLevel(postData);\r\n let riskLevelId = response.data;\r\n await helperService.successfulSaveButton(vm.loading);\r\n $uibModalInstance.close(riskLevelId);\r\n } catch {\r\n vm.loading.loadingValue = false;\r\n }\r\n }\r\n\r\n async function renameRiskLevel() {\r\n vm.loading = new createSpinner();\r\n\r\n let putData = {\r\n Name: vm.riskLevel.Name,\r\n Id: vm.riskLevel.Id\r\n };\r\n\r\n try {\r\n await riskLevelsData.renameRiskLevel(putData);\r\n await helperService.successfulSaveButton(vm.loading);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.loading.loadingValue = false;\r\n }\r\n }\r\n\r\n function submitForm() {\r\n if (vm.riskLevel.Id) {\r\n renameRiskLevel();\r\n } else {\r\n createRiskLevel();\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport riskLevelsModalController from \"../riskLevelsModal/riskLevelsModal.controller\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModal, riskLevelsData, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = createRiskLevelsGrid();\r\n\r\n vm.openModal = openModal;\r\n vm.deleteRisk = deleteRisk;\r\n\r\n function createRiskLevelsGrid() {\r\n let riskLevelsGridColumns =\r\n [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 }\r\n\r\n ];\r\n\r\n vm.riskLevelsGridOptions = helperService.setMainGridOptions(riskLevelsGridColumns, 600);\r\n vm.riskLevelsGridOptions.selectable = false;\r\n\r\n vm.riskLevelsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await riskLevelsData.getRiskLevels();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function deleteRisk(riskLevel) {\r\n try {\r\n await swal(helperService.areYouSureParamsWithHTML('Delete Risk Level',\r\n `Are you sure you want to delete risk level\r\n
${riskLevel.Name}?
\r\n
`, 'Delete'));\r\n await riskLevelsData.deleteRiskLevel(riskLevel.Id);\r\n vm.riskLevel = null;\r\n vm.riskLevelsGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n\r\n async function openModal(riskLevel) {\r\n let riskLevelModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainRiskLevels/riskLevelsModal/riskLevelsModal.html',\r\n controller: riskLevelsModalController,\r\n controllerAs: 'rlmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n riskLevel: () => riskLevel\r\n }\r\n });\r\n\r\n try {\r\n await riskLevelModal.result;\r\n vm.riskLevelsGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","import riskLevelsGridController from \"./riskLevelsGrid.controller\";\r\n\r\n/* riskLevelsGrid.component.js */\r\n\r\n/**\r\n * @desc component for displaying and selecting risk levels in a grid\r\n * @example \r\n */\r\n\r\nconst riskLevelsGrid = {\r\n controller: riskLevelsGridController,\r\n controllerAs: 'rlgvm',\r\n templateUrl: '/App/Components/maintainRiskLevels/riskLevelsGrid/riskLevelsGrid.tmpl.html'\r\n};\r\n\r\nexport default riskLevelsGrid;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, businessProcessDataService, businessProcess, riskRuleset) {\r\n const vm = this;\r\n\r\n vm.saveBusinessProcess = saveBusinessProcess;\r\n vm.close = close;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (businessProcess) {\r\n vm.businessProcess = {\r\n Name: businessProcess.Name,\r\n Description: businessProcess.Description,\r\n Id: businessProcess.Id,\r\n RulesetId: businessProcess.RulesetId\r\n }\r\n } else {\r\n vm.businessProcess = {\r\n RulesetId: riskRuleset.RulesetId\r\n };\r\n }\r\n }\r\n\r\n function saveBusinessProcess() {\r\n vm.bpSaveInProgress = new createSpinner();\r\n if (vm.businessProcess.Id) {\r\n updateBusinessProcess();\r\n } else {\r\n addBusinessProcess();\r\n }\r\n }\r\n\r\n async function addBusinessProcess() {\r\n try {\r\n let response = await businessProcessDataService.createBusinessProcess(vm.businessProcess);\r\n await helperService.successfulSaveButton(vm.bpSaveInProgress);\r\n close(response.data);\r\n } catch {\r\n vm.bpSaveInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateBusinessProcess() {\r\n try {\r\n await businessProcessDataService.updateBusinessProcess(vm.businessProcess);\r\n await helperService.successfulSaveButton(vm.bpSaveInProgress);\r\n close();\r\n } catch {\r\n vm.bpSaveInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(bpId) {\r\n $uibModalInstance.close(bpId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, dataService, businessProcessDataService, configurationDataService, group, groupCount, selectedBpId, helpId) {\r\n const vm = this;\r\n\r\n vm.selectedProductChanged = selectedProductChanged;\r\n vm.useFioriAppToggleChanged = useFioriAppToggleChanged;\r\n vm.changeFioriAppSelected = changeFioriAppSelected;\r\n vm.changeFioriAppServiceSelected = changeFioriAppServiceSelected;\r\n vm.saveGroup = saveGroup;\r\n vm.cancel = cancel;\r\n\r\n vm.typeOptions = ['And', 'Or'];\r\n\r\n vm.group = { ...group };\r\n vm.helpId = helpId;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.availableProducts = await getProducts();\r\n vm.excludedAccessProducts = vm.availableProducts.filter(product => product.ID === 'NS' || product.ID === 'SF' || product.ID === 'AX7' || product.ID === 'AX' || product.ID === 'D365S' || product.ID === 'INT' || product.ID === 'NAV' || product.ID === 'AX5' || product.ID === 'D365Bc' || product.ID === 'WD' || product.ID === 'ADO' || product.ID === 'AD' || product.ID === 'SL' || product.ID === 'AAD' || product.ID === 'AZ');\r\n\r\n if (group) {\r\n vm.bpGroup = {\r\n ID: group.Id,\r\n Name: group.Name,\r\n BusinessProcessId: group.BusinessProcessId,\r\n IncludeReadViewAccess: group.IncludeReadViewAccess,\r\n Type: group.Type,\r\n ProductId: group.ProductId\r\n }\r\n\r\n vm.enableExcludeInquiryAccess = vm.excludedAccessProducts.some(product => product.ID === group.ProductId);\r\n } else {\r\n vm.bpGroup = {\r\n BusinessProcessId: selectedBpId,\r\n Type: 'And',\r\n IncludeReadViewAccess: false\r\n };\r\n\r\n if (groupCount > 0) {\r\n const groupNumber = groupCount + 1;\r\n vm.bpGroup.Name = \"Group \" + groupNumber;\r\n } else {\r\n vm.bpGroup.Name = \"Group 1\";\r\n }\r\n if (vm.availableProducts.length === 1) {\r\n vm.bpGroup.ProductId = vm.availableProducts[0].ID;\r\n selectedProductChanged();\r\n }\r\n }\r\n }\r\n\r\n async function getProducts() {\r\n const response = await dataService.getProducts();\r\n return response.data;\r\n }\r\n\r\n async function selectedProductChanged() {\r\n const selectedProduct = vm.availableProducts.find(product => product.ID === vm.bpGroup.ProductId);\r\n const s4Enabled = selectedProduct.Type === 'SAP' ? await getS4Config() === 'S4' : false;\r\n if (selectedProduct.Type === 'SAP' && s4Enabled) {\r\n vm.s4Enabled = true;\r\n } else {\r\n if (vm.bpGroup.AppId) {\r\n delete bpGroup.AppId;\r\n }\r\n vm.s4Enabled = false;\r\n }\r\n\r\n vm.enableExcludeInquiryAccess = vm.excludedAccessProducts.some(product => product.ID === selectedProduct.ID);\r\n }\r\n\r\n function useFioriAppToggleChanged() {\r\n if (vm.useFioriApp) {\r\n setupFioriAppGrid();\r\n } else {\r\n delete vm.bpGroup.AppId;\r\n delete vm.bpGroup.ServiceIds;\r\n }\r\n }\r\n\r\n function setupFioriAppGrid() {\r\n const columns = [\r\n { field: \"Name\", title: \"Application Name\", filterable: customAutoCompleteFilter },\r\n { field: \"FioriId\", title: \"Fiori Id\", filterable: customAutoCompleteFilter },\r\n ];\r\n\r\n vm.fioriAppGridOptions = helperService.setMainGridOptions(columns, 300);\r\n\r\n vm.fioriAppGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await businessProcessDataService.getSapFioriApplications(vm.bpGroup.ProductId);\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function setupFioriAppServicesGrid(appId) {\r\n const columns = [\r\n { selectable: true, width: 50 },\r\n { field: \"ServiceName\", title: \"Service Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Version\", title: \"Service Version\", filterable: customAutoCompleteFilter },\r\n ];\r\n\r\n vm.fioriAppServicesGridOptions = helperService.setMainGridOptions(columns, 300);\r\n vm.fioriAppServicesGridOptions.selectable = false;\r\n\r\n vm.fioriAppServicesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n id: \"S4ServiceId\"\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n let response = await businessProcessDataService.getSapFioriAppServices(vm.bpGroup.ProductId, appId);\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function changeFioriAppSelected(kendoEvent) {\r\n vm.bpGroup.ServiceIds = [];\r\n const grid = kendoEvent.sender;\r\n const selectedApp = grid.dataItem(grid.select())\r\n vm.selectedFioriId = selectedApp.FioriId\r\n vm.bpGroup.AppId = selectedApp.Id;\r\n vm.bpGroup.Name = `${selectedApp.FioriId} - ${selectedApp.Name}`;\r\n setupFioriAppServicesGrid(selectedApp.Id);\r\n }\r\n\r\n function changeFioriAppServiceSelected() {\r\n vm.bpGroup.ServiceIds = vm.appServiceGrid.selectedKeyNames();\r\n }\r\n\r\n async function getS4Config() {\r\n const response = await configurationDataService.getProductConfigurationValueByName('SAP', 'SAP_ErpType');\r\n return response.data.Value;\r\n }\r\n\r\n function saveGroup() {\r\n vm.bpGroupSaveInProgress = new createSpinner();\r\n\r\n if (vm.bpGroup.ID) {\r\n updateGroup();\r\n } else {\r\n createGroup();\r\n }\r\n }\r\n\r\n async function updateGroup() {\r\n try {\r\n await businessProcessDataService.updateBusinessProcessGroup(vm.bpGroup);\r\n await helperService.successfulSaveButton(vm.bpGroupSaveInProgress);\r\n close();\r\n } catch {\r\n vm.bpGroupSaveInProgress.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n async function createGroup() {\r\n try {\r\n const response = await businessProcessDataService.createBusinessProcessGroup(vm.bpGroup);\r\n await helperService.successfulSaveButton(vm.bpGroupSaveInProgress);\r\n close(response.data);\r\n } catch {\r\n vm.bpGroupSaveInProgress.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n function close(newGroupId) {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($http, $uibModalInstance, helperService, dataService, businessProcessDataService, businessProcess, bpGroup, groupObjects) {\r\n\r\n const vm = this;\r\n\r\n vm.addObjectToBpGroup = addObjectToBpGroup;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.availableProducts = await getProducts();\r\n setupAvailableGrid();\r\n createAvailableObjectsDataSource();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n async function getProducts() {\r\n const response = await dataService.getProducts();\r\n return response.data;\r\n }\r\n\r\n function setupAvailableGrid() {\r\n let availableGridColumns = [\r\n { title: \"Security Object Label\", field: \"AltName\", filterable: customAutoCompleteFilter },\r\n { title: \"Security Object Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Module\", field: \"ModuleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Type\", field: \"SecurityObjectTypeName\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n if (vm.availableProducts.length > 1) {\r\n availableGridColumns.unshift({ title: \"Product\", field: \"ProductName\", filterable: customAutoCompleteFilter });\r\n }\r\n\r\n vm.availableObjectsGridOptions = helperService.setMainGridOptions(availableGridColumns, null);\r\n }\r\n\r\n function createAvailableObjectsDataSource() {\r\n vm.availableObjectsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n let altNameFilterIndex = data.Filters.findIndex(filter => filter.FieldName === \"AltName\");\r\n let nameFilterIndex = data.Filters.findIndex(filter => filter.FieldName === \"Name\");\r\n\r\n if (altNameFilterIndex > -1) {\r\n data.Filters[altNameFilterIndex].FieldName = \"SecurityObjectAltName\";\r\n }\r\n if (nameFilterIndex > -1) {\r\n data.Filters[nameFilterIndex].FieldName = \"SecurityObjectName\";\r\n }\r\n }\r\n if (data.Sorts.length > 0) {\r\n let altNameSortIndex = data.Sorts.findIndex(sort => sort.FieldName === \"AltName\");\r\n let nameSortIndex = data.Sorts.findIndex(sort => sort.FieldName === \"Name\");\r\n if (altNameSortIndex > -1) {\r\n data.Sorts[altNameSortIndex].FieldName = \"SecurityObjectAltName\";\r\n }\r\n if (nameSortIndex > -1) {\r\n data.Sorts[nameSortIndex].FieldName = \"SecurityObjectName\";\r\n }\r\n }\r\n\r\n let response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/universal/securityobjects',\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page, 'productType': [bpGroup.ProductType] }\r\n });\r\n // filter out any objects that are already part of the group\r\n response.data._embedded.reportData = response.data._embedded.reportData.reduce((newArray, object) => {\r\n if (!groupObjects.some(groupObject => groupObject.Id === object.Id && groupObject.SecurityObjectTypeId === object.SecurityObjectTypeId && groupObject.ProductType === object.ProductType)) {\r\n newArray.push(object);\r\n }\r\n return newArray;\r\n }, []);\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n //Add Selected Object\r\n async function addObjectToBpGroup(dataItem) {\r\n vm.addingToSelectedGrid = true;\r\n kendo.ui.progress(vm.availableGrid.element, true);\r\n const data = {\r\n \"BusinessProcessID\": businessProcess.Id,\r\n \"SecurityObjectID\": dataItem.Id,\r\n \"SecurityObjectName\": dataItem.Name,\r\n \"SecurityObjectTypeID\": dataItem.SecurityObjectTypeId,\r\n \"ProductType\": dataItem.ProductType,\r\n \"GroupID\": bpGroup.Id\r\n };\r\n\r\n try {\r\n await businessProcessDataService.addObjectToBpGroup(data);\r\n groupObjects.push(dataItem);\r\n kendo.ui.progress(vm.availableGrid.element, false);\r\n await vm.availableObjectsGridDataSource.read();\r\n vm.addingToSelectedGrid = false;\r\n } catch (response) {\r\n vm.addingToSelectedGrid = false;\r\n kendo.ui.progress(vm.availableGrid.element, false);\r\n }\r\n };\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport businessProcessModalController from \"./businessProcessModal/businessProcessModal.controller\";\r\nimport bpGroupModalController from \"./bpGroupModal/bpGroupModal.controller\";\r\nimport bpObjectsModalController from \"./bpObjectsModal/bpObjectsModal.controller\";\r\nimport rulesetObjectCopyModalController from \"../../Shared/Components/rulesetObjectCopyModal/rulesetObjectCopyModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModal, helperService, businessProcessDataService, riskRulesetService) {\r\n\r\n const vm = this;\r\n\r\n vm.openBusinessProcessModal = openBusinessProcessModal;\r\n vm.openBusinessProcessGroupModal = openBusinessProcessGroupModal;\r\n vm.openBpObjectsModal = openBpObjectsModal;\r\n vm.openRulesetObjectCopyModal = openRulesetObjectCopyModal;\r\n vm.changeRiskRuleset = changeRiskRuleset;\r\n vm.changeGroupSelected = changeGroupSelected;\r\n vm.changeBusinessProcessSelected = changeBusinessProcessSelected;\r\n vm.removeObjectFromBpGroup = removeObjectFromBpGroup;\r\n vm.deleteBusinessProcess = deleteBusinessProcess;\r\n vm.deleteGroup = deleteGroup;\r\n vm.selectBusinessProcess = selectBusinessProcess;\r\n vm.selectAllBPs = selectAllBPs;\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.newFieldValueIsCollapsed = true;\r\n vm.businessProcessMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.openBusinessProcessModal(item);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.deleteBusinessProcess(item);\r\n }\r\n }\r\n ];\r\n vm.groupMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.openBusinessProcessGroupModal(item);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.deleteGroup(item);\r\n }\r\n }\r\n ];\r\n\r\n vm.selectedBPs = [];\r\n vm.helpId = '115007891947';\r\n activate();\r\n\r\n async function activate() {\r\n await getRiskRulesets();\r\n vm.businessProcessesLoading = true;\r\n getBusinessProcesses(null);\r\n clearObjectSelection();\r\n }\r\n\r\n function clearObjectSelection() {\r\n if (vm.selectedBPs.length) {\r\n vm.businessProcessDataSource.forEach(businessProcess => businessProcess.copy = false);\r\n }\r\n vm.selectedBPs = [];\r\n vm.selectBPsMode = false;\r\n vm.allBPsSelected = false;\r\n }\r\n\r\n async function openBusinessProcessModal(businessProcess) {\r\n const bpModal = $uibModal.open({\r\n templateUrl: '/App/Components/MaintainBusinessProcess/businessProcessModal/businessProcessModal.html',\r\n controller: businessProcessModalController,\r\n controllerAs: 'mbpgvm',\r\n backdrop: 'static',\r\n resolve: {\r\n businessProcess: () => businessProcess,\r\n riskRuleset: () => vm.selectedRiskRuleset\r\n }\r\n });\r\n\r\n try {\r\n const newBpId = await bpModal.result;\r\n getBusinessProcesses(newBpId);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openBusinessProcessGroupModal(group) {\r\n const bpGroupModal = $uibModal.open({\r\n templateUrl: '/App/Components/MaintainBusinessProcess/bpGroupModal/bpGroupModal.html',\r\n controller: bpGroupModalController,\r\n controllerAs: 'bpgmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n group: () => group,\r\n groupCount: () => vm.businessProcessGroupsDataSource.length,\r\n selectedBpId: () => vm.selectedBusinessProcess.Id,\r\n helpId: () => vm.helpId\r\n\r\n }\r\n });\r\n\r\n try {\r\n let newBpGroupId = await bpGroupModal.result;\r\n changeBusinessProcessSelected(newBpGroupId, vm.selectedBusinessProcess);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openBpObjectsModal() {\r\n const bpObjectsModal = $uibModal.open({\r\n templateUrl: '/App/Components/MaintainBusinessProcess/bpObjectsModal/bpObjectsModal.html',\r\n controller: bpObjectsModalController,\r\n controllerAs: 'bpomvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n businessProcess: () => vm.selectedBusinessProcess,\r\n bpGroup: () => vm.selectedGroup,\r\n groupObjects: () => vm.selectedObjectsForGroup\r\n }\r\n });\r\n\r\n await bpObjectsModal.result;\r\n changeGroupSelected(vm.selectedGroup);\r\n }\r\n\r\n async function openRulesetObjectCopyModal() {\r\n let objectCopyModal = $uibModal.open({\r\n templateUrl: '/App/Shared/Components/rulesetObjectCopyModal/rulesetObjectCopyModal.html',\r\n controller: rulesetObjectCopyModalController,\r\n controllerAs: 'rocmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n objects: () => vm.selectedBPs,\r\n ruleset: () => vm.selectedRiskRuleset\r\n }\r\n });\r\n try {\r\n await objectCopyModal.result;\r\n clearObjectSelection();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function changeRiskRuleset() {\r\n vm.businessProcessGroupsDataSource = null;\r\n vm.businessProcessDataSource = null;\r\n vm.selectedObjectsForGroup = null;\r\n vm.businessProcessesLoading = true;\r\n getBusinessProcesses(null);\r\n clearObjectSelection();\r\n }\r\n\r\n async function getRiskRulesets() {\r\n vm.riskRulesetsLoading = true;\r\n let response = await riskRulesetService.getRiskRulesetList();\r\n response.data = response.data.filter(ruleset => ruleset.IsEnabled);\r\n vm.riskRulesetDataSource = response.data;\r\n vm.riskRulesetsLoading = false;\r\n vm.selectedRiskRuleset = vm.riskRulesetDataSource.find(ruleset => ruleset.IsDefault);\r\n return vm.riskRulesetDataSource;\r\n }\r\n\r\n async function getBusinessProcesses(preselect) {\r\n let response = await businessProcessDataService.getBusinessProcessesByRiskRuleset(vm.selectedRiskRuleset.RulesetId);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.businessProcessDataSource = response.data;\r\n if (preselect) {\r\n response.data.forEach(function (row, i) {\r\n if (row.Id === preselect) {\r\n vm.businessProcessDataSource = response.data.filter(bp => bp.Id !== preselect);\r\n vm.selectedBusinessProcess = row;\r\n vm.businessProcessDataSource.unshift(vm.selectedBusinessProcess);\r\n vm.changeBusinessProcessSelected(row.Id, vm.selectedBusinessProcess);\r\n }\r\n });\r\n }\r\n vm.businessProcessesLoading = false;\r\n return vm.businessProcessDataSource\r\n }\r\n\r\n\r\n async function changeGroupSelected(group) {\r\n vm.selectedGroup = group;\r\n if (vm.selectedGroup) {\r\n vm.changeGroupInProgress = true;\r\n let response = await businessProcessDataService.getBpGroupObjects(vm.selectedBusinessProcess.Id, group.Id);\r\n vm.selectedObjectsForGroup = response.data.reduce((groupObjects, object) => {\r\n object.SecurityObject.BusinessProcessObjectId = object.ID;\r\n object.SecurityObject.SAPAuthFieldGroupings = object.SAPAuthFieldGroupings;\r\n object.SecurityObject.newFieldValueIsCollapsed = true;\r\n groupObjects.push(object.SecurityObject);\r\n return groupObjects;\r\n }, []);\r\n vm.changeGroupInProgress = false;\r\n }\r\n };\r\n\r\n async function changeBusinessProcessSelected(preselectGroupId, businessProcess) {\r\n vm.selectedBusinessProcess = businessProcess;\r\n vm.changeGroupInProgress = true;\r\n vm.businessProcessGroupsDataSource = null;\r\n\r\n if (vm.selectedBusinessProcess) {\r\n clearObjectSelection();\r\n let response = await businessProcessDataService.getBpGroups(vm.selectedBusinessProcess.Id);\r\n vm.changeGroupInProgress = false;\r\n vm.businessProcessGroupsDataSource = response.data;\r\n checkForIncludeAllAccessTypes();\r\n\r\n if (preselectGroupId) {\r\n vm.selectedGroup = vm.businessProcessGroupsDataSource.find(e => e.Id === preselectGroupId);\r\n }\r\n else if (vm.businessProcessGroupsDataSource.length === 1) {\r\n vm.selectedGroup = vm.businessProcessGroupsDataSource[0];\r\n }\r\n else {\r\n vm.selectedGroup = null;\r\n }\r\n changeGroupSelected(vm.selectedGroup);\r\n } else {\r\n vm.changeGroupInProgress = false;\r\n }\r\n }\r\n\r\n function checkForIncludeAllAccessTypes() {\r\n const excludedProductsArray = ['NS', 'SF', 'AX7', 'AX', 'D365S', 'INT', 'NAV', 'AX5', 'D365Bc', 'WD', 'ADO', 'AD', 'SL', 'AAD', 'AZ']\r\n vm.businessProcessGroupsDataSource.forEach(group => {\r\n const productMatches = excludedProductsArray.some(id => id === group.ProductId);\r\n\r\n if (productMatches) {\r\n group.enableAllAccessTypes = true;\r\n } else {\r\n group.enableAllAccessTypes = false;\r\n }\r\n });\r\n }\r\n\r\n //Delete Selected Object\r\n async function removeObjectFromBpGroup(bpObject) {\r\n vm.objectsInProgress = true;\r\n try {\r\n await businessProcessDataService.removeBusinessProcessObjectsFromGroup(vm.selectedBusinessProcess.Id, bpObject.BusinessProcessObjectId);\r\n changeGroupSelected(vm.selectedGroup);\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n vm.objectsInProgress = false;\r\n }\r\n\r\n //Delete Business Process\r\n async function deleteBusinessProcess(bp) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Business Process', `Are you sure you want to delete Business Process: ${bp.Name}?`, 'Delete'));\r\n await businessProcessDataService.deleteBusinessProcess(bp.Id);\r\n vm.selectedGroup = null;\r\n vm.selectedBusinessProcess = null;\r\n vm.businessProcessesLoading = true;\r\n await getBusinessProcesses(null);\r\n\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n //Delete Group\r\n async function deleteGroup(bpGroup) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Group', `Are you sure you want to delete Business Process Group: ${bpGroup.Name}?`, 'Delete'));\r\n await businessProcessDataService.deleteBpGroup(vm.selectedBusinessProcess.Id, bpGroup.Id);\r\n changeBusinessProcessSelected(null, vm.selectedBusinessProcess);\r\n vm.selectedGroup = null;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function selectBusinessProcess(businessProcess) {\r\n if (businessProcess.copy) {\r\n vm.selectedBPs.push(businessProcess);\r\n }\r\n else {\r\n vm.selectedBPs.splice(vm.selectedBPs.indexOf(businessProcess), 1);\r\n }\r\n vm.allBPsSelected = vm.businessProcessDataSource.every(bp => bp.copy);\r\n }\r\n function selectAllBPs() {\r\n vm.businessProcessDataSource.forEach(bp => bp.copy = vm.allBPsSelected);\r\n vm.selectedBPs = vm.businessProcessDataSource.filter(bp => bp.copy);\r\n }\r\n\r\n}","import angular from 'angular';\r\nimport applyDefaultMitigations from '../Components/applyDefaultMitigations/applyDefaultMitigations.component';\r\nimport assignRisks from '../Components/assignRisks/assignRisks.component';\r\nimport controlLibrary from '../Components/controlLibrary/controlLibrary.component';\r\nimport maintainBusinessCycles from '../Components/maintainBusinessCycles/maintainBusinessCycles.component';\r\nimport maintainRiskRulesetController from '../Components/maintainRiskRuleset/maintainRiskRuleset.controller';\r\nimport maintainMitigations from '../Components/maintainMitigations/maintainMitigations.component';\r\nimport riskLevels from '../Components/maintainRiskLevels/riskLevels.component';\r\nimport maintainStatuses from '../Components/maintainStatuses/maintainStatuses.component';\r\nimport ManageArchivesViewModel from '../Components/ManageArchives/ManageArchivesViewModel';\r\nimport startNewAudit from '../Components/startNewAudit/startNewAudit.component';\r\nimport ApplyAutoMitigationViewModel from '../Components/Oracle/ApplyAutoMitigation/ApplyAutoMitigationViewModel';\r\nimport transferRulesetController from '../Components/transferRuleset/transferRuleset.controller';\r\nimport peoplesoftAutoMitigations from '../Components/Peoplesoft/autoMitigations/autoMitigations.component';\r\nimport autoMitigations from '../Components/AutoMitigations/autoMitigations.component';\r\nimport manageConditions from '../Components/maintainRiskRuleset/objects/manageConditions/manageConditions.component';\r\nimport riskLevelsGrid from '../Components/maintainRiskLevels/riskLevelsGrid/riskLevelsGrid.component';\r\nimport maintainBusinessProcessController from '../Components/MaintainBusinessProcess/maintainBusinessProcess.controller';\r\n\r\nexport default angular\r\n .module('app.accessRiskMonitor.setup', [])\r\n .component(\"applyDefaultMitigations\", applyDefaultMitigations)\r\n .component(\"assignRisks\", assignRisks)\r\n .component(\"controlLibrary\", controlLibrary)\r\n .component(\"maintainBusinessCycles\", maintainBusinessCycles)\r\n .controller(\"maintainBusinessProcessController\", maintainBusinessProcessController)\r\n .controller(\"maintainRiskRulesetController\", maintainRiskRulesetController)\r\n .component(\"maintainMitigations\", maintainMitigations)\r\n .component('riskLevelsGrid', riskLevelsGrid)\r\n .component('riskLevels', riskLevels)\r\n .component(\"maintainStatuses\", maintainStatuses)\r\n .controller(\"manageArchivesViewModel\", ManageArchivesViewModel)\r\n .component(\"startNewAudit\", startNewAudit)\r\n .controller(\"applyAutoMitigationViewModel\", ApplyAutoMitigationViewModel)\r\n .controller(\"transferRulesetController\", transferRulesetController)\r\n .component(\"peoplesoftAutoMitigations\", peoplesoftAutoMitigations)\r\n .component('autoMitigations', autoMitigations)\r\n .component('manageConditions', manageConditions)\r\n .name;","import riskLevelsController from \"./riskLevels.controller\";\r\n\r\n/* riskLevels.component.js */\r\n\r\n/**\r\n * @desc component to display risk levels view\r\n * @example \r\n */\r\n\r\nconst riskLevels = {\r\n controller: riskLevelsController,\r\n controllerAs: 'rlvm',\r\n templateUrl: '/App/Components/maintainRiskLevels/riskLevels.tmpl.html'\r\n};\r\n\r\nexport default riskLevels;","export default function () {\r\n return;\r\n}","import { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $filter, SavedReportSelectorService, dataService, BuildRoleAccessPostBody, objectIdDataService, CustomReportServices, $http, $location, helperService, reportsDataService, reportsService) {\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n $scope.runSavedReport();\r\n }\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n\r\n vm.allRolesOption = true;\r\n vm.updateRoleDataSource = updateRoleDataSource;\r\n vm.objectSearchField = $rootScope.UserPreferences.ObjectSearchField;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n activate();\r\n\r\n async function aLAPluginActive() {\r\n let response = await $http.get(`${apiUrl}/api/core/plugins`);\r\n vm.aLAPluginActive = response.data.some(plugin => plugin.Id === 9 && plugin.Active);\r\n }\r\n\r\n function activate() {\r\n aLAPluginActive();\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n dataService.getProducts().then(function (response) {\r\n response.data = response.data.filter(p => p.UserHasAccess === true);\r\n vm.productsDataSource = response.data;\r\n let defaultProduct = vm.productsDataSource.find(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n let defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if ($scope.isDetailed) {\r\n vm.productsDataSource = vm.productsDataSource.filter(product => product.Type === \"AX\" || product.Type === \"AX5\" || product.Type === \"AX7\" || product.Type === \"GP\" || product.Type === \"ORFC\" || product.Type === \"SAP\");\r\n let defaultProductExists = vm.productsDataSource.some(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n if (defaultProductExists) {\r\n defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProduct = vm.productsDataSource[defaultProductSelected];\r\n } else {\r\n\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n } else {\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n } else {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProduct = vm.productsDataSource[defaultProductSelected];\r\n } else {\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n }\r\n\r\n vm.selectedProduct = SavedReportSelectorService.checkSavedReportForSingleProduct($rootScope.loadedSavedReport, response.data, vm.selectedProduct);\r\n\r\n if ($scope.isDetailed) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n } else {\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n getObjectTypes();\r\n vm.setColumns();\r\n $scope.runSavedReport();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n getReportMetadata().then(_ => {\r\n if ($rootScope.loadedSavedReport) {\r\n $scope.runSavedReport();\r\n }\r\n });\r\n });\r\n // ---\r\n });\r\n }\r\n\r\n if ($location.path().has('Detailed')) {\r\n $scope.isDetailed = true;\r\n } else {\r\n $scope.isDetailed = false;\r\n }\r\n\r\n vm.roleSelectedIds = [];\r\n\r\n $scope.runSavedReport = function () {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && vm.objectTypeDataSource && vm.productsDataSource && vm.roleDataSource && vm.objectDataSource && vm.filterCriteria.fields) {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n $scope.generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && vm.objectTypeDataSource && vm.productsDataSource && vm.roleDataSource && vm.objectDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n };\r\n\r\n $scope.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n $scope.mainGridOptions.autoBind = false;\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n $scope.applySelectedFilter = function () {\r\n helperService.applyFilterCatchError($scope);\r\n };\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n LastUsed: { type: \"date\"},\r\n PermissionOverride: { type: \"boolean\" },\r\n IsAssigned: { type: \"boolean\" },\r\n ViewCount: { type: \"number\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n let data = BuildRoleAccessPostBody.generateBody($scope.ObjectId, vm.selectedProductId, $scope.roles, vm.selectedObject, vm.selectedObjectType, $scope.isDetailed);\r\n\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: $scope.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n if ($scope.isDetailed) {\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type);\r\n\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.populateCriteriaModel = function () {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedProduct || vm.selectedObjectType === undefined || vm.selectedObject === undefined || vm.roleSelectedIds === undefined) {\r\n return;\r\n }\r\n $scope.product = vm.selectedProduct;\r\n vm.selectedProductId = [];\r\n $scope.securityObject = JSON.parse(JSON.stringify(vm.selectedObject));\r\n $scope.securityObjectType = vm.selectedObjectType;\r\n $scope.roles = vm.roleSelectedIds;//.map(function (el) { return el.ID; });\r\n\r\n CustomReportServices.convertCriteriaValueToNull($scope.securityObject, \"Identifier\");\r\n\r\n var criteria = [];\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObjectType\", 'SecurityObjectType', $scope.securityObjectType.Name, { \"Id\": vm.selectedObjectType.Identifier }));\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObject\", 'SecurityObject', $scope.securityObject.AltName, { \"Id\": $scope.securityObject.Identifier }));\r\n\r\n vm.roleSelectedIds.forEach(function (row, i) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityRoleIdentifier\", 'Role', row.Name, row.Identifier));\r\n });\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', $scope.product.Name, $scope.product.ID));\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n if ($scope.isDetailed === true) {\r\n vm.selectedProductId.push($scope.product.ID);\r\n let productString = vm.selectedProduct.Type === 'SAP' ? 'SAP' : vm.selectedProduct.ID;\r\n $scope.urlString = apiUrl + 'api/arm/' + productString + '/places/roleaccess';\r\n } else {\r\n vm.selectedProductId.push($scope.product.ID);\r\n $scope.urlString = apiUrl + 'api/arm/places/roleaccess';\r\n }\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n };\r\n\r\n $scope.generateGridWithSelectedValues = function () {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n $scope.populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n };\r\n\r\n vm.setColumns = function () {\r\n\r\n if ($scope.isDetailed === true) {\r\n if (vm.selectedProduct.Type === 'AX7') {\r\n $scope.mainGridColumns = [\r\n { field: \"RoleName\", title: \"Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleSystemName\", title: \"Role System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SubRoleName\", title: \"Sub Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SubRoleSystemName\", title: \"Sub Role System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DutyName\", title: \"Duty Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DutySystemName\", title: \"Duty System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeSystemName\", title: \"Privilege System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectName\", title: \"Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectLabel\", title: \"Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectType\", title: \"Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessType\", title: \"Access Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"MenuPath\", title: \"Menu Path\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"License\", title: \"License\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n\r\n if (vm.aLAPluginActive) {\r\n const lastUsedCol = { field: \"LastUsed\", title: \"Last Used\", template: \"{{ dataItem.LastUsed | date:'short'}}\", width: 200, filterable: customDatePickerFilter },\r\n viewCountCol = { field: \"ViewCount\", title: \"View Count\", width: 130, filterable: customAutoCompleteFilter };\r\n\r\n $scope.mainGridColumns.push(lastUsedCol);\r\n $scope.mainGridColumns.push(viewCountCol);\r\n }\r\n } else if (vm.selectedProduct.Type === 'AX') {\r\n $scope.mainGridColumns = [\r\n { field: \"RoleName\", title: \"Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 120, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName \", title: \"Sub Role Physical Name\", width: 120, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DutyName\", title: \"Duty\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DutyPhysicalName\", title: \"Duty Physical Name\", width: 120, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegePhysicalName\", title: \"Privilege Physical Name\", width: 120, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectHelpText\", title: \"Object Help Text\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"LicenseType\", title: \"License Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PermissionOverride\", title: \"Permission Override\", width: 120, filterable: customBooleanFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'AX5') {\r\n $scope.mainGridColumns = [\r\n { field: \"RoleId\", title: \"Group ID\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"DomainId\", title: \"Domain\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'GP') {\r\n $scope.mainGridColumns = [\r\n { field: \"RoleId\", title: \"Role ID\", width: 40, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object Alt Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Series\", title: \"Series\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'SAP') {\r\n $scope.mainGridColumns = [\r\n { field: \"RoleId\", title: \"Role ID\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectId\", title: \"Security Object ID\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Security Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'ORFC') {\r\n $scope.mainGridColumns = [\r\n { field: \"RoleName\", title: \"Role Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 120, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName\", title: \"Sub Role Physical Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeDescription\", title: \"Privilege Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n }\r\n } else {\r\n $scope.mainGridColumns = [\r\n { field: \"RoleId\", title: \"Role ID\", width: 40, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleType\", title: \"Role Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectId\", title: \"Object ID\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.mainGridOptions.sortable = false;\r\n\r\n $scope.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.setLayout();\r\n };\r\n\r\n vm.setLayout = function () {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, null);\r\n }\r\n };\r\n\r\n $scope.deleteFilter = function (id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n };\r\n\r\n $scope.clearAllFilters = function () {\r\n $scope.gridDataSource.filter({});\r\n };\r\n\r\n $scope.saveReportLayoutButton = function () {\r\n CustomReportServices.saveGridLayout($scope, null);\r\n };\r\n\r\n $scope.productDropdownChange = function () {\r\n if ($scope.isDetailed) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n getReportMetadata();\r\n }\r\n\r\n vm.roleSelectedIds = [];\r\n getObjectTypes();\r\n vm.setColumns();\r\n };\r\n\r\n function getObjectTypes() {\r\n vm.objectTypesDropdownLoading = true;\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/universal/securityobjecttypes/producttype',\r\n params: { 'productType': vm.selectedProduct.Type }\r\n }).then(function (response) {\r\n vm.objectTypesDropdownLoading = false;\r\n response.data.unshift({ \"Name\": \"All Object Types\", \"ID\": null });\r\n\r\n vm.selectedObjectType = response.data.first();\r\n vm.objectTypeDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedObjectType = SavedReportSelectorService.checkSavedReportForObjectTypes($rootScope.loadedSavedReport, response.data, vm.selectedObjectType);\r\n $scope.objectTypeDropdownChange();\r\n $scope.runSavedReport();\r\n });\r\n }\r\n\r\n $scope.objectTypeDropdownChange = function () {\r\n $scope.kendoObjectDropdownDataSource._data = [];\r\n $scope.kendoObjectDropdownDataSource.read();\r\n };\r\n\r\n $scope.kendoObjectDropdownDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n\r\n if (vm.selectedObjectType && vm.selectedObjectType.Identifier !== '') {\r\n vm.objectsDropdownLoading = true;\r\n\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n if (vm.objectSearchField === 'AltName') {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n } else {\r\n data.Filters[0].FieldName = \"SecurityObjectName\";\r\n }\r\n }\r\n\r\n if (vm.selectedProduct.Type === 'SAP') {\r\n data.ProductIds = [vm.selectedProduct.ID]\r\n }\r\n\r\n var urlString = null;\r\n var params = null;\r\n params = {\r\n \"productType\": vm.selectedProduct.Type,\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n if (vm.selectedObjectType.Identifier) {\r\n urlString = apiUrl + 'api/universal/securityobjects/producttype/' + vm.selectedObjectType.ProductType + '/type/' + vm.selectedObjectType.ID;\r\n } else {\r\n urlString = apiUrl + 'api/universal/securityobjects';\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: urlString,\r\n data: data,\r\n params: params\r\n }).then(function (response) {\r\n let data = response.data._embedded.reportData;\r\n\r\n if (vm.objectSearchField === 'AltName') {\r\n data = fillAltNames(data);\r\n }\r\n\r\n if ($scope.kendoObjectDropdownDataSource._data.length === 0) {\r\n\r\n // objects are being loaded for the first time\r\n addAllObjectsOption();\r\n\r\n if ($rootScope.loadedSavedReport) {\r\n SavedReportSelectorService.getSavedReportSelectedObject($rootScope.loadedSavedReport).then(response => {\r\n if (response) {\r\n data.unshift(response);\r\n }\r\n success(data);\r\n });\r\n } else {\r\n success(data);\r\n }\r\n } else if (options.data.page === 1) {\r\n if (!options.data.filter || options.data.filter.filters.length === 0 || options.data.filter.filters[0].value === \"\") {\r\n addAllObjectsOption();\r\n }\r\n if (vm.selectedObject.Identifier !== \"-1\" && !data.some(object => object.Identifier === vm.selectedObject.Identifier)) {\r\n // selected object is not in the dataset we need to add it and make sure it stays selected\r\n data.unshift(vm.selectedObject);\r\n vm.selectedObject = data[0];\r\n }\r\n options.success(response.data);\r\n $scope.populateCriteriaModel();\r\n } else {\r\n options.success(response.data);\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n function addAllObjectsOption() {\r\n let AllObjects = {};\r\n if (vm.objectSearchField === 'AltName') {\r\n AllObjects = { \"AltName\": \"All Objects\", \"Id\": null, \"Identifier\": \"-1\" };\r\n } else {\r\n AllObjects = { \"Name\": \"All Objects\", \"Id\": null, \"Identifier\": \"-1\" };\r\n }\r\n data.unshift(AllObjects);\r\n }\r\n\r\n function success(data) {\r\n vm.objectDataSource = data;\r\n vm.selectedObject = data[0];\r\n vm.objectsDropdownLoading = false;\r\n $scope.runSavedReport();\r\n options.success(response.data);\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n });\r\n } else {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (vm.objectSearchField === 'AltName') {\r\n vm.dropdownTemplate = '{{dataItem.AltName}} | {{dataItem.Name}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.Id}}';\r\n vm.dataTextField = 'AltName';\r\n } else {\r\n vm.dropdownTemplate = '{{dataItem.Name}} | {{dataItem.AltName}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.Id}}';\r\n vm.dataTextField = 'Name';\r\n }\r\n\r\n $scope.objectDropdownOptions = {\r\n template: vm.dropdownTemplate,\r\n filter: \"contains\",\r\n autoBind: false,\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: \"dataItem\",\r\n valueMapper: function (options) {\r\n options.success(helperService.valueMapperFunction(options, $scope.vm.objectDataSource, 'Identifier'));\r\n }\r\n },\r\n open: function () {\r\n let filters = this.dataSource._filter;\r\n if (filters) {\r\n this.dataSource.filter({});\r\n }\r\n },\r\n change: function () {\r\n $scope.populateCriteriaModel();\r\n },\r\n height: 325\r\n };\r\n\r\n function updateRoleDataSource(roleDataSource, roleSelectedIds) {\r\n vm.roleDataSource = roleDataSource;\r\n vm.roleSelectedIds = roleSelectedIds;\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n}\r\n\r\nfunction fillAltNames(data) {\r\n return data.map(object => {\r\n if (!object.AltName) {\r\n object.AltName = object.Name;\r\n object.Name = \"\"\r\n }\r\n\r\n return object;\r\n });\r\n}\r\n","import { standardGridPageSize, customAutoCompleteFilter, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, BuildUserAccessPostBody, $filter, dataService, objectIdDataService, CustomReportServices, $http, $location, helperService, reportsDataService, reportsService) {\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n $scope.runSavedReport();\r\n }\r\n });\r\n\r\n var vm = $scope.vm = {};\r\n\r\n $scope.helperService = helperService;\r\n\r\n $scope.CustomReportServices = CustomReportServices;\r\n\r\n vm.selectedCompanies = [];\r\n vm.selectedProducts = [];\r\n vm.objectSearchField = $rootScope.UserPreferences.ObjectSearchField;\r\n\r\n vm.updateUserDataSource = updateUserDataSource;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n $scope.hasDetailedVersion = true;\r\n\r\n objectIdDataService.getObjectID().then(async function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n $scope.reportId = securityObject.ReportID;\r\n\r\n await aLAPluginActive();\r\n\r\n dataService.getProducts().then(function (response) {\r\n response.data = response.data.filter(p => p.UserHasAccess === true);\r\n vm.productsDataSource = response.data;\r\n let defaultProduct = vm.productsDataSource.find(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n let defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n if ($scope.isDetailed) {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProducts = [vm.productsDataSource[defaultProductSelected]];\r\n } else {\r\n vm.selectedProducts = [vm.productsDataSource[0]];\r\n }\r\n } else {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProducts = [vm.productsDataSource[defaultProductSelected]];\r\n } else {\r\n vm.selectedProducts = angular.copy(vm.productsDataSource);\r\n }\r\n }\r\n\r\n vm.selectedProducts = SavedReportSelectorService.checkSavedReportForProducts($rootScope.loadedSavedReport, response.data, vm.selectedProducts);\r\n\r\n if ($scope.isDetailed) {\r\n if (vm.selectedProducts[0].IsCustom) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\").ReportID;\r\n } else {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type).ReportID;\r\n }\r\n } else {\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n getObjectTypes();\r\n vm.setColumns();\r\n $scope.runSavedReport();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n getReportMetadata().then(_ => {\r\n if ($rootScope.loadedSavedReport) {\r\n $scope.runSavedReport();\r\n }\r\n });\r\n // ---\r\n });\r\n });\r\n\r\n if ($location.path().has('Detailed')) {\r\n $scope.isDetailed = true;\r\n } else {\r\n $scope.isDetailed = false;\r\n }\r\n\r\n $scope.runSavedReport = function () {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && vm.productsDataSource && vm.companyDataSource && vm.userDataSource && vm.objectTypeDataSource && vm.objectDataSource && vm.filterCriteria.fields) {\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n\r\n $scope.generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && vm.productsDataSource && vm.companyDataSource && vm.userDataSource && vm.objectTypeDataSource && vm.objectDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n };\r\n\r\n $scope.changeView = function () {\r\n if ($scope.isDetailed === true) {\r\n $location.path('/AccessControl/Place/UserAccess').search('');\r\n } else {\r\n $location.path('/AccessControl/Place/UserAccessDetailed').search('');\r\n }\r\n };\r\n\r\n $scope.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n $scope.mainGridOptions.autoBind = false;\r\n\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n $scope.dynamicSideGridOptions = helperService.setNonPageableGridOptions([]);\r\n\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n $scope.applySelectedFilter = function () {\r\n helperService.applyFilterCatchError($scope);\r\n };\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n LastRun: { type: \"date\" },\r\n LastUsed: { type: \"date\" },\r\n UseCount: { type: \"number\" },\r\n ViewCount: { type: \"number\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n var data = BuildUserAccessPostBody.generateBody($scope.products, $scope.ObjectId, $scope.securityObjectType, vm.selectedUserIds, $scope.companies, $scope.securityObject);\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: $scope.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n\r\n var data = response.data._embedded.reportData;\r\n\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n if ($scope.isDetailed) {\r\n let securityObject;\r\n if (vm.selectedProducts[0].IsCustom) {\r\n // the security object for custom products has null for product type so we can't send the real product type\r\n securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\");\r\n } else {\r\n securityObject = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type);\r\n }\r\n $scope.reportId = securityObject.ReportID;\r\n }\r\n\r\n if (data.length > 0) {\r\n $scope.dynamicSideGridDataSource = null;\r\n }\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n function updateUserDataSource(selectedUsers, selectedUserIds, userDataSource) {\r\n vm.selectedUserIds = selectedUserIds;\r\n vm.users = selectedUsers;\r\n vm.userDataSource = userDataSource;\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n function continuePopulateCriteriaModel() {\r\n return vm.selectedProducts && vm.selectedUserIds && vm.selectedCompanies && vm.selectedObject && vm.selectedObjectType;\r\n }\r\n\r\n $scope.populateCriteriaModel = function () {\r\n // only continue if the proper criteria are loaded\r\n if (continuePopulateCriteriaModel()) {\r\n\r\n var criteria = [];\r\n\r\n $scope.products = vm.selectedProducts;\r\n $scope.users = vm.users?.length ? vm.users : [{ \"Name\": \"All Users\", \"ID\": null }];\r\n $scope.companies = vm.selectedCompanies;\r\n $scope.securityObject = JSON.parse(JSON.stringify(vm.selectedObject));\r\n\r\n CustomReportServices.convertCriteriaValueToNull($scope.securityObject, \"Identifier\");\r\n\r\n $scope.securityObjectType = vm.selectedObjectType;\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObjectType\", 'SecurityObjectType', $scope.securityObjectType.Name, { \"Id\": vm.selectedObjectType.Identifier }));\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObject\", 'SecurityObject', $scope.securityObject.AltName, { \"Id\": $scope.securityObject.Identifier }));\r\n\r\n $scope.users.forEach(function (user) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"UserMasterId\", 'User', user.Name, user.ID));\r\n });\r\n\r\n $scope.products.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', row.Name, row.ID));\r\n });\r\n\r\n $scope.companies.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"CompanyMasterId\", 'Company', row.Name, row.ID));\r\n });\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n if (vm.selectedProducts.length === 1 && $scope.isDetailed === true) {\r\n let productString = vm.selectedProducts[0].Type === 'SAP' ? 'SAP' : vm.selectedProducts[0].ID;\r\n $scope.urlString = apiUrl + 'api/arm/' + productString + '/places/useraccess';\r\n } else {\r\n $scope.urlString = apiUrl + 'api/arm/places/useraccess';\r\n }\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n };\r\n\r\n $scope.generateGridWithSelectedValues = function () {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n $scope.populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n }\r\n\r\n };\r\n\r\n function getCompanies() {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/universal/companymaster'\r\n }).then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.allCompaniesDropdownObject = { \"Name\": \"All Companies\", \"ID\": \"AllObjectsInMultiSelect\" };\r\n response.data = response.data.filter(c => c.UserHasAccess === true);\r\n response.data.unshift(vm.allCompaniesDropdownObject);\r\n vm.companyDataSource = response.data;\r\n let defaultCompany = response.data.find(obj => obj.Name === $rootScope.UserPreferences.PreferredCompany);\r\n let defaultCompanySelected = vm.companyDataSource.indexOf(defaultCompany);\r\n if ($rootScope.UserPreferences.PreferredCompany !== null) {\r\n vm.selectedCompanies = [vm.companyDataSource[defaultCompanySelected]];\r\n } else {\r\n vm.selectedCompanies = [vm.allCompaniesDropdownObject];\r\n }\r\n vm.selectedCompanies = SavedReportSelectorService.checkSavedReportForCompanies($rootScope.loadedSavedReport, response.data, vm.selectedCompanies);\r\n $scope.companyDropdownChange();\r\n $scope.runSavedReport();\r\n });\r\n }\r\n getCompanies();\r\n\r\n function getObjectTypes() {\r\n if (vm.selectedProducts) {\r\n vm.objectTypesDropdownLoading = true;\r\n var products = vm.selectedProducts.map(function (el) {\r\n return el.Type;\r\n });\r\n\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/universal/securityobjecttypes/producttype',\r\n params: { 'productType': products }\r\n }).then(function (response) {\r\n vm.objectTypesDropdownLoading = false;\r\n vm.allObjectTypesDropdownObject = { \"Name\": \"All Object Types\", \"ID\": null };\r\n\r\n response.data.unshift(vm.allObjectTypesDropdownObject);\r\n\r\n vm.objectTypeDataSource = response.data;\r\n vm.objectTypeDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedObjectType = response.data[0];\r\n vm.selectedObjectType = SavedReportSelectorService.checkSavedReportForObjectTypes($rootScope.loadedSavedReport, response.data, vm.selectedObjectType);\r\n $scope.objectTypeDropdownChange();\r\n $scope.runSavedReport();\r\n });\r\n }\r\n }\r\n\r\n $scope.companyDropdownChange = function (companies) {\r\n if (companies) {\r\n vm.selectedCompanies = helperService.deselectAllObjectsIfOtherIsClicked(companies, vm.allCompaniesDropdownObject);\r\n } else {\r\n vm.selectedCompanies = helperService.deselectAllObjectsIfOtherIsClicked(vm.selectedCompanies, vm.allCompaniesDropdownObject);\r\n }\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n $scope.objectTypeDropdownChange = function () {\r\n $scope.kendoObjectDropdownDataSource._data = [];\r\n $scope.kendoObjectDropdownDataSource.read();\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n $scope.kendoObjectDropdownDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n\r\n if (vm.selectedObjectType && vm.selectedObjectType.Identifier !== '') {\r\n vm.objectsDropdownLoading = true;\r\n\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n if (vm.objectSearchField === 'AltName') {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n } else {\r\n data.Filters[0].FieldName = \"SecurityObjectName\";\r\n }\r\n }\r\n\r\n var urlString = null;\r\n var params = null;\r\n params = {\r\n \"productType\": vm.selectedProducts.map(function (el) { return el.Type; }),\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n };\r\n if (vm.selectedObjectType.Identifier) {\r\n urlString = apiUrl + 'api/universal/securityobjects/producttype/' + vm.selectedObjectType.ProductType + '/type/' + vm.selectedObjectType.ID;\r\n } else {\r\n urlString = apiUrl + 'api/universal/securityobjects';\r\n }\r\n $http({\r\n method: 'POST',\r\n url: urlString,\r\n params: params,\r\n data: data\r\n }).then(function (response) {\r\n let data = response.data._embedded.reportData;\r\n\r\n if (vm.objectSearchField === 'AltName') {\r\n data = fillAltNames(data);\r\n }\r\n\r\n if ($scope.kendoObjectDropdownDataSource._data.length === 0) {\r\n // objects are being loaded for the first time\r\n addAllObjectsOption();\r\n\r\n if ($rootScope.loadedSavedReport) {\r\n SavedReportSelectorService.getSavedReportSelectedObject($rootScope.loadedSavedReport).then(response => {\r\n if (response) {\r\n data.unshift(response);\r\n }\r\n success(data);\r\n });\r\n } else {\r\n success(data);\r\n }\r\n } else if (options.data.page === 1) {\r\n if (!options.data.filter || options.data.filter.filters.length === 0 || options.data.filter.filters[0].value === \"\") {\r\n addAllObjectsOption();\r\n }\r\n if (vm.selectedObject.Identifier !== \"-1\" && !data.some(object => object.Identifier === vm.selectedObject.Identifier)) {\r\n // selected object is not in the dataset we need to add it and make sure it stays selected\r\n data.unshift(vm.selectedObject);\r\n vm.selectedObject = data[0];\r\n }\r\n options.success(response.data);\r\n } else {\r\n options.success(response.data);\r\n }\r\n\r\n function addAllObjectsOption() {\r\n let AllObjects = {};\r\n if (vm.objectSearchField === 'AltName') {\r\n AllObjects = { \"AltName\": \"All Objects\", \"Id\": null, \"Identifier\": \"-1\" };\r\n } else {\r\n AllObjects = { \"Name\": \"All Objects\", \"Id\": null, \"Identifier\": \"-1\" };\r\n }\r\n data.unshift(AllObjects);\r\n }\r\n\r\n function success(data) {\r\n vm.objectDataSource = data;\r\n vm.selectedObject = data[0];\r\n vm.objectsDropdownLoading = false;\r\n $scope.runSavedReport();\r\n options.success(response.data);\r\n }\r\n\r\n });\r\n } else {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (vm.objectSearchField === 'AltName') {\r\n vm.dropdownTemplate = '{{dataItem.AltName}} | {{dataItem.Name}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.Id}}';\r\n vm.dataTextField = 'AltName';\r\n } else {\r\n vm.dropdownTemplate = '{{dataItem.Name}} | {{dataItem.AltName}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.Id}}';\r\n vm.dataTextField = 'Name';\r\n }\r\n\r\n $scope.objectDropdownOptions = {\r\n template: vm.dropdownTemplate,\r\n filter: \"contains\",\r\n autoBind: false,\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: \"dataItem\",\r\n valueMapper: function (options) {\r\n options.success(helperService.valueMapperFunction(options, $scope.vm.objectDataSource, 'Identifier'));\r\n }\r\n },\r\n open: function () {\r\n let filters = this.dataSource._filter;\r\n if (filters) {\r\n this.dataSource.filter({});\r\n }\r\n },\r\n height: 325\r\n };\r\n\r\n vm.setColumns = function () {\r\n if (vm.selectedProducts) {\r\n\r\n if (vm.selectedProducts.length === 1 && $scope.isDetailed === true) {\r\n if (vm.selectedProducts[0].Type === 'OR') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserMenuName\", title: \"User Menu Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu Name\", width: 200, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"UserSubMenuName\", title: \"User Sub Menu Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubMenuName\", title: \"Sub Menu Name\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"User Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Operating Unit\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyId\", title: \"Company Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Prompt\", title: \"Prompt\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 180, filterable: customAutoCompleteFilter }\r\n\r\n ];\r\n\r\n if (!helperService.convertConfigValueToTrueFalse('OR_RBACEnabled')) {\r\n $scope.mainGridColumns.splice(3, 0, { field: \"Role\", title: \"Role\", width: 180, filterable: customAutoCompleteFilter }, { field: \"RoleCode\", title: \"Role Code\", width: 180, filterable: customAutoCompleteFilter }, { field: \"RoleType\", title: \"Role Type\", width: 180, filterable: customAutoCompleteFilter });\r\n } else {\r\n $scope.mainGridColumns.splice(3, 0, { field: \"Responsibility\", title: \"Responsibility\", width: 180, filterable: customAutoCompleteFilter }, { field: \"ResponsibilityID\", title: \"Responsibility ID\", width: 180, filterable: customAutoCompleteFilter }, { field: \"ResponsibilityKey\", title: \"Responsibility Key\", width: 180, filterable: customAutoCompleteFilter });\r\n }\r\n\r\n } else if (vm.selectedProducts[0].Type === 'INT') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"ApplicationName\", title: \"Application Name\", width: 180, filterable: customAutoCompleteFilter, hidden: !helperService.convertConfigValueToTrueFalse(\"INT_RoleBasedSecurity\") },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter, hidden: helperService.convertConfigValueToTrueFalse(\"INT_RoleBasedSecurity\") },\r\n { field: \"Module\", title: \"Module\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AdministrationLevel\", title: \"Administration Level \", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ActiveStatus\", title: \"Active Status \", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n } else if (vm.selectedProducts[0].Type === 'NS') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserType\", title: \"User Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Subsidiary\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'NAV') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"FullName\", title: \"Full Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'D365Bc') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'Zuo' || vm.selectedProducts[0].IsCustom) {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'CPA') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role ID\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n } else if (vm.selectedProducts[0].Type === 'AX7') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoleSystemName\", title: \"Role System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubRoleSystemName\", title: \"Sub Role System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DutyName\", title: \"Duty Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DutySystemName\", title: \"Duty System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeSystemName\", title: \"Privilege System Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"LicenseType\", title: \"License Type\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (vm.aLAPluginActive) {\r\n const lastUsedCol = { field: \"LastUsed\", title: \"Last Used\", template: \"{{ dataItem.LastUsed | date:'short'}}\", width: 200, filterable: customDatePickerFilter },\r\n viewCountCol = { field: \"ViewCount\", title: \"View Count\", width: 130, filterable: customAutoCompleteFilter };\r\n\r\n $scope.mainGridColumns.push(lastUsedCol);\r\n $scope.mainGridColumns.push(viewCountCol);\r\n }\r\n } else if (vm.selectedProducts[0].Type === 'AX') {\r\n $scope.mainGridColumns = [\r\n { field: \"NetworkAlias\", title: \"Network Alias\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName\", title: \"Sub Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"DutyName\", title: \"Duty Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DutyPhysicalName\", title: \"Duty Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"PrivilegeName\", title: \"Privilege Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegePhysicalName\", title: \"Privilege Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"EntryPointName\", title: \"Entry Point Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"EntryPointPhysicalName\", title: \"Entry Point Physical Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"EntryPointTypeName\", title: \"Entry Point Type\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"EntryPointAccessName\", title: \"Entry Point Access\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectHelpText\", title: \"Security Object Help Text\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SAP') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserGroup\", title: \"User Group\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserType\", title: \"User Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Name\", title: \"Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UseCount\", title: \"Use Count\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"LastRun\", title: \"Last Run Date\", template: \"{{ dataItem.LastRun | date:'short'}}\", width: 200, filterable: customDatePickerFilter },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Department\", title: \"Department\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Location\", title: \"Location\", width: 200, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SAPB1') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AuthorizationSource\", title: \"Authorization Source\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SF') {\r\n $scope.mainGridColumns = [\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserFullName\", title: \"User Full Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Module\", title: \"Module\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedByType\", title: \"Access by Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AssignedByName\", title: \"Access By\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'GP') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TaskName\", title: \"Task\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Series\", title: \"Series\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Alt Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter, hidden: true }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AC') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'PS') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"RoleName\", title: \"Role\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"PermissionListId\", title: \"Permission List\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"BarName\", title: \"Bar Name\", width: 100, filterable: customAutoCompleteFilter },\r\n { field: \"ComponentName\", title: \"Component\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MarketName\", title: \"Market\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'JDE') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Version\", title: \"Version\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"AccessSource\", title: \"Access Source\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'ORFC') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RolePhysicalName\", title: \"Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubRoleName\", title: \"Sub Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SubRolePhysicalName\", title: \"Sub Role Physical Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Business Unit\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RolePath\", title: \"Role Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'AX5') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"GroupId\", title: \"AX Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DomainId\", title: \"AX Domain\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'SL') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"AccessSource\", title: \"Access Source\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n else if (vm.selectedProducts[0].Type === 'D365S') {\r\n $scope.mainGridColumns = [\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TeamName\", title: \"Team Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"PrivilegeName\", title: \"Privilege\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n else if (vm.selectedProducts[0].Type === 'AD') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserId\", title: \"User Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubGroupName\", title: \"Sub-Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n else if (vm.selectedProducts[0].Type === 'AAD') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserId\", title: \"User Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SubGroupName\", title: \"Sub-Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n\r\n else if (vm.selectedProducts[0].Type === 'WD') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityGroup\", title: \"Security Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessType\", title: \"Business Process Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcessDefinition\", title: \"Business Process Definition\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"StepOrder\", title: \"Step Order\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RoutingRestrictions\", title: \"Routing Restrictions\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Condition\", title: \"Condition\", width: 180, filterable: customAutoCompleteFilter }\r\n\r\n ];\r\n } else if (vm.selectedProducts[0].Type === 'OREPM') {\r\n $scope.mainGridColumns = [\r\n { field: \"UserID\", title: \"User Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Enabled\", title: \"User Enabled\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Service\", title: \"Service\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GrantedThroughGroup\", title: \"Granted Through Group\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n } else {\r\n $scope.mainGridColumns = [\r\n { field: \"ProductName\", title: \"Product\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserID\", title: \"User ID\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserDescription\", title: \"User Description\", width: 160, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 130, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyID\", title: \"Company ID\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.mainGridOptions.sortable = false;\r\n\r\n $scope.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.setLayout();\r\n }\r\n };\r\n\r\n async function aLAPluginActive() {\r\n let response = await $http.get(`${apiUrl}/api/core/plugins`);\r\n vm.aLAPluginActive = response.data.some(plugin => plugin.Id === 9 && plugin.Active);\r\n }\r\n\r\n vm.setLayout = function () {\r\n\r\n var productId;\r\n if ($scope.isDetailed === true && vm.selectedProducts.length === 1) {\r\n productId = vm.selectedProducts[0].ID;\r\n }\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, productId);\r\n }\r\n\r\n };\r\n\r\n $scope.productDropdownChange = function () {\r\n if ($scope.isDetailed) {\r\n if (vm.selectedProducts && vm.selectedProducts.length > 1) {\r\n vm.selectedProducts.remove(vm.selectedProducts[0]);\r\n }\r\n if (vm.selectedProducts[0].IsCustom) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, \"customProduct\").ReportID;\r\n } else {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProducts[0].Type).ReportID;\r\n }\r\n getReportMetadata();\r\n }\r\n getObjectTypes();\r\n vm.setColumns();\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n $scope.changeRowSelected = function (kendoEvent) {\r\n $scope.sideGridIsNew = false;\r\n\r\n $scope.dynamicSideGridOptions = helperService.setNonPageableGridOptions([]);\r\n $scope.sideGridIsNew = true;\r\n $scope.sideGridLoading = true;\r\n $scope.dynamicSideGridDataSource = [];\r\n var grid = kendoEvent.sender;\r\n CustomReportServices.getATChangeCountForRow($scope, grid);\r\n CustomReportServices.getAccessDetailsForRow($scope, grid).then(response => {\r\n if (response.data.length > 0) {\r\n $scope.dynamicSideGridColumns = Object.keys(response.data[0]).map(f => {\r\n var column = {};\r\n column.field = f;\r\n column.title = helperService.headerStringTransformer(f);\r\n if (f === 'LastUsed') {\r\n column.template = \"{{ dataItem.LastUsed | date:'short'}}\";\r\n }\r\n return column;\r\n });\r\n $scope.dynamicSideGridDataSource = new kendo.data.DataSource({\r\n data: response.data\r\n });\r\n }\r\n });\r\n $scope.sideGridLoading = false;\r\n\r\n };\r\n\r\n $scope.deleteFilter = function (id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n };\r\n\r\n $scope.splitHeaderText = function () {\r\n helperService.splitHeaderText(angular);\r\n };\r\n\r\n $scope.clearAllFilters = function () {\r\n $scope.gridDataSource.filter({\r\n });\r\n };\r\n\r\n $scope.saveReportLayoutButton = function () {\r\n var productId;\r\n if ($scope.isDetailed === true && vm.selectedProducts.length === 1) {\r\n productId = vm.selectedProducts[0].ID;\r\n }\r\n CustomReportServices.saveGridLayout($scope, productId);\r\n };\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n if (vm.selectedProducts.some(product => product.Type === 'OR')) {\r\n if (helperService.convertConfigValueToTrueFalse('OR_RBACEnabled')) {\r\n vm.reportMetadata.Columns = vm.reportMetadata.Columns.filter(column => column.FieldName !== \"Role\" && column.FieldName !== \"RoleCode\" && column.FieldName !== \"RoleType\");\r\n } else {\r\n vm.reportMetadata.Columns = vm.reportMetadata.Columns.filter(column => column.FieldName !== \"Responsibility\" && column.FieldName !== \"ResponsibilityID\" && column.FieldName !== \"ResponsibilityKey\");\r\n }\r\n }\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n}\r\n\r\nfunction fillAltNames(data) {\r\n return data.map(object => {\r\n if (!object.AltName) {\r\n object.AltName = object.Name;\r\n object.Name = \"\"\r\n }\r\n\r\n return object;\r\n });\r\n}","import { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $filter, SavedReportSelectorService, BuildResponsibilityAccessPostBody, objectIdDataService, CustomReportServices, $http, $location, helperService, reportsDataService, reportsService) {\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n $scope.runSavedReport();\r\n }\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n vm.allRolesOption = true;\r\n vm.selectedResponsibilities = [];\r\n vm.updateRoleDataSource = updateRoleDataSource;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n $scope.hasDetailedVersion = true;\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n $scope.reportId = securityObject.ReportID;\r\n\r\n vm.selectedProduct = {};\r\n vm.selectedProduct.ID = $scope.pageInfo.ProductType;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n getReportMetadata().then(_ => {\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n $scope.runSavedReport();\r\n }\r\n });\r\n // ---\r\n });\r\n if ($location.path().has('Detailed')) {\r\n $scope.isDetailed = true;\r\n } else {\r\n $scope.isDetailed = false;\r\n }\r\n\r\n $scope.runSavedReport = function () {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && $scope.vm.responsibilityDataSource && vm.objectTypeDataSource && $scope.vm.objectDataSource && vm.filterCriteria.fields) {\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n $scope.generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && $scope.vm.responsibilityDataSource && vm.objectTypeDataSource && $scope.vm.objectDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n };\r\n\r\n $scope.changeView = function () {\r\n if ($scope.isDetailed === true) {\r\n $location.path('/AccessControl/Place/ResponsibilityAccess').search('');\r\n } else {\r\n $location.path('/AccessControl/Place/ResponsibilityAccessDetailed').search('');\r\n }\r\n };\r\n\r\n\r\n $scope.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n $scope.mainGridOptions.autoBind = false;\r\n\r\n\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n vm.objectTypesDropdownLoading = true;\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/universal/securityobjecttypes/producttype/',\r\n params: { productType: 'OR' }\r\n }).then(function (response) {\r\n vm.objectTypesDropdownLoading = false;\r\n\r\n vm.objectTypeDataSource = response.data;\r\n vm.objectTypeDataSource = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedObjectType = SavedReportSelectorService.checkSavedReportForObjectTypes($rootScope.loadedSavedReport, response.data, vm.selectedObjectType);\r\n $scope.objectTypeDropdownChange();\r\n $scope.runSavedReport();\r\n });\r\n\r\n $scope.objectTypeDropdownChange = function () {\r\n $scope.kendoObjectDropdownDataSource._data = [];\r\n $scope.kendoObjectDropdownDataSource.read();\r\n };\r\n\r\n $scope.kendoObjectDropdownDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: function (options) {\r\n\r\n if (vm.selectedObjectType && vm.selectedObjectType.Identifier !== '') {\r\n vm.objectsDropdownLoading = true;\r\n\r\n let data = helperService.prepareSortsAndFilters(options);\r\n if (data.Filters.length > 0) {\r\n if ($rootScope.UserPreferences.ObjectSearchField === 'AltName') {\r\n data.Filters[0].FieldName = \"SecurityObjectAltName\";\r\n } else {\r\n data.Filters[0].FieldName = \"SecurityObjectName\";\r\n }\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/universal/securityobjects/producttype/OR/type/' + vm.selectedObjectType.ID,\r\n data: data,\r\n params: { \"pagesize\": options.data.pageSize, \"page\": options.data.page }\r\n }).then(function (response) {\r\n let data = response.data._embedded.reportData;\r\n\r\n if ($scope.kendoObjectDropdownDataSource._data.length === 0) {\r\n // objects are being loaded for the first time\r\n addAllObjectsOption();\r\n\r\n if ($rootScope.loadedSavedReport) {\r\n SavedReportSelectorService.getSavedReportSelectedObject($rootScope.loadedSavedReport).then(response => {\r\n if (response) {\r\n data.unshift(response);\r\n }\r\n success(data);\r\n });\r\n } else {\r\n success(data);\r\n }\r\n } else if (options.data.page === 1) {\r\n if (!options.data.filter || options.data.filter.filters.length === 0 || options.data.filter.filters[0].value === \"\") {\r\n addAllObjectsOption();\r\n }\r\n if (vm.selectedObject.Identifier !== \"-1\" && !data.some(object => object.Identifier === vm.selectedObject.Identifier)) {\r\n // selected object is not in the dataset we need to add it and make sure it stays selected\r\n data.unshift(vm.selectedObject);\r\n vm.selectedObject = data[0];\r\n }\r\n options.success(response.data);\r\n } else {\r\n options.success(response.data);\r\n }\r\n\r\n function addAllObjectsOption() {\r\n let AllObjects = {};\r\n if ($rootScope.UserPreferences.ObjectSearchField === 'AltName') {\r\n AllObjects = { \"AltName\": \"All Objects\", \"Id\": null, \"Identifier\": \"-1\" };\r\n } else {\r\n AllObjects = { \"Name\": \"All Objects\", \"Id\": null, \"Identifier\": \"-1\" };\r\n }\r\n data.unshift(AllObjects);\r\n }\r\n\r\n function success(data) {\r\n vm.objectDataSource = data;\r\n vm.selectedObject = data[0];\r\n vm.objectsDropdownLoading = false;\r\n $scope.runSavedReport();\r\n options.success(response.data);\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n });\r\n } else {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n if ($rootScope.UserPreferences.ObjectSearchField === 'AltName') {\r\n vm.dropdownTemplate = '{{dataItem.AltName}} | {{dataItem.Name}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.ProductId}}';\r\n vm.dataTextField = 'AltName';\r\n } else {\r\n vm.dropdownTemplate = '{{dataItem.Name}} | {{dataItem.AltName}} | {{dataItem.SecurityObjectTypeName}} {{dataItem.ProductId}}';\r\n vm.dataTextField = 'Name';\r\n }\r\n\r\n $scope.objectDropdownOptions = {\r\n template: vm.dropdownTemplate,\r\n filter: \"contains\",\r\n autoBind: false,\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: \"dataItem\",\r\n valueMapper: function (options) {\r\n options.success(helperService.valueMapperFunction(options, vm.objectDataSource, 'Identifier'));\r\n }\r\n },\r\n open: function () {\r\n let filters = this.dataSource._filter;\r\n if (filters) {\r\n this.dataSource.filter({});\r\n }\r\n },\r\n change: function () {\r\n $scope.populateCriteriaModel();\r\n },\r\n height: 325\r\n };\r\n\r\n $scope.applySelectedFilter = function () {\r\n helperService.applyFilterCatchError($scope);\r\n };\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n IsAssigned: { type: \"boolean\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n var data = BuildResponsibilityAccessPostBody.generateBody($scope.ObjectId, vm.selectedResponsibilities, vm.selectedObjectType, vm.selectedObject);\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: $scope.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n\r\n });\r\n\r\n $scope.populateCriteriaModel = function () {\r\n // do not continue if the proper criteria are not loaded\r\n if (!$scope.vm.selectedObject || !$scope.vm.selectedObjectType || $scope.vm.selectedResponsibilities === undefined) {\r\n return;\r\n }\r\n var criteria = [];\r\n\r\n $scope.responsibilities = [];\r\n $scope.securityObject = JSON.parse(JSON.stringify($scope.vm.selectedObject));\r\n $scope.securityObjectType = $scope.vm.selectedObjectType;\r\n\r\n CustomReportServices.convertCriteriaValueToNull($scope.securityObject, \"Identifier\");\r\n\r\n $scope.vm.selectedResponsibilities.forEach(resp => {\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityRoleIdentifier\", 'Role', resp.Name, resp.Identifier));\r\n $scope.responsibilities.push(resp.ID);\r\n });\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObjectType\", 'SecurityObjectType', $scope.securityObjectType.Name, { \"Id\": vm.selectedObjectType.Identifier }));\r\n criteria.push(CustomReportServices.CreateCriteria(\"SecurityObject\", 'SecurityObject', $scope.securityObject.AltName, { \"Id\": $scope.securityObject.Identifier }));\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n if ($scope.vm.selectedObject.Id === \"\") {\r\n $scope.securityObject = {};\r\n }\r\n\r\n if ($scope.isDetailed === true) {\r\n $scope.urlString = apiUrl + 'api/arm/or/places/responsibilityaccess/detailed';\r\n } else if ($scope.isDetailed === false) {\r\n $scope.urlString = apiUrl + 'api/arm/or/places/responsibilityaccess';\r\n }\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n };\r\n\r\n $scope.generateGridWithSelectedValues = function () {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n $scope.populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n };\r\n\r\n if ($scope.isDetailed === false) {\r\n $scope.mainGridColumns = [\r\n { field: \"ResponsibilityName\", title: \"Responsibility\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ResponsibilityID\", title: \"Responsibility ID\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"ResponsibilityKey\", title: \"Responsibility Key\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectAltName\", title: \"User Object Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Object Description\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n\r\n } else if ($scope.isDetailed === true) {\r\n $scope.mainGridColumns = [\r\n { field: \"ResponsibilityName\", title: \"Responsibility\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ResponsibilityID\", title: \"Responsibility ID\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"ResponsibilityKey\", title: \"Responsibility Key\", width: 190, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"UserMenuName\", title: \"User Menu Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"MenuName\", title: \"Menu Name\", width: 180, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"UserSubMenuName\", title: \"User Sub Menu Name\", width: 200, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SubMenuName\", title: \"Sub Menu Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"User Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Object Description\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Prompt\", title: \"Prompt\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"Path\", title: \"Path\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 120, filterable: customBooleanFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.mainGridOptions.sortable = false;\r\n\r\n $scope.mainGridOptions.filterable = false;\r\n }\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, null);\r\n }\r\n\r\n\r\n $scope.deleteFilter = function (id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n };\r\n\r\n $scope.clearAllFilters = function () {\r\n $scope.gridDataSource.filter({});\r\n };\r\n\r\n $scope.saveReportLayoutButton = function () {\r\n CustomReportServices.saveGridLayout($scope, null);\r\n };\r\n\r\n function updateRoleDataSource(roleDataSource, roleSelectedIds) {\r\n $scope.vm.responsibilityDataSource = roleDataSource;\r\n vm.responsibilities = roleSelectedIds;\r\n $scope.populateCriteriaModel();\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata($scope.reportId)\r\n .then(data => {\r\n\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n}\r\n","import angular from 'angular';\r\nimport roleBusinessProcessController from '../Components/roleBusinessProcess/roleBusinessProcess.controller';\r\nimport roleRisksController from '../Components/roleRisks/roleRisks.controller';\r\nimport userBusinessProcessController from '../Components/userBusinessProcess/userBusinessProcess.controller';\r\nimport userRiskController from '../Components/userRisk/userRisk.controller';\r\nimport accessRiskMonitorNetSuiteModule from './armNetSuite.module';\r\nimport accessRiskMonitorFactoriesModule from './accessRiskMonitor.factories.module';\r\nimport D365ArmQuantificationController from '../Components/D365ArmQuantification/D365ArmQuantification.controller';\r\nimport responsibilityRiskController from '../Components/responsibilityRisk/responsibilityRisk.controller';\r\nimport accessRiskMonitorSAPModule from './armSAP.module';\r\nimport accessRiskMonitorSetupModule from './accessRiskMonitor.setup.module';\r\nimport roleAccessController from '../Components/roleAccess/roleAccess.controller';\r\nimport userAccessController from '../Components/userAccess/userAccess.controller';\r\nimport responsibilityAccessController from '../Components/responsibilityAccess/responsibilityAccess.controller';\r\n\r\nexport default angular\r\n .module('app.accessRiskMonitor', [accessRiskMonitorFactoriesModule, accessRiskMonitorNetSuiteModule, accessRiskMonitorSAPModule, accessRiskMonitorSetupModule])\r\n .controller(\"roleBusinessProcessController\", roleBusinessProcessController)\r\n .controller(\"roleRisksController\", roleRisksController)\r\n .controller(\"userBusinessProcessController\", userBusinessProcessController)\r\n .controller(\"userRiskController\", userRiskController)\r\n .controller(\"D365ArmQuantificationController\", D365ArmQuantificationController)\r\n .controller(\"responsibilityRiskController\", responsibilityRiskController)\r\n .controller(\"roleAccessController\", roleAccessController)\r\n .controller(\"userAccessController\", userAccessController)\r\n .controller(\"responsibilityAccessController\", responsibilityAccessController)\r\n .name;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, $timeout, $location, authenticationService, dataService, helperService, myReviewsDataService, delegationItems, reviewHeaderId, reviewType) {\r\n\r\n const vm = this;\r\n vm.userDropdownLoading = false;\r\n vm.helperService = helperService;\r\n vm.cancel = cancel;\r\n vm.reviewDelegation = reviewDelegation;\r\n vm.delegationItems = delegationItems.map(item => { return { ...item } });\r\n vm.selectAllChanged = selectAllChanged;\r\n vm.itemSelectionChanged = itemSelectionChanged;\r\n vm.checkAllSelection = checkAllSelection;\r\n vm.filterItems = filterItems;\r\n vm.itemsFilter = null;\r\n\r\n vm.selectedDelegationItems = [];\r\n\r\n activate();\r\n\r\n function activate() {\r\n getUsers();\r\n vm.delegationItems = $filter('orderBy')(vm.delegationItems, 'UserName');\r\n }\r\n\r\n async function getUsers() {\r\n vm.userDropdownLoading = true;\r\n const currentUser = await authenticationService.getUser();\r\n let response = await dataService.getUsers();\r\n if (!$location.path().includes('AllReviews')) {\r\n // we only want to filter out the current user if not coming from All Reviews\r\n response.data = response.data.filter(user => user.UserID !== currentUser.userId && user.UserID);\r\n }\r\n response.data = $filter('orderBy')(response.data, 'UserLogonName');\r\n response.data = response.data.filter(user => user.Active && user.RestrictDelegateAccessAC === false);\r\n vm.usersDataSource = response.data;\r\n vm.userDropdownLoading = false;\r\n }\r\n\r\n async function reviewDelegation() {\r\n let data = {\r\n ReviewHeaderId: reviewHeaderId,\r\n ReviewItemIds: vm.selectedDelegationItems.map(item => item.ItemId),\r\n DelegatedUserId: vm.DelegatedUserId,\r\n Notes: vm.delegationNotes\r\n };\r\n\r\n try {\r\n vm.delegationPending = new createSpinner();\r\n await myReviewsDataService.delegateReviewItems(reviewHeaderId, reviewType, data);\r\n await helperService.successfulSaveButton(vm.delegationPending);\r\n $uibModalInstance.close();\r\n } catch (err) {\r\n vm.delegationPending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectAllChanged() {\r\n if (vm.allSelected) {\r\n vm.filteredDelegationItems.forEach(item => item.selected = true);\r\n vm.selectedDelegationItems = [ ...vm.selectedDelegationItems, ...vm.filteredDelegationItems ];\r\n } else {\r\n // deselect the items currently being viewed\r\n vm.delegationItems.forEach(item => {\r\n if (vm.filteredDelegationItems.some(filteredItem => filteredItem.ItemId === item.ItemId)) {\r\n item.selected = false\r\n }\r\n });\r\n // update our selected array to only included currently selected items\r\n vm.selectedDelegationItems = vm.delegationItems.filter(item => item.selected);\r\n }\r\n\r\n // remove duplicate items\r\n vm.selectedDelegationItems = vm.selectedDelegationItems.filter((item, index, items) => {\r\n return index === items.findIndex(itemToFind => itemToFind.ItemId === item.ItemId)\r\n });\r\n\r\n checkAllSelection();\r\n }\r\n\r\n function itemSelectionChanged(item) {\r\n if (item.selected) {\r\n vm.selectedDelegationItems.push(item);\r\n } else {\r\n const itemIndex = vm.selectedDelegationItems.findIndex(selectedItem => selectedItem.ItemId === item.ItemId);\r\n vm.selectedDelegationItems.splice(itemIndex, 1);\r\n }\r\n checkAllSelection();\r\n }\r\n\r\n function checkAllSelection() {\r\n $timeout(_ => {\r\n vm.allSelected = vm.filteredDelegationItems.every(item => item.selected);\r\n }, 1);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function filterItems(item) {\r\n const keysToSearch = ['UserName', 'RiskName', 'RiskTypeName', 'RulesetName', 'BusinessProcessName', 'CompanyName', 'ProductName', 'SecurityRoleName', 'SecurityRoleTypeName', 'SecurityObjectAltName', 'SecurityObjectTypeName'];\r\n let foundItem = false;\r\n\r\n if (vm.itemsFilter && vm.itemsFilter !== \"\") {\r\n keysToSearch.forEach((keyField) => {\r\n if (item[keyField] && item[keyField].toLowerCase().includes(vm.itemsFilter.toLowerCase())) {\r\n foundItem = true;\r\n }\r\n });\r\n } else {\r\n foundItem = true;\r\n } \r\n\r\n return foundItem;\r\n };\r\n\r\n}","export default /*@ngInject*/ function (review, $uibModalInstance) {\r\n const vm = this;\r\n\r\n vm.dismiss = dismiss;\r\n\r\n vm.linkedTickets = review.Tickets;\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n \r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, controlLibraryDataService, review, helperService, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n vm.removeFile = removeFile;\r\n vm.downloadFile = downloadFile;\r\n vm.uploadFiles = uploadFiles;\r\n vm.review = review;\r\n vm.cancel = cancel;\r\n\r\n vm.existingFilesDataSource = [];\r\n vm.review.Attachments.forEach(attachment => vm.existingFilesDataSource.push(attachment));\r\n\r\n\r\n async function removeFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n\r\n const index = vm.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.existingFilesDataSource.splice(index, 1);\r\n vm.fileActionPending = false;\r\n } catch {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function downloadFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n const response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n vm.fileActionPending = false;\r\n } catch {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function uploadFiles(files) {\r\n let fd = new FormData();\r\n vm.saving = new createSpinner();\r\n\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"CertReview\");\r\n fd.append(\"DataTypeId\", vm.review.HeaderId);\r\n\r\n await controlLibraryDataService.addAttachments(fd);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close(); \r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function (review, $uibModalInstance, $http, helperService, myReviewsDataService, errorsDataService, configurationDataService, manageDataDataService, controlLibraryDataService, onBehalfOf) {\r\n\r\n const vm = this;\r\n\r\n vm.review = review;\r\n vm.submitReviewCertification = submitReviewCertification;\r\n vm.helperService = helperService;\r\n vm.cancel = cancel;\r\n vm.itemsSelectionChanged = itemsSelectionChanged;\r\n vm.updateTicket = updateTicket;\r\n vm.removeTicket = removeTicket;\r\n vm.tickets = [];\r\n vm.onBehalfOf = onBehalfOf;\r\n vm.showGrid = false;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n if (vm.review.ReviewType === 'SecurityRole' || vm.review.ReviewType === 'Product') {\r\n if (vm.review.ReviewType === 'SecurityRole') {\r\n await checkCompanyConfig();\r\n }\r\n await getItemsForGrid();\r\n createRequestItemsGrid();\r\n } else {\r\n vm.showGrid = false;\r\n }\r\n }\r\n\r\n function updateTicket(ticket) {\r\n vm.tickets.push(ticket);\r\n }\r\n\r\n function removeTicket(providerString) {\r\n vm.tickets = vm.tickets.filter(ticket => ticket.TicketProvider !== providerString);\r\n }\r\n\r\n // Attachments logic\r\n async function uploadFiles(files) {\r\n let fd = new FormData();\r\n\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"CertReview\");\r\n fd.append(\"DataTypeId\", vm.review.HeaderId);\r\n\r\n await controlLibraryDataService.addAttachments(fd);\r\n return files;\r\n }\r\n\r\n async function checkCompanyConfig() {\r\n vm.showCompany = vm.review.IncludeCompanyInReviews;\r\n }\r\n\r\n async function submitReviewCertification(files) {\r\n vm.pleaseWait = new createSpinner();\r\n\r\n let body = {};\r\n body.HeaderId = vm.review.HeaderId;\r\n body.Status = 3;\r\n body.Notes = vm.notes;\r\n body.ImRequestItems = vm.selectedItems;\r\n body.Tickets = vm.tickets;\r\n\r\n try {\r\n if (onBehalfOf) {\r\n body.SubmitReviewOnBehalfOf = true;\r\n await $http.put(`${apiUrl}api/certifications/reviews/${vm.review.HeaderId}/submitonbehalfof`, body);\r\n } else {\r\n await $http.put(`${apiUrl}api/certifications/reviews/${vm.review.HeaderId}/complete`, body);\r\n }\r\n if (files.length > 0) {\r\n await uploadFiles(files);\r\n }\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close();\r\n } catch (err) {\r\n vm.pleaseWait.loadingValue = false;\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n function createRequestItemsGrid() {\r\n let requestItemsGridColumns = [\r\n { selectable: true, width: 50 },\r\n { field: \"UserName\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", filterable: customAutoCompleteFilter },\r\n ];\r\n if (vm.review.ReviewType === 'SecurityRole') {\r\n requestItemsGridColumns = requestItemsGridColumns.concat([\r\n { field: \"SecurityRoleName\", title: \"Role\", filterable: customAutoCompleteFilter },\r\n { field: \"CompanyName\", title: \"Company\", filterable: customAutoCompleteFilter, hidden: !vm.showCompany }\r\n ]);\r\n }\r\n\r\n vm.requestItemsGridOptions = helperService.setNonPageableGridOptions(requestItemsGridColumns, 350);\r\n vm.requestItemsGridOptions.selectable = false;\r\n vm.requestItemsGridOptions.filterable = {\r\n mode: \"row\"\r\n };\r\n\r\n vm.requestItemsGridDataSource = new kendo.data.DataSource({\r\n schema: {\r\n model: {\r\n id: \"ItemId\"\r\n }\r\n },\r\n transport: {\r\n read: options => {\r\n options.success(vm.gridItems);\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n async function getItemsForGrid() {\r\n vm.loadingGridItems = true;\r\n let response = await myReviewsDataService.getReviewDetails(vm.review.ReviewType, vm.review.HeaderId, \"ReviewType\");\r\n response = response.reduce((acc, curr) => {\r\n return acc.concat(curr.Items);\r\n }, []);\r\n response = response.filter(detail => detail.StatusId === 2);\r\n const productsArray = [...new Set(response.map(item => item.ProductId))];\r\n for (let i = 0; i < productsArray.length; i++) {\r\n let productConfig = await manageDataDataService.getConfigurationByProductId(productsArray[i]);\r\n const createImRequestSetting = productConfig.data.find(config => config.Name === 'IM_CreateRequestsFromCertReviews');\r\n if (!createImRequestSetting || createImRequestSetting.Value === '0') {\r\n response = response.filter(item => item.ProductId !== productsArray[i]);\r\n }\r\n }\r\n if (response.length > 0) {\r\n vm.showGrid = true;\r\n }\r\n vm.gridItems = response;\r\n vm.loadingGridItems = false;\r\n }\r\n\r\n function itemsSelectionChanged() {\r\n vm.selectedItems = vm.requestItemsGrid.selectedKeyNames();\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport reviewDelegationModalController from \"../MyReviews/DelegationModal/reviewDelegationModal.controller\";\r\nimport ticketModalController from \"../MyReviews/TicketModal/ticketModal.controller\";\r\nimport attachmentsModalController from \"./AttachmentsModal/attachmentsModal.controller\";\r\nimport submitReviewModalController from \"../MyReviews/SubmitReviewModal/submitReviewModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (accessCertificationsService, $scope, configurationDataService, helperService, certificationsAllReviewDataService, myReviewsDataService, $uibModal, $filter, $rootScope, archiveToastr) {\r\n\r\n const vm = this;\r\n\r\n vm.selectedReviewChanged = selectedReviewChanged;\r\n vm.selectedReviewerChanged = selectedReviewerChanged;\r\n vm.exportReview = exportReview;\r\n vm.refreshReviewSheduleExecution = refreshReviewSheduleExecution;\r\n vm.refreshReview = refreshReview;\r\n vm.deleteReview = deleteReview;\r\n vm.generateFailedImRequests = generateFailedImRequests;\r\n vm.downloadRejectedItemValidation = downloadRejectedItemValidation;\r\n vm.setSortAndFilterOptionsForRoleContentType = setSortAndFilterOptionsForRoleContentType;\r\n vm.helperService = helperService;\r\n vm.reopenReview = reopenReview;\r\n\r\n $scope.$on('RefreshReviewScheduleExecution', () => processRefresh());\r\n $scope.$on('RefreshSingleReview', () => {\r\n getReviews();\r\n getReviewersList(vm.selectedReview.Id);\r\n if (vm.selectedReviewer) {\r\n vm.loadingAssignmentItems = true;\r\n getReviewDetails(vm.selectedReviewer);\r\n }\r\n });\r\n\r\n activate();\r\n\r\n vm.itemsRadioFilter = 'All';\r\n\r\n vm.reviewMenuOptions = [\r\n {\r\n text: review => {\r\n switch (review.object.ReviewType) {\r\n case 'SecurityRole':\r\n return 'Download Rejected Role Item Validation';\r\n break;\r\n case 'Product':\r\n return 'Download Rejected Product Item Validation';\r\n break;\r\n case 'BusinessProcess':\r\n return 'Download Rejected Business Process Item Validation';\r\n break;\r\n case 'Risk':\r\n return 'Download Rejected Risk Item Validation';\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n click: item => {\r\n downloadRejectedItemValidation(item.object);\r\n },\r\n displayed: review => review.object.ReviewType !== 'SecurityRoleContent'\r\n },\r\n {\r\n text: 'Export',\r\n click: item => {\r\n vm.exportReview(item.object);\r\n }\r\n },\r\n {\r\n text: 'Refresh',\r\n click: item => {\r\n vm.refreshReviewSheduleExecution(item.object);\r\n },\r\n displayed: modelValue => {\r\n const { Status } = modelValue.object;\r\n return Status === 'NotStarted' || Status === 'InProgress';\r\n }\r\n },\r\n {\r\n text: 'Send \"Review is Ready\" Notifications',\r\n click: item => {\r\n sendEmailNotifications(item.object, 4);\r\n },\r\n displayed: review => {\r\n const { Status } = review.object;\r\n return Status === 'NotStarted';\r\n }\r\n },\r\n {\r\n text: 'Send Reminder Notifications',\r\n click: item => {\r\n sendEmailNotifications(item.object, 1);\r\n },\r\n displayed: review => {\r\n const { Status } = review.object;\r\n return Status === 'NotStarted' || Status === 'InProgress';\r\n }\r\n },\r\n {\r\n text: 'Send Overdue Notifications',\r\n click: item => {\r\n sendEmailNotifications(item.object, 3);\r\n },\r\n displayed: review => {\r\n const { Status } = review.object;\r\n return Status === 'Overdue';\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteReview(item.object);\r\n }\r\n }\r\n ];\r\n\r\n vm.reviewerMenuOptions = [\r\n {\r\n text: 'Delegate',\r\n click: async item => {\r\n openDelegateModal(item.object);\r\n },\r\n displayed: item => {\r\n return vm.checkForDelegateAllReviews && (item.object.TotalItems - item.object.CompletedItems !== 0);\r\n }\r\n },\r\n {\r\n text: 'Refresh',\r\n click: item => {\r\n item.object.Id = item.object.HeaderId;\r\n vm.refreshReview(item.object);\r\n },\r\n displayed: modelValue => {\r\n return $rootScope.UserSecurityList['9401'];\r\n }\r\n },\r\n {\r\n text: 'Reopen',\r\n click: item => {\r\n item.object.Id = item.object.HeaderId;\r\n vm.reopenReview(item.object);\r\n },\r\n displayed: item => {\r\n return $rootScope.UserSecurityList['9403']\r\n && item.object.CanReopen\r\n }\r\n },\r\n {\r\n text: 'Submit',\r\n click: async item => {\r\n openSubmitReviewModal(item.object);\r\n },\r\n displayed: item => {\r\n return vm.checkForSubmitOnBehalfOf\r\n && (item.object.TotalItems - (item.object.CompletedItems + item.object.ItemsCompletedByOthers)) === 0\r\n && (item.object.Status === 'InProgress' || item.object.Status === 'Overdue');\r\n }\r\n },\r\n {\r\n text: 'View Tickets',\r\n click: item => {\r\n openTicketModal(item.object);\r\n },\r\n displayed: item => {\r\n return item.object.Tickets.length > 0;\r\n }\r\n },\r\n {\r\n text: 'View Attachments',\r\n click: item => {\r\n openAttachmentsModal(item.object);\r\n },\r\n displayed: item => {\r\n return item.object.Attachments.length > 0;\r\n }\r\n }\r\n ];\r\n\r\n async function activate() {\r\n await getReviews();\r\n await checkSecurityObjectInformationToggle();\r\n await checkForDelegateAllReviews();\r\n await checkForSubmitOnBehalfOf();\r\n vm.userDisplay = await getUserDisplay();\r\n\r\n vm.reviewAssignmentTiles = accessCertificationsService.getReviewTypes();\r\n }\r\n\r\n async function reopenReview(item) {\r\n await swal(\r\n helperService.areYouSureParams(\r\n 'Reopen Review',\r\n 'Are you sure you want to reopen this completed review? If the corresponding review schedule execution is also closed, it will be reopened alongside the review.',\r\n 'Reopen'\r\n )\r\n );\r\n await certificationsAllReviewDataService.reopenReview(item.Id);\r\n getReviews();\r\n getReviewersList(vm.selectedReview.Id);\r\n if (vm.selectedReviewer) {\r\n vm.loadingAssignmentItems = true;\r\n getReviewDetails(vm.selectedReviewer);\r\n }\r\n }\r\n\r\n async function processRefresh() {\r\n if (vm.selectedReview) {\r\n await getReviewersList(vm.selectedReview.Id);\r\n\r\n if (vm.selectedReviewer) {\r\n getReviewDetails(vm.selectedReviewer);\r\n }\r\n }\r\n }\r\n\r\n async function getUserDisplay() {\r\n try {\r\n return await helperService.getConfigurationValue('Cert_UserDisplayField');\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n }\r\n\r\n async function getReviews() {\r\n let response = await certificationsAllReviewDataService.getReviews();\r\n vm.reviewsDataSource = response.data;\r\n }\r\n\r\n async function checkSecurityObjectInformationToggle() {\r\n let response = await configurationDataService.getConfigurationValues();\r\n var config = {};\r\n\r\n response.data.forEach(row => {\r\n config[row.Name] = row.Value;\r\n });\r\n\r\n vm.showBPObject = config['Cert_BusinessProcessObjects'];\r\n vm.showRoleContentBPObject = config['Cert_RoleContentBusinessProcessObjects'];\r\n }\r\n\r\n async function downloadRejectedItemValidation(item) {\r\n await certificationsAllReviewDataService.downloadRejectedItemValidation(item.Id);\r\n }\r\n\r\n async function sendEmailNotifications(item, notificationType) {\r\n let postBody = {\r\n ReviewScheduleId: item.Id,\r\n ReviewScheduleNotificationType: notificationType\r\n };\r\n try {\r\n await certificationsAllReviewDataService.sendEmailNotifications(item.Id, postBody);\r\n let archiveObject = {\r\n correlationId: 0,\r\n type: null,\r\n message: 'Your notification has been sent.',\r\n title: 'Complete',\r\n status: 'Success',\r\n response: null,\r\n options: {},\r\n };\r\n await archiveToastr.notifyArchive(archiveObject);\r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n\r\n async function exportReview(item) {\r\n var postData = {\r\n \"PreferredTimeZone\": $rootScope.applicationTimeZone\r\n };\r\n await certificationsAllReviewDataService.exportReview(item.Id, postData);\r\n }\r\n\r\n async function checkForDelegateAllReviews() {\r\n vm.checkForDelegateAllReviews = await certificationsAllReviewDataService.checkForDelegateAllReviews('Delegate All Reviews');\r\n }\r\n\r\n async function checkForSubmitOnBehalfOf() {\r\n vm.checkForSubmitOnBehalfOf = await certificationsAllReviewDataService.checkForSubmitOnBehalfOf('Submit Review On Behalf Of');\r\n }\r\n\r\n async function openDelegateModal(delegationContext) {\r\n let delegationItems = [];\r\n let response = await myReviewsDataService.getReviewDetails(delegationContext.ReviewType, delegationContext.HeaderId, \"ReviewType\");\r\n response = response.reduce((acc, curr) => {\r\n if (curr.Items) {\r\n return acc.concat(curr.Items);\r\n } else {\r\n return acc.concat(curr.items);\r\n }\r\n }, []);\r\n delegationItems = response.filter(detail => detail.StatusId === null);\r\n\r\n let delegateModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/MyReviews/DelegationModal/reviewDelegationModal.html',\r\n controller: reviewDelegationModalController,\r\n controllerAs: 'rdmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n delegationItems: () => delegationItems,\r\n reviewHeaderId: () => delegationContext.HeaderId,\r\n reviewType: () => delegationContext.ReviewType\r\n }\r\n });\r\n\r\n try {\r\n await delegateModal.result;\r\n activate();\r\n } catch { return; }\r\n }\r\n\r\n async function openSubmitReviewModal(review, vm) {\r\n let reviewModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/SubmitReviewModal/submitReviewModal.html',\r\n controller: submitReviewModalController,\r\n controllerAs: 'srmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n review: () => review,\r\n onBehalfOf: () => true\r\n }\r\n });\r\n\r\n try {\r\n await reviewModal.result;\r\n if (vm.selectedReview.HeaderId === review.HeaderId) {\r\n vm.selectedReview = null;\r\n vm.selectedGroup = null;\r\n vm.selectedUser = null;\r\n }\r\n activate();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function refreshReviewSheduleExecution(item) {\r\n try {\r\n await swal(\r\n helperService.areYouSureParams(\r\n 'Refresh Review',\r\n 'Are you sure you want to refresh the review items for this review? This has the potential of adding and removing review items.',\r\n 'Refresh'\r\n )\r\n );\r\n await certificationsAllReviewDataService.refreshReviewSheduleExecution(item.Id);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function refreshReview(item) {\r\n try {\r\n await swal(\r\n helperService.areYouSureParams(\r\n 'Refresh Review',\r\n 'Are you sure you want to refresh the review items for this review? This has the potential of adding and removing review items.',\r\n 'Refresh'\r\n )\r\n );\r\n await certificationsAllReviewDataService.refreshReview(item.Id);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteReview(item) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Review', 'Are you sure you want to delete this Review and all releated review items?', 'Delete'));\r\n await certificationsAllReviewDataService.deleteReview(item.Id);\r\n getReviews();\r\n if (vm.selectedReview === item) {\r\n vm.selectedReview = null;\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function selectedReviewChanged(selectedReview) {\r\n if (selectedReview && selectedReview !== vm.selectedReview) {\r\n vm.selectedReview = selectedReview;\r\n\r\n switch (vm.selectedReview.ReviewType) {\r\n case \"Risk\":\r\n vm.reviewDetailsSort = [\"RiskName\", \"UserName\"];\r\n vm.reviewDetailsThirdColumnFilter = ['RiskName', 'UserName', 'Company', 'CompanyIds', 'StatusName', 'Notes'];\r\n break;\r\n case \"BusinessProcess\":\r\n vm.reviewDetailsSort = [\"BusinessProcessName\", \"UserName\"];\r\n vm.reviewDetailsThirdColumnFilter = ['BusinessProcessName', 'UserName', 'CompanyName', 'CompanyId', 'StatusName', 'Notes'];\r\n break;\r\n case \"Product\":\r\n vm.reviewDetailsSort = [\"ProductName\", \"UserName\"];\r\n vm.reviewDetailsThirdColumnFilter = ['ProductName', 'UserName', 'CompanyName', 'CompanyId', 'StatusName', 'Notes'];\r\n break;\r\n case \"SecurityRole\":\r\n vm.reviewDetailsSort = [\"SecurityRoleName\", \"UserName\"];\r\n vm.reviewDetailsThirdColumnFilter = ['SecurityRoleName', 'UserName', 'CompanyName', 'CompanyId', 'StatusName', 'Notes'];\r\n break;\r\n case \"SecurityRoleContent\":\r\n // we don't know our security role content type so we can't set sorting or filtering options yet\r\n vm.reviewDetailsSort = [];\r\n vm.reviewDetailsThirdColumnFilter = [];\r\n break;\r\n default:\r\n break;\r\n }\r\n vm.reviewId = selectedReview.Id;\r\n await getReviewersList(selectedReview.Id);\r\n vm.reviewItemsDataSource = null;\r\n if (vm.reviewersDataSource.length === 1) {\r\n vm.selectedReviewerChanged(vm.reviewersDataSource[0]);\r\n } else {\r\n vm.selectedReviewer = null;\r\n }\r\n }\r\n }\r\n\r\n async function getReviewersList(reviewId) {\r\n let response = await certificationsAllReviewDataService.getReviewersByReviewId(reviewId);\r\n vm.reviewersDataSource = response.data;\r\n }\r\n\r\n async function selectedReviewerChanged(selectedItem) {\r\n if (selectedItem && selectedItem !== vm.selectedReviewer) {\r\n vm.allItems = null;\r\n vm.currentItemsPage = 1;\r\n vm.itemsRadioFilter = 'All';\r\n vm.selectedReviewer = selectedItem;\r\n vm.loadingAssignmentItems = true;\r\n getReviewDetails(selectedItem);\r\n }\r\n }\r\n\r\n async function getReviewDetails(reviewer) {\r\n let response = await myReviewsDataService.getReviewDetails(reviewer.ReviewType, reviewer.HeaderId, 'ReviewType');\r\n if (response.length) {\r\n response = response.reduce((acc, curr) => {\r\n return reviewer.ReviewType === 'SecurityRoleContent' ? acc.concat(curr.items) : acc.concat(curr.Items);\r\n }, []);\r\n vm.securityRoleContentTypeFilter = response[0].RoleContentType;\r\n vm.securityRoleContentTypeFilterOptions = response.map(item => item.RoleContentType).unique();\r\n vm.securityRoleContentTypeFilterOptions = $filter('orderBy')(vm.securityRoleContentTypeFilterOptions);\r\n setSortAndFilterOptionsForRoleContentType(vm.securityRoleContentTypeFilter);\r\n }\r\n vm.reviewItemsDataSource = response;\r\n vm.reviewItemsDataSource.forEach(u => u.userDisplay = u[vm.userDisplay]);\r\n vm.loadingAssignmentItems = false;\r\n }\r\n\r\n async function generateFailedImRequests(reviewId) {\r\n await certificationsAllReviewDataService.reprocessImRequests(reviewId);\r\n }\r\n\r\n function setSortAndFilterOptionsForRoleContentType(securityRoleContentType) {\r\n switch (securityRoleContentType) {\r\n case 'BusinessProcess':\r\n vm.reviewDetailsSort = ['BusinessProcessName'];\r\n vm.reviewDetailsThirdColumnFilter = ['BusinessProcessName', 'SecurityRoleName', 'RulesetName', 'SecurityObjectAltName', 'SecurityObjectName', 'SecurityObjectTypeName', 'Notes'];\r\n break;\r\n case 'Risk':\r\n vm.reviewDetailsSort = ['RiskName'];\r\n vm.reviewDetailsThirdColumnFilter = ['RiskName', 'RulesetName', 'SecurityRoleName', 'Notes'];\r\n break;\r\n case 'RoleAccess':\r\n vm.reviewDetailsSort = ['SecurityObjectAltName'];\r\n vm.reviewDetailsThirdColumnFilter = ['SecurityObjectAltName', 'SecurityRoleName', 'SecurityObjectName', 'AccessTypeName', 'AccessLevelName', 'Notes'];\r\n break;\r\n default:\r\n return;\r\n\r\n }\r\n }\r\n\r\n function openTicketModal(review) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/MyReviews/TicketModal/ticketModal.tmpl.html',\r\n controller: ticketModalController,\r\n controllerAs: 'tmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n review: () => review\r\n }\r\n });\r\n }\r\n\r\n async function openAttachmentsModal(review) {\r\n const attachmentsModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/AllReviews/AttachmentsModal/attachmentsModal.tmpl.html',\r\n controller: attachmentsModalController,\r\n controllerAs: 'amvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n review: () => review\r\n }\r\n });\r\n\r\n await attachmentsModal.result;\r\n getReviewersList(vm.reviewId);\r\n\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService, authenticationService, dataService) {\r\n var service = {\r\n getReviews,\r\n getReviewersByReviewId,\r\n checkForDelegateAllReviews,\r\n checkForSubmitOnBehalfOf,\r\n refreshReviewSheduleExecution,\r\n refreshReview,\r\n downloadRejectedItemValidation,\r\n sendEmailNotifications,\r\n exportReview,\r\n deleteReview,\r\n reprocessImRequests,\r\n reopenReview\r\n };\r\n\r\n return service;\r\n\r\n async function getReviews() {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/reviewscheduleexecutions`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getReviewersByReviewId(reviewId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/reviewscheduleexecutions/${reviewId}/reviews`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function downloadRejectedItemValidation(id) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviews/${id}/items/validation/export`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function sendEmailNotifications(id, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviewscheduleexecutions/${id}/sendnotifications`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function checkForDelegateAllReviews(delegateAllReviews) {\r\n const user = await authenticationService.getUser();\r\n let response = await dataService.getClaims(user.userId);\r\n let data = response.data;\r\n\r\n return await data.some(data => data.Value === delegateAllReviews);\r\n }\r\n\r\n async function checkForSubmitOnBehalfOf(submitOnBehalfOf) {\r\n const user = await authenticationService.getUser();\r\n let response = await dataService.getClaims(user.userId);\r\n let data = response.data;\r\n\r\n return await data.some(data => data.Value === submitOnBehalfOf);\r\n }\r\n\r\n async function refreshReviewSheduleExecution(reviewId) {\r\n try {\r\n await $http.post(`${apiUrl}api/certifications/reviewscheduleexecutions/${reviewId}/refresh`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function refreshReview(reviewId) {\r\n try {\r\n await $http.post(`${apiUrl}/api/certifications/reviews/${reviewId}/refresh`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function deleteReview(reviewId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/certifications/reviewscheduleexecutions/${reviewId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function exportReview(reviewId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviewscheduleexecutions/${reviewId}/export`, data)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function reprocessImRequests(reviewId) {\r\n try {\r\n return await $http.put(`${apiUrl}api/certifications/reviews/${reviewId}/reprocessim`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function reopenReview(reviewId) {\r\n try {\r\n return await $http.put(`${apiUrl}api/certifications/reviews/${reviewId}/reopen`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getTeamMembers,\r\n getTeamMembersByProduct,\r\n addTeamMember,\r\n removeTeamMember\r\n };\r\n\r\n return service;\r\n\r\n async function getTeamMembers(teamTypeUrl) {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/teammembers/${teamTypeUrl}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getTeamMembersByProduct(productId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/teammembers/security/product/${productId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addTeamMember(newTeamMemberInfo) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/teammembers`, newTeamMemberInfo);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeTeamMember(memberId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/certifications/teammembers/${memberId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getReviewTypes,\r\n exportReviews,\r\n addReviewAssignment,\r\n importReviews,\r\n deleteReview\r\n };\r\n\r\n return service;\r\n\r\n async function getReviewTypes() {\r\n try {\r\n return await $http.get(apiUrl + 'api/certifications/reviewtypes');\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function exportReviews() {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/reviewassignments/export`, { responseType: 'blob' });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addReviewAssignment(data) {\r\n try {\r\n return await $http.post(apiUrl + 'api/certifications/reviewassignments', data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importReviews(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/certifications/reviewassignments/import`, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteReview(reviewId) {\r\n try {\r\n return await $http.delete(apiUrl + 'api/certifications/reviewassignments/' + reviewId);\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getProfile,\r\n getWorkdayProfile,\r\n getSecurityRoleDetails,\r\n getAccess,\r\n getCatalog\r\n };\r\n\r\n return service;\r\n\r\n async function getProfile(identifier) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/universal/securityroles/${identifier}`);\r\n return res.data;\r\n } catch(err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getWorkdayProfile(securityRoleId) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/universal/wd/securityrole/${securityRoleId}`);\r\n return res.data;\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSecurityRoleDetails(roleId, productId) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/universal/securityroles/${roleId}/product/${productId}`);\r\n return res.data;\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAccess(identifier, data, page, pageSize) {\r\n try {\r\n const res = await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/universal/securityroles/${identifier}/access`,\r\n data: data,\r\n params: { 'pagesize': pageSize, 'page': page }\r\n });\r\n return res;\r\n } catch(err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getCatalog(reportId, data, page, pageSize) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/core/reports/${reportId}/execute`,\r\n data: data,\r\n params: { 'pagesize': pageSize, 'page': page }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getReviews,\r\n getReviewDetails,\r\n updateItemStatus,\r\n delegateReviewItems,\r\n exportReview\r\n };\r\n\r\n return service;\r\n\r\n async function getReviews() {\r\n try {\r\n return await $http.get(apiUrl + 'api/certifications/reviews');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n\r\n }\r\n\r\n async function getReviewDetails(reviewType, headerId, groupByType) {\r\n try {\r\n let response = await $http.get(apiUrl + `api/certifications/reviews/${headerId}/${reviewType}/items/${groupByType}`);\r\n return response.data;\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateItemStatus(headerId, selectedTile, data) {\r\n try {\r\n return await $http.put(apiUrl + `api/certifications/reviews/${headerId}/${selectedTile}/items`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function delegateReviewItems(reviewHeaderId, reviewType, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/certifications/reviews/${reviewHeaderId}/${reviewType}/items/delegate`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportReview(reviewId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviews/${reviewId}/export`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getRoutingCriteria,\r\n postRoutingCriteria,\r\n deleteRoutingCriteria,\r\n getSchedules,\r\n getInstances,\r\n getInstanceAssignments,\r\n createSchedule,\r\n createInstance,\r\n cloneInstance,\r\n updateSchedule,\r\n updateInstance,\r\n deleteInstance,\r\n deleteInstanceSchedule,\r\n deleteReviewInstanceAssignment,\r\n runSchedule\r\n };\r\n\r\n return service;\r\n\r\n async function getRoutingCriteria(reviewAssignmentId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/reviewassignments/${reviewAssignmentId}/routing-criteria`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function postRoutingCriteria(reviewAssignmentId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/reviewassignments/${reviewAssignmentId}/routing-criteria`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteRoutingCriteria(reviewAssignmentId, id) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/reviewassignments/${reviewAssignmentId}/routing-criteria/${id}`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSchedules() {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/reviewschedules`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getInstances() {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/reviewinstances`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getInstanceAssignments(instanceId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/certifications/reviewassignments/reviewinstance/${instanceId}`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createSchedule(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviewschedules`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createInstance(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviewinstances`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function cloneInstance(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviewinstances/clone`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateSchedule(scheduleId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/certifications/reviewschedules/${scheduleId}`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateInstance(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/certifications/reviewInstances/${data.Id}`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteInstance(instanceId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/certifications/reviewInstances/${instanceId}`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteInstanceSchedule(scheduleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/certifications/reviewschedules/${scheduleId}`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteReviewInstanceAssignment(assignmentId) {\r\n try {\r\n return await $http.delete(apiUrl + 'api/certifications/reviewassignments/' + assignmentId);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function runSchedule(scheduleId) {\r\n try {\r\n return await $http.post(`${apiUrl}api/certifications/reviewschedules/${scheduleId}/run`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}","import angular from 'angular';\r\nimport certificationsAllReviewDataServiceFactory from '../Components/Certifications/AllReviews/certificationsAllReviewDataService.factory';\r\nimport accessCertificationsService from '../Shared/Services/accessCertifications.service';\r\nimport notificationTeamsServiceFactory from '../Components/Certifications/notificationTeams/notificationTeamsService.factory';\r\nimport certificationsReviewAssignmentsDataServiceFactory from '../Components/Certifications/reviewSchedules/certificationsReviewAssignmentsDataService.factory';\r\nimport roleSecurityProfileDataServiceFactory from '../Shared/Components/roleSecurityProfile/roleSecurityProfileDataService.factory';\r\nimport myReviewsDataServiceFactory from '../Components/Certifications/MyReviews/myReviewsDataService.factory';\r\nimport reviewSchedulesDataServiceFactory from '../Components/Certifications/reviewSchedules/reviewSchedulesDataService.factory';\r\n\r\n\r\nexport default angular\r\n .module('app.accessCertifications.factories', [])\r\n .factory('certificationsAllReviewDataService', certificationsAllReviewDataServiceFactory)\r\n .factory('accessCertificationsService', accessCertificationsService)\r\n .factory('notificationTeamsDataService', notificationTeamsServiceFactory)\r\n .factory('reviewAssignmentsDataService', certificationsReviewAssignmentsDataServiceFactory)\r\n .factory('roleSecurityProfileDataService', roleSecurityProfileDataServiceFactory)\r\n .factory('myReviewsDataService', myReviewsDataServiceFactory)\r\n .factory('reviewSchedulesDataService', reviewSchedulesDataServiceFactory)\r\n .name;","export default function () {\r\n const service = {\r\n getReviewTypes\r\n };\r\n return service;\r\n\r\n function getReviewTypes() {\r\n return [\r\n { Name: \"Risk\", Id: \"Risk\", Background: \"review-assignment_Risk\", Icon: \"icons8-risk\" },\r\n { Name: \"Security Role\", Id: \"SecurityRole\", Background: \"review-assignment_Roles\", Icon: \"icons8-user-avatar\" },\r\n { Name: \"Security Role Content\", Id: \"SecurityRoleContent\", Background: \"review-assignment_Roles\", Icon: \"icons8-user-menu-male\" },\r\n { Name: \"Business Process\", Id: \"BusinessProcess\", Background: \"review-assignment_BusinessProcess\", Icon: \"icons8-warning-shield\" },\r\n { Name: \"Product\", Id: \"Product\", Background: \"review-assignment_Products\", Icon: \"icons8-globe\" },\r\n { Name: \"Manager\", Id: \"Manager\", Background: \"review-assignment_Manager\", Icon: \"icons8-briefcase\" }\r\n ];\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, reviewItem, notesRequired, allowCancel, helperService) {\r\n const vm = this;\r\n \r\n vm.reviewItem = reviewItem ? { ...reviewItem } : null;\r\n vm.notesRequired = notesRequired;\r\n vm.allowCancel = allowCancel;\r\n\r\n vm.saveNotes = saveNotes;\r\n vm.dismiss = dismiss;\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n async function saveNotes() {\r\n vm.savingNotes = new createSpinner();\r\n\r\n await helperService.successfulSaveButton(vm.savingNotes);\r\n $uibModalInstance.close(vm.reviewItem.Notes);\r\n }\r\n\r\n}","import submitReviewModalController from \"./SubmitReviewModal/submitReviewModal.controller\";\r\nimport reviewDelegationModalController from \"./DelegationModal/reviewDelegationModal.controller\";\r\nimport ticketModalController from \"./TicketModal/ticketModal.controller\";\r\nimport notesModalController from \"./notesModal/notesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $scope, $rootScope, $timeout, $window, configurationDataService, $location, $uibModal, accessCertificationsService, authenticationService, emailNavigationService, helperService, errorsDataService, myReviewsDataService) {\r\n\r\n const vm = this;\r\n const tenantInlocalStorage = angular.fromJson(localStorage.getItem(\"selectedTenant\"));\r\n\r\n vm.pageParams = $location.search();\r\n vm.groupBy = '';\r\n vm.reviewDetailsSort = [];\r\n vm.selectedReviewGroups = [];\r\n vm.selectedGroupingMethod = null;\r\n vm.selectedReview = null;\r\n vm.selectedUser = null;\r\n vm.selectedGroup = null;\r\n vm.openNotesModal = openNotesModal;\r\n vm.helperService = helperService;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Export',\r\n click: item => {\r\n exportReview(item.review);\r\n }\r\n },\r\n {\r\n text: 'Delegate',\r\n click: item => {\r\n openDelegateModal(item.review);\r\n },\r\n displayed: item => {\r\n return (item.review.TotalItems - item.review.CompletedItems) !== 0;\r\n }\r\n },\r\n {\r\n text: 'View Tickets',\r\n click: item => {\r\n openTicketModal(item.review, 'View');\r\n },\r\n displayed: item => {\r\n return item.review.Tickets.length > 0;\r\n }\r\n }\r\n ];\r\n\r\n vm.groupMenuOptions = [\r\n {\r\n text: 'Delegate',\r\n click: item => {\r\n openDelegateModal(item.object);\r\n }\r\n }\r\n ];\r\n\r\n vm.selectUser = selectUser;\r\n vm.selectedGroupChanged = selectedGroupChanged;\r\n vm.setupGroupByList = setupGroupByList;\r\n vm.getReviews = getReviews;\r\n vm.selectReview = selectReview;\r\n vm.toggleReviews = toggleReviews;\r\n vm.resetReviews = resetReviews;\r\n vm.openSubmitReviewModal = openSubmitReviewModal;\r\n vm.changeItemStatus = changeItemStatus;\r\n vm.updateAllItemStatuses = updateAllItemStatuses;\r\n vm.updateItemNote = updateItemNote;\r\n vm.changeTypeItemStatus = changeTypeItemStatus;\r\n vm.openDelegateModal = openDelegateModal;\r\n vm.updateReviewCounts = updateReviewCounts\r\n vm.changeSearchFilter = changeSearchFilter;\r\n vm.radioFilterChanged = radioFilterChanged;\r\n\r\n activate();\r\n\r\n $scope.$on('DelegateReviewItems', (event, args) => activate());\r\n\r\n async function activate() {\r\n vm.currentUser = await authenticationService.getUser();\r\n vm.selfReviewConfigValue = await helperService.getConfigurationValue('Cert_SelfReview');\r\n vm.showAllCompaniesToggle = Number(await helperService.getConfigurationValue('Cert_AllowFilterByAllCompanies'));\r\n vm.username = vm.currentUser.fullName;\r\n vm.userDisplay = await getUserDisplay();\r\n await redirectIfNeeded();\r\n await getReviewTypes();\r\n await getReviews();\r\n setupMyReviewsListview();\r\n vm.groupBy = 'type';\r\n if (vm.pageParams.InstanceId) {\r\n selectReview(vm.reviews.find(review => review.ReviewInstanceId === vm.pageParams.InstanceId));\r\n }\r\n }\r\n\r\n function redirectIfNeeded() {\r\n if (vm.pageParams.tenantid) {\r\n if (vm.pageParams.tenantid === tenantInlocalStorage.ID) {\r\n vm.sufficientSecurityAccess = true;\r\n return;\r\n }\r\n else {\r\n findTenantFromEmail();\r\n }\r\n }\r\n else {\r\n vm.sufficientSecurityAccess = true;\r\n return;\r\n }\r\n }\r\n\r\n async function findTenantFromEmail() {\r\n emailNavigationService.availableTenants(vm.currentUser.userId)\r\n .then(response => {\r\n\r\n let validTenant = response.data.find(tenant => {\r\n return tenant.ID === vm.pageParams.tenantid;\r\n });\r\n\r\n if (validTenant) {\r\n vm.redirectToTenant = true;\r\n localStorage.setItem(\"selectedTenant\", JSON.stringify(angular.copy(validTenant)));\r\n $window.location.reload();\r\n\r\n } else {\r\n vm.insufficientSecurityAccess = true;\r\n }\r\n\r\n });\r\n }\r\n\r\n function getReviewTypes() {\r\n vm.reviewAssignmentTiles = accessCertificationsService.getReviewTypes();\r\n }\r\n\r\n async function getReviews() {\r\n try {\r\n const reviews = await myReviewsDataService.getReviews();\r\n reviews.data.forEach(review => {\r\n const match = vm.reviewAssignmentTiles.find(tile => tile.Id === review.ReviewType);\r\n review.Tile = match;\r\n });\r\n vm.reviews = reviews.data;\r\n\r\n } catch (err) {\r\n return;\r\n }\r\n }\r\n\r\n async function getUserDisplay() {\r\n try {\r\n return await helperService.getConfigurationValue('Cert_UserDisplayField');\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n }\r\n\r\n function selectReview(review) {\r\n\r\n if (review === vm.selectedReview || review.Status === 'Processing') return;\r\n\r\n vm.selectedGroup = null;\r\n vm.selectedReviewGroups = [];\r\n vm.selectedUser = null;\r\n\r\n if (review.ReviewType === vm.selectedReview) {\r\n vm.selectedReview = null;\r\n } else {\r\n switch (review.ReviewType) {\r\n case \"Risk\":\r\n vm.reviewTypeName = \"Risks\";\r\n vm.reviewDetailsFilter = \"RiskName\";\r\n vm.reviewDetailsSort = [\"RiskName\", \"UserName\"];\r\n break;\r\n case \"BusinessProcess\":\r\n vm.reviewTypeName = \"Business Processes\";\r\n vm.reviewDetailsFilter = \"BusinessProcessName\";\r\n vm.reviewDetailsSort = [\"BusinessProcessName\", \"UserName\"];\r\n break;\r\n case \"Product\":\r\n vm.reviewTypeName = \"Products\";\r\n vm.reviewDetailsFilter = \"ProductName\";\r\n vm.reviewDetailsSort = [\"ProductName\", \"UserName\"];\r\n break;\r\n case \"SecurityRole\":\r\n case \"SecurityRoleContent\":\r\n vm.reviewTypeName = \"Roles\";\r\n vm.reviewDetailsFilter = \"SecurityRoleName\";\r\n vm.reviewDetailsSort = [\"SecurityRoleName\", \"UserName\"];\r\n break;\r\n }\r\n }\r\n vm.selectedReview = review;\r\n setupGroupByListview();\r\n }\r\n\r\n\r\n function resetReviews() {\r\n vm.selectedGroup = null;\r\n vm.selectedTile = null;\r\n }\r\n\r\n // my reviews list-view\r\n function setupMyReviewsListview() {\r\n setupToggle();\r\n toggleReviews('0');\r\n }\r\n\r\n function setupToggle() {\r\n if (vm.reviews.length > 0) {\r\n if (vm.reviews.some(review => review.Status === 'Completed' || review.Status === 'Incomplete')) {\r\n vm.showToggle = true;\r\n } else {\r\n vm.showToggle = false;\r\n }\r\n }\r\n }\r\n\r\n function toggleReviews(val) {\r\n if (val !== '1') {\r\n vm.filteredReviews = vm.reviews.filter(review => review.Status !== 'Completed' && review.Status !== 'Incomplete');\r\n } else {\r\n vm.filteredReviews = vm.reviews;\r\n }\r\n vm.filteredReviews = $filter('orderBy')(vm.filteredReviews, '-GeneratedDate');\r\n }\r\n\r\n async function openSubmitReviewModal(review, vm) {\r\n vm.review = review;\r\n let reviewModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/SubmitReviewModal/submitReviewModal.html',\r\n controller: submitReviewModalController,\r\n controllerAs: 'srmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n review: () => review,\r\n onBehalfOf: () => false\r\n\r\n }\r\n });\r\n\r\n try {\r\n await reviewModal.result;\r\n if (vm.selectedReview.HeaderId === review.HeaderId) {\r\n vm.selectedReview = null;\r\n vm.selectedGroup = null;\r\n vm.selectedUser = null;\r\n }\r\n activate();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function exportReview(review) {\r\n var postData = {\r\n \"PreferredTimeZone\": $rootScope.applicationTimeZone\r\n };\r\n myReviewsDataService.exportReview(review.HeaderId, postData);\r\n }\r\n\r\n // group by list-view\r\n function setupGroupByListview() {\r\n vm.availableGroupingMethods = [\r\n {\r\n name: `Group Reviews by ${vm.reviewTypeName}`,\r\n type: 'ReviewType'\r\n },\r\n {\r\n name: 'Group Reviews by Users',\r\n type: 'User'\r\n }\r\n ];\r\n\r\n let groupByPreference = $rootScope.UserPreferences.DefaultGroupReviews;\r\n\r\n if (vm.selectedReview.ReviewType === 'SecurityRoleContent') {\r\n groupByPreference = 'ReviewType'\r\n }\r\n\r\n vm.selectedGroupingMethod = vm.availableGroupingMethods.find(groupingMethods => groupingMethods.type === groupByPreference);\r\n setupGroupByList();\r\n }\r\n\r\n function resetValues() {\r\n vm.selectedGroup = null;\r\n vm.selectedUser = null;\r\n vm.searchQuery = '';\r\n }\r\n\r\n async function setupGroupByList() {\r\n vm.loadingGroupItems = true;\r\n\r\n resetValues();\r\n\r\n let groupingList = await myReviewsDataService.getReviewDetails(vm.selectedReview.ReviewType, vm.selectedReview.HeaderId, vm.selectedGroupingMethod.type);\r\n\r\n if (vm.selectedGroupingMethod.type === 'ReviewType') {\r\n buildTypeList(groupingList);\r\n } else if (vm.selectedGroupingMethod.type === 'User') {\r\n buildUserList(groupingList);\r\n }\r\n\r\n }\r\n\r\n function getItemId(reviewType) {\r\n switch (reviewType) {\r\n case \"SecurityRole\":\r\n case \"SecurityRoleContent\":\r\n return \"SecurityRoleIdentifier\";\r\n break;\r\n case \"Product\":\r\n return \"ProductId\";\r\n break;\r\n case \"Risk\":\r\n return \"RiskId\";\r\n break;\r\n case \"BusinessProcess\":\r\n return \"BusinessProcessId\";\r\n break;\r\n default:\r\n return null;\r\n break;\r\n }\r\n }\r\n\r\n function buildTypeList(groupItems) {\r\n\r\n groupItems = groupItems.map(obj => {\r\n if (vm.selectedReview.ReviewType === 'SecurityRoleContent') {\r\n obj.Remaining = obj.items.filter(item => !item.StatusId && item.MultiApprovalStatus !== \"Complete\").length;\r\n let itemTypes = obj.items.map(item => item.RoleContentType).unique();\r\n obj.RemainingCounts = [];\r\n itemTypes.forEach(type => {\r\n let countObject = {\r\n Type: type,\r\n Remaining: obj.items.filter(item => !item.StatusId && item.RoleContentType === type && item.MultiApprovalStatus !== 'Complete').length,\r\n ReviewedByOthers: obj.items.filter(item => item.RoleContentType === type && item.MultiApprovalStatus === 'Complete').length\r\n };\r\n obj.RemainingCounts.push(countObject);\r\n });\r\n // update counts for Review items\r\n if (vm.selectedGroup) {\r\n vm.selectedGroup = { ...vm.selectedGroup };\r\n }\r\n } else {\r\n obj.Remaining = obj.Items.filter(item => !item.StatusId && item.MultiApprovalStatus !== \"Complete\").length;\r\n }\r\n if (vm.selectedReview.ReviewType === 'Risk') {\r\n obj.Risk = obj.Items[0].RiskLevel;\r\n }\r\n obj.ItemId = obj[getItemId(vm.selectedReview.ReviewType)];\r\n return obj;\r\n });\r\n\r\n vm.selectedReviewGroups = groupItems;\r\n\r\n vm.loadingGroupItems = false;\r\n }\r\n\r\n async function buildUserList(groupItems) {\r\n if (!vm.selectedUser) {\r\n vm.users = [];\r\n }\r\n\r\n vm.users = groupItems.map(obj => {\r\n obj.Remaining = obj.Items.filter(item => !item.StatusId && item.MultiApprovalStatus !== \"Complete\").length;\r\n obj.userDisplay = obj[vm.userDisplay];\r\n return obj;\r\n });\r\n\r\n vm.loadingGroupItems = false;\r\n\r\n }\r\n\r\n function selectedGroupChanged(object) {\r\n\r\n if (vm.selectedGroup === object || vm.processingItemStatus) return;\r\n vm.allFilteredUsers = null;\r\n vm.allTypes = null;\r\n vm.currentUsersPage = 1;\r\n vm.currentTypesPage = 1;\r\n\r\n let reviewType = vm.selectedReview.ReviewType;\r\n\r\n switch (reviewType) {\r\n case \"Risk\":\r\n vm.reviewDetailsSort = [\"RiskName\", \"UserName\"];\r\n break;\r\n case \"BusinessProcess\":\r\n vm.reviewDetailsSort = [\"BusinessProcessName\", \"UserName\"];\r\n break;\r\n case \"Product\":\r\n vm.reviewDetailsSort = [\"ProductName\", \"UserName\"];\r\n break;\r\n case \"SecurityRole\":\r\n vm.reviewDetailsSort = [\"SecurityRoleName\", \"UserName\"];\r\n break;\r\n }\r\n vm.selectedGroup = object;\r\n if (reviewType === 'SecurityRoleContent') {\r\n setupGroupBySecurityRoleTypeListview();\r\n } else {\r\n setupGroupByUserListview();\r\n }\r\n\r\n }\r\n\r\n function selectUser(object) {\r\n if (vm.processingItemStatus) return;\r\n vm.selectedUser = object;\r\n setupGroupByTypeListview();\r\n }\r\n\r\n // select user list-view\r\n async function setupGroupByUserListview() {\r\n if (vm.selectedGroup || vm.selectedUser) {\r\n await setupPermissions();\r\n filterUsers();\r\n vm.allItemStatus = checkAllStatus(vm.filteredUsers);\r\n }\r\n }\r\n\r\n async function setupGroupBySecurityRoleTypeListview() {\r\n if (vm.selectedGroup || vm.selectedUser) {\r\n await setupPermissions();\r\n vm.configValues = {\r\n showBPObject: vm.showRoleContentBPObject,\r\n showCAObject: vm.showRoleContentCAObject,\r\n showSelectAll: vm.showSelectAll\r\n }\r\n }\r\n }\r\n\r\n async function setupPermissions() {\r\n\r\n vm.loadingItems = true;\r\n\r\n let config = {};\r\n let values = await configurationDataService.getConfigurationValues();\r\n\r\n values.data.forEach(row => config[row.Name] = row.Value);\r\n\r\n vm.showSelectAll = config['Cert_AllowSelectAll'];\r\n vm.showBPObject = config['Cert_BusinessProcessObjects'];\r\n vm.showRoleContentBPObject = config['Cert_RoleContentBusinessProcessObjects'];\r\n vm.requireNotesOnRejectedItems = config['Cert_RequireNotesOnRejectedItems'] === '1' ? true : false;\r\n vm.loadingItems = false;\r\n }\r\n\r\n function filterUsers() {\r\n vm.loadingItems = true;\r\n let objects;\r\n\r\n if (vm.selectedGroup) {\r\n objects = vm.selectedGroup.Items;\r\n } else {\r\n objects = vm.selectedUser.Items;\r\n }\r\n\r\n vm.totalObjects = objects;\r\n\r\n vm.filteredUsers = objects;\r\n\r\n vm.filteredUsers.forEach(u => u.userDisplay = u[vm.userDisplay]);\r\n vm.usersRadioFilter = 'All';\r\n vm.showAssignedinAllCompaniesOnly = false;\r\n vm.loadingItems = false;\r\n vm.filteredUsers;\r\n }\r\n\r\n function changeSearchFilter() {\r\n $timeout(async _ => {\r\n vm.allItemStatus = checkAllStatus(vm.filteredUserItems);\r\n }, 1);\r\n }\r\n\r\n async function openNotesModal(item) {\r\n let itemNotesModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/notesModal/notesModal.tmpl.html',\r\n controller: notesModalController,\r\n controllerAs: 'nmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n reviewItem: () => item,\r\n notesRequired: () => vm.requireNotesOnRejectedItems,\r\n allowCancel: () => true\r\n }\r\n });\r\n\r\n try {\r\n let itemNotes = await itemNotesModal.result;\r\n item.Notes = itemNotes;\r\n updateItemStatus(item, true);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function changeItemStatus(item) {\r\n if (vm.requireNotesOnRejectedItems && item.StatusId === 2) {\r\n let itemNotesModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/notesModal/notesModal.tmpl.html',\r\n controller: notesModalController,\r\n controllerAs: 'nmvm',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n reviewItem: () => item,\r\n notesRequired: () => vm.requireNotesOnRejectedItems,\r\n allowCancel: () => false\r\n }\r\n });\r\n\r\n try {\r\n let itemNotes = await itemNotesModal.result;\r\n item.Notes = itemNotes;\r\n } catch {\r\n return;\r\n }\r\n }\r\n let filteredUsers = vm.filteredUsers.slice();\r\n filteredUsers.remove(item);\r\n\r\n if (!item.Notes) { item.Notes = \"\" }\r\n\r\n updateItemStatus(item);\r\n }\r\n\r\n async function updateItemStatus(item, notesOnly) {\r\n vm.processingItemStatus = true;\r\n\r\n if (item.StatusId === null && item.MultiApprovalStatus === 'Complete' && !notesOnly) {\r\n // need to set multiapproval status back to pending since reviewer is resetting their action\r\n item.MultiApprovalStatus = 'Pending';\r\n }\r\n\r\n let putBody = {\r\n \"ReviewItems\": []\r\n };\r\n\r\n putBody.ReviewItems.push({\r\n \"HeaderId\": item.HeaderId,\r\n \"ItemId\": item.ItemId,\r\n \"Status\": item.StatusId,\r\n \"Notes\": item.Notes\r\n });\r\n\r\n await myReviewsDataService.updateItemStatus(item.HeaderId, vm.selectedReview.ReviewType, putBody);\r\n await vm.getReviews();\r\n getUpdatedRemainingReviewItems();\r\n vm.processingItemStatus = false;\r\n vm.allItemStatus = checkAllStatus(vm.filteredUserItems);\r\n }\r\n\r\n async function updateAllItemStatuses(newValue) {\r\n if (vm.selectedGroupingMethod.type === 'User') {\r\n filterUsers();\r\n }\r\n vm.processingItemStatus = true;\r\n\r\n let putBody = {\r\n \"ReviewItems\": []\r\n };\r\n\r\n let users = vm.filteredUserItems;\r\n\r\n if (users.every(user => user.StatusId === newValue)) {\r\n newValue = null;\r\n }\r\n\r\n // if they require notes for rejected items we need to capture notes and apply them to all the rejected items\r\n if (newValue === 2 && vm.requireNotesOnRejectedItems) {\r\n let itemNotesModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/notesModal/notesModal.tmpl.html',\r\n controller: notesModalController,\r\n controllerAs: 'nmvm',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n reviewItem: () => null,\r\n notesRequired: () => vm.requireNotesOnRejectedItems,\r\n allowCancel: () => false\r\n }\r\n });\r\n\r\n try {\r\n var itemNotes = await itemNotesModal.result;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n let filteredUsers = [...users];\r\n\r\n if (vm.selfReviewConfigValue === '3') {\r\n filteredUsers = filteredUsers.filter(row => !row.IsSelfReview);\r\n }\r\n\r\n if (filteredUsers.length > 0) {\r\n\r\n filteredUsers.forEach(row => {\r\n if (row.MultiApprovalStatus === 'Complete' && row.StatusId === null) {\r\n return;\r\n }\r\n\r\n if (row.StatusId === null && row.MultiApprovalStatus === 'Complete' && newValue === null) {\r\n row.MultiApprovalStatus = 'Pending';\r\n }\r\n\r\n row.StatusId = newValue;\r\n\r\n putBody.ReviewItems.push({\r\n \"HeaderId\": row.HeaderId,\r\n \"ItemId\": row.ItemId,\r\n \"Status\": row.StatusId,\r\n \"Notes\": itemNotes ? itemNotes : row.Notes\r\n });\r\n if (itemNotes) {\r\n row.Notes = itemNotes;\r\n }\r\n });\r\n\r\n await myReviewsDataService.updateItemStatus(putBody.ReviewItems[0].HeaderId, vm.selectedReview.ReviewType, putBody);\r\n await vm.getReviews();\r\n getUpdatedRemainingReviewItems();\r\n vm.processingItemStatus = false;\r\n vm.allItemStatus = checkAllStatus(vm.filteredUserItems);\r\n } else {\r\n helperService.showErrorMessage(\"None of the selected items are eligible for review.\");\r\n vm.allItemStatus = checkAllStatus(vm.filteredUserItems);\r\n vm.processingItemStatus = false;\r\n }\r\n }\r\n\r\n function updateItemNote(item) {\r\n updateItemStatus(item);\r\n }\r\n\r\n async function getUpdatedRemainingReviewItems() {\r\n if (vm.selectedGroup) {\r\n buildTypeList(vm.selectedReviewGroups);\r\n } else if (vm.selectedUser) {\r\n buildUserList(vm.users);\r\n }\r\n toggleReviews(vm.showAll);\r\n }\r\n\r\n // select type list-view\r\n async function setupGroupByTypeListview() {\r\n await setupPermissions();\r\n vm.typesRadioFilter = 'All';\r\n vm.allItemStatus = checkAllStatus(vm.selectedUser.Items);\r\n }\r\n\r\n\r\n async function changeTypeItemStatus(item) {\r\n if (vm.requireNotesOnRejectedItems && item.StatusId === 2) {\r\n let itemNotesModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/notesModal/notesModal.tmpl.html',\r\n controller: notesModalController,\r\n controllerAs: 'nmvm',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n reviewItem: () => item,\r\n notesRequired: () => vm.requireNotesOnRejectedItems,\r\n allowCancel: () => false\r\n }\r\n });\r\n\r\n try {\r\n let itemNotes = await itemNotesModal.result;\r\n item.Notes = itemNotes;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n const types = vm.selectedUser.Items.slice();\r\n types.remove(item);\r\n\r\n if (!item.Notes) { item.Notes = \"\" }\r\n\r\n updateItemStatus(item);\r\n vm.allItemStatus = checkAllStatus(vm.selectedUser.Items);\r\n\r\n }\r\n\r\n async function openDelegateModal(delegationContext) {\r\n vm.delegatePending = true;\r\n let delegationItems = [];\r\n if (delegationContext.Types) {\r\n delegationItems = delegationContext.Types.filter(type => type.StatusId === null);\r\n } else if (delegationContext.Items) {\r\n delegationItems = delegationContext.Items.filter(item => item.StatusId === null);\r\n } else if (delegationContext.items) {\r\n delegationItems = delegationContext.items.filter(item => item.StatusId === null);\r\n } else {\r\n let response = await myReviewsDataService.getReviewDetails(delegationContext.ReviewType, delegationContext.HeaderId, \"ReviewType\");\r\n response = response.reduce((acc, curr) => {\r\n if (curr.Items) {\r\n return acc.concat(curr.Items);\r\n } else {\r\n return acc.concat(curr.items);\r\n }\r\n }, []);\r\n delegationItems = response.filter(detail => detail.StatusId === null);\r\n }\r\n\r\n let delegateModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/MyReviews/DelegationModal/reviewDelegationModal.html',\r\n controller: reviewDelegationModalController,\r\n controllerAs: 'rdmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n delegationItems: () => delegationItems,\r\n reviewHeaderId: () => delegationContext.HeaderId ? delegationContext.HeaderId : vm.selectedReview.HeaderId,\r\n reviewType: () => delegationContext.ReviewType ? delegationContext.ReviewType : vm.selectedReview.ReviewType\r\n }\r\n });\r\n\r\n try {\r\n await delegateModal.result;\r\n vm.delegatePending = false;\r\n } catch { vm.delegatePending = false; }\r\n }\r\n\r\n function radioFilterChanged() {\r\n $timeout(async _ => {\r\n vm.allItemStatus = checkAllStatus(vm.filteredUserItems);\r\n }, 1);\r\n }\r\n\r\n function checkAllStatus(reviewItems) {\r\n if (reviewItems.length > 0) {\r\n if (reviewItems.every(item => item.StatusId === 1)) {\r\n return '1';\r\n } else if (reviewItems.every(item => item.StatusId === 2)) {\r\n return '2';\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async function updateReviewCounts() {\r\n await vm.getReviews();\r\n getUpdatedRemainingReviewItems();\r\n }\r\n\r\n async function openTicketModal(review) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/MyReviews/TicketModal/ticketModal.tmpl.html',\r\n controller: ticketModalController,\r\n controllerAs: 'tmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n review: () => review\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\nimport notesModalController from \"../notesModal/notesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (category, configValues, reviewStatus, requireNotes, $uibModalInstance, $uibModal, $timeout, myReviewsDataService) {\r\n const vm = this;\r\n vm.category = category;\r\n vm.configValues = configValues;\r\n vm.reviewStatus = reviewStatus;\r\n vm.requireNotes = requireNotes;\r\n\r\n vm.filterCheckAllStatus = filterCheckAllStatus;\r\n vm.checkAllStatus = checkAllStatus;\r\n vm.changeItemStatus = changeItemStatus;\r\n vm.updateAllItemStatuses = updateAllItemStatuses;\r\n vm.openNotesModal = openNotesModal;\r\n vm.close = close;\r\n\r\n activate();\r\n\r\n function activate() {\r\n vm.securityRoleName = category.Items[0].SecurityRoleName;\r\n vm.categoryType = category.Items[0].RoleContentType;\r\n setupFilterTypes();\r\n vm.itemsRadioFilter = 'All';\r\n vm.allItemStatus = checkAllStatus(vm.filteredReviewItems);\r\n }\r\n\r\n function setupFilterTypes() {\r\n switch (vm.categoryType) {\r\n case 'BusinessProcess':\r\n vm.reviewitemsSortKey = ['BusinessProcessName'];\r\n vm.reviewItemsFilterKey = ['BusinessProcessName', 'RulesetName', 'SecurityRoleName', 'SecurityObjectAltName', 'SecurityObjectName', 'SecurityObjectTypeName', 'Notes'];\r\n break;\r\n case 'Risk':\r\n vm.reviewitemsSortKey = ['RiskName'];\r\n vm.reviewItemsFilterKey = ['RiskName', 'RulesetName', 'SecurityRoleName', 'Notes'];\r\n break;\r\n case 'RoleAccess':\r\n vm.reviewitemsSortKey = ['SecurityObjectAltName'];\r\n vm.reviewItemsFilterKey = ['SecurityObjectAltName', 'SecurityObjectName', 'Notes'];\r\n break;\r\n }\r\n }\r\n\r\n function filterCheckAllStatus() {\r\n $timeout(_ => {\r\n vm.allItemStatus = checkAllStatus(vm.filteredReviewItems);\r\n if (vm.filteredReviewItems.length === 0) {\r\n vm.hideSelectAll = true;\r\n } else {\r\n vm.hideSelectAll = false;\r\n }\r\n }, 1);\r\n }\r\n\r\n function checkAllStatus(reviewItems) {\r\n if (!reviewItems) {\r\n reviewItems = vm.category.Items;\r\n }\r\n if (reviewItems.length > 0) {\r\n if (reviewItems.every(item => item.StatusId === 1)) {\r\n return '1';\r\n } else if (reviewItems.every(item => item.StatusId === 2)) {\r\n return '2';\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async function changeItemStatus(item) {\r\n if (requireNotes && item.StatusId === 2) {\r\n let itemNotesModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/notesModal/notesModal.tmpl.html',\r\n controller: notesModalController,\r\n controllerAs: 'nmvm',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n reviewItem: () => item,\r\n notesRequired: () => requireNotes,\r\n allowCancel: () => false\r\n }\r\n });\r\n\r\n try {\r\n let itemNotes = await itemNotesModal.result;\r\n item.Notes = itemNotes;\r\n } catch {\r\n return;\r\n }\r\n }\r\n const types = category.Items.slice();\r\n types.remove(item);\r\n\r\n updateItemStatus(item);\r\n }\r\n\r\n async function updateItemStatus(item) {\r\n vm.processingItemStatus = true;\r\n\r\n if (!item.StatusId && item.MultiApprovalStatus === 'Complete') {\r\n item.MultiApprovalStatus = 'Pending';\r\n }\r\n\r\n let putBody = {\r\n \"ReviewItems\": []\r\n };\r\n\r\n putBody.ReviewItems.push({\r\n \"HeaderId\": item.HeaderId,\r\n \"ItemId\": item.ItemId,\r\n \"Status\": item.StatusId,\r\n \"Notes\": item.Notes\r\n });\r\n\r\n await myReviewsDataService.updateItemStatus(item.HeaderId, 'SecurityRoleContent', putBody);\r\n vm.processingItemStatus = false;\r\n vm.allItemStatus = checkAllStatus(vm.filteredReviewItems);\r\n }\r\n\r\n async function updateAllItemStatuses(newValue) {\r\n vm.processingItemStatus = true;\r\n\r\n let putBody = {\r\n \"ReviewItems\": []\r\n };\r\n\r\n let items = vm.filteredReviewItems;\r\n\r\n if (items.every(item => item.StatusId === newValue)) {\r\n newValue = null;\r\n }\r\n\r\n // if they require notes for rejected items we need to capture notes and apply them to all the rejected items\r\n if (newValue === 2 && requireNotes) {\r\n let itemNotesModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/notesModal/notesModal.tmpl.html',\r\n controller: notesModalController,\r\n controllerAs: 'nmvm',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n reviewItem: () => null,\r\n notesRequired: () => requireNotes,\r\n allowCancel: () => false\r\n }\r\n });\r\n\r\n try {\r\n var itemNotes = await itemNotesModal.result;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n items.forEach(item => {\r\n if (item.MultiApprovalStatus !== 'Complete') {\r\n item.StatusId = newValue;\r\n if (itemNotes) {\r\n item.Notes = itemNotes;\r\n }\r\n putBody.ReviewItems.push({\r\n \"HeaderId\": item.HeaderId,\r\n \"ItemId\": item.ItemId,\r\n \"Status\": item.StatusId,\r\n \"Notes\": item.Notes\r\n });\r\n }\r\n });\r\n\r\n await myReviewsDataService.updateItemStatus(putBody.ReviewItems[0].HeaderId, 'SecurityRoleContent', putBody);\r\n vm.allItemStatus = checkAllStatus(vm.filteredReviewItems);\r\n vm.processingItemStatus = false;\r\n }\r\n\r\n async function openNotesModal(item) {\r\n let itemNotesModal = $uibModal.open({\r\n templateUrl: 'App/Components/Certifications/MyReviews/notesModal/notesModal.tmpl.html',\r\n controller: notesModalController,\r\n controllerAs: 'nmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n reviewItem: () => item,\r\n notesRequired: () => requireNotes,\r\n allowCancel: () => true\r\n }\r\n });\r\n\r\n try {\r\n let itemNotes = await itemNotesModal.result;\r\n item.Notes = itemNotes;\r\n updateItemStatus(item);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n}","import roleContentReviewModalController from \"./roleContentReviewModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit, vm.$onChanges = activate;\r\n\r\n vm.openReviewModal = openReviewModal;\r\n\r\n\r\n function activate() {\r\n if (!vm.securityRole.items) { return; }\r\n vm.reviewItemCategories = vm.securityRole.items.reduce((categories, item) => {\r\n let existingIndex = categories.findIndex(category => category.Name === item.RoleContentType);\r\n if (existingIndex === -1) {\r\n categories.push({ Name: item.RoleContentType, Items: [item] });\r\n } else {\r\n categories[existingIndex].Items.push(item);\r\n }\r\n return categories;\r\n }, []);\r\n getCounts(vm.reviewItemCategories);\r\n }\r\n\r\n function getCounts(array) {\r\n array.forEach(item => { \r\n item.ApprovedCount = item.Items.filter(i => i.StatusId === 1).length;\r\n item.RejectedCount = item.Items.filter(i => i.StatusId === 2).length;\r\n item.NotReviewedCount = item.Items.filter(i => !i.StatusId).length;\r\n item.ReviewedByOthersCount = item.Items.filter(i => i.MultiApprovalStatus === 'Complete').length;\r\n });\r\n }\r\n\r\n async function openReviewModal(category) {\r\n let reviewModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/MyReviews/SecurityRoleContentItemsList/roleContentReviewModal.tmpl.html',\r\n controller: roleContentReviewModalController,\r\n controllerAs: 'rcrmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n category: () => category,\r\n configValues: () => vm.configValues,\r\n reviewStatus: () => vm.reviewStatus,\r\n requireNotes: () => vm.requireNotes\r\n }\r\n });\r\n\r\n try {\r\n await reviewModal.result;\r\n vm.updateReviewCounts();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","/* securityRoleContentItemsList.component.js */\r\n\r\nimport securityRoleContentItemsListController from \"./securityRoleContentItemsList.controller\";\r\n\r\n/**\r\n * @desc component for displaying and reviewing items for a Security Role Content Review Type\r\n * @example \r\n */\r\n\r\nconst securityRoleContentItemsList = {\r\n bindings: {\r\n securityRole: '<',\r\n configValues: '<',\r\n updateReviewCounts: '&',\r\n reviewStatus: '<',\r\n requireNotes: '<'\r\n },\r\n controller: securityRoleContentItemsListController,\r\n controllerAs: 'srcilvm',\r\n templateUrl: '/App/Components/Certifications/MyReviews/SecurityRoleContentItemsList/securityRoleContentItemsList.tmpl.html'\r\n};\r\n\r\nexport default securityRoleContentItemsList;","import { customAutoCompleteFilter, customAutoCompleteFilterEqualToOnly, customDatePickerFilter } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.removeIMRequestTicketLink = removeIMRequestTicketLink;\r\n vm.openTicketTable = openTicketTable;\r\n vm.createLink = createLink;\r\n vm.showLinkTicketBody = false;\r\n\r\n vm.isJira = false;\r\n vm.isServiceNow = false;\r\n vm.isZendesk = false;\r\n vm.isCustom = false;\r\n vm.url = null;\r\n\r\n\r\n vm.linkedTickets = vm.tickets;\r\n\r\n async function openTicketTable(ticketType) {\r\n vm.showLinkTicketBody = true;\r\n switch (ticketType) {\r\n case 'Jira':\r\n vm.isJira = true;\r\n vm.url = 'api/core/tickets/jira/search/';\r\n vm.template = `Link`;\r\n vm.isFreshservice = false;\r\n vm.isServiceNow = false;\r\n vm.isZendesk = false;\r\n vm.isCustom = false;\r\n await updateTicketGrid();\r\n break;\r\n case 'Freshservice':\r\n vm.isFreshservice = true;\r\n vm.daysToSearch = '30';\r\n vm.url = 'api/core/tickets/freshservice/search/';\r\n vm.template = `Link`;\r\n vm.isJira = false;\r\n vm.isServiceNow = false;\r\n vm.isZendesk = false;\r\n vm.isCustom = false;\r\n await updateTicketGrid();\r\n break;\r\n case 'ServiceNow':\r\n vm.isServiceNow = true;\r\n vm.url = 'api/core/tickets/servicenow/search/';\r\n vm.template = `Link`;\r\n vm.isJira = false;\r\n vm.isFreshservice = false;\r\n vm.isZendesk = false;\r\n vm.isCustom = false;\r\n await updateTicketGrid();\r\n break;\r\n case 'Zendesk':\r\n vm.isZendesk = true;\r\n vm.url = 'api/core/tickets/zendesk/search/';\r\n vm.template = `Link`;\r\n vm.isJira = false;\r\n vm.isFreshservice = false;\r\n vm.isServiceNow = false;\r\n vm.isCustom = false;\r\n await updateTicketGrid();\r\n break;\r\n case 'Custom':\r\n vm.isCustom = true;\r\n vm.url = null;\r\n vm.isJira = false;\r\n vm.isFreshservice = false;\r\n vm.isServiceNow = false;\r\n vm.isZendesk = false;\r\n default:\r\n return;\r\n\r\n }\r\n }\r\n\r\n //set columns as they are all the same \r\n function updateTicketGrid() {\r\n let statusTemplate = \"{{dataItem.Status}}\";\r\n\r\n let columnsFromVM = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { title: ' ', width: 90, template: vm.template }\r\n ];\r\n\r\n vm.gridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n vm.gridOptions.selectable = false;\r\n vm.gridOptions.pageable = false;\r\n vm.gridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n\r\n vm.gridDataSource.read();\r\n }\r\n\r\n if (!vm.isCustom) {\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async function (options) {\r\n let sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n let postBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n try {\r\n let response = await $http.post(apiUrl + vm.url, postBody);\r\n vm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function createLink(dataItem) {\r\n if (!vm.linkedTickets) vm.linkedTickets = [];\r\n let linkedTicket = {};\r\n\r\n if (vm.isJira) {\r\n linkedTicket.TicketId = dataItem.Id;\r\n linkedTicket.TicketProvider = 'Jira';\r\n vm.jiraTicketLinked = true;\r\n }\r\n else if (vm.isFreshservice) {\r\n linkedTicket.TicketId = dataItem.Id;\r\n linkedTicket.TicketProvider = 'Freshservice';\r\n vm.freshServiceTicketLinked = true;\r\n }\r\n else if (vm.isServiceNow) {\r\n linkedTicket.TicketId = dataItem.Id;\r\n linkedTicket.TicketProvider = 'ServiceNow';\r\n vm.serviceNowTicketLinked = true;\r\n }\r\n else if (vm.isZendesk) {\r\n linkedTicket.TicketId = dataItem.Id;\r\n linkedTicket.TicketProvider = 'Zendesk';\r\n vm.zendeskTicketLinked = true;\r\n } else if (vm.isCustom) {\r\n linkedTicket.TicketId = vm.customTicketId;\r\n linkedTicket.TicketProvider = 'Custom';\r\n vm.customTicketLinked = true;\r\n }\r\n\r\n vm.linkedTickets.push(linkedTicket);\r\n\r\n if (dataItem) {\r\n dataItem.isLinked = true;\r\n }\r\n\r\n vm.showLinkTicketBody = false;\r\n\r\n let ticket = linkedTicket;\r\n\r\n vm.onUpdateTicket({ ticket });\r\n };\r\n\r\n // Remove a ticket\r\n function removeIMRequestTicketLink(providerString) {\r\n vm.linkedTickets = vm.linkedTickets.filter(ticket => ticket.TicketProvider !== providerString);\r\n\r\n if (providerString === 'Jira') vm.jiraTicketLinked = false;\r\n else if (providerString === 'Freshservice') vm.freshServiceTicketLinked = false;\r\n else if (providerString === 'ServiceNow') vm.serviceNowTicketLinked = false;\r\n else if (providerString === 'Zendesk') vm.zendeskTicketLinked = false;\r\n else if (providerString === 'Custom') vm.customTicketLinked = false; vm.customTicketId = '';\r\n\r\n vm.onRemoveTicket({ providerString });\r\n }\r\n\r\n}","/* linkTicketsDropdown.component.js */\r\n\r\nimport linkTicketsDropdownController from \"./linkTicketsDropdown.controller\";\r\n\r\n/**\r\n * @desc component for the Link Tickets dropdown\r\n * @example \r\n */\r\n\r\nconst linkTicketsDropdown = {\r\n bindings: {\r\n tickets: '<',\r\n onUpdateTicket: '&',\r\n onRemoveTicket: '&'\r\n },\r\n controller: linkTicketsDropdownController,\r\n controllerAs: 'ltdvm',\r\n templateUrl: 'App/Components/Certifications/LinkTickets/linkTicketsDropdown.tmpl.html'\r\n};\r\n\r\nexport default linkTicketsDropdown;","import createSpinner from \"../../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $uibModalInstance, helperService, reviewSchedulesDataService, scheduleData) {\r\n\r\n const vm = this;\r\n vm.ReviewInstance = scheduleData.selectedReviewInstance;\r\n vm.scheduleType = scheduleData.scheduleType;\r\n\r\n vm.daysInMonth = helperService.getDayOfMonthDropdownOptions();\r\n vm.months = helperService.getMonthsDropdownOptions();\r\n vm.frequencyTypesDataSource = [{ Name: 'Full', Id: 'Full' }, { Name: 'Rolling', Id: 'Rolling' }];\r\n vm.saveSchedule = saveSchedule;\r\n vm.cancel = cancel;\r\n\r\n vm.frequencyDataSource = [\r\n { Name: 'Monthly', Id: 'Monthly' },\r\n { Name: 'Quarterly', Id: 'Quarterly' },\r\n { Name: 'Semi Annually', Id: 'SemiAnnually' },\r\n { Name: 'Yearly', Id: 'Yearly' }];\r\n\r\n activate();\r\n\r\n function activate() {\r\n setUpForm();\r\n }\r\n\r\n\r\n function setUpForm() {\r\n //Load data for existing schedule\r\n if (scheduleData.selectedSchedule) {\r\n vm.ReviewInstanceId = scheduleData.selectedReviewInstance.Id\r\n vm.Frequency = vm.frequencyDataSource.find(function (object) { return object.Name === scheduleData.selectedSchedule.Frequency.replace(/([a-z])([A-Z])/g, '$1 $2'); });\r\n vm.FrequencyType = vm.frequencyTypesDataSource.find(function (object) { return object.Id === scheduleData.selectedSchedule.FrequencyType; });\r\n vm.Month = scheduleData.selectedSchedule.Month;\r\n vm.DayOfMonth = scheduleData.selectedSchedule.DayOfMonth;\r\n } else {\r\n //Load Data for new schedule\r\n vm.ReviewInstanceId = scheduleData.selectedReviewInstance.Id\r\n vm.FrequencyType = vm.frequencyTypesDataSource.find(function (object) { return object.Id === scheduleData.selectedFrequencyType; });\r\n }\r\n }\r\n\r\n function saveSchedule() {\r\n vm.pleaseWait = new createSpinner();\r\n if (scheduleData.selectedSchedule) {\r\n updateSchedule();\r\n } else {\r\n createSchedule();\r\n }\r\n }\r\n\r\n async function createSchedule() {\r\n const postData = {\r\n \"ReviewInstanceId\": vm.ReviewInstanceId,\r\n \"FrequencyType\": vm.FrequencyType.Id,\r\n \"Frequency\": vm.Frequency.Id,\r\n \"TimeZone\": $rootScope.applicationTimeZone,\r\n \"DayOfMonth\": vm.DayOfMonth,\r\n \"Month\": vm.Month\r\n };\r\n\r\n try {\r\n await reviewSchedulesDataService.createSchedule(postData);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n };\r\n\r\n async function updateSchedule() {\r\n const putData = {\r\n \"Id\": scheduleData.selectedSchedule.Id,\r\n \"FrequencyType\": vm.FrequencyType.Id,\r\n \"Frequency\": vm.Frequency.Id,\r\n \"TimeZone\": $rootScope.applicationTimeZone,\r\n \"DayOfMonth\": vm.DayOfMonth,\r\n \"Month\": vm.Month\r\n };\r\n\r\n try {\r\n await reviewSchedulesDataService.updateSchedule(scheduleData.selectedSchedule.Id, putData);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n };\r\n}\r\n","import createSpinner from \"../../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (reviewAssignmentsDataService, $uibModalInstance, helperService) {\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.dismiss = dismiss;\r\n vm.disableButton = false;\r\n vm.importSchedules = importSchedules;\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n function dismiss() { $uibModalInstance.dismiss(); }\r\n\r\n // Import Schedules\r\n async function importSchedules(file) {\r\n vm.importPending = new createSpinner();\r\n vm.disableButton = true;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n try {\r\n await reviewAssignmentsDataService.importReviews(fd);\r\n await helperService.successfulSaveButton(vm.importPending);\r\n cancel();\r\n } catch {\r\n vm.importPending.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n}","import createSpinner from \"../../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (reviewSchedulesDataService, reviewAssignmentsDataService, $uibModalInstance, schedule, isClone, helperService) {\r\n const vm = this;\r\n vm.isClone = isClone;\r\n\r\n vm.saveSchedule = saveSchedule;\r\n vm.dismiss = dismiss;\r\n\r\n vm.schedule = { ...schedule };\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (isClone) {\r\n vm.scheduleInstanceId = vm.schedule.Id;\r\n vm.schedule = {};\r\n } else {\r\n getReviewTypes();\r\n }\r\n }\r\n\r\n async function getReviewTypes() {\r\n const response = await reviewAssignmentsDataService.getReviewTypes();\r\n vm.scheduleTypesDataSource = response.data;\r\n }\r\n\r\n async function saveSchedule() {\r\n vm.saveInProgress = new createSpinner();\r\n let scheduleInstance = {\r\n Name: vm.schedule.Name,\r\n Description: vm.schedule.Description,\r\n ReviewType: vm.schedule.ReviewType,\r\n IncludeSupervisorReviews: vm.schedule.IncludeSupervisorReviews,\r\n IncludeCompanyInReviews: vm.schedule.IncludeCompanyInReviews\r\n }\r\n if (vm.schedule.Id && !isClone) {\r\n updateScheduleInstance(scheduleInstance);\r\n } else if (isClone) {\r\n cloneScheduleInstance(scheduleInstance);\r\n }\r\n else {\r\n createScheduleInstance(scheduleInstance);\r\n }\r\n }\r\n\r\n async function createScheduleInstance(scheduleInstance) {\r\n try {\r\n const response = await reviewSchedulesDataService.createInstance(scheduleInstance)\r\n await helperService.successfulSaveButton(vm.saveInProgress);\r\n close(response.data);\r\n } catch {\r\n vm.saveInProgress.loadingValue = false;\r\n }\r\n \r\n }\r\n\r\n async function cloneScheduleInstance(scheduleInstance) {\r\n scheduleInstance.ReviewInstanceId = vm.scheduleInstanceId;\r\n\r\n try {\r\n const response = await reviewSchedulesDataService.cloneInstance(scheduleInstance)\r\n await helperService.successfulSaveButton(vm.saveInProgress);\r\n close(response.data);\r\n } catch {\r\n vm.saveInProgress.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n async function updateScheduleInstance(scheduleInstance) {\r\n scheduleInstance.Id = vm.schedule.Id;\r\n scheduleInstance.ReviewType = schedule.ReviewType;\r\n try {\r\n await reviewSchedulesDataService.updateInstance(scheduleInstance)\r\n await helperService.successfulSaveButton(vm.saveInProgress);\r\n close();\r\n } catch {\r\n vm.saveInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(newInstanceId) {\r\n $uibModalInstance.close(newInstanceId);\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport scheduleModalController from \"./scheduleModal/scheduleModal.controller\";\r\nimport importSchedulesModalController from \"./importSchedulesModal/importSchedulesModal.controller\";\r\nimport scheduleInstanceModalController from \"./scheduleInstanceModal/scheduleInstanceModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (reviewSchedulesDataService, reviewAssignmentsDataService, helperService, $uibModal, $filter, FileSaver) {\r\n const vm = this;\r\n\r\n vm.openScheduleModal = openScheduleModal;\r\n vm.openScheduleInstanceModal = openScheduleInstanceModal;\r\n vm.openImportReviewSchedulesModal = openImportReviewSchedulesModal;\r\n vm.deleteScheduleInstance = deleteScheduleInstance;\r\n vm.deleteInstanceSchedule = deleteInstanceSchedule;\r\n vm.selectedReviewScheduleChanged = selectedReviewScheduleChanged;\r\n vm.runSchedule = runSchedule;\r\n vm.exportReviews = exportReviews;\r\n\r\n vm.reviewScheduleMenuOptions = [\r\n {\r\n text: 'Clone',\r\n click: item => {\r\n vm.openScheduleInstanceModal(item.reviewSchedule, true);\r\n }\r\n },\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openScheduleInstanceModal(item.reviewSchedule, false);\r\n }\r\n },\r\n {\r\n text: 'Full Review...',\r\n children: _ => {\r\n return [\r\n {\r\n text: 'Schedule',\r\n click: item => {\r\n vm.openScheduleModal(item.reviewSchedule, \"Full\");\r\n },\r\n displayed: item => {\r\n return !item.reviewSchedule.FullSchedule;\r\n }\r\n },\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openScheduleModal(item.reviewSchedule, \"Full\");\r\n },\r\n displayed: item => {\r\n return item.reviewSchedule.FullSchedule;\r\n }\r\n },\r\n {\r\n text: 'Run Now',\r\n click: item => {\r\n vm.runSchedule(item.reviewSchedule.FullSchedule.Id);\r\n swal(\"\", `The ${item.reviewSchedule.Name} review has been initiated. Reviewers will be notified of their review items soon.`, 'success');\r\n },\r\n displayed: item => {\r\n return item.reviewSchedule.FullSchedule;\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteInstanceSchedule(item.reviewSchedule.FullSchedule.Id);\r\n },\r\n displayed: item => {\r\n return item.reviewSchedule.FullSchedule;\r\n }\r\n }\r\n ];\r\n }\r\n },\r\n {\r\n text: 'Rolling Review...',\r\n children: _ => {\r\n return [\r\n {\r\n text: 'Schedule',\r\n click: item => {\r\n vm.openScheduleModal(item.reviewSchedule, \"Rolling\");\r\n },\r\n displayed: item => {\r\n return !item.reviewSchedule.RollingSchedule;\r\n }\r\n },\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openScheduleModal(item.reviewSchedule, \"Rolling\");\r\n },\r\n displayed: item => {\r\n return item.reviewSchedule.RollingSchedule;\r\n }\r\n },\r\n {\r\n text: 'Run Now',\r\n click: item => {\r\n vm.runSchedule(item.reviewSchedule.RollingSchedule.Id);\r\n swal(\"\", `The ${item.reviewSchedule.Name} review has been initiated. Reviewers will be notified of their review items soon.`, 'success');\r\n },\r\n displayed: item => {\r\n return item.reviewSchedule.RollingSchedule;\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteInstanceSchedule(item.reviewSchedule.RollingSchedule.Id);\r\n },\r\n displayed: item => {\r\n return item.reviewSchedule.RollingSchedule;\r\n }\r\n }\r\n ];\r\n },\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteScheduleInstance(item.reviewSchedule);\r\n }\r\n }\r\n ]\r\n\r\n vm.$onInit = getScheduleInstances;\r\n\r\n async function getScheduleInstances() {\r\n vm.loadingReviewSchedules = true;\r\n let response = await reviewSchedulesDataService.getInstances();\r\n vm.reviewSchedules = response.data.reduce((schedulesArray, schedule) => {\r\n schedule.FullSchedule = schedule.Schedules.find(s => s.FrequencyType === 'Full');\r\n schedule.RollingSchedule = schedule.Schedules.find(s => s.FrequencyType === 'Rolling');\r\n return schedulesArray;\r\n }, []);\r\n vm.reviewSchedules = $filter('orderBy')(response.data, 'Name');\r\n vm.loadingReviewSchedules = false;\r\n }\r\n\r\n async function openScheduleModal(scheduleInstance, frequencyType) {\r\n let scheduleData,\r\n existingSchedule = frequencyType === 'Full' ? scheduleInstance.FullSchedule : scheduleInstance.RollingSchedule;\r\n if (existingSchedule) {\r\n scheduleData = {\r\n selectedSchedule: existingSchedule,\r\n scheduleType: 'Edit',\r\n selectedReviewInstance: scheduleInstance\r\n }\r\n } else {\r\n scheduleData = {\r\n selectedSchedule: null,\r\n scheduleType: 'Create',\r\n selectedReviewInstance: scheduleInstance,\r\n selectedFrequencyType: frequencyType\r\n };\r\n }\r\n let scheduleModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/reviewScheduleInstancesList/scheduleModal/scheduleModal.html',\r\n controller: scheduleModalController,\r\n controllerAs: 'smvm',\r\n backdrop: 'static',\r\n resolve: {\r\n scheduleData: () => scheduleData\r\n }\r\n });\r\n\r\n try {\r\n await scheduleModal.result;\r\n await getScheduleInstances();\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function openScheduleInstanceModal(schedule, isClone) {\r\n let scheduleInstanceModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/reviewScheduleInstancesList/scheduleInstanceModal/scheduleInstanceModal.tmpl.html',\r\n controller: scheduleInstanceModalController,\r\n controllerAs: 'simvm',\r\n backdrop: 'static',\r\n resolve: {\r\n schedule: () => schedule || null,\r\n isClone: () => isClone\r\n }\r\n });\r\n\r\n try {\r\n let newInstanceId = await scheduleInstanceModal.result;\r\n await getScheduleInstances();\r\n if (newInstanceId) {\r\n sendNewScheduleInstanceToTop(newInstanceId);\r\n selectedReviewScheduleChanged(vm.reviewSchedules.find(schedule => schedule.Id === newInstanceId));\r\n }\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function openImportReviewSchedulesModal() {\r\n let importReviewSchedulesModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/reviewScheduleInstancesList/importSchedulesModal/importSchedulesModal.tmpl.html',\r\n controller: importSchedulesModalController,\r\n controllerAs: 'ismvm',\r\n backdrop: 'static'\r\n });\r\n\r\n try {\r\n await importReviewSchedulesModal.result;\r\n getScheduleInstances();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function selectedReviewScheduleChanged(schedule) {\r\n vm.selectedScheduleInstance = schedule;\r\n vm.onSelectSchedule({ schedule });\r\n }\r\n\r\n function sendNewScheduleInstanceToTop(newInstanceId) {\r\n vm.selectedScheduleInstance = vm.reviewSchedules.find(schedule => schedule.Id === newInstanceId);\r\n vm.reviewSchedules = vm.reviewSchedules.filter(schedule => schedule.Id !== newInstanceId);\r\n vm.reviewSchedules.unshift(vm.selectedScheduleInstance);\r\n }\r\n\r\n async function deleteScheduleInstance(scheduleInstance) {\r\n await swal(helperService.areYouSureParams('Delete Review Schedule', `Are you sure you want to delete Review Schedule ${scheduleInstance.Name}?`, 'Delete'));\r\n await reviewSchedulesDataService.deleteInstance(scheduleInstance.Id);\r\n if (vm.selectedScheduleInstance && vm.selectedScheduleInstance.Id === scheduleInstance.Id) {\r\n selectedReviewScheduleChanged(null);\r\n }\r\n getScheduleInstances();\r\n }\r\n\r\n async function deleteInstanceSchedule(instanceScheduleId) {\r\n vm.processingReviewSchedules = true;\r\n try {\r\n await reviewSchedulesDataService.deleteInstanceSchedule(instanceScheduleId);\r\n vm.processingReviewSchedules = false;\r\n } catch {\r\n vm.processingReviewSchedules = false;\r\n }\r\n \r\n getScheduleInstances();\r\n }\r\n\r\n async function runSchedule(id) {\r\n vm.processingReviewSchedules = true;\r\n try {\r\n await reviewSchedulesDataService.runSchedule(id);\r\n vm.processingReviewSchedules = false;\r\n } catch {\r\n vm.processingReviewSchedules = false;\r\n }\r\n }\r\n\r\n async function exportReviews() {\r\n vm.exportUpdatePending = new createSpinner();\r\n\r\n let response = await reviewAssignmentsDataService.exportReviews();\r\n FileSaver.saveAs(response.data, 'ReviewSchedules.xlsx');\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n}","/* reviewScheduleInstancesList.component.js */\r\n\r\nimport reviewScheduleInstancesListController from \"./reviewScheduleInstancesList.controller\";\r\n\r\n/**\r\n * @desc component for viewing and managing access certifications review schedule and assignment items\r\n * @example \r\n */\r\n\r\nconst reviewScheduleInstancesList = {\r\n bindings: {\r\n onSelectSchedule: '&'\r\n },\r\n controller: reviewScheduleInstancesListController,\r\n controllerAs: 'rsilvm',\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/reviewScheduleInstancesList/reviewScheduleInstancesList.tmpl.html'\r\n};\r\n\r\nexport default reviewScheduleInstancesList;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, existingSchedules, ownershipGroupTypeName, reviewInstance, reviewAssignmentsDataService, ownershipGroupsDataService) {\r\n\r\n const vm = this;\r\n vm.helperService = helperService;\r\n vm.existingSchedules = existingSchedules;\r\n vm.reviewInstance = reviewInstance;\r\n vm.ownershipGroupTypeName = ownershipGroupTypeName;\r\n\r\n vm.cancel = cancel;\r\n vm.addAssignment = addAssignment;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.ownershipGroupDropdownLoading = true;\r\n vm.ownershipGroupsDataSource = await getOwnershipGroups();\r\n vm.ownershipGroupDropdownLoading = false;\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n async function getOwnershipGroups() {\r\n let { data } = await ownershipGroupsDataService.getOwnershipGroups();\r\n data = removeExistingObjects(data);\r\n data = data.filter(group => group.TypeName === ownershipGroupTypeName);\r\n return data;\r\n }\r\n\r\n async function addAssignment() {\r\n vm.pleaseWait = new createSpinner();\r\n\r\n let assignment = {\r\n \"ReviewInstanceId\": reviewInstance.Id,\r\n \"OwnershipGroupIds\": [vm.selectedItem.Id],\r\n };\r\n\r\n try {\r\n await reviewAssignmentsDataService.addReviewAssignment(assignment);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n return;\r\n }\r\n }\r\n\r\n function removeExistingObjects(array) {\r\n return array.filter(ownershipGroup => !existingSchedules?.some(schedule => schedule.OwnershipGroupId === ownershipGroup.Id));\r\n }\r\n}","import createSpinner from \"../../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, ownershipGroupsDataService, reviewAssignmentId, reviewSchedulesDataService) {\r\n\r\n const vm = this;\r\n vm.dismiss = dismiss;\r\n vm.addRoutingCriteria = addRoutingCriteria;\r\n \r\n activate();\r\n\r\n async function activate() { \r\n vm.helperService = helperService;\r\n vm.owners = []; \r\n vm.ownershipGroupsDataSource = await getOwnershipGroups(); \r\n }\r\n\r\n async function getOwnershipGroups() {\r\n vm.ownershipGroupDropdownLoading = true;\r\n let { data } = await ownershipGroupsDataService.getOwnershipGroups(); \r\n vm.ownershipGroupDropdownLoading = false;\r\n return data = data.filter(group => group.TypeName === 'Company');\r\n }\r\n\r\n async function addRoutingCriteria() {\r\n vm.pleaseWait = new createSpinner();\r\n\r\n let routingCriteria = {\r\n RoutingCriteriaOwnershipGroupId: vm.selectedItem.Id,\r\n ReviewAssignmentId: reviewAssignmentId\r\n };\r\n\r\n try {\r\n await reviewSchedulesDataService.postRoutingCriteria(reviewAssignmentId, routingCriteria);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close(reviewAssignmentId);\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.close();\r\n }\r\n}","import instanceAssignmentModalController from \"./instanceAssignmentModal.controller\";\r\nimport routingCriteriaModalController from \"./routingCriteriaModal/routingCriteriaModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (reviewSchedulesDataService, reviewAssignmentsDataService, $uibModal) {\r\n const vm = this;\r\n\r\n vm.openInstanceAssignmentModal = openInstanceAssignmentModal;\r\n vm.removeInstanceAssignment = removeInstanceAssignment;\r\n vm.openGroupAssignmentsModal = openGroupAssignmentsModal;\r\n vm.openDefineRoutingCriteriaModal = openDefineRoutingCriteriaModal;\r\n vm.selectedOwnershipGroupChanged = selectedOwnershipGroupChanged;\r\n\r\n vm.reviewOwnershipGroupsOptions = [\r\n {\r\n text: 'Define Routing Crtieria',\r\n click: item => {\r\n vm.openDefineRoutingCriteriaModal(item.instanceAssignment);\r\n },\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.selectedOwnershipGroupChanged(null);\r\n vm.removeInstanceAssignment(item.instanceAssignment.Id);\r\n }\r\n }\r\n ]\r\n\r\n vm.$onChanges = activate;\r\n\r\n function activate() {\r\n vm.ownershipGroupTypeName = vm.scheduleInstance.OwnershipGroupTypeName;\r\n vm.reviewType = vm.scheduleInstance.ReviewType;\r\n vm.routingCriteriaEnabled = vm.reviewType === 'SecurityRole' || vm.reviewType === 'Risk' || vm.reviewType === 'BusinessProcess' ? true : false;\r\n setInstanceAssignments();\r\n }\r\n\r\n async function setInstanceAssignments() {\r\n vm.loadingAssignments = true;\r\n let { data } = await reviewSchedulesDataService.getInstanceAssignments(vm.scheduleInstance.Id);\r\n vm.instanceAssignmentsDisplayList = data;\r\n vm.loadingAssignments = false;\r\n }\r\n\r\n async function openDefineRoutingCriteriaModal(instanceAssignment) {\r\n\r\n let routingCriteriaModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/scheduleInstanceAssignmentsList/routingCriteriaModal/routingCriteriaModal.html',\r\n controller: routingCriteriaModalController,\r\n controllerAs: 'rcmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n existingSchedules: () => vm.instanceAssignmentsDisplayList || null,\r\n reviewAssignmentId: () => instanceAssignment.Id,\r\n ownershipGroupTypeName: () => vm.ownershipGroupTypeName\r\n }\r\n });\r\n\r\n try {\r\n let modifiedAssignment = await routingCriteriaModal.result;\r\n if (modifiedAssignment) {\r\n instanceAssignment = { ...instanceAssignment };\r\n selectedOwnershipGroupChanged(instanceAssignment);\r\n }\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function openInstanceAssignmentModal() {\r\n let instanceAssignmentModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/scheduleInstanceAssignmentsList/instanceAssignmentModal.tmpl.html',\r\n controller: instanceAssignmentModalController,\r\n controllerAs: 'iamvm',\r\n backdrop: 'static',\r\n resolve: {\r\n existingSchedules: () => vm.instanceAssignmentsDisplayList || null,\r\n reviewInstance: () => vm.scheduleInstance,\r\n ownershipGroupTypeName: () => vm.ownershipGroupTypeName,\r\n }\r\n });\r\n\r\n try {\r\n await instanceAssignmentModal.result;\r\n await setInstanceAssignments();\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function openGroupAssignmentsModal(group) {\r\n $uibModal.open({\r\n template: `\r\n `,\r\n controller: /*@ngInject*/ function (ownershipGroup, $uibModalInstance) {\r\n const vm = this;\r\n\r\n vm.ownershipGroup = ownershipGroup;\r\n\r\n vm.dismiss = dismiss;\r\n\r\n function dismiss() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n },\r\n controllerAs: 'ogamvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => {\r\n return { GroupType: group.OwnershipGroupType, Id: group.OwnershipGroupId, Name: group.OwnershipGroupName, TypeName: group.ReviewTypeName };\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function removeInstanceAssignment(assignmentId) {\r\n vm.processingAssignments = true;\r\n try {\r\n await reviewAssignmentsDataService.deleteReview(assignmentId);\r\n vm.processingAssignments = false;\r\n await setInstanceAssignments();\r\n } catch {\r\n vm.processingAssignments = false;\r\n }\r\n }\r\n\r\n async function selectedOwnershipGroupChanged(ownershipGroup) {\r\n vm.onSelectOwnershipGroup({ ownershipGroup });\r\n }\r\n}","/* instanceAssignmentsList.component.js */\r\n\r\nimport instanceAssignmentsListController from \"./instanceAssignmentsList.controller\";\r\n\r\n/**\r\n * @desc component for viewing and managing access certifications review schedule instance assignments\r\n * @example \r\n */\r\n\r\nconst scheduleInstanceAssignmentsList = {\r\n bindings: {\r\n scheduleInstance: '<',\r\n onSelectOwnershipGroup: '&'\r\n },\r\n controller: instanceAssignmentsListController,\r\n controllerAs: 'ialvm',\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/scheduleInstanceAssignmentsList/instanceAssignmentsList.tmpl.html'\r\n};\r\n\r\nexport default scheduleInstanceAssignmentsList;","\r\nexport default /*@ngInject*/ function ($uibModalInstance, ownershipGroupsDataService, ownershipGroupName, routingCriteriaData) {\r\n\r\n const vm = this;\r\n vm.dismiss = dismiss;\r\n activate();\r\n\r\n async function activate() {\r\n vm.ownershipGroupName = ownershipGroupName;\r\n vm.ownershipGroupId = routingCriteriaData.RoutingCriteriaOwnershipGroupId;\r\n vm.routingCriteriaOwnershipGroups = await getOwnershipGroups();\r\n vm.routingCriteriaOwnershipGroup = vm.routingCriteriaOwnershipGroups.find(ownershipGroup => ownershipGroup.Id === vm.ownershipGroupId); \r\n }\r\n\r\n async function getOwnershipGroups() {\r\n let { data } = await ownershipGroupsDataService.getOwnershipGroups();\r\n return data.filter(group => group.TypeName === 'Company');\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import routingCriteriaInstanceModalController from \"./routingCriteriaInstanceModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (reviewSchedulesDataService, ownershipGroupsDataService, $uibModal) {\r\n const vm = this;\r\n\r\n vm.openRoutingCriteriaInstanceModal = openRoutingCriteriaInstanceModal;\r\n vm.removeRoutingCriteria = removeRoutingCriteria;\r\n vm.$onChanges = activate;\r\n vm.$onInit = activate;\r\n \r\n async function activate() {\r\n vm.ownershipGroupsList = await getOwnershipGroups();\r\n setRoutingCriteriaInstances(vm.ownershipGroup?.Id); \r\n }\r\n\r\n async function setRoutingCriteriaInstances(id) {\r\n vm.loadingAssignments = true;\r\n\r\n let response = await reviewSchedulesDataService.getRoutingCriteria(id);\r\n vm.routingCriteriaList = response.data.reduce((routingCriteriaArray, currentCriteria) => {\r\n const routingCriteria = {\r\n Id: currentCriteria.Id,\r\n ReviewAssignmentId: currentCriteria.ReviewAssignmentId,\r\n RoutingCriteriaOwnershipGroupId: currentCriteria.RoutingCriteriaOwnershipGroupId,\r\n RoutingCriteriaOwnershipGroupName: vm.ownershipGroupsList\r\n .find(ownershipGroup => ownershipGroup.Id === currentCriteria.RoutingCriteriaOwnershipGroupId)\r\n .Name\r\n }\r\n routingCriteriaArray.push(routingCriteria);\r\n return routingCriteriaArray;\r\n }, []);\r\n\r\n vm.loadingAssignments = false;\r\n }\r\n\r\n async function openRoutingCriteriaInstanceModal(routingCriteriaInstance) {\r\n\r\n let routingCriteriaInstanceModal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/routingCriteriaInstancesList/routingCriteriaInstanceModal.tmpl.html',\r\n controller: routingCriteriaInstanceModalController,\r\n controllerAs: 'rcimvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroupName: () => routingCriteriaInstance.RoutingCriteriaOwnershipGroupName,\r\n routingCriteriaData: () => routingCriteriaInstance\r\n }\r\n });\r\n\r\n try {\r\n await routingCriteriaInstanceModal.result;\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function getOwnershipGroups() {\r\n let { data } = await ownershipGroupsDataService.getOwnershipGroups();\r\n return data.filter(group => group.TypeName === 'Company');\r\n }\r\n\r\n async function removeRoutingCriteria(item) {\r\n await reviewSchedulesDataService.deleteRoutingCriteria(item.reviewAssignmentId, item.Id);\r\n await setRoutingCriteriaInstances(vm.ownershipGroup.Id);\r\n }\r\n\r\n}","/* routingCriteriaInstancesList.component.js */\r\n\r\nimport routingCriteriaInstancesListController from \"./routingCriteriaInstancesList.controller\";\r\n\r\n/**\r\n * @desc component for viewing and managing access certifications review schedule and assignment items\r\n * @example \r\n */\r\n\r\nconst routingCriteriaInstancesList = {\r\n bindings: {\r\n ownershipGroup: '<'\r\n },\r\n controller: routingCriteriaInstancesListController,\r\n controllerAs: 'rcilvm',\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/routingCriteriaInstancesList/routingCriteriaInstancesList.tmpl.html'\r\n};\r\n\r\nexport default routingCriteriaInstancesList;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModalInstance, helperService, notificationTeamsDataService, dataService, teamMembersList, teamType, selectedProduct) {\r\n\r\n const vm = this;\r\n\r\n teamMembersList = [...teamMembersList];\r\n\r\n vm.cancel = cancel;\r\n vm.addTeamMember = addTeamMember;\r\n\r\n function activate() {\r\n setupUsersGrid();\r\n createAvailableUsersDataSource();\r\n }\r\n\r\n activate();\r\n\r\n function setupUsersGrid() {\r\n let availableGridColumns = [\r\n { title: \"Name\", field: \"UserLogonName\", filterable: customAutoCompleteFilter },\r\n { title: \"Email\", field: \"Email\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \"\", width: 20, filterable: false }\r\n ];\r\n\r\n vm.availableUsersGridOptions = helperService.setMainGridOptions(availableGridColumns, null);\r\n vm.availableUsersGridOptions.selectable = false;\r\n }\r\n\r\n\r\n function createAvailableUsersDataSource() {\r\n vm.availableUsersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await dataService.getUsers();\r\n vm.users = await response.data;\r\n teamMembersList.forEach(member => {\r\n vm.users = vm.users.filter(user => user.UserLogonName !== member.UserLogonName);\r\n });\r\n vm.users = vm.users.filter(user => user.Active === true);\r\n vm.users = $filter('orderBy')(vm.users, 'UserLogonName');\r\n options.success(vm.users);\r\n } catch {\r\n return;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function addTeamMember(user) {\r\n kendo.ui.progress(vm.availableUsersGrid.element, true);\r\n\r\n const newTeamMemberInfo = {\r\n AdmUserId: user.UserID,\r\n TeamType: teamType,\r\n ProductId: selectedProduct?.ID\r\n }\r\n\r\n try {\r\n await notificationTeamsDataService.addTeamMember(newTeamMemberInfo);\r\n teamMembersList.push(user);\r\n kendo.ui.progress(vm.availableUsersGrid.element, false);\r\n vm.availableUsersGridDataSource.read();\r\n } catch {\r\n kendo.ui.progress(vm.availableUsersGrid.element, false);\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n}","import addTeamMemberModalController from \"./addTeamMemberModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, dataService, notificationTeamsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.teamsList = [];\r\n\r\n vm.selectTeam = selectTeam;\r\n vm.selectProduct = selectProduct;\r\n vm.openAddTeamMemberModal = openAddTeamMemberModal;\r\n vm.removeTeamMember = removeTeamMember;\r\n\r\n activate();\r\n\r\n function activate() {\r\n vm.teamsList = [{ Name: 'Security Team', TeamType: 'Security', urlString: 'security' },\r\n { Name: 'Audit Team', TeamType: 'Audit', urlString: 'audit' },\r\n { Name: 'Access Certification Administrators Team', TeamType: 'AccessCertificationAdministrators', urlString: 'access-certification-administrators' }];\r\n\r\n vm.teamsList = $filter('orderBy')(vm.teamsList, 'Name');\r\n }\r\n\r\n function selectTeam(team) {\r\n vm.selectedTeam = team;\r\n\r\n if (team.TeamType === 'Security') {\r\n getAssociatedProducts();\r\n } else {\r\n vm.selectedProduct = null;\r\n getTeamMembers(team.urlString);\r\n }\r\n }\r\n\r\n async function getTeamMembers(teamTypeUrlString) {\r\n vm.loadingTeamMembers = true;\r\n\r\n try {\r\n let { data } = await notificationTeamsDataService.getTeamMembers(teamTypeUrlString);\r\n vm.teamMembersList = $filter('orderBy')(data, 'UserLogonName');\r\n vm.loadingTeamMembers = false;\r\n } catch {\r\n vm.loadingTeamMembers = false;\r\n }\r\n }\r\n\r\n async function selectProduct(product) {\r\n vm.selectedProduct = product;\r\n vm.selectedTeamMember = null;\r\n vm.loadingSelectedProductTeamMembers = true;\r\n\r\n try {\r\n let { data } = await notificationTeamsDataService.getTeamMembersByProduct(product.ID);\r\n vm.teamMembersList = $filter('orderBy')(data, 'UserLogonName');\r\n vm.loadingSelectedProductTeamMembers = false;\r\n } catch {\r\n vm.loadingSelectedProductTeamMembers = false;\r\n }\r\n }\r\n\r\n async function getAssociatedProducts() {\r\n vm.loadingAssociatedProducts = true;\r\n\r\n try {\r\n let { data } = await dataService.getProducts();\r\n vm.associatedProductsList = $filter('orderBy')(data, 'Name');\r\n vm.loadingAssociatedProducts = false;\r\n } catch {\r\n vm.loadingAssociatedProducts = false;\r\n }\r\n }\r\n\r\n async function removeTeamMember(selectedTeamMember) {\r\n try {\r\n await notificationTeamsDataService.removeTeamMember(selectedTeamMember.Id);\r\n updateTeamMembersList();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openAddTeamMemberModal() {\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/Certifications/notificationTeams/addTeamMemberModal.html',\r\n controller: addTeamMemberModalController,\r\n controllerAs: 'atmmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n teamMembersList: () => vm.teamMembersList,\r\n teamType: () => vm.selectedTeam.TeamType,\r\n selectedProduct: () => vm.selectedProduct\r\n }\r\n });\r\n\r\n try {\r\n await modal.result;\r\n updateTeamMembersList();\r\n } catch (cancel) {\r\n return;\r\n }\r\n }\r\n\r\n function updateTeamMembersList() {\r\n if (vm.selectedProduct) {\r\n selectProduct(vm.selectedProduct);\r\n } else {\r\n getTeamMembers(vm.selectedTeam.urlString)\r\n }\r\n }\r\n}","/* notificationTeams.component.js */\r\n\r\nimport notificationTeamsController from \"./notificationTeams.controller\";\r\n\r\n/**\r\n * @desc component to view and manage the Audit and Security teams and their members\r\n * @example \r\n */\r\n\r\nconst notificationTeams = {\r\n controller: notificationTeamsController,\r\n controllerAs: 'ntvm',\r\n templateUrl: '/App/Components/Certifications/notificationTeams/notificationTeams.tmpl.html'\r\n};\r\n\r\nexport default notificationTeams;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function (helperService, $uibModalInstance, configurationDataService, roleSecurityProfileDataService, role) {\r\n\r\n const vm = this,\r\n fioriReportId = 'eaefba7b-1d22-47d7-8618-ce3cf439a98d';\r\n\r\n vm.roleCollapsed = true;\r\n vm.catalogCollapsed = true;\r\n vm.isWorkDay = false;\r\n vm.helperService = helperService;\r\n\r\n vm.$onInit = onInit;\r\n\r\n vm.toggleRoleAccess = toggleRoleAccess;\r\n vm.toggleFioriCatalog = toggleFioriCatalog;\r\n vm.cancel = cancel;\r\n\r\n async function onInit() {\r\n vm.securityRoleIdentifier = role?.SecurityRoleIdentifier || role.Identifier;\r\n vm.profile = await roleSecurityProfileDataService.getProfile(vm.securityRoleIdentifier);\r\n\r\n if (role.ProductType === 'WD') {\r\n vm.isWorkDay = true;\r\n vm.workDayProfileInformation = await roleSecurityProfileDataService.getWorkdayProfile(role.SecurityRoleId);\r\n }\r\n setupRoleGrid();\r\n\r\n vm.s4Enabled = vm.profile?.ProductType === 'SAP' ? await getS4Config() : false;\r\n\r\n if (vm.s4Enabled) {\r\n setupCatalogGrid();\r\n }\r\n }\r\n\r\n async function getS4Config() {\r\n const { data } = await configurationDataService.getProductConfigurationValueByName('SAP', 'SAP_ErpType');\r\n\r\n return data.Value === 'S4';\r\n }\r\n\r\n async function setupRoleGrid() {\r\n vm.roleGridColumns = [\r\n { field: \"SecurityObjectName\", title: \"Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Object Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectTypeName\", title: \"Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.roleGridOptions = helperService.setMainGridOptions(vm.roleGridColumns, 400);\r\n\r\n vm.roleGridDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n transport: {\r\n read: async options => {\r\n try {\r\n const { page, pageSize } = options.data,\r\n sortsAndFilters = helperService.prepareSortsAndFilters(options),\r\n { data } = await roleSecurityProfileDataService.getAccess(vm.securityRoleIdentifier, sortsAndFilters, page, pageSize);\r\n\r\n options.success(data);\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function setupCatalogGrid() {\r\n vm.catalogGridColumns = [\r\n { field: \"Role\", title: \"Role\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleDescription\", title: \"Role Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Catalog\", title: \"Catalog\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"CatalogDescription\", title: \"Catalog Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"FioriID\", title: \"Fiori Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"FioriDescription\", title: \"Fiori Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SemanticObject\", title: \"Semantic Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SemanticAction\", title: \"Semantic Action\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.catalogGridOptions = helperService.setMainGridOptions(vm.catalogGridColumns, 400);\r\n\r\n vm.catalogGridDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n noRecords: {\r\n template: \"No items to display
\"\r\n },\r\n transport: {\r\n read: async options => {\r\n try {\r\n const { page, pageSize } = options.data;\r\n let sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n //Only show data for role in profile\r\n sortsAndFilters.Filters.push({ FieldName: \"Role\", Operator: \"Equals\", Value: vm.profile.Name })\r\n const { data } = await roleSecurityProfileDataService.getCatalog(fioriReportId, sortsAndFilters, page, pageSize);\r\n\r\n options.success(data);\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function toggleRoleAccess() {\r\n vm.roleCollapsed = !vm.roleCollapsed;\r\n\r\n if (vm.roleCollapsed) {\r\n return;\r\n } else {\r\n vm.roleGridDataSource.read();\r\n }\r\n }\r\n\r\n function toggleFioriCatalog() {\r\n vm.catalogCollapsed = !vm.catalogCollapsed;\r\n\r\n if (vm.catalogCollapsed) {\r\n return;\r\n } else {\r\n vm.catalogGridDataSource.read();\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import roleSecurityProfileModalController from \"./roleSecurityProfileModal/roleSecurityProfileModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.openRoleSecurityProfile = openRoleSecurityProfile;\r\n\r\n async function openRoleSecurityProfile(role) {\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Components/roleSecurityProfile/roleSecurityProfileModal/roleSecurityProfileModal.tmpl.html',\r\n controller: roleSecurityProfileModalController,\r\n controllerAs: 'rspmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n role: () => vm.role\r\n }\r\n });\r\n\r\n }\r\n}","/* roleSecurityProfile.component.js */\r\n\r\nimport roleSecurityProfileController from \"./roleSecurityProfile.controller\";\r\n\r\n/**\r\n * @desc component for opening and viewing Role Security Profile\r\n * @example \r\n */\r\n\r\nconst roleSecurityProfile = {\r\n bindings: {\r\n role: '<'\r\n },\r\n controller: roleSecurityProfileController,\r\n controllerAs: 'rspvm',\r\n template:\r\n `\r\n \r\n \r\n `\r\n};\r\n\r\nexport default roleSecurityProfile;","import angular from 'angular';\r\nimport certificationsAllReviewController from '../Components/Certifications/AllReviews/certificationsAllReview.controller';\r\nimport accessCertificationsFactoriesModule from './accessCertifications.factories.module';\r\nimport myReviewsController from '../Components/Certifications/MyReviews/myReviews.controller';\r\nimport reviewSchedules from '../Components/Certifications/reviewSchedules/reviewSchedules.component';\r\nimport securityRoleContentItemsList from '../Components/Certifications/MyReviews/SecurityRoleContentItemsList/securityRoleContentItemsList.component';\r\nimport linkTicketsDropdown from '../Components/Certifications/LinkTickets/linkTicketsDropdown.component';\r\nimport reviewScheduleInstancesList from '../Components/Certifications/reviewSchedules/reviewScheduleInstancesList/reviewScheduleInstancesList.component';\r\nimport scheduleInstanceAssignmentsList from '../Components/Certifications/reviewSchedules/scheduleInstanceAssignmentsList/instanceAssignmentsList.component';\r\nimport routingCriteriaInstancesList from '../Components/Certifications/reviewSchedules/routingCriteriaInstancesList/routingCriteriaInstancesList.component';\r\nimport notificationTeams from '../Components/Certifications/notificationTeams/notificationTeams.component';\r\nimport roleSecurityProfile from '../Shared/Components/roleSecurityProfile/roleSecurityProfile.component';\r\n\r\nexport default angular\r\n .module('app.accessCertifications', [accessCertificationsFactoriesModule])\r\n .controller(\"certificationsAllReviewController\", certificationsAllReviewController)\r\n .controller(\"MyReviewsController\", myReviewsController)\r\n .component('securityRoleContentItemsList', securityRoleContentItemsList)\r\n .component('linkTicketsDropdown', linkTicketsDropdown)\r\n .component('reviewSchedules', reviewSchedules)\r\n .component('reviewScheduleInstancesList', reviewScheduleInstancesList)\r\n .component('reviewScheduleInstanceAssignmentsList', scheduleInstanceAssignmentsList)\r\n .component('reviewScheduleRoutingCriteriaInstancesList', routingCriteriaInstancesList)\r\n .component('notificationTeams', notificationTeams)\r\n .component('roleSecurityProfile', roleSecurityProfile )\r\n .name;","/* reviewSchedules.component.js */\r\n\r\nimport reviewSchedulesController from \"./reviewSchedules.controller\";\r\n\r\n/**\r\n * @desc component for viewing and managing access certifications review schedules and assignments\r\n * @example \r\n */\r\n\r\nconst reviewSchedules = {\r\n controller: reviewSchedulesController,\r\n controllerAs: 'rsvm',\r\n templateUrl: '/App/Components/Certifications/reviewSchedules/reviewSchedules.tmpl.html'\r\n};\r\n\r\nexport default reviewSchedules;","export default /*@ngInject*/ function () {\r\n const vm = this;\r\n\r\n vm.selectedScheduleChanged = selectedScheduleChanged;\r\n vm.reviewAssignmentsUpdated = reviewAssignmentsUpdated;\r\n vm.selectedOwnershipGroupChanged = selectedOwnershipGroupChanged;\r\n\r\n function selectedScheduleChanged(schedule) {\r\n vm.selectedInstanceAssignment = null;\r\n vm.selectedOwnershipGroup = null;\r\n vm.selectedSchedule = schedule;\r\n }\r\n\r\n function selectedOwnershipGroupChanged(ownershipGroup) {\r\n vm.selectedOwnershipGroup = ownershipGroup;\r\n }\r\n\r\n function reviewAssignmentsUpdated(updateList) {\r\n vm.updateAssignmentsList = updateList;\r\n }\r\n}","import { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\nimport { standardGridPageSize, customDatePickerNotNullableFilter, customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, dataService, objectIdDataService, CustomReportServices, $filter, $http, helperService, AuditTrailEntityDataService, reportsDataService, reportsService) {\r\n\r\n const vm = $scope.vm = {};\r\n\r\n vm.RelativeDateTypeDataSource = CustomReportServices.getRelativeDateTypes();\r\n vm.PeriodTypeDataSource = CustomReportServices.getPeriodTypes();\r\n $scope.onRead = onRead;\r\n\r\n vm.RelativeDateType = 2;\r\n vm.PeriodType = 0;\r\n $scope.dateCriteria = [\r\n {\r\n \"DataType\": \"DateTime\",\r\n \"FieldName\": \"Date\",\r\n \"IsNullable\": false\r\n }\r\n ];\r\n\r\n vm.selectedTemplateType = [];\r\n $scope.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n $scope.mainGridOptions.autoBind = false;\r\n $scope.helperService = helperService;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n vm.filterCriteria.dateQuery = [];\r\n // ---\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if ($scope.grid) {\r\n $scope.gridReady = true;\r\n $scope.runSavedReport();\r\n }\r\n });\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getObjectId();\r\n getProducts();\r\n }\r\n\r\n async function getObjectId() {\r\n let objectId = await objectIdDataService.getObjectID();\r\n // Needed for report toolbar controller functions\r\n $scope.ObjectId = objectId;\r\n $scope.reportName = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId).Name;\r\n $scope.filtersDataSource = CustomReportServices.setfiltersDataSource($scope.ObjectId);\r\n }\r\n\r\n async function getProducts() {\r\n let { data: products } = await dataService.getProducts();\r\n\r\n vm.productsDataSource = products.filter(product => product.HasAuditTrailModule);\r\n\r\n //Filter Netsuite and Oracle Cloud products from dropdown as they have their own custom Data Changes reports\r\n vm.productsDataSource = products.filter(product => product.ID !== 'NS' && product.ID !== 'ORFC');\r\n\r\n\r\n let defaultProduct = vm.productsDataSource.find(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n let defaultProductSelected = vm.productsDataSource.indexOf(defaultProduct);\r\n let defaultProductExists = vm.productsDataSource.some(obj => obj.Name === $rootScope.UserPreferences.PreferredProduct);\r\n if (defaultProductExists) {\r\n if ($rootScope.UserPreferences.PreferredProduct !== null) {\r\n vm.selectedProduct = vm.productsDataSource[defaultProductSelected];\r\n } else {\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n } else {\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n\r\n if ($rootScope.loadedSavedReport) {\r\n loadSavedReportCriteria();\r\n }\r\n vm.selectedProduct = SavedReportSelectorService.checkSavedReportForSingleProduct($rootScope.loadedSavedReport, products, vm.selectedProduct);\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n $scope.productDropdownChange();\r\n }\r\n\r\n $scope.runSavedReport = async function () {\r\n if ($scope.gridReady && $rootScope.loadedSavedReport && vm.productsDataSource && vm.templateTypesDataSource && vm.filterCriteria.fields) {\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n // Convert date filters to criteria\r\n const dateFieldName = vm.selectedProduct.Type === 'AX' ? 'TimeStamp' : vm.selectedProduct.Type === 'AX7' ? 'ModifiedOn' : vm.selectedProduct.Type === 'SF' ? 'CreatedDate' : 'Date';\r\n\r\n if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.DateFilters.length > 0) {\r\n const criteriaDateFilterIndex = $rootScope.loadedSavedReport.ReportDefinition.DateFilters.findIndex(filter => filter.FieldName === dateFieldName);\r\n if (criteriaDateFilterIndex > -1) {\r\n loadDateFilterAsCriteria($rootScope.loadedSavedReport.ReportDefinition.DateFilters[criteriaDateFilterIndex]);\r\n $rootScope.loadedSavedReport.ReportDefinition.DateFilters.splice(criteriaDateFilterIndex, 1);\r\n }\r\n } else if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.Filters.length > 0) {\r\n const dateRangeFilters = $rootScope.loadedSavedReport.ReportDefinition.Filters.filter(filter => filter.FieldName === dateFieldName);\r\n if (dateRangeFilters.length > 0) {\r\n $rootScope.loadedSavedReport.ReportDefinition.Filters = $rootScope.loadedSavedReport.ReportDefinition.Filters.filter(filter => filter.FieldName !== dateFieldName);\r\n dateRangeFilters.forEach(filter => {\r\n loadDateFilterAsCriteria(filter);\r\n });\r\n }\r\n }\r\n\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n $scope.generateGridWithSelectedValues();\r\n } else if ($scope.gridReady && !$rootScope.loadedSavedReport && vm.productsDataSource && vm.templateTypesDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n $scope.populateCriteriaModel();\r\n }\r\n };\r\n\r\n function loadDateFilterAsCriteria(DateFilter) {\r\n if (DateFilter.Operator === 'GreaterThanOrEqual' || DateFilter.Operator === 'LessThanOrEqual') {\r\n if (!$rootScope.loadedSavedReport.ReportDefinition.Criteria[0]) {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria = [{\r\n \"CriteriaType\": \"Date\",\r\n \"CriteriaValue\": DateFilter.FieldName,\r\n Filters: []\r\n }];\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria[0].Filters.push(DateFilter);\r\n } else {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria[0].Filters.push(DateFilter);\r\n }\r\n } else {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria = [{\r\n \"CriteriaType\": \"Date\",\r\n \"CriteriaValue\": DateFilter.FieldName,\r\n Filters: []\r\n }];\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria[0].DateFilter = DateFilter;\r\n }\r\n }\r\n\r\n function setupFilters() {\r\n if (!$scope.sortsAndFilters) {\r\n $scope.sortsAndFilters = {};\r\n }\r\n if (!$scope.sortsAndFilters.Filters) {\r\n $scope.sortsAndFilters.Filters = [];\r\n }\r\n if (!$scope.sortsAndFilters.DateFilter) {\r\n $scope.sortsAndFilters.DateFilters = [];\r\n }\r\n\r\n let dateFilters = $scope.getDateFilters();\r\n\r\n if (dateFilters) {\r\n $scope.sortsAndFilters.Criteria = dateFilters.Criteria;\r\n $scope.sortsAndFilters.Filters = $scope.sortsAndFilters.Filters.concat(dateFilters.Filters);\r\n $scope.sortsAndFilters.Filters = getUniqueObjects($scope.sortsAndFilters.Filters);\r\n if (dateFilters.RelativeFilter && !dateFilters.Criteria) {\r\n $scope.sortsAndFilters.DateFilters.push(dateFilters.RelativeFilter);\r\n } else {\r\n $scope.sortsAndFilters.DateFilters = [];\r\n }\r\n }\r\n }\r\n\r\n $scope.productDropdownChange = function () {\r\n getTemplates();\r\n vm.setColumns();\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n setReportMetadata();\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n $scope.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n ModifiedDate: { type: \"date\" },\r\n ChangeDate: { type: \"date\" },\r\n TimeStamp: { type: \"date\" },\r\n ModifiedOn: { type: \"date\" },\r\n dateandTime: { type: \"date\" },\r\n Date: { type: \"date\" },\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n var data = {\r\n 'TemplateIds': $scope.templateTypes\r\n };\r\n $scope.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n setupFilters();\r\n\r\n if (vm.selectedProduct.Type === \"D365Bc\" || vm.selectedProduct.Type === 'SF' || vm.selectedProduct.Type === 'WD') {\r\n data = {\r\n QueryInput: $scope.sortsAndFilters\r\n }\r\n } else {\r\n data.QueryInput = $scope.sortsAndFilters;\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n data['QueryInput'].DateFilters = data['QueryInput'].DateFilters.concat(vm.filterCriteria.dateQuery);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: $scope.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n $scope.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType($scope.ObjectId, vm.selectedProduct.Type).ReportID;\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n function loadSavedReportCriteria() {\r\n if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.Criteria) {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria.forEach(function (criteria) {\r\n if (criteria.DateFilter) {\r\n switch (criteria.DateFilter.DateType) {\r\n case 'Previous':\r\n vm.RelativeDateType = 0;\r\n vm.PeriodType = $scope.getPeriodId(criteria.DateFilter.Period);\r\n break;\r\n\r\n case 'ToDate':\r\n vm.RelativeDateType = 1;\r\n vm.PeriodType = $scope.getPeriodId(criteria.DateFilter.Period);\r\n break;\r\n\r\n case 'LastNumberOf':\r\n vm.RelativeDateType = 2;\r\n vm.PeriodType = $scope.getPeriodId(criteria.DateFilter.Period);\r\n vm.LastNumberOf = criteria.DateFilter.Value;\r\n break;\r\n\r\n }\r\n }\r\n if (criteria.Filters.length > 0) {\r\n criteria.Filters.forEach(function (filter) {\r\n switch (filter.Operator) {\r\n case 'GreaterThanOrEqual':\r\n vm.RelativeDateType = 4;\r\n $scope.vm.startDate = new Date(filter.Value);\r\n break;\r\n\r\n case 'LessThanOrEqual':\r\n vm.RelativeDateType = 4;\r\n $scope.vm.endDate = new Date(filter.Value);\r\n break;\r\n }\r\n });\r\n }\r\n });\r\n\r\n }\r\n\r\n if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.DateFilters.length > 0) {\r\n const dateFilter = $rootScope.loadedSavedReport.ReportDefinition.DateFilters[0];\r\n switch (dateFilter.DateType) {\r\n case 'Previous':\r\n vm.RelativeDateType = 0;\r\n vm.PeriodType = $scope.getPeriodId(dateFilter.Period);\r\n break;\r\n\r\n case 'ToDate':\r\n vm.RelativeDateType = 1;\r\n vm.PeriodType = $scope.getPeriodId(dateFilter.Period);\r\n break;\r\n\r\n case 'LastNumberOf':\r\n vm.RelativeDateType = 2;\r\n vm.PeriodType = $scope.getPeriodId(dateFilter.Period);\r\n vm.LastNumberOf = dateFilter.Value;\r\n break;\r\n\r\n }\r\n }\r\n }\r\n\r\n vm.deselectSelectedTemplateType = function () {\r\n\r\n if (vm.selectedTemplateType && vm.selectedTemplateType[vm.selectedTemplateType.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.selectedTemplateType.forEach(function (row, i) {\r\n if (row.Id === 'AllObjectsInMultiSelect') {\r\n vm.selectedTemplateType.splice(i, 1);\r\n }\r\n });\r\n } else if (vm.selectedProduct.Type === 'GP' || vm.selectedProduct.Type === 'AX' || vm.selectedProduct.Type === 'AX5' || vm.selectedProduct.Type === 'NAV' || vm.selectedProduct.Type === 'SL') {\r\n vm.selectedTemplateType = [{ \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n } else {\r\n vm.selectedTemplateType = [{ \"Name\": \"All Template Types\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n }\r\n $scope.populateCriteriaModel();\r\n };\r\n\r\n function getTemplates() {\r\n if (vm.selectedProduct.Type === 'AX7') {\r\n vm.templateDropdownIsLoading = true;\r\n AuditTrailEntityDataService.getAllTemplates().then(function (response) {\r\n\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n //removes template Type if Insert, Update, Delete are all false\r\n response.data.remove(function (el) { return el.Insert === false && el.Update === false && el.Delete === false; });\r\n\r\n var All = { \"Name\": \"All Template Types\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n\r\n });\r\n } else if (vm.selectedProduct.Type === 'SAP') {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/sap/' + vm.selectedProduct.ID + '/templates').then(function (response) {\r\n response.data.forEach(function (row) {\r\n row['Id'] = row.Name;\r\n });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Template Types\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else if (vm.selectedProduct.Type === 'OR') {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/or/templates').then(function (response) {\r\n response.data.forEach(function (row) {\r\n row['Id'] = row.Name;\r\n });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Template Types\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else if (vm.selectedProduct.Type === 'AX') {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/ax/tables').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else if (vm.selectedProduct.Type === 'GP') {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/gp/tables').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else if (vm.selectedProduct.Type === 'NAV') {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/nav/tables').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else if (vm.selectedProduct.Type === 'AX5') {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/ax5/tables').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else if (vm.selectedProduct.Type === 'SL') {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/sl/tables').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else if (vm.selectedProduct.IsCustom) {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n $http.get(apiUrl + 'api/audittrail/universal/' + vm.selectedProduct.ID +'/tables').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n var All = { \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.selectedTemplateType = [All];\r\n vm.selectedTemplateType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplateType);\r\n $scope.runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n\r\n });\r\n } else {\r\n vm.templateTypesDataSource = [];\r\n }\r\n }\r\n\r\n //Start Date picker settings\r\n $scope.thirtyDaysAgo = function () {\r\n var newDate = new Date();\r\n newDate.setDate(newDate.getDate() - 30);\r\n $scope.startDate = newDate;\r\n $scope.startDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"StartDate\", $scope.startDate);\r\n };\r\n $scope.thirtyDaysAgo();\r\n\r\n $scope.startDateOptions = {\r\n dateDisabled: disabled,\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n function disabled(data) {\r\n var date = data.date,\r\n mode = data.mode;\r\n return mode === 'day' && date > $scope.endDate;\r\n }\r\n\r\n $scope.openStartDate = function () {\r\n $scope.startDatePopup.opened = true;\r\n };\r\n\r\n $scope.startDatePopup = {\r\n opened: false\r\n };\r\n\r\n //End Date picker settings\r\n $scope.today = function () {\r\n $scope.endDate = new Date();\r\n $scope.endDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"EndDate\", $scope.endDate);\r\n };\r\n $scope.today();\r\n\r\n $scope.endDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n startingDay: 1\r\n };\r\n\r\n $scope.openEndDate = function () {\r\n $scope.endDatePopup.opened = true;\r\n };\r\n\r\n $scope.endDatePopup = {\r\n opened: false\r\n };\r\n\r\n $scope.populateCriteriaModel = function () {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedProduct || vm.selectedTemplateType === undefined) {\r\n return;\r\n }\r\n var criteria = [];\r\n\r\n $scope.product = vm.selectedProduct.ID;\r\n $scope.productType = vm.selectedProduct.Type;\r\n\r\n $scope.templateTypes = helperService.returnNullIfAllIsFound(vm.selectedTemplateType.map(function (el) { return el.Id; }));\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', vm.selectedProduct.Name, vm.selectedProduct.ID));\r\n\r\n vm.selectedTemplateType.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"TemplateIds\", 'TemplateId', row.Name, row.Id));\r\n });\r\n\r\n setupFilters();\r\n\r\n if (vm.selectedProduct.IsCustom) {\r\n $scope.urlString = apiUrl + 'api/audittrail/universal/' + $scope.productType + '/datachanges';\r\n } else {\r\n $scope.urlString = apiUrl + 'api/audittrail/' + $scope.productType + '/datachanges';\r\n }\r\n\r\n $scope.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo($scope);\r\n }\r\n\r\n };\r\n\r\n $scope.generateGridWithSelectedValues = function () {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.dataSource._filter = null;\r\n $scope.grid.dataSource._sort = null;\r\n }\r\n\r\n if ($scope.startDate <= $scope.endDate) {\r\n $scope.populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, $scope.grid, true);\r\n } else {\r\n helperService.showErrorMessage(\"Start Date must be before or equal to End Date\");\r\n }\r\n };\r\n\r\n function onRead() {\r\n $scope.gridDataSource.read();\r\n }\r\n\r\n const rowSettingsTemplate = ``;\r\n\r\n var ticketTemplate = `{{ dataItem.TicketProvider }} {{dataItem.TicketId}}\r\n {{ dataItem.TicketProvider }} {{dataItem.TicketId}}`;\r\n\r\n vm.setColumns = function () {\r\n if (vm.selectedProduct) {\r\n if (vm.selectedProduct.Type === 'AX7') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"ModifiedOn\", title: \"Modified On\", template: \"{{ dataItem.ModifiedOn | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"TableLabel\", title: \"Table Label\", filterable: customAutoCompleteFilter },\r\n { field: \"ColumnLabel\", title: \"Column Label\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"ModifiedBy\", title: \"Modified By\", filterable: customAutoCompleteFilter },\r\n { field: \"CompanyName\", title: \"Company\", filterable: customAutoCompleteFilter },\r\n\r\n { field: \"TitleField1\", title: \"Title Field 1\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TitleField2\", title: \"Title Field 2\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"RecId\", title: \"Rec Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyId\", title: \"Company Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TableId\", title: \"Table Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"ColumnId\", title: \"Column Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"ObjRecId\", title: \"Obj Rec Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TicketId\", title: \"Ticket Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"AtHeaderTicketId\", title: \"Header Ticket Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TicketUrl\", title: \"Ticket Url\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TicketProvider\", title: \"Ticket Provider\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TableName\", title: \"Table Name\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"ColumnName\", title: \"Column Name\", hidden: true, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n } else if (vm.selectedProduct.Type === 'SAP') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"ChangeDate\", title: \"Date\", template: \"{{ dataItem.ChangeDate | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"Template\", title: \"Template\", filterable: customAutoCompleteFilter },\r\n { field: \"TableName\", title: \"Table\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"FieldName\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"User\", title: \"User\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'OR') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"ChangeDate\", title: \"Date\", template: \"{{ dataItem.ChangeDate | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"Template\", title: \"Template\", filterable: customAutoCompleteFilter },\r\n { field: \"TableName\", title: \"Table\", filterable: customAutoCompleteFilter },\r\n { field: \"KeyField\", title: \"Key Field\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"FieldName\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"FieldDescription\", title: \"Field Description\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"User\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"Responsibility\", title: \"Responsibility\", filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'AX') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"TimeStamp\", title: \"Date\", template: \"{{ dataItem.TimeStamp | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"TableName\", title: \"Table Name\", filterable: customAutoCompleteFilter },\r\n { field: \"TableSystemName\", title: \"Table System Name\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"ColumnName\", title: \"Column Name\", filterable: customAutoCompleteFilter },\r\n { field: \"ColumnSystemName\", title: \"Column System Name\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyName\", title: \"Company Name\", filterable: customAutoCompleteFilter },\r\n { field: \"CompanyId\", title: \"Company Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"User\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", filterable: customAutoCompleteFilter },\r\n { field: \"Machine\", title: \"Machine\", filterable: customAutoCompleteFilter },\r\n { field: \"KeyField\", title: \"Key Field\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'NAV' || vm.selectedProduct.Type === 'SL' || vm.selectedProduct.Type === 'AX5') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"TableName\", title: \"Table\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", filterable: customAutoCompleteFilter },\r\n { field: \"KeyField\", title: \"Key Field\", filterable: customAutoCompleteFilter },\r\n { field: \"ColumnName\", title: \"Column Name\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"User\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", filterable: customAutoCompleteFilter },\r\n { field: \"Machine\", title: \"Machine\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'GP') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"TableName\", title: \"Table\", filterable: customAutoCompleteFilter },\r\n { field: \"UserTableName\", title: \"Table Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", filterable: customAutoCompleteFilter },\r\n { field: \"KeyField\", title: \"Key Field\", filterable: customAutoCompleteFilter },\r\n { field: \"ColumnName\", title: \"Column Name\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"User\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", filterable: customAutoCompleteFilter },\r\n { field: \"Machine\", title: \"Machine\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'D365Bc') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"dateandTime\", title: \"Date And Time\", template: \"{{ dataItem.dateandTime | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"TableName\", title: \"Table Name\", filterable: customAutoCompleteFilter },\r\n { field: \"tableNo\", title: \"Table Number\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"FieldName\", title: \"Field Name\", filterable: customAutoCompleteFilter },\r\n { field: \"fieldNo\", title: \"Field Number\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"typeOfChange\", title: \"Change Type\", filterable: customAutoCompleteFilter },\r\n { field: \"oldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"newValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"userId\", title: \"Modified By\", filterable: customAutoCompleteFilter },\r\n { field: \"primaryKeyField1Value\", title: \"Primary Key Field 1 Value\", filterable: customAutoCompleteFilter },\r\n { field: \"primaryKeyField1No\", title: \"Primary Key Field 1 Number\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"primaryKeyField2Value\", title: \"Primary Key Field 2 Value\", filterable: customAutoCompleteFilter },\r\n { field: \"primaryKeyField2No\", title: \"Primary Key Field 2 Number\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"primaryKeyField3Value\", title: \"Primary Key Field 3 Value\", filterable: customAutoCompleteFilter },\r\n { field: \"primaryKeyField3No\", title: \"Primary Key Field 3 Number\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"recId\", title: \"Record Id\", hidden: true, filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'SF') {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"CreatedDate\", title: \"Created Date\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"CreatedBy\", title: \"Created By\", filterable: customAutoCompleteFilter },\r\n { field: \"Object\", title: \"Object\", filterable: customAutoCompleteFilter },\r\n { field: \"ObjectName\", title: \"Object Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"DataType\", title: \"Data Type\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.Type === 'WD') {\r\n $scope.mainGridColumns = [\r\n { field: \"InstanceId\", title: \"Instance Id\", filterable: customAutoCompleteFilter },\r\n { field: \"WorkdayId\", title: \"Workday Id\", filterable: customAutoCompleteFilter },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"ClassesUpdated\", title: \"Classes Updated\", filterable: customAutoCompleteFilter },\r\n { field: \"TaskName\", title: \"Task Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"ChangeType\", title: \"Change Type\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"ModifiedBy\", title: \"Modified By\", filterable: customAutoCompleteFilter }\r\n ];\r\n } else if (vm.selectedProduct.IsCustom) {\r\n $scope.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"TableName\", title: \"Table\", filterable: customAutoCompleteFilter },\r\n { field: \"UserTableName\", title: \"Table Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Company\", filterable: customAutoCompleteFilter },\r\n { field: \"KeyField\", title: \"Key Field\", filterable: customAutoCompleteFilter },\r\n { field: \"ColumnName\", title: \"Column Name\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"User\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"Application\", title: \"Application\", filterable: customAutoCompleteFilter },\r\n { field: \"Machine\", title: \"Machine\", filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n $scope.mainGridOptions.sortable = false;\r\n\r\n $scope.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.setLayout();\r\n }\r\n };\r\n\r\n vm.setLayout = function () {\r\n\r\n var productId;\r\n if (vm.selectedProduct) {\r\n productId = vm.selectedProduct.ID;\r\n }\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout($scope, productId);\r\n }\r\n };\r\n\r\n $scope.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n $scope.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n $scope.applySelectedFilter = function () {\r\n helperService.applyFilterCatchError($scope);\r\n };\r\n\r\n $scope.deleteFilter = function (id) {\r\n CustomReportServices.deleteFilterFilterManager($scope, id);\r\n };\r\n\r\n $scope.clearAllFilters = function () {\r\n $scope.gridDataSource.filter({});\r\n };\r\n\r\n $scope.saveReportLayoutButton = function () {\r\n CustomReportServices.saveGridLayout($scope, vm.selectedProduct.ID);\r\n };\r\n\r\n //Date picker settings\r\n $scope.setDates = function () {\r\n var newDate = new Date();\r\n newDate.setDate(newDate.getDate() - $rootScope.UserPreferences.DefaultDaysForAuditTrailReports);\r\n vm.LastNumberOf = $rootScope.UserPreferences.DefaultDaysForAuditTrailReports;\r\n\r\n $scope.vm.startDate = newDate;\r\n $scope.vm.endDate = new Date();\r\n };\r\n $scope.setDates();\r\n\r\n $scope.getDateFilters = function () {\r\n var dateCriteria = $scope.dateCriteria[0];\r\n\r\n if (vm.selectedProduct.Type === 'AX') {\r\n dateCriteria.FieldName = \"TimeStamp\";\r\n } else if (vm.selectedProduct.Type === 'AX7') {\r\n dateCriteria.FieldName = \"ModifiedOn\";\r\n } else if (vm.selectedProduct.Type === 'D365Bc') {\r\n dateCriteria.FieldName = \"dateandTime\";\r\n } else if (vm.selectedProduct.Type === 'SF') {\r\n dateCriteria.FieldName = \"CreatedDate\";\r\n } else {\r\n dateCriteria.FieldName = \"Date\";\r\n }\r\n\r\n if (dateCriteria) {\r\n var dateTimeFieldName = dateCriteria.FieldName;\r\n var dateFilters = {\r\n Criteria: null,\r\n Filters: [],\r\n DateFilters: [],\r\n RelativeFilter: null\r\n };\r\n\r\n var startDate = helperService.setDateToBeginningOfDay(vm.startDate);\r\n var endDate = helperService.setDateToEndOfDay(vm.endDate);\r\n\r\n if (vm.RelativeDateType === 4) {\r\n var startDateRow = {\r\n \"FieldName\": dateTimeFieldName,\r\n \"Operator\": 'GreaterThanOrEqual',\r\n \"Value\": startDate\r\n };\r\n var endDateRow = {\r\n \"FieldName\": dateTimeFieldName,\r\n \"Operator\": 'LessThanOrEqual',\r\n \"Value\": endDate\r\n };\r\n\r\n dateFilters.Filters.push(startDateRow);\r\n dateFilters.Filters.push(endDateRow); \r\n\r\n }\r\n if (vm.RelativeDateType !== 4) {\r\n var relativeDate = {\r\n \"DateType\": vm.RelativeDateType,\r\n \"FieldName\": dateTimeFieldName,\r\n \"Period\": vm.PeriodType,\r\n \"Value\": vm.RelativeDateType === 2 ? vm.LastNumberOf : null\r\n };\r\n\r\n dateFilters.RelativeFilter = relativeDate; \r\n }\r\n\r\n return dateFilters;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n function getUniqueObjects(arr) {\r\n const seen = new Set();\r\n return arr.filter(obj => {\r\n const strObj = JSON.stringify(obj);\r\n if (seen.has(strObj)) {\r\n return false;\r\n }\r\n seen.add(strObj);\r\n return true;\r\n });\r\n }\r\n\r\n $scope.getPeriodId = function (name) {\r\n if (name) {\r\n return vm.PeriodTypeDataSource.find(function (type) {\r\n return type.Name === name;\r\n }).Id;\r\n }\r\n };\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function setReportMetadata() {\r\n return reportsDataService.getDataChangesReportMetadata(vm.selectedProduct.Type.toLowerCase(), vm.selectedProduct.IsCustom)\r\n .then(data => {\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n vm.filterCriteria.fields.forEach(field => field.displayName = $filter('insertSpaceBetweenCapitalWords')(field.displayName));\r\n if ($rootScope.loadedSavedReport) {\r\n $scope.runSavedReport();\r\n }\r\n });\r\n }\r\n // ---\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var service = {\r\n getTemplates,\r\n getObjects,\r\n getObjectsByTemplateId,\r\n getFieldsByObjectId,\r\n createTemplate,\r\n editTemplate,\r\n updateTemplate,\r\n cloneTemplate,\r\n deleteTemplate,\r\n addObjectToTemplate,\r\n addFieldToObject,\r\n removeObjectByTemplateIdAndObjectId,\r\n removeFieldByTemplateIdTemplateObjectIdAndTemplateFieldId\r\n };\r\n\r\n return service;\r\n\r\n async function getTemplates(productType) {\r\n switch (productType) {\r\n case 'NS':\r\n try {\r\n return await $http.get(apiUrl + 'api/audittrail/ns/v2/templates');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n break;\r\n case 'ORFC':\r\n try {\r\n return await $http.get(apiUrl + 'api/audittrail/orfc/products');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n }\r\n\r\n function getObjects() {\r\n return $http.get(apiUrl + 'api/audittrail/ns/v2/objects')\r\n .then(getObjectsComplete)\r\n .catch(getObjectsFailed);\r\n\r\n function getObjectsComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getObjectsFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function getObjectsByTemplateId(templateId) {\r\n return $http.get(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId)\r\n .then(getObjectsByTemplateIdComplete)\r\n .catch(getObjectsByTemplateIdFailed);\r\n\r\n function getObjectsByTemplateIdComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getObjectsByTemplateIdFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function getFieldsByObjectId(objectId) {\r\n return $http.get(apiUrl + 'api/audittrail/ns/v2/objects/' + objectId + '/fields')\r\n .then(getObjectsByTemplateIdComplete)\r\n .catch(getObjectsByTemplateIdFailed);\r\n\r\n function getObjectsByTemplateIdComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getObjectsByTemplateIdFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function createTemplate(data) {\r\n return $http.post(apiUrl + 'api/audittrail/ns/v2/templates', data)\r\n .then(createTemplateComplete)\r\n .catch(createTemplateFailed);\r\n\r\n function createTemplateComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function createTemplateFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function editTemplate(templateId, data) {\r\n return $http.put(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId, data)\r\n .then(editTemplateComplete)\r\n .catch(editTemplateFailed);\r\n\r\n function editTemplateComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function editTemplateFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n async function updateTemplate(template) {\r\n try {\r\n return await $http.put(apiUrl + 'api/audittrail/orfc/products', template);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function cloneTemplate(templateId, data) {\r\n return $http.post(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId + '/clone', data)\r\n .then(cloneTemplateComplete)\r\n .catch(cloneTemplateFailed);\r\n\r\n function cloneTemplateComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function cloneTemplateFailed(error) {\r\n errorsDataService.catch(error);\r\n throw error;\r\n }\r\n }\r\n\r\n function deleteTemplate(templateId) {\r\n return $http.delete(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId)\r\n .then(deleteTemplateComplete)\r\n .catch(deleteTemplateFailed);\r\n\r\n function deleteTemplateComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function deleteTemplateFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function addObjectToTemplate(templateId, data) {\r\n return $http.post(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId + '/objects', data)\r\n .then(addObjectToTemplateComplete)\r\n .catch(addObjectToTemplateFailed);\r\n\r\n function addObjectToTemplateComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function addObjectToTemplateFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function addFieldToObject(templateId, templateObjectId, data) {\r\n return $http.post(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId + '/objects/' + templateObjectId + '/fields', data)\r\n .then(addFieldToObjectComplete)\r\n .catch(addFieldToObjectFailed);\r\n\r\n function addFieldToObjectComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function addFieldToObjectFailed(error) {\r\n errorsDataService.catch(error);\r\n throw error;\r\n }\r\n }\r\n\r\n function removeObjectByTemplateIdAndObjectId(templateId, templateObjectId) {\r\n return $http.delete(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId + '/objects/' + templateObjectId)\r\n .then(removeObjectByTemplateIdAndObjectIdComplete)\r\n .catch(removeObjectByTemplateIdAndObjectIdFailed);\r\n\r\n function removeObjectByTemplateIdAndObjectIdComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function removeObjectByTemplateIdAndObjectIdFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function removeFieldByTemplateIdTemplateObjectIdAndTemplateFieldId(templateId, templateObjectId, templateFieldId) {\r\n return $http.delete(apiUrl + 'api/audittrail/ns/v2/templates/' + templateId + '/objects/' + templateObjectId + '/fields/' + templateFieldId)\r\n .then(removeFieldByTemplateIdTemplateObjectIdAndTemplateFieldIdComplete)\r\n .catch(removeFieldByTemplateIdTemplateObjectIdAndTemplateFieldIdFailed);\r\n\r\n function removeFieldByTemplateIdTemplateObjectIdAndTemplateFieldIdComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function removeFieldByTemplateIdTemplateObjectIdAndTemplateFieldIdFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getConfigurationByProductId,\r\n getNetSuiteAuditTrailVersion,\r\n setProductConfiguration,\r\n dataActionCall\r\n };\r\n\r\n return service;\r\n\r\n //GET Requests\r\n async function getConfigurationByProductId(productId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/products/${productId}/configuration`);\r\n } catch {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getNetSuiteAuditTrailVersion() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/configuration/NS_AT2_Version`);\r\n } catch {\r\n showError(err);\r\n }\r\n }\r\n\r\n //PUT Requests\r\n async function setProductConfiguration(productId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/products/${productId}/configuration`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function dataActionCall(action, data) {\r\n if (action === 'import') {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/sf/object-tracking/import-metadata`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n } else {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/auditdata/` + action, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getGeneratedReports,\r\n createGeneratedReport,\r\n createAx7GeneratedReport,\r\n deleteReport\r\n };\r\n\r\n return service;\r\n\r\n async function getGeneratedReports() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/reports`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createGeneratedReport(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/reports`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createAx7GeneratedReport(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/ax7/reports`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteReport(reportId) {\r\n try {\r\n await $http.delete(`${apiUrl}api/audittrail/reports/${reportId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}"," export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getSnapshots,\r\n getDistinctRecordType,\r\n getRecordType,\r\n updateRecordType,\r\n updateSnapshot,\r\n updateReportCurrentByDate\r\n };\r\n\r\n return service;\r\n\r\n async function getSnapshots(productType) {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/${productType}/reports`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRecordType() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/snapshot/recordtype`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getDistinctRecordType(selectedRecordType) {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/snapshot/header/distinctbyrecordtype/${selectedRecordType}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateRecordType(data, rowId) {\r\n try {\r\n return await $http({\r\n method: 'PUT',\r\n url: `${apiUrl}/api/audittrail/ns/snapshot/recordtype/` + rowId,\r\n data: data\r\n });\r\n } catch (err) {\r\n showError(err)\r\n sendError(err);\r\n }\r\n\r\n }\r\n\r\n async function updateSnapshot(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/orfc/reports/${data.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateReportCurrentByDate(data, params) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/audittrail/ns/snapshot/report/currentbydate`,\r\n data: data,\r\n params: params\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, $q, errorsDataService) {\r\n\r\n var Entity = function (params) {\r\n this.Id = params.Id;\r\n this.Name = params.Name;\r\n this.TrackedTableList = params.TrackedTableList;\r\n this.IsCustom = params.IsCustom;\r\n this.CreatedDate = params.CreatedDate;\r\n this.CreatedBy = params.CreatedBy;\r\n this.IsEnabled = params.IsEnabled;\r\n this.BaseTemplate = params.BaseTemplate;\r\n };\r\n\r\n var TrackedTable = function (params) {\r\n this.Id = params.Id;\r\n this.Name = params.Name;\r\n this.Label = params.Label;\r\n this.TrackedFields = params.TrackedFields;\r\n this.TrackAll = params.TrackAll;\r\n this.TrackInsert = params.TrackInsert,\r\n this.TrackUpdate = params.TrackUpdate;\r\n this.TrackDelete = params.TrackDelete;\r\n this.Type = 'Table';\r\n };\r\n\r\n var TrackedField = function (params) {\r\n this.Id = params.Id;\r\n this.Name = params.Name;\r\n this.Label = params.Label,\r\n this.TrackAll = params.TrackAll;\r\n this.TrackInsert = params.TrackInsert,\r\n this.TrackUpdate = params.TrackUpdate;\r\n this.TrackDelete = params.TrackDelete;\r\n this.Type = 'Field';\r\n };\r\n\r\n this.convertToTrackedTable = function (table) {\r\n var convertedFields = [];\r\n table.TrackedFields.forEach(function (field) {\r\n convertedFields.push(new TrackedField({ Id: field.Id, Name: field.Name, Label: field.Label, TrackAll: false, TrackDelete: false, TrackInsert: false, TrackUpdate: false }));\r\n });\r\n\r\n return new TrackedTable({\r\n Id: table.Id,\r\n Name: table.Name,\r\n Label: table.Label,\r\n TrackedFields: convertedFields,\r\n TrackAll: false,\r\n TrackInsert: false,\r\n TrackUpdate: false,\r\n TrackDelete: false,\r\n Type: 'Table'\r\n });\r\n };\r\n\r\n this.convertFromTrackedTable = function (templateId, tableList) {\r\n\r\n var convertedTables = [];\r\n var convertedFields = [];\r\n\r\n tableList.forEach(function (trackedTable) {\r\n convertedFields = new Array();\r\n trackedTable.TrackedFields.forEach(function (field) {\r\n convertedFields.push({\r\n \"FieldId\": field.Id,\r\n \"TrackInsert\": field.TrackInsert,\r\n \"TrackUpdate\": field.TrackUpdate,\r\n \"TrackDelete\": field.TrackDelete\r\n });\r\n });\r\n\r\n convertedTables.push({\r\n \"TableId\": trackedTable.Id,\r\n \"Fields\": convertedFields\r\n });\r\n });\r\n\r\n return convertedTables;\r\n };\r\n\r\n function checkAll(field) {\r\n return field.TrackInsert === true && field.TrackUpdate === true && field.TrackDelete === true;\r\n }\r\n\r\n function checkInsert(field) {\r\n return field.TrackInsert === true;\r\n }\r\n\r\n function checkUpdate(field) {\r\n return field.TrackUpdate === true;\r\n }\r\n\r\n function checkDelete(field) {\r\n return field.TrackDelete === true;\r\n }\r\n\r\n //Convert API tracked templates into UI Entities for use on UI side\r\n this.mapTemplate = function (template, includeUntrackedFields) {\r\n\r\n var templateDfrd = $.Deferred();\r\n\r\n var entityList = [];\r\n var trackedFieldList = [];\r\n var trackedTableList = [];\r\n var returnedTemplate = null;\r\n var promises = [];\r\n var selectedTemplate = null;\r\n\r\n getTrackingTemplate(template.Id).then(function (response) {\r\n returnedTemplate = response.data;\r\n trackedFieldList = new Array();\r\n trackedTableList = new Array();\r\n\r\n returnedTemplate.TrackedTables.forEach(function (templateTable) {\r\n\r\n promises.push(getAXFieldsByTableId(templateTable.TableId).then(function (fieldList) {\r\n trackedFieldList = new Array();\r\n\r\n fieldList.data.forEach(function (field) {\r\n var foundField = templateTable.TrackedFields.find(function (trackedField) {\r\n return trackedField.FieldId === field.Id;\r\n });\r\n\r\n if (foundField) {\r\n trackedFieldList.push(new\r\n TrackedField({\r\n Id: foundField.FieldId,\r\n Name: foundField.FieldName,\r\n Label: foundField.FieldLabel,\r\n TrackAll: foundField.TrackInsert === true && foundField.TrackUpdate === true && foundField.TrackDelete === true ? true : false,\r\n TrackInsert: foundField.TrackInsert,\r\n TrackUpdate: foundField.TrackUpdate,\r\n TrackDelete: foundField.TrackDelete\r\n }));\r\n }\r\n else {\r\n if (includeUntrackedFields) {\r\n trackedFieldList.push(new\r\n TrackedField({\r\n Id: field.Id,\r\n Name: field.Name,\r\n Label: field.Label,\r\n TrackAll: false,\r\n TrackInsert: false,\r\n TrackUpdate: false,\r\n TrackDelete: false\r\n }));\r\n }\r\n }\r\n });\r\n\r\n trackedTableList.push(new TrackedTable({\r\n Id: templateTable.TableId,\r\n Name: templateTable.TableName,\r\n Label: templateTable.TableLabel,\r\n TrackedFields: trackedFieldList,\r\n TrackAll: trackedFieldList.every(checkAll),\r\n TrackInsert: trackedFieldList.every(checkInsert),\r\n TrackUpdate: trackedFieldList.every(checkUpdate),\r\n TrackDelete: trackedFieldList.every(checkDelete)\r\n }));\r\n }));\r\n\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n selectedTemplate = new Entity({ Id: template.Id, Name: template.Name, IsEnabled: template.IsEnabled, IsCustom: template.IsCustom, BaseTemplate: template.BaseTemplate, CreatedBy: template.CreatedBy, CreatedDate: template.CreatedDate, TrackedTableList: trackedTableList });\r\n\r\n templateDfrd.resolve(selectedTemplate);\r\n });\r\n });\r\n\r\n return $.when(templateDfrd).done(function () {\r\n return;\r\n }).promise();\r\n };\r\n\r\n this.mapTemplateHeaders = function (trackedTemplateList) {\r\n\r\n var templateDfrd = $.Deferred();\r\n\r\n var entityList = [];\r\n\r\n //Loop thru API Tracked Template list\r\n trackedTemplateList.forEach(function (template) {\r\n\r\n entityList.push(new Entity({ Id: template.Id, Name: template.Name, IsEnabled: template.IsEnabled, IsCustom: template.IsCustom, BaseTemplate: template.BaseTemplate, CreatedBy: template.CreatedBy, CreatedDate: template.CreatedDate }));\r\n });\r\n\r\n templateDfrd.resolve(entityList);\r\n\r\n return $.when(templateDfrd).done(function () {\r\n return;\r\n }).promise();\r\n };\r\n\r\n this.mapTemplateHeader = function (template) {\r\n\r\n var templateDfrd = $.Deferred();\r\n var convertedTemplate = null;\r\n\r\n convertedTemplate = new Entity({ Id: template.Id, Name: template.Name, IsEnabled: template.IsEnabled, IsCustom: template.IsCustom, BaseTemplate: template.BaseTemplate, CreatedBy: template.CreatedBy, CreatedDate: template.CreatedDate });\r\n\r\n templateDfrd.resolve(convertedTemplate);\r\n\r\n return $.when(templateDfrd).done(function () {\r\n return;\r\n }).promise();\r\n };\r\n\r\n this.getAllTemplates = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/audittrail/template'\r\n });\r\n };\r\n\r\n function getTemplate(id) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/audittrail/template/' + id\r\n });\r\n }\r\n\r\n this.getTemplate = function (id) {\r\n return getTemplate(id);\r\n };\r\n\r\n this.getTrackingTemplate = function (id) {\r\n return getTrackingTemplate(id);\r\n };\r\n\r\n function getTrackingTemplate(id) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/audittrail/templatetracking/' + id\r\n });\r\n }\r\n\r\n this.createTemplate = function (name, productId) {\r\n return $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/template',\r\n data: {\r\n Name: name,\r\n ProductId: productId\r\n }\r\n });\r\n };\r\n\r\n this.updateTemplateTables = function (templateId, tables) {\r\n return $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/audittrail/templatetracking/' + templateId,\r\n data:\r\n {\r\n \"TemplateId\": templateId,\r\n \"tables\": tables\r\n }\r\n });\r\n };\r\n\r\n this.deleteTemplate = function (templateId) {\r\n\r\n return $http({\r\n method: 'DELETE',\r\n url: apiUrl + 'api/audittrail/template/' + templateId\r\n });\r\n };\r\n\r\n this.revertTemplate = function (templateId) {\r\n return $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/audittrail/template/' + templateId + '/revert',\r\n data: {\r\n TemplateId: templateId\r\n }\r\n });\r\n };\r\n\r\n this.applyTemplates = function (selectedTemplates) {\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/ax7/template/apply',\r\n data: selectedTemplates\r\n }).then(response => {\r\n return response;\r\n }).catch(response => {\r\n errorsDataService.catch(response);\r\n throw response.data;\r\n });\r\n };\r\n\r\n this.exportTemplates = function () {\r\n return $http.get(`${apiUrl}api/audittrail/template/ax7/export`, { responseType: 'blob' });\r\n };\r\n\r\n this.importTemplates = function (data) {\r\n return $http.put(`${apiUrl}api/audittrail/ax7/template/import`, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n };\r\n\r\n\r\n //AX AT Calls\r\n this.getAllAXTables = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/audittrail/ax7/metadata/tables'\r\n });\r\n };\r\n\r\n function getAXFieldsByTableId(tableId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/audittrail/ax7/metadata/table/' + tableId + '/fields'\r\n });\r\n }\r\n\r\n this.getAXFieldsByTableId = function (tableId) {\r\n return getAXFieldsByTableId(tableId);\r\n };\r\n\r\n}\r\n","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getTemplates,\r\n getSelectedClasses,\r\n getAllClasses,\r\n createTemplate,\r\n addClassToTemplate,\r\n cloneTemplate,\r\n updateTemplate,\r\n deleteTemplate,\r\n deleteClass\r\n };\r\n\r\n return service;\r\n\r\n // GET Calls\r\n async function getTemplates() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/template`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSelectedClasses(templateId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/wd/template/${templateId}/classes`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n // POST calls\r\n async function createTemplate(postData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/template`, postData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getAllClasses(postData, params) {\r\n return await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/audittrail/wd/classes`,\r\n data: postData,\r\n params: params\r\n });\r\n }\r\n\r\n async function addClassToTemplate(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/wd/template/class`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function cloneTemplate(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/wd/template/clone`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // PUT calls\r\n async function updateTemplate(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/template/${data.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n //DELETE calls\r\n async function deleteTemplate(templateId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/audittrail/wd/template/${templateId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n\r\n async function deleteClass(templateClassId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/audittrail/wd/template/classes/${templateClassId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) { errorsDataService.catch(err); }\r\n function sendError(err) { throw err; }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getObjectsToTrack,\r\n saveFieldDataChanges,\r\n saveObjectDataChanges,\r\n exportObjectData,\r\n importObjectData,\r\n importObjectTrackingMetadata\r\n };\r\n\r\n return service;\r\n\r\n async function getObjectsToTrack() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/sf/object-tracking`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err)\r\n }\r\n }\r\n\r\n async function saveFieldDataChanges(fieldData) {\r\n const data = { \"Id\": fieldData.Id, \"Enabled\": fieldData.Enabled };\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/sf/object-tracking/field/${fieldData.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err)\r\n }\r\n }\r\n\r\n async function saveObjectDataChanges(fieldData) {\r\n const data = { \"Id\": fieldData.Id, \"Enabled\": fieldData.Enabled };\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/sf/object-tracking/object/${fieldData.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err)\r\n }\r\n }\r\n\r\n async function importObjectTrackingMetadata() {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/sf/object-tracking/import-metadata`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err)\r\n }\r\n }\r\n\r\n async function exportObjectData() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/sf/object-tracking/export`, {responseType: \"blob\"});\r\n } catch (err) {\r\n showError(err);\r\n sendError(err)\r\n }\r\n }\r\n\r\n async function importObjectData(formData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/sf/object-tracking/import`, formData, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err)\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","import angular from 'angular';\r\nimport templatesDataServiceFactory from '../Components/NetSuiteAuditTrail/MaintainTemplates/templatesDataService.factory';\r\nimport manageDataFactory from '../Components/ManageDataV2/Factories/manageData.factory';\r\nimport manageDataDataServiceFactory from '../Components/ManageDataV2/Factories/manageDataDataService.factory';\r\nimport generatedReportsDataServiceFactory from '../Components/ReportGenerator/generatedReportsDataService.factory';\r\nimport snapshotsDataServiceFactory from '../Components/AuditTrail/MaintainSnapshots/snapshotsDataService.factory';\r\nimport templateDataService from '../Components/TemplateTracking/TemplateTrackingDetails/templateDataService';\r\nimport workdayMaintainTemplatesDataServiceFactory from '../Components/workdayMaintainTemplates/workdayMaintainTemplatesDataService.factory';\r\nimport salesforceAtDataService from '../Components/salesForceAuditTrail/salesforceAtDataService.factory.js';\r\n\r\nexport default angular\r\n .module('app.auditTrail.factories', [])\r\n .service('AuditTrailEntityDataService', templateDataService)\r\n .factory('templatesDataService', templatesDataServiceFactory)\r\n .factory('manageDataFactory', manageDataFactory)\r\n .factory('manageDataDataService', manageDataDataServiceFactory)\r\n .factory('generatedReportsDataService', generatedReportsDataServiceFactory)\r\n .factory('snapshotsDataService', snapshotsDataServiceFactory)\r\n .factory('workdayMaintainTemplatesDataService', workdayMaintainTemplatesDataServiceFactory)\r\n .factory('salesforceAtDataService', salesforceAtDataService)\r\n .name;","export default function () {\r\n var service = {\r\n getActionsByProductId\r\n };\r\n\r\n return service;\r\n\r\n function getActionsByProductId(product) {\r\n var actionsArray = [\r\n {\r\n name: 'Collect',\r\n displayName: 'Collect Data Changes',\r\n buttonText: 'Collect',\r\n description: 'Moves audit trail data from the selected product to the Fastpath Assure system for audit trail reporting.',\r\n type: 'AuditTrailImport',\r\n configValue: null,\r\n canSchedule: true\r\n },\r\n {\r\n name: 'Archive',\r\n displayName: 'Archive Data Changes',\r\n buttonText: 'Archive',\r\n description: 'Archives audit trail data older than the specified date. This will remove this data from your audit trail reports but is available for restore, if needed.',\r\n type: null,\r\n configValue: 'AT_ArchiveDays',\r\n canSchedule: true\r\n },\r\n {\r\n name: 'Purge',\r\n displayName: 'Purge Data Changes',\r\n buttonText: 'Purge',\r\n description: 'Purges archived audit trail data older than the specified date. This will permanently remove the audit trail data from the Fastpath Assure system. The purge process will only delete data from the archive tables.',\r\n type: null,\r\n configValue: 'AT_PurgeDays',\r\n canSchedule: true\r\n },\r\n {\r\n name: 'Restore',\r\n displayName: 'Restore Data Changes',\r\n buttonText: 'Restore',\r\n description: 'Restores archived audit trail data between the specified dates. This will move the data back into the reporting tables and the data will be available on your Audit Trail reports.',\r\n type: null,\r\n configValue: null,\r\n canSchedule: false\r\n }\r\n ];\r\n if (product.Type === 'NS') {\r\n if (!product.version || product.version === 1) {\r\n var action = {\r\n name: 'Collect',\r\n displayName: 'Collect Snapshot',\r\n buttonText: 'Collect',\r\n description: 'The Collect Snapshot process will move selected metadata from the selected product to the Fastpath Assure system for reporting and historical comparisons.',\r\n type: 'AuditTrailImport_NetSuiteSnapshot',\r\n configValue: null,\r\n canSchedule: true\r\n };\r\n actionsArray.unshift(action);\r\n } else if (product.version === 2) {\r\n actionsArray = [\r\n {\r\n name: 'Collect',\r\n displayName: 'Import Data',\r\n buttonText: 'Import Data',\r\n description: 'Import audit trail data from NetSuite.',\r\n type: 'AuditTrailImport',\r\n configValue: null,\r\n canSchedule: true\r\n },\r\n {\r\n name: 'Collect',\r\n displayName: 'Refresh Metadata',\r\n buttonText: 'Refresh Metadata',\r\n description: 'Refreshes available record types and fields based on NetSuite system notes.',\r\n type: 'AuditTrailImport_NetSuiteMetadata',\r\n configValue: null,\r\n canSchedule: false\r\n }\r\n ];\r\n }\r\n }\r\n\r\n if (product.Type === 'WD') {\r\n actionsArray = actionsArray.concat([\r\n {\r\n name: 'Collect',\r\n displayName: 'Collect Metadata',\r\n buttonText: 'Collect Metadata',\r\n description: 'Collect Metadata from Workday.',\r\n type: 'AuditTrailImport_WorkdayMetadata',\r\n configValue: null,\r\n canSchedule: true\r\n }\r\n ]);\r\n }\r\n\r\n if (product.Type === 'SF') {\r\n actionsArray = actionsArray.concat([\r\n {\r\n name: 'Import',\r\n displayName: 'Import Metadata',\r\n buttonText: 'Import Metadata',\r\n description: 'Import Metadata from Salesforce.',\r\n type: 'AuditTrailImport',\r\n configValue: null,\r\n canSchedule: true\r\n },\r\n {\r\n name: 'Setup',\r\n displayName: 'Track Setup Data Changes',\r\n buttonText: 'Track Setup Data Changes',\r\n description: 'Enable Setup Changes Data Collection',\r\n type: null,\r\n configValue: 'SF_AT_EnableSetupTracking',\r\n canSchedule: false\r\n } \r\n ]);\r\n }\r\n\r\n return actionsArray;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getUsers,\r\n getRecordTypes,\r\n nsDataChangesReport\r\n };\r\n\r\n return service;\r\n\r\n async function getUsers() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/places/datachanges/users`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getRecordTypes() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/recordtypes`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function nsDataChangesReport(data, params) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/audittrail/ns/places/datachanges`,\r\n data: data,\r\n params: params\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n allChangesReport,\r\n ticketsReport,\r\n updateChangeRecord\r\n };\r\n\r\n return service;\r\n\r\n async function allChangesReport(data, params) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/ns/v2/places/allchanges',\r\n data: data,\r\n params: params\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function ticketsReport(ticketProvider, data) {\r\n try {\r\n return await $http.post(apiUrl + 'api/core/tickets/' + ticketProvider + '/search/', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateChangeRecord(record) {\r\n try {\r\n return await $http.put(apiUrl + 'api/audittrail/ns/v2/detail/' + record.ChangeId, record);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}\r\n","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getOptionSets,\r\n getOptionSetValuesByOptionSet,\r\n editOptionSetValue,\r\n addOptionSetValue\r\n };\r\n\r\n return service;\r\n\r\n async function getOptionSets() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/v2/optionsets`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getOptionSetValuesByOptionSet(optionSetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/v2/optionsets/${optionSetId}/values`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function editOptionSetValue(optionSetId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/ns/v2/optionsets/${optionSetId}/values`, data)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addOptionSetValue(optionSetId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/ns/v2/optionsets/${optionSetId}/values`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var service = {\r\n getUserGroups,\r\n getUsers,\r\n getUsersByUserGroupId,\r\n createUserGroup,\r\n editUserGroup,\r\n deleteUserGroup,\r\n addUserToUserGroup,\r\n removeUserGroupUser\r\n };\r\n\r\n return service;\r\n\r\n async function getUserGroups() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/v2/usergroups`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getUsers() {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/v2/users`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getUsersByUserGroupId(userGroupId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/audittrail/ns/v2/usergroups/${userGroupId}/users`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createUserGroup(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/ns/v2/usergroups`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function editUserGroup(userGroupId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/audittrail/ns/v2/usergroups/${userGroupId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteUserGroup(userGroupId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/audittrail/ns/v2/usergroups/${userGroupId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addUserToUserGroup(userGroupId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/audittrail/ns/v2/usergroups/${userGroupId}/users`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function removeUserGroupUser(userGroupId, userGroupUserId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/audittrail/ns/v2/usergroups/${userGroupId}/users/${userGroupUserId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var service = {\r\n getDocumentation,\r\n getDocumentationTypes,\r\n getDocumentationAuthorizedByOptions,\r\n createDocumentation,\r\n updateDocumentation,\r\n deleteDocumentation,\r\n getDocumentationLinkedChangesList,\r\n getDocumentationLinkedTicketsList,\r\n linkChangeTicketToDocumentation,\r\n deleteChangeTicketDocumentationLink,\r\n linkChangeToDocumentation,\r\n deleteChangeDocumentationLink\r\n };\r\n\r\n return service;\r\n\r\n function getDocumentation() {\r\n return $http.get(apiUrl + 'api/audittrail/ns/v2/documentation')\r\n .then(getDocumentationComplete)\r\n .catch(getDocumentationFailed);\r\n\r\n function getDocumentationComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getDocumentationFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function getDocumentationTypes() {\r\n return $http.get(apiUrl + 'api/audittrail/ns/v2/optionsets/453D5A39-6F39-4CFE-9DDE-5F21180259FC/values')\r\n .then(getDocumentationTypesComplete)\r\n .catch(getDocumentationTypesFailed);\r\n\r\n function getDocumentationTypesComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getDocumentationTypesFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function getDocumentationAuthorizedByOptions() {\r\n return $http.get(apiUrl + 'api/audittrail/ns/v2/optionsets/4ADF6D38-2716-4D60-B613-3ABED3AC662F/values')\r\n .then(getDocumentationAuthorizedByOptionsComplete)\r\n .catch(getDocumentationAuthorizedByOptionsFailed);\r\n\r\n function getDocumentationAuthorizedByOptionsComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getDocumentationAuthorizedByOptionsFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function createDocumentation(data) {\r\n return $http.post(apiUrl + 'api/audittrail/ns/v2/documentation', data)\r\n .then(createDocumentationComplete)\r\n .catch(createDocumentationFailed);\r\n\r\n function createDocumentationComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function createDocumentationFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function updateDocumentation(data) {\r\n return $http.put(apiUrl + 'api/audittrail/ns/v2/documentation', data)\r\n .then(updateDocumentationComplete)\r\n .catch(updateDocumentationFailed);\r\n\r\n function updateDocumentationComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function updateDocumentationFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function deleteDocumentation(documentationId) {\r\n return $http.delete(apiUrl + 'api/audittrail/ns/v2/documentation/' + documentationId)\r\n .then(deleteDocumentationComplete)\r\n .catch(deleteDocumentationFailed);\r\n\r\n function deleteDocumentationComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function deleteDocumentationFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function getDocumentationLinkedChangesList(documentationId, data, params) {\r\n return $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/ns/v2/documentation/' + documentationId + '/details/list/paged',\r\n data: data,\r\n params: params\r\n }).then(getDocumentationLinkedChangesListComplete)\r\n .catch(getDocumentationLinkedChangesListFailed);\r\n\r\n function getDocumentationLinkedChangesListComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getDocumentationLinkedChangesListFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function getDocumentationLinkedTicketsList(documentationId, data, params) {\r\n return $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/ns/v2/documentation/' + documentationId + '/tickets/list/paged',\r\n data: data,\r\n params: params\r\n }).then(getDocumentationLinkedTicketsListComplete)\r\n .catch(getDocumentationLinkedTicketsListFailed);\r\n\r\n function getDocumentationLinkedTicketsListComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function getDocumentationLinkedTicketsListFailed(error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function linkChangeTicketToDocumentation(documentationId, data) {\r\n return $http.post(apiUrl + 'api/audittrail/ns/v2/documentation/' + documentationId + '/tickets', data)\r\n .then(linkChangeTicketToDocumentationComplete)\r\n .catch(linkChangeTicketToDocumentationFailed);\r\n\r\n function linkChangeTicketToDocumentationComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function linkChangeTicketToDocumentationFailed(error) {\r\n errorsDataService.catch(error);\r\n throw error;\r\n }\r\n }\r\n\r\n function deleteChangeTicketDocumentationLink(documentationId, documentationTicketId) {\r\n return $http.delete(apiUrl + 'api/audittrail/ns/v2/documentation/' + documentationId + '/tickets/' + documentationTicketId)\r\n .then(deleteChangeTicketDocumentationLinkComplete)\r\n .catch(deleteChangeTicketDocumentationLinkFailed);\r\n\r\n function deleteChangeTicketDocumentationLinkComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function deleteChangeTicketDocumentationLinkFailed(error) {\r\n errorsDataService.catch(error);\r\n throw error;\r\n }\r\n }\r\n\r\n function linkChangeToDocumentation(documentationId, data) {\r\n return $http.post(apiUrl + 'api/audittrail/ns/v2/documentation/' + documentationId + '/details', data)\r\n .then(linkChangeToDocumentationComplete)\r\n .catch(linkChangeToDocumentationFailed);\r\n\r\n function linkChangeToDocumentationComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function linkChangeToDocumentationFailed(error) {\r\n errorsDataService.catch(error);\r\n throw error;\r\n }\r\n }\r\n\r\n function deleteChangeDocumentationLink(documentationId, documentationDetailId) {\r\n return $http.delete(apiUrl + 'api/audittrail/ns/v2/documentation/' + documentationId + '/details/' + documentationDetailId)\r\n .then(deleteChangeDocumentationLinkComplete)\r\n .catch(deleteChangeDocumentationLinkFailed);\r\n\r\n function deleteChangeDocumentationLinkComplete(response) {\r\n return response.data;\r\n }\r\n\r\n function deleteChangeDocumentationLinkFailed(error) {\r\n errorsDataService.catch(error);\r\n throw error;\r\n }\r\n }\r\n}","import angular from 'angular';\r\nimport netsuiteDataChangesDataServiceFactory from '../Components/DataChangesNetSuite/netsuiteDataChangesDataService.factory';\r\nimport allChangesDataServiceFactory from '../Components/NetSuiteAuditTrail/AllChanges/allChangesDataService.factory';\r\nimport optionSetsDataServiceFactory from '../Components/NetSuiteAuditTrail/MaintainOptionSets/optionSetsDataService.factory';\r\nimport userGroupsDataServiceFactory from '../Components/NetSuiteAuditTrail/MaintainUserGroups/userGroupsDataService.factory';\r\nimport documentationDataServiceFactory from '../Components/NetSuiteAuditTrail/ManageDocumentation/documentationDataService.factory';\r\n\r\n\r\nexport default angular\r\n .module('app.auditTrail.netSuite.factories', [])\r\n .factory('allChangesDataService', allChangesDataServiceFactory)\r\n .factory('optionSetsDataService', optionSetsDataServiceFactory)\r\n .factory('userGroupsDataService', userGroupsDataServiceFactory)\r\n .factory('nsAtDocumentationService', documentationDataServiceFactory)\r\n .factory('netsuiteDataChangesDataService', netsuiteDataChangesDataServiceFactory)\r\n .name;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, templatesDataService, helperService, $filter, template, isClone) {\r\n\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.submitTemplateForm = submitTemplateForm;\r\n vm.hasExistingValueChanged = hasExistingValueChanged;\r\n vm.updateIneligibleObjectIds = updateIneligibleObjectIds;\r\n vm.isIneligibleObjectId = isIneligibleObjectId;\r\n vm.gridView = 'Objects';\r\n\r\n vm.ineligibileObjectIds = [];\r\n vm.template = angular.copy(template);\r\n vm.isClone = isClone;\r\n\r\n function activate() {\r\n if (template.Id) {\r\n vm.origValue = angular.copy(vm.template);\r\n } else {\r\n vm.template.Active = true;\r\n vm.template.Custom = true;\r\n }\r\n\r\n if (isClone) {\r\n setupCloneTemplateGrids();\r\n getTemplateData();\r\n }\r\n }\r\n activate();\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n function getTemplateData() {\r\n templatesDataService.getObjectsByTemplateId(template.Id)\r\n .then(response => {\r\n vm.objectsDataSource = response.TemplateObjects;\r\n });\r\n }\r\n\r\n function setupCloneTemplateGrids() {\r\n var objectsGridOptions = [\r\n { template: \"\", width: 55, filterable: false },\r\n { field: \"ObjectName\", title: \"Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n var fieldsGridOptions = [\r\n { template: \"\", width: 55, filterable: false },\r\n { field: \"FieldName\", title: \"Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.cloneTemplateObjectsGridOptions = helperService.setNonPageableGridOptions(objectsGridOptions, 300);\r\n vm.cloneTemplateObjectsGridOptions.noRecords = {\r\n template: \"No Objects exist for this template
\"\r\n };\r\n\r\n vm.cloneTemplateFieldGridOptions = helperService.setNonPageableGridOptions(fieldsGridOptions, 300);\r\n vm.cloneTemplateFieldGridOptions.noRecords = {\r\n template: \"No Business Processes exist for this ruleset
\"\r\n };\r\n\r\n templatesDataService.getObjectsByTemplateId(template.Id).then(response => {\r\n response.TemplateObjects = $filter('orderBy')(response.TemplateObjects, 'ObjectName');\r\n response.TemplateObjects.forEach(obj => {\r\n obj.isSelected = true;\r\n });\r\n\r\n vm.templateObjects = response.TemplateObjects;\r\n vm.cloneTemplateObjectsGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n options.success(vm.templateObjects);\r\n }\r\n }\r\n });\r\n\r\n vm.templateFields = [];\r\n vm.templateObjects.forEach(object => {\r\n vm.templateFields = vm.templateFields.concat(object.TemplateFields);\r\n });\r\n vm.templateFields.forEach(field => {\r\n field.isSelected = true;\r\n });\r\n vm.templateFields = $filter('orderBy')(vm.templateFields, 'FieldName');\r\n\r\n vm.cloneTemplateFieldGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n options.success(vm.templateFields);\r\n }\r\n }\r\n });\r\n });\r\n\r\n\r\n }\r\n\r\n function updateIneligibleObjectIds(object) {\r\n if (object.isSelected) {\r\n var index = vm.ineligibileObjectIds.indexOf(object.TemplateObjectId);\r\n if (index > -1) {\r\n vm.ineligibileObjectIds.splice(index, 1);\r\n }\r\n } else {\r\n vm.ineligibileObjectIds.push(object.TemplateObjectId);\r\n }\r\n }\r\n\r\n function isIneligibleObjectId(field) {\r\n var hasineligibleObjectId = false;\r\n\r\n hasineligibleObjectId = vm.ineligibileObjectIds.some(id => id === field.TemplateObjectId);\r\n if (hasineligibleObjectId) {\r\n field.isSelected = false;\r\n }\r\n return hasineligibleObjectId;\r\n }\r\n\r\n function submitTemplateForm(template) {\r\n vm.saving = new createSpinner();\r\n if (isClone) {\r\n cloneTemplate(template);\r\n } else {\r\n if (template.Id) {\r\n editTemplate();\r\n } else {\r\n addNewtemplate();\r\n }\r\n }\r\n }\r\n\r\n async function addNewtemplate() {\r\n\r\n let newTemplate = {\r\n 'Name': vm.template.Name,\r\n 'Active': vm.template.Active\r\n };\r\n\r\n try {\r\n await templatesDataService.createTemplate(newTemplate);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close(response);\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n async function editTemplate() {\r\n\r\n var editedTemplate = {\r\n 'Id': vm.template.Id,\r\n 'Name': vm.template.Name,\r\n 'Active': vm.template.Active\r\n };\r\n\r\n await templatesDataService.editTemplate(template.Id, editedTemplate).then(successCallback);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cloneTemplate(template) {\r\n vm.disableSubmit = true;\r\n\r\n if (vm.cloneTemplateFieldGridDataSource._data.length === 0) {\r\n vm.cloneTemplateFieldGridDataSource.read().then(_ => cloneTemplate());\r\n } else {\r\n cloneTemplate();\r\n }\r\n\r\n async function cloneTemplate() {\r\n\r\n var selectedObjects = vm.cloneTemplateObjectsGridDataSource._data.filter(object => object.isSelected);\r\n\r\n var selectedFields = vm.cloneTemplateFieldGridDataSource._data.filter(field => field.isSelected);\r\n selectedObjects.forEach(object => {\r\n object.FieldIds = selectedFields.filter(field => field.TemplateObjectId === object.TemplateObjectId).map(field => field.FieldId);\r\n });\r\n\r\n selectedObjects = selectedObjects.map(object => {\r\n var newObject = {};\r\n newObject.Id = object.ObjectId;\r\n newObject.FieldIds = object.FieldIds;\r\n return newObject;\r\n });\r\n\r\n var data = {\r\n \"Name\": template.Name,\r\n \"Active\": template.Active,\r\n \"Objects\": selectedObjects\r\n };\r\n\r\n try {\r\n await templatesDataService.cloneTemplate(template.Id, data);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.disableSubmit = false;\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n }\r\n\r\n function successCallback(response) {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function hasExistingValueChanged() {\r\n if (vm.origValue && angular.equals(vm.origValue, vm.value)) {\r\n return false;\r\n } else {\r\n // Either creating a new value or user has modified one of the fields\r\n return true;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, templatesDataService, helperService, $filter, template, objectsDataSource) {\r\n\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.objectsDataSource = objectsDataSource;\r\n\r\n vm.addObjectToTemplate = addObjectToTemplate;\r\n\r\n var availableGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableObjectsGridOptions = helperService.setMainGridOptions(availableGridColumns, null);\r\n\r\n function activate() {\r\n configureObjectsGrid();\r\n }\r\n\r\n activate();\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n function configureObjectsGrid() {\r\n getAllObjects()\r\n .then(_ => {\r\n vm.objectsDataSource.forEach(function (object) {\r\n vm.availableObjects = vm.availableObjects.filter(function (el) {\r\n return el.Id !== object.ObjectId;\r\n });\r\n });\r\n vm.availableObjectsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n vm.availableObjects = $filter('orderBy')(vm.availableObjects, 'Name');\r\n options.success(vm.availableObjects);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n function getAllObjects() {\r\n return templatesDataService.getObjects()\r\n .then(response => {\r\n vm.availableObjects = response;\r\n return vm.availableObjects;\r\n });\r\n }\r\n\r\n function addObjectToTemplate(object) {\r\n var data = {\r\n TemplateId: template.Id,\r\n ObjectId: object.Id\r\n };\r\n\r\n templatesDataService.addObjectToTemplate(template.Id, data)\r\n .then(_ => {\r\n vm.availableObjects = vm.availableObjects.filter(obj => obj.Id !== object.Id);\r\n vm.availableObjectsGridDataSource.read();\r\n });\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, templatesDataService, helperService, $filter, template, object, fieldsDataSource) {\r\n\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.fieldsDataSource = fieldsDataSource;\r\n\r\n vm.addFieldToObject = addFieldToObject;\r\n\r\n var availableGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableFieldsGridOptions = helperService.setMainGridOptions(availableGridColumns, null);\r\n\r\n function activate() {\r\n configureFieldsGrid();\r\n }\r\n\r\n activate();\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n function configureFieldsGrid() {\r\n getAllFields()\r\n .then(_ => {\r\n vm.fieldsDataSource.forEach(function (field) {\r\n vm.availableFields = vm.availableFields.filter(function (el) {\r\n return el.Id !== field.FieldId;\r\n });\r\n });\r\n vm.availableFieldsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n vm.availableFields = $filter('orderBy')(vm.availableFields, 'Name');\r\n options.success(vm.availableFields);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n function getAllFields() {\r\n return templatesDataService.getFieldsByObjectId(object.ObjectId)\r\n .then(response => {\r\n vm.availableFields = response;\r\n return vm.availableFields;\r\n });\r\n }\r\n\r\n function addFieldToObject(field) {\r\n const data = {\r\n TemplateObjectId: object.TemplateObjectId,\r\n FieldId: field.Id\r\n };\r\n\r\n templatesDataService.addFieldToObject(template.Id, object.TemplateObjectId, data)\r\n .then(_ => {\r\n vm.availableFields = vm.availableFields.filter(fld => fld.Id !== field.Id);\r\n vm.availableFieldsGridDataSource.read();\r\n })\r\n .catch(_ => {\r\n return;\r\n });\r\n }\r\n}","import templateModalController from \"./templateModal.controller\";\r\nimport objectModalController from \"./ObjectModal/objectModal.controller\";\r\nimport fieldModalController from \"./FieldModal/fieldModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, templatesDataService) {\r\n\r\n var vm = this;\r\n\r\n vm.openTemplateModal = openTemplateModal;\r\n vm.changeTemplateSelected = changeTemplateSelected;\r\n vm.changeObjectSelected = changeObjectSelected;\r\n vm.deleteTemplate = deleteTemplate;\r\n vm.openObjectModal = openObjectModal;\r\n vm.openFieldModal = openFieldModal;\r\n vm.removeObject = removeObject;\r\n vm.removeField = removeField;\r\n\r\n function activate() {\r\n getTemplates(null);\r\n }\r\n\r\n activate();\r\n\r\n function openTemplateModal(template, isClone) {\r\n\r\n let templateModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainTemplates/templateModal.html',\r\n controller: templateModalController,\r\n controllerAs: 'tmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n template: () => template || {},\r\n isClone: () => isClone\r\n }\r\n });\r\n\r\n templateModal.result\r\n .then(response => {\r\n return getTemplates(response);\r\n })\r\n .catch(_ => {\r\n return;\r\n });\r\n }\r\n\r\n\r\n\r\n function openObjectModal() {\r\n let objectModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainTemplates/ObjectModal/objectModal.html',\r\n controller: objectModalController,\r\n controllerAs: 'omvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n template: () => vm.selectedTemplate,\r\n objectsDataSource: () => vm.objectsDataSource\r\n }\r\n });\r\n\r\n objectModal.result\r\n .then(_ => {\r\n return getTemplates(vm.selectedTemplate.Id);\r\n })\r\n .catch(_ => {\r\n return;\r\n });\r\n }\r\n\r\n function openFieldModal() {\r\n\r\n let fieldModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainTemplates/FieldModal/fieldModal.html',\r\n controller: fieldModalController,\r\n controllerAs: 'fmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n template: () => vm.selectedTemplate,\r\n object: () => vm.selectedObject,\r\n fieldsDataSource: () => vm.fieldsDataSource\r\n }\r\n });\r\n\r\n fieldModal.result\r\n .then(_ => {\r\n return changeTemplateSelected(vm.selectedObject.ObjectId, vm.selectedTemplate);\r\n })\r\n .catch(_ => {\r\n return;\r\n });\r\n }\r\n\r\n vm.templateMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.openTemplateModal(item, false);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.deleteTemplate(item);\r\n },\r\n displayed: function (modelValue) {\r\n return modelValue.template.Custom;\r\n }\r\n },\r\n {\r\n text: 'Clone',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.openTemplateModal(item, true);\r\n }\r\n }\r\n ];\r\n\r\n function getTemplates(preselect) {\r\n templatesDataService.getTemplates('NS').then(response => {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.templatesDataSource = response.data;\r\n if (preselect) {\r\n response.data.forEach(function (row, i) {\r\n if (row.Id === preselect) {\r\n vm.selectedTemplate = row;\r\n vm.changeTemplateSelected(row.ObjectId, vm.selectedTemplate);\r\n }\r\n });\r\n\r\n }\r\n });\r\n\r\n }\r\n\r\n function changeTemplateSelected(preselectObjectId, template) {\r\n vm.selectedTemplate = template;\r\n vm.changeTemplateInProgress = true;\r\n vm.objectsDataSource = null;\r\n\r\n if (vm.selectedTemplate) {\r\n templatesDataService.getObjectsByTemplateId(vm.selectedTemplate.Id).then(response => {\r\n response.TemplateObjects = $filter('orderBy')(response.TemplateObjects, 'ObjectName');\r\n vm.objectsDataSource = response.TemplateObjects;\r\n vm.changeTemplateInProgress = false;\r\n\r\n if (preselectObjectId) {\r\n vm.selectedObject = vm.objectsDataSource.filter(e => e.ObjectId === preselectObjectId)[0];\r\n }\r\n else if (vm.objectsDataSource.length === 1) {\r\n vm.selectedObject = vm.objectsDataSource[0];\r\n }\r\n else {\r\n vm.selectedObject = null;\r\n }\r\n\r\n changeObjectSelected(vm.selectedObject);\r\n });\r\n } else {\r\n vm.changeTemplateInProgress = false;\r\n }\r\n }\r\n\r\n function changeObjectSelected(object) {\r\n vm.selectedObject = object;\r\n vm.changeObjectInProgress = true;\r\n vm.fieldsDataSource = null;\r\n\r\n if (vm.selectedObject) {\r\n vm.fieldsDataSource = $filter('orderBy')(vm.selectedObject.TemplateFields, 'FieldName');\r\n vm.changeObjectInProgress = false;\r\n } else {\r\n vm.changeObjectInProgress = false;\r\n }\r\n }\r\n\r\n function deleteTemplate(template) {\r\n if (vm.selectedTemplate = template) {\r\n vm.selectedTemplate = null;\r\n }\r\n return templatesDataService.deleteTemplate(template.Id)\r\n .then(_ => {\r\n return getTemplates(null);\r\n });\r\n }\r\n\r\n function removeObject(object) {\r\n return templatesDataService.removeObjectByTemplateIdAndObjectId(vm.selectedTemplate.Id, object.TemplateObjectId)\r\n .then(_ => {\r\n return changeTemplateSelected(vm.selectedObject.ObjectId, vm.selectedTemplate);\r\n });\r\n }\r\n\r\n function removeField(field) {\r\n return templatesDataService.removeFieldByTemplateIdTemplateObjectIdAndTemplateFieldId(vm.selectedTemplate.Id, field.TemplateObjectId, field.TemplateFieldId)\r\n .then(_ => {\r\n return changeTemplateSelected(vm.selectedObject.ObjectId, vm.selectedTemplate);\r\n });\r\n }\r\n\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (dataService, netsuiteDataChangesDataService, $http, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = activate;\r\n\r\n vm.objectsAreEqual = objectsAreEqual;\r\n vm.changeAllValues = changeAllValues;\r\n vm.recordTypeChanged = recordTypeChanged;\r\n vm.submit = submit;\r\n\r\n function activate() {\r\n getProducts();\r\n getRecordTypes();\r\n }\r\n\r\n async function getProducts() {\r\n const response = await dataService.getProducts();\r\n vm.products = response.data;\r\n }\r\n\r\n async function getRecordTypes() {\r\n const response = await netsuiteDataChangesDataService.getRecordTypes();\r\n vm.recordTypes = response.data;\r\n vm.recordTypes.forEach(recordType => {\r\n recordType.value = recordType.Insert || recordType.Update || recordType.Delete;\r\n });\r\n vm.originalRecordTypes = angular.copy(vm.recordTypes);\r\n }\r\n\r\n function objectsAreEqual() {\r\n return angular.equals(vm.recordTypes, vm.originalRecordTypes);\r\n }\r\n\r\n function changeAllValues(recordType) {\r\n recordType.Insert = recordType.value;\r\n recordType.Update = recordType.value;\r\n recordType.Delete = recordType.value;\r\n }\r\n\r\n function recordTypeChanged(recordType) {\r\n recordType.value = recordType.Insert || recordType.Update || recordType.Delete;\r\n\r\n }\r\n\r\n function submit() {\r\n\r\n vm.pleaseWait = new createSpinner();\r\n\r\n vm.recordTypes.forEach(async (row, i) => {\r\n if (row.Insert !== vm.originalRecordTypes[i].Insert || row.Update !== vm.originalRecordTypes[i].Update || row.Delete !== vm.originalRecordTypes[i].Delete) {\r\n let data = {\r\n \"Id\": row.Id,\r\n \"Insert\": row.Insert,\r\n \"Update\": row.Update,\r\n \"Delete\": row.Delete\r\n };\r\n await $http.put(`${apiUrl}api/audittrail/recordtypes/${row.Id}`, data);\r\n vm.originalRecordTypes[i].Insert = row.Insert;\r\n vm.originalRecordTypes[i].Update = row.Update;\r\n vm.originalRecordTypes[i].Delete = row.Delete;\r\n }\r\n });\r\n\r\n helperService.successfulSaveButton(vm.pleaseWait);\r\n }\r\n\r\n}","import netsuiteDataChangesConfigurationController from \"./netsuiteDataChangesConfiguration.controller\";\r\n\r\n/* netsuiteDataChangesConfiguration.component.js */\r\n\r\n/**\r\n * @desc component for Data Changes Configuration in NetSuite\r\n * @example \r\n */\r\n\r\nconst netsuiteDataChangesConfiguration = {\r\n controller: netsuiteDataChangesConfigurationController,\r\n controllerAs: 'dccvm',\r\n templateUrl: '/App/Components/DataChangesConfiguration/netsuiteDataChangesConfiguration.tmpl.html'\r\n};\r\n\r\nexport default netsuiteDataChangesConfiguration;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, optionSetsDataService, item, optionSet, helperService) {\r\n\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.submitValueForm = submitValueForm;\r\n vm.hasExistingValueChanged = hasExistingValueChanged;\r\n\r\n vm.item = item;\r\n vm.value = {};\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (vm.item.Id) {\r\n vm.value = { ...vm.item };\r\n vm.origValue = { ...vm.value };\r\n } else {\r\n vm.value.Active = true;\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n function submitValueForm() {\r\n if (item.Id) {\r\n editValue(vm.value);\r\n } else {\r\n addNewValue(vm.value);\r\n }\r\n }\r\n\r\n async function addNewValue(value) {\r\n vm.updatePending = new createSpinner();\r\n const newValue = {\r\n 'OptionSetId': optionSet.Id,\r\n 'Name': value.Name,\r\n 'Active': value.Active\r\n };\r\n\r\n try {\r\n await optionSetsDataService.addOptionSetValue(optionSet.Id, newValue);\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n close();\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function editValue(value) {\r\n vm.updatePending = new createSpinner();\r\n const editedValue = {\r\n 'OptionSetValueId': item.Id,\r\n 'Name': value.Name,\r\n 'Active': value.Active\r\n };\r\n\r\n try {\r\n await optionSetsDataService.editOptionSetValue(optionSet.Id, editedValue);\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n close();\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function hasExistingValueChanged() {\r\n if (vm.origValue && JSON.stringify(vm.origValue) === JSON.stringify(vm.value)) {\r\n return false;\r\n } else {\r\n // Either creating a new value or user has modified one of the fields\r\n return true;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport optionSetValueModalController from \"./optionSetValueModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, helperService, optionSetsDataService) {\r\n\r\n const vm = this;\r\n vm.openOptionSetValueModal = openOptionSetValueModal;\r\n vm.changeOptionSet = changeOptionSet;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getOptionSets();\r\n createOptionSetsGrid();\r\n }\r\n\r\n async function getOptionSets() {\r\n let response = await optionSetsDataService.getOptionSets();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.optionSetsDataSource = response.data;\r\n vm.selectedOptionSet = response.data[0];\r\n }\r\n\r\n function changeOptionSet() {\r\n vm.optionSetsGridDataSource.read();\r\n }\r\n\r\n async function openOptionSetValueModal(item) {\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainOptionSets/optionSetValueModal.html',\r\n controller: optionSetValueModalController,\r\n controllerAs: 'osvvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n item: () => item || {},\r\n optionSet: () => vm.selectedOptionSet || {}\r\n }\r\n });\r\n\r\n try {\r\n await openModal.result;\r\n vm.optionSetsGridDataSource.read()\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function createOptionSetsGrid() {\r\n var optionSetsGridColumns =\r\n [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Active\", title: \"Active\", filterable: customBooleanFilter },\r\n { field: \"Id\", title: \"Id\", hidden: true },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 }\r\n ];\r\n\r\n vm.optionSetsGridOptions = helperService.setMainGridOptions(optionSetsGridColumns, 500);\r\n vm.optionSetsGridOptions.selectable = false;\r\n\r\n vm.optionSetsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Active: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n let response = await optionSetsDataService.getOptionSetValuesByOptionSet(vm.selectedOptionSet.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n}","import maintainOptionSetsController from \"./maintainOptionSets.controller\";\r\n\r\n/* maintainOptionSets.component.js */\r\n\r\n/**\r\n * @desc component for displaying and modifying option sets\r\n * @example \r\n */\r\n\r\nconst maintainOptionSets = {\r\n controller: maintainOptionSetsController,\r\n controllerAs: 'osvm',\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainOptionSets/maintainOptionSets.tmpl.html'\r\n};\r\n\r\nexport default maintainOptionSets;","import { customDatePickerFilter, customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, objectIdDataService, CustomReportServices, $filter, $http, reportsService, reportsDataService, helperService, snapshotsDataService, dataService) {\r\n\r\n const vm = this;\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n vm.recordTypeDropdownChange = recordTypeDropdownChange;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.applySelectedFilter = applySelectedFilter;\r\n vm.deleteFilter = deleteFilter;\r\n vm.clearAllFilters = clearAllFilters;\r\n vm.onReadGrid = onReadGrid;\r\n\r\n vm.helperService = helperService;\r\n\r\n async function activate() {\r\n createSnapshotChangesGrid();\r\n getRecordTypes();\r\n recordTypeDropdownChange();\r\n await getObjectId();\r\n\r\n\r\n vm.dateCriteria = [\r\n {\r\n \"DataType\": \"DateTime\",\r\n \"FieldName\": \"Date\",\r\n \"IsNullable\": false\r\n }\r\n ];\r\n\r\n getReportMetadata().then(_ => {\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n });\r\n }\r\n\r\n activate();\r\n\r\n\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n async function getObjectId() {\r\n const objectId = await objectIdDataService.getObjectID();\r\n vm.ObjectId = objectId;\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectId(objectId);\r\n vm.reportName = securityObject.Name;\r\n vm.reportId = securityObject.ReportID;\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(vm.ObjectId);\r\n }\r\n\r\n function runSavedReport() {\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.recordTypeDataSource && vm.recordDataSource && vm.selectedRecord && vm.filterCriteria.fields) {\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.recordTypeDataSource && vm.recordDataSource && vm.selectedRecord && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n }\r\n\r\n function createSnapshotChangesGrid() {\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n vm.mainGridColumns = [\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"RecordId\", title: \"Record Id\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordName\", title: \"Record Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"Value\", title: \"Value\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n fields: {\r\n Date: { type: \"date\" }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n let data = {\r\n 'RecordTypeId': vm.recordType,\r\n 'RecordId': vm.record\r\n };\r\n\r\n vm.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n data['QueryInput'] = vm.sortsAndFilters;\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n data['QueryInput'].DateFilters = vm.filterCriteria.dateQuery;\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/ns/snapshot/report/changes',\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n\r\n data = response.data._embedded.reportData;\r\n\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n }).catch(response => {\r\n const timeout = 408;\r\n\r\n if (response.status !== timeout) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n setLayout();\r\n\r\n }\r\n\r\n async function getRecordTypes() {\r\n let response = await snapshotsDataService.getRecordType();\r\n response.data = $filter('filter')(response.data, { Enabled: true });\r\n response.data = $filter('orderBy')(response.data, 'DisplayName');\r\n vm.recordTypeDataSource = response.data;\r\n\r\n vm.selectedRecordType = SavedReportSelectorService.checkSavedReportForRecordType($rootScope.loadedSavedReport, response.data, vm.selectedRecordType);\r\n vm.recordTypeDropdownChange();\r\n recordTypeDropdownChange();\r\n runSavedReport();\r\n }\r\n\r\n async function recordTypeDropdownChange() {\r\n try {\r\n if (vm.selectedRecordType) {\r\n let response = await snapshotsDataService.getDistinctRecordType(vm.selectedRecordType.Id);\r\n let allRecords = { \"RecordName\": \"All Records\", \"RecordId\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(allRecords);\r\n\r\n vm.recordDataSource = response.data;\r\n vm.selectedRecord = response.data[0];\r\n\r\n vm.selectedRecord = SavedReportSelectorService.checkSavedReportForRecord($rootScope.loadedSavedReport, response.data, vm.selectedRecord);\r\n populateCriteriaModel();\r\n runSavedReport();\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedRecordType || vm.selectedRecord === undefined) {\r\n return;\r\n }\r\n let criteria = [];\r\n\r\n vm.recordType = vm.selectedRecordType.Id;\r\n\r\n if (vm.selectedRecord.RecordId === 'AllObjectsInMultiSelect') {\r\n vm.record = null;\r\n } else {\r\n vm.record = vm.selectedRecord.RecordId;\r\n }\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"RecordTypeId\", 'RecordType', vm.selectedRecordType.DisplayName, vm.selectedRecordType.Id));\r\n criteria.push(CustomReportServices.CreateCriteria(\"RecordId\", 'Record', vm.selectedRecord.RecordName, vm.selectedRecord.RecordId));\r\n vm.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n }\r\n\r\n\r\n vm.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n vm.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n function applySelectedFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function deleteFilter(id) {\r\n CustomReportServices.deleteFilterFilterManager(vm, id);\r\n };\r\n\r\n function clearAllFilters() {\r\n vm.gridDataSource.filter({});\r\n };\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, null);\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function getReportMetadata() {\r\n let response = await reportsDataService.getReportMetadata(vm.reportId);\r\n vm.reportMetadata = response.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n }\r\n}\r\n // ---\r\n"," import snapshotChangesController from \"./snapshotChanges.controller\";\r\n\r\n/* snaphsotChanges.component.js */\r\n\r\n/**\r\n * @desc component for Snapshot Changes in NetSuite\r\n * @example \r\n */\r\n\r\nconst snapshotChanges = {\r\n controller: snapshotChangesController,\r\n controllerAs: 'scvm',\r\n templateUrl: '/App/Components/SnapshotChanges/snapshotChanges.tmpl.html'\r\n};\r\n\r\nexport default snapshotChanges;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, userGroupsDataService, userGroup, helperService) {\r\n\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.submitUserGroupForm = submitUserGroupForm;\r\n vm.hasExistingValueChanged = hasExistingValueChanged;\r\n\r\n vm.userGroup = angular.copy(userGroup);\r\n\r\n function activate() {\r\n if (userGroup.Id) {\r\n vm.origValue = { ...vm.userGroup };\r\n }\r\n }\r\n activate();\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n function submitUserGroupForm(userGroup) {\r\n if (userGroup.Id) {\r\n editUserGroup();\r\n } else {\r\n addNewUserGroup();\r\n }\r\n }\r\n\r\n async function addNewUserGroup() {\r\n vm.updatePending = new createSpinner();\r\n\r\n const newUserGroup = {\r\n 'Name': vm.userGroup.Name\r\n };\r\n\r\n try {\r\n let response = await userGroupsDataService.createUserGroup(newUserGroup);\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n close(response);\r\n } catch {\r\n return;\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function editUserGroup() {\r\n vm.updatePending = new createSpinner();\r\n\r\n const editedUserGroup = {\r\n 'Id': vm.userGroup.Id,\r\n 'Name': vm.userGroup.Name\r\n };\r\n\r\n try {\r\n await userGroupsDataService.editUserGroup(userGroup.Id, editedUserGroup);\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n close(vm.userGroup.Id);\r\n } catch {\r\n return;\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(userGroupId) {\r\n $uibModalInstance.close(userGroupId);\r\n }\r\n\r\n function hasExistingValueChanged() {\r\n if (vm.origValue && angular.equals(vm.origValue, vm.userGroup)) {\r\n return false;\r\n } else {\r\n // Either creating a new value or user has modified one of the fields\r\n return true;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, userGroupsDataService, helperService, $filter, userGroup, usersDataSource) {\r\n\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.usersDataSource = usersDataSource;\r\n\r\n vm.addUserToUserGroup = addUserToUserGroup;\r\n\r\n var availableGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableUsersGridOptions = helperService.setMainGridOptions(availableGridColumns, null);\r\n\r\n activate();\r\n\r\n function activate() {\r\n configureUsersGrid();\r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n async function configureUsersGrid() {\r\n await getAllUsers();\r\n vm.usersDataSource.forEach(user => {\r\n vm.availableUsers = vm.availableUsers.filter(u => u.InternalId !== user.UserGroupUserInternalId);\r\n });\r\n vm.availableUsersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: (options) => {\r\n vm.availableUsers = $filter('orderBy')(vm.availableUsers, 'Name');\r\n options.success(vm.availableUsers);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function getAllUsers() {\r\n let response = await userGroupsDataService.getUsers();\r\n response.data = response.data.filter(user => !user.Inactive);\r\n vm.availableUsers = response.data;\r\n }\r\n\r\n async function addUserToUserGroup(user) {\r\n var data = {\r\n UserGroupId: userGroup.Id,\r\n UserGroupUserInternalId: user.InternalId\r\n };\r\n\r\n await userGroupsDataService.addUserToUserGroup(userGroup.Id, data);\r\n vm.availableUsers = vm.availableUsers.filter(u => u.InternalId !== user.InternalId);\r\n vm.availableUsersGridDataSource.read();\r\n }\r\n}","import userGroupModalController from \"./userGroupModal.controller\";\r\nimport userModalController from \"./UserModal/userModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, helperService, userGroupsDataService, objectIdDataService) {\r\n\r\n var vm = this;\r\n\r\n vm.openUserGroupModal = openUserGroupModal;\r\n vm.changeUserGroupSelected = changeUserGroupSelected;\r\n vm.deleteUserGroup = deleteUserGroup;\r\n vm.openUserModal = openUserModal;\r\n vm.removeUserGroupUser = removeUserGroupUser;\r\n\r\n function activate() {\r\n getUserGroups(null);\r\n }\r\n\r\n activate();\r\n\r\n async function openUserGroupModal(userGroup) {\r\n\r\n let userGroupModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainUserGroups/userGroupModal.html',\r\n controller: userGroupModalController,\r\n controllerAs: 'ugmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n userGroup: () => userGroup || {}\r\n }\r\n });\r\n\r\n try {\r\n let response = await userGroupModal.result;\r\n getUserGroups(response);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openUserModal() {\r\n\r\n let userModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainUserGroups/UserModal/userModal.html',\r\n controller: userModalController,\r\n controllerAs: 'umvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n userGroup: () => vm.selectedUserGroup,\r\n usersDataSource: () => vm.usersDataSource\r\n }\r\n });\r\n\r\n try {\r\n await userModal.result;\r\n changeUserGroupSelected(vm.selectedUserGroup);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n vm.userGroupMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.openUserGroupModal(item);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.deleteUserGroup(item);\r\n }\r\n }\r\n ];\r\n\r\n async function getUserGroups(preselect) {\r\n let response = await userGroupsDataService.getUserGroups();\r\n response.data = $filter('orderBy')(response.data, 'UserGroupUserName');\r\n vm.userGroupsDataSource = response.data;\r\n if (preselect) {\r\n response.data.forEach(row => {\r\n if (row.Id === preselect) {\r\n vm.selectedUserGroup = row;\r\n vm.changeUserGroupSelected(vm.selectedUserGroup);\r\n }\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n async function changeUserGroupSelected(userGroup) {\r\n vm.selectedUserGroup = userGroup;\r\n vm.changeUserGroupInProgress = true;\r\n vm.usersDataSource = null;\r\n\r\n if (vm.selectedUserGroup) {\r\n let response = await userGroupsDataService.getUsersByUserGroupId(vm.selectedUserGroup.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.usersDataSource = response.data;\r\n vm.changeUserGroupInProgress = false;\r\n } else {\r\n vm.changeUserGroupInProgress = false;\r\n }\r\n }\r\n\r\n async function deleteUserGroup(userGroup) {\r\n if (vm.selectedUserGroup === userGroup) {\r\n vm.selectedUserGroup = null;\r\n }\r\n await userGroupsDataService.deleteUserGroup(userGroup.Id);\r\n getUserGroups(null);\r\n }\r\n\r\n async function removeUserGroupUser(userGroupId, userGroupUserId) {\r\n await userGroupsDataService.removeUserGroupUser(userGroupId, userGroupUserId);\r\n changeUserGroupSelected(vm.selectedUserGroup);\r\n }\r\n\r\n}","import maintainUserGroupsController from \"./maintainUserGroups.controller\";\r\n\r\n/* maintainUserGroups.component.js */\r\n\r\n/**\r\n * @desc component for maintaining audit trail user groups\r\n * @example \r\n */\r\n\r\nconst maintainUserGroups = {\r\n controller: maintainUserGroupsController,\r\n controllerAs: 'mugvm',\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/MaintainUserGroups/maintainUserGroups.tmpl.html'\r\n};\r\n\r\nexport default maintainUserGroups;","import { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, objectIdDataService, reportsDataService, reportsService, CustomReportServices, $filter, $http, helperService, snapshotsDataService) {\r\n\r\n const vm = this;\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.clearAllFilters = clearAllFilters;\r\n vm.openStartDate = openStartDate;\r\n vm.openEndDate = openEndDate;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.applySelectedFilter = applySelectedFilter;\r\n vm.deleteFilter = deleteFilter;\r\n vm.onReadGrid = onReadGrid;\r\n vm.recordTypeDropdownChange = recordTypeDropdownChange;\r\n\r\n async function activate() {\r\n createSnapshotComparisonGrid();\r\n getRecordTypes();\r\n recordTypeDropdownChange();\r\n await getObjectId();\r\n\r\n vm.dateCriteria = [\r\n {\r\n \"DataType\": \"DateTime\",\r\n \"FieldName\": \"Date\",\r\n \"IsNullable\": false\r\n }\r\n ];\r\n\r\n getReportMetadata().then(_ => {\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n });\r\n\r\n }\r\n\r\n activate();\r\n\r\n function runSavedReport() {\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.recordTypeDataSource && vm.recordDataSource) {\r\n // --- FOR ADVANCED FILTERING ---\r\n // Convert date filters to criteria\r\n\r\n if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.DateFilters.length > 0) {\r\n const criteriaDateFilterIndex = $rootScope.loadedSavedReport.ReportDefinition.DateFilters.findIndex(filter => filter.FieldName === 'Date');\r\n if (criteriaDateFilterIndex > -1) {\r\n loadDateFilterAsCriteria($rootScope.loadedSavedReport.ReportDefinition.DateFilters[criteriaDateFilterIndex]);\r\n $rootScope.loadedSavedReport.ReportDefinition.DateFilters.splice(criteriaDateFilterIndex, 1);\r\n }\r\n } else if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.Filters.length > 0) {\r\n const dateRangeFilters = $rootScope.loadedSavedReport.ReportDefinition.Filters.filter(filter => filter.FieldName === 'Date');\r\n if (dateRangeFilters.length > 0) {\r\n $rootScope.loadedSavedReport.ReportDefinition.Filters = $rootScope.loadedSavedReport.ReportDefinition.Filters.filter(filter => filter.FieldName !== 'Date');\r\n dateRangeFilters.forEach(filter => {\r\n loadDateFilterAsCriteria(filter);\r\n });\r\n }\r\n }\r\n\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n vm.generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.recordTypeDataSource && vm.recordDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n vm.populateCriteriaModel();\r\n }\r\n };\r\n \r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n async function getObjectId() {\r\n const objectId = await objectIdDataService.getObjectID();\r\n vm.ObjectId = objectId;\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectId(objectId);\r\n vm.reportName = securityObject.Name;\r\n vm.reportId = securityObject.ReportID;\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(vm.ObjectId);\r\n }\r\n\r\n function createSnapshotComparisonGrid() {\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n vm.mainGridColumns = [\r\n { field: \"RecordId\", title: \"Record Id\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordName\", title: \"Record Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"StartValue\", title: \"Start Value\", filterable: customAutoCompleteFilter },\r\n { field: \"EndValue\", title: \"End Value\", filterable: customAutoCompleteFilter },\r\n { field: \"Diff\", title: \"Difference\", width: 140, filterable: customBooleanFilter }\r\n ]; \r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n Diff: { type: \"boolean\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: function (options) {\r\n\r\n delete $rootScope.loadedSavedReport;\r\n\r\n let data = {\r\n 'RecordTypeId': vm.recordType,\r\n 'RecordId': vm.record,\r\n 'StartDate': vm.savedStartDate,\r\n 'EndDate': vm.savedEndDate\r\n };\r\n\r\n vm.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n data['QueryInput'] = vm.sortsAndFilters;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/ns/snapshot/report/comparison',\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n\r\n let data = response.data._embedded.reportData;\r\n\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n setLayout();\r\n\r\n }\r\n\r\n async function getRecordTypes() {\r\n let response = await snapshotsDataService.getRecordType();\r\n response.data = $filter('filter')(response.data, { Enabled: true });\r\n response.data = $filter('orderBy')(response.data, 'DisplayName');\r\n vm.recordTypeDataSource = response.data;\r\n\r\n vm.selectedRecordType = SavedReportSelectorService.checkSavedReportForRecordType($rootScope.loadedSavedReport, response.data, vm.selectedRecordType);\r\n recordTypeDropdownChange();\r\n runSavedReport();\r\n } \r\n\r\n async function recordTypeDropdownChange() {\r\n try {\r\n if (vm.selectedRecordType) {\r\n let response = await snapshotsDataService.getDistinctRecordType(vm.selectedRecordType.Id);\r\n let allRecords = { \"RecordName\": \"All Records\", \"RecordId\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(allRecords);\r\n\r\n vm.recordDataSource = response.data;\r\n vm.selectedRecord = response.data[0];\r\n\r\n vm.selectedRecord = SavedReportSelectorService.checkSavedReportForRecord($rootScope.loadedSavedReport, response.data, vm.selectedRecord);\r\n populateCriteriaModel();\r\n runSavedReport();\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n //Start Date picker settings\r\n function thirtyDaysAgo() {\r\n let newDate = new Date();\r\n newDate.setDate(newDate.getDate() - 30);\r\n vm.startDate = newDate;\r\n vm.startDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"StartDate\", vm.startDate);\r\n }\r\n\r\n thirtyDaysAgo();\r\n\r\n vm.startDateOptions = {\r\n dateDisabled: disabled,\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n function disabled(data) {\r\n let date = data.date,\r\n mode = data.mode;\r\n return mode === 'day' && date > vm.endDate;\r\n }\r\n\r\n function openStartDate() {\r\n vm.startDatePopup.opened = true;\r\n }\r\n\r\n vm.startDatePopup = {\r\n opened: false\r\n };\r\n\r\n //End Date picker settings\r\n function today() {\r\n vm.endDate = new Date();\r\n vm.endDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"EndDate\", vm.endDate);\r\n\r\n }\r\n\r\n today();\r\n\r\n vm.endDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n startingDay: 1\r\n };\r\n\r\n function openEndDate() {\r\n vm.endDatePopup.opened = true;\r\n }\r\n\r\n vm.endDatePopup = {\r\n opened: false\r\n };\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedRecordType || vm.selectedRecord === undefined || !vm.startDate || !vm.endDate) {\r\n return;\r\n }\r\n let criteria = [];\r\n\r\n vm.recordType = vm.selectedRecordType.Id;\r\n vm.savedStartDate = vm.startDate;\r\n vm.savedEndDate = vm.endDate;\r\n\r\n if (vm.selectedRecord.RecordId === 'AllObjectsInMultiSelect') {\r\n vm.record = null;\r\n } else {\r\n vm.record = vm.selectedRecord.RecordId;\r\n }\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"RecordTypeId\", 'RecordType', vm.selectedRecordType.DisplayName, vm.selectedRecordType.Id));\r\n criteria.push(CustomReportServices.CreateCriteria(\"RecordId\", 'Record', vm.selectedRecord.RecordName, vm.selectedRecord.RecordId));\r\n criteria.push(CustomReportServices.CreateCriteria(\"StartDate\", 'StartDate', vm.startDate, vm.startDate));\r\n criteria.push(CustomReportServices.CreateCriteria(\"EndDate\", 'EndDate', vm.endDate, vm.endDate));\r\n vm.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n vm.populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n } \r\n\r\n vm.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n\r\n vm.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n function applySelectedFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function deleteFilter(id) {\r\n CustomReportServices.deleteFilterFilterManager(vm, id);\r\n }\r\n\r\n function clearAllFilters() {\r\n vm.gridDataSource.filter({});\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, null);\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getReportMetadata(vm.reportId)\r\n .then(data => {\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n}","import snapshotComparisonController from \"./snapshotComparison.controller\";\r\n\r\n\r\n/* snapshotComparison.component.js */\r\n\r\n/**\r\n * @desc component for Snapshot Comparison in NetSuite\r\n * @example \r\n */\r\n\r\nconst snapshotComparison = {\r\n controller: snapshotComparisonController,\r\n controllerAs: 'scvm',\r\n templateUrl: '/App/Components/SnapshotComparison/snapshotComparison.tmpl.html'\r\n};\r\n\r\nexport default snapshotComparison;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($filter, helperService, snapshotsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.objectsAreEqual = objectsAreEqual;\r\n vm.submit = submit;\r\n\r\n async function getRecordTypes() {\r\n try {\r\n let response = await snapshotsDataService.getRecordType();\r\n response.data = $filter('orderBy')(response.data, 'DisplayName');\r\n vm.recordTypes = response.data;\r\n vm.originalRecordTypes = angular.copy(vm.recordTypes);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n getRecordTypes();\r\n\r\n function objectsAreEqual() {\r\n if (angular.equals(vm.recordTypes, vm.originalRecordTypes)) {\r\n return true;\r\n } else { return false; }\r\n }\r\n\r\n function submit() {\r\n let data;\r\n\r\n vm.pleaseWait = new createSpinner();\r\n\r\n vm.recordTypes.forEach(async function (row, i) {\r\n\r\n if (row.Enabled !== vm.originalRecordTypes[i].Enabled) {\r\n\r\n data = {\r\n \"Id\": row.Id,\r\n \"Enabled\": row.Enabled\r\n }\r\n\r\n try {\r\n vm.originalRecordTypes[i].Enabled = row.Enabled;\r\n await snapshotsDataService.updateRecordType(data, row.Id);\r\n helperService.successfulSaveButton(vm.pleaseWait);\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n }\r\n });\r\n }\r\n}","import snapshotConfigurationController from \"./snapshotConfiguration.controller\";\r\n\r\n\r\n/* snapshotConfiguration.component.js */\r\n\r\n/**\r\n * @desc component for Snapshot Configuration in NetSuite\r\n * @example \r\n */\r\n\r\nconst snapshotConfiguration = {\r\n controller: snapshotConfigurationController,\r\n controllerAs: 'scvm',\r\n templateUrl: '/App/Components/SnapshotConfiguration/snapshotConfiguration.tmpl.html'\r\n};\r\n\r\nexport default snapshotConfiguration;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, nsAtDocumentationService, helperService, documentation) {\r\n const vm = this;\r\n vm.documentation = angular.copy(documentation);\r\n\r\n vm.submitDocumentationForm = submitDocumentationForm;\r\n vm.openDate = openDate;\r\n vm.cancel = cancel;\r\n vm.hasExistingValueChanged = hasExistingValueChanged;\r\n\r\n vm.datePopup = {\r\n opened: false\r\n };\r\n\r\n vm.dateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n function activate() {\r\n getTypes();\r\n getAuthorizedByOptions();\r\n\r\n if (documentation.Id) {\r\n vm.origDocumentation = angular.copy(documentation);\r\n }\r\n }\r\n\r\n activate();\r\n\r\n async function getTypes() {\r\n let response = await nsAtDocumentationService.getDocumentationTypes();\r\n response = $filter('orderBy')(response, 'Name');\r\n response = response.filter(t => t.Active);\r\n vm.typesDataSource = response;\r\n\r\n if (documentation.Id) {\r\n vm.documentation.Type = vm.typesDataSource.find(type => {\r\n return type.Name === documentation.Type;\r\n });\r\n }\r\n }\r\n\r\n async function getAuthorizedByOptions() {\r\n let response = await nsAtDocumentationService.getDocumentationAuthorizedByOptions();\r\n response = $filter('orderBy')(response, 'Name');\r\n response = response.filter(o => o.Active);\r\n vm.authorizedByOptionsDataSource = response;\r\n\r\n if (documentation.Id) {\r\n vm.documentation.AuthorizedBy = vm.authorizedByOptionsDataSource.find(auth => {\r\n return auth.Name === documentation.AuthorizedBy;\r\n });\r\n }\r\n }\r\n\r\n function submitDocumentationForm() {\r\n if (documentation.Id) {\r\n editDocumentation();\r\n } else {\r\n addNewDocumentation();\r\n }\r\n }\r\n\r\n async function addNewDocumentation() {\r\n vm.savingDocumentation = new createSpinner();\r\n const newDocumentation = {\r\n 'Date': vm.documentation.Date,\r\n 'Name': vm.documentation.Name,\r\n 'TypeId': vm.documentation.Type.Id,\r\n 'AuthorizedById': vm.documentation.AuthorizedBy ? vm.documentation.AuthorizedBy.Id : '',\r\n 'Notes': vm.documentation.Notes\r\n };\r\n\r\n try {\r\n await nsAtDocumentationService.createDocumentation(newDocumentation);\r\n await helperService.successfulSaveButton(vm.savingDocumentation);\r\n $uibModalInstance.close();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function editDocumentation() {\r\n vm.savingDocumentation = new createSpinner();\r\n const updatedDocumentation = {\r\n 'Id': vm.documentation.Id,\r\n 'Date': vm.documentation.Date,\r\n 'Name': vm.documentation.Name,\r\n 'TypeId': vm.documentation.Type.Id,\r\n 'AuthorizedById': vm.documentation.AuthorizedBy ? vm.documentation.AuthorizedBy.Id : '',\r\n 'Notes': vm.documentation.Notes\r\n };\r\n\r\n try {\r\n await nsAtDocumentationService.updateDocumentation(updatedDocumentation);\r\n await helperService.successfulSaveButton(vm.savingDocumentation);\r\n $uibModalInstance.close();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function hasExistingValueChanged() {\r\n if (vm.origDocumentation) {\r\n var currentDocumentation = angular.copy(vm.documentation);\r\n currentDocumentation.Type = vm.documentation.Type.Name;\r\n if (vm.documentation.AuthorizedBy && vm.documentation.AuthorizedBy.Name) {\r\n currentDocumentation.AuthorizedBy = vm.documentation.AuthorizedBy.Name;\r\n } else {\r\n currentDocumentation.AuthorizedBy = null;\r\n }\r\n\r\n return !angular.equals(vm.origDocumentation, currentDocumentation);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n function openDate() {\r\n vm.datePopup.opened = true;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize, customAutoCompleteFilterEqualToOnly, customDatePickerFilter } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, nsAtDocumentationService, $http, documentation) {\r\n\r\n const vm = this;\r\n vm.documentation = documentation;\r\n vm.cancel = cancel;\r\n vm.isLinked = isLinked;\r\n vm.linkTicketToDocumenation = linkTicketToDocumenation;\r\n vm.linkCustomTicket = linkCustomTicket;\r\n vm.unlinkTicketFromDocumentation = unlinkTicketFromDocumentation;\r\n vm.gridView = \"LinkedChangeTickets\";\r\n\r\n let linkedJiraTickets = [];\r\n let linkedServiceNowTickets = [];\r\n let linkedZendeskTickets = [];\r\n\r\n function activate() {\r\n configureGrids();\r\n }\r\n\r\n activate();\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n function configureGrids() {\r\n\r\n const statusTemplate = \"{{dataItem.Status}}\";\r\n\r\n //-----LINKED TICKETS-----\r\n\r\n const ticketTemplate = \"{{ dataItem.TicketProvider }} {{dataItem.TicketId}}\";\r\n\r\n const linkedChangeTicketsGridColumns = [\r\n { field: \"TicketId\", title: \"Ticket\", template: ticketTemplate, filterable: customAutoCompleteFilter },\r\n { field: \"TicketSubject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"TicketDescription\", title: \"Description\", template: \"{{ dataItem.TicketDescription }}\", filterable: customAutoCompleteFilter },\r\n { field: \"TicketStatus\", title: \"Status\", filterable: customAutoCompleteFilter },\r\n { field: \"TicketRequester\", title: \"Requester\", filterable: customAutoCompleteFilter },\r\n { field: \"TicketSubmitter\", title: \"Submitter\", filterable: customAutoCompleteFilter },\r\n { template: `Delete`, \"title\": \"Delete\", width: 100 }\r\n \r\n ];\r\n\r\n vm.linkedChangeTicketsGridOptions = helperService.setMainGridOptions(linkedChangeTicketsGridColumns, 300);\r\n vm.linkedChangeTicketsGridOptions.noRecords = {\r\n template: \"No Linked Change Tickets exist for this Documentation
\"\r\n };\r\n\r\n vm.linkedChangeTicketsGridDataSource = new kendo.data.DataSource({\r\n schema: halSchemaKendoGrid,\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let linkedTicketsData = helperService.prepareSortsAndFilters(options);\r\n const params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n let response = await nsAtDocumentationService.getDocumentationLinkedTicketsList(documentation.Id, linkedTicketsData, params);\r\n response._embedded.reportData.forEach(ticket => {\r\n switch (ticket.TicketProvider) {\r\n case \"Jira\":\r\n linkedJiraTickets.push(ticket);\r\n break;\r\n case \"ServiceNow\":\r\n linkedServiceNowTickets.push(ticket);\r\n break;\r\n case \"Zendesk\":\r\n linkedZendeskTickets.push(ticket);\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n options.success(response);\r\n }\r\n }\r\n });\r\n\r\n //-----END LINKED TICKETS-----\r\n\r\n //-----JIRA TICKETS----- \r\n\r\n const jiraTicketsGridColumns = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { title: ' ', template: \"Link\", width: 90 }\r\n ];\r\n\r\n vm.jiraTicketsGridOptions = helperService.setMainGridOptions(jiraTicketsGridColumns, 400);\r\n vm.jiraTicketsGridOptions.selectable = false;\r\n vm.jiraTicketsGridOptions.pageable = false;\r\n vm.jiraTicketsGridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n\r\n vm.jiraTicketsGridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n const sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n const jiraTicketsPostBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n try {\r\n let response = await $http.post(apiUrl + 'api/core/tickets/jira/search/', jiraTicketsPostBody);\r\n vm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n\r\n //-----END JIRA TICKETS-----\r\n\r\n //-----SERVICENOW TICKETS-----\r\n\r\n const serviceNowTicketsGridColumns = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { title: ' ', template: \"Link\", width: 90 }\r\n ];\r\n\r\n vm.serviceNowTicketsGridOptions = helperService.setMainGridOptions(serviceNowTicketsGridColumns, 400);\r\n vm.serviceNowTicketsGridOptions.selectable = false;\r\n vm.serviceNowTicketsGridOptions.pageable = false;\r\n vm.serviceNowTicketsGridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n\r\n vm.serviceNowTicketsGridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n const sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n const serviceNowTicketsPostBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n try {\r\n let response = await $http.post(apiUrl + 'api/core/tickets/servicenow/search/', serviceNowTicketsPostBody);\r\n vm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n\r\n //-----END SERVICENOW TICKETS-----\r\n\r\n //-----ZENDESK TICKETS-----\r\n\r\n const zendeskTicketsGridColumns = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: customAutoCompleteFilterEqualToOnly, width: 80 },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { title: ' ', template: \"Link\", width: 90 }\r\n ];\r\n\r\n vm.zendeskTicketsGridOptions = helperService.setMainGridOptions(zendeskTicketsGridColumns, 400);\r\n vm.zendeskTicketsGridOptions.selectable = false;\r\n vm.zendeskTicketsGridOptions.pageable = false;\r\n vm.zendeskTicketsGridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n\r\n vm.zendeskTicketsGridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n const sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n const zendeskTicketsPostBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n try {\r\n let response = await $http.post(apiUrl + 'api/core/tickets/zendesk/search/', zendeskTicketsPostBody);\r\n vm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function linkTicketToDocumenation(dataItem) {\r\n vm.actionInProgress = new createSpinner();\r\n\r\n const postData = {\r\n \"DocumentationId\": documentation.Id,\r\n \"TicketId\": dataItem.Id,\r\n \"Provider\": dataItem.Provider\r\n };\r\n\r\n try {\r\n await nsAtDocumentationService.linkChangeTicketToDocumentation(documentation.Id, postData);\r\n await helperService(vm.actionInProgress);\r\n vm.linkedChangeTicketsGridDataSource.read();\r\n } catch {\r\n vm.actionInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function linkCustomTicket() {\r\n let data = {\r\n Id: vm.customTicketId,\r\n Provider: \"Custom\"\r\n };\r\n vm.customTicketId = \"\";\r\n linkTicketToDocumenation(data);\r\n }\r\n\r\n async function unlinkTicketFromDocumentation(dataItem) {\r\n vm.actionInProgress = true;\r\n\r\n try {\r\n await nsAtDocumentationService.deleteChangeTicketDocumentationLink(documentation.Id, dataItem.NsAtDocumentationTicketId);\r\n linkedJiraTickets = [];\r\n linkedServiceNowTickets = [];\r\n linkedZendeskTickets = [];\r\n vm.linkedChangeTicketsGridDataSource.read();\r\n vm.actionInProgress = false;\r\n } catch {\r\n vm.actionInProgress = false;\r\n }\r\n }\r\n\r\n function isLinked(ticket) {\r\n switch (ticket.Provider) {\r\n case \"Jira\":\r\n return linkedJiraTickets.some(t => t.TicketId === ticket.Id);\r\n break;\r\n case \"ServiceNow\":\r\n return linkedServiceNowTickets.some(t => t.TicketId === ticket.Id);\r\n break;\r\n case \"Zendesk\":\r\n return linkedZendeskTickets.some(t => t.TicketId === ticket.Id);\r\n break;\r\n }\r\n }\r\n\r\n\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { customDatePickerFilter, customAutoCompleteFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, nsAtDocumentationService, $http, $filter, reportsService, templatesDataService, userGroupsDataService, reportsDataService, SavedReportSelectorService, documentation) {\r\n\r\n const vm = this;\r\n vm.documentation = documentation;\r\n vm.helperService = helperService;\r\n vm.cancel = cancel;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.deselectSelectedTemplates = deselectSelectedTemplates;\r\n vm.deselectSelectedUserGroups = deselectSelectedUserGroups;\r\n vm.linkChangesToDocumentation = linkChangesToDocumentation;\r\n vm.unlinkChangeFromDocumentation = unlinkChangeFromDocumentation;\r\n vm.changesChangeRowSelected = changesChangeRowSelected;\r\n vm.gridView = \"LinkedChanges\";\r\n vm.showChangesGrid = false;\r\n vm.changesToLink = [];\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n function activate() {\r\n configureLinkedChangesGrid();\r\n configureChangesGrid();\r\n }\r\n\r\n activate();\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n function configureLinkedChangesGrid() {\r\n //-----LINKED CHANGES-----\r\n\r\n const linkedChangesGridColumns = [\r\n { template: `Delete`, \"title\": \"Delete\", width: 100 }, \r\n { field: \"DetailDate\", title: \"Date\", template: \"{{ dataItem.DetailDate | date:'short'}}\", width: 150, filterable: customDatePickerFilter },\r\n { field: \"DetailObjectName\", title: \"Object Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DetailSubObjectName\", title: \"Sub Object Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DetailFieldName\", title: \"Field Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DetailRecordId\", title: \"Record Id\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"DetailRecordName\", title: \"Record Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"DetailUserId\", title: \"User Id\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"DetailUserName\", title: \"User Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"DetailRoleId\", title: \"Role Id\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DetailRoleName\", title: \"Role Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DetailContext\", title: \"Context\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DetailType\", title: \"Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"DetailOldValue\", title: \"Old Value\", width: 200, filterable: customAutoCompleteFilter },\r\n { field: \"DetailNewValue\", title: \"New Value\", width: 200, filterable: customAutoCompleteFilter }\r\n\r\n ];\r\n\r\n vm.linkedChangesGridOptions = helperService.setMainGridOptions(linkedChangesGridColumns, 400);\r\n vm.linkedChangesGridOptions.noRecords = {\r\n template: \"No Linked Changes exist for this Documentation
\"\r\n };\r\n\r\n vm.linkedChangesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n Date: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let linkedChangesData = helperService.prepareSortsAndFilters(options);\r\n const params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n try {\r\n let response = await nsAtDocumentationService.getDocumentationLinkedChangesList(documentation.Id, linkedChangesData, params)\r\n options.success(response);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n //-----LINKED CHANGES-----\r\n }\r\n\r\n async function getTemplates() {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n try {\r\n let response = await templatesDataService.getTemplates('NS');\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n const All = { \"Name\": \"All Templates\", \"Id\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(All);\r\n vm.templatesDataSource = response.data;\r\n vm.selectedTemplates = [All];\r\n vm.templateDropdownIsLoading = false;\r\n } catch {\r\n vm.templateDropdownIsLoading = false;\r\n }\r\n }\r\n\r\n async function getUserGroups() {\r\n vm.userGroupDropdownIsLoading = true;\r\n try {\r\n let response = await userGroupsDataService.getUserGroups();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n const AllUserGroups = { \"Name\": \"All User Groups\", \"Id\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(AllUserGroups);\r\n vm.userGroupsDataSource = response.data;\r\n vm.selectedUserGroups = [AllUserGroups];\r\n vm.userGroupDropdownIsLoading = false;\r\n } catch {\r\n vm.userGroupDropdownIsLoading = false;\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function getReportMetadata() {\r\n let response = await reportsDataService.getReportMetadata(vm.reportId)\r\n\r\n vm.reportMetadata = response.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n\r\n return vm.reportMetadata;\r\n }\r\n // ---\r\n\r\n\r\n\r\n async function configureChangesGrid() {\r\n // Have to hardcode object Id for All Changes report until we find a better way to get it\r\n vm.reportId = '220923C6-5810-4ECD-8A81-F40D07917388';\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n await getReportMetadata();\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n // ---\r\n\r\n getTemplates();\r\n getUserGroups();\r\n\r\n vm.changesGridColumns = [\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", width: 160, filterable: customDatePickerFilter },\r\n { field: \"ObjectName\", title: \"Object\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"SubObjectName\", title: \"Sub Object\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"FieldName\", title: \"Field\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RecordId\", title: \"Record Id\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RecordName\", title: \"Record Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserId\", title: \"User Id\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Context\", title: \"Context\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"ChangeId\", title: \"ChangeId\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectId\", title: \"ObjectId\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"FieldId\", title: \"FieldId\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"FieldApiId\", title: \"FieldApiId\", hidden: true, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.changesGridOptions = helperService.setMainGridOptions(vm.changesGridColumns, 400);\r\n vm.changesGridOptions.persistSelection = true;\r\n vm.changesGridOptions.selectable = \"multiple, row\";\r\n vm.changesGridOptions.autoBind = false;\r\n\r\n vm.changesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n id: \"ChangeId\",\r\n fields: {\r\n Date: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let templates = helperService.returnNullIfAllIsFound(vm.selectedTemplates.map(function (el) { return el.Id; }));\r\n let userGroups = helperService.returnNullIfAllIsFound(vm.selectedUserGroups.map(function (el) { return el.Id; }));\r\n\r\n let data = {\r\n 'TemplateIds': templates,\r\n 'UserGroupIds': userGroups,\r\n 'DocumentationId': documentation.Id\r\n };\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n data['QueryInput'].DateFilters = vm.filterCriteria.dateQuery;\r\n }\r\n // ---\r\n\r\n try {\r\n let response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/ns/v2/places/allchanges',\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n });\r\n options.success(response.data);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n vm.showChangesGrid = true;\r\n SavedReportSelectorService.queryGridWithOptions(null, vm.grid, true);\r\n }\r\n\r\n function deselectSelectedTemplates() {\r\n\r\n if (vm.selectedTemplates && vm.selectedTemplates[vm.selectedTemplates.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.selectedTemplates.forEach(function (row, i) {\r\n if (row.Id === 'AllObjectsInMultiSelect') {\r\n vm.selectedTemplates.splice(i, 1);\r\n }\r\n });\r\n } else {\r\n vm.selectedTemplates = [{ \"Name\": \"All Template Types\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n }\r\n }\r\n\r\n function deselectSelectedUserGroups() {\r\n\r\n if (vm.selectedUserGroups && vm.selectedUserGroups[vm.selectedUserGroups.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.selectedUserGroups.forEach(function (row, i) {\r\n if (row.Id === 'AllObjectsInMultiSelect') {\r\n vm.selectedUserGroups.splice(i, 1);\r\n }\r\n });\r\n } else {\r\n vm.selectedUserGroups = [{ \"Name\": \"All User Groups\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n }\r\n }\r\n\r\n async function linkChangesToDocumentation() {\r\n vm.actionInProgress = new createSpinner();\r\n\r\n try {\r\n await nsAtDocumentationService.linkChangeToDocumentation(documentation.Id, vm.changesToLink);\r\n await helperService.successfulSaveButton(vm.actionInProgress);\r\n vm.linkedChangesGridDataSource.read();\r\n vm.changesGridDataSource.read();\r\n } catch {\r\n vm.actionInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n async function unlinkChangeFromDocumentation(dataItem) {\r\n vm.actionInProgress = true;\r\n\r\n try {\r\n await nsAtDocumentationService.deleteChangeDocumentationLink(documentation.Id, dataItem.NsAtDocumentationDetailId);\r\n vm.linkedChangesGridDataSource.read();\r\n if (vm.changesGridDataSource._data.length > 0) {\r\n vm.changesGridDataSource.read();\r\n }\r\n vm.actionInProgress = false;\r\n } catch {\r\n vm.actionInProgress = false;\r\n }\r\n }\r\n\r\n function changesChangeRowSelected(kendoEvent) {\r\n vm.changesToLink = [];\r\n\r\n let grid = kendoEvent.sender;\r\n //stupid jQuery because of Kendo\r\n grid.select().each(function () {\r\n vm.changesToLink.push(grid.dataItem(this));\r\n });\r\n\r\n vm.changesToLink = vm.changesToLink.map(change => change.DetailId);\r\n }\r\n\r\n\r\n}","import { customDatePickerFilter, customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport documentationModalController from \"./documentationModal.controller\";\r\nimport swal from \"sweetalert2\";\r\nimport changeTicketsModalController from \"./ChangeTicketsModal/changeTicketsModal.controller\";\r\nimport changesModalController from \"./ChangesModal/changesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, helperService, nsAtDocumentationService) {\r\n const vm = this;\r\n\r\n vm.openDocumentationModal = openDocumentationModal;\r\n vm.deleteDocumentation = deleteDocumentation;\r\n vm.openChangeTicketsModal = openChangeTicketsModal;\r\n vm.openChangesModal = openChangesModal;\r\n\r\n function activate() {\r\n setupDocumentationGrid();\r\n }\r\n\r\n activate();\r\n\r\n function setupDocumentationGrid() {\r\n const columnsFromVM =\r\n [\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'shortDate'}}\", filterable: customDatePickerFilter },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", filterable: customAutoCompleteFilter },\r\n { field: \"AuthorizedBy\", title: \"Authorized By\", filterable: customAutoCompleteFilter },\r\n { field: \"Notes\", title: \"Notes\", filterable: customAutoCompleteFilter },\r\n { field: \"CreatedBy\", title: \"Created By\", filterable: customAutoCompleteFilter },\r\n { field: \"Id\", title: \"Id\", hidden: true },\r\n { template: `Changes`, \"title\": \"Changes\", width: 100 }, \r\n { template: `Change Tickets`, \"title\": \"Change Tickets\", width: 125 },\r\n { template: `Edit`, \"title\": \"Edit\", width: 100 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 100 }\r\n\r\n ];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(columnsFromVM, 500);\r\n vm.mainGridOptions.selectable = false;\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Date: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n let response = await nsAtDocumentationService.getDocumentation();\r\n response = $filter('orderBy')(response, '-Date');\r\n options.success(response);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function openDocumentationModal(documentation) {\r\n let documentationModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/ManageDocumentation/documentationModal.html',\r\n controller: documentationModalController,\r\n controllerAs: 'dmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n size: 'lg',\r\n resolve: {\r\n documentation: () => documentation || {}\r\n }\r\n });\r\n\r\n\r\n try {\r\n await documentationModal.result;\r\n vm.gridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteDocumentation(documentation) {\r\n await swal(helperService.areYouSureParams('Delete Documentation', 'Are you sure you want to delete documentation ' + documentation.Name + '?', 'Delete'))\r\n try {\r\n await nsAtDocumentationService.deleteDocumentation(documentation.Id);\r\n vm.gridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function openChangeTicketsModal(documentation) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/ManageDocumentation/ChangeTicketsModal/changeTicketsModal.html',\r\n controller: changeTicketsModalController,\r\n controllerAs: 'ctmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n size: 'lg',\r\n resolve: {\r\n documentation: () => documentation || {}\r\n }\r\n });\r\n }\r\n\r\n function openChangesModal(documentation) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/ManageDocumentation/ChangesModal/changesModal.html',\r\n controller: changesModalController,\r\n controllerAs: 'cmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n size: 'lg',\r\n resolve: {\r\n documentation: () => documentation || {}\r\n }\r\n });\r\n }\r\n}","/* maintainUserGroups.component.js */\r\n\r\nimport manageDocumentationController from \"./manageDocumentation.controller\";\r\n\r\n/**\r\n * @desc component for managing NetSuite Audit Trail documentation\r\n * @example \r\n */\r\n\r\nconst manageDocumentation = {\r\n controller: manageDocumentationController,\r\n controllerAs: 'mdvm',\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/ManageDocumentation/manageDocumentation.tmpl.html'\r\n};\r\n\r\nexport default manageDocumentation;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilterEqualToOnly, customAutoCompleteFilter, customDatePickerFilter } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, allChangesDataService, record, helperService) {\r\n\r\n const vm = this;\r\n vm.record = Object.assign({}, record.toJSON());\r\n vm.originalRecord = Object.assign({}, record.toJSON());\r\n\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.selectedTicketProviderChanged = selectedTicketProviderChanged;\r\n vm.cancel = cancel;\r\n vm.removeTicketAssociation = removeTicketAssociation;\r\n vm.saveChangesRecord = saveChangesRecord;\r\n vm.recordValuesHaveChanged = recordValuesHaveChanged;\r\n\r\n function changeRowSelected(kendoEvent) {\r\n const grid = kendoEvent.sender;\r\n vm.record.TicketId = grid.dataItem(grid.select()).Id;\r\n }\r\n\r\n function selectedTicketProviderChanged() {\r\n if (vm.record.TicketProvider !== 'Custom') {\r\n setupTicketsGrid();\r\n } else {\r\n vm.record.TicketId = null;\r\n }\r\n }\r\n\r\n function setupTicketsGrid() {\r\n\r\n const ticketsGridColumns = [\r\n { field: \"Status\", title: \"Status\", filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter }\r\n ];\r\n\r\n vm.ticketsGridOptions = helperService.setMainGridOptions(ticketsGridColumns, 250);\r\n vm.ticketsGridOptions.pageable = false;\r\n vm.ticketsGridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n\r\n vm.ticketsGridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async function (options) {\r\n const sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n const ticketsPostBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n try {\r\n let response = await allChangesDataService.ticketsReport(vm.record.TicketProvider.toLowerCase(), ticketsPostBody);\r\n options.success(response.data.Tickets);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n function removeTicketAssociation() {\r\n vm.record.TicketId = null;\r\n vm.record.TicketProvider = null;\r\n }\r\n\r\n function recordValuesHaveChanged(array) {\r\n return helperService.returnTrueIfValuesDiffer(array, vm.originalRecord, vm.record);\r\n }\r\n\r\n async function saveChangesRecord() {\r\n vm.saving = new createSpinner();\r\n const record = {\r\n \"ChangeId\": vm.record.ChangeId,\r\n \"IsSystemChange\": vm.record.SystemChange,\r\n \"Notes\": vm.record.Notes,\r\n \"TicketId\": vm.record.TicketProvider === 'Custom' && vm.record.CustomTicketId ? vm.record.CustomTicketId : vm.record.TicketId,\r\n \"TicketProvider\": vm.record.TicketProvider\r\n };\r\n try {\r\n await allChangesDataService.updateChangeRecord(record);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n}","import { standardGridPageSize, customAutoCompleteFilter, customDatePickerFilter, customBooleanFilter } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../Shared/kendo.module\";\r\nimport allChangesEditModalController from \"./allChangesEditModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, objectIdDataService, SavedReportSelectorService, templatesDataService, userGroupsDataService, CustomReportServices, $filter, $uibModal, helperService, reportsDataService, reportsService, allChangesDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.selectedTemplates = [];\r\n vm.helperService = helperService;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.deselectSelectedTemplates = deselectSelectedTemplates;\r\n vm.deselectSelectedUserGroups = deselectSelectedUserGroups;\r\n vm.openEditModal = openEditModal;\r\n\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.onReadGrid = onReadGrid;\r\n vm.onClearFilters = onClearFilters;\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n async function activate() {\r\n getTemplates();\r\n getUserGroups();\r\n await getObjectId();\r\n\r\n // --- Grid initialization ---\r\n setupAllChangesGrid();\r\n\r\n setColumns();\r\n runSavedReport();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n await getReportMetadata();\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n // --- \r\n }\r\n\r\n activate();\r\n\r\n async function getObjectId() {\r\n let objectId = await objectIdDataService.getObjectID();\r\n\r\n let securityObject = await helperService.getSecurityObjectDetailsFromObjectId(objectId);\r\n vm.ObjectId = objectId;\r\n vm.reportName = securityObject.Name;\r\n vm.reportId = securityObject.ReportID;\r\n\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(objectId);\r\n }\r\n\r\n function runSavedReport() {\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.templatesDataSource && vm.userGroupsDataSource && vm.filterCriteria.fields) {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.templatesDataSource && vm.userGroupsDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n }\r\n\r\n function setupAllChangesGrid() {\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n vm.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n vm.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n Date: { type: \"date\" },\r\n SystemChange: { type: \"boolean\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n let data = {\r\n 'TemplateIds': vm.templates,\r\n 'UserGroupIds': vm.userGroups\r\n };\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n const params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n data['QueryInput'].DateFilters = vm.filterCriteria.dateQuery;\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n\r\n try {\r\n let response = await allChangesDataService.allChangesReport(data, params);\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (vm.selectedTemplates === undefined || vm.selectedUserGroups === undefined) {\r\n return;\r\n }\r\n\r\n vm.templates = helperService.returnNullIfAllIsFound(vm.selectedTemplates.map(function (el) { return el.Id; }));\r\n vm.userGroups = helperService.returnNullIfAllIsFound(vm.selectedUserGroups.map(function (el) { return el.Id; }));\r\n\r\n var criteria = [];\r\n\r\n vm.selectedTemplates.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"TemplateIds\", 'TemplateId', row.Name, row.Id));\r\n });\r\n\r\n vm.selectedUserGroups.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"UserGroupIds\", 'UserGroupId', row.Name, row.Id));\r\n });\r\n\r\n vm.reportDetailsModel = criteria;\r\n\r\n vm.urlString = apiUrl + 'api/audittrail/ns/v2/places/allchanges';\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n }\r\n\r\n function deselectSelectedTemplates() {\r\n\r\n if (vm.selectedTemplates && vm.selectedTemplates[vm.selectedTemplates.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.selectedTemplates.forEach(function (row, i) {\r\n if (row.Id === 'AllObjectsInMultiSelect') {\r\n vm.selectedTemplates.splice(i, 1);\r\n }\r\n });\r\n } else {\r\n vm.selectedTemplates = [{ \"Name\": \"All Template Types\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n }\r\n populateCriteriaModel();\r\n }\r\n\r\n function deselectSelectedUserGroups() {\r\n\r\n if (vm.selectedUserGroups && vm.selectedUserGroups[vm.selectedUserGroups.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.selectedUserGroups.forEach(function (row, i) {\r\n if (row.Id === 'AllObjectsInMultiSelect') {\r\n vm.selectedUserGroups.splice(i, 1);\r\n }\r\n });\r\n } else {\r\n vm.selectedUserGroups = [{ \"Name\": \"All User Groups\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n }\r\n populateCriteriaModel();\r\n }\r\n\r\n async function getTemplates() {\r\n vm.templateDropdownIsLoading = true;\r\n\r\n try {\r\n let response = await templatesDataService.getTemplates('NS');\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n\r\n const All = { \"Name\": \"All Templates\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(All);\r\n vm.templatesDataSource = response.data;\r\n vm.selectedTemplates = [All];\r\n vm.selectedTemplates = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedTemplates);\r\n runSavedReport();\r\n vm.templateDropdownIsLoading = false;\r\n } catch {\r\n vm.templateDropdownIsLoading = false;\r\n }\r\n }\r\n\r\n async function getUserGroups() {\r\n vm.userGroupDropdownIsLoading = true;\r\n\r\n try {\r\n let response = await userGroupsDataService.getUserGroups();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n\r\n const AllUserGroups = { \"Name\": \"All User Groups\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(AllUserGroups);\r\n vm.userGroupsDataSource = response.data;\r\n vm.selectedUserGroups = [AllUserGroups];\r\n vm.selectedUserGroups = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedUserGroups);\r\n runSavedReport();\r\n vm.userGroupDropdownIsLoading = false;\r\n } catch {\r\n vm.userGroupDropdownIsLoading = false;\r\n }\r\n }\r\n\r\n let ticketTemplate = `{{ dataItem.TicketProvider }} {{dataItem.TicketId}}\r\n {{ dataItem.TicketProvider }} {{dataItem.TicketId}}`;\r\n\r\n function setColumns() {\r\n vm.mainGridColumns = [\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"ChangeId\", title: \"Change Id\", filterable: customAutoCompleteFilter },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"ObjectName\", title: \"Object\", filterable: customAutoCompleteFilter },\r\n { field: \"SubObjectName\", title: \"Sub Object\", filterable: customAutoCompleteFilter },\r\n { field: \"FieldName\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordId\", title: \"Record Id\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordName\", title: \"Record Name\", filterable: customAutoCompleteFilter },\r\n { field: \"UserId\", title: \"User Id\", filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", filterable: customAutoCompleteFilter },\r\n { field: \"RoleId\", title: \"Role Id\", filterable: customAutoCompleteFilter },\r\n { field: \"RoleName\", title: \"Role Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Context\", title: \"Context\", filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"Notes\", title: \"Notes\", filterable: customAutoCompleteFilter },\r\n { field: \"SystemChange\", title: \"System Change\", filterable: customBooleanFilter }\r\n ];\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n setLayout();\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, null);\r\n }\r\n }\r\n\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function onClearFilters() {\r\n vm.gridDataSource.filter({});\r\n }\r\n\r\n async function openEditModal(item) {\r\n let editModal = $uibModal.open({\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/AllChanges/allChangesEditModal.tmpl.html',\r\n controller: allChangesEditModalController,\r\n controllerAs: 'acemvm',\r\n backdrop: 'static',\r\n resolve: {\r\n record: () => item\r\n }\r\n });\r\n\r\n try {\r\n await editModal.result;\r\n vm.gridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function getReportMetadata() {\r\n let response = await reportsDataService.getReportMetadata(vm.reportId);\r\n\r\n vm.reportMetadata = response.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n\r\n return vm.reportMetadata;\r\n }\r\n\r\n}","/* allChanges.component.js */\r\n\r\nimport allChangesController from \"./allChanges.controller\";\r\n\r\n/**\r\n * @desc component for viewing all NetSuite audit trail changes\r\n * @example \r\n */\r\n\r\nconst allChanges = {\r\n controller: allChangesController,\r\n controllerAs: 'acvm',\r\n templateUrl: '/App/Components/NetSuiteAuditTrail/AllChanges/allChanges.tmpl.html'\r\n};\r\n\r\nexport default allChanges;","import { standardGridPageSize, customAutoCompleteFilter, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, objectIdDataService, netsuiteDataChangesDataService, CustomReportServices, reportsDataService, reportsService, $filter, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.selectedRecordType = [];\r\n vm.selectedUsers = [];\r\n\r\n // --- FOR ADVANCED FILTERING --- \r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n vm.helperService = helperService;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.deselectSelectedRecordType = deselectSelectedRecordType;\r\n vm.userDropdownChange = userDropdownChange;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n\r\n vm.onReadGrid = onReadGrid;\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.onClearFilters = onClearFilters;\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n activate();\r\n\r\n async function activate() {\r\n setUsers();\r\n setRecordTypes();\r\n await setObjectId();\r\n\r\n //Grid initialization\r\n setupDataChangesNSGrid();\r\n setColumns();\r\n runSavedReport();\r\n\r\n await setReportMetadata();\r\n if (!$rootScope.loadedSavedReport || !checkForSavedReportDateFilters()) {\r\n setupDefaultDateFilter();\r\n vm.filterCriteria.needsUpdate = true;\r\n }\r\n\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n }\r\n\r\n async function setObjectId() {\r\n vm.ObjectId = await objectIdDataService.getObjectID();\r\n\r\n let securityObject = await helperService.getSecurityObjectDetailsFromObjectId(vm.ObjectId);\r\n vm.reportName = securityObject.Name;\r\n vm.reportId = securityObject.ReportID;\r\n\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(vm.ObjectId);\r\n }\r\n\r\n function setupDataChangesNSGrid() {\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n vm.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n vm.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n Date: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async (options) => {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n let selectedUserIds = [];\r\n vm.selectedUsers.forEach(user => {\r\n if (user?.InternalId !== 'AllObjectsInMultiSelect') {\r\n selectedUserIds.push(user.InternalId);\r\n }\r\n });\r\n\r\n let data = {\r\n 'RecordTypes': vm.recordTypes,\r\n 'UserInternalIds': selectedUserIds\r\n };\r\n\r\n const params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n\r\n data['QueryInput'] = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n data['QueryInput'].DateFilters = vm.filterCriteria.dateQuery;\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n try {\r\n let response = await netsuiteDataChangesDataService.nsDataChangesReport(data, params);\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n async function setUsers() {\r\n try {\r\n let response = await netsuiteDataChangesDataService.getUsers();\r\n response.data = $filter('orderBy')(response.data, 'UserName');\r\n vm.allUsersDropdownObject = { \"UserName\": \"All Users\", \"InternalId\": \"AllObjectsInMultiSelect\" };\r\n await response.data.unshift(vm.allUsersDropdownObject);\r\n vm.userDataSource = response.data;\r\n vm.selectedUsers = [vm.allUsersDropdownObject];\r\n vm.selectedUsers = SavedReportSelectorService.checkSavedReportForUsers($rootScope.loadedSavedReport, response.data, vm.selectedUsers);\r\n userDropdownChange();\r\n runSavedReport();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function userDropdownChange() {\r\n vm.selectedUsers = helperService.deselectAllObjectsIfOtherIsClicked(vm.selectedUsers, vm.allUsersDropdownObject);\r\n if (!vm.selectedUsers?.length) {\r\n vm.selectedUsers.push(vm.allUsersDropdownObject);\r\n }\r\n populateCriteriaModel();\r\n }\r\n\r\n function populateCriteriaModel() {\r\n\r\n let criteria = [];\r\n\r\n //Used in TicketModal\r\n vm.product = {\r\n ID: 'NS',\r\n Type: 'NS'\r\n };\r\n\r\n vm.recordTypes = helperService.returnNullIfAllIsFound(vm.selectedRecordType.map(el => el.Id));\r\n\r\n vm.selectedUsers.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"InternalId\", 'User', row.UserName, row.InternalId));\r\n });\r\n\r\n vm.selectedRecordType.forEach(function (row) {\r\n criteria.push(CustomReportServices.CreateCriteria(\"RecordTypeId\", 'RecordType', row.Name, row.Id));\r\n });\r\n\r\n vm.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n }\r\n\r\n\r\n async function runSavedReport() {\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.recordTypesDataSource && vm.userDataSource) {\r\n await setReportMetadata();\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.recordTypesDataSource && vm.userDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n }\r\n\r\n function deselectSelectedRecordType() {\r\n\r\n if (vm.selectedRecordType && vm.selectedRecordType[vm.selectedRecordType.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.selectedRecordType.forEach(function (row, i) {\r\n if (row.Id === 'AllObjectsInMultiSelect') {\r\n vm.selectedRecordType.splice(i, 1);\r\n }\r\n });\r\n } else {\r\n vm.selectedRecordType = [{ \"DisplayName\": \"All Record Types\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n }\r\n populateCriteriaModel();\r\n }\r\n\r\n\r\n async function setRecordTypes() {\r\n let response = await netsuiteDataChangesDataService.getRecordTypes();\r\n\r\n response.data = $filter('orderBy')(response.data, 'DisplayName');\r\n //removes record Type if Insert, Update, Delete are all false\r\n response.data.remove(el => !el.Insert && !el.Update && !el.Delete);\r\n\r\n const all = { \"DisplayName\": \"All Record Types\", \"Id\": 'AllObjectsInMultiSelect' };\r\n\r\n response.data.unshift(all);\r\n vm.recordTypesDataSource = response.data;\r\n vm.selectedRecordType = [all];\r\n vm.selectedRecordType = SavedReportSelectorService.checkSavedReportForRecordTypeMultiSelect($rootScope.loadedSavedReport, response.data, vm.selectedRecordType);\r\n deselectSelectedRecordType();\r\n runSavedReport();\r\n }\r\n\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function setColumns() {\r\n const rowSettingsTemplate = ``;\r\n\r\n const ticketTemplate = \"{{ dataItem.TicketProvider }} {{dataItem.TicketId}}\";\r\n\r\n vm.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: customAutoCompleteFilter },\r\n { field: \"Id\", title: \"Change Id\", filterable: customAutoCompleteFilter },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"RecordLink\", title: \"Record Link\", template: \"View\", filterable: customAutoCompleteFilter },\r\n { field: \"User\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"UserRoleId\", title: \"User Role Id\", filterable: customAutoCompleteFilter },\r\n { field: \"UserRoleName\", title: \"User Role Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Event\", title: \"Event\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordType\", title: \"Record Type\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordName\", title: \"Record Name\", filterable: customAutoCompleteFilter },\r\n { field: \"DetailsLink\", title: \"Details Link\", template: \"View\", filterable: customAutoCompleteFilter },\r\n { field: \"Context\", title: \"Context\", filterable: customAutoCompleteFilter },\r\n { field: \"Company\", title: \"Subsidiary\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordId\", title: \"Record Id\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n setLayout();\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function onClearFilters() {\r\n vm.gridDataSource.filter({});\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, null);\r\n }\r\n }\r\n\r\n function setupDefaultDateFilter() {\r\n vm.filterCriteria.query = vm.filterCriteria.query || [];\r\n const today = new Date(),\r\n thirtyDaysPrior = new Date().setDate(today.getDate() - 30),\r\n startDate = new Date(thirtyDaysPrior).toISOString(),\r\n endDate = today.toISOString(),\r\n defaultDateFilter = [\r\n {\r\n \"FieldName\": \"Date\",\r\n \"Operator\": \"GreaterThanOrEqual\",\r\n \"Value\": startDate\r\n },\r\n {\r\n \"FieldName\": \"Date\",\r\n \"Operator\": \"LessThanOrEqual\",\r\n \"Value\": endDate\r\n }\r\n ];\r\n\r\n vm.filterCriteria.query.push(...defaultDateFilter);\r\n }\r\n\r\n function checkForSavedReportDateFilters() {\r\n if ($rootScope.loadedSavedReport) {\r\n return $rootScope.loadedSavedReport.ReportDefinition.Filters.some(filter => filter.FieldName === 'Date') || $rootScope.loadedSavedReport.ReportDefinition.DateFilters;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function setReportMetadata() {\r\n let response = await reportsDataService.getReportMetadata(vm.reportId);\r\n\r\n vm.reportMetadata = response.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n }\r\n // ---\r\n\r\n}","/* netsuiteDataChanges.component.js */\r\n\r\nimport netsuiteDataChangesController from \"./netsuiteDataChanges.controller\";\r\n\r\n/**\r\n * @desc component to display data changes for NetSuite\r\n * @example \r\n */\r\n\r\nconst netsuiteDataChanges = {\r\n controller: netsuiteDataChangesController,\r\n controllerAs: 'nsdcvm',\r\n templateUrl: '/App/Components/DataChangesNetSuite/netsuiteDataChanges.tmpl.html'\r\n};\r\n\r\nexport default netsuiteDataChanges;","import angular from 'angular';\r\nimport auditTrailNetSuiteFactoriesModule from './auditTrailNetSuite.factories.module';\r\nimport maintainTemplatesController from '../Components/NetSuiteAuditTrail/MaintainTemplates/maintainTemplates.controller';\r\nimport netsuiteDataChangesConfiguration from '../Components/DataChangesConfiguration/netsuiteDataChangesConfiguration.component';\r\nimport maintainOptionSets from '../Components/NetSuiteAuditTrail/MaintainOptionSets/maintainOptionSets.component';\r\nimport snapshotChanges from '../Components/SnapshotChanges/snapshotChanges.component';\r\nimport maintainUserGroups from '../Components/NetSuiteAuditTrail/MaintainUserGroups/maintainUserGroups.component';\r\nimport snapshotComparison from '../Components/SnapshotComparison/snapshotComparison.component';\r\nimport snapshotConfiguration from '../Components/SnapshotConfiguration/snapshotConfiguration.component';\r\nimport manageDocumentation from '../Components/NetSuiteAuditTrail/ManageDocumentation/manageDocumentation.component';\r\nimport allChanges from '../Components/NetSuiteAuditTrail/AllChanges/allChanges.component';\r\nimport netsuiteDataChanges from '../Components/DataChangesNetSuite/netsuiteDataChanges.component';\r\n\r\nexport default angular\r\n .module('app.auditTrail.netSuite', [auditTrailNetSuiteFactoriesModule])\r\n .controller(\"maintainTemplatesController\", maintainTemplatesController)\r\n .component(\"snapshotConfiguration\", snapshotConfiguration)\r\n .component(\"netsuiteDataChangesConfiguration\", netsuiteDataChangesConfiguration)\r\n .component(\"maintainOptionSets\", maintainOptionSets)\r\n .component('snapshotChanges', snapshotChanges)\r\n .component('maintainUserGroups', maintainUserGroups)\r\n .component('snapshotComparison', snapshotComparison)\r\n .component('manageDocumentation', manageDocumentation)\r\n .component('allChanges', allChanges)\r\n .component('netsuiteDataChanges', netsuiteDataChanges)\r\n .name;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, manageDataDataService) {\r\n\r\n var vm = this;\r\n\r\n vm.executeAction = executeAction;\r\n vm.openStartDate = openStartDate;\r\n vm.openEndDate = openEndDate;\r\n\r\n vm.newDate = new Date();\r\n\r\n // Date picker settings\r\n vm.archiveStartDatePopup = {\r\n opened: false\r\n };\r\n vm.purgeStartDatePopup = {\r\n opened: false\r\n };\r\n vm.restoreStartDatePopup = {\r\n opened: false\r\n };\r\n\r\n vm.singleDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1,\r\n maxDate: vm.newDate\r\n };\r\n\r\n vm.startDateOptions = {\r\n dateDisabled: disabled,\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n vm.endDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n maxDate: vm.newDate,\r\n startingDay: 1\r\n };\r\n\r\n vm.startDatePopup = {\r\n opened: false\r\n };\r\n\r\n vm.endDatePopup = {\r\n opened: false\r\n };\r\n\r\n\r\n function activate() {\r\n helperService.getConfigurationValue('DefaultMitigationsOverwriteCurrent').then(data => {\r\n vm.DefaultMitigationsOverwriteCurrent = data;\r\n });\r\n\r\n ninetyDaysAgo();\r\n thirtyDaysAgo();\r\n today();\r\n }\r\n\r\n activate();\r\n\r\n function ninetyDaysAgo() {\r\n var ninetyDaysAgo = new Date();\r\n ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);\r\n vm.archiveSingleDate = ninetyDaysAgo;\r\n vm.purgeSingleDate = ninetyDaysAgo;\r\n }\r\n\r\n function thirtyDaysAgo() {\r\n var thirtyDaysAgo = new Date();\r\n thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);\r\n vm.restoreStartDate = thirtyDaysAgo;\r\n }\r\n\r\n function disabled(data) {\r\n var date = data.date,\r\n mode = data.mode;\r\n return mode === 'day' && date > vm.restoreEndDate;\r\n }\r\n\r\n function openStartDate() {\r\n vm.startDatePopup.opened = true;\r\n }\r\n\r\n //End Date picker settings\r\n function today() {\r\n vm.restoreEndDate = vm.newDate;\r\n }\r\n\r\n function openEndDate() {\r\n vm.endDatePopup.opened = true;\r\n }\r\n\r\n function executeAction() {\r\n\r\n vm.dataChangesProcessIsRunning = new createSpinner();\r\n\r\n let data = {};\r\n data.ProductId = vm.product.ID;\r\n\r\n switch (vm.action.name) {\r\n case 'Collect':\r\n data.ImportType = vm.action.type;\r\n break;\r\n case 'Archive':\r\n data.Date = vm.archiveSingleDate.toISOString();\r\n break;\r\n case 'Purge':\r\n data.Date = vm.purgeSingleDate.toISOString();\r\n break;\r\n case 'Restore':\r\n data.StartDate = vm.restoreStartDate.toISOString();\r\n data.EndDate = vm.restoreEndDate.toISOString();\r\n break;\r\n }\r\n\r\n manageDataDataService.dataActionCall(vm.action.name.toLowerCase(), data)\r\n .then(dataActionCallComplete)\r\n .catch(dataActionCallFailed);\r\n\r\n function dataActionCallComplete() {\r\n vm.dataChangesProcessIsRunning.loadingValue = false;\r\n }\r\n\r\n function dataActionCallFailed() {\r\n vm.dataChangesProcessIsRunning.loadingValue = false;\r\n }\r\n }\r\n}\r\n","import manageDataActionController from \"./manageDataAction.controller\";\r\n\r\n/* manageDataAction.component.js */\r\n\r\n/**\r\n * @desc component for each action within manage data feature\r\n * @example \r\n */\r\n\r\nconst manageDataAction = {\r\n bindings: {\r\n product: '<',\r\n action: '<'\r\n },\r\n controller: manageDataActionController,\r\n controllerAs: 'mdavm',\r\n templateUrl: '/App/Components/ManageDataV2/Action/manageDataAction.tmpl.html'\r\n};\r\n\r\nexport default manageDataAction;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function manageDataConfigurationController(manageDataDataService, helperService) {\r\n var vm = this;\r\n\r\n vm.updateConfigValue = updateConfigValue;\r\n vm.configValueChanged = configValueChanged;\r\n \r\n async function updateConfigValue() {\r\n vm.updateInProgress = new createSpinner();\r\n\r\n let data = {\r\n \"Configurations\": [],\r\n \"ProductId\": vm.product.ID\r\n };\r\n\r\n data.Configurations.push({\r\n \"Name\": vm.action.configValue,\r\n \"Value\": vm.product.configuration[vm.action.configValue]\r\n });\r\n\r\n await manageDataDataService.setProductConfiguration(vm.product.ID, data);\r\n helperService.successfulSaveButton(vm.updateInProgress);\r\n }\r\n\r\n function configValueChanged() {\r\n var configValue = vm.action.configValue;\r\n var changedConfigurations = vm.product.changedConfigurations;\r\n\r\n if (vm.product.configuration[configValue] !== vm.product.oldConfig[configValue]) {\r\n // we have a new value so let's check if this config value is in our array\r\n if (!changedConfigurations.includes(configValue)) {\r\n // ok let's track this change\r\n changedConfigurations.push(configValue);\r\n }\r\n } else {\r\n // the value was changed back to the original value so we need to remove it from the array\r\n var index = changedConfigurations.indexOf(configValue);\r\n changedConfigurations.splice(index, 1);\r\n }\r\n }\r\n}\r\n","import manageDataConfigurationController from \"./manageDataConfiguration.controller\";\r\n\r\n/* manageDataConfiguration.component.js */\r\n\r\n/**\r\n * @desc component for each configuration within manage data feature\r\n * @example \r\n */\r\n\r\nconst manageDataConfiguration = {\r\n bindings: {\r\n product: '=',\r\n action: '<'\r\n },\r\n controller: manageDataConfigurationController,\r\n controllerAs: 'mdcvm',\r\n templateUrl: '/App/Components/ManageDataV2/Configuration/manageDataConfiguration.tmpl.html'\r\n};\r\n\r\nexport default manageDataConfiguration;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, $rootScope, helperService) {\r\n\r\n var vm = this;\r\n vm.$onInit = activate;\r\n vm.schedule = {};\r\n\r\n function activate() {\r\n\r\n //Only allow 'Daily' schedule frequency for Workday Collect Data Changes\r\n if (vm.action.displayName === 'Collect Data Changes' && vm.product.ID === 'WD') {\r\n vm.frequencies = ['Daily'];\r\n } else {\r\n vm.frequencies = ['Daily', 'Weekly', 'Monthly'];\r\n }\r\n\r\n vm.daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n vm.daysInMonth = helperService.getDayOfMonthDropdownOptions();\r\n vm.schedule.startTimeForScheduleImport = new Date();\r\n\r\n vm.hasExistingValueChanged = hasExistingValueChanged;\r\n vm.scheduleImportStatusChanged = scheduleImportStatusChanged;\r\n vm.updateScheduleImport = updateScheduleImport;\r\n\r\n setupLinks();\r\n }\r\n\r\n function setupLinks() {\r\n var productId = vm.product.ID;\r\n var action = vm.action.name.toLowerCase();\r\n\r\n if (vm.action.type) {\r\n vm.getScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + action + '/schedule/' + productId + '/' + vm.action.type;\r\n } else {\r\n vm.getScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + action + '/schedule/' + productId;\r\n }\r\n vm.putScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + action + '/schedule';\r\n\r\n if (vm.action.name === 'Collect') {\r\n vm.deleteScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + action + '/schedule/' + productId + '/' + vm.action.type;\r\n } else {\r\n vm.deleteScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + action + '/schedule/' + productId;\r\n }\r\n\r\n getImportSchedule();\r\n }\r\n\r\n function getImportSchedule() {\r\n $http.get(vm.getScheduleUrl).then(response => {\r\n vm.importSchedule = response.data;\r\n vm.schedule.selectedFreqForScheduleImport = response.data.Frequency;\r\n vm.schedule.selectedDayOfWeekForScheduleImport = response.data.DayOfWeek;\r\n vm.schedule.selectedDayOfMonthForScheduleImport = { Name: response.data.DayOfMonth, Value: response.data.DayOfMonth };\r\n vm.schedule.startTimeForScheduleImport = new Date(response.data.StartTime);\r\n vm.originalSchedule = angular.copy(vm.schedule);\r\n vm.ScheduleImportIsOn = true;\r\n }).catch(_ => {\r\n vm.importSchedule = null;\r\n vm.ScheduleImportIsOn = false;\r\n });\r\n }\r\n\r\n function scheduleImportStatusChanged() {\r\n if (!vm.ScheduleImportIsOn && vm.importSchedule) {\r\n updateScheduleImport(false);\r\n }\r\n }\r\n\r\n function updateScheduleImport(isOn) {\r\n updateSchedule(isOn, vm.schedule.selectedFreqForScheduleImport, vm.schedule.selectedDayOfWeekForScheduleImport, vm.schedule.selectedDayOfMonthForScheduleImport, vm.schedule.startTimeForScheduleImport, vm.putScheduleUrl, vm.deleteScheduleUrl, vm.importSchedule);\r\n }\r\n\r\n function updateSchedule(scheduleIsOn, frequency, dayOfWeek, dayOfMonth, startTime, scheduleUrl, disableUrl, downloadedSchedule) {\r\n\r\n vm.updateInProgress = new createSpinner();\r\n\r\n if (scheduleIsOn) {\r\n\r\n var dayOfMonthRequest;\r\n var dayOfWeekRequest;\r\n\r\n if (frequency === 'Daily') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [];\r\n } if (frequency === 'Weekly') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [dayOfWeek];\r\n } if (frequency === 'Monthly') {\r\n dayOfMonthRequest = [dayOfMonth.Value];\r\n dayOfWeekRequest = [];\r\n }\r\n\r\n let putData = {\r\n \"Schedule\": {\r\n \"DayOfMonth\": dayOfMonthRequest[0],\r\n \"DayOfWeek\": dayOfWeekRequest[0],\r\n \"Frequency\": frequency,\r\n \"StartTime\": startTime.toUTCString(),\r\n \"TimeZone\": $rootScope.applicationTimeZone\r\n },\r\n \"ProductId\": vm.product.ID\r\n };\r\n\r\n if (vm.action.name === \"Collect\") {\r\n putData.ScheduleType = vm.action.type;\r\n }\r\n\r\n $http.put(scheduleUrl, putData).then(function (response) {\r\n getImportSchedule();\r\n helperService.successfulSaveButton(vm.updateInProgress);\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n vm.updateInProgress.loadingValue = false;\r\n });\r\n } else if (scheduleIsOn === false) {\r\n if (downloadedSchedule) {\r\n $http.delete(disableUrl, {}).then(function (response) {\r\n vm.schedule = null;\r\n vm.originalSchedule = null;\r\n getImportSchedule();\r\n vm.updateInProgress.loadingValue = false;\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n vm.updateInProgress.loadingValue = false;\r\n });\r\n }\r\n }\r\n }\r\n\r\n function hasExistingValueChanged() {\r\n if (vm.originalSchedule && angular.equals(vm.originalSchedule, vm.schedule)) {\r\n return false;\r\n } else {\r\n // Either creating a new value or user has modified one of the fields\r\n return true;\r\n }\r\n }\r\n\r\n\r\n}\r\n","import manageDataScheduleController from \"./manageDataSchedule.controller\";\r\n\r\n/* manageDataSchedule.component.js */\r\n\r\n/**\r\n * @desc component for manage data to schedule any actions for a given product\r\n * @example \r\n */\r\n\r\nconst manageDataSchedule = {\r\n bindings: {\r\n product: '<',\r\n action: '<'\r\n },\r\n controller: manageDataScheduleController,\r\n controllerAs: 'savm',\r\n templateUrl: '/App/Components/ManageDataV2/Schedule/manageDataSchedule.tmpl.html'\r\n};\r\n\r\nexport default manageDataSchedule;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, manageDataFactory, manageDataDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = activate;\r\n\r\n vm.updateConfigValues = updateConfigValues;\r\n vm.isProductConfigUnChanged = isProductConfigUnChanged;\r\n\r\n function activate() {\r\n vm.helperService = helperService;\r\n\r\n getProductConfigurations();\r\n }\r\n\r\n async function getProductConfigurations() {\r\n let response = await manageDataDataService.getConfigurationByProductId(vm.product.ID);\r\n vm.product.configuration = {};\r\n\r\n response.data.forEach(function (productConfig) {\r\n vm.product.configuration[productConfig.Name] = productConfig.Value;\r\n });\r\n\r\n vm.product.changedConfigurations = [];\r\n vm.product.oldConfig = angular.copy(vm.product.configuration);\r\n\r\n if (vm.product.Type === 'NS') {\r\n let response = await manageDataDataService.getNetSuiteAuditTrailVersion();\r\n vm.product.version = response.data;\r\n getProductActions(vm.product);\r\n } else {\r\n getProductActions(vm.product);\r\n }\r\n }\r\n\r\n function getProductActions(product) {\r\n vm.productActions = manageDataFactory.getActionsByProductId(product);\r\n\r\n if (vm.product.Type === 'ORFC') vm.productActions = vm.productActions.filter(a => a.name === 'Collect');\r\n if (vm.product.Type === 'AX7') vm.productActions = vm.productActions.filter(a => a.name !== 'Restore');\r\n\r\n vm.configurationNeeded = vm.productActions.some(action => action.configValue);\r\n }\r\n\r\n async function updateConfigValues() {\r\n vm.updateInProgress = new createSpinner();\r\n let eligibleValues = vm.product.changedConfigurations;\r\n let data = {\r\n 'Configurations': [],\r\n 'ProductId': vm.product.ID\r\n };\r\n\r\n eligibleValues.forEach(value => {\r\n data.Configurations.push({\r\n 'Name': value,\r\n 'Value': vm.product.configuration[value]\r\n });\r\n });\r\n await manageDataDataService.setProductConfiguration(vm.product.ID, data);\r\n helperService.successfulSaveButton(vm.updateInProgress);\r\n // update oldconfig so button gets disabled after saving\r\n vm.product.oldConfig = { ...vm.product.configuration };\r\n }\r\n\r\n function isProductConfigUnChanged() {\r\n if (vm.product.oldConfig && vm.product.configuration) {\r\n return angular.equals(vm.product.oldConfig, vm.product.configuration);\r\n }\r\n }\r\n}","import manageDataProductController from \"./manageDataProduct.controller\";\r\n\r\n/* manageDataProduct.component.js */\r\n\r\n/**\r\n * @desc component for each product to handle any manage data functions\r\n * @example \r\n */\r\n\r\nconst manageDataProduct = {\r\n bindings: {\r\n product: '<'\r\n },\r\n controller: manageDataProductController,\r\n controllerAs: 'mdpvm',\r\n templateUrl: '/App/Components/ManageDataV2/Product/manageDataProduct.tmpl.html'\r\n};\r\n\r\nexport default manageDataProduct;","export default /*@ngInject*/ function (templatesDataService) {\r\n\r\n const vm = this;\r\n vm.updateTemplate = updateTemplate;\r\n\r\n vm.$onInit = getTemplates;\r\n\r\n async function getTemplates() {\r\n let response = await templatesDataService.getTemplates('ORFC');\r\n vm.templatesDataSource = response.data;\r\n }\r\n\r\n async function updateTemplate(template) {\r\n const data = {\r\n ProductId: template.Id,\r\n Enabled: template.Enabled\r\n };\r\n try {\r\n await templatesDataService.updateTemplate(data);\r\n } catch (err) {\r\n if (template.Enabled) {\r\n template.Enabled = false;\r\n } else {\r\n template.Enabled = true;\r\n }\r\n }\r\n }\r\n}","import maintainTemplatesController from \"./maintainTemplates.controller\";\r\n\r\n/* maintainTemplates.component.js */\r\n\r\n/**\r\n * @desc component for maintaining audit trail templates\r\n * @example \r\n */\r\n\r\nconst maintainTemplates = {\r\n controller: maintainTemplatesController,\r\n controllerAs: 'mtvm',\r\n templateUrl: '/App/Components/AuditTrail/MaintainTemplates/maintainTemplates.tmpl.html'\r\n};\r\n\r\nexport default maintainTemplates;","import allSupportedProducts from \"../../Shared/GlobalVariables/ProductLookUp\";\r\n\r\nexport default /*@ngInject*/ function ($scope, objectIdDataService, $http, helperService) {\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n $scope.helperService = helperService;\r\n\r\n var vm = $scope.vm = {};\r\n var parentVm = $scope.parentVm = {};\r\n\r\n parentVm.radioSelected = '';\r\n\r\n $scope.helperService.getConfigurationValue('AT_ArchiveDays').then(function (data) {\r\n parentVm.origAT_ArchiveDays = data;\r\n parentVm.AT_ArchiveDays = data;\r\n });\r\n\r\n $scope.helperService.getConfigurationValue('AT_PurgeDays').then(function (data) {\r\n parentVm.origAT_PurgeDays = data;\r\n parentVm.AT_PurgeDays = data;\r\n });\r\n\r\n $http.get(apiUrl + 'api/core/configuration').then(function (response) {\r\n parentVm.configurationValues = {};\r\n response.data.forEach(function (product) {\r\n parentVm.configurationValues[product.Name] = product.Value;\r\n });\r\n });\r\n\r\n parentVm.checkImportFocus = function (product) {\r\n if (parentVm.radioSelected === null || parentVm.radioSelected === \"\") {\r\n return false;\r\n } else {\r\n if (parentVm.radioSelected.has(product)) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n parentVm.ProductImportTiles = {};\r\n\r\n allSupportedProducts.forEach(function (product) {\r\n parentVm.ProductImportTiles[product.ID] = 'hide';\r\n });\r\n\r\n function determineProductVisability() {\r\n parentVm.availableProducts.forEach(function (availableProduct) {\r\n parentVm.ProductImportTiles[availableProduct.ID] = 'show';\r\n });\r\n }\r\n\r\n parentVm.ActionTiles = {};\r\n\r\n $http.get(apiUrl + '/api/core/modules/' + 3000 + '/products').then(function (response) {\r\n\r\n parentVm.availableProducts = response.data;\r\n determineProductVisability();\r\n\r\n response.data = response.data.filter(function (el) { return el.Type === 'NS' || el.Type === 'SAP' || el.Type === 'GP' || el.Type === 'NAV' || el.Type === 'AX' || el.Type === \"AX5\" || el.Type === \"AX7\" || el.Type === \"SL\" || el.IsCustom; });\r\n\r\n parentVm.ActionTiles['CollectDataChanges'] = 'show';\r\n parentVm.ActionTiles['ArchiveDataChanges'] = 'show';\r\n parentVm.ActionTiles['RestoreDataChanges'] = 'show';\r\n parentVm.ActionTiles['PurgeDataChanges'] = 'show';\r\n\r\n response.data.forEach(function (data) {\r\n if (data.ID === 'NS') {\r\n parentVm.ActionTiles['CollectSnapshot'] = 'show';\r\n } else if (data.ID === 'AX7') {\r\n parentVm.ActionTiles['CollectDataChanges'] = 'show';\r\n parentVm.ActionTiles['ArchiveDataChanges'] = 'hide';\r\n parentVm.ActionTiles['RestoreDataChanges'] = 'hide';\r\n parentVm.ActionTiles['PurgeDataChanges'] = 'hide';\r\n }\r\n });\r\n\r\n parentVm.availableProducts = {};\r\n response.data.forEach(function (product) {\r\n parentVm.availableProducts[product.ID] = 'show';\r\n });\r\n\r\n });\r\n\r\n var newDate = $scope.newDate = new Date();\r\n\r\n //Single Date picker settings\r\n $scope.singleDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1,\r\n maxDate: newDate\r\n };\r\n\r\n $scope.ninetyDaysAgo = function () {\r\n var ninetyDaysAgo = new Date();\r\n ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);\r\n vm.singleDate = ninetyDaysAgo;\r\n };\r\n\r\n $scope.ninetyDaysAgo();\r\n\r\n //Start Date picker settings\r\n $scope.thirtyDaysAgo = function () {\r\n var thirtyDaysAgo = new Date();\r\n thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);\r\n vm.restoreStartDate = thirtyDaysAgo;\r\n };\r\n\r\n $scope.thirtyDaysAgo();\r\n\r\n $scope.startDateOptions = {\r\n dateDisabled: disabled,\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n function disabled(data) {\r\n var date = data.date,\r\n mode = data.mode;\r\n return mode === 'day' && date > vm.restoreEndDate;\r\n }\r\n\r\n $scope.openStartDate = function () {\r\n $scope.startDatePopup.opened = true;\r\n };\r\n\r\n $scope.startDatePopup = {\r\n opened: false\r\n };\r\n\r\n //End Date picker settings\r\n $scope.today = function () {\r\n vm.restoreEndDate = newDate;\r\n };\r\n $scope.today();\r\n\r\n $scope.endDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n maxDate: newDate,\r\n startingDay: 1\r\n };\r\n\r\n $scope.openEndDate = function () {\r\n $scope.endDatePopup.opened = true;\r\n };\r\n\r\n $scope.endDatePopup = {\r\n opened: false\r\n };\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, helperService) {\r\n\r\n var manageDataVm = $scope.manageDataVm = {};\r\n\r\n manageDataVm.archiveData = function () {\r\n manageDataVm.dataProcessIsRunning = new createSpinner();\r\n $http.put(apiUrl + 'api/audittrail/auditdata/archive', { Date: $scope.vm.singleDate, RecordTypes: [] }).then(function (response) {\r\n //helperService.showConfirmationMessage(\"Attention\", \"This process has been initiated.\");\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n });\r\n };\r\n\r\n $scope.helperService.getConfigurationValue('DefaultMitigationsOverwriteCurrent').then(function (data) {\r\n vm.DefaultMitigationsOverwriteCurrent = data;\r\n });\r\n}\r\n","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, helperService) {\r\n\r\n var manageDataVm = $scope.manageDataVm = {};\r\n\r\n manageDataVm.collectAuditTrailDataApiCall = function () {\r\n\r\n var selectedProduct = $scope.parentVm.radioSelected;\r\n var product = null;\r\n\r\n if (selectedProduct === 'AX5_CollectDataChanges') {\r\n product = 'ax5';\r\n } else if (selectedProduct === 'NS_CollectDataChanges') {\r\n product = 'ns';\r\n } else if (selectedProduct === 'SAP_CollectDataChanges') {\r\n product = 'sap';\r\n } else if (selectedProduct === 'GP_CollectDataChanges') {\r\n product = 'gp';\r\n } else if (selectedProduct === 'NAV_CollectDataChanges') {\r\n product = 'nav';\r\n } else if (selectedProduct === 'AX_CollectDataChanges') {\r\n product = 'ax';\r\n } else if (selectedProduct === 'AX7_CollectDataChanges') {\r\n product = 'ax7';\r\n } else if (selectedProduct === 'SL_CollectDataChanges') {\r\n product = 'sl';\r\n }\r\n\r\n manageDataVm.dataProcessIsRunning = new createSpinner();\r\n var url = apiUrl + 'api/audittrail/' + product + '/auditdata/import';\r\n if (product === 'sap') {\r\n url = apiUrl + 'api/audittrail/sap/SAP/auditdata/import';\r\n } else if (product === 'ax7') {\r\n url = apiUrl + 'api/audittrail/ax7/auditdata/move';\r\n }\r\n $http.put(url, {}).then(function (response) {\r\n //helperService.showConfirmationMessage(\"Attention\", \"This process has been initiated.\");\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n });\r\n };\r\n}\r\n","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, helperService) {\r\n\r\n var manageDataVm = $scope.manageDataVm = {};\r\n\r\n manageDataVm.collectSnapshot = function () {\r\n manageDataVm.dataProcessIsRunning = new createSpinner();\r\n $http.put(apiUrl + 'api/audittrail/ns/snapshot/import', {}).then(function (response) {\r\n //helperService.showConfirmationMessage(\"Attention\", \"This process has been initiated.\");\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n });\r\n };\r\n\r\n}\r\n","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, helperService) {\r\n\r\n var manageDataVm = $scope.manageDataVm = {};\r\n\r\n manageDataVm.purgeData = function () {\r\n manageDataVm.dataProcessIsRunning = new createSpinner();\r\n $http.put(apiUrl + 'api/audittrail/auditdata/purge', { Date: $scope.vm.singleDate.toUTCString() }).then(function (response) {\r\n //helperService.showConfirmationMessage(\"Attention\", \"This process has been initiated.\");\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n });\r\n };\r\n}\r\n","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, helperService) {\r\n\r\n var manageDataVm = $scope.manageDataVm = {};\r\n\r\n manageDataVm.restoreData = function () {\r\n manageDataVm.dataProcessIsRunning = new createSpinner();\r\n $http.put(apiUrl + 'api/audittrail/auditdata/restore', { StartDate: $scope.vm.restoreStartDate.toUTCString(), EndDate: $scope.vm.restoreEndDate.toUTCString(), RecordTypes: [] }).then(function (response) {\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n manageDataVm.dataProcessIsRunning.loadingValue = false;\r\n });\r\n };\r\n}\r\n","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $http, helperService) {\r\n\r\n $scope.init = function (productRoute, actionRoute) {\r\n if (productRoute) {\r\n $scope.productRoute = productRoute;\r\n\r\n if (productRoute === 'sap') {\r\n productRoute = 'sap/sap';\r\n }\r\n\r\n $scope.getScheduleUrl = apiUrl + 'api/audittrail/' + productRoute + '/' + actionRoute + '/schedule';\r\n $scope.putScheduleUrl = apiUrl + 'api/audittrail/' + productRoute + '/' + actionRoute + '/schedule';\r\n $scope.deleteScheduleUrl = apiUrl + 'api/audittrail/' + productRoute + '/' + actionRoute + '/schedule/disable';\r\n } else {\r\n $scope.getScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + actionRoute + '/schedule';\r\n $scope.putScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + actionRoute + '/schedule';\r\n $scope.deleteScheduleUrl = apiUrl + 'api/audittrail/auditdata/' + actionRoute + '/schedule/disable';\r\n }\r\n\r\n vm.getImportSchedule();\r\n };\r\n\r\n var vm = $scope.vm = {};\r\n\r\n vm.frequencies = ['Daily', 'Weekly', 'Monthly'];\r\n\r\n vm.daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\n vm.daysInMonth = helperService.getDayOfMonthDropdownOptions();\r\n\r\n vm.startTimeForScheduleImport = new Date();\r\n\r\n vm.getImportSchedule = function () {\r\n $http.get($scope.getScheduleUrl).then(function (response) {\r\n vm.importSchedule = response.data;\r\n vm.selectedFreqForScheduleImport = response.data.Frequency;\r\n vm.selectedDayOfWeekForScheduleImport = response.data.DayOfWeek;\r\n vm.selectedDayOfMonthForScheduleImport = { Value: response.data.DayOfMonth };\r\n vm.startTimeForScheduleImport = new Date(response.data.StartTime);\r\n vm.ScheduleImportIsOn = true;\r\n }, function () {\r\n vm.importSchedule = null;\r\n vm.ScheduleImportIsOn = false;\r\n });\r\n };\r\n\r\n vm.scheduleImportStatusChanged = function () {\r\n if (!vm.ScheduleImportIsOn && vm.importSchedule) {\r\n vm.updateScheduleImport(false);\r\n }\r\n };\r\n\r\n vm.updateScheduleImport = function (isOn) {\r\n vm.updateSchedule(isOn, vm.selectedFreqForScheduleImport, vm.selectedDayOfWeekForScheduleImport, vm.selectedDayOfMonthForScheduleImport, vm.startTimeForScheduleImport, $scope.putScheduleUrl, $scope.deleteScheduleUrl, vm.importSchedule);\r\n };\r\n\r\n vm.updateSchedule = function (scheduleIsOn, frequency, dayOfWeek, dayOfMonth, startTime, scheduleUrl, disableUrl, downloadedSchedule) {\r\n\r\n\r\n vm.updateInProgress = new createSpinner();\r\n\r\n if (scheduleIsOn) {\r\n\r\n var dayOfMonthRequest;\r\n var dayOfWeekRequest;\r\n\r\n if (frequency === 'Daily') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [];\r\n } if (frequency === 'Weekly') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [dayOfWeek];\r\n } if (frequency === 'Monthly') {\r\n dayOfMonthRequest = [dayOfMonth.Value];\r\n dayOfWeekRequest = [];\r\n }\r\n\r\n var putData = {\r\n \"Schedule\": {\r\n \"DayOfMonth\": dayOfMonthRequest[0],\r\n \"DayOfWeek\": dayOfWeekRequest[0],\r\n \"Frequency\": frequency,\r\n \"StartTime\": startTime.toUTCString(),\r\n \"TimeZone\": $rootScope.applicationTimeZone\r\n },\r\n \"ProductId\": $scope.productRoute\r\n };\r\n\r\n $http.put(scheduleUrl, putData).then(function (response) {\r\n vm.getImportSchedule();\r\n helperService.successfulSaveButton(vm.updateInProgress);\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n vm.updateInProgress.loadingValue = false;\r\n });\r\n } if (!scheduleIsOn) {\r\n if (downloadedSchedule) {\r\n $http.put(disableUrl, {}).then(function (response) {\r\n vm.getImportSchedule();\r\n vm.updateInProgress.loadingValue = false;\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n vm.updateInProgress.loadingValue = false;\r\n });\r\n }\r\n }\r\n };\r\n\r\n}\r\n","import { standardGridPageSize, customDatePickerNotNullableFilter, customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $scope, SavedReportSelectorService, dataService, objectIdDataService, CustomReportServices, $filter, $http, helperService, reportsDataService, reportsService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = onInit;\r\n\r\n vm.runSavedReport = runSavedReport;\r\n vm.productDropdownChange = productDropdownChange;\r\n vm.thirtyDaysAgo = thirtyDaysAgo;\r\n vm.openStartDate = openStartDate;\r\n vm.today = today;\r\n vm.openEndDate = openEndDate;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.setColumns = setColumns;\r\n vm.setLayout = setLayout;\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.onReadGrid = onReadGrid;\r\n vm.onClearFilters = onClearFilters;\r\n vm.setDates = setDates;\r\n vm.getDateFilters = getDateFilters;\r\n vm.getPeriodId = getPeriodId;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n vm.filterCriteria.dateQuery = [];\r\n // ---\r\n\r\n async function onInit() {\r\n vm.RelativeDateTypeDataSource = CustomReportServices.getRelativeDateTypes();\r\n vm.PeriodTypeDataSource = CustomReportServices.getPeriodTypes();\r\n vm.RelativeDateType = 2;\r\n vm.PeriodType = 0;\r\n\r\n vm.dateCriteria = [\r\n {\r\n \"DataType\": \"DateTime\",\r\n \"FieldName\": \"Date\",\r\n \"IsNullable\": false\r\n }\r\n ];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n vm.startDateOptions = {\r\n dateDisabled: disabled,\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n vm.startDatePopup = {\r\n opened: false\r\n };\r\n\r\n vm.endDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n startingDay: 1\r\n };\r\n\r\n vm.endDatePopup = {\r\n opened: false\r\n };\r\n\r\n await getObjectId();\r\n await getProducts();\r\n thirtyDaysAgo();\r\n setDates();\r\n today();\r\n }\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n async function getObjectId() {\r\n const objectId = await objectIdDataService.getObjectID();\r\n // Needed for report toolbar controller functions\r\n vm.ObjectId = objectId;\r\n vm.reportName = helperService.getSecurityObjectDetailsFromObjectId(vm.ObjectId).Name;\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(vm.ObjectId);\r\n }\r\n\r\n async function getProducts() {\r\n const response = await dataService.getProducts();\r\n response.data = response.data.filter(product => product.Type === \"ORFC\");\r\n vm.productsDataSource = response.data;\r\n vm.selectedProduct = response.data[0];\r\n vm.selectedProduct = SavedReportSelectorService.checkSavedReportForSingleProduct($rootScope.loadedSavedReport, response.data, vm.selectedProduct);\r\n vm.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType(vm.ObjectId, vm.selectedProduct.Type).ReportID;\r\n productDropdownChange();\r\n }\r\n\r\n async function runSavedReport() {\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.productsDataSource && vm.filterCriteria.fields) {\r\n vm.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType(vm.ObjectId, vm.selectedProduct.Type).ReportID;\r\n await getReportMetadata();\r\n\r\n const dateFieldName = 'Date';\r\n // --- FOR ADVANCED FILTERING ---\r\n // Convert date filters to criteria\r\n if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.DateFilters.length > 0) {\r\n const criteriaDateFilterIndex = $rootScope.loadedSavedReport.ReportDefinition.DateFilters.findIndex(filter => filter.FieldName === dateFieldName);\r\n if (criteriaDateFilterIndex > -1) {\r\n loadDateFilterAsCriteria($rootScope.loadedSavedReport.ReportDefinition.DateFilters[criteriaDateFilterIndex]);\r\n $rootScope.loadedSavedReport.ReportDefinition.DateFilters.splice(criteriaDateFilterIndex, 1);\r\n }\r\n } else if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.Filters.length > 0) {\r\n const dateRangeFilters = $rootScope.loadedSavedReport.ReportDefinition.Filters.filter(filter => filter.FieldName === dateFieldName);\r\n if (dateRangeFilters.length > 0) {\r\n $rootScope.loadedSavedReport.ReportDefinition.Filters = $rootScope.loadedSavedReport.ReportDefinition.Filters.filter(filter => filter.FieldName !== dateFieldName);\r\n dateRangeFilters.forEach(filter => {\r\n loadDateFilterAsCriteria(filter);\r\n });\r\n }\r\n }\r\n\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.productsDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n }\r\n\r\n function loadDateFilterAsCriteria(DateFilter) {\r\n if (DateFilter.Operator === 'GreaterThanOrEqual' || DateFilter.Operator === 'LessThanOrEqual') {\r\n if (!$rootScope.loadedSavedReport.ReportDefinition.Criteria[0]) {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria = [{\r\n \"CriteriaType\": \"Date\",\r\n \"CriteriaValue\": DateFilter.FieldName,\r\n Filters: []\r\n }];\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria[0].Filters.push(DateFilter);\r\n } else {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria[0].Filters.push(DateFilter);\r\n }\r\n } else {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria = [{\r\n \"CriteriaType\": \"Date\",\r\n \"CriteriaValue\": DateFilter.FieldName,\r\n Filters: []\r\n }];\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria[0].DateFilter = DateFilter;\r\n }\r\n }\r\n\r\n function setupFilters() {\r\n if (!vm.sortsAndFilters) {\r\n vm.sortsAndFilters = {};\r\n }\r\n if (!vm.sortsAndFilters.Filters) {\r\n vm.sortsAndFilters.Filters = [];\r\n }\r\n if (!vm.sortsAndFilters.DateFilter) {\r\n vm.sortsAndFilters.DateFilters = [];\r\n }\r\n\r\n const dateFilters = getDateFilters();\r\n\r\n if (dateFilters) {\r\n vm.sortsAndFilters.Criteria = dateFilters.Criteria;\r\n vm.sortsAndFilters.Filters = vm.sortsAndFilters.Filters.concat(dateFilters.Filters);\r\n $scope.sortsAndFilters.Filters = getUniqueObjects($scope.sortsAndFilters.Filters);\r\n if (dateFilters.RelativeFilter && !dateFilters.Criteria) {\r\n vm.sortsAndFilters.DateFilters.push(dateFilters.RelativeFilter);\r\n } else {\r\n vm.sortsAndFilters.DateFilters = [];\r\n }\r\n }\r\n }\r\n\r\n async function productDropdownChange() {\r\n setColumns();\r\n vm.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType(vm.ObjectId, vm.selectedProduct.Type).ReportID;\r\n await getReportMetadata();\r\n populateCriteriaModel();\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n loadSavedReportCriteria();\r\n }\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n ModifiedDate: { type: \"date\" },\r\n ChangeDate: { type: \"date\" },\r\n TimeStamp: { type: \"date\" },\r\n ModifiedOn: { type: \"date\" },\r\n Date: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: options => {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n const data = {};\r\n\r\n vm.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n setupFilters();\r\n\r\n data['QueryInput'] = vm.sortsAndFilters;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n data['QueryInput'].DateFilters = data['QueryInput'].DateFilters.concat(vm.filterCriteria.dateQuery);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: vm.urlString,\r\n data: data,\r\n params: { 'pagesize': options.data.pageSize, 'page': options.data.page }\r\n }).then(function (response) {\r\n vm.enableGrid = true;\r\n vm.reportId = helperService.getSecurityObjectDetailsFromObjectIdAndProductType(vm.ObjectId, vm.selectedProduct.Type).ReportID;\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n function loadSavedReportCriteria() {\r\n if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.Criteria) {\r\n $rootScope.loadedSavedReport.ReportDefinition.Criteria.forEach(function (criteria) {\r\n if (criteria.DateFilter) {\r\n switch (criteria.DateFilter.DateType) {\r\n case 'Previous':\r\n vm.RelativeDateType = 0;\r\n vm.PeriodType = getPeriodId(criteria.DateFilter.Period);\r\n break;\r\n\r\n case 'ToDate':\r\n vm.RelativeDateType = 1;\r\n vm.PeriodType = getPeriodId(criteria.DateFilter.Period);\r\n break;\r\n\r\n case 'LastNumberOf':\r\n vm.RelativeDateType = 2;\r\n vm.PeriodType = getPeriodId(criteria.DateFilter.Period);\r\n vm.LastNumberOf = criteria.DateFilter.Value;\r\n break;\r\n\r\n }\r\n }\r\n if (criteria.Filters.length > 0) {\r\n criteria.Filters.forEach(function (filter) {\r\n switch (filter.Operator) {\r\n case 'GreaterThanOrEqual':\r\n vm.RelativeDateType = 4;\r\n vm.startDate = new Date(filter.Value);\r\n break;\r\n\r\n case 'LessThanOrEqual':\r\n vm.RelativeDateType = 4;\r\n vm.endDate = new Date(filter.Value);\r\n break;\r\n }\r\n });\r\n }\r\n });\r\n\r\n }\r\n\r\n if ($rootScope.loadedSavedReport && $rootScope.loadedSavedReport.ReportDefinition.DateFilters.length > 0) {\r\n const dateFilter = $rootScope.loadedSavedReport.ReportDefinition.DateFilters[0];\r\n switch (dateFilter.DateType) {\r\n case 'Previous':\r\n vm.RelativeDateType = 0;\r\n vm.PeriodType = getPeriodId(dateFilter.Period);\r\n break;\r\n\r\n case 'ToDate':\r\n vm.RelativeDateType = 1;\r\n vm.PeriodType = getPeriodId(dateFilter.Period);\r\n break;\r\n\r\n case 'LastNumberOf':\r\n vm.RelativeDateType = 2;\r\n vm.PeriodType = getPeriodId(dateFilter.Period);\r\n vm.LastNumberOf = dateFilter.Value;\r\n break;\r\n\r\n }\r\n }\r\n }\r\n\r\n //Start Date picker settings\r\n function thirtyDaysAgo() {\r\n const newDate = new Date();\r\n newDate.setDate(newDate.getDate() - 30);\r\n vm.startDate = newDate;\r\n vm.startDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"StartDate\", vm.startDate);\r\n }\r\n\r\n function disabled(data) {\r\n const date = data.date,\r\n mode = data.mode;\r\n return mode === 'day' && date > vm.endDate;\r\n }\r\n\r\n function openStartDate() {\r\n vm.startDatePopup.opened = true;\r\n }\r\n\r\n //End Date picker settings\r\n function today() {\r\n vm.endDate = new Date();\r\n vm.endDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"EndDate\", vm.endDate);\r\n }\r\n\r\n function openEndDate() {\r\n vm.endDatePopup.opened = true;\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.selectedProduct) {\r\n return;\r\n }\r\n const criteria = [];\r\n\r\n vm.product = vm.selectedProduct.ID;\r\n vm.productType = vm.selectedProduct.Type;\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', vm.selectedProduct.Name, vm.selectedProduct.ID));\r\n\r\n setupFilters();\r\n\r\n vm.urlString = apiUrl + 'api/audittrail/' + vm.productType + '/datachanges';\r\n\r\n vm.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n if (vm.startDate <= vm.endDate) {\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n } else {\r\n helperService.showErrorMessage(\"Start Date must be before or equal to End Date\");\r\n }\r\n }\r\n\r\n function setColumns() {\r\n if (vm.selectedProduct) {\r\n\r\n const rowSettingsTemplate = ``;\r\n\r\n const ticketTemplate = `\r\n \r\n {{ dataItem.TicketProvider }} \r\n {{dataItem.TicketId}}\r\n \r\n \r\n {{ dataItem.TicketProvider }} \r\n {{dataItem.TicketId}}\r\n `;\r\n\r\n vm.mainGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"Date\", title: \"Date\", template: \"{{ dataItem.Date | date:'short'}}\", filterable: customDatePickerNotNullableFilter },\r\n { field: \"Product\", title: \"Product\", filterable: customAutoCompleteFilter },\r\n { field: \"BusinessObject\", title: \"Business Object\", filterable: customAutoCompleteFilter },\r\n { field: \"Report\", title: \"Report\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"EventType\", title: \"Event Type\", filterable: customAutoCompleteFilter },\r\n { field: \"Attribute\", title: \"Attribute\", filterable: customAutoCompleteFilter },\r\n { field: \"OldValue\", title: \"Old Value\", filterable: customAutoCompleteFilter },\r\n { field: \"NewValue\", title: \"New Value\", filterable: customAutoCompleteFilter },\r\n { field: \"UserId\", title: \"User ID\", filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Impersonator\", title: \"Impersonator\", filterable: customAutoCompleteFilter },\r\n { field: \"DataSource\", title: \"Data Source\", filterable: customAutoCompleteFilter }\r\n ];\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n\r\n\r\n setLayout();\r\n }\r\n\r\n function setLayout() {\r\n\r\n let productId;\r\n if (vm.selectedProduct) {\r\n productId = vm.selectedProduct.ID;\r\n }\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, productId);\r\n }\r\n }\r\n\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function onClearFilters() {\r\n vm.gridDataSource.filter({});\r\n }\r\n\r\n //Date picker settings\r\n function setDates() {\r\n const newDate = new Date();\r\n newDate.setDate(newDate.getDate() - $rootScope.UserPreferences.DefaultDaysForAuditTrailReports);\r\n vm.LastNumberOf = $rootScope.UserPreferences.DefaultDaysForAuditTrailReports;\r\n\r\n vm.startDate = newDate;\r\n vm.endDate = new Date();\r\n }\r\n\r\n function getDateFilters() {\r\n let dateCriteria = vm.dateCriteria[0];\r\n dateCriteria.FieldName = \"Date\";\r\n\r\n if (dateCriteria) {\r\n let dateFilters = {\r\n Criteria: null,\r\n Filters: [],\r\n RelativeFilter: null\r\n };\r\n\r\n let startDate = helperService.setDateToBeginningOfDay(vm.startDate);\r\n let endDate = helperService.setDateToEndOfDay(vm.endDate);\r\n\r\n if (vm.RelativeDateType === 4) {\r\n let startDateRow = {\r\n \"FieldName\": dateCriteria.FieldName,\r\n \"Operator\": 'GreaterThanOrEqual',\r\n \"Value\": startDate\r\n };\r\n let endDateRow = {\r\n \"FieldName\": dateCriteria.FieldName,\r\n \"Operator\": 'LessThanOrEqual',\r\n \"Value\": endDate\r\n };\r\n\r\n dateFilters.Filters.push(startDateRow);\r\n dateFilters.Filters.push(endDateRow);\r\n\r\n }\r\n if (vm.RelativeDateType !== 4) {\r\n let relativeDate = {\r\n \"DateType\": vm.RelativeDateType,\r\n \"FieldName\": dateCriteria.FieldName,\r\n \"Period\": vm.PeriodType,\r\n \"Value\": vm.RelativeDateType === 2 ? vm.LastNumberOf : null\r\n };\r\n\r\n dateFilters.RelativeFilter = relativeDate;\r\n }\r\n\r\n return dateFilters;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function getUniqueObjects(arr) {\r\n const seen = new Set();\r\n return arr.filter(obj => {\r\n const strObj = JSON.stringify(obj);\r\n if (seen.has(strObj)) {\r\n return false;\r\n }\r\n seen.add(strObj);\r\n return true;\r\n });\r\n }\r\n\r\n function getPeriodId(name) {\r\n if (name) {\r\n return vm.PeriodTypeDataSource.find(function (type) {\r\n return type.Name === name;\r\n }).Id;\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n function getReportMetadata() {\r\n return reportsDataService.getDataChangesReportMetadata(vm.selectedProduct.Type.toLowerCase())\r\n .then(data => {\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n });\r\n }\r\n // ---\r\n\r\n}","import oracleCloudDataChangesController from \"./oracleCloudDataChanges.controller\";\r\n\r\n/* oracleCloudDataChanges.component.js */\r\n\r\n/**\r\n * @desc component for the Oracle Cloud Data Changes page\r\n * @example \r\n */\r\n\r\nconst oracleCloudDataChanges = {\r\n controller: oracleCloudDataChangesController,\r\n controllerAs: 'ocdcvm',\r\n templateUrl: '/App/Components/DataChangesOracleCloud/oracleCloudDataChanges.html'\r\n};\r\n\r\nexport default oracleCloudDataChanges;","export default /*@ngInject*/ function (snapshotsDataService) {\r\n\r\n const vm = this;\r\n vm.updateSnapshot = updateSnapshot;\r\n\r\n vm.$onInit = getSnapshots;\r\n\r\n async function getSnapshots() {\r\n const response = await snapshotsDataService.getSnapshots('ORFC');\r\n vm.snapshotsDataSource = response.data;\r\n }\r\n\r\n async function updateSnapshot(snapshot) {\r\n\r\n const { Id, Enabled } = snapshot;\r\n const data = { Id, Enabled };\r\n\r\n try {\r\n await snapshotsDataService.updateSnapshot(data);\r\n } catch (err) {\r\n if (snapshot.Enabled) {\r\n snapshot.Enabled = false;\r\n } else {\r\n snapshot.Enabled = true;\r\n }\r\n }\r\n }\r\n}","import maintainSnapshotsController from \"./maintainSnapshots.controller\";\r\n\r\n/* maintainSnapshots.component.js */\r\n\r\n/**\r\n * @desc component for maintaining audit trail snapshots\r\n * @example \r\n */\r\n\r\nconst maintainSnapshots = {\r\n controller: maintainSnapshotsController,\r\n controllerAs: 'msvm',\r\n templateUrl: '/App/Components/AuditTrail/MaintainSnapshots/maintainSnapshots.tmpl.html'\r\n};\r\n\r\nexport default maintainSnapshots;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, $filter, $uibModalInstance, helperService, generatedReportsDataService, authenticationService, usersDataService, dataService) {\r\n\r\n const vm = this;\r\n\r\n vm.productChanged = productChanged;\r\n vm.createGeneratedReport = createGeneratedReport;\r\n vm.deselectSelectedTemplateType = deselectSelectedTemplateType;\r\n vm.dismiss = dismiss;\r\n vm.roles = [];\r\n vm.selectedRoles = [];\r\n vm.selectedCompanies = [];\r\n vm.generatedReport = {};\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getProducts();\r\n await getRoles();\r\n\r\n if (vm.generatedReport.Product.ID !== 'AX7') {\r\n loadTemplates();\r\n }\r\n }\r\n\r\n async function getRoles() {\r\n vm.rolesDropdownLoading = true;\r\n\r\n let { userId } = await authenticationService.getUser(),\r\n { data: coreRoles } = await dataService.getRoles(),\r\n { data: userRoles } = await usersDataService.getRolesByUserId(userId);\r\n\r\n vm.roles = coreRoles;\r\n vm.selectedRoles = coreRoles.filter(coreRole => userRoles.find(userRole => userRole.ID === coreRole.ID) && coreRole.Name !== \"Administrators\");\r\n\r\n vm.rolesDropdownLoading = false;\r\n }\r\n\r\n async function getProducts() {\r\n let response = await $http.get(`${apiUrl}api/core/modules/3000/products`);\r\n\r\n response.data = response.data.filter(el => el.Type === 'GP' || el.Type === 'NAV' || el.Type === 'AX' || el.Type === \"AX5\" || el.Type === \"SL\" || el.Type === 'AX7' || el.IsCustom);\r\n vm.productsDataSource = response.data;\r\n vm.generatedReport.Product = response.data[0];\r\n }\r\n\r\n function productChanged() {\r\n if (vm.generatedReport.Product.ID !== 'AX7') {\r\n vm.showTablesControl = true;\r\n loadTemplates();\r\n } else {\r\n vm.showTablesControl = false;\r\n }\r\n }\r\n\r\n async function loadTemplates() {\r\n vm.templateDropdownIsLoading = true;\r\n vm.showTablesControl = true;\r\n let atUrl = 'audittrail';\r\n if (vm.generatedReport.Product.IsCustom) {\r\n atUrl = 'audittrail/universal';\r\n }\r\n const product = vm.generatedReport.Product.ID.toLowerCase();\r\n try {\r\n let url = `${apiUrl}api/${atUrl}/${product}/tables`;\r\n if (!vm.generatedReport.Product.IsCustom && vm.trackedTables === '1') {\r\n url += '?trackedTables=true';\r\n }\r\n\r\n let response = await $http.get(url);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n const All = { \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(All);\r\n vm.templateTypesDataSource = response.data;\r\n vm.generatedReport.selectedTemplateType = [All];\r\n vm.templateDropdownIsLoading = false;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function createGeneratedReport() {\r\n vm.loading = new createSpinner();\r\n let tableList = new Array;\r\n\r\n if (vm.generatedReport.Product.ID === 'AX7') {\r\n let data = {\r\n Name: vm.generatedReport.Name,\r\n ViewName: vm.generatedReport.ViewName,\r\n Description: vm.generatedReport.Description\r\n }\r\n try {\r\n await generatedReportsDataService.createAx7GeneratedReport(data);\r\n await helperService.successfulSaveButton(vm.loading);\r\n close();\r\n } catch {\r\n vm.disableSubmit = false;\r\n vm.loading.loadingValue = false;\r\n }\r\n } else {\r\n if (vm.generatedReport.selectedTemplateType[vm.generatedReport.selectedTemplateType.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.generatedReport.selectedTemplateType.forEach(template => {\r\n tableList.push(template.Id);\r\n });\r\n }\r\n const postData = {\r\n ProductId: vm.generatedReport.Product.ID,\r\n Name: vm.generatedReport.Name,\r\n Description: vm.generatedReport.Description,\r\n Tables: tableList,\r\n RoleIds: vm.selectedRoles.map(role => role.ID),\r\n AllTrackedTables: vm.trackedTables === '1' ? true: false\r\n };\r\n try {\r\n await generatedReportsDataService.createGeneratedReport(postData);\r\n await helperService.successfulSaveButton(vm.loading);\r\n close();\r\n } catch {\r\n vm.disableSubmit = false;\r\n vm.loading.loadingValue = false;\r\n }\r\n }\r\n }\r\n\r\n function deselectSelectedTemplateType() {\r\n if (vm.generatedReport.selectedTemplateType !== null && vm.generatedReport.selectedTemplateType[vm.generatedReport.selectedTemplateType.length - 1].Id !== 'AllObjectsInMultiSelect') {\r\n vm.generatedReport.selectedTemplateType.forEach((row, i) => {\r\n if (row.Id === 'AllObjectsInMultiSelect') {\r\n vm.generatedReport.selectedTemplateType.splice(i, 1);\r\n }\r\n });\r\n } else {\r\n vm.generatedReport.selectedTemplateType = [{ \"Name\": \"All Tables\", \"Id\": 'AllObjectsInMultiSelect' }];\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}\r\n","import swal from \"sweetalert2\";\r\nimport generatedReportModalController from \"./generatedReportModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, $rootScope, $filter, helperService, generatedReportsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.openNewReportModal = openNewReportModal;\r\n\r\n activate();\r\n\r\n function activate() {\r\n getGeneratedReports();\r\n }\r\n\r\n vm.getGeneratedReports = getGeneratedReports;\r\n vm.deleteReport = deleteReport;\r\n\r\n async function getGeneratedReports() {\r\n vm.loadingGeneratedReports = true;\r\n try {\r\n const res = await generatedReportsDataService.getGeneratedReports();\r\n res.data = $filter('orderBy')(res.data, 'Name');\r\n vm.generatedReports = res.data;\r\n vm.loadingGeneratedReports = false;\r\n } catch {\r\n vm.loadingGeneratedReports = false;\r\n }\r\n }\r\n\r\n async function deleteReport(report) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Report', `Are you sure you want to delete ${report.Name}?`, 'Delete'));\r\n await generatedReportsDataService.deleteReport(report.ReportId);\r\n getGeneratedReports();\r\n $rootScope.$broadcast('navigation-or-security-change');\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openNewReportModal() {\r\n let newReportModal = $uibModal.open({\r\n templateUrl: '/App/Components/ReportGenerator/generatedReportModal.html',\r\n controller: generatedReportModalController,\r\n controllerAs: 'grmvm',\r\n backdrop: 'static'\r\n });\r\n\r\n try {\r\n await newReportModal.result;\r\n getGeneratedReports();\r\n $rootScope.$broadcast('navigation-or-security-change');\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","import generatedReportsController from \"./generatedReports.controller\";\r\n\r\n/* reportGenerator.component.js */\r\n/**\r\n * @desc component for displaying and creating generated reports\r\n * @example \r\n */\r\nconst reportGenerator = {\r\n controller: generatedReportsController,\r\n controllerAs: 'grvm',\r\n templateUrl: '/App/Components/ReportGenerator/generatedReports.html'\r\n};\r\nexport default reportGenerator;","import { standardGridPageSize, customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, objectIdDataService, CustomReportServices, $filter, reportsDataService, reportsService, helperService, snapshotsDataService, dataService) {\r\n\r\n const vm = this;\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.runSavedReport = runSavedReport;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.recordTypeSelectedChanged = recordTypeSelectedChanged;\r\n vm.getRecordType = getRecordType;\r\n vm.onReadGrid = onReadGrid;\r\n vm.onClearFilters = onClearFilters;\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.deleteFilter = deleteFilter;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.open1 = open1;\r\n\r\n async function activate() {\r\n createCurrentSnapshotGrid();\r\n getRecordType();\r\n recordTypeSelectedChanged();\r\n await getObjectId();\r\n today();\r\n\r\n vm.dateCriteria = [\r\n {\r\n \"DataType\": \"DateTime\",\r\n \"FieldName\": \"Date\",\r\n \"IsNullable\": false\r\n }\r\n ];\r\n\r\n vm.dateOptions = {\r\n showWeeks: 'false',\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n minDate: new Date(2000, 5, 22),\r\n startingDay: 1\r\n };\r\n\r\n vm.popup1 = {\r\n opened: false\r\n };\r\n\r\n getReportMetadata().then(_ => {\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n });\r\n }\r\n\r\n activate();\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n async function getObjectId() {\r\n let objectId = await objectIdDataService.getObjectID();\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectId(objectId);\r\n vm.ObjectId = objectId;\r\n vm.reportName = securityObject.Name;\r\n vm.reportId = securityObject.ReportID;\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(vm.ObjectId);\r\n }\r\n async function runSavedReport() {\r\n\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.recordTypeDataSource && vm.recordDataSource && vm.filterCriteria.fields) {\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.recordTypeDataSource && vm.recordDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n }\r\n\r\n function createCurrentSnapshotGrid() {\r\n\r\n vm.mainGridColumns = [\r\n { field: \"RecordId\", title: \"Record Id\", filterable: customAutoCompleteFilter },\r\n { field: \"RecordName\", title: \"Record Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", filterable: customAutoCompleteFilter },\r\n { field: \"Value\", title: \"Value\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n let data = { 'Date': vm.savedDate, 'RecordTypeId': vm.recordType, 'RecordId': vm.record };\r\n vm.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n data['QueryInput'] = vm.sortsAndFilters;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data['QueryInput'].Filters = data['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n let params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n\r\n try {\r\n let response = await snapshotsDataService.updateReportCurrentByDate(data, params);\r\n data = response.data._embedded.reportData;\r\n options.success(response.data);\r\n vm.enableGrid = true; \r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n }\r\n });\r\n\r\n setLayout(); \r\n\r\n }\r\n\r\n\r\n async function getRecordType() {\r\n let response = await snapshotsDataService.getRecordType();\r\n response.data = $filter('filter')(response.data, { Enabled: true });\r\n response.data = $filter('orderBy')(response.data, 'DisplayName');\r\n vm.recordTypeDataSource = response.data;\r\n\r\n vm.selectedRecordType = SavedReportSelectorService.checkSavedReportForRecordType($rootScope.loadedSavedReport, response.data, vm.selectedRecordType);\r\n recordTypeSelectedChanged();\r\n runSavedReport();\r\n }\r\n\r\n async function recordTypeSelectedChanged() {\r\n try {\r\n if (vm.selectedRecordType) {\r\n let response = await snapshotsDataService.getDistinctRecordType(vm.selectedRecordType.Id);\r\n let allRecords = { \"RecordName\": \"All Records\", \"RecordId\": 'AllObjectsInMultiSelect' };\r\n response.data.unshift(allRecords);\r\n\r\n vm.recordDataSource = response.data;\r\n vm.selectedRecord = response.data[0];\r\n\r\n vm.selectedRecord = SavedReportSelectorService.checkSavedReportForRecord($rootScope.loadedSavedReport, response.data, vm.selectedRecord);\r\n populateCriteriaModel();\r\n runSavedReport();\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n\r\n\r\n //Date picker settings\r\n function today() {\r\n vm.dateSelected = new Date();\r\n vm.dateSelected = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"Date\", vm.dateSelected);\r\n }\r\n\r\n function open1() {\r\n vm.popup1.opened = true;\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.dateSelected || vm.selectedRecordType === undefined || vm.selectedRecord === undefined) {\r\n return;\r\n }\r\n\r\n let criteria = [];\r\n\r\n vm.savedDate = vm.dateSelected;\r\n vm.recordType = vm.selectedRecordType.Id;\r\n if (vm.selectedRecord.RecordId === 'AllObjectsInMultiSelect') {\r\n vm.record = null;\r\n } else {\r\n vm.record = vm.selectedRecord.RecordId;\r\n }\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"Date\", 'Date', vm.savedDate, vm.savedDate));\r\n criteria.push(CustomReportServices.CreateCriteria(\"RecordTypeId\", 'RecordType', vm.selectedRecordType.DisplayName, vm.selectedRecordType.Id));\r\n criteria.push(CustomReportServices.CreateCriteria(\"RecordId\", 'Record', vm.selectedRecord.RecordName, vm.selectedRecord.RecordId));\r\n\r\n vm.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function onClearFilters() {\r\n vm.gridDataSource.filter({});\r\n }\r\n\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n }\r\n\r\n function deleteFilter(id) {\r\n CustomReportServices.deleteFilterFilterManager(vm, id);\r\n }\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, null);\r\n }\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function getReportMetadata() {\r\n let response = await reportsDataService.getReportMetadata(vm.reportId);\r\n vm.reportMetadata = response.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = await reportsService.getFields(vm.reportMetadata.Columns);\r\n return vm.reportMetadata;\r\n }\r\n // ---\r\n}","import currentSnapshotController from \"./currentSnapshot.controller\";\r\n\r\n\r\n/* currentSnapshot.component.js */\r\n\r\n/**\r\n * @desc component for Current Snapshot in NetSuite\r\n * @example \r\n */\r\n\r\nconst currentSnapshot = {\r\n controller: currentSnapshotController,\r\n controllerAs: 'csvm',\r\n templateUrl: '/App/Components/CurrentSnapshot/currentSnapshot.tmpl.html'\r\n};\r\n\r\nexport default currentSnapshot;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function (AuditTrailEntityDataService, $filter, $location, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.haveTemplatesChanged = haveTemplatesChanged;\r\n vm.viewDetails = viewDetails;\r\n vm.enableTrackingTemplates = enableTrackingTemplates;\r\n \r\n vm.helperService = helperService;\r\n\r\n vm.updatePending = false;\r\n\r\n vm.mainGridColumns = [\r\n { field: \"IsEnabled\", title: \"Track\", template: \"\", width: 55, filterable: false },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"IsCustom\", template: \"CustomOut of Box\", \"title\": \"Template Type\", filterable: false, width: 100 },\r\n { template: \"\", \"title\": \"Details\", width: 100 }\r\n ];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = true;\r\n vm.mainGridOptions.dataSource = vm.gridDataSource;\r\n vm.mainGridOptions.selectable = false;\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async function (options) {\r\n try {\r\n let response = await AuditTrailEntityDataService.getAllTemplates();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n vm.origTemplates = vm.gridDataSource._data.slice();\r\n vm.origTemplates = vm.origTemplates.filter(template => template.IsEnabled === true);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n function viewDetails(dataItem) {\r\n $location.path('/ChangeTracking/Setup/TrackingTemplateDetails').search({ TemplateId: dataItem.Id });\r\n };\r\n\r\n //Function for Apply button to check if Any of the Templates Track toggle was changed\r\n function haveTemplatesChanged() {\r\n if (vm.origTemplates) {\r\n const newTemplates = vm.gridDataSource._data.filter(template => template.IsEnabled === true);\r\n\r\n return JSON.stringify(vm.origTemplates) === JSON.stringify(newTemplates);\r\n }\r\n }\r\n\r\n async function enableTrackingTemplates() {\r\n try {\r\n await swal(helperService.areYouSureParams('Apply templates to ' + helperService.productNameLookUp('AX7'), 'Are you sure you want to proceed? This will apply the selected templates in to ' + helperService.productNameLookUp('AX7') + '.', 'Apply'));\r\n vm.updatePending = true;\r\n let rows = vm.gridDataSource.data();\r\n //Get all the enabled templates then add them to a list with just their Ids\r\n let selectedTemplateList = rows.filter(function (template) { return template.IsEnabled === true; });\r\n let selectedTemplateIds = [];\r\n\r\n selectedTemplateList.forEach(function (template) {\r\n selectedTemplateIds.push(template.Id);\r\n });\r\n\r\n let postData = {\r\n \"TemplateIds\": selectedTemplateIds,\r\n \"ProductId\": \"AX7\"\r\n };\r\n\r\n //Pass list of Ids to apply template API call\r\n await AuditTrailEntityDataService.applyTemplates(postData);\r\n vm.updatePending = false;\r\n } catch (error) {\r\n vm.updatePending = false;\r\n }\r\n }\r\n\r\n}","import applyTrackingTemplatesController from \"./applyTrackingTemplates.controller\";\r\n\r\n/* applyTrackingTemplates.component.js */\r\n\r\n/**\r\n * @desc component for managing which Audit Trail templates are currently active and applied\r\n * @example \r\n */\r\n\r\nconst applyTrackingTemplates = {\r\n controller: applyTrackingTemplatesController,\r\n controllerAs: 'attvm',\r\n templateUrl: '/App/Components/ApplyTrackingTemplates/applyTrackingTemplates.tmpl.html'\r\n};\r\n\r\nexport default applyTrackingTemplates;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $http, helperService, AuditTrailEntityDataService, isClone, selectedTemplateToClone, selectedTemplate, templateGridDataSource, changeRowSelected, authenticationService) {\r\n\r\n const vm = this;\r\n\r\n vm.template = {};\r\n vm.template.name = '';\r\n vm.selectedTemplateToClone = selectedTemplateToClone;\r\n vm.selectedTemplate = selectedTemplate;\r\n vm.gridDataSource = templateGridDataSource;\r\n vm.isClone = isClone;\r\n vm.cancel = cancel;\r\n vm.addTemplate = addTemplate;\r\n\r\n\r\n\r\n //Create or Clone a Template\r\n function addTemplate(e, templateName, selectedProduct) {\r\n vm.pleaseWait = new createSpinner();\r\n\r\n if (!isClone) {\r\n let input = { Name: templateName, ProductId: 'AX7', IsCustom: true };\r\n\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/template',\r\n data: input\r\n\r\n }).then(async function successCallback(response) {\r\n const currentUser = authenticationService.getUser();\r\n input.Id = response.data;\r\n input.BaseTemplate = 0;\r\n input.CreatedBy = currentUser.fullName;\r\n let date = new Date();\r\n input.CreatedDate = date.toISOString();\r\n\r\n vm.selectedTemplate = input;\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n cancel(response.data);\r\n\r\n }, function errorCallback(response) {\r\n vm.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n } else {\r\n let input = vm.selectedTemplateToClone;\r\n\r\n if (input) {\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/audittrail/template/' + input.Id + '/clone',\r\n data: {\r\n \"TemplateId\": input.Id,\r\n \"Name\": vm.template.name\r\n }\r\n }).then(function successCallback(response) {\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/audittrail/template/' + response.data\r\n }).then(function (response) {\r\n\r\n AuditTrailEntityDataService.mapTemplateHeader(response.data).done(async function (mapTemplateResponse) {\r\n if (mapTemplateResponse) {\r\n vm.selectedTemplate = response.data;\r\n vm.gridDataSource.insert(0, response.data);\r\n changeRowSelected(response.data);\r\n\r\n }\r\n vm.gridDataSource.read();\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n cancel();\r\n });\r\n\r\n }, async function (response) {\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n cancel();\r\n });\r\n\r\n }, function errorCallback(response) {\r\n vm.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n }\r\n }\r\n\r\n function cancel(value) {\r\n $uibModalInstance.close(value);\r\n }\r\n}\r\n\r\n","import { standardGridPageSize, customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, helperService, AuditTrailEntityDataService, selectedTemplate) {\r\n\r\n const vm = this;\r\n vm.numberOfTablesValid = false;\r\n vm.addingTable = false;\r\n vm.selectedTemplate = selectedTemplate;\r\n\r\n vm.validateNumberOfTables = validateNumberOfTables;\r\n vm.addTable = addTable;\r\n vm.cancel = cancel;\r\n\r\n function validateNumberOfTables() {\r\n vm.numberOfTablesValid = false;\r\n\r\n if (vm.selectedTablesDataSource.data().length > 0) {\r\n vm.numberOfTablesValid = true;\r\n }\r\n }\r\n\r\n //Save Template\r\n function addTable(table) {\r\n let newTable = null;\r\n let promises = [];\r\n vm.addingTable = true;\r\n\r\n if (!vm.selectedTemplate.TrackedTableList) {\r\n vm.selectedTemplate.TrackedTableList = [];\r\n }\r\n\r\n AuditTrailEntityDataService.getAXFieldsByTableId(table.Id).then(function (response) {\r\n table.TrackedFields = response.data;\r\n\r\n //Remove just added table from available list\r\n vm.availableTablesDataSource.data().forEach(function (row, i) {\r\n if (row) {\r\n if (row.Id === table.Id) {\r\n vm.availableTablesDataSource.data().splice(i, 1);\r\n }\r\n }\r\n });\r\n\r\n newTable = AuditTrailEntityDataService.convertToTrackedTable(table);\r\n vm.selectedTemplate.TrackedTableList.push(newTable);\r\n vm.addingTable = false;\r\n }, function errorCallback(response) {\r\n vm.addingTable = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n vm.availableTablesGridColumns = [\r\n { field: \"Label\", title: \"Label\", filterable: customAutoCompleteFilter },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20, filterable: { multi: true } }\r\n ];\r\n\r\n vm.availableTablesDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async function (options) {\r\n try {\r\n let response = await AuditTrailEntityDataService.getAllAXTables();\r\n let allTables = response.data;\r\n\r\n if (vm.selectedTemplate.TrackedTableList.length > 0) {\r\n allTables.forEach(function (table) {\r\n if (vm.selectedTemplate.TrackedTableList.some(function (allTable) { return allTable.Id === table.Id; })) {\r\n let index = allTables.findIndex(newTable => newTable.Id === table.Id);\r\n allTables.splice(index, 1);\r\n }\r\n });\r\n }\r\n allTables = $filter('orderBy')(response.data, 'Name');\r\n options.success(allTables);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n vm.availableTablesGridOptions = helperService.setMainGridOptions(null, 300);\r\n vm.availableTablesGridOptions.columns = vm.availableTablesGridColumns;\r\n vm.availableTablesGridOptions.selectable = false;\r\n\r\n vm.selectedTablesGridColumns = [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"Remove\", \"title\": \"Remove\", width: 100 }];\r\n\r\n vm.selectedTablesGridOptions = helperService.setMainGridOptions(null, 300);\r\n vm.selectedTablesGridOptions.columns = vm.selectedTablesGridColumns;\r\n vm.selectedTablesGridOptions.autoBind = true;\r\n vm.selectedTablesGridOptions.selectable = false;\r\n\r\n vm.selectedTablesDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize\r\n });\r\n\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, helperService, errorsDataService, AuditTrailEntityDataService, dataService) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.importTemplates = importTemplates;\r\n\r\n vm.importType = 0;\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n function close() { $uibModalInstance.close(); }\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.productsDataSource = await getProducts();\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n\r\n async function getProducts() {\r\n let response = await dataService.getProducts();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n return response.data;\r\n }\r\n\r\n async function importTemplates(file) {\r\n vm.pendingImport = new createSpinner;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n fd.append(\"ImportType\", vm.importType);\r\n\r\n try {\r\n await AuditTrailEntityDataService.importTemplates(fd);\r\n await helperService.successfulSaveButton(vm.pendingImport);\r\n close();\r\n } catch (error) {\r\n errorsDataService.catch(error);\r\n vm.pendingImport.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n\r\n}","import { standardGridPageSize, customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport addTemplateModalController from \"./addTemplateModal.controller\";\r\nimport newAddTemplateTableModalController from \"./newAddTemplateTableModal.controller\"\r\nimport importTemplatesModalController from \"./importTemplatesModal/importTemplatesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $http, objectIdDataService, AuditTrailEntityDataService, $filter, helperService, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n vm.selectedTemplate = null;\r\n vm.selectedProduct = null;\r\n vm.stopTemplateDetailsSpinner = false;\r\n\r\n vm.atTableActionChanged = atTableActionChanged;\r\n vm.deleteItem = deleteItem;\r\n vm.cloneItem = cloneItem;\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.removeSelectedTable = removeSelectedTable;\r\n vm.atFieldActionChanged = atFieldActionChanged;\r\n vm.checkAll = checkAll;\r\n vm.resetTemplate = resetTemplate;\r\n vm.openAddTemplateModal = openAddTemplateModal;\r\n vm.openAddTableModal = openAddTableModal;\r\n vm.submit = submit;\r\n vm.openImportModal = openImportModal;\r\n vm.exportTemplates = exportTemplates;\r\n\r\n\r\n //Save button is disabled by default\r\n vm.changeDetected = false;\r\n\r\n $scope.$on('ImportAuditTrailTemplates', function (event, data) {\r\n // refresh the Templates grid when import completes\r\n vm.gridDataSource.read();\r\n });\r\n\r\n vm.mainGridColumns = [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"IsCustom\", template: \"CustomOut of Box\", \"title\": \"Template Type\", filterable: false, width: 100 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90 },\r\n { template: `Clone`, \"title\": \"Clone\", width: 90 }];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = true;\r\n vm.mainGridOptions.dataSource = vm.gridDataSource;\r\n\r\n vm.mainGridOptions.dataBound = function (e) {\r\n if (vm.selectedTemplate) {\r\n let data = e.sender._data;\r\n data.forEach(function (dataItem) {\r\n if (vm.selectedTemplate.Id === dataItem.Id) {\r\n $('[data-uid=' + dataItem.uid + ']').addClass('k-state-selected');\r\n }\r\n });\r\n }\r\n };\r\n\r\n function atActionChanged(obj) {\r\n $(obj).toggleClass(\"atactive\");\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n AuditTrailEntityDataService.getAllTemplates().then(function (response) {\r\n vm.mapTemplateResults = null;\r\n\r\n AuditTrailEntityDataService.mapTemplateHeaders(response.data).done(function (mapTemplateResponse) {\r\n if (mapTemplateResponse) {\r\n mapTemplateResponse = $filter('orderBy')(mapTemplateResponse, 'Name');\r\n\r\n options.success(mapTemplateResponse);\r\n }\r\n });\r\n\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n async function deleteItem(id) {\r\n kendo.ui.progress(vm.grid.element, true);\r\n try {\r\n await AuditTrailEntityDataService.deleteTemplate(id);\r\n kendo.ui.progress(vm.grid.element, false);\r\n vm.gridDataSource.read();\r\n } catch (error) {\r\n helperService.showErrorMessage(error.data);\r\n }\r\n vm.selectedTemplate = null;\r\n }\r\n\r\n function cloneItem(dataItem) {\r\n vm.selectedTemplateToClone = dataItem;\r\n openAddTemplateModal(true);\r\n }\r\n\r\n vm.originalTemplateTrackedTables = null;\r\n\r\n async function changeRowSelected(dataItem) {\r\n vm.templateDetailsLoading = true;\r\n\r\n try {\r\n let response = await AuditTrailEntityDataService.mapTemplate(dataItem, true);\r\n vm.selectedTemplate = await response;\r\n\r\n if (vm.selectedTemplate.IsCustom) {\r\n //If it's a custom template copy it to the 'original' placeholder and reset the hasTemplateChanged function\r\n vm.originalTemplateTrackedTables = angular.copy(vm.selectedTemplate.TrackedTableList);\r\n hasTemplatedChanged();\r\n } else {\r\n vm.originalTemplateTrackedTables = null;\r\n }\r\n vm.templateDetailsLoading = false;\r\n } catch {\r\n vm.templateDetailsLoading = false;\r\n }\r\n }\r\n function atTableActionChanged(event, object, type) {\r\n return atActionChanged(event, object, null, type);\r\n }\r\n\r\n function removeSelectedTable(table) {\r\n vm.selectedTemplate.TrackedTableList.forEach(function (row, i) {\r\n if (row.Id === table.Id) {\r\n vm.selectedTemplate.TrackedTableList.splice(i, 1);\r\n }\r\n });\r\n\r\n hasTemplatedChanged();\r\n }\r\n\r\n //Changing a field needs acccess to the containing table to modify the action list\r\n function atFieldActionChanged(event, object, table, type) {\r\n return atActionChanged(event, object, table, type);\r\n }\r\n\r\n function atActionChanged(event, object, table, type) {\r\n if (vm.selectedTemplate.IsCustom === true) {\r\n if (object.Type === 'Table') {\r\n\r\n //All\r\n if (type === 1 && !object.TrackAll) {\r\n object.TrackAll = true;\r\n object.TrackInsert = true;\r\n object.TrackUpdate = true;\r\n object.TrackDelete = true;\r\n }\r\n else if (type === 1 && object.TrackAll === true) {\r\n object.TrackAll = false;\r\n object.TrackInsert = false;\r\n object.TrackUpdate = false;\r\n object.TrackDelete = false;\r\n }\r\n\r\n //Insert\r\n if (type === 2) {\r\n object.TrackInsert = !object.TrackInsert;\r\n }\r\n\r\n //Update\r\n if (type === 3) {\r\n object.TrackUpdate = !object.TrackUpdate;\r\n }\r\n\r\n //Delete\r\n if (type === 4) {\r\n object.TrackDelete = !object.TrackDelete;\r\n }\r\n\r\n if (object.TrackInsert && object.TrackUpdate && object.TrackDelete) {\r\n object.TrackAll = true;\r\n }\r\n else {\r\n object.TrackAll = false;\r\n }\r\n\r\n object.TrackedFields.forEach(function (field) {\r\n\r\n //All\r\n if (type === 1 && !object.TrackAll) {\r\n field.TrackAll = false;\r\n field.TrackInsert = false;\r\n field.TrackUpdate = false;\r\n field.TrackDelete = false;\r\n }\r\n else if (type === 1 && object.TrackAll === true) {\r\n field.TrackAll = true;\r\n field.TrackInsert = true;\r\n field.TrackUpdate = true;\r\n field.TrackDelete = true;\r\n }\r\n\r\n //Insert\r\n if (type === 2) {\r\n field.TrackInsert = object.TrackInsert;\r\n }\r\n\r\n //Update\r\n if (type === 3) {\r\n field.TrackUpdate = object.TrackUpdate;\r\n }\r\n\r\n //Delete\r\n if (type === 4) {\r\n field.TrackDelete = object.TrackDelete;\r\n }\r\n\r\n if (object.TrackInsert && object.TrackUpdate && object.TrackDelete) {\r\n field.TrackAll = true;\r\n }\r\n else {\r\n field.TrackAll = false;\r\n }\r\n\r\n\r\n });\r\n }\r\n\r\n if (object.Type === 'Field') {\r\n //All\r\n if (type === 1 && !object.TrackAll) {\r\n object.TrackAll = true;\r\n object.TrackInsert = true;\r\n object.TrackUpdate = true;\r\n object.TrackDelete = true;\r\n }\r\n else if (type === 1 && object.TrackAll === true) {\r\n object.TrackAll = false;\r\n object.TrackInsert = false;\r\n object.TrackUpdate = false;\r\n object.TrackDelete = false;\r\n }\r\n\r\n //Insert\r\n if (type === 2) {\r\n object.TrackInsert = !object.TrackInsert;\r\n\r\n if (object.TrackInsert === false) {\r\n }\r\n }\r\n\r\n //Update\r\n if (type === 3) {\r\n object.TrackUpdate = !object.TrackUpdate;\r\n\r\n if (object.TrackUpdate === false) {\r\n }\r\n }\r\n\r\n //Delete\r\n if (type === 4) {\r\n object.TrackDelete = !object.TrackDelete;\r\n\r\n if (object.TrackDelete === false) {\r\n }\r\n }\r\n\r\n if (object.TrackInsert && object.TrackUpdate && object.TrackDelete) {\r\n object.TrackAll = true;\r\n }\r\n else {\r\n object.TrackAll = false;\r\n }\r\n\r\n if (table) {\r\n if (table.TrackedFields.every(checkInsert) === true) {\r\n table.TrackInsert = true;\r\n }\r\n else {\r\n table.TrackInsert = false;\r\n }\r\n\r\n if (table.TrackedFields.every(checkUpdate) === true) {\r\n table.TrackUpdate = true;\r\n } else {\r\n table.TrackUpdate = false;\r\n }\r\n\r\n if (table.TrackedFields.every(checkDelete) === true) {\r\n table.TrackDelete = true;\r\n } else {\r\n table.TrackDelete = false;\r\n }\r\n\r\n if (table.TrackInsert === true && table.TrackUpdate === true && table.TrackDelete === true) {\r\n table.TrackAll = true;\r\n } else {\r\n table.TrackAll = false;\r\n }\r\n }\r\n\r\n }\r\n\r\n hasTemplatedChanged();\r\n }\r\n }\r\n\r\n //Check if the tracked fields list match, if they don't enable the save'\r\n function hasTemplatedChanged() {\r\n let isTheSame = true;\r\n let originalTable = null;\r\n let existingTable = null;\r\n\r\n //Check the template to see if any tables have tracked field changes. If a new table has been added it must have at least one tracked field to enable the Save button\r\n for (let i = 0; i < vm.selectedTemplate.TrackedTableList.length; i++) {\r\n if (vm.originalTemplateTrackedTables) {\r\n originalTable = vm.originalTemplateTrackedTables.find(function (orgTable) {\r\n return orgTable.Id === vm.selectedTemplate.TrackedTableList[i].Id;\r\n });\r\n }\r\n if (originalTable) {\r\n isTheSame = angular.equals(originalTable.TrackedFields, vm.selectedTemplate.TrackedTableList[i].TrackedFields);\r\n if (isTheSame === false) {\r\n break;\r\n }\r\n }\r\n else {\r\n let trackedField = false;\r\n for (let j = 0; j < vm.selectedTemplate.TrackedTableList[i].TrackedFields.length; j++) {\r\n if (vm.selectedTemplate.TrackedTableList[i].TrackedFields[j].TrackInsert === true || vm.selectedTemplate.TrackedTableList[i].TrackedFields[j].TrackUpdate === true || vm.selectedTemplate.TrackedTableList[i].TrackedFields[j].TrackDelete === true) {\r\n trackedField = true;\r\n break;\r\n }\r\n }\r\n\r\n if (trackedField === true) {\r\n isTheSame = false;\r\n }\r\n }\r\n }\r\n\r\n //Check if any original tables were deleted from the template\r\n if (vm.originalTemplateTrackedTables) {\r\n for (let i = 0; i < vm.originalTemplateTrackedTables.length; i++) {\r\n existingTable = vm.selectedTemplate.TrackedTableList.find(function (table) {\r\n return table.Id === vm.originalTemplateTrackedTables[i].Id;\r\n });\r\n\r\n if (existingTable === null || existingTable === undefined) {\r\n isTheSame = false;\r\n }\r\n }\r\n }\r\n\r\n vm.changeDetected = !isTheSame;\r\n };\r\n\r\n function checkAll(field) {\r\n return field.TrackInsert === true && field.TrackUpdate === true && field.TrackDelete === true;\r\n }\r\n\r\n function checkInsert(field) {\r\n return field.TrackInsert === true;\r\n }\r\n\r\n function checkUpdate(field) {\r\n return field.TrackUpdate === true;\r\n }\r\n\r\n function checkDelete(field) {\r\n return field.TrackDelete === true;\r\n }\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n vm.ObjectId = objectId;\r\n\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectId(vm.ObjectId);\r\n vm.pageInfo = securityObject;\r\n vm.pageDescription = securityObject.HelpLink;\r\n vm.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n function resetTemplate() {\r\n swal(helperService.areYouSureParams('Reset Template: ' + vm.selectedTemplate.Name, 'Are you sure you want to proceed? This will reset this template to the original settings provided by Fastpath. This cannot be undone.', 'Reset')).then(function () {\r\n ResetTemplate();\r\n }, function (dismiss) {\r\n return;\r\n });\r\n }\r\n\r\n function ResetTemplate() {\r\n if (vm.selectedTemplate) {\r\n AuditTrailEntityDataService.revertTemplate(vm.selectedTemplate.Id).then(function (response) {\r\n\r\n AuditTrailEntityDataService.mapTemplate(vm.selectedTemplate, true).done(function (response) {\r\n vm.selectedTemplate = response;\r\n });\r\n\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n }\r\n\r\n async function openAddTemplateModal(isClone) {\r\n let addTemplateModal = $uibModal.open({\r\n templateUrl: '/App/Components/TemplateTracking/addTemplateModal.tmpl.html',\r\n controller: addTemplateModalController,\r\n controllerAs: 'atmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n isClone: () => isClone,\r\n selectedTemplateToClone: () => vm.selectedTemplateToClone,\r\n selectedTemplate: () => vm.selectedTemplate,\r\n templateGridDataSource: () => vm.gridDataSource,\r\n changeRowSelected: () => vm.changeRowSelected\r\n }\r\n });\r\n\r\n try {\r\n let newTemplateId = await addTemplateModal.result, response = await $http.get(`${apiUrl}api/audittrail/template/${newTemplateId}`), mappedNewTemplate = await AuditTrailEntityDataService.mapTemplateHeader(response.data), grid = $(\"#maintainTemplatesGrid\").data(\"kendoGrid\");\r\n vm.gridDataSource.insert(0, mappedNewTemplate);\r\n changeRowSelected(response.data);\r\n grid.select(\"tr:eq(0)\");\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function openAddTableModal() {\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/TemplateTracking/newAddTemplateTableModal.tmpl.html',\r\n controller: newAddTemplateTableModalController,\r\n controllerAs: 'nattmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n selectedTemplate: () => vm.selectedTemplate\r\n }\r\n });\r\n }\r\n\r\n function submit() {\r\n if (vm.changeDetected) {\r\n let convertedTables = AuditTrailEntityDataService.convertFromTrackedTable(vm.selectedTemplate.Id, vm.selectedTemplate.TrackedTableList);\r\n\r\n //remove all the fields that aren't being tracked\r\n convertedTables.forEach(function (table) {\r\n table.Fields.forEach(function (field, i) {\r\n if (field.TrackInsert === false && field.TrackUpdate === false && field.TrackDelete === false) {\r\n table.Fields.splice(i, 1);\r\n }\r\n });\r\n });\r\n\r\n let allTablesHaveFieldsToTrack = true;\r\n\r\n for (let i = 0; i < convertedTables.length; i++) {\r\n let numberOfValidFields = 0;\r\n\r\n convertedTables[i].Fields.forEach(function (field, i) {\r\n if (field.TrackInsert === true || field.TrackUpdate === true || field.TrackDelete === true) {\r\n numberOfValidFields += 1;\r\n }\r\n });\r\n\r\n if (numberOfValidFields === 0) {\r\n //This table will not be saved because it has no fields to track\r\n allTablesHaveFieldsToTrack = false;\r\n helperService.showErrorMessage(\"One or more of the tables are not tracking anything\");\r\n break;\r\n }\r\n }\r\n\r\n if (allTablesHaveFieldsToTrack === true) {\r\n vm.pleaseWait = new createSpinner();\r\n\r\n AuditTrailEntityDataService.updateTemplateTables(vm.selectedTemplate.Id, convertedTables).then(function (response) {\r\n helperService.successfulSaveButton(vm.pleaseWait);\r\n }, function errorCallback(response) {\r\n vm.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n }\r\n\r\n vm.changeDetected = false;\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function openImportModal() {\r\n let importModal = $uibModal.open({\r\n templateUrl: '/App/Components/TemplateTracking/importTemplatesModal/importTemplatesModal.html',\r\n controller: importTemplatesModalController,\r\n controllerAs: 'itmvm',\r\n backdrop: 'static'\r\n });\r\n\r\n importModal.result\r\n .then(_ => { return; })\r\n .catch(_ => { return; });\r\n }\r\n\r\n function exportTemplates() {\r\n vm.exportUpdatePending = new createSpinner();\r\n\r\n AuditTrailEntityDataService.exportTemplates()\r\n .then(response => {\r\n helperService.successfulSaveButton(vm.exportUpdatePending)\r\n .then(_ => {\r\n const selectedTenant = JSON.parse(localStorage.getItem(\"selectedTenant\"));\r\n FileSaver.saveAs(response.data, `D365FSC Audit Trail Template Export - ${selectedTenant.Name}.xlsx`);\r\n vm.exportUpdatePending.loadingValue = false;\r\n });\r\n }).catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n vm.exportUpdatePending.loadingValue = false;\r\n });\r\n }\r\n}\r\n\r\n","import maintainTemplateController from \"./maintainTemplate.controller\";\r\n\r\n/* mantainTemplate.component.js */\r\n\r\n/**\r\n * @desc component for Maintain Tracking Templates\r\n * @example \r\n */\r\n\r\nconst maintainTemplate = {\r\n controller: maintainTemplateController,\r\n controllerAs: 'mtvm',\r\n templateUrl: '/App/Components/TemplateTracking/maintainTemplate.tmpl.html'\r\n};\r\n\r\nexport default maintainTemplate;","export default /*@ngInject*/ function ($http) {\r\n\r\n const vm = this,\r\n availableProducts = [\"NS\", \"SAP\", \"GP\", \"NAV\", \"AX\", \"AX5\", \"AX7\", \"SL\", \"ORFC\", \"D365Bc\", \"WD\", \"SF\"];\r\n\r\n activate();\r\n\r\n async function activate() {\r\n let { data: products } = await $http.get(apiUrl + '/api/core/modules/' + 3000 + '/products');\r\n\r\n vm.productsDataSource = products.filter(product => product.IsCustom || availableProducts.find(availableProduct => product.Type === availableProduct));\r\n }\r\n}","import manageDataController from \"./manageData.controller\";\r\n\r\n/* manageData.component.js */\r\n\r\n/**\r\n * @desc component for managing audit trail data\r\n * @example \r\n */\r\n\r\nconst manageData = {\r\n controller: manageDataController,\r\n controllerAs: 'mdvm',\r\n templateUrl: '/App/Components/ManageDataV2/manageData.html'\r\n};\r\n\r\nexport default manageData;","export default /*@ngInject*/ function ($scope, AuditTrailEntityDataService, $location, helperService) {\r\n $scope.pageParams = $location.search();\r\n const vm = this;\r\n\r\n vm.stopTemplateDetailsSpinner = false;\r\n\r\n function activate() {\r\n getTemplate();\r\n }\r\n\r\n activate();\r\n\r\n async function getTemplate() {\r\n try {\r\n let response = await AuditTrailEntityDataService.getTemplate($scope.pageParams.TemplateId);\r\n response = await AuditTrailEntityDataService.mapTemplate(response.data, false);\r\n vm.stopTemplateDetailsSpinner = true;\r\n vm.selectedEntity = response;\r\n $scope.$evalAsync();\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n\r\n }\r\n}","import templateDetailsController from \"./templateDetails.controller\";\r\n\r\n\r\n/* templateDetails.component.js */\r\n\r\n/**\r\n * @desc component for Template Tracking Details\r\n * @example \r\n */\r\n\r\nconst templateDetails = {\r\n controller: templateDetailsController,\r\n controllerAs: 'tdvm',\r\n templateUrl: '/App/Components/TemplateTracking/TemplateTrackingDetails/templateDetails.tmpl.html'\r\n};\r\n\r\nexport default templateDetails;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function (helperService, workdayMaintainTemplatesDataService, $filter, $uibModalInstance, template, isClone) {\r\n\r\n const vm = this;\r\n\r\n vm.template = { ...template };\r\n vm.isClone = isClone;\r\n\r\n vm.updateSelectedClassIds = updateSelectedClassIds;\r\n vm.saveTemplate = saveTemplate;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n vm.modalTitle = template?.Id && !isClone ? 'Edit' : template?.Id && isClone ? 'Clone' : 'Create';\r\n\r\n if (isClone) {\r\n setupCloneTemplateGrid();\r\n }\r\n\r\n if (!template?.Id || isClone) {\r\n vm.template.IsEnabled = true;\r\n }\r\n }\r\n\r\n async function setupCloneTemplateGrid() {\r\n let classesGridOptions = [\r\n { template: \"\", width: 55, filterable: false },\r\n { field: \"ClassName\", title: \"Class Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.cloneTemplateClassesGridOptions = helperService.setNonPageableGridOptions(classesGridOptions, 300);\r\n vm.cloneTemplateClassesGridOptions.noRecords = {\r\n template: \"No Classes exist for this template
\"\r\n };\r\n\r\n let { data } = await workdayMaintainTemplatesDataService.getSelectedClasses(vm.template.Id);\r\n\r\n vm.templateClasses = $filter('orderBy')(data, 'ClassName');\r\n\r\n vm.templateClasses = vm.templateClasses?.map(templateClass => {\r\n templateClass.isSelected = true;\r\n\r\n return templateClass;\r\n });\r\n\r\n vm.cloneTemplateClassesGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n options.success(vm.templateClasses);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function updateSelectedClassIds(selectedClass) {\r\n vm.templateClasses = vm.templateClasses.map(existingClass => {\r\n if (existingClass.ClassId === selectedClass.ClassId) {\r\n existingClass.isSelected = selectedClass.isSelected;\r\n }\r\n\r\n return existingClass;\r\n });\r\n }\r\n\r\n function saveTemplate() {\r\n vm.pleaseWait = new createSpinner();\r\n switch (vm.modalTitle) {\r\n case 'Create':\r\n createTemplate();\r\n break;\r\n case 'Edit':\r\n editTemplate();\r\n break;\r\n case 'Clone':\r\n cloneTemplate();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function createTemplate() {\r\n try {\r\n const postData = {\r\n Name: vm.template.Name,\r\n IsEnabled: vm.template.IsEnabled,\r\n ProductId: 'WD'\r\n }, { data } = await workdayMaintainTemplatesDataService.createTemplate(postData);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n close(data);\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n }\r\n\r\n async function editTemplate() {\r\n try {\r\n const putData = {\r\n Id: vm.template.Id,\r\n Name: vm.template.Name,\r\n IsEnabled: vm.template.IsEnabled\r\n }\r\n await workdayMaintainTemplatesDataService.updateTemplate(putData);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n close();\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n }\r\n\r\n async function cloneTemplate() {\r\n try {\r\n let selectedTemplateClasses = vm.templateClasses.filter(selectedClass => selectedClass.isSelected);\r\n const selectedClassIds = selectedTemplateClasses.map(selectedTemplateClass => selectedTemplateClass.ClassId),\r\n postData = {\r\n \"Name\": vm.template.Name,\r\n \"Active\": vm.template.IsEnabled,\r\n \"ClonedTemplateId\": vm.template.Id,\r\n \"ClassIds\": selectedClassIds\r\n }, { data } = await workdayMaintainTemplatesDataService.cloneTemplate(postData);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n close(data);\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n }\r\n\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n function close(id) { $uibModalInstance.close(id); }\r\n}","import swal from \"sweetalert2\";\r\nimport addEditTemplatesModalController from \"./addEditTemplatesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, helperService, workdayMaintainTemplatesDataService, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.openAddEditTemplateModal = openAddEditTemplateModal;\r\n vm.selectedTemplateChanged = selectedTemplateChanged;\r\n\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await setTemplates();\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Clone',\r\n click: item => {\r\n openAddEditTemplateModal(item.template, true);\r\n }\r\n },\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n openAddEditTemplateModal(item.template, false);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n deleteTemplate(item.template);\r\n },\r\n displayed: item => {\r\n return item.template.IsCustom;\r\n }\r\n }\r\n ];\r\n }\r\n\r\n async function setTemplates(newTemplateId, template, isClone) {\r\n vm.templatesLoading = true;\r\n const { data } = await workdayMaintainTemplatesDataService.getTemplates();\r\n vm.templates = $filter('orderBy')(data, 'Name');\r\n if (newTemplateId && (!template?.Id || isClone)) {\r\n vm.templates.sort((a, b) => a.Id === newTemplateId ? -1 : b.Id === newTemplateId ? 1 : 0);\r\n }\r\n vm.templatesLoading = false;\r\n }\r\n\r\n async function openAddEditTemplateModal(template, isClone) {\r\n let templateModal = $uibModal.open({\r\n templateUrl: '/App/Components/workdayMaintainTemplates/templatesList/addEditTemplatesModal.tmpl.html',\r\n controller: addEditTemplatesModalController,\r\n controllerAs: 'tmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n template: () => template,\r\n isClone: () => isClone\r\n }\r\n });\r\n\r\n try {\r\n let newTemplateId = await templateModal.result;\r\n await setTemplates(newTemplateId, template, isClone);\r\n if (newTemplateId) {\r\n selectedTemplateChanged(vm.templates.find(template => template.Id === newTemplateId));\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function selectedTemplateChanged(template) {\r\n vm.selectedTemplate = template;\r\n vm.onSelectedTemplateChanged({ template });\r\n }\r\n\r\n async function deleteTemplate(template) {\r\n await swal(helperService.areYouSureParamsWithHTML('Delete Template', `Are you sure you want to delete template ${template.Name}?
`, 'Delete'));\r\n await workdayMaintainTemplatesDataService.deleteTemplate(template.Id);\r\n selectedTemplateChanged(null);\r\n setTemplates();\r\n }\r\n}","/* templatesList.component.js */\r\n\r\nimport templatesListController from \"./templatesList.controller\";\r\n\r\n/**\r\n * @desc component for displaying, creating and editing Templates List\r\n * @example \r\n */\r\n\r\nconst templatesList = {\r\n controller: templatesListController,\r\n controllerAs: 'tlvm',\r\n templateUrl: '/App/Components/workdayMaintainTemplates/templatesList/templatesList.tmpl.html',\r\n bindings: {\r\n onSelectedTemplateChanged: '&'\r\n }\r\n};\r\n\r\nexport default templatesList;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, helperService, existingClasses, workdayMaintainTemplatesDataService, manageDataDataService, selectedTemplate) {\r\n\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.addClassToSelectedTemplate = addClassToSelectedTemplate;\r\n vm.collectMetadata = collectMetadata;\r\n vm.selectedTemplate = selectedTemplate;\r\n\r\n activate();\r\n\r\n $scope.$on('CollectDataChanges', (event, args) => vm.classesGridDataSource.read());\r\n\r\n function activate() {\r\n vm.metadataCollectionRequired = false;\r\n createObjectsGrid();\r\n }\r\n\r\n\r\n function createObjectsGrid() {\r\n const classesGridColumns = [\r\n { field: \"Class\", title: \"Class\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessObject\", title: \"Business Object\", width: 120, filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.classesGridOptions = helperService.setMainGridOptions(classesGridColumns, null);\r\n vm.classesGridOptions.selectable = false;\r\n\r\n vm.classesGridDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n noRecords: {\r\n template: \"No items to display
\"\r\n },\r\n transport: {\r\n read: async options => {\r\n let sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n if (sortsAndFilters.Filters.length) {\r\n if (sortsAndFilters.Filters[0].FieldName === 'Class') {\r\n sortsAndFilters.Filters[0].FieldName = 'Name';\r\n } else {\r\n sortsAndFilters.Filters[0].FieldName = 'BusinessObjectName';\r\n }\r\n }\r\n\r\n if (sortsAndFilters.Sorts.length) {\r\n if (sortsAndFilters.Sorts[0].FieldName === 'Class') {\r\n sortsAndFilters.Sorts[0].FieldName = 'Name'\r\n } else {\r\n sortsAndFilters.Sorts[0].FieldName = 'BusinessObjectName'\r\n }\r\n }\r\n\r\n const postData = sortsAndFilters,\r\n params = { 'pagesize': options.data.pageSize, 'page': options.data.page },\r\n { data } = await workdayMaintainTemplatesDataService.getAllClasses(postData, params);\r\n\r\n if (!data.TotalItems && !sortsAndFilters.Filters.length) {\r\n vm.metadataCollectionRequired = true;\r\n } else {\r\n vm.metadataCollectionRequired = false;\r\n vm.collectMetadataPending = false;\r\n\r\n data._embedded.reportData = data._embedded.reportData.filter(dataItem => !existingClasses.find(existingClass => dataItem.Id === existingClass.ClassId));\r\n\r\n // If all classes on page are selected, load the next page\r\n if (!data._embedded.reportData.length && data.TotalItems && !sortsAndFilters.Filters.length) {\r\n vm.classesGridDataSource.page(data.PageNumber + 1);\r\n }\r\n }\r\n\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function addClassToSelectedTemplate(item) {\r\n vm.addingClass = true;\r\n\r\n const data = {\r\n TemplateId: vm.selectedTemplate.Id,\r\n ClassId: item.Id\r\n };\r\n\r\n try {\r\n await workdayMaintainTemplatesDataService.addClassToTemplate(data);\r\n existingClasses.push({ ClassName: item.Class, ClassId: item.Id });\r\n vm.classesGridDataSource.read();\r\n vm.addingClass = false;\r\n } catch {\r\n vm.addingClass = false;\r\n }\r\n\r\n }\r\n\r\n async function collectMetadata() { \r\n const data = {\r\n ImportType: \"AuditTrailImport_WorkdayMetadata\",\r\n ProductId: \"WD\"\r\n };\r\n\r\n try {\r\n vm.collectMetadataPending = true;\r\n await manageDataDataService.dataActionCall('collect', data);\r\n } catch {\r\n vm.collectMetadataPending = false;\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n}","import addClassesModalController from \"./addClassesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, workdayMaintainTemplatesDataService, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.deleteClass = deleteClass;\r\n\r\n vm.$onChanges = activate;\r\n\r\n vm.openAddClassesModal = openAddClassesModal;\r\n\r\n async function activate() {\r\n await setClasses();\r\n }\r\n\r\n async function setClasses() {\r\n vm.classesLoading = true;\r\n const { data } = await workdayMaintainTemplatesDataService.getSelectedClasses(vm.selectedTemplate.Id);\r\n vm.classes = $filter('orderBy')(data, 'ClassName')\r\n vm.classesLoading = false;\r\n }\r\n\r\n async function deleteClass(templateClassId) {\r\n vm.deleting = true;\r\n await workdayMaintainTemplatesDataService.deleteClass(templateClassId);\r\n setClasses();\r\n vm.deleting = false;\r\n }\r\n\r\n async function openAddClassesModal() {\r\n let classModal = $uibModal.open({\r\n templateUrl: '/App/Components/workdayMaintainTemplates/classesList/addClassesModal.tmpl.html',\r\n controller: addClassesModalController,\r\n controllerAs: 'acmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n selectedTemplate: () => vm.selectedTemplate,\r\n existingClasses: () => vm.classes\r\n }\r\n });\r\n\r\n try {\r\n await classModal.result;\r\n setClasses();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","/* classesList.component.js */\r\n\r\nimport classesListController from \"./classesList.controller\";\r\n\r\n/**\r\n * @desc component for displaying and creating Classes assigned to Workday Templates\r\n * @example \r\n */\r\n\r\nconst classesList = {\r\n controller: classesListController,\r\n controllerAs: 'clvm',\r\n templateUrl: '/App/Components/workdayMaintainTemplates/classesList/classesList.tmpl.html',\r\n bindings: {\r\n selectedTemplate: '<'\r\n }\r\n};\r\n\r\nexport default classesList;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, salesforceAtDataService, helperService) {\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.importObjects = importObjects;\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n async function importObjects(file) {\r\n vm.pendingImport = new createSpinner();\r\n\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n\r\n try {\r\n await salesforceAtDataService.importObjectData(fd);\r\n await helperService.successfulSaveButton(vm.pendingImport);\r\n cancel();\r\n } catch {\r\n vm.pendingImport.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, customYesNoBooleanFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\nimport importObjectModalController from \"./importObjectModal.controller.js\";\r\n\r\nexport default /*@ngInject*/ function ( $filter, helperService, $uibModal, salesforceAtDataService, FileSaver, $scope) {\r\n const vm = this;\r\n vm.importMetadata = importMetadata;\r\n vm.saveObjectChange = saveObjectChange;\r\n vm.exportData = exportData;\r\n vm.importData = importData;\r\n vm.$onInit = activate;\r\n\r\n $scope.$on('ImportAuditTrailTrackingObjects', (event, args) => vm.mainGridDataSource.read());\r\n \r\n\r\n function activate() {\r\n setupObjectTrackingGrid();\r\n }\r\n\r\n function setupObjectTrackingGrid() {\r\n const trackingTemplate = ``;\r\n\r\n const mainGridColumns = [\r\n { field: \"Enabled\", title: \"Track\", width: 50, filterable: customYesNoBooleanFilter, template: trackingTemplate },\r\n { field: \"Name\", title: \"Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Label\", title: \"Label\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectType\", title: \"Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", width: 250, filterable: customAutoCompleteFilter },\r\n ];\r\n vm.mainGridOptions = helperService.setMainGridOptions(mainGridColumns, 600);\r\n vm.mainGridOptions.selectable = false;\r\n\r\n vm.mainGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Enabled: { type: \"boolean\" },\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async function (options) {\r\n try {\r\n let { data } = await salesforceAtDataService.getObjectsToTrack();\r\n data = $filter('orderBy')(data, 'Name'); \r\n vm.totalObjects = data;\r\n options.success(data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function importMetadata() {\r\n vm.importMetadataPending = true;\r\n await salesforceAtDataService.importObjectTrackingMetadata();\r\n vm.mainGridDataSource.read();\r\n vm.importMetadataPending = false;\r\n }\r\n\r\n async function saveObjectChange(dataItem) {\r\n await salesforceAtDataService.saveObjectDataChanges(dataItem);\r\n helperService.setConfigurationValue('SF_AT_LastTrackingFieldUpdateDate', new Date());\r\n }\r\n\r\n function exportData() {\r\n vm.exportPending = true;\r\n\r\n salesforceAtDataService.exportObjectData()\r\n .then(response => {\r\n FileSaver.saveAs(response.data, 'ObjectTrackingData.xlsx');\r\n vm.exportPending = false;\r\n }).catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n vm.exportPending = false;\r\n });\r\n }\r\n\r\n async function importData() {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/salesForceAuditTrail/maintainObjectTracking/maintainObjectTrackingGrid/importObjectModal.html',\r\n controller: importObjectModalController,\r\n controllerAs: 'iomvm',\r\n backdrop: 'static',\r\n });\r\n }\r\n}","/* maintainObjectTrackingGrid.component.js */\r\n\r\nimport maintainObjectTrackingGridController from \"./maintainObjectTrackingGrid.controller\";\r\n\r\n/**\r\n * @desc component to enable/disable tracking of objects\r\n * @example \r\n */\r\n\r\nconst maintainObjectTrackingGrid = {\r\n controller: maintainObjectTrackingGridController,\r\n controllerAs: 'motgvm',\r\n templateUrl: '/App/Components/salesForceAuditTrail/maintainObjectTracking/maintainObjectTrackingGrid/maintainObjectTrackingGrid.tmpl.html'\r\n};\r\n\r\nexport default maintainObjectTrackingGrid; ","import { customAutoCompleteFilter, customDatePickerFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\n\r\nexport default /*@ngInject*/ function (helperService, objectIdDataService, CustomReportServices, reportsDataService, $filter, reportsService, dataService, $rootScope) {\r\n const vm = this;\r\n const supportedProducts = [\"SF\"];\r\n const isDateRangeFilter = 4;\r\n const dateTypeLast = 2;\r\n const dateTypes = [\"Previous\", \"ToDate\", \"LastNumberOf\"];\r\n const periodNames = ['Day', 'Week', 'Month', 'Quarter', 'Year'];\r\n\r\n vm.relativeDateType = 2;\r\n vm.periodType = 0;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.clearCriteriaModel = clearCriteriaModel;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.setFilterValues = setFilterValues;\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.onClearFilters = onClearFilters;\r\n vm.onReadGrid = onReadGrid;\r\n vm.reportDetailsModel = [];\r\n vm.openStartDate = openStartDate;\r\n vm.openEndDate = openEndDate;\r\n vm.startDatePopupOpened = false;\r\n vm.endDatePopupOpened = false;\r\n vm.enableGrid = false;\r\n\r\n\r\n\r\n const rowSettingsTemplate = ``;\r\n\r\n var ticketTemplate = `{{ dataItem.TicketProvider }} {{dataItem.TicketId}}\r\n {{ dataItem.TicketProvider }} {{dataItem.TicketId}}`;\r\n\r\n vm.mainGridColumns = [{ title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false }];\r\n\r\n vm.dateCriteria = [\r\n {\r\n \"DataType\": \"DateTime\",\r\n \"FieldName\": \"Date\",\r\n \"IsNullable\": false\r\n }\r\n ];\r\n\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n vm.filterCriteria.dateQuery = [];\r\n // ---\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getObjectId()\r\n getProducts();\r\n vm.enableSetupTracking = helperService.getConfigurationValue('SF_AT_EnableSetupTracking');\r\n vm.relativeDateTypeDataSource = CustomReportServices.getRelativeDateTypes();\r\n vm.periodTypeDataSource = CustomReportServices.getPeriodTypes();\r\n setupDatePickers();\r\n setDates();\r\n await setReportMetadata();\r\n vm.mainGridOptions = helperService.setMainGridOptions(vm.mainGridColumns, 600);\r\n if ($rootScope.loadedSavedReport) {\r\n vm.loadedSavedReport = $rootScope.loadedSavedReport;\r\n loadSavedReport();\r\n }\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n\r\n async function getObjectId() {\r\n let objectId = await objectIdDataService.getObjectID();\r\n // Needed for report toolbar controller functions\r\n vm.ObjectId = objectId;\r\n }\r\n\r\n function loadSavedReport() {\r\n vm.filterInfo = vm.loadedSavedReport.ReportDefinition;\r\n if (vm.filterInfo.DateFilters.length) {\r\n vm.relativeDateType = dateTypes.indexOf(vm.filterInfo.DateFilters[0].DateType);\r\n vm.periodType = periodNames.indexOf(vm.filterInfo.DateFilters[0].Period);\r\n vm.lastNumberOf = vm.filterInfo.DateFilters[0].Value ?? null;\r\n\r\n } else {\r\n vm.relativeDateType = isDateRangeFilter; // 4\r\n const startDateObject = vm.filterInfo.Filters.find(filter => filter.Operator === \"GreaterThanOrEqual\");\r\n vm.startDate = new Date(startDateObject.Value).getTime();\r\n const endDateObject = vm.filterInfo.Filters.find(filter => filter.Operator === \"LessThanOrEqual\");\r\n vm.endDate = new Date(endDateObject.Value).getTime();\r\n\r\n }\r\n\r\n vm.filterCriteria.query = vm.filterInfo.Filters.filter(filter => filter.FieldName !== \"CreatedDate\");\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n\r\n generateGridWithSelectedValues();\r\n }\r\n\r\n function loadDateFilterAsCriteria(DateFilter) {\r\n if (DateFilter.Operator === 'GreaterThanOrEqual' || DateFilter.Operator === 'LessThanOrEqual') {\r\n if (!vm.loadedSavedReport.ReportDefinition.Criteria[0]) {\r\n vm.loadedSavedReport.ReportDefinition.Criteria = [{\r\n \"CriteriaType\": \"Date\",\r\n \"CriteriaValue\": DateFilter.FieldName,\r\n Filters: []\r\n }];\r\n vm.loadedSavedReport.ReportDefinition.Criteria[0].Filters.push(DateFilter);\r\n } else {\r\n vm.loadedSavedReport.ReportDefinition.Criteria[0].Filters.push(DateFilter);\r\n }\r\n } else {\r\n vm.filterInfo.Criteria = [{\r\n \"CriteriaType\": \"Date\",\r\n \"CriteriaValue\": DateFilter.FieldName,\r\n Filters: []\r\n }];\r\n vm.filterInfo.DateFilters = [DateFilter];\r\n }\r\n }\r\n\r\n async function getProducts() {\r\n let { data: products } = await dataService.getProducts();\r\n const productDataSource = products.filter(product => supportedProducts.find(supportedProduct => supportedProduct === product.Type));\r\n vm.selectedProduct = productDataSource.find(product => product.Type === \"SF\");\r\n }\r\n\r\n function setFilterValues() {\r\n vm.loadedSavedReport = null;\r\n vm.dateFilter = [];\r\n if (vm.startDate <= vm.endDate) {\r\n\r\n if (vm.relativeDateType !== isDateRangeFilter) {\r\n vm.periodName = periodNames.find((type, index) => index === vm.periodType);\r\n vm.dateType = dateTypes.find((type, index) => index === vm.relativeDateType);\r\n\r\n vm.dateFilter = [\r\n {\r\n \"DateType\": vm.dateType,\r\n \"FieldName\": vm.fieldName,\r\n \"Period\": vm.periodName,\r\n \"Value\": vm.relativeDateType === dateTypeLast ? vm.lastNumberOf : null\r\n }\r\n ]\r\n }\r\n\r\n if (vm.relativeDateType === isDateRangeFilter) {\r\n vm.startDateRow = {\r\n \"FieldName\": vm.fieldName,\r\n \"Operator\": 'GreaterThanOrEqual',\r\n \"Value\": helperService.setDateToBeginningOfDay(vm.startDate)\r\n };\r\n\r\n vm.endDateRow = {\r\n \"FieldName\": vm.fieldName,\r\n \"Operator\": 'LessThanOrEqual',\r\n \"Value\": helperService.setDateToEndOfDay(vm.endDate)\r\n };\r\n }\r\n generateGridWithSelectedValues();\r\n\r\n } else {\r\n helperService.showErrorMessage(\"Start Date must be before or equal to End Date\");\r\n }\r\n }\r\n\r\n function generateGridWithSelectedValues() {\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let filterData = {};\r\n if (!vm.loadedSavedReport) {\r\n vm.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n setupFilters();\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n vm.sortsAndFilters.Filters = vm.sortsAndFilters.Filters.concat(vm.filterCriteria.query);\r\n vm.sortsAndFilters.DateFilters = vm.sortsAndFilters.DateFilters.concat(vm.filterCriteria.dateQuery);\r\n }\r\n // ---\r\n\r\n if (vm.relativeDateType === isDateRangeFilter) {\r\n vm.sortsAndFilters.Filters = vm.sortsAndFilters.Filters.concat(vm.startDateRow);\r\n vm.sortsAndFilters.Filters = vm.sortsAndFilters.Filters.concat(vm.endDateRow);\r\n } else {\r\n vm.sortsAndFilters.DateFilters = vm.sortsAndFilters.DateFilters.concat(vm.dateFilter);\r\n }\r\n \r\n filterData = {\r\n \"QueryInput\": {\r\n \"DateFilters\": vm.sortsAndFilters.DateFilters,\r\n \"Filters\": vm.sortsAndFilters.Filters,\r\n \"Sorts\": vm.sortsAndFilters.Sorts\r\n }\r\n };\r\n vm.sortsAndFilters = filterData.QueryInput;\r\n } else {\r\n filterData = {\r\n \"QueryInput\": {\r\n \"DateFilters\": vm.filterInfo.DateFilters,\r\n \"Filters\": vm.filterInfo.Filters,\r\n \"Sorts\": vm.filterInfo.Sortings\r\n }\r\n }\r\n }\r\n const { data } = await reportsDataService.getSetupData(filterData, { 'pagesize': options.data.pageSize, 'page': options.data.page });\r\n options.success(data);\r\n vm.enableGrid = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function clearCriteriaModel() {\r\n var newDate = new Date();\r\n vm.startDate = newDate.setDate(newDate.getDate() - 30);\r\n vm.endDate = new Date();\r\n vm.lastNumberOf = \"\";\r\n }\r\n\r\n async function setReportMetadata() {\r\n const { data: reportMetadata } = await reportsDataService.getSetupMetadata();\r\n vm.reportMetadata = reportMetadata._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n setupColumns(vm.reportMetadata.Columns);\r\n vm.fieldName = vm.reportMetadata.Columns.find(c => c.DataType === \"DateTime\").FieldName;\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, null);\r\n }\r\n }\r\n\r\n function setupColumns(columns) {\r\n let columnDef = {};\r\n columns.forEach(column => {\r\n columnDef = {\r\n field: column.FieldName, title: column.DisplayName, filterable: customAutoCompleteFilter\r\n }\r\n if (column.DataType === \"DateTime\") {\r\n columnDef.filterable = customDatePickerFilter;\r\n columnDef.template = `{{dataItem.${column.FieldName} | date: 'short'}}`\r\n }\r\n vm.mainGridColumns.push(columnDef);\r\n });\r\n }\r\n\r\n function setupDatePickers() {\r\n\r\n var newDate = new Date();\r\n vm.startDate = newDate.setDate(newDate.getDate() - 30);\r\n\r\n vm.startDateOptions = {\r\n dateDisabled: disabled,\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n vm.endDate = new Date();\r\n vm.endDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n startingDay: 1\r\n };\r\n\r\n }\r\n\r\n function setDates() {\r\n let newDate = new Date();\r\n newDate.setDate(newDate.getDate() - $rootScope.UserPreferences.DefaultDaysForAuditTrailReports);\r\n vm.lastNumberOf = $rootScope.UserPreferences.DefaultDaysForAuditTrailReports;\r\n\r\n vm.startDate = newDate;\r\n vm.endDate = new Date();\r\n }\r\n\r\n function openStartDate() {\r\n vm.startDatePopupOpened = true;\r\n }\r\n\r\n function openEndDate() {\r\n vm.endDatePopupOpened = true;\r\n }\r\n\r\n function disabled(data) {\r\n return data.mode === 'day' && data.date > vm.endDate;\r\n }\r\n\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter?.Filters?.length) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(\"\", selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function onClearFilters() {\r\n vm.gridDataSource.filter({});\r\n onReadGrid();\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function populateCriteriaModel() {\r\n var criteria = [];\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"ProductId\", 'Product', vm.selectedProduct.Name, vm.selectedProduct.ID));\r\n\r\n setupFilters();\r\n\r\n vm.reportDetailsModel = criteria;\r\n\r\n var dateCriteria = vm.dateCriteria[0];\r\n dateCriteria.FieldName = \"CreatedDate\";\r\n\r\n if (dateCriteria) {\r\n var dateTimeFieldName = dateCriteria.FieldName,\r\n criteria = { CriteriaType: 'Date', CriteriaValue: dateTimeFieldName, Filters: [], DateFilter: null },\r\n filterObject = {\r\n Criteria: {},\r\n Filters: [],\r\n RelativeFilter: null\r\n },\r\n relativeDate = {\r\n \"DateType\": vm.dateType,\r\n \"FieldName\": dateTimeFieldName,\r\n \"Period\": vm.periodName,\r\n \"Value\": vm.relativeDateType === dateTypeLast ? vm.lastNumberOf : null\r\n },\r\n startDate = helperService.setDateToBeginningOfDay(vm.startDate),\r\n endDate = helperService.setDateToEndOfDay(vm.endDate);\r\n\r\n let endDateRow, startDateRow;\r\n\r\n if (vm.relativeDateType === isDateRangeFilter) {\r\n startDateRow = {\r\n \"FieldName\": dateTimeFieldName,\r\n \"Operator\": 'GreaterThanOrEqual',\r\n \"Value\": startDate\r\n };\r\n endDateRow = {\r\n \"FieldName\": dateTimeFieldName,\r\n \"Operator\": 'LessThanOrEqual',\r\n \"Value\": endDate\r\n };\r\n\r\n criteria.Filters.push(startDateRow);\r\n criteria.Filters.push(endDateRow);\r\n\r\n filterObject.Criteria = criteria;\r\n\r\n }\r\n if (vm.relativeDateType !== isDateRangeFilter) {\r\n filterObject.RelativeFilter = relativeDate;\r\n criteria.DateFilter = relativeDate;\r\n filterObject.Criteria = criteria;\r\n }\r\n }\r\n\r\n if (filterObject?.Filters?.length) {\r\n vm.sortsAndFilters.Filters = vm.sortsAndFilters.Filters.concat(filterObject.Filters);\r\n }\r\n if (filterObject.RelativeFilter) {\r\n vm.sortsAndFilters.DateFilters.push(filterObject.RelativeFilter);\r\n }\r\n vm.reportDetailsModel.DateFilters = vm.sortsAndFilters.DateFilters;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function setupFilters() {\r\n if (!vm.sortsAndFilters) {\r\n vm.sortsAndFilters = {};\r\n }\r\n if (!vm.sortsAndFilters.Filters) {\r\n vm.sortsAndFilters.Filters = [];\r\n }\r\n if (!vm.sortsAndFilters.DateFilter) {\r\n vm.sortsAndFilters.DateFilters = [];\r\n }\r\n }\r\n}","import setupChangesController from \"./setupChanges.controller\";\r\n\r\n/* setupChanges.component.js */\r\n\r\n\r\n/**\r\n * @desc component for setup changes report\r\n * @example \r\n */\r\n\r\nconst setupChanges = {\r\n controller: setupChangesController,\r\n controllerAs: 'scvm',\r\n templateUrl: '/App/Components/setupChanges/setupChanges.tmpl.html'\r\n}\r\n\r\nexport default setupChanges;","import angular from 'angular';\r\nimport DataChangesViewModel from '../Components/DataChanges/DataChangesViewModel';\r\nimport auditTrailFactoriesModule from './auditTrail.factories.module';\r\nimport auditTrailNetSuiteModule from './auditTrailNetSuite.module';\r\nimport manageDataAction from '../Components/ManageDataV2/Action/manageDataAction.component';\r\nimport manageDataConfiguration from '../Components/ManageDataV2/Configuration/manageDataConfiguration.component';\r\nimport manageDataSchedule from '../Components/ManageDataV2/Schedule/manageDataSchedule.component';\r\nimport manageDataProduct from '../Components/ManageDataV2/Product/manageDataProduct.component';\r\nimport maintainTemplates from '../Components/AuditTrail/MaintainTemplates/maintainTemplates.component';\r\nimport templatesList from '../Components/AuditTrail/MaintainTemplates/templatesList.component';\r\nimport ManageDataViewModel from '../Components/ManageData/ManageDataViewModel';\r\nimport ArchiveDataChangesController from '../Components/ManageData/ArchiveDataChanges/ArchiveDataChangesController';\r\nimport CollectDataChangesController from '../Components/ManageData/CollectDataChanges/CollectDataChangesController';\r\nimport CollectSnapshotController from '../Components/ManageData/CollectSnapshot/CollectSnapshotController';\r\nimport PurgeDataChangesController from '../Components/ManageData/PurgeDataChanges/PurgeDataChangesController';\r\nimport RestoreDataChangesController from '../Components/ManageData/RestoreDataChanges/RestoreDataChangesController';\r\nimport GenericManageDataScheduleController from '../Components/ManageData/GenericManageDataScheduleController';\r\nimport oracleCloudDataChanges from '../Components/DataChangesOracleCloud/oracleCloudDataChanges.component';\r\nimport maintainSnapshots from '../Components/AuditTrail/MaintainSnapshots/maintainSnapshots.component';\r\nimport snapshotsList from '../Components/AuditTrail/MaintainSnapshots/SnapshotsList/snapshotsList.component';\r\nimport reportGenerator from '../Components/ReportGenerator/reportGenerator.component';\r\nimport currentSnapshot from '../Components/CurrentSnapshot/currentSnapshot.component';\r\nimport applyTrackingTemplates from '../Components/ApplyTrackingTemplates/applyTrackingTemplates.component';\r\nimport maintainTemplate from '../Components/TemplateTracking/maintainTemplate.component';\r\nimport manageData from '../Components/ManageDataV2/manageData.component';\r\nimport templateDetails from '../Components/TemplateTracking/TemplateTrackingDetails/templateDetails.component';\r\nimport workdayMaintainTemplates from '../Components/workdayMaintainTemplates/workdayMaintainTemplates.component';\r\nimport workdayTemplatesList from '../Components/workdayMaintainTemplates/templatesList/templatesList.component';\r\nimport classesList from '../Components/workdayMaintainTemplates/classesList/classesList.component';\r\nimport maintainObjectTracking from '../Components/salesForceAuditTrail/maintainObjectTracking/maintainObjectTracking.component';\r\nimport maintainObjectTrackingGrid from '../Components/salesForceAuditTrail/maintainObjectTracking/maintainObjectTrackingGrid/maintainObjectTrackingGrid.component';\r\nimport maintainObjectTrackingGridController from '../Components/salesForceAuditTrail/maintainObjectTracking/maintainObjectTrackingGrid/maintainObjectTrackingGrid.controller';\r\nimport setupChanges from '../Components/setupChanges/setupChanges.component';\r\n\r\n\r\n\r\nexport default angular\r\n .module('app.auditTrail', [auditTrailFactoriesModule, auditTrailNetSuiteModule])\r\n .controller(\"dataChangesViewModel\", DataChangesViewModel)\r\n .component('templateDetails', templateDetails)\r\n .component(\"maintainTemplate\", maintainTemplate)\r\n .component('manageDataAction', manageDataAction)\r\n .component('manageDataConfiguration', manageDataConfiguration)\r\n .component('manageDataSchedule', manageDataSchedule)\r\n .component('manageData', manageData)\r\n .component('manageDataProduct', manageDataProduct)\r\n .component('maintainTemplates', maintainTemplates)\r\n .component('templatesList', templatesList)\r\n .controller(\"manageDataViewModel\", ManageDataViewModel)\r\n .controller(\"ArchiveDataChangesController\", ArchiveDataChangesController)\r\n .controller(\"CollectDataChangesController\", CollectDataChangesController)\r\n .controller(\"CollectSnapshotController\", CollectSnapshotController)\r\n .controller(\"PurgeDataChangesController\", PurgeDataChangesController)\r\n .controller(\"RestoreDataChangesController\", RestoreDataChangesController)\r\n .controller(\"GenericManageDataScheduleController\", GenericManageDataScheduleController)\r\n .component(\"reportGenerator\", reportGenerator)\r\n .component('oracleCloudDataChanges', oracleCloudDataChanges)\r\n .component('maintainSnapshots', maintainSnapshots)\r\n .component('snapshotsList', snapshotsList)\r\n .component('currentSnapshot', currentSnapshot)\r\n .component('applyTrackingTemplates', applyTrackingTemplates)\r\n .component('workdayMaintainTemplates', workdayMaintainTemplates)\r\n .component('workdayTemplatesList', workdayTemplatesList)\r\n .component('workdayClassesList', classesList)\r\n .component('maintainObjectTracking', maintainObjectTracking)\r\n .component('maintainObjectTrackingGrid', maintainObjectTrackingGrid)\r\n .controller('maintainObjectTrackingGridController', maintainObjectTrackingGridController)\r\n .component('setupChanges', setupChanges)\r\n .name;","import templatesListController from \"./templatesList.controller\";\r\n\r\n/* templatesList.component.js */\r\n\r\n/**\r\n * @desc component for viewing a list of audit trail templates\r\n * @example \r\n */\r\n\r\nconst templatesList = {\r\n bindings: {\r\n items: '<',\r\n onUpdate: '&'\r\n\r\n },\r\n controller: templatesListController,\r\n controllerAs: 'tlvm',\r\n templateUrl: '/App/Components/AuditTrail/MaintainTemplates/templatesList.tmpl.html'\r\n};\r\n\r\nexport default templatesList;","export default function () {\r\n\r\n const vm = this;\r\n vm.templateChanged = templateChanged;\r\n\r\n function templateChanged(template) {\r\n vm.onUpdate({ template });\r\n }\r\n}","import snapshotsListController from \"./snapshotsList.controller\";\r\n\r\n/* snapshotsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing a list of audit trail snapshots\r\n * @example \r\n */\r\n\r\nconst snapshotsList = {\r\n bindings: {\r\n items: '<',\r\n onUpdate: '&'\r\n\r\n },\r\n controller: snapshotsListController,\r\n controllerAs: 'slvm',\r\n templateUrl: '/App/Components/AuditTrail/MaintainSnapshots/SnapshotsList/snapshotsList.tmpl.html'\r\n};\r\n\r\nexport default snapshotsList;","export default function () {\r\n\r\n const vm = this;\r\n vm.snapshotChanged = snapshotChanged;\r\n\r\n function snapshotChanged(snapshot) {\r\n vm.onUpdate({ snapshot });\r\n }\r\n}","/* workdayMaintainTemplates.component.js */\r\n\r\n/**\r\n * @desc component for displaying and maintaining Workday Templates\r\n * @example \r\n */\r\n\r\nconst workdayMaintainTemplates = {\r\n controller: workdayMaintainTemplatesController,\r\n controllerAs: 'wmtvm',\r\n template: `\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
`\r\n};\r\n\r\n/*@ngInject*/ function workdayMaintainTemplatesController() {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedTemplate = changeSelectedTemplate;\r\n\r\n function changeSelectedTemplate(template) {\r\n vm.selectedTemplate = template;\r\n }\r\n}\r\n\r\nexport default workdayMaintainTemplates;","/* maintainObjectTracking.component.js */\r\n\r\nconst maintainObjectTracking = {\r\n template: ``\r\n};\r\n\r\nexport default maintainObjectTracking;","export default /*@ngInject*/ function ($http, $filter, errorsDataService, $uibModalInstance, item) {\r\n\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n\r\n function activate() {\r\n getAffectedObjects();\r\n }\r\n\r\n activate();\r\n\r\n function getAffectedObjects() {\r\n vm.loadingAffectedObjects = true;\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/affectedobjects/systemName/' + item.SystemName + '/securityLayerType/' + item.securityLayerType).then(response => {\r\n vm.loadingAffectedObjects = false;\r\n if (response.data.length === 0) {\r\n vm.noAffectedObjects = true;\r\n } else {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n response.data = $filter('orderBy')(response.data, 'Type');\r\n vm.affectedObjects = response.data;\r\n }\r\n }).catch(response => {\r\n vm.loadingAffectedObjects = false;\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, helperService, taskRecordingDataService, $uibModalInstance, $http, productType) {\r\n\r\n $scope.modalvm = {};\r\n $scope.modalvm.fileUploaded = null;\r\n $scope.modalvm.file = null;\r\n $scope.showUploadSection = false;\r\n\r\n function activate() {\r\n if (productType) getTaskRecordings(); // if adding a new privilege\r\n }\r\n\r\n activate();\r\n\r\n function getTaskRecordings() {\r\n $scope.modalvm.loadingTaskRecordings = true;\r\n taskRecordingDataService.getTaskRecordings(productType)\r\n .then(response => {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.modalvm.taskRecordings = response.data;\r\n $scope.modalvm.loadingTaskRecordings = false;\r\n })\r\n .catch(error => {\r\n $scope.modalvm.loadingTaskRecordings = false;\r\n return;\r\n });\r\n }\r\n\r\n function submitExistingTaskRecording() {\r\n $scope.pleaseWait = new createSpinner();\r\n\r\n let taskRecordingId = $scope.modalvm.selectedTaskRecording.Id;\r\n\r\n let postData = {\r\n SimulationId: $scope.vm.selectedSimulation.Id,\r\n Name: $scope.modalvm.name,\r\n Description: $scope.modalvm.desc || '',\r\n TaskRecordingId: taskRecordingId\r\n };\r\n\r\n $http.post(apiUrl + `api/securitydesigner/ax7/simulation/${taskRecordingId}/importedtaskrecording/privilege`, postData)\r\n .then(response => {\r\n $scope.killModal = true;\r\n helperService.successfulSaveButton($scope.pleaseWait)\r\n .then(result => {\r\n $uibModalInstance.close();\r\n $scope.vm.simulationSelected();\r\n });\r\n })\r\n .catch(error => {\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(error.data);\r\n });\r\n }\r\n\r\n $scope.create = function () {\r\n $scope.pleaseWait = new createSpinner();\r\n\r\n var desc = $scope.modalvm.desc;\r\n if (!desc) {\r\n desc = \"\";\r\n }\r\n\r\n var postData = {\r\n \"SimulationId\": $scope.vm.selectedSimulation.Id,\r\n \"Name\": $scope.modalvm.name,\r\n \"Description\": desc,\r\n \"Type\": $scope.securityLayerType\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer', postData).then(function successCallback(response) {\r\n\r\n $scope.killModal = true;\r\n helperService.successfulSaveButton($scope.pleaseWait).then(function (result) {\r\n $uibModalInstance.close();\r\n $scope.vm.simulationSelected();\r\n });\r\n\r\n }, function errorCallback(response) {\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.cancelUpload = function (flow) {\r\n flow.cancel();\r\n $scope.modalvm.fileUploaded = null;\r\n };\r\n\r\n $scope.uploadedFile = null;\r\n\r\n $scope.fileAdded = function (file, event, flow) {\r\n\r\n var fileType = file[0].file.type;\r\n\r\n if (fileType === \"text/xml\") {\r\n $scope.modalvm.file = file[0].file;\r\n $scope.modalvm.fileUploaded = true;\r\n } else {\r\n $scope.taskRecorderResponse = null;\r\n $scope.modalvm.fileUploaded = null;\r\n helperService.showErrorMessage('XML files only');\r\n }\r\n };\r\n\r\n $scope.uploadTaskRecording = function () {\r\n $scope.pleaseWait = new createSpinner();\r\n\r\n var desc = $scope.modalvm.desc;\r\n if (!desc) {\r\n desc = \"\";\r\n }\r\n\r\n var fd = new FormData();\r\n fd.append(\"SimulationId\", $scope.vm.selectedSimulation.Id);\r\n fd.append(\"TaskRecording\", $scope.modalvm.file);\r\n fd.append(\"Name\", $scope.modalvm.name);\r\n fd.append(\"Description\", desc);\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.vm.selectedSimulation.Id + '/taskrecording/privilege', fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n }).then(function successCallback(response) {\r\n $scope.killModal = true;\r\n helperService.successfulSaveButton($scope.pleaseWait).then(function (result) {\r\n $uibModalInstance.close();\r\n $scope.vm.simulationSelected();\r\n });\r\n\r\n }, function errorCallback(response) {\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.submitPrivilege = function () {\r\n if ($scope.modalvm.showUploadSection) $scope.uploadTaskRecording();\r\n else if ($scope.modalvm.showInputSection) submitExistingTaskRecording();\r\n else $scope.create();\r\n };\r\n\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport axSecurityDesignerAffectedObjectsModalController from \"../axSecurityDesignerAffectedObjectsModal.controller\";\r\nimport NewAXSecurityLayerSecurityDesignerController from \"../NewAXSecurityLayerSecurityDesignerController\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $filter, objectIdDataService, AXSecurityDesignerService, $http, helperService) {\r\n\r\n $scope.helperService = helperService;\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n var vm = $scope.vm = {};\r\n vm.disableFilter = true;\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 4;\r\n\r\n $scope.searchChanged = function () {\r\n var filteredResults = $filter('filterResults')(vm.securityDesignerDutiesTree, vm.searchBox, ['Name', 'SystemName']);\r\n if (!vm.disableFilter) {\r\n filteredResults = $filter('filter')(filteredResults, { IsModified: true });\r\n }\r\n $scope.filteredCount = filteredResults.length;\r\n };\r\n\r\n vm.deleteDuty = function (duty) {\r\n if (duty.IsCustom) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/securitylayer/duties').then(function (response) {\r\n var securityLayer = response.data.filter(e => e.Name.toLowerCase() === duty.Name.toLowerCase())[0];\r\n $http.delete(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/' + securityLayer.Id).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n } else {\r\n var message = \"Are you sure you want to remove this duty?\";\r\n swal(helperService.areYouSureParams('Remove Duty', message, 'Remove Duty')).then(function () {\r\n var postBody = {\r\n \"SimulationId\": vm.selectedSimulation.Id,\r\n \"SystemName\": duty.SystemName,\r\n \"Type\": \"Duty\"\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/removals', postBody).then(function (response) {\r\n duty.Action = \"Remove\";\r\n duty.IsModified = true;\r\n $scope.determineModifiedArrays();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }, function (dismiss) {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n vm.openCloneDutyModal = function (duty) {\r\n $scope.selectedSecurityObject = duty;\r\n $scope.securityObjectType = 'Duties';\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/CloneSecurityModal.html',\r\n controller: cloneDutyModal,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n };\r\n\r\n vm.openAffectedObjectsModal = function (selectedDuty) {\r\n\r\n selectedDuty.securityLayerType = 2;\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/axSecurityDesignerAffectedObjectsModal.html',\r\n controller: axSecurityDesignerAffectedObjectsModalController,\r\n controllerAs: 'vm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n item: () => selectedDuty\r\n }\r\n });\r\n };\r\n\r\n vm.undoChangesToDuty = function (duty) {\r\n swal(helperService.areYouSureParams('Undo Changes', 'Are you sure you want to undo this change?', 'Undo')).then(function () {\r\n\r\n var putBody = {\r\n \"SimulationId\": vm.selectedSimulation.Id,\r\n \"ObjectId\": duty.SystemName,\r\n \"ObjectType\": \"Duty\"\r\n };\r\n\r\n $http.put(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/revert', putBody).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n vm.undoRemoveDuty = function (duty) {\r\n swal(helperService.areYouSureParams('Add Duty Back', 'Are you sure you want to add this duty back?', 'Add Duty')).then(function () {\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/securitylayer/removals').then(function (response) {\r\n var securityLayer = response.data.filter(e => e.SystemName.toLowerCase() === duty.SystemName.toLowerCase())[0];\r\n $http.delete(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/removals/' + securityLayer.Id).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n $scope.openAXNewSecurityLayerSecurityDesignerModal = function () {\r\n $scope.securityLayerType = 'Duty';\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/NewAXSecurityLayerSecurityDesigner.html',\r\n controller: NewAXSecurityLayerSecurityDesignerController,\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n productType: () => $scope.productType || false\r\n }\r\n });\r\n };\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/simulation').then(function (response) {\r\n response.data.remove(function (n) { return n['Status'] === 'Deployed'; });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.securityModels = response.data;\r\n\r\n var securityModelInLocalStorage = localStorage.getItem(\"LastSelectedAX7SecurityModel\");\r\n var selected = vm.securityModels.find(e => e.Id.toString() === securityModelInLocalStorage);\r\n\r\n if (securityModelInLocalStorage && selected) {\r\n vm.selectedSimulation = selected;\r\n } else {\r\n vm.selectedSimulation = response.data[0];\r\n }\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $scope.determineModifiedArrays = function () {\r\n vm.securityDesignerDutiesTree.forEach(function (row) {\r\n var privilegesModifiedResultOfRemove = row.Privileges.filter(e => e.IsModified === true && e.Action === 'Remove').length;\r\n\r\n row.PrivilegesModified = row.Privileges.filter(e => e.IsModified === true).length;\r\n\r\n row.GrantedPrivileges = row.Privileges.filter(e => e.Action === \"Grant\").length;\r\n\r\n\r\n if (privilegesModifiedResultOfRemove === row.PrivilegesModified) {\r\n row.ModifiedResultOfAllRemoves = true;\r\n } else {\r\n row.ModifiedResultOfAllRemoves = false;\r\n }\r\n\r\n if (row.PrivilegesModified > 0 || row.IsCustom || row.Action === \"Remove\") {\r\n row.IsModified = true;\r\n } else {\r\n row.IsModified = false;\r\n }\r\n });\r\n vm.numberModified = vm.securityDesignerDutiesTree.filter(e => e.IsModified === true).length;\r\n };\r\n\r\n vm.simulationSelected = function () {\r\n vm.disableFilter = true;\r\n vm.searchBox = '';\r\n if (vm.selectedSimulation) {\r\n\r\n if (vm.selectedSimulation.Status === \"Analyzing\" || vm.selectedSimulation.Status === \"Locked\") {\r\n $scope.pageIsReadOnly = true;\r\n } else {\r\n $scope.pageIsReadOnly = false;\r\n }\r\n\r\n localStorage.setItem(\"LastSelectedAX7SecurityModel\", vm.selectedSimulation.Id);\r\n vm.dutiesLoading = true;\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/dutyaccess').then(function (response) {\r\n vm.dutiesLoading = false;\r\n AXSecurityDesignerService.populateSystemNameIfCustom(response.data);\r\n vm.securityDesignerDutiesTree = response.data;\r\n $scope.determineModifiedArrays();\r\n\r\n $scope.filteredCount = response.data.length;\r\n\r\n }, function errorCallback(response) {\r\n vm.dutiesLoading = false;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/privileges').then(function (response) {\r\n response.data.forEach(function (row) { row.SystemName = row.SystemName || row.Name; });\r\n vm.securityDesignerPrivileges = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n vm.openPrivilegesModal = function (duty) {\r\n $scope.objectOpenInModal = duty;\r\n var currentPrivileges = duty.Privileges;\r\n\r\n var columns = [\r\n { title: \"Active\", field: \"SelectedCheckbox\", template: ``, width: 55, filterable: false },\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"System Name\", field: \"SystemName\", template: \"{{dataItem.SystemName}}\", filterable: customAutoCompleteFilter },\r\n { title: \"Description\", field: \"Description\", filterable: customAutoCompleteFilter },\r\n { title: \"License\", field: \"License\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (!duty.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: ``, width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerPrivileges = vm.securityDesignerPrivileges.slice();\r\n\r\n vm.selectedSecurityDesignerPrivileges.forEach(function (row) {\r\n row.SelectedCheckbox = false;\r\n row.IsModified = false;\r\n });\r\n\r\n vm.selectedSecurityDesignerPrivileges.forEach(function (row) {\r\n\r\n for (var i = 0; i < currentPrivileges.length; i++) {\r\n if (row.SystemName === currentPrivileges[i].SystemName) {\r\n row.IsModified = currentPrivileges[i].IsModified;\r\n row.Action = currentPrivileges[i].Action;\r\n if (currentPrivileges[i].Action === \"Grant\") {\r\n row.SelectedCheckbox = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerPrivileges = $filter('orderBy')(vm.selectedSecurityDesignerPrivileges, 'Name');\r\n options.success(vm.selectedSecurityDesignerPrivileges);\r\n }\r\n }\r\n });\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXPrivilegesToDutySecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n}\r\n\r\nfunction AddAXPrivilegesToDutySecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.modalvm = {};\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Privileges\";\r\n\r\n $scope.modalvm.selectPrivilege = function (dataItem) {\r\n var parentItem = $scope.vm.securityDesignerDutiesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n AXSecurityDesignerService.SetInitialModifiedValueElseChangeModified(dataItem);\r\n\r\n parentItem.Privileges.remove(function (n) { return n['SystemName'] === dataItem.SystemName; });\r\n var childItem = { \"IsCustom\": dataItem.IsCustom, \"IsModified\": dataItem.IsModified, \"SystemName\": dataItem.SystemName, \"Name\": dataItem.Name };\r\n\r\n if (dataItem.SelectedCheckbox === true) {\r\n childItem.Action = \"Grant\";\r\n parentItem.Privileges.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 3, ParentItem: parentItem, ParentType: 2, Action: \"Grant\" });\r\n } else {\r\n childItem.Action = \"Revoke\";\r\n parentItem.Privileges.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 3, ParentItem: parentItem, ParentType: 2, Action: \"Revoke\" });\r\n }\r\n\r\n $scope.determineModifiedArrays();\r\n };\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"SelectedCheckbox\");\r\n };\r\n\r\n $scope.deleteModificationToItem = function (dataItem) {\r\n dataItem.SelectedCheckbox = !dataItem.SelectedCheckbox;\r\n $scope.modalvm.selectPrivilege(dataItem);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction cloneDutyModal($scope, helperService, $uibModalInstance, $http) {\r\n\r\n $scope.modalvm = {};\r\n $scope.modalvm.securityObjectType = $scope.securityObjectType;\r\n\r\n $scope.clone = function (name, description) {\r\n var obj = $scope.selectedSecurityObject;\r\n\r\n if (obj.pleaseWait === null) {\r\n obj.pleaseWait = {};\r\n }\r\n obj.pleaseWait = new createSpinner();\r\n $scope.pleaseWait = new createSpinner();\r\n\r\n if (description === null) {\r\n description = \"\";\r\n }\r\n\r\n var postData = {\r\n \"SimulationId\": $scope.vm.selectedSimulation.Id,\r\n \"SystemName\": obj.SystemName,\r\n \"Name\": name,\r\n \"Description\": description,\r\n \"Type\": \"Duty\"\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.vm.selectedSimulation.Id + '/clone', postData).then(function (response) {\r\n $scope.vm.simulationSelected();\r\n $uibModalInstance.close();\r\n }, function errorCallback(response) {\r\n obj.pleaseWait.loadingValue = false;\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\n\r\n\r\n","import swal from \"sweetalert2\";\r\nimport axSecurityDesignerAffectedObjectsModalController from \"../axSecurityDesignerAffectedObjectsModal.controller\";\r\nimport NewAXSecurityLayerSecurityDesignerController from \"../NewAXSecurityLayerSecurityDesignerController\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $filter, objectIdDataService, AXSecurityDesignerService, $http, helperService) {\r\n\r\n const vm = $scope.vm = {};\r\n vm.disableFilter = true;\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 4;\r\n\r\n vm.openTableFieldsModal = openTableFieldsModal;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n const res = await objectIdDataService.getObjectID();\r\n const securityObject = helperService.getSecurityObjectDetailsFromObjectId(res);\r\n $scope.ObjectId = res;\r\n $scope.productType = securityObject.ProductType;\r\n }\r\n\r\n $scope.searchChanged = function () {\r\n var filteredResults = $filter('filterResults')(vm.securityDesignerPrivilegesTree, vm.searchBox, ['Name', 'SystemName']);\r\n if (!vm.disableFilter) {\r\n filteredResults = $filter('filter')(filteredResults, { IsModified: true });\r\n }\r\n $scope.filteredCount = filteredResults.length;\r\n };\r\n\r\n vm.deletePrivilege = function (privilege) {\r\n if (privilege.IsCustom) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/securitylayer/privileges').then(function (response) {\r\n var securityLayer = response.data.filter(e => e.Name.toLowerCase() === privilege.Name.toLowerCase())[0];\r\n $http.delete(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/' + securityLayer.Id).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n } else {\r\n var message = \"Are you sure you want to remove this privilege?\";\r\n\r\n swal(helperService.areYouSureParams('Remove Privilege', message, 'Remove Privilege')).then(function () {\r\n var postBody = {\r\n \"SimulationId\": vm.selectedSimulation.Id,\r\n \"SystemName\": privilege.SystemName,\r\n \"Type\": \"Privilege\"\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/removals', postBody).then(function (response) {\r\n privilege.Action = \"Remove\";\r\n privilege.IsModified = true;\r\n $scope.determineModifiedArrays();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }, function (dismiss) {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n vm.openClonePrivilegeModal = function (privilege) {\r\n $scope.selectedSecurityObject = privilege;\r\n $scope.securityObjectType = 'Privilege';\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/CloneSecurityModal.html',\r\n controller: clonePrivilegeModal,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n };\r\n\r\n vm.openAffectedObjectsModal = function (selectedPrivilege) {\r\n\r\n selectedPrivilege.securityLayerType = 3;\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/axSecurityDesignerAffectedObjectsModal.html',\r\n controller: axSecurityDesignerAffectedObjectsModalController,\r\n controllerAs: 'vm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n item: () => selectedPrivilege\r\n }\r\n });\r\n };\r\n\r\n vm.undoChangesToPrivilege = function (privilege) {\r\n swal(helperService.areYouSureParams('Undo Changes', 'Are you sure you want to undo this change?', 'Undo')).then(function () {\r\n\r\n var putBody = {\r\n \"SimulationId\": vm.selectedSimulation.Id,\r\n \"ObjectId\": privilege.SystemName,\r\n \"ObjectType\": \"Privilege\"\r\n };\r\n\r\n $http.put(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/revert', putBody).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n vm.undoRemovePrivilege = function (privilege) {\r\n swal(helperService.areYouSureParams('Add Privilege Back', 'Are you sure you want to add this privilege back?', 'Add Privilege')).then(function () {\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/securitylayer/removals').then(function (response) {\r\n var securityLayer = response.data.filter(e => e.SystemName.toLowerCase() === privilege.SystemName.toLowerCase())[0];\r\n $http.delete(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/removals/' + securityLayer.Id).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n $scope.openAXNewSecurityLayerSecurityDesignerModal = function () {\r\n $scope.securityLayerType = 'Privilege';\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/NewAXSecurityLayerSecurityDesigner.html',\r\n controller: NewAXSecurityLayerSecurityDesignerController,\r\n backdrop: 'static',\r\n resolve: {\r\n productType: () => $scope.productType\r\n },\r\n scope: $scope\r\n });\r\n };\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/simulation').then(function (response) {\r\n response.data.remove(function (n) { return n['Status'] === 'Deployed'; });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.securityModels = response.data;\r\n\r\n var securityModelInLocalStorage = localStorage.getItem(\"LastSelectedAX7SecurityModel\");\r\n var selected = vm.securityModels.find(e => e.Id.toString() === securityModelInLocalStorage);\r\n\r\n if (securityModelInLocalStorage && selected) {\r\n vm.selectedSimulation = selected;\r\n } else {\r\n vm.selectedSimulation = response.data[0];\r\n }\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $scope.determineModifiedArrays = function () {\r\n vm.securityDesignerPrivilegesTree.forEach(function (row) {\r\n\r\n row.MenuItemsModified = row.MenuItems.filter(e => e.IsModified === true).length;\r\n row.TablesModified = row.Tables.filter(e => e.IsModified === true).length;\r\n row.DataEntitiesModified = row.DataEntities.filter(e => e.IsModified === true).length;\r\n row.ServiceOperationsModified = row.ServiceOperations.filter(e => e.IsModified === true).length;\r\n\r\n row.GrantedMenuItems = row.MenuItems.filter(e => e.Read !== \"Unset\" || e.Create !== \"Unset\" || e.Update !== \"Unset\" || e.Delete !== \"Unset\").length;\r\n row.GrantedTables = row.Tables.filter(e => e.Read !== \"Unset\" || e.Create !== \"Unset\" || e.Update !== \"Unset\" || e.Delete !== \"Unset\").length;\r\n row.GrantedDataEntities = row.DataEntities.filter(e => e.Read !== \"Unset\" || e.Create !== \"Unset\" || e.Update !== \"Unset\" || e.Delete !== \"Unset\").length;\r\n row.GrantedServiceOperations = row.ServiceOperations.filter(e => e.Invoke !== \"Unset\").length;\r\n\r\n if (row.MenuItemsModified > 0 || row.TablesModified > 0 || row.DataEntitiesModified > 0 || row.ServiceOperationsModified > 0 || row.IsCustom || row.Action === \"Remove\") {\r\n row.IsModified = true;\r\n } else {\r\n row.IsModified = false;\r\n }\r\n });\r\n vm.numberModified = vm.securityDesignerPrivilegesTree.filter(e => e.IsModified === true).length;\r\n };\r\n\r\n vm.simulationSelected = function () {\r\n vm.disableFilter = true;\r\n vm.searchBox = '';\r\n if (vm.selectedSimulation) {\r\n\r\n if (vm.selectedSimulation.Status === \"Analyzing\" || vm.selectedSimulation.Status === \"Locked\") {\r\n $scope.pageIsReadOnly = true;\r\n } else {\r\n $scope.pageIsReadOnly = false;\r\n }\r\n\r\n localStorage.setItem(\"LastSelectedAX7SecurityModel\", vm.selectedSimulation.Id);\r\n vm.privilegesLoading = true;\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/privilegeaccess').then(function (response) {\r\n vm.privilegesLoading = false;\r\n AXSecurityDesignerService.populateSystemNameIfCustom(response.data);\r\n vm.securityDesignerPrivilegesTree = $filter('orderBy')(response.data, 'Name');\r\n\r\n $scope.determineModifiedArrays();\r\n\r\n $scope.filteredCount = response.data.length;\r\n\r\n }, function errorCallback(response) {\r\n vm.privilegesLoading = false;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/menuitems').then(function (response) {\r\n vm.securityDesignerMenuItems = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/tables').then(function (response) {\r\n vm.securityDesignerTables = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/dataentities').then(function (response) {\r\n vm.securityDesignerDataEntities = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/serviceoperations').then(function (response) {\r\n vm.securityDesignerServiceOperations = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n vm.openMenuItemsModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n var currentItems = item.MenuItems;\r\n const menuItems = true;\r\n\r\n var columns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter, width: 160 },\r\n { title: \"Label\", field: \"Label\", filterable: customAutoCompleteFilter, width: 160 },\r\n { title: \"Type\", field: \"Type\", filterable: customAutoCompleteFilter, width: 110 },\r\n { title: \"View License\", field: \"ViewLicense\", filterable: customAutoCompleteFilter, width: 110 },\r\n { title: \"Maintain License\", field: \"MaintainLicense\", filterable: customAutoCompleteFilter, width: 110 },\r\n { title: \"Read\", field: \"Read\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Update\", field: \"Update\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Create\", field: \"Create\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Delete\", field: \"Delete\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"ContainsAssigningValue\", field: \"ContainsAssigningValue\", hidden: true }\r\n ];\r\n\r\n if (!item.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: \"\", width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerMenuItems = vm.securityDesignerMenuItems.slice();\r\n AXSecurityDesignerService.setDataSourceDefaultsAndMapProperties(vm.selectedSecurityDesignerMenuItems, currentItems, menuItems);\r\n\r\n vm.selectedSecurityDesignerMenuItems.forEach(function (row) {\r\n if (row.Create !== 'Unset' || row.Delete !== 'Unset' || row.Read !== 'Unset' || row.Update !== 'Unset') {\r\n row.ContainsAssigningValue = true;\r\n } else {\r\n row.ContainsAssigningValue = false;\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerMenuItems = $filter('orderBy')(vm.selectedSecurityDesignerMenuItems, 'Name');\r\n options.success(vm.selectedSecurityDesignerMenuItems);\r\n }\r\n }\r\n });\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXMenuItemsToPrivilegeSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'xl',\r\n scope: $scope\r\n });\r\n };\r\n\r\n vm.openTablesModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n\r\n AXSecurityDesignerService.createTablesModalDataSource(item, vm);\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXTablesToPrivilegeSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n async function openTableFieldsModal(privilege) {\r\n $uibModal.open({\r\n component: 'tableFieldsModal',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n tables: () => vm.securityDesignerTables,\r\n simulationId: () => vm.selectedSimulation.Id,\r\n privilege: () => privilege\r\n }\r\n });\r\n }\r\n\r\n vm.openDataEntitiesModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n var currentItems = item.DataEntities;\r\n\r\n var columns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter, width: 200 },\r\n { title: \"Label\", field: \"Label\", filterable: customAutoCompleteFilter, width: 200 },\r\n { title: \"Read\", field: \"Read\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Update\", field: \"Update\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Create\", field: \"Create\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Delete\", field: \"Delete\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"ContainsAssigningValue\", field: \"ContainsAssigningValue\", hidden: true }\r\n ];\r\n\r\n if (!item.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: \"\", width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerDataEntities = vm.securityDesignerDataEntities.slice();\r\n AXSecurityDesignerService.setDataSourceDefaultsAndMapProperties(vm.selectedSecurityDesignerDataEntities, currentItems);\r\n\r\n vm.selectedSecurityDesignerDataEntities.forEach(function (row) {\r\n if (row.Create !== 'Unset' || row.Delete !== 'Unset' || row.Read !== 'Unset' || row.Update !== 'Unset') {\r\n row.ContainsAssigningValue = true;\r\n } else {\r\n row.ContainsAssigningValue = false;\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerDataEntities = $filter('orderBy')(vm.selectedSecurityDesignerDataEntities, 'Name');\r\n options.success(vm.selectedSecurityDesignerDataEntities);\r\n }\r\n }\r\n });\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXDataEntitiesToPrivilegeSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n vm.openServiceOperationsModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n var currentItems = item.ServiceOperations;\r\n\r\n var columns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Invoke\", field: \"Invoke\", template: ``, filterable: customAutoCompleteFilter, width: 250 },\r\n { title: \"ContainsAssigningValue\", field: \"ContainsAssigningValue\", hidden: true }\r\n ];\r\n\r\n if (!item.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: \"\", width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerServiceOperations = vm.securityDesignerServiceOperations.slice();\r\n AXSecurityDesignerService.setDataSourceDefaultsAndMapProperties(vm.selectedSecurityDesignerServiceOperations, currentItems);\r\n\r\n vm.selectedSecurityDesignerServiceOperations.forEach(function (row) {\r\n if (row.Invoke !== 'Unset') {\r\n row.ContainsAssigningValue = true;\r\n } else {\r\n row.ContainsAssigningValue = false;\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerServiceOperations = $filter('orderBy')(vm.selectedSecurityDesignerServiceOperations, 'Name');\r\n options.success(vm.selectedSecurityDesignerServiceOperations);\r\n }\r\n }\r\n });\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXServiceOperationsToPrivilegeSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n}\r\n\r\nfunction AddAXMenuItemsToPrivilegeSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Menu Items\";\r\n $scope.tableActions = [\"Grant\", \"Deny\", \"Unset\"];\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"ContainsAssigningValue\");\r\n };\r\n\r\n $scope.actionDropdownChange = async function (action, dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n dataItem.IsModified = true;\r\n\r\n var parentItem = $scope.vm.securityDesignerPrivilegesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n var childItem = {\r\n \"Create\": dataItem.Create,\r\n \"Delete\": dataItem.Delete,\r\n \"Invoke\": dataItem.Invoke,\r\n \"IsModified\": true,\r\n \"OldCreate\": dataItem.OldCreate,\r\n \"OldDelete\": dataItem.OldDelete,\r\n \"OldInvoke\": dataItem.OldInvoke,\r\n \"OldRead\": dataItem.OldRead,\r\n \"OldUpdate\": dataItem.OldUpdate,\r\n \"Read\": dataItem.Read,\r\n \"SystemName\": dataItem.Name,\r\n \"Update\": dataItem.Update,\r\n \"Type\": dataItem.Type\r\n };\r\n\r\n var parentItemMenuItem = parentItem.MenuItems.filter(e => e.SystemName.toLowerCase() === dataItem.Name.toLowerCase())[0];\r\n parentItem.MenuItems.remove(parentItemMenuItem);\r\n\r\n if (dataItem.Create !== 'Unset' || dataItem.Delete !== 'Unset' || dataItem.Read !== 'Unset' || dataItem.Update !== 'Unset') {\r\n dataItem.ContainsAssigningValue = true;\r\n } else {\r\n dataItem.ContainsAssigningValue = false;\r\n }\r\n\r\n parentItem.MenuItems.push(childItem);\r\n\r\n var childTypeId;\r\n if (childItem.Type === \"Action\") {\r\n childTypeId = 3;\r\n } else if (childItem.Type === \"Display\") {\r\n childTypeId = 1;\r\n } else if (childItem.Type === \"Output\") {\r\n childTypeId = 2;\r\n }\r\n\r\n let { data } = await AXSecurityDesignerService.AssignChildObjectToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: childTypeId, ParentItem: parentItem, ParentType: 3 });\r\n // use the returned object to update the permissions dropdowns\r\n childItem.Create = data[0].Create;\r\n childItem.Update = data[0].Update;\r\n childItem.Read = data[0].Read;\r\n childItem.Delete = data[0].Delete\r\n $scope.vm.manageSecurityLayerGridDataSource.read();\r\n $scope.determineModifiedArrays();\r\n\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n };\r\n\r\n $scope.deleteModificationToObject = function (dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n AXSecurityDesignerService.DeleteModificationToObject(dataItem, $scope.vm.selectedSimulation, $scope.objectOpenInModal, \"MenuItems\").then(function () {\r\n $scope.determineModifiedArrays();\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction AddAXTablesToPrivilegeSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.modalvm = {};\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Tables\";\r\n $scope.tableActions = [\"Grant\", \"Deny\", \"Unset\"];\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"ContainsAssigningValue\");\r\n };\r\n\r\n $scope.actionDropdownChange = async function (action, dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n dataItem.IsModified = true;\r\n\r\n var parentItem = $scope.vm.securityDesignerPrivilegesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n var childItem = {\r\n \"Create\": dataItem.Create,\r\n \"Delete\": dataItem.Delete,\r\n \"Invoke\": dataItem.Invoke,\r\n \"IsModified\": true,\r\n \"OldCreate\": dataItem.OldCreate,\r\n \"OldDelete\": dataItem.OldDelete,\r\n \"OldInvoke\": dataItem.OldInvoke,\r\n \"OldRead\": dataItem.OldRead,\r\n \"OldUpdate\": dataItem.OldUpdate,\r\n \"Read\": dataItem.Read,\r\n \"SystemName\": dataItem.Name,\r\n \"Update\": dataItem.Update,\r\n \"Type\": dataItem.Type\r\n };\r\n\r\n var parentItemTable = parentItem.Tables.filter(e => e.SystemName.toLowerCase() === dataItem.Name.toLowerCase())[0];\r\n\r\n parentItem.Tables.remove(parentItemTable);\r\n\r\n if (dataItem.Create !== 'Unset' || dataItem.Delete !== 'Unset' || dataItem.Read !== 'Unset' || dataItem.Update !== 'Unset') {\r\n dataItem.ContainsAssigningValue = true;\r\n } else {\r\n dataItem.ContainsAssigningValue = false;\r\n }\r\n\r\n parentItem.Tables.push(childItem);\r\n\r\n let { data } = await AXSecurityDesignerService.AssignChildObjectToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 44, ParentItem: parentItem, ParentType: 3 });\r\n // use the returned object to update the permissions dropdowns\r\n childItem.Create = data[0].Create;\r\n childItem.Update = data[0].Update;\r\n childItem.Read = data[0].Read;\r\n childItem.Delete = data[0].Delete\r\n $scope.vm.manageSecurityLayerGridDataSource.read();\r\n $scope.determineModifiedArrays();\r\n\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n };\r\n\r\n $scope.deleteModificationToObject = function (dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n AXSecurityDesignerService.DeleteModificationToObject(dataItem, $scope.vm.selectedSimulation, $scope.objectOpenInModal, \"Tables\").then(function () {\r\n $scope.determineModifiedArrays();\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction AddAXDataEntitiesToPrivilegeSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Data Entities\";\r\n $scope.tableActions = [\"Grant\", \"Deny\", \"Unset\"];\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"ContainsAssigningValue\");\r\n };\r\n\r\n $scope.actionDropdownChange = async function (action, dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n dataItem.IsModified = true;\r\n\r\n var parentItem = $scope.vm.securityDesignerPrivilegesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n var childItem = {\r\n \"Create\": dataItem.Create,\r\n \"Delete\": dataItem.Delete,\r\n \"Invoke\": dataItem.Invoke,\r\n \"IsModified\": true,\r\n \"OldCreate\": dataItem.OldCreate,\r\n \"OldDelete\": dataItem.OldDelete,\r\n \"OldInvoke\": dataItem.OldInvoke,\r\n \"OldRead\": dataItem.OldRead,\r\n \"OldUpdate\": dataItem.OldUpdate,\r\n \"Read\": dataItem.Read,\r\n \"SystemName\": dataItem.Name,\r\n \"Update\": dataItem.Update,\r\n \"Type\": dataItem.Type\r\n };\r\n\r\n var parentItemDataEntity = parentItem.DataEntities.filter(e => e.SystemName.toLowerCase() === dataItem.Name.toLowerCase())[0];\r\n parentItem.DataEntities.remove(parentItemDataEntity);\r\n\r\n if (dataItem.Create !== 'Unset' || dataItem.Delete !== 'Unset' || dataItem.Read !== 'Unset' || dataItem.Update !== 'Unset') {\r\n dataItem.ContainsAssigningValue = true;\r\n } else {\r\n dataItem.ContainsAssigningValue = false;\r\n }\r\n\r\n parentItem.DataEntities.push(childItem);\r\n\r\n let { data } = await AXSecurityDesignerService.AssignChildObjectToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 67, ParentItem: parentItem, ParentType: 3 });\r\n // use the returned object to update the permissions dropdowns\r\n childItem.Create = data[0].Create;\r\n childItem.Update = data[0].Update;\r\n childItem.Read = data[0].Read;\r\n childItem.Delete = data[0].Delete\r\n $scope.vm.manageSecurityLayerGridDataSource.read();\r\n $scope.determineModifiedArrays();\r\n\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n };\r\n\r\n $scope.deleteModificationToObject = function (dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n AXSecurityDesignerService.DeleteModificationToObject(dataItem, $scope.vm.selectedSimulation, $scope.objectOpenInModal, \"DataEntities\").then(function () {\r\n $scope.determineModifiedArrays();\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction AddAXServiceOperationsToPrivilegeSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Service Operations\";\r\n $scope.tableActions = [\"Grant\", \"Deny\", \"Unset\"];\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"ContainsAssigningValue\");\r\n };\r\n\r\n $scope.actionDropdownChange = function (action, dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n dataItem.IsModified = true;\r\n\r\n var parentItem = $scope.vm.securityDesignerPrivilegesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n var childItem = {\r\n \"Create\": dataItem.Create,\r\n \"Delete\": dataItem.Delete,\r\n \"Invoke\": dataItem.Invoke,\r\n \"IsModified\": true,\r\n \"OldCreate\": dataItem.OldCreate,\r\n \"OldDelete\": dataItem.OldDelete,\r\n \"OldInvoke\": dataItem.OldInvoke,\r\n \"OldRead\": dataItem.OldRead,\r\n \"OldUpdate\": dataItem.OldUpdate,\r\n \"Read\": dataItem.Read,\r\n \"SystemName\": dataItem.Name,\r\n \"Update\": dataItem.Update,\r\n \"Type\": dataItem.Type\r\n };\r\n\r\n var parentItemServiceOperation = parentItem.ServiceOperations.filter(e => e.SystemName.toLowerCase() === dataItem.Name.toLowerCase())[0];\r\n parentItem.ServiceOperations.remove(parentItemServiceOperation);\r\n\r\n if (dataItem.Invoke !== 'Unset') {\r\n dataItem.ContainsAssigningValue = true;\r\n } else {\r\n dataItem.ContainsAssigningValue = false;\r\n }\r\n\r\n parentItem.ServiceOperations.push(childItem);\r\n\r\n AXSecurityDesignerService.AssignChildObjectToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 76, ParentItem: parentItem, ParentType: 3 });\r\n $scope.determineModifiedArrays();\r\n\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n };\r\n\r\n $scope.deleteModificationToObject = function (dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n AXSecurityDesignerService.DeleteModificationToObject(dataItem, $scope.vm.selectedSimulation, $scope.objectOpenInModal, \"ServiceOperations\").then(function () {\r\n $scope.determineModifiedArrays();\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction clonePrivilegeModal($scope, helperService, $uibModalInstance, $http) {\r\n\r\n $scope.modalvm = {};\r\n $scope.modalvm.securityObjectType = $scope.securityObjectType;\r\n\r\n $scope.clone = function (name, description) {\r\n var obj = $scope.selectedSecurityObject;\r\n\r\n if (!obj.pleaseWait) {\r\n obj.pleaseWait = {};\r\n }\r\n obj.pleaseWait = new createSpinner();\r\n $scope.pleaseWait = new createSpinner();\r\n\r\n if (!description) {\r\n description = \"\";\r\n }\r\n\r\n var postData = {\r\n \"SimulationId\": $scope.vm.selectedSimulation.Id,\r\n \"SystemName\": obj.SystemName,\r\n \"Name\": name,\r\n \"Description\": description,\r\n \"Type\": \"Privilege\"\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.vm.selectedSimulation.Id + '/clone', postData).then(function (response) {\r\n $scope.vm.simulationSelected();\r\n $uibModalInstance.close();\r\n }, function errorCallback(response) {\r\n obj.pleaseWait.loadingValue = false;\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n","import swal from \"sweetalert2\";\r\nimport axSecurityDesignerAffectedObjectsModalController from \"../axSecurityDesignerAffectedObjectsModal.controller\";\r\nimport NewAXSecurityLayerSecurityDesignerController from \"../NewAXSecurityLayerSecurityDesignerController\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $filter, AXSecurityDesignerService, objectIdDataService, $http, helperService) {\r\n\r\n $scope.helperService = helperService;\r\n\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n var vm = $scope.vm = {};\r\n vm.disableFilter = true;\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 4;\r\n\r\n $scope.searchChanged = function () {\r\n var filteredResults = $filter('filterResults')(vm.securityDesignerRolesTree, vm.searchBox, ['Name', 'SystemName']);\r\n if (!vm.disableFilter) {\r\n filteredResults = $filter('filter')(filteredResults, { IsModified: true });\r\n }\r\n $scope.filteredCount = filteredResults.length;\r\n };\r\n\r\n vm.deleteRole = function (role) {\r\n\r\n if (role.IsCustom) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/securitylayer/roles').then(function (response) {\r\n var securityLayer = response.data.filter(e => e.Name.toLowerCase() === role.Name.toLowerCase())[0];\r\n $http.delete(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/' + securityLayer.Id).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n } else {\r\n\r\n var message = \"Are you sure you want to remove this role?\";\r\n\r\n swal(helperService.areYouSureParams('Remove Role', message, 'Remove Role')).then(function () {\r\n var postBody = {\r\n \"SimulationId\": vm.selectedSimulation.Id,\r\n \"SystemName\": role.SystemName,\r\n \"Type\": \"Role\"\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/removals', postBody).then(function (response) {\r\n role.Action = \"Remove\";\r\n role.IsModified = true;\r\n $scope.determineModifiedArrays();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }, function (dismiss) {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n vm.openAffectedObjectsModal = function (selectedRole) {\r\n\r\n selectedRole.securityLayerType = 1;\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/axSecurityDesignerAffectedObjectsModal.html',\r\n controller: axSecurityDesignerAffectedObjectsModalController,\r\n controllerAs: 'vm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n item: () => selectedRole\r\n }\r\n });\r\n };\r\n\r\n vm.openCloneRoleModal = function (privilege) {\r\n $scope.selectedSecurityObject = privilege;\r\n $scope.securityObjectType = 'Role';\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/CloneSecurityModal.html',\r\n controller: cloneRoleModal,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n };\r\n\r\n\r\n $scope.openAXNewSecurityLayerSecurityDesignerModal = function () {\r\n $scope.securityLayerType = 'Role';\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/NewAXSecurityLayerSecurityDesigner.html',\r\n controller: NewAXSecurityLayerSecurityDesignerController,\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n productType: () => $scope.productType || false\r\n }\r\n });\r\n };\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/simulation').then(function (response) {\r\n response.data.remove(function (n) { return n['Status'] === 'Deployed'; });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.securityModels = response.data;\r\n\r\n var securityModelInLocalStorage = localStorage.getItem(\"LastSelectedAX7SecurityModel\");\r\n var selected = vm.securityModels.find(e => e.Id.toString() === securityModelInLocalStorage);\r\n if (securityModelInLocalStorage && selected) {\r\n vm.selectedSimulation = selected;\r\n } else {\r\n vm.selectedSimulation = response.data[0];\r\n }\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $scope.determineModifiedArrays = function () {\r\n vm.securityDesignerRolesTree.forEach(function (row) {\r\n var dutiesModifiedResultOfRemove = row.Duties.filter(e => e.IsModified === true && e.Action === 'Remove').length;\r\n var privilegesModifiedResultOfRemove = row.Privileges.filter(e => e.IsModified === true && e.Action === 'Remove').length;\r\n var subRolesModifiedResultOfRemove = row.SubRoles.filter(e => e.IsModified === true && e.Action === 'Remove').length;\r\n\r\n row.DutiesModified = row.Duties.filter(e => e.IsModified === true).length;\r\n row.PrivilegesModified = row.Privileges.filter(e => e.IsModified === true).length;\r\n row.SubRolesModified = row.SubRoles.filter(e => e.IsModified === true).length;\r\n row.TablesModified = row.Tables.filter(e => e.IsModified === true).length;\r\n\r\n row.GrantedDuties = row.Duties.filter(e => e.Action === \"Grant\").length;\r\n row.GrantedPrivileges = row.Privileges.filter(e => e.Action === \"Grant\").length;\r\n row.GrantedSubRoles = row.SubRoles.filter(e => e.Action === \"Grant\").length;\r\n row.GrantedTables = row.Tables.filter(e => e.Read !== \"Unset\" || e.Create !== \"Unset\" || e.Update !== \"Unset\" || e.Delete !== \"Unset\").length;\r\n\r\n if (dutiesModifiedResultOfRemove === row.DutiesModified && privilegesModifiedResultOfRemove === row.PrivilegesModified && subRolesModifiedResultOfRemove === row.SubRolesModified) {\r\n row.ModifiedResultOfAllRemoves = true;\r\n } else {\r\n row.ModifiedResultOfAllRemoves = false;\r\n }\r\n\r\n if (row.DutiesModified > 0 || row.PrivilegesModified > 0 || row.SubRolesModified > 0 || row.TablesModified > 0 || row.IsCustom || row.Action === \"Remove\") {\r\n row.IsModified = true;\r\n } else {\r\n row.IsModified = false;\r\n }\r\n });\r\n vm.numberModified = vm.securityDesignerRolesTree.filter(e => e.IsModified === true).length;\r\n };\r\n\r\n vm.simulationSelected = function () {\r\n vm.disableFilter = true;\r\n vm.searchBox = '';\r\n if (vm.selectedSimulation) {\r\n\r\n if (vm.selectedSimulation.Status === \"Analyzing\" || vm.selectedSimulation.Status === \"Locked\") {\r\n $scope.pageIsReadOnly = true;\r\n } else {\r\n $scope.pageIsReadOnly = false;\r\n }\r\n\r\n localStorage.setItem(\"LastSelectedAX7SecurityModel\", vm.selectedSimulation.Id);\r\n vm.rolesLoading = true;\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/roleaccess').then(function (response) {\r\n vm.rolesLoading = false;\r\n AXSecurityDesignerService.populateSystemNameIfCustom(response.data);\r\n vm.securityDesignerRolesTree = response.data;\r\n $scope.determineModifiedArrays();\r\n\r\n $scope.filteredCount = response.data.length;\r\n\r\n }, function errorCallback(response) {\r\n vm.rolesLoading = false;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/roles').then(function (response) {\r\n response.data.forEach(function (row) { row.SystemName = row.SystemName || row.Name; });\r\n vm.securityDesignerRoles = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/duties').then(function (response) {\r\n response.data.forEach(function (row) { row.SystemName = row.SystemName || row.Name; });\r\n vm.securityDesignerDuties = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/privileges').then(function (response) {\r\n response.data.forEach(function (row) { row.SystemName = row.SystemName || row.Name; });\r\n vm.securityDesignerPrivileges = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/tables').then(function (response) {\r\n vm.securityDesignerTables = response.data;\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n vm.undoChangesToRole = function (role) {\r\n swal(helperService.areYouSureParams('Undo Changes', 'Are you sure you want to undo this change?', 'Undo')).then(function () {\r\n\r\n var putBody = {\r\n \"SimulationId\": vm.selectedSimulation.Id,\r\n \"ObjectId\": role.SystemName,\r\n \"ObjectType\": \"Role\"\r\n };\r\n\r\n $http.put(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/revert', putBody).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n vm.undoRemoveRole = function (role) {\r\n swal(helperService.areYouSureParams('Add Role Back', 'Are you sure you want to add this role back?', 'Add Role')).then(function () {\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + vm.selectedSimulation.Id + '/securitylayer/removals').then(function (response) {\r\n var securityLayer = response.data.filter(e => e.SystemName.toLowerCase() === role.SystemName.toLowerCase())[0];\r\n $http.delete(apiUrl + 'api/securitydesigner/ax7/simulation/securitylayer/removals/' + securityLayer.Id).then(function (response) {\r\n vm.simulationSelected();\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n }, function errorCallback(response) {\r\n return;\r\n });\r\n\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n vm.openPrivilegesModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n var currentPrivileges = item.Privileges;\r\n\r\n var columns = [\r\n { title: \"Active\", field: \"SelectedCheckbox\", template: ``, width: 55, filterable: false },\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"System Name\", field: \"SystemName\", template: \"{{dataItem.SystemName}}\", filterable: customAutoCompleteFilter },\r\n { title: \"Description\", field: \"Description\", filterable: customAutoCompleteFilter },\r\n { title: \"License\", field: \"License\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (!item.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: ``, width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerPrivileges = vm.securityDesignerPrivileges.slice();\r\n\r\n vm.selectedSecurityDesignerPrivileges.forEach(function (row) {\r\n row.SelectedCheckbox = false;\r\n row.IsModified = false;\r\n });\r\n\r\n vm.selectedSecurityDesignerPrivileges.forEach(function (row) {\r\n\r\n for (var i = 0; i < currentPrivileges.length; i++) {\r\n if (row.SystemName === currentPrivileges[i].SystemName) {\r\n row.IsModified = currentPrivileges[i].IsModified;\r\n row.Action = currentPrivileges[i].Action;\r\n if (currentPrivileges[i].Action === \"Grant\") {\r\n row.SelectedCheckbox = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerPrivileges = $filter('orderBy')(vm.selectedSecurityDesignerPrivileges, 'Name');\r\n options.success(vm.selectedSecurityDesignerPrivileges);\r\n }\r\n }\r\n });\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXPrivilegesToRoleSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n vm.openDutiesModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n var currentDuties = item.Duties;\r\n\r\n var columns = [\r\n { title: \"Active\", field: \"SelectedCheckbox\", template: ``, width: 55, filterable: false },\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"System Name\", field: \"SystemName\", template: \"{{dataItem.SystemName}}\", filterable: customAutoCompleteFilter },\r\n { title: \"Description\", field: \"Description\", filterable: customAutoCompleteFilter },\r\n { title: \"License\", field: \"License\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (!item.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: ``, width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerDuties = vm.securityDesignerDuties.slice();\r\n\r\n vm.selectedSecurityDesignerDuties.forEach(function (row) {\r\n row.SelectedCheckbox = false;\r\n row.IsModified = false;\r\n });\r\n\r\n vm.selectedSecurityDesignerDuties.forEach(function (row) {\r\n\r\n for (var i = 0; i < currentDuties.length; i++) {\r\n if (row.SystemName === currentDuties[i].SystemName) {\r\n row.IsModified = currentDuties[i].IsModified;\r\n row.Action = currentDuties[i].Action;\r\n if (currentDuties[i].Action === \"Grant\") {\r\n row.SelectedCheckbox = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerDuties = $filter('orderBy')(vm.selectedSecurityDesignerDuties, 'Name');\r\n options.success(vm.selectedSecurityDesignerDuties);\r\n }\r\n }\r\n });\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXDutiesToRoleSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n vm.openTablesModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n\r\n AXSecurityDesignerService.createTablesModalDataSource(item, vm);\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXTablesToRoleSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n vm.openSubRolesModal = function (item) {\r\n $scope.objectOpenInModal = item;\r\n var currentSubRoles = item.SubRoles;\r\n\r\n var columns = [\r\n { title: \"Active\", field: \"SelectedCheckbox\", template: ``, width: 55, filterable: false },\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"System Name\", field: \"SystemName\", template: \"{{dataItem.SystemName}}\", filterable: customAutoCompleteFilter },\r\n { title: \"Description\", field: \"Description\", filterable: customAutoCompleteFilter },\r\n { title: \"License\", field: \"License\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n if (!item.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: ``, width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerRoles = vm.securityDesignerRoles.slice();\r\n vm.selectedSecurityDesignerRoles.forEach(function (row, i) {\r\n row.SelectedCheckbox = false;\r\n row.IsModified = false;\r\n if (item.Name === row.Name) {\r\n vm.selectedSecurityDesignerRoles.remove(row);\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerRoles.forEach(function (row) {\r\n\r\n for (var i = 0; i < currentSubRoles.length; i++) {\r\n if (row.SystemName === currentSubRoles[i].SystemName) {\r\n row.IsModified = currentSubRoles[i].IsModified;\r\n row.Action = currentSubRoles[i].Action;\r\n if (currentSubRoles[i].Action === \"Grant\") {\r\n row.SelectedCheckbox = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerRoles = $filter('orderBy')(vm.selectedSecurityDesignerRoles, 'Name');\r\n options.success(vm.selectedSecurityDesignerRoles);\r\n }\r\n }\r\n });\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/Roles/ManageRoleAXSecurityDesigner.html',\r\n controller: AddAXSubRolesToRoleSecurityDesigner,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n}\r\n\r\nfunction AddAXDutiesToRoleSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.modalvm = {};\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Duties\";\r\n\r\n $scope.modalvm.selectDuty = function (dataItem) {\r\n var parentItem = $scope.vm.securityDesignerRolesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n AXSecurityDesignerService.SetInitialModifiedValueElseChangeModified(dataItem);\r\n\r\n parentItem.Duties.remove(function (n) { return n['SystemName'] === dataItem.SystemName; });\r\n var childItem = { \"IsCustom\": dataItem.IsCustom, \"IsModified\": dataItem.IsModified, \"SystemName\": dataItem.SystemName, \"Name\": dataItem.Name };\r\n\r\n if (dataItem.SelectedCheckbox === true) {\r\n childItem.Action = \"Grant\";\r\n parentItem.Duties.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 2, ParentItem: parentItem, ParentType: 1, Action: \"Grant\" });\r\n } else {\r\n childItem.Action = \"Revoke\";\r\n parentItem.Duties.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 2, ParentItem: parentItem, ParentType: 1, Action: \"Revoke\" });\r\n }\r\n\r\n $scope.determineModifiedArrays();\r\n };\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"SelectedCheckbox\");\r\n };\r\n\r\n $scope.deleteModificationToItem = function (dataItem) {\r\n dataItem.SelectedCheckbox = !dataItem.SelectedCheckbox;\r\n $scope.modalvm.selectDuty(dataItem);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction AddAXPrivilegesToRoleSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService, $http, $route) {\r\n\r\n $scope.modalvm = {};\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Privileges\";\r\n\r\n $scope.modalvm.selectPrivilege = function (dataItem) {\r\n var parentItem = $scope.vm.securityDesignerRolesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n AXSecurityDesignerService.SetInitialModifiedValueElseChangeModified(dataItem);\r\n\r\n parentItem.Privileges.remove(function (n) { return n['SystemName'] === dataItem.SystemName; });\r\n var childItem = { \"IsCustom\": dataItem.IsCustom, \"IsModified\": dataItem.IsModified, \"SystemName\": dataItem.SystemName, \"Name\": dataItem.Name };\r\n\r\n if (dataItem.SelectedCheckbox === true) {\r\n childItem.Action = \"Grant\";\r\n parentItem.Privileges.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 3, ParentItem: parentItem, ParentType: 1, Action: \"Grant\" });\r\n } else {\r\n childItem.Action = \"Revoke\";\r\n parentItem.Privileges.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 3, ParentItem: parentItem, ParentType: 1, Action: \"Revoke\" });\r\n }\r\n\r\n $scope.determineModifiedArrays();\r\n };\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"SelectedCheckbox\");\r\n };\r\n\r\n $scope.deleteModificationToItem = function (dataItem) {\r\n dataItem.SelectedCheckbox = !dataItem.SelectedCheckbox;\r\n $scope.modalvm.selectPrivilege(dataItem);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction AddAXTablesToRoleSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.modalvm = {};\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Tables\";\r\n $scope.tableActions = [\"Grant\", \"Deny\", \"Unset\"];\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"ContainsAssigningValue\");\r\n };\r\n\r\n $scope.actionDropdownChange = async function (action, dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n dataItem.IsModified = true;\r\n\r\n var parentItem = $scope.vm.securityDesignerRolesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n var childItem = {\r\n \"Create\": dataItem.Create,\r\n \"Delete\": dataItem.Delete,\r\n \"Invoke\": dataItem.Invoke,\r\n \"IsModified\": true,\r\n \"OldCreate\": dataItem.OldCreate,\r\n \"OldDelete\": dataItem.OldDelete,\r\n \"OldInvoke\": dataItem.OldInvoke,\r\n \"OldRead\": dataItem.OldRead,\r\n \"OldUpdate\": dataItem.OldUpdate,\r\n \"Read\": dataItem.Read,\r\n \"SystemName\": dataItem.Name,\r\n \"Update\": dataItem.Update,\r\n \"Type\": 44\r\n };\r\n\r\n var parentItemTable = parentItem.Tables.filter(e => e.SystemName.toLowerCase() === dataItem.Name.toLowerCase())[0];\r\n parentItem.Tables.remove(parentItemTable);\r\n\r\n if (dataItem.Create !== 'Unset' || dataItem.Delete !== 'Unset' || dataItem.Read !== 'Unset' || dataItem.Update !== 'Unset') {\r\n dataItem.ContainsAssigningValue = true;\r\n } else {\r\n dataItem.ContainsAssigningValue = false;\r\n }\r\n\r\n parentItem.Tables.push(childItem);\r\n\r\n let { data } = await AXSecurityDesignerService.AssignChildObjectToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 44, ParentItem: parentItem, ParentType: 1 });\r\n // use the returned object to update the permissions dropdowns\r\n childItem.Create = data[0].Create;\r\n childItem.Update = data[0].Update;\r\n childItem.Read = data[0].Read;\r\n childItem.Delete = data[0].Delete\r\n $scope.vm.manageSecurityLayerGridDataSource.read();\r\n $scope.determineModifiedArrays();\r\n\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n };\r\n\r\n $scope.deleteModificationToObject = function (dataItem) {\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, true);\r\n AXSecurityDesignerService.DeleteModificationToObject(dataItem, $scope.vm.selectedSimulation, $scope.objectOpenInModal, \"Tables\").then(function () {\r\n $scope.determineModifiedArrays();\r\n kendo.ui.progress($scope.vm.manageSecurityLayerGrid.element, false);\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction AddAXSubRolesToRoleSecurityDesigner($scope, $uibModalInstance, AXSecurityDesignerService) {\r\n\r\n $scope.modalvm = {};\r\n\r\n $scope.selectedTableFilter = \"All\";\r\n $scope.modalHeader = \"Sub-Roles\";\r\n\r\n $scope.modalvm.selectSubRole = function (dataItem) {\r\n var parentItem = $scope.vm.securityDesignerRolesTree.filter(e => e.SystemName.toLowerCase() === $scope.objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n AXSecurityDesignerService.SetInitialModifiedValueElseChangeModified(dataItem);\r\n\r\n parentItem.SubRoles.remove(function (n) { return n['SystemName'] === dataItem.SystemName; });\r\n var childItem = { \"IsCustom\": dataItem.IsCustom, \"IsModified\": dataItem.IsModified, \"SystemName\": dataItem.SystemName, \"Name\": dataItem.Name };\r\n\r\n if (dataItem.SelectedCheckbox === true) {\r\n childItem.Action = \"Grant\";\r\n parentItem.SubRoles.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 1, ParentItem: parentItem, ParentType: 1, Action: \"Grant\" });\r\n } else {\r\n childItem.Action = \"Revoke\";\r\n parentItem.SubRoles.push(childItem);\r\n AXSecurityDesignerService.AssignChildToParent({ SimulationId: $scope.vm.selectedSimulation.Id, ChildItem: childItem, ChildType: 1, ParentItem: parentItem, ParentType: 1, Action: \"Revoke\" });\r\n }\r\n\r\n $scope.determineModifiedArrays();\r\n };\r\n\r\n $scope.changeFilter = function () {\r\n AXSecurityDesignerService.changeFilter($scope.selectedTableFilter, $scope.vm.manageSecurityLayerGrid.dataSource, \"SelectedCheckbox\");\r\n };\r\n\r\n $scope.deleteModificationToItem = function (dataItem) {\r\n dataItem.SelectedCheckbox = !dataItem.SelectedCheckbox;\r\n $scope.modalvm.selectSubRole(dataItem);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n\r\nfunction cloneRoleModal($scope, helperService, $uibModalInstance, $http) {\r\n\r\n $scope.modalvm = {};\r\n $scope.modalvm.securityObjectType = $scope.securityObjectType;\r\n\r\n $scope.clone = function (name, description) {\r\n var obj = $scope.selectedSecurityObject;\r\n\r\n if (obj.pleaseWait === null) {\r\n obj.pleaseWait = {};\r\n }\r\n obj.pleaseWait = new createSpinner();\r\n $scope.pleaseWait = new createSpinner();\r\n\r\n if (description === null) {\r\n description = \"\";\r\n }\r\n\r\n var postData = {\r\n \"SimulationId\": $scope.vm.selectedSimulation.Id,\r\n \"SystemName\": obj.SystemName,\r\n \"Name\": name,\r\n \"Description\": description,\r\n \"Type\": \"Role\"\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.vm.selectedSimulation.Id + '/clone', postData).then(function (response) {\r\n $scope.vm.simulationSelected();\r\n $uibModalInstance.close();\r\n }, function errorCallback(response) {\r\n obj.pleaseWait.loadingValue = false;\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, helperService, $uibModalInstance, $http) {\r\n\r\n $scope.modalvm = {};\r\n\r\n $scope.createSimulation = function () {\r\n $scope.pleaseWait = new createSpinner();\r\n var postData = {\r\n \"Name\": $scope.simulation.name,\r\n \"ProductId\": \"AX7\"\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/simulation', postData).then(async function successCallback(response) {\r\n\r\n $scope.killModal = true;\r\n await helperService.successfulSaveButton($scope.pleaseWait).then(function (result) {\r\n $uibModalInstance.close();\r\n });\r\n\r\n }, function errorCallback(response) {\r\n $scope.pleaseWait.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}","import { standardGridPageSize, customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, helperService, AXSecurityDesignerService, errorsDataService, $uibModalInstance, sim) {\r\n\r\n var vm = $scope.vm = {};\r\n\r\n vm.sim = sim;\r\n vm.cancel = cancel;\r\n vm.exportSimulationChanges = exportSimulationChanges;\r\n vm.setGridOptions = setGridOptions;\r\n\r\n function activate() {\r\n getSimulationChanges();\r\n }\r\n\r\n activate();\r\n\r\n function getSimulationChanges() {\r\n vm.loadingChanges = true;\r\n $http.get(apiUrl + 'api/securitydesigner/simulation/' + sim.Id + '/changes').then(response => {\r\n vm.loadingChanges = false;\r\n sim.modifications = response.data;\r\n }).catch(response => {\r\n vm.loadingChanges = false;\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n function setGridOptions(columns) {\r\n return helperService.setMainGridOptions(columns, 250);\r\n }\r\n\r\n vm.newSecurityLayersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: options => {\r\n options.success(sim.modifications.CreatedSecurityLayers);\r\n }\r\n }\r\n });\r\n\r\n vm.parentToChildGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: options => {\r\n options.success(sim.modifications.ParentToChild);\r\n }\r\n }\r\n });\r\n\r\n vm.parentToObjectGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: options => {\r\n options.success(sim.modifications.ParentToObject);\r\n }\r\n }\r\n });\r\n\r\n vm.removedSecurityLayersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: options => {\r\n options.success(sim.modifications.RemovedSecurityLayers);\r\n }\r\n }\r\n });\r\n\r\n vm.newSecurityLayersDataGridColumns = [\r\n { field: \"Name\", title: \"Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Security Layer Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ModifiedBy\", title: \"Modified By\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.parentToChildDataGridColumns = [\r\n { field: \"ParentObjectName\", title: \"Parent Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ParentObjectId\", title: \"Parent Object Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ParentObjectType\", title: \"Parent Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ChildObjectName\", title: \"Child Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ChildObjectId\", title: \"Child Object Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ChildObjectType\", title: \"Child Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Action\", title: \"Action\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ModifiedBy\", title: \"Modified By\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.parentToObjectDataGridColumns = [\r\n { field: \"ParentObjectName\", title: \"Parent Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ParentObjectId\", title: \"Parent Object Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ParentObjectType\", title: \"Parent Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ChildObjectName\", title: \"Child Object Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ChildObjectId\", title: \"Child Object Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ChildObjectType\", title: \"Child Object Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Read\", title: \"Read\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Update\", title: \"Update\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Create\", title: \"Create\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Delete\", title: \"Delete\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Invoke\", title: \"Invoke\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ModifiedBy\", title: \"Modified By\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.removedSecurityLayersDataGridColumns = [\r\n { field: \"Name\", title: \"Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"SystemName\", title: \"System Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Security Layer Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"ModifiedBy\", title: \"Modified By\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n function exportSimulationChanges() {\r\n vm.pleaseWait = new createSpinner();\r\n AXSecurityDesignerService.exportSimulationChanges(sim).then(response => {\r\n helperService.successfulSaveButton(vm.pleaseWait);\r\n }).catch(response => {\r\n vm.pleaseWait.loadingValue = false;\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport NewAXSecurityModelModalController from \"./NewAXSecurityModelModal.controller\";\r\nimport PartialAXSecurityDesignerChangesModalController from \"../PartialAXSecurityDesignerChangesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, AXSecurityDesignerService, $filter, $location, helperService, errorsDataService) {\r\n\r\n $scope.itemsPerPage = 4;\r\n $scope.currentPage = 1;\r\n\r\n const vm = this;\r\n\r\n vm.filterSecurityModels = filterSecurityModels;\r\n vm.publishSimulation = publishSimulation;\r\n vm.deleteSimulation = deleteSimulation;\r\n vm.viewDetails = viewDetails;\r\n vm.createRiskAnalysis = createRiskAnalysis;\r\n vm.preselectSimulationNavigateToPage = preselectSimulationNavigateToPage;\r\n vm.changePublic = changePublic;\r\n vm.openAXNewSecurityModelModal = openAXNewSecurityModelModal;\r\n vm.openAXSecurityDesignerChanges = openAXSecurityDesignerChanges;\r\n vm.checkForSimulationModifications = checkForSimulationModifications;\r\n vm.sortSecurityModels = sortSecurityModels;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getSimulations();\r\n await filterSecurityModels();\r\n await sortSecurityModels(vm.sortMethod);\r\n await checkForSimulationModifications();\r\n }\r\n\r\n $scope.$on('RiskAnalysis', () => activate());\r\n $scope.$on('PublishSecurityDesignerChanges', () => activate());\r\n\r\n function filterSecurityModels(num) {\r\n\r\n vm.activeModels = [];\r\n vm.deployedModels = [];\r\n\r\n vm.activeModels = vm.securityModels.filter(m => m.Status !== 'Deployed');\r\n vm.deployedModels = vm.securityModels.filter(m => m.Status === 'Deployed');\r\n\r\n if (num === 0) vm.filteredModels = vm.activeModels;\r\n else if (num === 1) vm.filteredModels = vm.deployedModels;\r\n\r\n else if (!num) {\r\n if (vm.activeModels.length > 0) {\r\n vm.toggle = 0;\r\n vm.filteredModels = vm.activeModels;\r\n } else {\r\n vm.toggle = 1;\r\n vm.filteredModels = vm.deployedModels;\r\n }\r\n }\r\n vm.filteredCount = vm.filteredModels.length;\r\n }\r\n\r\n async function publishSimulation(sim) {\r\n\r\n let postBody = { \"SimulationId\": sim.Id };\r\n\r\n try {\r\n await swal(helperService.areYouSureParams('Publish Security Model', 'Are you sure you want to publish this security model to your Dynamics 365 environment?', 'Publish'));\r\n sim.pleaseWait = true;\r\n AXSecurityDesignerService.publishSimulation(sim.Id, postBody);\r\n } catch(_) {\r\n return;\r\n }\r\n }\r\n\r\n function sortSecurityModels(num) {\r\n if (num === 1) {\r\n vm.filteredModels = $filter('orderBy')(vm.filteredModels, 'Name');\r\n } else if (num === 2) {\r\n vm.filteredModels = $filter('orderBy')(vm.filteredModels, '-Name');\r\n } else if (num === 3) {\r\n vm.filteredModels = $filter('orderBy')(vm.filteredModels, 'DateLastModified');\r\n } else if (num === 4) {\r\n vm.filteredModels = $filter('orderBy')(vm.filteredModels, '-DateLastModified');\r\n } else if (!num) {\r\n vm.filteredModels = $filter('orderBy')(vm.filteredModels, 'Name');\r\n }\r\n }\r\n\r\n function viewDetails(dataItem) {\r\n $location.path('/SecurityDesigner/Dynamics365forFinanceandSupplyChainSimulationDetails').search({\r\n SimulationId: dataItem.Id\r\n });\r\n }\r\n\r\n function createRiskAnalysis(dataItem) {\r\n\r\n dataItem.Status = \"Analyzing\";\r\n let postBody = { SimulationId: dataItem.Id };\r\n\r\n AXSecurityDesignerService.createRiskAnalysis(dataItem.Id, postBody);\r\n }\r\n\r\n async function getSimulations() {\r\n try {\r\n let response = await AXSecurityDesignerService.getSimulations();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.securityModels = response.data;\r\n vm.securityModels = vm.securityModels.map(model => { model.toggleInfo = false; return model; });\r\n filterSecurityModels(vm.toggle);\r\n } catch(err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n async function checkForSimulationModifications() {\r\n for (const sim of vm.securityModels) {\r\n try{\r\n let response = await AXSecurityDesignerService.viewChanges(sim);\r\n //check for new roles, duties, or privileges created\r\n if (response.data.CreatedSecurityLayers.length > 0) {\r\n response.data.CreatedSecurityLayers.forEach(creation => {\r\n\r\n if (creation.Type === 'Role' && sim.Status !== 'Deployed') {\r\n sim.modifiedRoles = true;\r\n } else if (creation.Type === 'Duty' && sim.Status !== 'Deployed') {\r\n sim.modifiedDuties = true;\r\n } else if (creation.Type === 'Privilege' && sim.Status !== 'Deployed') {\r\n sim.modifiedPrivileges = true;\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n //check for toggling changes made\r\n if (response.data.ParentToChild.length > 0) {\r\n response.data.ParentToChild.forEach(change => {\r\n\r\n if (change.ParentObjectType === 'Role' && sim.Status !== 'Deployed') {\r\n sim.modifiedRoles = true;\r\n } else if (change.ParentObjectType === 'Duty' && sim.Status !== 'Deployed') {\r\n sim.modifiedDuties = true;\r\n } else if (change.ParentObjectType === 'Privilege' && sim.Status !== 'Deployed') {\r\n sim.modifiedPrivileges = true;\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n //check for dropdown modifying changes made\r\n if (response.data.ParentToObject.length > 0) {\r\n response.data.ParentToObject.forEach(change => {\r\n\r\n if (change.ParentObjectType === 'Role' && sim.Status !== 'Deployed') {\r\n sim.modifiedRoles = true;\r\n } else if (change.ParentObjectType === 'Duty' && sim.Status !== 'Deployed') {\r\n sim.modifiedDuties = true;\r\n } else if (change.ParentObjectType === 'Privilege' && sim.Status !== 'Deployed') {\r\n sim.modifiedPrivileges = true;\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n //check for any removed security layers\r\n if (response.data.RemovedSecurityLayers.length > 0) {\r\n response.data.RemovedSecurityLayers.forEach(removal => {\r\n\r\n if (removal.Type === 'Role' && sim.Status !== 'Deployed') {\r\n sim.modifiedRoles = true;\r\n } else if (removal.Type === 'Duty' && sim.Status !== 'Deployed') {\r\n sim.modifiedDuties = true;\r\n } else if (removal.Type === 'Privilege' && sim.Status !== 'Deployed') {\r\n sim.modifiedPrivileges = true;\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n } catch(_) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n function preselectSimulationNavigateToPage(simulation, page) {\r\n localStorage.setItem(\"LastSelectedAX7SecurityModel\", simulation.Id);\r\n $location.path('/SecurityDesigner/Place/Dynamics365forFinanceandSupplyChain' + page);\r\n }\r\n\r\n async function changePublic(simulation, boolValue) {\r\n\r\n simulation.IsPublic = boolValue;\r\n\r\n let putBody = {\r\n \"Id\": simulation.Id,\r\n \"Name\": simulation.Name,\r\n \"IsPublic\": boolValue\r\n };\r\n\r\n try {\r\n await AXSecurityDesignerService.changePublic(simulation.Id, putBody);\r\n } catch(_) {\r\n simulation.IsPublic = !boolValue;\r\n }\r\n }\r\n\r\n async function deleteSimulation(simulation) { \r\n try {\r\n await swal(helperService.areYouSureParams('Delete Security Model', 'Are you sure you want to delete the ' + simulation.Name + ' security model?', 'Delete'));\r\n simulation.pleaseWait = true;\r\n await AXSecurityDesignerService.deleteSimulation(simulation.Id);\r\n simulation.pleaseWait = false;\r\n activate();\r\n } catch {\r\n simulation.pleaseWait = false;\r\n }\r\n }\r\n\r\n function openAXNewSecurityModelModal() {\r\n let modal = $uibModal.open({\r\n templateUrl: 'App/Components/AXSecurityDesigner/SecurityModels/NewAXSecurityModelModal.html',\r\n controller: NewAXSecurityModelModalController,\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n modal.result\r\n .then(_ => { activate(); });\r\n }\r\n\r\n function openAXSecurityDesignerChanges(simulationModel) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/PartialAXSecurityDesignerChanges.html',\r\n controller: PartialAXSecurityDesignerChangesModalController,\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n sim: () => simulationModel\r\n },\r\n size: 'lg'\r\n });\r\n\r\n }\r\n\r\n}\r\n","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, AXSecurityDesignerService, errorsDataService, $http, $location, helperService) {\r\n\r\n var vm = $scope.vm = {};\r\n var sim = $scope.sim = {};\r\n\r\n $scope.helperService = helperService;\r\n $scope.isCollapsed = true;\r\n $scope.pageParams = $location.search();\r\n $scope.selectedDetailView = null;\r\n\r\n vm.exportSimulationAnalysis = exportSimulationAnalysis;\r\n\r\n var statusColumn = { title: \"Status\", field: \"Status\", width: 125, filterable: customAutoCompleteFilter, template: '{{dataItem.Status}}' };\r\n\r\n $scope.changeSelectedView = function (view) {\r\n $scope.selectedDetailView = view;\r\n };\r\n\r\n function getRoleLicenses() {\r\n\r\n $scope.roleLicenses_dataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.pageParams.SimulationId + '/analysis/roleLicenses').then(function (response) {\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"Role ID\", field: \"RoleId\", filterable: customAutoCompleteFilter },\r\n { title: \"Role Name\", field: \"RoleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Current License\", field: \"CurrentLicense\", filterable: customAutoCompleteFilter },\r\n { title: \"New License\", field: \"SimulationLicense\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n $scope.roleLicenses_gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.roleLicenses_gridOptions.selectable = false;\r\n\r\n }\r\n\r\n function getUserLicenses() {\r\n\r\n $scope.userLicenses_dataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.pageParams.SimulationId + '/analysis/userLicenses').then(function (response) {\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"User ID\", field: \"UserId\", filterable: customAutoCompleteFilter },\r\n { title: \"User Name\", field: \"UserName\", filterable: customAutoCompleteFilter },\r\n { title: \"Current License\", field: \"CurrentLicense\", filterable: customAutoCompleteFilter },\r\n { title: \"New License\", field: \"SimulationLicense\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n $scope.userLicenses_gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.userLicenses_gridOptions.selectable = false;\r\n\r\n }\r\n\r\n function getRoleRisks() {\r\n\r\n $scope.roleRisks_dataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.pageParams.SimulationId + '/analysis/rolerisks').then(function (response) {\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"Role Name\", field: \"RoleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk ID\", field: \"RiskId\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Type\", field: \"RiskType\", filterable: customAutoCompleteFilter }\r\n ];\r\n columns.push(statusColumn);\r\n\r\n $scope.roleRisks_gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.roleRisks_gridOptions.selectable = false;\r\n\r\n }\r\n\r\n function getRoleBusinessProcess() {\r\n\r\n $scope.roleBusinessProcess_dataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.pageParams.SimulationId + '/analysis/rolebpaccess').then(function (response) {\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"Role Name\", field: \"RoleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Object Name\", field: \"BusinessProcessName\", filterable: customAutoCompleteFilter }\r\n ];\r\n columns.push(statusColumn);\r\n\r\n $scope.roleBusinessProcess_gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.roleBusinessProcess_gridOptions.selectable = false;\r\n\r\n }\r\n\r\n function getUserRisks() {\r\n\r\n $scope.userRisks_dataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.pageParams.SimulationId + '/analysis/userrisks').then(function (response) {\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"User Name\", field: \"UserName\", filterable: customAutoCompleteFilter },\r\n { title: \"Company Name\", field: \"CompanyName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk ID\", field: \"RiskId\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Type\", field: \"RiskType\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n columns.push(statusColumn);\r\n\r\n $scope.userRisks_gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.userRisks_gridOptions.selectable = false;\r\n\r\n }\r\n\r\n function getUserBusinssProcess() {\r\n\r\n $scope.userBusinessProcess_dataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.pageParams.SimulationId + '/analysis/userbpaccess').then(function (response) {\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n });\r\n\r\n }\r\n }\r\n });\r\n\r\n var columns = [\r\n { title: \"User Name\", field: \"UserName\", filterable: customAutoCompleteFilter },\r\n { title: \"Company Name\", field: \"CompanyName\", filterable: customAutoCompleteFilter },\r\n { title: \"Object Name\", field: \"BusinessProcessName\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n columns.push(statusColumn);\r\n\r\n $scope.userBusinessProcess_gridOptions = helperService.setMainGridOptions(columns, null);\r\n $scope.userBusinessProcess_gridOptions.selectable = false;\r\n\r\n }\r\n\r\n vm.statisticsLoading = true;\r\n\r\n function getStatistics() {\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + $scope.pageParams.SimulationId + '/analysis/statistics').then(function (response) {\r\n vm.statisticsLoading = false;\r\n vm.selectedSimulationStatistics = response.data;\r\n }, function errorCallback(response) {\r\n vm.statisticsLoading = false;\r\n });\r\n\r\n }\r\n\r\n vm.loadingChanges = true;\r\n if ($scope.pageParams.SimulationId) {\r\n $http.get(apiUrl + 'api/securitydesigner/simulation/' + $scope.pageParams.SimulationId).then(function (response) {\r\n vm.selectedSimulation = response.data;\r\n if (vm.selectedSimulation.ProductId === 'AX7') {\r\n vm.selectedSimulation.ProductName = 'Dynamics 365 for Finance and Supply Chain';\r\n }\r\n vm.selectedSimulation.toggleInfo = false;\r\n\r\n getStatistics();\r\n\r\n getRoleLicenses();\r\n getUserLicenses();\r\n\r\n getRoleRisks();\r\n getRoleBusinessProcess();\r\n\r\n getUserRisks();\r\n getUserBusinssProcess();\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/simulation/' + $scope.pageParams.SimulationId + '/changes').then(function (response) {\r\n\r\n AXSecurityDesignerService.changeActionVerbiage(response.data);\r\n\r\n sim.SimulationChanges = response.data;\r\n vm.loadingChanges = false;\r\n }, function errorCallback(response) {\r\n vm.loadingChanges = false;\r\n });\r\n\r\n }, function errorCallback(response) {\r\n vm.loadingChanges = false;\r\n });\r\n }\r\n\r\n $scope.determineLabelClass = function (ActionName) {\r\n return AXSecurityDesignerService.determineLabelClass(ActionName);\r\n };\r\n\r\n function exportSimulationAnalysis() {\r\n vm.pleaseWait = new createSpinner();\r\n AXSecurityDesignerService.exportSimulationAnalysis(vm.selectedSimulation).then(response => {\r\n helperService.successfulSaveButton(vm.pleaseWait);\r\n }).catch(response => {\r\n vm.pleaseWait.loadingValue = false;\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n}\r\n","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, taskRecordingDataService, productType) {\r\n\r\n var vm = this;\r\n vm.productType = productType;\r\n\r\n vm.cancel = cancel;\r\n vm.importRecording = importRecording;\r\n vm.filterName = filterName;\r\n\r\n async function importRecording(files) {\r\n\r\n\r\n var fd = new FormData();\r\n\r\n if (files.length === 1) {\r\n fd.append(\"Name\", vm.updatedFileName);\r\n fd.append(\"TaskRecordings\", files[0].file);\r\n } else if (files.length > 1) {\r\n files.forEach(f => {\r\n // Name is taken care of on the back-end\r\n fd.append(\"Name\", \" \");\r\n fd.append(\"TaskRecordings\", f.file);\r\n });\r\n }\r\n\r\n vm.disableSubmit = true;\r\n vm.pleaseWait = new createSpinner();\r\n\r\n try {\r\n let response = await taskRecordingDataService.importTaskRecording(productType, fd);\r\n vm.killModal = true;\r\n vm.pleaseWait.loadingValue = false;\r\n let newTaskRecordingId = response.data;\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close(newTaskRecordingId);\r\n } catch {\r\n vm.disableSubmit = false;\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n function filterName(files) {\r\n // Split the file name at the . and take the first chunk\r\n vm.updatedFileName = files[0].file.name.split('.')[0];\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModalInstance, helperService, taskRecordingDataService, productType, taskRecording) {\r\n\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.exportMenuItems = exportMenuItems;\r\n\r\n function activate() {\r\n getMenuItems();\r\n }\r\n\r\n activate();\r\n\r\n function getMenuItems() {\r\n taskRecordingDataService.getMenuItems(productType, taskRecording.Id).then(response => {\r\n vm.menuItemsList = response.data;\r\n vm.menuItemsList = $filter('orderBy')(vm.menuItemsList, 'ObjectLabel');\r\n });\r\n }\r\n\r\n function exportMenuItems() {\r\n vm.exportInProgress = new createSpinner();\r\n taskRecordingDataService.exportMenuItems(productType, taskRecording.Id)\r\n .then(response => {\r\n helperService.successfulSaveButton(vm.exportInProgress);\r\n vm.exportInProgress.loadingValue = false;\r\n }).catch(response => {\r\n vm.exportInProgress.loadingValue = false;\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, taskRecordingDataService, productType, taskRecording) {\r\n\r\n const vm = this;\r\n\r\n vm.oldName = taskRecording.Name;\r\n vm.name = taskRecording.Name;\r\n vm.cancel = cancel;\r\n vm.renameTaskRecording = renameTaskRecording;\r\n\r\n async function renameTaskRecording() {\r\n\r\n vm.pleaseWait = new createSpinner();\r\n\r\n let data = {\r\n \"Id\": taskRecording.Id,\r\n \"Name\": vm.name\r\n };\r\n\r\n try {\r\n await taskRecordingDataService.renameTaskRecording(productType, taskRecording.Id, data);\r\n vm.killModal = true;\r\n vm.pleaseWait.loadingValue = false;\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.disableSubmit = false;\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($route, $filter, $uibModalInstance, helperService, errorsDataService, taskRecordingDataService, AXSecurityDesignerService, dataObject, missingItemsArray) {\r\n\r\n const vm = this;\r\n\r\n vm.missingItemsArray = missingItemsArray;\r\n vm.showExistingSecurityModelView = showExistingSecurityModelView;\r\n vm.showNewSecurityModelView = showNewSecurityModelView;\r\n vm.addMissingMenuItemsToExistingSecurityModel = addMissingMenuItemsToExistingSecurityModel;\r\n vm.addMissingMenuItemsToNewSecurityModel = addMissingMenuItemsToNewSecurityModel;\r\n vm.cancel = cancel;\r\n\r\n function activate() {\r\n getSimulations();\r\n }\r\n\r\n activate();\r\n\r\n function getSimulations() {\r\n vm.gettingSimulations = true;\r\n AXSecurityDesignerService.getSimulations().then(response => {\r\n vm.gettingSimulations = false;\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.availableSimulations = response.data;\r\n }).catch(response => {\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n function showExistingSecurityModelView() {\r\n\r\n vm.editSecurityModel = true;\r\n vm.createSecurityModel = false;\r\n\r\n vm.newSecurityModelIconFaded = true;\r\n vm.existingSecurityModelIconFaded = false;\r\n }\r\n\r\n function showNewSecurityModelView() {\r\n\r\n vm.editSecurityModel = false;\r\n vm.createSecurityModel = true;\r\n\r\n vm.newSecurityModelIconFaded = false;\r\n vm.existingSecurityModelIconFaded = true;\r\n }\r\n\r\n function addMissingMenuItemsToExistingSecurityModel() {\r\n\r\n vm.editingSecurityModel = new createSpinner();\r\n\r\n let data = {\r\n SimulationId: vm.selectedSimulation.Id,\r\n TaskRecordingId: dataObject.TaskRecordingId,\r\n SecurityLayerName: dataObject.SecurityLayerName,\r\n LayerType: dataObject.LayerType,\r\n ObjectsToAdd: dataObject.ObjectsToAdd\r\n };\r\n\r\n taskRecordingDataService.addMissingMenuItems(vm.selectedSimulation.ProductId, data.SimulationId, data).then(async response => {\r\n vm.killModal = true;\r\n vm.editingSecurityModel.loadingValue = false;\r\n await helperService.successfulSaveButton(vm.editingSecurityModel).then(result => {\r\n $uibModalInstance.close();\r\n $route.reload();\r\n });\r\n }).catch(response => {\r\n vm.disableSubmit = false;\r\n vm.editingSecurityModel.loadingValue = false;\r\n });\r\n }\r\n\r\n function addMissingMenuItemsToNewSecurityModel() {\r\n\r\n vm.addingSecurityModel = new createSpinner();\r\n\r\n let newSecurityModelFormData = {\r\n \"Name\": vm.newSecurityModelName,\r\n \"ProductId\": \"AX7\"\r\n };\r\n\r\n taskRecordingDataService.createNewSecurityModel(newSecurityModelFormData).then(response => {\r\n\r\n vm.newSecurityModelId = response.data;\r\n\r\n vm.completeObject = {\r\n SimulationId: vm.newSecurityModelId,\r\n TaskRecordingId: dataObject.TaskRecordingId,\r\n SecurityLayerName: dataObject.SecurityLayerName,\r\n LayerType: dataObject.LayerType,\r\n ObjectsToAdd: dataObject.ObjectsToAdd\r\n };\r\n\r\n }).then(_ => {\r\n taskRecordingDataService.addMissingMenuItems(newSecurityModelFormData.ProductId, vm.newSecurityModelId, vm.completeObject).then(async response => {\r\n vm.killModal = true;\r\n vm.addingSecurityModel.loadingValue = false;\r\n await helperService.successfulSaveButton(vm.addingSecurityModel).then(result => {\r\n $uibModalInstance.close();\r\n $route.reload();\r\n });\r\n });\r\n }).catch(response => {\r\n errorsDataService.catch(response);\r\n vm.disableSubmit = false;\r\n vm.addingSecurityModel.loadingValue = false;\r\n });\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport importTaskRecordingModalController from \"./importTaskRecordingModal.controller\";\r\nimport viewMenuItemsModalController from \"./viewMenuItemsModal.controller\";\r\nimport renameTaskRecordingModalController from \"./renameTaskRecordingModal.controller\";\r\nimport addMissingMenuItemsModalController from \"./addMissingMenuItemsModal.controller\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $route, objectIdDataService, $uibModal, helperService, taskRecordingDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.openImportTaskRecordingModal = openImportTaskRecordingModal;\r\n vm.getSelectedTaskRecordingOverview = getSelectedTaskRecordingOverview;\r\n vm.selectedSecurityTypeDropdownChange = selectedSecurityTypeDropdownChange;\r\n vm.getSelectedSecurityLayerTypeItemDetails = getSelectedSecurityLayerTypeItemDetails;\r\n vm.addMissingMenuItems = addMissingMenuItems;\r\n vm.openAddMissingMenuItemsModal = openAddMissingMenuItemsModal;\r\n vm.accessTypeForAddingFirst = accessTypeForAddingFirst;\r\n vm.selectAllTaskRecordings = selectAllTaskRecordings;\r\n vm.selectTaskRecording = selectTaskRecording;\r\n vm.deleteSelectedTaskRecordings = deleteSelectedTaskRecordings;\r\n\r\n vm.selectedTaskRecordings = [];\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'View Menu Items',\r\n click: item => {\r\n openViewMenuItemsModal(item.taskRecording);\r\n }\r\n },\r\n {\r\n text: 'Change Name',\r\n click: item => {\r\n openRenameTaskRecordingModal(item.taskRecording);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n deleteTaskRecording(item.taskRecording);\r\n }\r\n }\r\n ];\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.productType = await getProductType();\r\n getTaskRecordings();\r\n }\r\n\r\n async function getProductType() {\r\n let objectId = await objectIdDataService.getObjectID();\r\n return helperService.getSecurityObjectDetailsFromObjectId(objectId).ProductType;\r\n }\r\n\r\n async function getTaskRecordings(newTaskRecordingId) {\r\n let response = await taskRecordingDataService.getTaskRecordings(vm.productType);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n if (newTaskRecordingId) {\r\n let newTaskRecording = response.data.find(tr => tr.Id === newTaskRecordingId);\r\n response.data = response.data.filter(i => i.Id !== newTaskRecording.Id);\r\n response.data.unshift(newTaskRecording);\r\n vm.taskRecordingsDataSource = response.data;\r\n vm.selectedTaskRecording = newTaskRecording;\r\n getSelectedTaskRecordingOverview(newTaskRecording);\r\n } else {\r\n vm.taskRecordingsDataSource = response.data;\r\n }\r\n }\r\n\r\n async function getSelectedTaskRecordingOverview(taskRecording) {\r\n vm.selectedSecurityType = null;\r\n vm.securityLayerItem = null;\r\n vm.selectedTaskRecording = taskRecording;\r\n\r\n if (taskRecording) {\r\n vm.taskRecordingInProgress = true;\r\n\r\n getMenuItems();\r\n\r\n try {\r\n let response = await taskRecordingDataService.getSelectedTaskRecordingOverview(vm.productType, taskRecording.Id);\r\n vm.selectedSecurityObjects = response.data;\r\n vm.selectedSecurityObjects = $filter('orderBy')(vm.selectedSecurityObjects, ['-Count', 'SecurityLayerLabel']);\r\n vm.selectedSecurityObjectsCopy = [...vm.selectedSecurityObjects];\r\n vm.taskRecordingInProgress = false;\r\n vm.availableSecurityTypes = [...new Set(vm.selectedSecurityObjects.map(item => item.SecurityLayerType))];\r\n } catch {\r\n vm.taskRecordingInProgress = false;\r\n }\r\n }\r\n }\r\n\r\n async function getMenuItems() {\r\n let response = await taskRecordingDataService.getMenuItems(vm.productType, vm.selectedTaskRecording.Id);\r\n vm.menuItemsList = response.data;\r\n vm.menuItemsList = $filter('orderBy')(vm.menuItemsList, 'ObjectLabel');\r\n }\r\n\r\n function selectedSecurityTypeDropdownChange() {\r\n vm.securityLayerItem = null;\r\n vm.selectedSecurityObjects = [];\r\n if (vm.selectedSecurityType) {\r\n vm.selectedSecurityObjects = vm.selectedSecurityObjectsCopy.filter(item => item.SecurityLayerType === vm.selectedSecurityType);\r\n } else {\r\n vm.selectedSecurityObjects = vm.selectedSecurityObjectsCopy;\r\n }\r\n }\r\n\r\n async function getSelectedSecurityLayerTypeItemDetails(securityLayerItem) {\r\n vm.securityLayerItemDetailsLoading = true;\r\n vm.securityLayerItem = securityLayerItem;\r\n let response = await taskRecordingDataService.getSelectedSecurityLayerTypeItemDetails(vm.productType, securityLayerItem.TaskRecordingId, securityLayerItem.SecurityLayerName, vm.selectedSecurityType);\r\n vm.securityLayerItemObjects = response.data;\r\n vm.securityLayerItemObjects = $filter('orderBy')(vm.securityLayerItemObjects, 'SecurityObjectLabel');\r\n vm.securityLayerItemObjects.forEach(object => {\r\n if (object.AccessType === 'None') {\r\n let matchingMenuItem = vm.menuItemsList.find(menuItem => getAccessTypeForAdding(menuItem, object));\r\n object.AccessTypeForAdding = matchingMenuItem.AccessType;\r\n }\r\n });\r\n vm.objectsToAdd = vm.securityLayerItemObjects.filter(object => object.AccessTypeForAdding);\r\n vm.securityLayerItemDetailsLoading = false;\r\n }\r\n\r\n function getAccessTypeForAdding(menuItem, object) {\r\n return menuItem.ObjectName.toLowerCase() === object.SecurityObjectName.toLowerCase() && menuItem.ObjectType.toLowerCase() === object.SecurityObjectType.toLowerCase();\r\n }\r\n\r\n function accessTypeForAddingFirst(arr) {\r\n return !arr.AccessTypeForAdding;\r\n }\r\n\r\n async function deleteTaskRecording(taskRecording) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Task Recording', `Are you sure you want to delete the ${taskRecording.Name} task recording?`, 'Delete'));\r\n await taskRecordingDataService.deleteTaskRecording(vm.productType, taskRecording.Id);\r\n if (taskRecording.Id === vm.selectedTaskRecording.Id) {\r\n vm.selectedTaskRecording = null;\r\n vm.selectedSecurityType = null;\r\n vm.securityLayerItem = null;\r\n }\r\n getTaskRecordings();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function addMissingMenuItems() {\r\n vm.missingMenuItems = vm.objectsToAdd.map(object => {\r\n return {\r\n AccessType: object.AccessTypeForAdding,\r\n SecurityObjectId: object.SecurityObjectName,\r\n SecurityObjectType: object.SecurityObjectType.replace(/\\s+/g, '') // Removes spaces from string.\r\n }\r\n });\r\n\r\n const data = {\r\n TaskRecordingId: vm.selectedTaskRecording.Id,\r\n SecurityLayerName: vm.securityLayerItem.SecurityLayerName,\r\n LayerType: vm.securityLayerItem.SecurityLayerType,\r\n ObjectsToAdd: vm.missingMenuItems\r\n };\r\n\r\n vm.partialDataObject = data;\r\n\r\n }\r\n\r\n async function openImportTaskRecordingModal() {\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/taskRecordingManager/importTaskRecordingModal.html',\r\n controller: importTaskRecordingModalController,\r\n controllerAs: 'itrmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n productType: () => vm.productType\r\n }\r\n });\r\n\r\n try {\r\n let newTaskRecordingId = await openModal.result;\r\n getTaskRecordings(newTaskRecordingId);\r\n } catch {\r\n openModal.close();\r\n }\r\n }\r\n\r\n function openViewMenuItemsModal(item) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/taskRecordingManager/viewMenuItemsModal.html',\r\n controller: viewMenuItemsModalController,\r\n controllerAs: 'vmivm',\r\n backdrop: 'static',\r\n resolve: {\r\n taskRecording: () => item,\r\n productType: () => vm.productType\r\n }\r\n });\r\n }\r\n\r\n async function openRenameTaskRecordingModal(item) {\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/taskRecordingManager/renameTaskRecordingModal.html',\r\n controller: renameTaskRecordingModalController,\r\n controllerAs: 'rtrmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n taskRecording: () => item,\r\n productType: () => vm.productType\r\n }\r\n });\r\n\r\n try {\r\n await openModal.result;\r\n getTaskRecordings();\r\n } catch {\r\n openModal.close();\r\n }\r\n }\r\n\r\n async function openAddMissingMenuItemsModal() {\r\n addMissingMenuItems();\r\n\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/taskRecordingManager/addMissingMenuItemsModal.html',\r\n controller: addMissingMenuItemsModalController,\r\n controllerAs: 'ammivm',\r\n backdrop: 'static',\r\n resolve: {\r\n dataObject: () => vm.partialDataObject,\r\n missingItemsArray: () => vm.objectsToAdd\r\n }\r\n });\r\n\r\n try {\r\n await openModal.result;\r\n $route.reload();\r\n } catch {\r\n openModal.close();\r\n }\r\n }\r\n\r\n function selectTaskRecording(recording) {\r\n // either remove or add the recording to the list of selected recordings\r\n if (recording.Selected) {\r\n vm.selectedTaskRecordings.push(recording);\r\n } else {\r\n vm.selectedTaskRecordings = vm.selectedTaskRecordings.filter(item => item.Id !== recording.Id);\r\n }\r\n vm.allRecordingsSelected = vm.selectedTaskRecordings.length === vm.taskRecordingsDataSource.length;\r\n }\r\n\r\n function selectAllTaskRecordings() {\r\n vm.taskRecordingsDataSource.forEach(taskRecording => {\r\n taskRecording.Selected = vm.allRecordingsSelected;\r\n });\r\n vm.selectedTaskRecordings = vm.allRecordingsSelected ? [...vm.taskRecordingsDataSource] : [];\r\n }\r\n\r\n async function deleteSelectedTaskRecordings() {\r\n vm.bulkDeletePending = new createSpinner();\r\n let selectedTaskRecordingIds, postBody;\r\n selectedTaskRecordingIds = vm.selectedTaskRecordings.map(taskRecording => taskRecording.Id);\r\n postBody = { \"TaskRecordingIds\": selectedTaskRecordingIds };\r\n try {\r\n await taskRecordingDataService.bulkDeleteTaskRecordings(vm.productType, postBody);\r\n vm.bulkDeletePending.loadingValue = false;\r\n await getTaskRecordings();\r\n vm.allRecordingsSelected = false;\r\n vm.selectAllTaskRecordings();\r\n vm.selectRecordingsMode = false;\r\n vm.selectedTaskRecording = null;\r\n vm.selectedSecurityType = null;\r\n } catch {\r\n vm.bulkDeletePending.loadingValue = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($http, $q, $filter, helperService, errorsDataService) {\r\n\r\n const factory = {\r\n populateSystemNameIfCustom,\r\n changeFilter,\r\n SetInitialModifiedValueElseChangeModified,\r\n determineLabelClass,\r\n DeleteModificationToObject,\r\n AssignChildToParent,\r\n AssignChildObjectToParent,\r\n setDataSourceDefaultsAndMapProperties,\r\n formRemoveSecurityLayerSentance,\r\n createTablesModalDataSource,\r\n changeActionVerbiage,\r\n getSimulations,\r\n viewChanges,\r\n exportSimulationChanges,\r\n exportSimulationAnalysis,\r\n createRiskAnalysis,\r\n publishSimulation,\r\n deleteSimulation,\r\n changePublic\r\n };\r\n\r\n return factory;\r\n\r\n function populateSystemNameIfCustom(data) {\r\n data.forEach(function (row) {\r\n if (row.IsCustom === true) {\r\n row.SystemName = row.Name;\r\n }\r\n });\r\n }\r\n\r\n function changeFilter(selectedFilter, dataSource, filterField) {\r\n if (selectedFilter === \"Changed\") {\r\n var selectedFilter = { field: filterField, operator: \"equalto\", value: true };\r\n dataSource.filter(selectedFilter);\r\n } else if (selectedFilter === \"Modified\") {\r\n var selectedFilter = { field: \"IsModified\", operator: \"equalto\", value: true };\r\n dataSource.filter(selectedFilter);\r\n } else {\r\n dataSource.filter({});\r\n }\r\n }\r\n\r\n function SetInitialModifiedValueElseChangeModified(dataItem) {\r\n if (typeof dataItem.InitialModifiedValue === 'undefined') {\r\n dataItem.InitialModifiedValue = dataItem.IsModified;\r\n dataItem.IsModified = !dataItem.IsModified;\r\n } else {\r\n dataItem.IsModified = !dataItem.IsModified;\r\n }\r\n }\r\n\r\n function determineLabelClass(ActionName) {\r\n if (ActionName === 'Modify') {\r\n return 'label-modify';\r\n } else if (ActionName === 'Add') {\r\n return 'label-add';\r\n } else if (ActionName === 'Remove' || ActionName === 'Delete') {\r\n return 'label-remove';\r\n }\r\n }\r\n\r\n function DeleteModificationToObject(dataItem, selectedSimulation, objectOpenInModal, securityLayerType) {\r\n\r\n var deferred = $q.defer();\r\n\r\n $http.get(apiUrl + 'api/securitydesigner/ax7/simulation/' + selectedSimulation.Id + '/securityobjectassociations').then(function (response) {\r\n var modification = response.data.filter(e => e.ChildObjectId.toLowerCase() === dataItem.Name.toLowerCase() && e.ParentObjectId.toLowerCase() === objectOpenInModal.SystemName.toLowerCase())[0];\r\n\r\n if (modification) {\r\n $http.delete(apiUrl + 'api/securitydesigner/ax7/simulation/securityobjectassociations/' + modification.Id).then(function (response) {\r\n var selectedSecurityLayer = objectOpenInModal[securityLayerType].filter(e => e.SystemName.toLowerCase() === dataItem.Name.toLowerCase())[0];\r\n\r\n selectedSecurityLayer.Create = dataItem.Create = selectedSecurityLayer.OldCreate || 'Unset';\r\n selectedSecurityLayer.Delete = dataItem.Delete = selectedSecurityLayer.OldDelete || 'Unset';\r\n selectedSecurityLayer.Invoke = dataItem.Invoke = selectedSecurityLayer.OldInvoke || 'Unset';\r\n selectedSecurityLayer.Read = dataItem.Read = selectedSecurityLayer.OldRead || 'Unset';\r\n selectedSecurityLayer.Update = dataItem.Update = selectedSecurityLayer.OldUpdate || 'Unset';\r\n selectedSecurityLayer.IsModified = dataItem.IsModified = false;\r\n\r\n if (securityLayerType === \"Tables\" || securityLayerType === \"MenuItems\" || securityLayerType === \"DataEntities\") {\r\n if (selectedSecurityLayer.OldCreate === 'Unset' && selectedSecurityLayer.OldDelete === 'Unset' && selectedSecurityLayer.OldInvoke === 'Unset' && selectedSecurityLayer.OldRead === 'Unset' && selectedSecurityLayer.OldUpdate === 'Unset') {\r\n objectOpenInModal[securityLayerType].remove(selectedSecurityLayer);\r\n } else if (selectedSecurityLayer.OldCreate || selectedSecurityLayer.OldDelete || selectedSecurityLayer.OldInvoke || selectedSecurityLayer.OldRead || selectedSecurityLayer.OldUpdate) {\r\n //Do nothing\r\n } else {\r\n objectOpenInModal[securityLayerType].remove(selectedSecurityLayer);\r\n }\r\n\r\n if (dataItem.Create !== 'Unset' || dataItem.Delete !== 'Unset' || dataItem.Read !== 'Unset' || dataItem.Update !== 'Unset') {\r\n dataItem.ContainsAssigningValue = true;\r\n } else {\r\n dataItem.ContainsAssigningValue = false;\r\n }\r\n } else if (securityLayerType === \"ServiceOperations\") {\r\n if (selectedSecurityLayer.OldInvoke === 'Unset') {\r\n objectOpenInModal[securityLayerType].remove(selectedSecurityLayer);\r\n } else if (selectedSecurityLayer.OldInvoke) {\r\n //Do nothing\r\n } else {\r\n objectOpenInModal[securityLayerType].remove(selectedSecurityLayer);\r\n }\r\n\r\n if (dataItem.Invoke !== 'Unset') {\r\n dataItem.ContainsAssigningValue = true;\r\n } else {\r\n dataItem.ContainsAssigningValue = false;\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n }, function errorCallback(response) {\r\n deferred.reject();\r\n });\r\n }\r\n }, function errorCallback(response) {\r\n deferred.reject();\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function AssignChildToParent({ SimulationId, ChildItem, ChildType, ParentItem, ParentType, Action }) {\r\n\r\n var postData = {\r\n \"SimulationId\": SimulationId,\r\n \"ParentChildAssociation\": [\r\n {\r\n \"ParentObjectId\": ParentItem.SystemName || ParentItem.Name,\r\n \"ParentObjectType\": ParentType,\r\n \"ParentIsCustom\": ParentItem.IsCustom,\r\n\r\n \"ChildObjectId\": ChildItem.SystemName || ChildItem.Name,\r\n \"ChildObjectType\": ChildType,\r\n \"ChildIsCustom\": ChildItem.IsCustom,\r\n\r\n \"Action\": Action\r\n }\r\n ]\r\n };\r\n\r\n $http.post(apiUrl + 'api/securitydesigner/ax7/simulation/' + SimulationId + '/securitylayerassociations', postData).then(function successCallback(response) {\r\n return;\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n\r\n async function AssignChildObjectToParent({ SimulationId, ChildItem, ChildType, ParentItem, ParentType }) {\r\n\r\n var postData = {\r\n \"SimulationId\": SimulationId,\r\n \"ParentObjectAssociation\": [\r\n {\r\n \"ParentObjectId\": ParentItem.SystemName,\r\n \"ParentObjectType\": ParentType,\r\n \"ParentIsCustom\": ParentItem.IsCustom,\r\n\r\n \"ChildObjectId\": ChildItem.SystemName,\r\n \"ChildObjectType\": ChildType,\r\n\r\n \"OldRead\": ChildItem.OldRead,\r\n \"OldUpdate\": ChildItem.OldUpdate,\r\n \"OldCreate\": ChildItem.OldCreate,\r\n \"OldDelete\": ChildItem.OldDelete,\r\n \"OldInvoke\": ChildItem.OldInvoke,\r\n\r\n \"Read\": ChildItem.Read,\r\n \"Update\": ChildItem.Update,\r\n \"Create\": ChildItem.Create,\r\n \"Delete\": ChildItem.Delete,\r\n \"Invoke\": ChildItem.Invoke\r\n }\r\n ]\r\n };\r\n\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/ax7/simulation/${SimulationId}/securityobjectassociations`, postData)\r\n } catch ({ data: error }) {\r\n helperService.showErrorMessage(error);\r\n }\r\n }\r\n\r\n function setDataSourceDefaultsAndMapProperties(array, currentItems, menuItems) {\r\n array.forEach(function (row) {\r\n row.Create = 'Unset';\r\n row.Delete = 'Unset';\r\n row.Read = 'Unset';\r\n row.Update = 'Unset';\r\n row.Invoke = 'Unset';\r\n row.IsModified = false;\r\n });\r\n\r\n array.forEach(function (row) {\r\n\r\n for (var i = 0; i < currentItems.length; i++) {\r\n if (menuItems) {\r\n if (row.Name.toLowerCase() === currentItems[i].SystemName.toLowerCase() && row.Type === currentItems[i].Type) {\r\n row.Create = currentItems[i].Create;\r\n row.Delete = currentItems[i].Delete;\r\n row.Invoke = currentItems[i].Invoke;\r\n row.IsModified = currentItems[i].IsModified;\r\n row.OldCreate = currentItems[i].OldCreate;\r\n row.OldDelete = currentItems[i].OldDelete;\r\n row.OldInvoke = currentItems[i].OldInvoke;\r\n row.OldRead = currentItems[i].OldRead;\r\n row.OldUpdate = currentItems[i].OldUpdate;\r\n row.Read = currentItems[i].Read;\r\n row.SystemName = currentItems[i].SystemName;\r\n row.Update = currentItems[i].Update;\r\n row.Type = currentItems[i].Type;\r\n break;\r\n }\r\n } else {\r\n if (row.Name.toLowerCase() === currentItems[i].SystemName.toLowerCase()) {\r\n row.Create = currentItems[i].Create;\r\n row.Delete = currentItems[i].Delete;\r\n row.Invoke = currentItems[i].Invoke;\r\n row.IsModified = currentItems[i].IsModified;\r\n row.OldCreate = currentItems[i].OldCreate;\r\n row.OldDelete = currentItems[i].OldDelete;\r\n row.OldInvoke = currentItems[i].OldInvoke;\r\n row.OldRead = currentItems[i].OldRead;\r\n row.OldUpdate = currentItems[i].OldUpdate;\r\n row.Read = currentItems[i].Read;\r\n row.SystemName = currentItems[i].SystemName;\r\n row.Update = currentItems[i].Update;\r\n row.Type = currentItems[i].Type;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function formRemoveSecurityLayerSentance(data, securityLayerType) {\r\n if (securityLayerType === 1) {\r\n var message = 'Are you sure you want to remove this role?';\r\n\r\n if (data.Roles.length > 0) {\r\n message = 'This role is a sub-role of the following roles: ';\r\n data.Roles.forEach(function (row) {\r\n message = message + row + ', ';\r\n });\r\n message = message.slice(0, -2);\r\n message = message + '. Are you sure you want to remove this role?';\r\n }\r\n } else if (securityLayerType === 2) {\r\n var message = 'Are you sure you want to remove this duty?';\r\n\r\n if (data.Roles.length > 0) {\r\n message = 'This duty belongs to the following roles: ';\r\n data.Roles.forEach(function (row) {\r\n message = message + row + ', ';\r\n });\r\n message = message.slice(0, -2);\r\n message = message + '. Are you sure you want to remove this duty?';\r\n }\r\n } else if (securityLayerType === 3) {\r\n var message = 'Are you sure you want to remove this privilege?';\r\n var dutiesMessage = '';\r\n var rolesMessage = '';\r\n\r\n if (data.Duties.length > 0) {\r\n dutiesMessage = 'This privilege belongs to the following duties: ';\r\n data.Duties.forEach(function (row) {\r\n dutiesMessage = dutiesMessage + row + ', ';\r\n });\r\n dutiesMessage = dutiesMessage.slice(0, -2);\r\n dutiesMessage = dutiesMessage + '. ';\r\n }\r\n\r\n if (data.Roles.length > 0) {\r\n rolesMessage = 'This privilege belongs to the following roles: ';\r\n data.Roles.forEach(function (row) {\r\n rolesMessage = rolesMessage + row + ', ';\r\n });\r\n rolesMessage = rolesMessage.slice(0, -2);\r\n rolesMessage = rolesMessage + '. ';\r\n }\r\n\r\n message = rolesMessage + dutiesMessage + 'Are you sure you want to remove this privilege?';\r\n\r\n }\r\n return message;\r\n }\r\n\r\n function createTablesModalDataSource(item, vm) {\r\n var currentItems = item.Tables;\r\n\r\n\r\n var columns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter, width: 200 },\r\n { title: \"Label\", field: \"Label\", filterable: customAutoCompleteFilter, width: 200 },\r\n { title: \"Read\", field: \"Read\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Update\", field: \"Update\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Create\", field: \"Create\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"Delete\", field: \"Delete\", template: ``, filterable: customAutoCompleteFilter },\r\n { title: \"ContainsAssigningValue\", field: \"ContainsAssigningValue\", hidden: true }\r\n ];\r\n\r\n if (!item.IsCustom) {\r\n columns.push({ title: \" \", field: \"IsModified\", template: \"\", width: 50, filterable: false });\r\n }\r\n\r\n vm.manageSecurityLayerGridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.manageSecurityLayerGridOptions.selectable = false;\r\n\r\n vm.manageSecurityLayerGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n sort: { field: \"Name\", dir: \"asc\" },\r\n transport: {\r\n read: function (options) {\r\n vm.selectedSecurityDesignerTables = vm.securityDesignerTables.slice();\r\n setDataSourceDefaultsAndMapProperties(vm.selectedSecurityDesignerTables, currentItems);\r\n\r\n vm.selectedSecurityDesignerTables.forEach(function (row) {\r\n if (row.Create !== 'Unset' || row.Delete !== 'Unset' || row.Read !== 'Unset' || row.Update !== 'Unset') {\r\n row.ContainsAssigningValue = true;\r\n } else {\r\n row.ContainsAssigningValue = false;\r\n }\r\n });\r\n\r\n vm.selectedSecurityDesignerTables = $filter('orderBy')(vm.selectedSecurityDesignerTables, 'Name');\r\n options.success(vm.selectedSecurityDesignerTables);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function changeActionVerbiage(data) {\r\n function changeActionVerbiage(array) {\r\n array.forEach(function (row) {\r\n if (row.Action === \"Grant\") {\r\n row.Action = \"Add\";\r\n }\r\n if (row.Action === \"Revoke\") {\r\n row.Action = \"Remove\";\r\n }\r\n });\r\n }\r\n\r\n function manipulateSecurityLayers(array) {\r\n array.forEach(function (row) {\r\n if (row.Action === \"Grant\" && !row.IsCustom) {\r\n row.Action = \"Modify\";\r\n }\r\n if (row.Action === \"Grant\") {\r\n row.Action = \"Add\";\r\n }\r\n if (row.Action === \"Remove\") {\r\n row.Action = \"Delete\";\r\n }\r\n if (row.Duties) {\r\n changeActionVerbiage(row.Duties);\r\n }\r\n if (row.Privileges) {\r\n changeActionVerbiage(row.Privileges);\r\n }\r\n if (row.SubRoles) {\r\n changeActionVerbiage(row.SubRoles);\r\n }\r\n });\r\n }\r\n\r\n manipulateSecurityLayers(data.ParentToChild);\r\n manipulateSecurityLayers(data.ParentToChild);\r\n manipulateSecurityLayers(data.ParentToChild);\r\n }\r\n\r\n function getSimulations() {\r\n return $http.get(apiUrl + 'api/securitydesigner/simulation').then(response => {\r\n return response;\r\n }).catch(response => {\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n function viewChanges(sim) {\r\n return $http.get(apiUrl + 'api/securitydesigner/simulation/' + sim.Id + '/changes').then(response => {\r\n return response;\r\n }).catch(response => {\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n function exportSimulationChanges(sim) {\r\n\r\n let data = {\r\n \"SimulationId\": sim.Id\r\n };\r\n\r\n return $http.post(apiUrl + 'api/securitydesigner/simulation/' + sim.Id + '/changes/export', data).then(response => {\r\n return response;\r\n }).catch(response => {\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n function exportSimulationAnalysis(sim) {\r\n\r\n let data = {\r\n \"SimulationId\": sim.Id\r\n };\r\n\r\n return $http.post(apiUrl + 'api/securitydesigner/simulation/' + sim.Id + '/analysis/export', data).then(response => {\r\n return response;\r\n }).catch(response => {\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n async function createRiskAnalysis(Id, formData) {\r\n try {\r\n return await $http.post(apiUrl + `api/securitydesigner/simulation/${Id}/analyze`, formData);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n async function publishSimulation(Id, formData) {\r\n try {\r\n return await $http.post(apiUrl + `api/securitydesigner/simulation/${Id}/publish`, formData);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n async function deleteSimulation(Id) {\r\n try {\r\n return await $http.delete(apiUrl + `api/securitydesigner/simulation/${Id}`);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n async function changePublic(Id, formData) {\r\n try {\r\n return await $http.put(apiUrl + `api/securitydesigner/simulation/${Id}`, formData);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n throw err;\r\n }\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getTaskRecordings,\r\n getSelectedTaskRecordingOverview,\r\n importTaskRecording,\r\n deleteTaskRecording,\r\n bulkDeleteTaskRecordings,\r\n getMenuItems,\r\n renameTaskRecording,\r\n getSelectedSecurityLayerTypeItemDetails,\r\n addMissingMenuItems,\r\n createNewSecurityModel,\r\n exportMenuItems\r\n };\r\n\r\n return service;\r\n\r\n async function getTaskRecordings(productType) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/${productType}/taskrecording/`);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function getSelectedTaskRecordingOverview(productType, Id) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/${productType}/taskrecording/${Id}/securitylayer/overview`);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function getSelectedSecurityLayerTypeItemDetails(productType, Id, securityLayerName, securityLayerType) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/${productType}/taskrecording/${Id}/securitylayer/${securityLayerName}/securitylayertype/${securityLayerType}/details`)\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function getMenuItems(productType, Id) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/${productType}/taskrecording/${Id}/details`)\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function importTaskRecording(productType, formData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/${productType}/taskrecording`, formData, { transformRequest: angular.identity, headers: { 'Content-Type': undefined } });\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function exportMenuItems(productType, Id) {\r\n let postData = {};\r\n postData.taskRecordingId = Id;\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/${productType}/taskrecording/${Id}/menuitems/export`, postData)\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function renameTaskRecording(productType, Id, formData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/${productType}/taskrecording/${Id}`, formData)\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function deleteTaskRecording(productType, Id) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/securitydesigner/${productType}/taskrecording/${Id}`)\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function bulkDeleteTaskRecordings(productType, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/${productType}/taskrecording/bulkdelete`, data)\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function addMissingMenuItems(productType, Id, formData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/${productType}/simulation/${Id}/addmissingobjects`, formData)\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function createNewSecurityModel(formData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/simulation`, formData)\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function($http, errorsDataService) {\r\n\r\n const service = {\r\n getTables,\r\n getFields,\r\n getFieldAccess,\r\n updateFieldAccess,\r\n deleteModification\r\n };\r\n\r\n return service;\r\n\r\n async function getTables() {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/securitydesigner/ax7/tables`);\r\n return res;\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getFields(tableName) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/securitydesigner/ax7/table/${tableName}/fields`);\r\n return res;\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getFieldAccess(simulationId, privilegeName, tableName) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/securitydesigner/ax7/simulation/${simulationId}/privilegeaccess/${privilegeName}/table/${tableName}/fieldaccess`);\r\n return res;\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateFieldAccess(simulationId, body) {\r\n try {\r\n await $http.post(`${apiUrl}api/securitydesigner/ax7/simulation/${simulationId}/securityobjectassociations`, body);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function deleteModification(simulationId, field) {\r\n try {\r\n const relationships = await $http.get(`${apiUrl}api/securitydesigner/ax7/simulation/${simulationId}/securityobjectassociations`);\r\n const modification = relationships.data.find(item => item.ChildObjectId.toLowerCase() === field.Id.toLowerCase());\r\n $http.delete(`${apiUrl}api/securitydesigner/ax7/simulation/securityobjectassociations/${modification.Id}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getSecurityMigrations,\r\n getSecurityMigrationDetails,\r\n exportMigration,\r\n addSecurityMigration,\r\n updateSecurityMigration,\r\n updateSecurityMigrationDetails,\r\n updateSecurityMigrationDetailEnabled,\r\n deleteSecurityMigration\r\n };\r\n\r\n return service;\r\n\r\n // GET Requests\r\n\r\n async function getSecurityMigrations() {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/ax7/securitymigration`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSecurityMigrationDetails(migrationId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/ax7/securitymigration/header/${migrationId}/details`);\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function exportMigration(migrationId, exportType) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/ax7/securitymigration/${migrationId}/type/${exportType}/export`, { responseType: \"blob\" });\r\n }\r\n catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n\r\n // POST Requests\r\n\r\n async function addSecurityMigration(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/ax7/securitymigration`, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // PUT Requests\r\n\r\n async function updateSecurityMigration(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/ax7/securitymigration/${data.Id}`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateSecurityMigrationDetails(headerId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/ax7/securitymigration/header/${headerId}/detail/${data.Id}`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateSecurityMigrationDetailEnabled(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/ax7/securitymigration/header/${data.HeaderId}/details`, data);\r\n }\r\n catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // DELETE Requests\r\n\r\n async function deleteSecurityMigration(migrationId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/securitydesigner/ax7/securitymigration/${migrationId}`);\r\n } catch(err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getSimulations,\r\n getRoles,\r\n getSimulation,\r\n getSimulationItemsByType,\r\n getSimulationChanges,\r\n getSimulationAuthObjects,\r\n getIntegrationSettings,\r\n createSimulation,\r\n analyzeSimulation,\r\n publishSimulation,\r\n updateSimulation,\r\n updateIntegrationSettings,\r\n deleteSimulation\r\n };\r\n\r\n return factory;\r\n\r\n async function getSimulations() {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/simulation`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRoles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/assure/sap/roles`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSimulation(simulationId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/simulation/${simulationId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSimulationItemsByType(simulationId, type) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/${type}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSimulationChanges(simulationId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/changes`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getIntegrationSettings(productId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/connections/${productId}/integration`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSimulationAuthObjects(simulationId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/authorizationobjects`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/simulation`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function analyzeSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/simulation/${data.SimulationId}/analyze`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function publishSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/simulation/${data.SimulationId}/publish`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateSimulation(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/simulation/${data.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateIntegrationSettings(productId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/sap/connections/${productId}/integration`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteSimulation(simulationId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/securitydesigner/simulation/${simulationId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getSimulationCompositeRoles,\r\n getCompositeRoleRoles,\r\n addCompositeRoleToSimulation,\r\n addRoleToCompositeRole,\r\n updateCompositeRole,\r\n copyCompositeRoleToSimulation,\r\n editCompositeRoleToSimulation,\r\n deleteCompositeRole,\r\n removeRoleFromCompositeRole\r\n };\r\n\r\n return factory;\r\n\r\n async function getSimulationCompositeRoles(simulationId, params) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/compositeroles`, {\r\n params: params\r\n });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getCompositeRoleRoles(simulationId, compositeRoleId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/compositeroles/${compositeRoleId}/roles`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addCompositeRoleToSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/compositeroles`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addRoleToCompositeRole(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/compositeroles/${data.CompositeRoleId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateCompositeRole(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/compositeroles/${data.CompositeRoleId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function copyCompositeRoleToSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/compositeroles/copy`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function editCompositeRoleToSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/compositeroles/edit`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteCompositeRole(simulationId, compositeRoleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/compositeroles/${compositeRoleId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeRoleFromCompositeRole(simulationId, compositeRoleId, roleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/compositeroles/${compositeRoleId}/roles/${roleId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getSimulationRoles,\r\n getRoleItemsByType,\r\n getRoleAuthObjects,\r\n getAuthObjectFields,\r\n getFieldValues,\r\n getRoleOrgLevels,\r\n getFieldValueOptions,\r\n addRoleToSimulation,\r\n copyRoleToSimulation,\r\n editRoleToSimulation,\r\n addItemToSimulationRoleByType,\r\n addAuthObjectToSimulationRole,\r\n addFieldValue,\r\n grantRoleFullAuthorization,\r\n updateSimulationRole,\r\n removeRoleFromSimulation,\r\n removeItemFromRole,\r\n deleteFieldValue\r\n };\r\n\r\n return factory;\r\n\r\n async function getSimulationRoles(simulationId, params) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles`, {\r\n params: params\r\n });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRoleItemsByType(simulationId, roleId, type) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/${type}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRoleAuthObjects(simulationId, roleId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/authorizationobjects`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAuthObjectFields(simulationId, roleId, authObjectId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/authorizationobjects/${authObjectId}/fields`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getFieldValues(simulationId, roleId, objectId, fieldId) {\r\n let url;\r\n // if we have authorization object id we need to call the GET route for auth object field values - otherwise we are calling route for org level field values\r\n if (fieldId) {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/authorizationobjects/${objectId}/fields/${fieldId}/values`;\r\n } else {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/organizationlevel/${objectId}/values`;\r\n }\r\n\r\n try {\r\n return await $http.get(url);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRoleOrgLevels(simulationId, roleId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/organizationlevels`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getFieldValueOptions(simulationId, roleId, objectId, fieldId) {\r\n let url;\r\n // if we have authorization object id we need to call the GET route for auth object field values - otherwise we are calling route for org level field values\r\n if (fieldId) {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/authorizationobjects/${objectId}/fields/${fieldId}/valueoptions`;\r\n } else {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/organizationlevels/${objectId}/valueoptions`;\r\n }\r\n\r\n try {\r\n return await $http.get(url);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addRoleToSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function copyRoleToSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles/copy`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function editRoleToSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles/edit`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addItemToSimulationRoleByType(data, type) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles/${data.RoleId}/${type}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addAuthObjectToSimulationRole(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles/${data.RoleId}/authorizationobjects`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addFieldValue(data) {\r\n let url;\r\n // if we have authorization object id we need to call the POST route for adding field value to auth object field - otherwise we are calling route for org level\r\n if (data.AuthorizationObjectId) {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles/${data.RoleId}/authorizationobjects/${data.AuthorizationObjectId}/fields/${data.FieldId}/values`;\r\n } else {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles/${data.RoleId}/organizationlevel/fields/${data.FieldId}/values`;\r\n }\r\n\r\n try {\r\n return await $http.post(url, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function grantRoleFullAuthorization(simulationId, roleId) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/grantfullauthorization`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateSimulationRole(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/securitydesigner/sap/simulations/${data.SimulationId}/roles/${data.RoleId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeRoleFromSimulation(simulationId, roleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeItemFromRole(simulationId, roleId, itemId, type) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/${type}/${itemId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteFieldValue(simulationId, roleId, objectId, fieldId, fieldValueId) {\r\n let url;\r\n // if we have authorization object id we need to call the GET route for auth object field values - otherwise we are calling route for org level field values\r\n if (fieldId) {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/authorizationobjects/${objectId}/fields/${fieldId}/values/${fieldValueId}`;\r\n } else {\r\n url = `${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/roles/${roleId}/organizationlevels/${objectId}/values/${fieldValueId}`;\r\n }\r\n\r\n try {\r\n return await $http.delete(url);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getSimulationAnalysisStats,\r\n getRiskAnalysisReportStatistics,\r\n exportRiskAnalysisReportDetails,\r\n analyzeSimulation\r\n };\r\n\r\n return factory;\r\n\r\n async function getSimulationAnalysisStats(simulationId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/analysis/statistics`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getRiskAnalysisReportStatistics(simulationId, type) {\r\n try {\r\n return await $http.get(`${apiUrl}api/securitydesigner/sap/simulations/${simulationId}/analysis/${type}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportRiskAnalysisReportDetails(simulationId, type) {\r\n try {\r\n const res = await $http.get(`${apiUrl}api/securityDesigner/sap/simulations/${simulationId}/analysis/${type}/export`, { responseType: 'blob' });\r\n return res;\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function analyzeSimulation(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/securitydesigner/simulation/${data.SimulationId}/analyze`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","import angular from 'angular';\r\nimport AXSecurityDesignerService from '../Components/AXSecurityDesigner/AXSecurityDesignerService';\r\nimport taskRecordingDataServiceFactory from '../APICalls/taskRecordingDataService.factory';\r\nimport AXSecurityDesignerPrivilegesDataServiceFactory from '../Components/AXSecurityDesigner/Privileges/AXSecurityDesignerPrivilegesDataService.factory';\r\nimport securityMigrationDataServiceFactory from '../Components/AXSecurityDesigner/SecurityMigration/securityMigrationDataService.factory';\r\nimport sapSdSimulationDataServiceFactory from '../Components/SAPSecurityDesigner/sapSdSimulationDataService.factory';\r\nimport sapSdSimCompositeRoleDataServiceFactory from '../Components/SAPSecurityDesigner/simulationCompositeRolesList/sapSdSimCompositeRoleDataService.factory';\r\nimport sapSdSimRoleDataServiceFactory from '../Components/SAPSecurityDesigner/simulationRolesList/sapSdSimRoleDataService.factory';\r\nimport sapSdSimRiskAnalysisDataServiceFactory from '../Components/SAPSecurityDesigner/simulationRiskAnalysis/sapSdSimRiskAnalysisDataService.factory';\r\n\r\nexport default angular\r\n .module('app.securityDesigner.factories', [])\r\n .factory('AXSecurityDesignerService', AXSecurityDesignerService)\r\n .factory('AXSecurityDesignerPrivilegesDataService', AXSecurityDesignerPrivilegesDataServiceFactory)\r\n .factory('taskRecordingDataService', taskRecordingDataServiceFactory)\r\n .factory('securityMigrationDataService', securityMigrationDataServiceFactory)\r\n .factory('sapSdSimulationDataService', sapSdSimulationDataServiceFactory)\r\n .factory('sapSdSimCompositeRoleDataService', sapSdSimCompositeRoleDataServiceFactory)\r\n .factory('sapSdSimRoleDataService', sapSdSimRoleDataServiceFactory)\r\n .factory('sapSdSimAnalysisDataService', sapSdSimRiskAnalysisDataServiceFactory)\r\n .name;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, securityMigrationDataService, helperService, migration) {\r\n const vm = this;\r\n\r\n vm.migration = { ...migration };\r\n vm.saveMigration = saveMigration;\r\n vm.cancel = cancel;\r\n\r\n async function saveMigration() {\r\n vm.migrationSavePending = new createSpinner();\r\n try {\r\n if (vm.migration.Id) {\r\n const data = {\r\n Id: vm.migration.Id,\r\n Name: vm.migration.Name\r\n };\r\n await securityMigrationDataService.updateSecurityMigration(data);\r\n await helperService.successfulSaveButton(vm.migrationSavePending);\r\n } else {\r\n let fd = new FormData();\r\n const fileObject = vm.file.flow.files[0];\r\n const fileName = fileObject.name;\r\n const file = fileObject.file;\r\n fd.append('SecurityFile', file);\r\n fd.append('Name', vm.migration.Name);\r\n await securityMigrationDataService.addSecurityMigration(fd);\r\n await helperService.successfulSaveButton(vm.migrationSavePending);\r\n }\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.migrationSavePending.loadingValue = false;\r\n return;\r\n }\r\n\r\n\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport migrationModalController from \"./migrationModal.controller\";\r\nimport createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (securityMigrationDataService, helperService, $uibModal, FileSaver) {\r\n const vm = this;\r\n\r\n vm.selectMigration = selectMigration;\r\n vm.openMigrationModal = openMigrationModal;\r\n\r\n vm.$onInit = activate;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n openMigrationModal(item.securityMigration);\r\n }\r\n },\r\n {\r\n text: 'Export to Code',\r\n click: item => {\r\n exportMigration(item.securityMigration, 0);\r\n }\r\n },\r\n {\r\n text: 'Export to UI',\r\n click: item => {\r\n exportMigration(item.securityMigration, 1);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n deleteMigration(item.securityMigration);\r\n }\r\n }\r\n ];\r\n\r\n function activate() {\r\n getMigrations();\r\n }\r\n\r\n async function getMigrations() {\r\n let response = await securityMigrationDataService.getSecurityMigrations();\r\n vm.securityMigrationsDataSource = response.data;\r\n if (vm.selectedMigration) {\r\n selectMigration(vm.selectedMigration);\r\n }\r\n }\r\n\r\n function selectMigration(selectedMigration) {\r\n vm.selectedMigration = selectedMigration;\r\n vm.selectedMigrationChanged({ selectedMigration });\r\n }\r\n\r\n async function deleteMigration(migration) {\r\n try {\r\n await swal(helperService.areYouSureParams(\r\n `Delete Migration`,\r\n `Are you sure you want to delete the ${migration.Name} Security Migration?`,\r\n `Yes`,\r\n `No`\r\n ));\r\n await securityMigrationDataService.deleteSecurityMigration(migration.Id);\r\n getMigrations();\r\n if (vm.selectedMigration.Id === migration.Id) {\r\n vm.selectMigration(null);\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openMigrationModal(migration) {\r\n const migrationModal = $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/SecurityMigration/MigrationsList/migrationModal.html',\r\n controller: migrationModalController,\r\n controllerAs: 'mmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n migration: () => migration || null\r\n }\r\n });\r\n\r\n try {\r\n await migrationModal.result;\r\n await getMigrations();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function exportMigration(migration, exportType) {\r\n migration.exportUpdatePending = new createSpinner();\r\n try {\r\n let response = await securityMigrationDataService.exportMigration(migration.Id, exportType);\r\n FileSaver.saveAs(response.data, exportType === 1 ? `${helperService.removeSpaces(migration.Name)}.xml` : `${helperService.removeSpaces(migration.Name)}.zip`);\r\n migration.exportUpdatePending.loadingValue = false;\r\n } catch {\r\n migration.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n}","import migrationsListController from \"./migrationsList.controller\";\r\n\r\n/* axSecurityDesignerMigrationsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing review assignments\r\n * @example \r\n */\r\n\r\nconst axSecurityDesignerMigrationsList = {\r\n bindings: {\r\n selectedMigrationChanged: '&'\r\n\r\n },\r\n controller: migrationsListController,\r\n controllerAs: 'mlvm',\r\n templateUrl: '/App/Components/AXSecurityDesigner/SecurityMigration/MigrationsList/migrationsList.html'\r\n};\r\n\r\nexport default axSecurityDesignerMigrationsList;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, securityMigrationDataService, helperService, migrationDetail, migrationHeaderId) {\r\n const vm = this;\r\n\r\n vm.migrationDetail = { ...migrationDetail };\r\n vm.saveMigrationDetail = saveMigrationDetail;\r\n vm.cancel = cancel;\r\n\r\n async function saveMigrationDetail() {\r\n vm.migrationDetailsSavePending = new createSpinner();\r\n const data = {\r\n Id: vm.migrationDetail.Id,\r\n Name: vm.migrationDetail.Name,\r\n Label: vm.migrationDetail.Label,\r\n Description: vm.migrationDetail.Description,\r\n Enabled: vm.migrationDetail.Enabled\r\n };\r\n try {\r\n await securityMigrationDataService.updateSecurityMigrationDetails(migrationHeaderId, data);\r\n await helperService.successfulSaveButton(vm.migrationDetailsSavePending);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.migrationDetailsSavePending.loadingValue = false;\r\n return;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize, customBooleanFilter } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\nimport migrationDetailsEditModalController from \"./migrationDetailsEditModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (securityMigrationDataService, helperService, $uibModal) {\r\n const vm = this;\r\n\r\n vm.$onInit = activate;\r\n vm.$onChanges = updateGridDataSource;\r\n vm.openMigrationDetailsEditModal = openMigrationDetailsEditModal;\r\n vm.changeEnabledValue = changeEnabledValue;\r\n vm.changeAllEnabled = changeAllEnabled;\r\n vm.allSelected = false;\r\n\r\n function activate() {\r\n setupMigrationDetailsGrid();\r\n }\r\n\r\n function setupMigrationDetailsGrid() {\r\n let migrationDetailsGridColumns =\r\n [\r\n { field: \"Enabled\", title: \"Enabled\", template: ``, width: 65, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"HeaderId\", title: \"Header Id\", filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Label\", title: \"Label\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", filterable: customAutoCompleteFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 }\r\n ];\r\n\r\n vm.migrationDetailsGridOptions = helperService.setMainGridOptions(migrationDetailsGridColumns, 612);\r\n vm.migrationDetailsGridOptions.selectable = false;\r\n\r\n vm.migrationDetailsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n vm.loadingDetails = true;\r\n let response = await securityMigrationDataService.getSecurityMigrationDetails(vm.migration.Id);\r\n options.success(response.data);\r\n vm.allEnabled = checkEnabledValues(response.data);\r\n vm.loadingDetails = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function updateGridDataSource() {\r\n if (vm.migrationDetailsGridDataSource) {\r\n vm.migrationDetailsGridDataSource.read();\r\n }\r\n }\r\n\r\n async function openMigrationDetailsEditModal(migrationDetailsRow) {\r\n const migrationModal = $uibModal.open({\r\n templateUrl: '/App/Components/AXSecurityDesigner/SecurityMigration/MigrationDetails/migrationDetailsEditModal.html',\r\n controller: migrationDetailsEditModalController,\r\n controllerAs: 'mdemvm',\r\n backdrop: 'static',\r\n resolve: {\r\n migrationDetail: () => migrationDetailsRow,\r\n migrationHeaderId: () => vm.migration.Id\r\n }\r\n });\r\n\r\n try {\r\n await migrationModal.result;\r\n await vm.migrationDetailsGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function checkEnabledValues(data) {\r\n if (data.every(item => item.Enabled)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n async function changeAllEnabled() {\r\n vm.allEnabledLoading = true;\r\n const data = {\r\n HeaderId: vm.migration.Id,\r\n Enabled: vm.allEnabled\r\n };\r\n try {\r\n await securityMigrationDataService.updateSecurityMigrationDetailEnabled(data);\r\n vm.migrationDetailsGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n vm.allEnabledLoading = false;\r\n }\r\n\r\n async function changeEnabledValue(detailItem) {\r\n vm.loadingDetails = true;\r\n const data = {\r\n Id: detailItem.Id,\r\n Enabled: detailItem.Enabled,\r\n Name: detailItem.Name,\r\n Label: detailItem.Label,\r\n Description: detailItem.Description\r\n };\r\n\r\n try {\r\n await securityMigrationDataService.updateSecurityMigrationDetails(vm.migration.Id, data);\r\n updateGridDataSource();\r\n } catch {\r\n return;\r\n }\r\n vm.loadingDetails = false;\r\n }\r\n}","import migrationDetailsGridController from \"./migrationDetailsGrid.controller\";\r\n\r\n/* migrationDetailsGrid.component.js */\r\n\r\n/**\r\n * @desc component for viewing review assignments\r\n * @example \r\n */\r\n\r\nconst axSecurityDesignerMigrationDetailsGrid = {\r\n bindings: {\r\n migration: '<'\r\n },\r\n controller: migrationDetailsGridController,\r\n controllerAs: 'mdgvm',\r\n templateUrl: '/App/Components/AXSecurityDesigner/SecurityMigration/MigrationDetails/migrationDetailsGrid.html'\r\n};\r\n\r\nexport default axSecurityDesignerMigrationDetailsGrid;","import simulationsController from \"./simulations.controller\";\r\n\r\n/* simulations.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining sap security designer simulations\r\n * @example \r\n */\r\n\r\nconst sapSdSimulations = {\r\n controller: simulationsController,\r\n controllerAs: 'ssdsvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulations.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulations;","export default /*@ngInject*/ function () {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedSimulation = changeSelectedSimulation;\r\n vm.changeSelectedRole = changeSelectedRole;\r\n vm.changeSelectedCompositeRole = changeSelectedCompositeRole;\r\n vm.changeSelectedAuthObject = changeSelectedAuthObject;\r\n vm.changeSelectedAuthObjectField = changeSelectedAuthObjectField;\r\n vm.changeSelectedOrgLevel = changeSelectedOrgLevel;\r\n vm.roleTypeChange = roleTypeChange;\r\n vm.backToSimulationList = backToSimulationList;\r\n vm.manageAuthorizations = manageAuthorizations;\r\n vm.defineOrgLevels = defineOrgLevels;\r\n vm.viewAnalysis = viewAnalysis;\r\n vm.simulationsListUpdated = simulationsListUpdated;\r\n vm.updateList = updateList;\r\n\r\n vm.roleType = 'singleRole';\r\n vm.manageAuthActive = false;\r\n vm.defineOrgLevelsActive = false;\r\n vm.backButtonText = 'Simulations';\r\n vm.updateSimulationsList = false;\r\n\r\n function changeSelectedSimulation(simulation) {\r\n if ((vm.selectedSimulation && vm.selectedSimulation.Id !== simulation?.Id) || !simulation) {\r\n vm.selectedRole = null;\r\n vm.selectedCompositeRole = null;\r\n vm.selectedSimulation = null;\r\n }\r\n vm.roleType = 'singleRole';\r\n vm.selectedSimulation = simulation;\r\n }\r\n\r\n function changeSelectedRole(role) {\r\n vm.selectedRole = role;\r\n }\r\n\r\n function changeSelectedCompositeRole(compositeRole) {\r\n vm.selectedCompositeRole = compositeRole;\r\n }\r\n\r\n function changeSelectedAuthObject(authObject) {\r\n vm.selectedAuthObjectField = null;\r\n vm.selectedAuthObject = authObject;\r\n }\r\n \r\n function changeSelectedAuthObjectField(field) {\r\n vm.selectedAuthObjectField = field;\r\n }\r\n\r\n function changeSelectedOrgLevel(orgLevel) {\r\n vm.selectedOrgLevel = orgLevel;\r\n }\r\n\r\n function roleTypeChange(type) {\r\n vm.selectedRole = null;\r\n vm.selectedCompositeRole = null;\r\n vm.roleType = type;\r\n }\r\n\r\n function backToSimulationList() {\r\n vm.manageAuthActive = false;\r\n vm.defineOrgLevelsActive = false;\r\n vm.viewAnalysisActive = false;\r\n // clear list selections\r\n vm.selectedAuthRole = null;\r\n vm.selectedAuthObject = null;\r\n vm.selectedAuthObjectField = null;\r\n vm.selectedOrgLevel = null;\r\n vm.selectedOrgLevelsRole = null;\r\n vm.selectedAnalysisSimulation = null;\r\n // refresh simulations list so statuses can be up to date\r\n vm.updateSimulationsList = true;\r\n }\r\n\r\n function manageAuthorizations(role) {\r\n vm.staticHeaderTitle = `SAP Security Designer Simulation Role Authorizations`;\r\n vm.staticHeaderDescription = `Manage Authorizations for Simulation Role ${role.Name}`;\r\n vm.selectedAuthRole = role;\r\n vm.manageAuthActive = true;\r\n }\r\n\r\n function defineOrgLevels(role) {\r\n vm.staticHeaderTitle = `SAP Security Designer Simulation Role Organizational Levels`;\r\n vm.staticHeaderDescription = `Define Organizational Levels for Simulation Role ${role.Name}`;\r\n vm.selectedOrgLevelsRole = role;\r\n vm.defineOrgLevelsActive = true;\r\n }\r\n\r\n function viewAnalysis(simulation) {\r\n vm.staticHeaderTitle = `SAP Security Designer Simulation Risk Analysis`;\r\n vm.staticHeaderDescription = `Risk Analysis for Simulation ${simulation.Name}`;\r\n vm.selectedAnalysisSimulation = simulation;\r\n vm.viewAnalysisActive = true;\r\n }\r\n\r\n function simulationsListUpdated(updateList) {\r\n vm.updateSimulationsList = updateList;\r\n }\r\n\r\n function updateList(listToUpdate) {\r\n switch (listToUpdate) {\r\n case 'authObjects':\r\n vm.selectedAuthRole = angular.copy(vm.selectedAuthRole);\r\n break;\r\n case 'objectFields':\r\n vm.selectedAuthObject = angular.copy(vm.selectedAuthObject);\r\n break;\r\n case 'orgLevels':\r\n vm.selectedOrgLevelsRole = angular.copy(vm.selectedOrgLevelsRole);\r\n break;\r\n }\r\n }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, simulation, helperService, sapSdSimulationDataService, dataService) {\r\n const vm = this;\r\n\r\n vm.saveSimulation = saveSimulation;\r\n vm.cancel = cancel;\r\n\r\n vm.simulation = { ...simulation };\r\n\r\n activate();\r\n\r\n function activate() {\r\n getProducts();\r\n }\r\n\r\n async function getProducts() {\r\n let response = await dataService.getProducts();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n response.data = response.data.filter(product => product.Type === 'SAP');\r\n if (response.data.length === 1) {\r\n vm.selectedProduct = response.data[0];\r\n } else {\r\n vm.availableProducts = response.data;\r\n }\r\n }\r\n\r\n async function saveSimulation() {\r\n vm.savePending = new createSpinner();\r\n let data = {\r\n Name: vm.simulation.Name,\r\n IsPublic: vm.simulation.IsPublic\r\n };\r\n\r\n if (!vm.simulation.Id) {\r\n data['ProductId'] = vm.selectedProduct.ID;\r\n createSimulation(data);\r\n } else {\r\n data['Id'] = vm.simulation.Id;\r\n data.IsPublic = vm.simulation.IsPublic;\r\n updateSimulation(data);\r\n }\r\n }\r\n\r\n async function createSimulation(data) {\r\n try { \r\n let response = await sapSdSimulationDataService.createSimulation(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(response.data);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateSimulation(data) {\r\n try {\r\n await sapSdSimulationDataService.updateSimulation(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(simulationId) {\r\n $uibModalInstance.close(simulationId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport simulationModalController from \"./simulationModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, sapSdSimulationDataService, sapSdSimAnalysisDataService, helperService, $uibModal, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.radioFilter = radioFilter;\r\n vm.changeSelectedSimulation = changeSelectedSimulation;\r\n vm.analyzeSimulation = analyzeSimulation;\r\n vm.publishSimulation = publishSimulation;\r\n vm.deleteSimulation = deleteSimulation;\r\n vm.viewRiskAnalysis = viewRiskAnalysis;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Run Analysis',\r\n click: item => {\r\n vm.analyzeSimulation(item.simulation);\r\n },\r\n displayed: item => {\r\n return item.simulation.Status !== 'Analyzing' && item.simulation.Status !== 'Deploying' && item.simulation.Status !== 'Deployed' && item.simulation.Status !== 'ReadyToDeploy';\r\n }\r\n },\r\n {\r\n text: 'View Analysis',\r\n click: item => {\r\n vm.viewRiskAnalysis(item.simulation);\r\n },\r\n displayed: item => {\r\n return item.simulation.Status !== 'New' && item.simulation.Status !== 'Analyzing';\r\n }\r\n },\r\n {\r\n text: 'Publish',\r\n click: item => {\r\n vm.publishSimulation(item.simulation);\r\n },\r\n displayed: item => {\r\n return item.simulation.Status === 'ReadyToDeploy'\r\n }\r\n },\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openSimulationModal(item.simulation);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteSimulation(item.simulation);\r\n },\r\n displayed: item => {\r\n return item.simulation.Status !== 'Deployed';\r\n }\r\n }\r\n ];\r\n\r\n vm.simulationsRadioFilter = 'Active';\r\n\r\n vm.openSimulationModal = openSimulationModal;\r\n\r\n vm.$onInit = activate;\r\n vm.$onChanges = onChanges;\r\n\r\n //Watch for risk analysis completion and update simulations list to clear any needs analysis labels\r\n $scope.$on('RiskAnalysis', (event, args) => {\r\n getSimulations();\r\n });\r\n\r\n //Watch for publish success and update simulations list to reflect proper deployed status\r\n $scope.$on('PublishSecurityDesignerChanges', async (event, args) => {\r\n await getSimulations();\r\n changeSelectedSimulation(null);\r\n });\r\n\r\n function activate() {\r\n getSimulations()\r\n }\r\n\r\n function onChanges(changes) {\r\n if (changes['updateSimulationsList'] && changes['updateSimulationsList'].currentValue === true) {\r\n getSimulations();\r\n vm.updateSimulationsList = false;\r\n const updateList = vm.updateSimulationsList;\r\n vm.onUpdateSimulationsList({ updateList });\r\n }\r\n }\r\n\r\n function radioFilter(simulation) {\r\n if (vm.simulationsRadioFilter === 'Active') {\r\n return simulation.Status !== 'Deployed';\r\n } else {\r\n return simulation.Status === 'Deployed';\r\n }\r\n }\r\n\r\n async function getSimulations(newSimulationId) {\r\n vm.simulationsLoading = true;\r\n let response = await sapSdSimulationDataService.getSimulations();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.simulations = response.data;\r\n if (newSimulationId) {\r\n const newestSimIndex = vm.simulations.findIndex(simulation => simulation.Id === newSimulationId);\r\n const newestSim = vm.simulations.find(simulation => simulation.Id === newSimulationId);\r\n vm.simulations.splice(newestSimIndex, 1);\r\n vm.simulations.unshift(newestSim);\r\n }\r\n vm.simulationsLoading = false;\r\n }\r\n\r\n function changeSelectedSimulation(simulation) {\r\n vm.onSelectedSimulationChanged({ simulation });\r\n }\r\n\r\n async function openSimulationModal(simulation) {\r\n let simulationModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationsList/simulationModal.tmpl.html',\r\n controller: simulationModalController,\r\n controllerAs: 'smvm',\r\n backdrop: 'static',\r\n resolve: {\r\n simulation: () => simulation || null\r\n }\r\n });\r\n\r\n try {\r\n let newSimulationId = await simulationModal.result;\r\n await getSimulations(newSimulationId);\r\n if (newSimulationId) {\r\n // We know a new simulation was created so we need to select it\r\n changeSelectedSimulation(vm.simulations.find(simulation => simulation.Id === newSimulationId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function analyzeSimulation(simulation) {\r\n let data = {\r\n SimulationId: simulation.Id\r\n }\r\n try {\r\n await swal(helperService.areYouSureParams(`Run Analysis`, `Are you sure you want to run the Simulation Analysis for Simulation ${simulation.Name}?`, `Yes`, 'No'))\r\n await sapSdSimAnalysisDataService.analyzeSimulation(data);\r\n simulation.Status = 'Analyzing';\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function publishSimulation(simulation) {\r\n let data = {\r\n SimulationId: simulation.Id,\r\n }\r\n try {\r\n await swal(helperService.areYouSureParams(`Publish`, `Are you sure you want to Publish Simulation ${simulation.Name}?`, `Yes`, 'No'))\r\n await sapSdSimulationDataService.publishSimulation(data);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteSimulation(simulation) {\r\n vm.simulationsLoading = true;\r\n try {\r\n await swal(helperService.areYouSureParams(`Delete Simulation`, `Are you sure you want to delete Simulation ${simulation.Name}?`, `Yes`, 'No'))\r\n await sapSdSimulationDataService.deleteSimulation(simulation.Id);\r\n changeSelectedSimulation(null);\r\n getSimulations();\r\n } catch {\r\n vm.simulationsLoading = false;\r\n return;\r\n }\r\n }\r\n\r\n async function viewRiskAnalysis(simulation) {\r\n vm.onViewAnalysisClicked({ simulation });\r\n }\r\n}","import simulationsListController from \"./simulationsList.controller\";\r\n\r\n/* simulationsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer simulations\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationsList = {\r\n bindings: {\r\n selectedSimulation: '<',\r\n updateSimulationsList: '<',\r\n onUpdateSimulationsList: '&',\r\n onSelectedSimulationChanged: '&',\r\n onViewAnalysisClicked: '&'\r\n },\r\n controller: simulationsListController,\r\n controllerAs: 'ssdslvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationsList/simulationsList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationsList;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, simulation, actionType, role, existingRoles, helperService, sapSdSimRoleDataService) {\r\n const vm = this;\r\n\r\n vm.actionType = actionType;\r\n\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.saveRole = saveRole;\r\n vm.cancel = cancel;\r\n\r\n vm.role = { ...role };\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (actionType !== 'Add') {\r\n setupAvailableRolesGrid();\r\n }\r\n }\r\n\r\n function setupAvailableRolesGrid() {\r\n let availableRolesGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n ];\r\n\r\n vm.availableRolesGridOptions = helperService.setMainGridOptions(availableRolesGridColumns, null);\r\n\r\n vm.availableRolesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let params;\r\n if (vm.actionType === 'Edit') {\r\n params = {\r\n IsEditable: true\r\n };\r\n }\r\n let response = await sapSdSimRoleDataService.getSimulationRoles(simulation.Id, params);\r\n if (vm.actionType === 'Edit') {\r\n response.data = response.data.filter(masterRole => !existingRoles.some(role => role.Id == masterRole.Id));\r\n }\r\n response.data = $filter('orderBy')(response.data, \"Name\");\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function changeRowSelected(dataItem) {\r\n vm.selectedRole = dataItem.toJSON();\r\n }\r\n\r\n async function saveRole() {\r\n vm.savePending = new createSpinner();\r\n switch (vm.actionType) {\r\n case 'Add':\r\n addRole();\r\n break;\r\n case 'Edit':\r\n editRole();\r\n break;\r\n case 'EditExisting':\r\n updateExistingCustomRole();\r\n break;\r\n case 'Copy':\r\n copyRole();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function addRole() {\r\n let data = vm.role;\r\n data.SimulationId = simulation.Id;\r\n\r\n try {\r\n let response = await sapSdSimRoleDataService.addRoleToSimulation(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(response.data);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateExistingCustomRole() {\r\n let data = {\r\n \"SimulationId\": simulation.Id,\r\n \"RoleId\": vm.role.Id,\r\n \"Name\": vm.role.Name,\r\n \"Description\": vm.role.Description,\r\n \"LongDescription\": vm.role.LongDescription\r\n };\r\n\r\n try {\r\n await sapSdSimRoleDataService.updateSimulationRole(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function editRole() {\r\n let data = {\r\n SimulationId: simulation.Id,\r\n Name: vm.selectedRole.Name\r\n };\r\n\r\n try {\r\n let response = await sapSdSimRoleDataService.editRoleToSimulation(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(response.data);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function copyRole() {\r\n let data = {\r\n SimulationId: simulation.Id,\r\n ExistingRoleName: vm.selectedRole.Name,\r\n NewRoleName: vm.role.Name\r\n };\r\n\r\n try {\r\n let response = await sapSdSimRoleDataService.copyRoleToSimulation(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(response.data);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(roleId) {\r\n $uibModalInstance.close(roleId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport roleModalController from \"./roleModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (sapSdSimRoleDataService, helperService, $uibModal, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedRole = changeSelectedRole;\r\n vm.openSimulationRoleModal = openSimulationRoleModal;\r\n vm.manageRoleAuthorizations = manageRoleAuthorizations;\r\n vm.manageOrganizationalLevels = manageOrganizationalLevels;\r\n vm.deleteSimulationRole = deleteSimulationRole;\r\n vm.changeRoleType = changeRoleType;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Define Organizational Levels',\r\n click: item => {\r\n vm.manageOrganizationalLevels(item.role);\r\n }\r\n },\r\n {\r\n text: 'Authorizations...',\r\n children: _ => {\r\n return [\r\n {\r\n text: 'Manage Authorizations',\r\n click: item => {\r\n vm.manageRoleAuthorizations(item.role);\r\n }\r\n },\r\n {\r\n text: 'Grant Full Authorization',\r\n click: item => {\r\n grantRoleFullAuthorization(item.role);\r\n }\r\n },\r\n ];\r\n },\r\n },\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openSimulationRoleModal(\"EditExisting\", item.role);\r\n },\r\n displayed: modelValue => {\r\n return modelValue.role.IsCustom;\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteSimulationRole(item.role);\r\n }\r\n }\r\n ];\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n vm.selectedRole = null;\r\n getRoles();\r\n }\r\n\r\n async function getRoles() {\r\n vm.rolesLoading = true;\r\n const params = {\r\n isModified: true\r\n };\r\n let response = await sapSdSimRoleDataService.getSimulationRoles(vm.simulation.Id, params);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.roles = response.data;\r\n vm.rolesLoading = false;\r\n }\r\n\r\n async function changeSelectedRole(role) {\r\n vm.selectedRole = role;\r\n vm.onSelectedRoleChange({ role });\r\n }\r\n\r\n async function openSimulationRoleModal(actionType, role) {\r\n let roleModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationRolesList/roleModal.tmpl.html',\r\n controller: roleModalController,\r\n controllerAs: 'rmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n simulation: () => vm.simulation,\r\n actionType: () => actionType,\r\n role: () => role,\r\n existingRoles: () => vm.roles\r\n }\r\n });\r\n\r\n try {\r\n let roleId = await roleModal.result;\r\n await getRoles();\r\n if (roleId) {\r\n changeSelectedRole(vm.roles.find(r => r.Id === roleId));\r\n refreshSimulations();\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function manageRoleAuthorizations(role) {\r\n vm.onManageAuthClicked({ role });\r\n }\r\n\r\n async function manageOrganizationalLevels(role) {\r\n vm.onDefineOrgLevelsClicked({ role });\r\n }\r\n\r\n async function grantRoleFullAuthorization(role) {\r\n await sapSdSimRoleDataService.grantRoleFullAuthorization(vm.simulation.Id, role.Id);\r\n refreshSimulations();\r\n getRoles();\r\n }\r\n\r\n async function deleteSimulationRole(role) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Remove Role`, `Are you sure you want to remove role ${role.Name} from simulation ${vm.simulation.Name}?`, `Yes`, 'No'));\r\n vm.rolesLoading = true;\r\n await sapSdSimRoleDataService.removeRoleFromSimulation(vm.simulation.Id, role.Id);\r\n changeSelectedRole(null);\r\n refreshSimulations();\r\n getRoles();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function changeRoleType() {\r\n let roleType = vm.selectedRoleType;\r\n vm.onRoleTypeChange({ roleType });\r\n }\r\n\r\n function refreshSimulations() {\r\n const updateList = true;\r\n vm.onUpdateSimulationsList({ updateList });\r\n }\r\n}","import rolesListController from \"./rolesList.controller\";\r\n\r\n/* rolesList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer simulation roles\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationRolesList = {\r\n bindings: {\r\n simulation: '<',\r\n selectedRoleType: '<',\r\n onUpdateSimulationsList: '&',\r\n onSelectedCompositeRoleChange: '&',\r\n onSelectedRoleChange: '&',\r\n onRoleTypeChange: '&',\r\n onManageAuthClicked: '&',\r\n onDefineOrgLevelsClicked: '&'\r\n },\r\n controller: rolesListController,\r\n controllerAs: 'rlvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationRolesList/rolesList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationRolesList;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, simulation, actionType, compositeRole, helperService, sapSdSimCompositeRoleDataService) {\r\n const vm = this;\r\n\r\n vm.actionType = actionType;\r\n\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.saveCompositeRole = saveCompositeRole;\r\n vm.cancel = cancel;\r\n\r\n vm.compositeRole = { ...compositeRole };\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (actionType !== 'Add') {\r\n setupAvailableCompositeRolesGrid();\r\n }\r\n }\r\n\r\n function setupAvailableCompositeRolesGrid() {\r\n let availableCompositeRolesGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n ];\r\n\r\n vm.availableRolesGridOptions = helperService.setMainGridOptions(availableCompositeRolesGridColumns, null);\r\n\r\n vm.availableRolesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let params;\r\n if (vm.actionType === 'Edit') {\r\n params = {\r\n IsEditable: true\r\n };\r\n }\r\n let response = await sapSdSimCompositeRoleDataService.getSimulationCompositeRoles(simulation.Id, params);\r\n response.data = $filter('orderBy')(response.data, \"Name\");\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function changeRowSelected(dataItem) {\r\n vm.selectedCompositeRole = dataItem.toJSON();\r\n }\r\n\r\n async function saveCompositeRole() {\r\n vm.savePending = new createSpinner();\r\n switch (vm.actionType) {\r\n case 'Add':\r\n createCompositeRole();\r\n break;\r\n case 'Edit':\r\n editCompositeRole();\r\n break;\r\n case 'EditExisting':\r\n updateExistingCustomCompositeRole();\r\n break;\r\n case 'Copy':\r\n copyCompositeRole();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function createCompositeRole() {\r\n let data = vm.compositeRole;\r\n data.SimulationId = simulation.Id;\r\n\r\n try {\r\n await sapSdSimCompositeRoleDataService.addCompositeRoleToSimulation(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function editCompositeRole() {\r\n let data = {\r\n SimulationId: simulation.Id,\r\n Name: vm.selectedCompositeRole.Name\r\n };\r\n\r\n try {\r\n await sapSdSimCompositeRoleDataService.editCompositeRoleToSimulation(data);\r\n helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateExistingCustomCompositeRole() {\r\n let data = {\r\n SimulationId: simulation.Id,\r\n CompositeRoleId: vm.compositeRole.Id,\r\n Name: vm.compositeRole.Name,\r\n Description: vm.compositeRole.Description,\r\n LongDescription: vm.compositeRole.LongDescription\r\n };\r\n\r\n try {\r\n await sapSdSimCompositeRoleDataService.updateCompositeRole(data);\r\n helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function copyCompositeRole() {\r\n let data = {\r\n SimulationId: simulation.Id,\r\n ExistingCompositeRoleName: vm.selectedCompositeRole.Name,\r\n NewCompositeRoleName: vm.compositeRole.Name\r\n };\r\n\r\n try {\r\n await sapSdSimCompositeRoleDataService.copyCompositeRoleToSimulation(data);\r\n helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateCompositeRole() {\r\n vm.compositeRole['CompositeRoleId'] = vm.compositeRole.Id;\r\n delete vm.compositeRole.Id;\r\n try {\r\n await sapSdSimCompositeRoleDataService.updateCompositeRole(vm.compositeRole);\r\n helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport compositeRoleModalController from \"./compositeRoleModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (sapSdSimCompositeRoleDataService, helperService, $uibModal, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedCompositeRole = changeSelectedCompositeRole;\r\n vm.openCompositeRoleModal = openCompositeRoleModal;\r\n vm.deleteCompositeRole = deleteCompositeRole;\r\n vm.changeRoleType = changeRoleType;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openCompositeRoleModal('EditExisting', item.compositeRole);\r\n },\r\n displayed: function (modelValue) {\r\n return modelValue.compositeRole.IsCustom;\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteCompositeRole(item.compositeRole);\r\n }\r\n }\r\n ];\r\n\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n vm.selectedCompositeRole = null;\r\n getCompositeRoles();\r\n }\r\n\r\n async function getCompositeRoles() {\r\n vm.compositeRolesLoading = true;\r\n const params = {\r\n isModified: true\r\n };\r\n let response = await sapSdSimCompositeRoleDataService.getSimulationCompositeRoles(vm.simulation.Id, params);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.compositeRoles = response.data;\r\n vm.compositeRolesLoading = false;\r\n }\r\n\r\n async function changeSelectedCompositeRole(compositeRole) {\r\n vm.selectedCompositeRole = compositeRole;\r\n vm.onSelectedCompositeRoleChange({ compositeRole });\r\n }\r\n\r\n async function openCompositeRoleModal(actionType, compositeRole) {\r\n let compositeRoleModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationCompositeRolesList/compositeRoleModal.tmpl.html',\r\n controller: compositeRoleModalController,\r\n controllerAs: 'crmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n simulation: () => vm.simulation,\r\n actionType: () => actionType,\r\n compositeRole: () => compositeRole\r\n }\r\n });\r\n\r\n try {\r\n await compositeRoleModal.result;\r\n refreshSimulations();\r\n await getCompositeRoles();\r\n } catch { return; }\r\n }\r\n\r\n async function deleteCompositeRole(compositeRole) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Delete Composite Role`, `Are you sure you want to delete composite role ${compositeRole.Name}?`, `Yes`, 'No'));\r\n vm.compositeRolesLoading = true;\r\n await sapSdSimCompositeRoleDataService.deleteCompositeRole(vm.simulation.Id, compositeRole.Id);\r\n changeSelectedCompositeRole(null);\r\n refreshSimulations();\r\n getCompositeRoles();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function changeRoleType() {\r\n let roleType = vm.selectedRoleType;\r\n vm.onRoleTypeChange({ roleType });\r\n }\r\n\r\n function refreshSimulations() {\r\n const updateList = true;\r\n vm.onUpdateSimulationsList({ updateList });\r\n }\r\n}","import compositeRolesListController from \"./compositeRolesList.controller\";\r\n\r\n/* compositeRolesList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer simulation composite roles\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationCompositeRolesList = {\r\n bindings: {\r\n simulation: '<',\r\n selectedRoleType: '<',\r\n onUpdateSimulationsList: '&',\r\n onSelectedCompositeRoleChange: '&',\r\n onRoleTypeChange: '&'\r\n },\r\n controller: compositeRolesListController,\r\n controllerAs: 'crlvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationCompositeRolesList/compositeRolesList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationCompositeRolesList;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, simulation, role, selectedAuthObjects, helperService, sapSdSimulationDataService, sapSdSimRoleDataService) {\r\n const vm = this;\r\n\r\n vm.close = close;\r\n vm.addAuthObjectToSimulationRole = addAuthObjectToSimulationRole;\r\n selectedAuthObjects = [...selectedAuthObjects];\r\n\r\n activate();\r\n\r\n function activate() {\r\n setupAvailableAuthObjectsGrid();\r\n }\r\n\r\n function setupAvailableAuthObjectsGrid() {\r\n let availableAuthObjectsGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableAuthObjectsGridOptions = helperService.setMainGridOptions(availableAuthObjectsGridColumns, null);\r\n\r\n vm.availableAuthObjectsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await sapSdSimulationDataService.getSimulationAuthObjects(simulation.Id);\r\n response.data = response.data.filter(role => {\r\n return !selectedAuthObjects.some(selectedAuthObject => selectedAuthObject.Name === role.Name);\r\n });\r\n response.data = $filter('orderBy')(response.data, \"Name\");\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function addAuthObjectToSimulationRole(authObject) {\r\n vm.addingAuthObjectsToRole = true;\r\n kendo.ui.progress(vm.availableAuthObjectsGrid.element, true);\r\n let data = {\r\n SimulationId: simulation.Id,\r\n RoleId: role.Id,\r\n Name: authObject.Name,\r\n }\r\n try {\r\n await sapSdSimRoleDataService.addAuthObjectToSimulationRole(data);\r\n let processedAuthObject = JSON.parse(JSON.stringify(authObject));\r\n selectedAuthObjects.push(processedAuthObject);\r\n kendo.ui.progress(vm.availableAuthObjectsGrid.element, false);\r\n vm.availableAuthObjectsGridDataSource.read();\r\n vm.addingAuthObjectsToRole = false;\r\n } catch {\r\n vm.addingAuthObjectsToRole = false;\r\n kendo.ui.progress(vm.availableAuthObjectsGrid.element, false);\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport roleAuthObjectModalController from \"./roleAuthObjectModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (sapSdSimRoleDataService, helperService, $uibModal, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedAuthObject = changeSelectedAuthObject;\r\n vm.openAuthObjectModal = openAuthObjectModal;\r\n vm.removeAuthObjectFromRole = removeAuthObjectFromRole;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n getRoleAuthObjects();\r\n }\r\n\r\n async function getRoleAuthObjects() {\r\n vm.authObjectsLoading = true;\r\n let response = await sapSdSimRoleDataService.getRoleAuthObjects(vm.simulation.Id, vm.selectedRole.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.authObjects = response.data;\r\n vm.authObjectsLoading = false;\r\n }\r\n\r\n async function changeSelectedAuthObject(authObject) {\r\n vm.selectedAuthObject = authObject;\r\n vm.onSelectedAuthObjectChange({ authObject });\r\n }\r\n\r\n async function openAuthObjectModal() {\r\n let authObjectModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simRoleAuthObjectsList/roleAuthObjectModal.tmpl.html',\r\n controller: roleAuthObjectModalController,\r\n controllerAs: 'raomvm',\r\n backdrop: 'static',\r\n resolve: {\r\n simulation: () => vm.simulation,\r\n role: () => vm.selectedRole,\r\n selectedAuthObjects: () => vm.authObjects\r\n }\r\n });\r\n\r\n try {\r\n await authObjectModal.result;\r\n await getRoleAuthObjects();\r\n } catch { return; }\r\n }\r\n\r\n async function removeAuthObjectFromRole(authObject) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Remove Authorization Object`, `Are you sure you want to remove authorization object ${authObject.Name} from role ${vm.selectedRole.Name}?`, `Yes`, 'No'))\r\n await sapSdSimRoleDataService.removeAuthObjectFromRole(vm.simulation.Id, vm.selectedRole.Id, authObject);\r\n getRoleAuthObjects();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","import roleAuthObjectsListController from \"./roleAuthObjectsList.controller\";\r\n\r\n/* roleAuthObjectsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer simulation role authorization objects\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationRoleAuthObjectsList = {\r\n bindings: {\r\n simulation: '<',\r\n selectedRole: '<',\r\n onSelectedAuthObjectChange: '&'\r\n },\r\n controller: roleAuthObjectsListController,\r\n controllerAs: 'raolvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simRoleAuthObjectsList/roleAuthObjectsList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationRoleAuthObjectsList;","export default /*@ngInject*/ function (sapSdSimRoleDataService, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedOrgLevel = changeSelectedOrgLevel;\r\n vm.grantFullAuthorization = grantFullAuthorization;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Grant full authorization',\r\n click: item => {\r\n vm.grantFullAuthorization(item.orgLevel);\r\n }\r\n }\r\n ];\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n getRoleOrgLevels();\r\n }\r\n\r\n async function getRoleOrgLevels() {\r\n vm.orgLevelsLoading = true;\r\n let response = await sapSdSimRoleDataService.getRoleOrgLevels(vm.simulation.Id, vm.selectedRole.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.orgLevels = response.data;\r\n vm.orgLevelsLoading = false;\r\n }\r\n\r\n async function changeSelectedOrgLevel(orgLevel) {\r\n vm.selectedOrgLevel = orgLevel;\r\n vm.onSelectedOrgLevelChange({ orgLevel });\r\n }\r\n\r\n async function grantFullAuthorization(orgLevel) {\r\n vm.orgLevelsLoading = true;\r\n let data = {\r\n SimulationId: vm.simulation.Id,\r\n RoleId: vm.selectedRole.Id,\r\n FieldId: orgLevel.Id,\r\n Low: \"*\",\r\n High: null\r\n };\r\n\r\n try {\r\n await sapSdSimRoleDataService.addFieldValue(data);\r\n vm.orgLevelsLoading = false;\r\n // we have to clone the orgLevel object to ensure the field values component updates via $onChanges\r\n const updatedOrgLevel = { ...orgLevel };\r\n changeSelectedOrgLevel(updatedOrgLevel);\r\n vm.simulationsCtrl.updateList('orgLevels');\r\n } catch {\r\n vm.orgLevelsLoading = false;\r\n }\r\n }\r\n}","import roleOrgLevelsListController from \"./roleOrgLevelsList.controller\";\r\n\r\n/* roleOrgLevelsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer simulation role authorization objects\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationRoleOrgLevelsList = {\r\n require: {\r\n simulationsCtrl: '^sapSdSimulations'\r\n },\r\n bindings: {\r\n simulation: '<',\r\n selectedRole: '<',\r\n onSelectedOrgLevelChange: '&'\r\n },\r\n controller: roleOrgLevelsListController,\r\n controllerAs: 'rollvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simRoleOrgLevelsList/roleOrgLevelsList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationRoleOrgLevelsList;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, simulation, selectedCompositeRole, selectedRoles, helperService, sapSdSimRoleDataService, sapSdSimCompositeRoleDataService) {\r\n const vm = this;\r\n\r\n vm.close = close;\r\n vm.addRoleToCompositeRole = addRoleToCompositeRole;\r\n selectedRoles = [...selectedRoles];\r\n\r\n activate();\r\n\r\n function activate() {\r\n setupAvailableRolesGrid();\r\n }\r\n\r\n function setupAvailableRolesGrid() {\r\n let availableRolesGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableRolesGridOptions = helperService.setMainGridOptions(availableRolesGridColumns, null);\r\n\r\n vm.availableRolesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await sapSdSimRoleDataService.getSimulationRoles(simulation.Id);\r\n response.data = response.data.filter(role => {\r\n return !selectedRoles.some(selectedRole => selectedRole.Name === role.Name);\r\n });\r\n response.data = $filter('orderBy')(response.data, \"Name\");\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function addRoleToCompositeRole(role) {\r\n vm.addingToCompositeRole = true;\r\n let data = {\r\n SimulationId: simulation.Id,\r\n CompositeRoleId: selectedCompositeRole.Id,\r\n RoleName: role.Name,\r\n }\r\n try {\r\n await sapSdSimCompositeRoleDataService.addRoleToCompositeRole(data);\r\n let processedRole = JSON.parse(JSON.stringify(role));\r\n selectedRoles.push(processedRole);\r\n vm.availableRolesGridDataSource.read();\r\n vm.addingToCompositeRole = false;\r\n } catch {\r\n vm.addingToCompositeRole = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport addRolesModalController from \"./addRolesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (sapSdSimCompositeRoleDataService, helperService, $uibModal, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.openAddRoleModal = openAddRoleModal;\r\n vm.removeRoleFromCompositeRole = removeRoleFromCompositeRole;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n getCompositeRoleRoles();\r\n }\r\n\r\n async function getCompositeRoleRoles() {\r\n vm.rolesLoading = true;\r\n let response = await sapSdSimCompositeRoleDataService.getCompositeRoleRoles(vm.simulation.Id, vm.selectedCompositeRole.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.roles = response.data;\r\n vm.rolesLoading = false;\r\n }\r\n\r\n async function openAddRoleModal() {\r\n let addRoleModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/compositeRoleRolesList/addRolesModal.tmpl.html',\r\n controller: addRolesModalController,\r\n controllerAs: 'armvm',\r\n backdrop: 'static',\r\n resolve: {\r\n simulation: () => vm.simulation,\r\n selectedCompositeRole: () => vm.selectedCompositeRole,\r\n selectedRoles: () => vm.roles\r\n }\r\n });\r\n\r\n try {\r\n await addRoleModal.result;\r\n refreshSimulations();\r\n await getCompositeRoleRoles();\r\n } catch { return; }\r\n }\r\n\r\n async function removeRoleFromCompositeRole(role) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Remove Role from Composite Role`, `Are you sure you want to remove Role ${role.Name} from Composite Role ${vm.selectedCompositeRole.Name}?`, `Yes`, 'No'));\r\n vm.rolesLoading = true;\r\n await sapSdSimCompositeRoleDataService.removeRoleFromCompositeRole(vm.simulation.Id, vm.selectedCompositeRole.Id, role.Id);\r\n vm.rolesLoading = false;\r\n refreshSimulations();\r\n getCompositeRoleRoles();\r\n } catch {\r\n vm.rolesLoading = false;\r\n }\r\n }\r\n\r\n function refreshSimulations() {\r\n const updateList = true;\r\n vm.onUpdateSimulationsList({ updateList });\r\n }\r\n}","import compositeRoleRolesListController from \"./compositeRoleRolesList.controller\";\r\n\r\n/* compositeRoleRolesList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer composite role roles\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationsCompositeRoleRolesList = {\r\n bindings: {\r\n simulation: '<',\r\n onUpdateSimulationsList: '&',\r\n selectedCompositeRole: '<',\r\n },\r\n controller: compositeRoleRolesListController,\r\n controllerAs: 'crrlvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/compositeRoleRolesList/compositeRoleRolesList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationsCompositeRoleRolesList;","export default /*@ngInject*/ function (sapSdSimRoleDataService, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedField = changeSelectedField;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Grant full authorization',\r\n click: item => {\r\n grantFullAuthorization(item.field);\r\n }\r\n }\r\n ];\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n getAuthObjectFields();\r\n }\r\n\r\n async function getAuthObjectFields() {\r\n vm.fieldsLoading = true;\r\n let response = await sapSdSimRoleDataService.getAuthObjectFields(vm.simulation.Id, vm.selectedRole.Id, vm.authObject.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.fields = response.data;\r\n vm.fieldsLoading = false;\r\n }\r\n\r\n async function changeSelectedField(field) {\r\n vm.selectedField = field;\r\n vm.onSelectedFieldChange({ field });\r\n }\r\n\r\n async function grantFullAuthorization(field) {\r\n vm.fieldsLoading = true;\r\n let data = {\r\n SimulationId: vm.simulation.Id,\r\n RoleId: vm.selectedRole.Id,\r\n AuthorizationObjectId: vm.authObject.Id,\r\n FieldId: field.Id,\r\n Low: \"*\",\r\n High: null\r\n };\r\n\r\n try {\r\n await sapSdSimRoleDataService.addFieldValue(data);\r\n vm.fieldsLoading = false;\r\n // we have to clone the field object to ensure the field values component updates via $onChanges\r\n const updatedField = { ...field };\r\n changeSelectedField(updatedField);\r\n await getAuthObjectFields();\r\n if (vm.fields.every(field => field.AllMaintained)) {\r\n // All Maintained status means we need to update the auth objects list\r\n vm.simulationsCtrl.updateList('authObjects');\r\n }\r\n } catch {\r\n vm.fieldsLoading = false;\r\n }\r\n }\r\n}","import authObjectFieldsListController from \"./authObjectFieldsList.controller\";\r\n\r\n/* authObjectFieldsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer authorization object fields\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationRoleAuthObjectFieldsList = {\r\n require: {\r\n simulationsCtrl: '^sapSdSimulations'\r\n },\r\n bindings: {\r\n simulation: '<',\r\n selectedRole: '<',\r\n authObject: '<',\r\n onSelectedFieldChange: '&'\r\n },\r\n controller: authObjectFieldsListController,\r\n controllerAs: 'aoflvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simRoleAuthObjFieldsList/authObjectFieldsList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationRoleAuthObjectFieldsList;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, simulation, role, selectedItems, selectedType, sapSdSimulationDataService, sapSdSimRoleDataService, helperService) {\r\n const vm = this,\r\n typeDisplayNames = {\r\n tcodes: \"Transactions\",\r\n catalogs: \"Catalogs\",\r\n groups: \"Groups\",\r\n spaces: \"Spaces\"\r\n };\r\n\r\n\r\n vm.itemAdded = false;\r\n selectedItems = [...selectedItems];\r\n vm.addItem = addItem;\r\n vm.close = close;\r\n vm.title = typeDisplayNames[selectedType];\r\n\r\n activate();\r\n\r\n function activate() {\r\n let availableItemsGridColumns = getColumnsByType(selectedType);\r\n\r\n vm.availableItemsGridOptions = helperService.setMainGridOptions(availableItemsGridColumns, null);\r\n\r\n vm.availableItemsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let { data } = await sapSdSimulationDataService.getSimulationItemsByType(simulation.Id, selectedType);\r\n\r\n data = data.filter(item => {\r\n return !selectedItems.some(selectedItem => selectedItem?.Name === item?.Name);\r\n });\r\n\r\n data = $filter('orderBy')(data, \"Name\");\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function addItem(item) {\r\n let data = {\r\n SimulationId: simulation.Id,\r\n RoleId: role.Id,\r\n Name: item.Name\r\n }\r\n\r\n if (selectedType === \"catalogs\") {\r\n data.Url = item.Url;\r\n }\r\n\r\n vm.addItemProcessing = true;\r\n kendo.ui.progress(vm.availableItemsGrid.element, true);\r\n\r\n try {\r\n await sapSdSimRoleDataService.addItemToSimulationRoleByType(data, selectedType);\r\n if (!vm.itemAdded) {\r\n vm.itemAdded = true;\r\n }\r\n\r\n selectedItems.push(JSON.parse(JSON.stringify(item)));\r\n kendo.ui.progress(vm.availableItemsGrid.element, false);\r\n\r\n vm.availableItemsGridDataSource.read();\r\n vm.addItemProcessing = false;\r\n } catch {\r\n vm.addItemProcessing = false;\r\n kendo.ui.progress(vm.availableItemsGrid.element, false);\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close(vm.itemAdded);\r\n }\r\n}\r\n\r\nfunction getColumnsByType(type) {\r\n let types = {\r\n tcodes: [\r\n { title: \"Transaction ID\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Transaction Title\", field: \"Description\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ],\r\n groups: [\r\n { title: \"Group ID\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Group Title\", field: \"DisplayName\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ],\r\n catalogs: [\r\n { title: \"Catalog Id\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Catalog Title\", field: \"DisplayName\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ],\r\n spaces: [\r\n { title: \"Space Template ID\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Space Description\", field: \"Description\", filterable: customAutoCompleteFilter },\r\n { title: \"Space Title\", field: \"DisplayName\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ]\r\n };\r\n\r\n return types[type];\r\n}","import swal from \"sweetalert2\";\r\nimport itemsModalController from \"./itemsModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (sapSdSimRoleDataService, configurationDataService, helperService, $uibModal, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.openItemModal = openItemModal;\r\n vm.deleteItemFromRole = deleteItemFromRole;\r\n vm.changeType = changeType;\r\n vm.itemsLoading = true;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n let { data } = await configurationDataService.getProductConfigurationValueByName(\"SAP\", \"SAP_ErpType\");\r\n\r\n vm.showCatalogsGroupsAndSpaces = data.Value === \"S4\";\r\n\r\n vm.selectedType = \"tcodes\";\r\n\r\n getRoleItemsByType(vm.selectedType);\r\n }\r\n\r\n async function getRoleItemsByType() {\r\n vm.itemsLoading = true;\r\n\r\n let { data } = await sapSdSimRoleDataService.getRoleItemsByType(vm.simulation.Id, vm.selectedRole.Id, vm.selectedType);\r\n\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.items = data;\r\n vm.itemsLoading = false;\r\n }\r\n\r\n async function openItemModal() {\r\n let itemModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/itemsList/itemsModal.tmpl.html',\r\n controller: itemsModalController,\r\n controllerAs: 'imvm',\r\n backdrop: 'static',\r\n resolve: {\r\n simulation: () => vm.simulation,\r\n role: () => vm.selectedRole,\r\n selectedItems: () => vm.items,\r\n selectedType: () => vm.selectedType\r\n }\r\n });\r\n\r\n try {\r\n const itemAdded = await itemModal.result,\r\n openOrgLevels = vm.selectedType === \"tcodes\" || vm.selectedType === \"catalogs\";\r\n\r\n refreshSimulations();\r\n await getRoleItemsByType(vm.selectedType);\r\n\r\n if (itemAdded && openOrgLevels) {\r\n vm.onItemAdded();\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function deleteItemFromRole(item) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Remove Item from Role`, `Are you sure you want to remove Item ${item.Name} from Role ${vm.selectedRole.Name}?`, `Yes`, 'No'));\r\n vm.itemsLoading = true;\r\n\r\n await sapSdSimRoleDataService.removeItemFromRole(vm.simulation.Id, vm.selectedRole.Id, item.Id, vm.selectedType);\r\n\r\n vm.itemsLoading = false;\r\n refreshSimulations();\r\n await getRoleItemsByType(vm.selectedType);\r\n } catch {\r\n vm.itemsLoading = false;\r\n }\r\n }\r\n\r\n function changeType() {\r\n getRoleItemsByType(vm.selectedType);\r\n }\r\n\r\n function refreshSimulations() {\r\n const updateList = true;\r\n\r\n vm.onUpdateSimulationsList({ updateList });\r\n }\r\n}","import controller from \"./items.controller\";\r\n\r\n/* items.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer role items\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationsRoleItemsList = {\r\n bindings: {\r\n simulation: '<',\r\n onUpdateSimulationsList: '&',\r\n selectedRole: '<',\r\n onItemAdded: '&'\r\n },\r\n controller: controller,\r\n controllerAs: 'ivm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/itemsList/items.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationsRoleItemsList;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, simulation, role, field, object, helperService, sapSdSimRoleDataService) {\r\n const vm = this;\r\n\r\n vm.saveFieldValue = saveFieldValue;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n setupFieldValueDropdowns();\r\n }\r\n\r\n async function setupFieldValueDropdowns() {\r\n vm.fieldValueOptionsDataSource = new kendo.data.DataSource({\r\n serverFiltering: false,\r\n transport: {\r\n read: async options => {\r\n let response = await sapSdSimRoleDataService.getFieldValueOptions(simulation.Id, role.Id, object.Id, field ? field.Id : null);\r\n response.data = $filter('orderBy')(response.data, 'Value');\r\n options.success(response.data);\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n async function saveFieldValue() {\r\n vm.savePending = new createSpinner();\r\n let data = {\r\n SimulationId: simulation.Id,\r\n RoleId: role.Id,\r\n FieldId: field ? field.Id : object.Id,\r\n Low: vm.fieldValue.low,\r\n High: vm.fieldValue.high\r\n };\r\n\r\n if (field) {\r\n data.AuthorizationObjectId = object.Id;\r\n }\r\n\r\n try {\r\n await sapSdSimRoleDataService.addFieldValue(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import fieldValueModalController from \"./fieldValueModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (sapSdSimRoleDataService, $filter, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.openFieldValueModal = openFieldValueModal;\r\n vm.deleteFieldValue = deleteFieldValue;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n getFieldValues();\r\n }\r\n\r\n async function getFieldValues() {\r\n vm.fieldValuesLoading = true;\r\n let response = await sapSdSimRoleDataService.getFieldValues(vm.simulation.Id, vm.selectedRole.Id, vm.selectedObject.Id, vm.field ? vm.field.Id : null);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.fieldValues = response.data;\r\n vm.fieldValuesLoading = false;\r\n }\r\n\r\n async function openFieldValueModal() {\r\n let fieldValueModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simFieldValuesList/fieldValueModal.tmpl.html',\r\n controller: fieldValueModalController,\r\n controllerAs: 'fvmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n simulation: () => vm.simulation,\r\n role: () => vm.selectedRole,\r\n field: () => vm.field,\r\n object: () => vm.selectedObject\r\n }\r\n });\r\n\r\n try {\r\n await fieldValueModal.result;\r\n await getFieldValues();\r\n updateLists();\r\n } catch { return; }\r\n }\r\n\r\n async function deleteFieldValue(fieldValue) {\r\n vm.fieldValuesLoading = true;\r\n await sapSdSimRoleDataService.deleteFieldValue(vm.simulation.Id, vm.selectedRole.Id, vm.selectedObject.Id, vm.field ? vm.field.Id : null, fieldValue.Id);\r\n await getFieldValues();\r\n updateLists();\r\n }\r\n\r\n function updateLists() {\r\n if (vm.field) {\r\n // need to refresh auth object fields list\r\n vm.simulationsCtrl.updateList('objectFields');\r\n vm.simulationsCtrl.updateList('authObjects');\r\n } else {\r\n // need to refresh org levels list\r\n vm.simulationsCtrl.updateList('orgLevels');\r\n }\r\n }\r\n}","import fieldValuesListController from \"./fieldValuesList.controller\";\r\n\r\n/* fieldValuesList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of sap security designer simulation field values\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationFieldValuesList = {\r\n require: {\r\n simulationsCtrl: '^sapSdSimulations'\r\n },\r\n bindings: {\r\n simulation: '<',\r\n selectedRole: '<',\r\n selectedObject: '<',\r\n field: '<'\r\n },\r\n controller: fieldValuesListController,\r\n controllerAs: 'fvlvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simFieldValuesList/fieldValuesList.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationFieldValuesList;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, simulationId, detailedReportType, roleType, helperService, sapSdSimAnalysisDataService, FileSaver) {\r\n const vm = this;\r\n vm.detailedReportType = detailedReportType;\r\n\r\n vm.dismiss = dismiss;\r\n vm.exportDetailedReport = exportDetailedReport;\r\n\r\n activate();\r\n\r\n function activate() {\r\n setupDetailedReportGrid();\r\n }\r\n\r\n function setupDetailedReportGrid() {\r\n vm.reportDetails = getReportRouteAndColumnDefinitions(detailedReportType);\r\n\r\n vm.detailedReportGridOptions = helperService.setMainGridOptions(vm.reportDetails.columnDefinitions, null);\r\n\r\n vm.detailedReportGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await sapSdSimAnalysisDataService.getRiskAnalysisReportStatistics(simulationId, vm.reportDetails.routeString);\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getReportRouteAndColumnDefinitions(reportType) {\r\n let reportDetails = {\r\n columnDefinitions: [],\r\n routeString: ''\r\n }, statusColumn = { title: \"Status\", field: \"AccessStatus\", width: 125, filterable: customAutoCompleteFilter, template: `{{dataItem.AccessStatus}}` };\r\n\r\n switch (reportType) {\r\n case 'roleRiskDetailed':\r\n reportDetails.columnDefinitions = [\r\n { title: \"Product\", field: \"ProductName\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"Role Id\", field: \"RoleId\", filterable: customAutoCompleteFilter, width: 100 },\r\n { title: \"Role Description\", field: \"RoleDescription\", filterable: customAutoCompleteFilter, width: 130 },\r\n { title: \"Ruleset\", field: \"RulesetName\", filterable: customAutoCompleteFilter, width: 130 },\r\n { title: \"Risk Id\", field: \"RiskId\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Risk Description\", field: \"RiskDescription\", filterable: customAutoCompleteFilter, width: 240 },\r\n { title: \"Risk Type\", field: \"RiskType\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Business Process\", field: \"BusinessProcess\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Business Process Group\", field: \"BusinessProcessGroup\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Security Object Name\", field: \"SecurityObjectName\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Security Object Type Name\", field: \"SecurityObjectTypeName\", filterable: customAutoCompleteFilter, width: 85 },\r\n { title: \"Authorization\", field: \"Authorization\", filterable: customAutoCompleteFilter, width: 100 },\r\n { title: \"Field\", field: \"Field\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"Low\", field: \"Low\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"High\", field: \"High\", filterable: customAutoCompleteFilter, width: 80 }\r\n ];\r\n vm.reportTitle = 'Role Risk Detailed';\r\n break;\r\n case 'compositeRoleRiskDetailed':\r\n reportDetails.columnDefinitions = [\r\n { title: \"Product\", field: \"ProductName\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"Role Id\", field: \"RoleId\", filterable: customAutoCompleteFilter, width: 100 },\r\n { title: \"Role Description\", field: \"RoleDescription\", filterable: customAutoCompleteFilter, width: 240 },\r\n { title: \"Single Role\", field: \"SingleRole\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Single Role Description\", field: \"SingleRoleDescription\", filterable: customAutoCompleteFilter, width: 240 },\r\n { title: \"Ruleset\", field: \"RulesetName\", filterable: customAutoCompleteFilter, width: 130 },\r\n { title: \"Risk Id\", field: \"RiskId\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Risk Description\", field: \"RiskDescription\", filterable: customAutoCompleteFilter, width: 240 },\r\n { title: \"Risk Type\", field: \"RiskType\", filterable: customAutoCompleteFilter, width: 120 },\r\n { title: \"Business Cycle\", field: \"BusinessCycle\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"Policy\", field: \"Policy\", filterable: customAutoCompleteFilter, width: 130 },\r\n { title: \"Risk Level\", field: \"RiskLevel\", filterable: customAutoCompleteFilter, width: 80 },\r\n { title: \"Default Mitigation\", field: \"DefaultMitigation\", filterable: customAutoCompleteFilter, width: 150 }\r\n ];\r\n vm.reportTitle = 'Composite Role Risk Detailed';\r\n break;\r\n case 'roleBpAccess':\r\n reportDetails.columnDefinitions = [\r\n { field: \"ObjectId\", title: \"Object Id\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"IsAssigned\", title: \"Is Assigned\", width: 180, filterable: customBooleanFilter },\r\n { field: \"ProcessId\", title: \"Business Process Id\", width: 180, filterable: customBooleanFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RoleType\", title: \"Role Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectLabel\", title: \"Object Label\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectType\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectTypeName\", title: \"Object Type Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetName\", title: \"Ruleset Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetLow\", title: \"Ruleset Low\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetHigh\", title: \"Ruleset High\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"AccessStatus\", title: \"Access Status\", width: 180, filterable: customAutoCompleteFilter }\r\n ];\r\n if (roleType === 'single') {\r\n reportDetails.columnDefinitions.unshift({ field: \"RoleName\", title: \"Role Name\", width: 180, filterable: customAutoCompleteFilter });\r\n reportDetails.routeString = 'rolebpdetailed';\r\n vm.reportTitle = 'Role Business Process Detailed';\r\n } else {\r\n reportDetails.columnDefinitions.unshift(\r\n { field: \"CompositeRoleName\", title: \"Composite Role Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"SingleRoleName\", title: \"Single Role Name\", width: 180, filterable: customAutoCompleteFilter });\r\n reportDetails.routeString = 'compositerolebpdetailed';\r\n vm.reportTitle = 'Composite Role Business Process Detailed';\r\n }\r\n break;\r\n case 'userBpAccess':\r\n reportDetails.columnDefinitions = [\r\n { field: \"UserName\", title: \"User Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserGroup\", title: \"User Group\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"UserType\", title: \"User Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ProcessName\", title: \"Business Process\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Type\", title: \"Type\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"Name\", title: \"Name\", width: 160, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectId\", title: \"Object ID\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectName\", title: \"Object Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectType\", title: \"Object Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetLow\", title: \"Ruleset Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetHigh\", title: \"Ruleset High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 130, filterable: customAutoCompleteFilter },\r\n ]\r\n reportDetails.routeString = 'userbpaccessdetailed ';\r\n vm.reportTitle = 'User Business Process Detailed';\r\n break;\r\n case 'userRisk':\r\n reportDetails.columnDefinitions = [\r\n { field: \"UserId\", title: \"User ID\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User Name\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserGroup\", title: \"User Group\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"UserType\", title: \"User Type\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessProcess\", title: \"Business Process\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"GroupName\", title: \"Group Name\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"GroupType\", title: \"Group Type\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"Role\", title: \"Role\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectProduct\", title: \"Security Object Product\", width: 80, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectLabel\", title: \"Object Label\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"ObjectType\", title: \"Object Type\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Authorization\", title: \"Authorization\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Field\", title: \"Field\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetLow\", title: \"Ruleset Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RulesetHigh\", title: \"Ruleset High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalLow\", title: \"Technical Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"Low\", title: \"Low\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"TechnicalHigh\", title: \"Technical High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"High\", title: \"High\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 320, filterable: customAutoCompleteFilter },\r\n ];\r\n reportDetails.routeString = 'userriskdetailed';\r\n vm.reportTitle = 'User Risk Detailed';\r\n break;\r\n }\r\n if (!reportDetails.routeString) {\r\n reportDetails.routeString = reportType;\r\n }\r\n reportDetails.columnDefinitions.push(statusColumn);\r\n\r\n return reportDetails;\r\n }\r\n\r\n async function exportDetailedReport() {\r\n vm.exportPending = new createSpinner();\r\n\r\n try {\r\n let response = await sapSdSimAnalysisDataService.exportRiskAnalysisReportDetails(simulationId, vm.reportDetails.routeString);\r\n await helperService.successfulSaveButton(vm.exportPending);\r\n FileSaver.saveAs(response.data, `${vm.reportDetails.routeString}.xlsx`);\r\n } catch {\r\n vm.exportPending.loadingValue = false;\r\n }\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport simRiskAnalysisReportDetailModalController from \"./simRiskAnalysisReport/simRiskAnalysisReportDetailModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, sapSdSimAnalysisDataService, helperService) {\r\n const vm = this;\r\n\r\n vm.analyzeSimulation = analyzeSimulation;\r\n vm.openDetailedReportModal = openDetailedReportModal;\r\n\r\n vm.showReport = false;\r\n\r\n vm.$onInit = activate;\r\n\r\n $scope.$on('RiskAnalysis', () => getAnalysisStatistics());\r\n\r\n function activate() {\r\n getAnalysisStatistics();\r\n vm.headerTitle = `SAP Security Designer Simulation Risk Analysis`;\r\n vm.headerDescription = `Risk Analysis for Simulation ${vm.simulation.Name}`;\r\n if (vm.simulation.Status === 'NeedsAnalysis') vm.showNeedsReAnalyzeMessage = true;\r\n }\r\n\r\n async function getAnalysisStatistics() {\r\n vm.statisticsLoading = true;\r\n try {\r\n let response = await sapSdSimAnalysisDataService.getSimulationAnalysisStats(vm.simulation.Id);\r\n vm.selectedSimulationStatistics = response.data;\r\n vm.statisticsNotFound = false;\r\n vm.statisticsLoading = false;\r\n } catch (error) {\r\n if (error.status === 404) {\r\n vm.statisticsNotFound = true;\r\n vm.statisticsLoading = false;\r\n } else {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n async function analyzeSimulation() {\r\n let data = {\r\n SimulationId: vm.simulation.Id\r\n }\r\n try {\r\n await swal(helperService.areYouSureParams(`Run Analysis`, `Are you sure you want to run the Simulation Analysis for Simulation ${vm.simulation.Name}?`, `Yes`, 'No'))\r\n await sapSdSimAnalysisDataService.analyzeSimulation(data);\r\n showNeedsReAnalyzeMessage = false;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openDetailedReportModal(detailedReportType, roleType) {\r\n let detailedReportModal = $uibModal.open({\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationRiskAnalysis/simRiskAnalysisReport/simRiskAnalysisReportDetailModal.tmpl.html',\r\n controller: simRiskAnalysisReportDetailModalController,\r\n controllerAs: 'drmvm',\r\n backdrop: 'static',\r\n size: 'xl',\r\n resolve: {\r\n simulationId: () => vm.simulation.Id,\r\n detailedReportType: () => detailedReportType,\r\n roleType: () => roleType\r\n }\r\n });\r\n\r\n // prevent unhandled rejection\r\n try {\r\n await detailedReportModal.result\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","import simRiskAnalysisController from \"./simRiskAnalysis.controller\";\r\n\r\n/* simRiskAnalysis.component.js */\r\n\r\n/**\r\n * @desc component for viewing sap security designer simulation risk analysis statistics\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationRiskAnalysis = {\r\n bindings: {\r\n simulation: '<'\r\n },\r\n controller: simRiskAnalysisController,\r\n controllerAs: 'sravm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationRiskAnalysis/simRiskAnalysis.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationRiskAnalysis;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function (helperService, sapSdSimAnalysisDataService) {\r\n const vm = this;\r\n\r\n vm.$onInit = setupGrid;\r\n\r\n function setupGrid() {\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n const response = await sapSdSimAnalysisDataService.getRiskAnalysisReportStatistics(vm.simulation.Id, vm.selectedReportType.toLowerCase())\r\n options.success(response.data)\r\n }\r\n }\r\n });\r\n\r\n let columns;\r\n const statusColumn = { title: \"Status\", field: \"Status\", width: 125, filterable: customAutoCompleteFilter, template: '{{dataItem.Status}}' };\r\n\r\n switch (vm.selectedReportType) {\r\n case 'roleRisk':\r\n columns = [\r\n { title: \"Role Name\", field: \"RoleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk ID\", field: \"RiskId\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Type\", field: \"RiskType\", filterable: customAutoCompleteFilter }\r\n ];\r\n break;\r\n case 'roleBpAccess':\r\n columns = [\r\n { title: \"Role Name\", field: \"RoleName\", filterable: customAutoCompleteFilter },\r\n { title: \"Object Name\", field: \"ObjectName\", filterable: customAutoCompleteFilter },\r\n { title: \"Object Type\", field: \"ObjectType\", filterable: customAutoCompleteFilter }\r\n ];\r\n break;\r\n case 'userRisk':\r\n columns = [\r\n { title: \"User Name\", field: \"UserName\", filterable: customAutoCompleteFilter },\r\n { title: \"Company Name\", field: \"CompanyName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk ID\", field: \"RiskId\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Name\", field: \"RiskName\", filterable: customAutoCompleteFilter },\r\n { title: \"Risk Type\", field: \"RiskType\", filterable: customAutoCompleteFilter }\r\n ];\r\n break;\r\n case 'userBpAccess':\r\n columns = [\r\n { title: \"User Name\", field: \"UserName\", filterable: customAutoCompleteFilter },\r\n { title: \"Company Name\", field: \"CompanyName\", filterable: customAutoCompleteFilter },\r\n { title: \"Object Name\", field: \"ObjectName\", filterable: customAutoCompleteFilter },\r\n { title: \"Object Type\", field: \"ObjectType\", filterable: customAutoCompleteFilter }\r\n ];\r\n break;\r\n }\r\n columns.push(statusColumn);\r\n \r\n\r\n vm.gridOptions = helperService.setMainGridOptions(columns, null);\r\n vm.gridOptions.selectable = false;\r\n }\r\n}","import simRiskAnalysisReportController from \"./simRiskAnalysisReport.controller\";\r\n\r\n/* simRiskAnalysisReport.component.js */\r\n\r\n/**\r\n * @desc component for viewing sap security designer simulation risk analysis statistics data in report format\r\n * @example \r\n */\r\n\r\nconst sapSdSimulationRiskAnalysisReport = {\r\n bindings: {\r\n simulation: '<',\r\n selectedReportType: '<',\r\n reportData: '<'\r\n },\r\n controller: simRiskAnalysisReportController,\r\n controllerAs: 'srarvm',\r\n templateUrl: '/App/Components/SAPSecurityDesigner/simulationRiskAnalysis/simRiskAnalysisReport/simRiskAnalysisReport.tmpl.html'\r\n};\r\n\r\nexport default sapSdSimulationRiskAnalysisReport;","import angular from 'angular';\r\nimport axSecurityDesignerSecurityMigration from '../Components/AXSecurityDesigner/SecurityMigration/securityMigration.component';\r\nimport axSecurityDesignerMigrationsList from '../Components/AXSecurityDesigner/SecurityMigration/MigrationsList/migrationsList.component';\r\nimport axSecurityDesignerMigrationDetailsGrid from '../Components/AXSecurityDesigner/SecurityMigration/MigrationDetails/migrationDetailsGrid.component';\r\nimport sapSdSimulations from '../Components/SAPSecurityDesigner/simulations.component';\r\nimport sapSdSimulationsList from '../Components/SAPSecurityDesigner/simulationsList/simulationsList.component';\r\nimport sapSdSimulationRolesList from '../Components/SAPSecurityDesigner/simulationRolesList/rolesList.component';\r\nimport sapSdSimulationCompositeRolesList from '../Components/SAPSecurityDesigner/simulationCompositeRolesList/compositeRolesList.component';\r\nimport sapSdSimulationRoleAuthObjectsList from '../Components/SAPSecurityDesigner/simRoleAuthObjectsList/roleAuthObjectsList.component';\r\nimport sapSdSimulationRoleOrgLevelsList from '../Components/SAPSecurityDesigner/simRoleOrgLevelsList/roleOrgLevelsList.component';\r\nimport sapSdSimulationsCompositeRoleRolesList from '../Components/SAPSecurityDesigner/compositeRoleRolesList/compositeRoleRolesList.component';\r\nimport sapSdSimulationRoleAuthObjectFieldsList from '../Components/SAPSecurityDesigner/simRoleAuthObjFieldsList/authObjectFieldsList.component';\r\nimport sapSdSimulationsRoleItemsList from '../Components/SAPSecurityDesigner/itemsList/items.component';\r\nimport sapSdSimulationFieldValuesList from '../Components/SAPSecurityDesigner/simFieldValuesList/fieldValuesList.component';\r\nimport sapSdSimulationRiskAnalysis from '../Components/SAPSecurityDesigner/simulationRiskAnalysis/simRiskAnalysis.component';\r\nimport sapSdSimulationRiskAnalysisReport from '../Components/SAPSecurityDesigner/simulationRiskAnalysis/simRiskAnalysisReport/simRiskAnalysisReport.component';\r\n\r\nexport default angular\r\n .module('app.securityDesigner.components', [])\r\n .component('axSecurityDesignerSecurityMigration', axSecurityDesignerSecurityMigration)\r\n .component('axSecurityDesignerMigrationsList', axSecurityDesignerMigrationsList)\r\n .component('axSecurityDesignerMigrationDetailsGrid', axSecurityDesignerMigrationDetailsGrid)\r\n .component('sapSdSimulations', sapSdSimulations)\r\n .component('sapSdSimulationsList', sapSdSimulationsList)\r\n .component('sapSdSimulationRolesList', sapSdSimulationRolesList)\r\n .component('sapSdSimulationCompositeRolesList', sapSdSimulationCompositeRolesList)\r\n .component('sapSdSimulationsRoleItemsList', sapSdSimulationsRoleItemsList)\r\n .component('sapSdSimulationCompositeRoleRolesList', sapSdSimulationsCompositeRoleRolesList)\r\n .component('sapSdAuthorizationObjectsList', sapSdSimulationRoleAuthObjectsList)\r\n .component('sapSdOrganizationalLevelsList', sapSdSimulationRoleOrgLevelsList)\r\n .component('sapSdAuthorizationObjectFieldsList', sapSdSimulationRoleAuthObjectFieldsList)\r\n .component('sapSdFieldValuesList', sapSdSimulationFieldValuesList)\r\n .component('sapSdSimulationRiskAnalysis', sapSdSimulationRiskAnalysis)\r\n .component('sapSdSimulationRiskAnalysisReport', sapSdSimulationRiskAnalysisReport)\r\n .name;","import securityMigrationController from \"./securityMigration.controller\";\r\n\r\n/* axSecurityDesignerSecurityMigration.component.js */\r\n\r\n/**\r\n * @desc component for viewing review assignments\r\n * @example \r\n */\r\n\r\nconst axSecurityDesignerSecurityMigration = {\r\n controller: securityMigrationController,\r\n controllerAs: 'smvm',\r\n templateUrl: '/App/Components/AXSecurityDesigner/SecurityMigration/securityMigration.html'\r\n};\r\n\r\nexport default axSecurityDesignerSecurityMigration;","export default /*@ngInject*/ function () {\r\n const vm = this;\r\n\r\n vm.selectedMigrationChanged = selectedMigrationChanged;\r\n\r\n function selectedMigrationChanged(migration) {\r\n vm.selectedMigration = null;\r\n vm.selectedMigration = migration;\r\n }\r\n}","import angular from 'angular';\r\nimport AXSecurityDesignerDutiesViewModel from '../Components/AXSecurityDesigner/Duties/AXSecurityDesignerDutiesViewModel';\r\nimport AXSecurityDesignerPrivilegesViewModel from '../Components/AXSecurityDesigner/Privileges/AXSecurityDesignerPrivilegesViewModel';\r\nimport AXSecurityDesignerRolesViewModel from '../Components/AXSecurityDesigner/Roles/AXSecurityDesignerRolesViewModel';\r\nimport AXSecurityDesignerSecurityModelsViewModel from '../Components/AXSecurityDesigner/SecurityModels/AXSecurityDesignerSecurityModelsViewModel';\r\nimport AXSecurityDesignerSimulationDetailsViewModel from '../Components/AXSecurityDesigner/SimulationDetails/AXSecurityDesignerSimulationDetailsViewModel';\r\nimport taskRecordingManagerController from '../Components/AXSecurityDesigner/taskRecordingManager/taskRecordingManager.controller';\r\nimport securityDesignerFactoriesModule from './securityDesigner.factories.module';\r\nimport securityDesignerComponentsModule from './securityDesigner.components.module';\r\n\r\nexport default angular\r\n .module('app.securityDesigner', [securityDesignerFactoriesModule, securityDesignerComponentsModule])\r\n .controller(\"AXSecurityDesignerDutiesViewModel\", AXSecurityDesignerDutiesViewModel)\r\n .controller(\"AXSecurityDesignerPrivilegesViewModel\", AXSecurityDesignerPrivilegesViewModel)\r\n .controller(\"AXSecurityDesignerRolesViewModel\", AXSecurityDesignerRolesViewModel)\r\n .controller(\"AXSecurityDesignerSecurityModelsViewModel\", AXSecurityDesignerSecurityModelsViewModel)\r\n .controller(\"AXSecurityDesignerSimulationDetailsViewModel\", AXSecurityDesignerSimulationDetailsViewModel)\r\n .controller(\"taskRecordingManagerController\", taskRecordingManagerController)\r\n .name;","export default /*@ngInject*/ function ($http, errorsDataService, dataService, authenticationService) {\r\n const service = {\r\n getOpenRequests,\r\n checkForCancelOrEditAllRequests,\r\n cancelRequest\r\n };\r\n\r\n return service;\r\n\r\n async function getOpenRequests() {\r\n try {\r\n return await $http.get(apiUrl + 'api/identitymanager/requests/open');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function checkForCancelOrEditAllRequests(cancelOrEditAllRequests) {\r\n const user = await authenticationService.getUser(),\r\n { data } = await dataService.getClaims(user.userId);\r\n\r\n return data.some(data => data.Value === cancelOrEditAllRequests);\r\n }\r\n\r\n async function cancelRequest(request, data) {\r\n try {\r\n return await $http.put(apiUrl + 'api/identitymanager/requests/' + request.Id + '/version/' + request.Version + '/cancel', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getApprovalRules,\r\n getApprovalRuleTypes,\r\n getRolesByProductId,\r\n removeApprovalRule,\r\n addApprovalRule,\r\n updateApprovalRule,\r\n updateApprovalRuleType\r\n };\r\n\r\n return service;\r\n\r\n //GET Requests\r\n async function getApprovalRules() {\r\n try {\r\n return await $http.get(apiUrl + 'api/identitymanager/approvalrules');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n\r\n }\r\n\r\n async function getApprovalRuleTypes() {\r\n try {\r\n return await $http.get(apiUrl + 'api/identitymanager/approvalruletypes');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n\r\n }\r\n\r\n async function getRolesByProductId(productId) {\r\n try {\r\n return await $http.get(apiUrl + 'api/identitymanager/' + productId + '/roles');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n //DELETE Requests\r\n async function removeApprovalRule(approvalRuleId) {\r\n try {\r\n return await $http.delete(apiUrl + 'api/identitymanager/approvalrules/' + approvalRuleId);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n\r\n }\r\n\r\n //POST Requests\r\n async function addApprovalRule(data) {\r\n try {\r\n return await $http.post(apiUrl + 'api/identitymanager/approvalrules', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n }\r\n\r\n //PUT Requests\r\n async function updateApprovalRule(ruleTypeId, data) {\r\n try {\r\n return await $http.put(apiUrl + 'api/identitymanager/approvalrules/' + ruleTypeId, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n }\r\n\r\n async function updateApprovalRuleType(ruleTypeId, data) {\r\n try {\r\n return await $http.put(apiUrl + 'api/identitymanager/approvalruletypes/' + ruleTypeId, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport openRequestsDataServiceFactory from '../Components/openRequests/openRequestsDataService.factory';\r\nimport approvalRulesDataServiceFactory from '../Components/ApprovalRules/approvalRulesDataService.factory';\r\n\r\nexport default angular\r\n .module('app.identityManager.factories', [])\r\n .factory('openRequestsDataService', openRequestsDataServiceFactory)\r\n .factory('approvalRulesDataService', approvalRulesDataServiceFactory)\r\n .name;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, $filter, helperService, $http, row, grid, request, statusDataService) {\r\n\r\n $scope.originalMitigation = $scope.riskToMitigate.MitigationID;\r\n $scope.originalStatus = $scope.riskToMitigate.StatusID;\r\n $scope.originalMitigationNotes = $scope.riskToMitigate.MitigationNotes;\r\n\r\n function activate() {\r\n\r\n getItemPillLabels();\r\n getStandardMitigations();\r\n getMitigations();\r\n setupAdditionalMitigationsObject();\r\n getAdditionalCompaniesDataSource();\r\n\r\n if (row.RequestMitigation === 'Edit') {\r\n populateModalFieldsWithEditedMitigationRequestData();\r\n } else {\r\n setupDefaultModalFields();\r\n }\r\n }\r\n\r\n activate();\r\n\r\n function getStandardMitigations() {\r\n $http.get(apiUrl + 'api/core/configuration/ARM_StandardMitigations').then(function (response) {\r\n $scope.standardMitigations = response.data;\r\n });\r\n }\r\n\r\n function getControlLibrary() {\r\n $scope.controlsLoading = true;\r\n return $http.get(apiUrl + 'api/arm/controls').then(function (response) {\r\n $scope.controlLibrary = response.data;\r\n $scope.controlsLoading = false;\r\n });\r\n }\r\n\r\n function setupControls() {\r\n $scope.selectedControls = new Array();\r\n $scope.originalControls = new Array();\r\n return;\r\n }\r\n\r\n function getStatuses() {\r\n statusDataService.getStatuses().then(function (response) {\r\n response.data = $filter('filter')(response.data, { CanCurrentUserAccess: true });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.statuses = response.data;\r\n });\r\n }\r\n\r\n function populateModalFieldsWithEdits() {\r\n if (row.Controls) {\r\n row.Controls.forEach(control => {\r\n let controlToAdd = $scope.controlLibrary.find(c => c.Identifier === control);\r\n if (controlToAdd) $scope.selectedControls.push(controlToAdd);\r\n });\r\n }\r\n $scope.riskToMitigate.MitigationID = row.RequestMitigationId;\r\n $scope.riskToMitigate.StatusID = row.RequestMitigationStatusId;\r\n $scope.riskToMitigate.MitigationNotes = row.RequestMitigationNotes;\r\n }\r\n\r\n function setupDefaultModalFields() {\r\n getControlLibrary().then(_ => setupControls()).then(_ => getStatuses());\r\n }\r\n\r\n function populateModalFieldsWithEditedMitigationRequestData() {\r\n getControlLibrary().then(_ => setupControls()).then(_ => getStatuses()).then(_ => populateModalFieldsWithEdits());\r\n }\r\n\r\n function getAdditionalCompaniesDataSource() {\r\n\r\n $scope.mitigateAddtionalDataSource = [];\r\n\r\n grid.forEach(item => {\r\n if (item.RiskId === row.RiskId && item.CompanyName !== row.CompanyName) {\r\n $scope.mitigateAddtionalDataSource.push(item);\r\n }\r\n });\r\n }\r\n\r\n function getItemPillLabels() {\r\n $http.get(apiUrl + 'api/arm/risks/' + $scope.riskToMitigate.RiskId).then(function (response) {\r\n $scope.riskObjects = response.data;\r\n });\r\n }\r\n\r\n function getMitigations() {\r\n $http.get(apiUrl + 'api/arm/mitigations').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.mitigations = response.data;\r\n });\r\n }\r\n\r\n function setupAdditionalMitigationsObject() {\r\n $scope.mitigatedRisk = {\r\n selectedMitigateAddtional: '',\r\n companyIds: ''\r\n };\r\n }\r\n\r\n $scope.requestRiskMitigation = async function () {\r\n $scope.riskToMitigate.updateInProgress = new createSpinner();\r\n\r\n let userMitigation = {\r\n \"RequestMitigationId\": $scope.riskToMitigate.RequestMitigationIdentifier,\r\n \"RequestId\": request.Id,\r\n \"Version\": request.Version,\r\n \"CompanyMasterId\": $scope.riskToMitigate.CompanyMasterID,\r\n \"RiskId\": $scope.riskToMitigate.RiskId,\r\n \"MitigationId\": $scope.riskToMitigate.MitigationID,\r\n \"MitigationNotes\": $scope.riskToMitigate.MitigationNotes,\r\n \"StatusId\": $scope.riskToMitigate.StatusID,\r\n \"Controls\": $scope.selectedControls.map(x => x.Identifier)\r\n };\r\n\r\n if ($scope.riskToMitigate.MitigationID) {\r\n userMitigation.Controls = null;\r\n } else if ($scope.selectedControls) {\r\n userMitigation.MitigationId = null;\r\n }\r\n\r\n grid.forEach(item => {\r\n // Create status for new request.\r\n if (item.RiskId === userMitigation.RiskId && item.CompanyMasterID === userMitigation.CompanyMasterId) {\r\n item.RequestMitigation = 'Edit';\r\n item.RequestMitigationId = userMitigation.MitigationId;\r\n item.RequestMitigationNotes = userMitigation.MitigationNotes;\r\n item.RequestMitigationStatusId = userMitigation.StatusId;\r\n item.Controls = userMitigation.Controls;\r\n }\r\n });\r\n\r\n $scope.killModal = true;\r\n try {\r\n await $http.post(apiUrl + 'api/identityManager/requests/' + request.Id + '/version/' + request.Version + '/mitigations', userMitigation);\r\n await $scope.mitigateInAdditionalCompanies();\r\n await helperService.successfulSaveButton($scope.riskToMitigate.updateInProgress);\r\n $uibModalInstance.close(true);\r\n $scope.$parent.vm.RisksDataSource.read();\r\n } catch (error) {\r\n $scope.riskToMitigate.updateInProgress.loadingValue = false;\r\n helperService.showErrorMessage(error.data);\r\n }\r\n\r\n };\r\n\r\n $scope.mitigateInAdditionalCompanies = async function () {\r\n if ($scope.mitigatedRisk && $scope.mitigatedRisk.additionalCompanies) {\r\n if ($scope.mitigatedRisk.additionalCompanies && $scope.mitigatedRisk.additionalCompanies.length > 0) {\r\n const additionalCompanies = $scope.mitigatedRisk.additionalCompanies;\r\n\r\n try {\r\n for (const company of additionalCompanies) {\r\n let additionalUserMitigation = {\r\n \"RequestMitigationId\": $scope.riskToMitigate.RequestMitigationId, \"RequestId\": request.Id,\r\n \"Version\": request.Version,\r\n \"CompanyMasterId\": company.CompanyMasterID,\r\n \"RiskId\": $scope.riskToMitigate.RiskId,\r\n \"MitigationId\": $scope.riskToMitigate.MitigationID,\r\n \"MitigationNotes\": $scope.riskToMitigate.MitigationNotes,\r\n \"StatusId\": $scope.riskToMitigate.StatusID,\r\n \"Controls\": $scope.selectedControls.map(x => x.Identifier)\r\n };\r\n\r\n if ($scope.riskToMitigate.MitigationID) {\r\n additionalUserMitigation.Controls = null;\r\n } else if ($scope.selectedControls) {\r\n additionalUserMitigation.MitigationId = null;\r\n }\r\n\r\n grid.forEach(item => {\r\n // Create status for new request.\r\n if (item.RiskId === additionalUserMitigation.RiskId && item.CompanyMasterID === additionalUserMitigation.CompanyMasterId) {\r\n item.RequestMitigation = 'Edit';\r\n item.RequestMitigationId = additionalUserMitigation.RequestMitigationId;\r\n item.RequestMitigationNotes = additionalUserMitigation.MitigationNotes;\r\n item.RequestMitigationStatusId = additionalUserMitigation.StatusId;\r\n item.Controls = additionalUserMitigation.Controls;\r\n }\r\n });\r\n\r\n await $http.post(apiUrl + 'api/identityManager/requests/' + request.Id + '/version/' + request.Version + '/mitigations', additionalUserMitigation);\r\n }\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, mainGrid, helperService, disableObjectData) {\r\n\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n\r\n var RisksColumns = [\r\n { field: \"Comparison\", width: 100, template: '{{dataItem.Comparison}}' },\r\n { field: \"RequestMitigation\", title: \"Request Mitigation\", template: \"{{dataItem.RequestMitigation}}{{dataItem.RequestMitigation}}\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyName\", title: \"Company\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 190, filterable: customAutoCompleteFilter, groupHeaderTemplate: \"#= value #\" },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Current Mitigation\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationStatus\", title: \"Current Mitigation Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RequestMitigationStatusName\", title: \"Request Mitigation Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Current Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RequestMitigationNotes\", title: \"Request Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Current Mitigation Controls\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RequestMitigationControlNames\", title: \"Request Mitigation Controls\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ProductID\", title: \"ProductID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityRoleID\", title: \"Security Role ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectTypeID\", title: \"Security ObjectType ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectID\", title: \"Security Object ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AccessTypeID\", title: \"Access Type ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true }\r\n ];\r\n\r\n vm.RisksOptions = helperService.setMainGridOptions(RisksColumns, null);\r\n if (!disableObjectData) {\r\n vm.RisksOptions.detailTemplate = kendo.template($(\"#risksTemplate\").html());\r\n }\r\n vm.RisksOptions.selectable = false;\r\n vm.RisksOptions.columnMenu = true;\r\n vm.RisksOptions.filterable = {\r\n mode: \"row\",\r\n operators: {\r\n string: {\r\n contains: \"Contains\",\r\n doesnotcontain: \"Does not contain\",\r\n eq: \"Equal to\",\r\n neq: \"Not equal to\"\r\n }\r\n }\r\n };\r\n\r\n vm.RisksDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n data: mainGrid,\r\n schema: {\r\n model: {\r\n fields: {\r\n RiskId: { type: \"number\" }\r\n }\r\n }\r\n },\r\n pageable: false\r\n });\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $http, helperService, errorsDataService, request) {\r\n\r\n const vm = this;\r\n\r\n vm.submitRequestAction = submitRequestAction;\r\n vm.cancel = cancel;\r\n\r\n async function submitRequestAction() {\r\n\r\n vm.updatePending = new createSpinner();\r\n let accessItems = request.RequestAccesses.filter(access => access.Action && access.Action !== 'Delegated');\r\n let userItems = request.RequestUsers.filter(user => user.Action && user.Action !== 'Delegated');\r\n\r\n accessItems = accessItems.map(item => {\r\n let newItem = {\r\n RequestAccessId: item.Id,\r\n Approved: item.Action === 'Approve' ? true : false\r\n };\r\n return newItem;\r\n });\r\n\r\n userItems = userItems.map(item => {\r\n let newItem = {\r\n RequestUserId: item.Id,\r\n Approved: item.Action === 'Approve' ? true : false\r\n };\r\n return newItem;\r\n });\r\n\r\n let postData = {\r\n \"RequestId\": request.Id,\r\n \"Version\": request.Version,\r\n \"Notes\": vm.approveDeny.note,\r\n \"AccessItems\": accessItems,\r\n \"UserItems\": userItems\r\n };\r\n\r\n try {\r\n let response = await $http.post(apiUrl + 'api/identitymanager/requests/' + request.Id + '/version/' + request.Version + '/reviews', postData);\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n $uibModalInstance.close(response.status);\r\n } catch (err) {\r\n vm.updatePending.loadingValue = false;\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, $uibModalInstance, $filter, authenticationService, errorsDataService, dataService, helperService, request, delegationItems, requestType) {\r\n\r\n const vm = this;\r\n vm.delegation = {};\r\n vm.userDropdownLoading = false;\r\n vm.helperService = helperService;\r\n vm.cancel = cancel;\r\n vm.requestDelegation = requestDelegation;\r\n\r\n activate();\r\n\r\n function activate() {\r\n getUsers();\r\n }\r\n\r\n async function getUsers() {\r\n vm.userDropdownLoading = true;\r\n const currentUser = await authenticationService.getUser();\r\n let response = await dataService.getUsers();\r\n response.data = response.data.filter(user => user.UserID !== currentUser.userId && user.UserID !== request.Requestor);\r\n response.data = $filter('orderBy')(response.data, 'UserLogonName');\r\n response.data = response.data.filter(user => user.Active && user.RestrictDelegateAccessIM === false);\r\n vm.usersDataSource = response.data;\r\n vm.userDropdownLoading = false;\r\n }\r\n\r\n async function requestDelegation() {\r\n vm.delegationPending = new createSpinner();\r\n let data = {\r\n RequestId: request.Id,\r\n Version: request.Version,\r\n DelegatedUserId: vm.delegation.selectedUser,\r\n Notes: vm.delegation.notes,\r\n RequestUserIds: requestType === 'User' ? delegationItems.map(user => user.Id) : null,\r\n RequestAccessIds: requestType === 'Access' ? delegationItems.map(access => access.Id) : null\r\n };\r\n\r\n try { \r\n await $http.post(apiUrl + 'api/identitymanager/requests/' + request.Id + '/version/' + request.Version + '/delegations', data);\r\n await helperService.successfulSaveButton(vm.delegationPending);\r\n $uibModalInstance.close(delegationItems);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n vm.delegationPending.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, $uibModalInstance, helperService, selectedAccessItemsForAction, request, errorsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.cancel = cancel;\r\n\r\n vm.accessItems = selectedAccessItemsForAction;\r\n vm.requestType = request.Action;\r\n vm.requestId = request.Id;\r\n\r\n vm.fromDateChanged = fromDateChanged;\r\n vm.toDateChanged = toDateChanged;\r\n vm.saveEffectiveDates = saveEffectiveDates;\r\n\r\n activate();\r\n\r\n function activate() {\r\n // Set up Min Dates for each item\r\n vm.accessItems.forEach(access => {\r\n access.minStartDate = new Date();\r\n access.minEndDate = new Date();\r\n access.maxEndDate = new Date(2900, 0, 1, 0, 0, 0);\r\n\r\n if (access.StartDate) {\r\n access.StartDate = new Date(access.StartDate);\r\n }\r\n\r\n if (access.EndDate) {\r\n access.EndDate = new Date(access.EndDate);\r\n }\r\n\r\n if (access.originalStartDate > new Date()) {\r\n access.minEndDate = access.StartDate;\r\n access.readOnly = false;\r\n } else {\r\n access.minEndDate = new Date();\r\n access.minStartDate = new Date(null);\r\n access.readOnly = true;\r\n }\r\n\r\n access.invalidEmergencyAccessEndDate = false;\r\n\r\n if (vm.requestType === 'EmergencyAccess') {\r\n access.maxEndDate = new Date();\r\n access.maxEndDate.setTime(vm.maxEndDate.getTime() + (vm.emergencyAccessPeriod * 60 * 60 * 1000));\r\n }\r\n\r\n });\r\n\r\n vm.changeMade = false;\r\n vm.emergencyAccessPeriod = Number(JSON.parse(localStorage.getItem(\"ConfigurationValues\")).MaxFirefighterAccessPeriod);\r\n }\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function fromDateChanged(access) {\r\n vm.changeMade = true;\r\n if (!access.StartDate) {\r\n access.minEndDate = new Date();\r\n } else {\r\n access.minEndDate = access.StartDate;\r\n }\r\n if (vm.requestType === 'EmergencyAccess') {\r\n access.maxEndDate = new Date(access.StartDate);\r\n access.maxEndDate.setTime(access.maxEndDate.getTime() + (vm.emergencyAccessPeriod * 60 * 60 * 1000));\r\n }\r\n vm.rebindEffectiveDates = vm.rebindEffectiveDates === 0 ? 1 : 0;\r\n }\r\n\r\n function toDateChanged(access) {\r\n vm.changeMade = true;\r\n\r\n if (!isDate(access.EndDate)) {\r\n access.EndDate = null;\r\n }\r\n\r\n if (vm.requestType === 'EmergencyAccess') {\r\n if (access.EndDate > access.maxEndDate) {\r\n access.invalidEmergencyAccessEndDate = true;\r\n } else {\r\n access.invalidEmergencyAccessEndDate = false;\r\n }\r\n }\r\n\r\n vm.rebindEffectiveDates = vm.rebindEffectiveDates === 0 ? 1 : 0;\r\n }\r\n\r\n function isDate(x) {\r\n return x instanceof Date;\r\n }\r\n\r\n async function saveEffectiveDates() {\r\n vm.saving = new createSpinner();\r\n let effectiveDates = [];\r\n vm.accessItems.forEach(access => {\r\n effectiveDates.push({\r\n \"RequestAccessId\": access.Id,\r\n \"StartDate\": access.StartDate,\r\n \"EndDate\": access.EndDate\r\n });\r\n });\r\n\r\n let putData = {\r\n \"RequestId\": request.Id,\r\n \"Version\": request.Version,\r\n \"RequestEffectiveDates\": effectiveDates\r\n };\r\n\r\n try {\r\n await $http.put(apiUrl + 'api/identitymanager/requests/' + request.Id + '/version/' + request.Version + '/effectivedates', putData);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch (err) {\r\n vm.saving.loadingValue = false;\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $http, helperService, errorsDataService, requestData) {\r\n\r\n const vm = this;\r\n vm.requestData = requestData;\r\n vm.submitCancelNotes = submitCancelNotes;\r\n vm.cancel = cancel;\r\n\r\n async function submitCancelNotes() {\r\n\r\n vm.savePending = new createSpinner();\r\n\r\n try {\r\n await $http.put(`${apiUrl}api/identitymanager/requests/${requestData.RequestId}/version/${requestData.Version}/cancel`, vm.requestData);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n $uibModalInstance.close();\r\n } catch (err) {\r\n vm.savePending.loadingValue = false;\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, $uibModalInstance, helperService, request, errorsDataService, $scope) {\r\n\r\n const vm = this;\r\n\r\n vm.request = { ...request };\r\n vm.saveRequestExpirationDate = saveRequestExpirationDate;\r\n vm.dismiss = dismiss;\r\n\r\n vm.minStartDate = new Date();\r\n\r\n\r\n async function saveRequestExpirationDate() {\r\n vm.saving = new createSpinner();\r\n\r\n let putData = {\r\n RequestId: request.Id,\r\n Version: request.Version,\r\n ExpirationDate: vm.request.ExpirationDate ? new Date(vm.request.ExpirationDate).toUTCString() : null\r\n };\r\n\r\n try {\r\n await $http.put(`${apiUrl}api/identitymanager/requests/${request.Id}/version/${request.Version}/expirationdate`, putData);\r\n\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch (err) {\r\n vm.saving.loadingValue = false;\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport { standardGridPageSize, customAutoCompleteFilter, customDatePickerFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport requestDetailsUserRisksMitigationModalController from \"./UserRisksMitigationModal/requestDetailsUserRisksMitigationModal.controller\";\r\nimport requestDetailsModalController from \"./RequestDetailsModal/requestDetailsModal.controller\";\r\nimport approveDenyModalController from \"./ApproveDenyModal/approveDenyModal.controller\";\r\nimport requestDelegationModalController from \"./DelegationModal/requestDelegationModal.controller\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport editEffectiveDatesModalController from \"./EditEffectiveDatesModal/editEffectiveDatesModal.controller\";\r\nimport cancellationNotesModalController from \"./cancellationNotesModal/cancellationNotesModal.controller\";\r\nimport editRequestExpirationModalController from \"./EditRequestExpirationModal/editRequestExpirationModal.controller\";\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $uibModal, RequestManagementLoadDataService, emailNavigationService, openRequestsDataService, configurationDataService, $route, authenticationService, $filter, $http, $window, $location, helperService, FileSaver, controlLibraryDataService) {\r\n\r\n var vm = $scope.vm = {};\r\n vm.helperService = helperService;\r\n vm.requestDetails = null;\r\n vm.pageParams = $location.search();\r\n const tenantInlocalStorage = angular.fromJson(localStorage.getItem(\"selectedTenant\"));\r\n vm.selectedItemsForAction = [];\r\n vm.allUserSelected = false;\r\n vm.allAccessSelected = false;\r\n vm.selectedUserItemsForAction = [];\r\n vm.selectedAccessItemsForAction = [];\r\n vm.attachments = [];\r\n vm.changesToSubmit = false;\r\n vm.emergencyAccessStatus = null;\r\n vm.selectedDetailView = 'Notes';\r\n vm.awaitingRequestProcessing = false;\r\n\r\n vm.requestRiskMitigation = requestRiskMitigation;\r\n vm.expandDetails = expandDetails;\r\n vm.openApproveDenyRequestModal = openApproveDenyRequestModal;\r\n vm.updateSelectedAccessItemsForAction = updateSelectedAccessItemsForAction;\r\n vm.updateSelectedUserItemsForAction = updateSelectedUserItemsForAction;\r\n vm.selectAllAccesses = selectAllAccesses;\r\n vm.selectAllUsers = selectAllUsers;\r\n vm.applyActionToSelectedItems = applyActionToSelectedItems;\r\n vm.collectTCodeUsage = collectTCodeUsage;\r\n vm.openEffectiveDateModal = openEffectiveDateModal;\r\n vm.openEditRequestExpirationModal = openEditRequestExpirationModal;\r\n vm.removeFile = removeFile;\r\n vm.downloadFile = downloadFile;\r\n vm.hideBackButton = false;\r\n\r\n async function activate() {\r\n vm.disableObjectLevelRiskAnalysis = await getDisableObjectLevelConfiguration();\r\n vm.currentUser = await authenticationService.getUser();\r\n checkForCancelOrEditAllRequests();\r\n redirectIfNeeded();\r\n defineColumnsAndReports();\r\n }\r\n\r\n activate();\r\n\r\n $scope.$on('$locationChangeStart', (e, newUrl) => {\r\n if (checkForUnsavedChanges() && !vm.awaitingRequestProcessing) {\r\n e.preventDefault();\r\n swal(helperService.areYouSureParams('Pending Changes', 'Any request items with pending approve or deny actions will not be saved until you have submitted. Do you still want to continue?', 'Yes')).then(_ => {\r\n $window.location.href = newUrl;\r\n }).catch(_ => {\r\n return;\r\n });\r\n }\r\n });\r\n\r\n $scope.$on('RequestReview', _ => {\r\n $route.reload();\r\n });\r\n\r\n async function getDisableObjectLevelConfiguration() {\r\n const disableObjectLevelRiskAnalysis = await configurationDataService.getConfigurationValueByName(\"IM_DisableObjectLevelRiskAnalysis\");\r\n return disableObjectLevelRiskAnalysis.data === 1;\r\n }\r\n\r\n function checkForUnsavedChanges() {\r\n return vm.selectedAccessItemsForAction.length > 0 || vm.selectedUserItemsForAction.length > 0 || vm.req && vm.req.RequestAccesses.some(access => access.Action && access.Action !== 'Delegated') || vm.req && vm.req.RequestUsers.some(user => user.Action && user.Action !== 'Delegated');\r\n }\r\n\r\n // Attachments Logic\r\n\r\n async function removeFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n\r\n const index = vm.attachments.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.attachments.splice(index, 1);\r\n vm.fileActionPending = false;\r\n } catch {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function downloadFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n const response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n vm.fileActionPending = false;\r\n } catch {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function redirectIfNeeded() {\r\n try {\r\n if (vm.pageParams.tenantid) {\r\n vm.hideBackButton = true;\r\n\r\n if (vm.pageParams.tenantid === tenantInlocalStorage.ID) {\r\n vm.sufficientSecurityAccess = true;\r\n return;\r\n } else {\r\n await findTenantFromEmail();\r\n }\r\n } else {\r\n vm.sufficientSecurityAccess = true;\r\n return;\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function findTenantFromEmail() {\r\n emailNavigationService.availableTenants(vm.currentUser.userId)\r\n .then(response => {\r\n\r\n let validTenant = response.data.find(tenant => {\r\n return tenant.ID === vm.pageParams.tenantid;\r\n });\r\n\r\n if (validTenant) {\r\n vm.redirectToTenant = true;\r\n localStorage.setItem(\"selectedTenant\", JSON.stringify(angular.copy(validTenant)));\r\n $window.location.reload();\r\n } else {\r\n vm.insufficientSecurityAccess = true;\r\n }\r\n\r\n });\r\n }\r\n\r\n var requestIdParam = null;\r\n if (vm.pageParams.requestid) {\r\n requestIdParam = vm.pageParams.requestid;\r\n }\r\n if (vm.pageParams.RequestId) {\r\n requestIdParam = vm.pageParams.RequestId;\r\n }\r\n\r\n var requestVersionParam = null;\r\n if (vm.pageParams.Version) {\r\n requestVersionParam = vm.pageParams.Version;\r\n }\r\n if (vm.pageParams.version) {\r\n requestVersionParam = vm.pageParams.version;\r\n }\r\n\r\n vm.reportDetailsComplete = false;\r\n\r\n async function createDataSources(data) {\r\n if (vm.emergencyAccessStatus) {\r\n const requestedResponse = await $http.get(`${apiUrl}api/identitymanager/requests/${vm.req.Id}/version/${vm.req.Version}/emergencyaccessobjects`);\r\n data.TCodeRequest = requestedResponse.data;\r\n const usageResponse = await $http.get(`${apiUrl}api/identitymanager/requests/${vm.req.Id}/version/${vm.req.Version}/emergencyaccess/usage`);\r\n data.TCodeUsage = usageResponse.data;\r\n vm.selectedDetailView = 'TCodes';\r\n }\r\n vm.ApprovalsRequiredDataSource = new kendo.data.DataSource({\r\n data: data.Reviewers\r\n });\r\n vm.ApprovalsSubmittedDataSource = new kendo.data.DataSource({\r\n data: data.Reviews\r\n });\r\n vm.ErrorLogDataSource = new kendo.data.DataSource({\r\n data: data.Errors\r\n });\r\n vm.TCodeRequestedDataSource = new kendo.data.DataSource({\r\n data: data.TCodeRequest\r\n });\r\n vm.TCodeUsageDataSource = new kendo.data.DataSource({\r\n data: data.TCodeUsage\r\n });\r\n\r\n if (data.RiskAnalysis) {\r\n\r\n vm.RisksDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n data: data.RiskAnalysis.UserRisks,\r\n schema: {\r\n model: {\r\n fields: {\r\n RiskId: { type: \"number\" }\r\n }\r\n }\r\n },\r\n pageable: false\r\n });\r\n\r\n vm.BusinessProcessDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n data: data.RiskAnalysis.BusinessProcesses,\r\n group: [{ field: \"BusinessProcessGroupName\", dir: \"asc\" }, { field: \"ObjectComparison\", dir: \"asc\" }]\r\n });\r\n\r\n }\r\n\r\n vm.ucExistingTotal = 0;\r\n vm.ucNewTotal = 0;\r\n vm.ucRemovedTotal = 0;\r\n vm.ucTotal = 0;\r\n\r\n //Assign totals for summary grids\r\n if (data.RiskAnalysis) {\r\n //Assign totals for summary grids\r\n vm.riskResults = data.RiskAnalysis;\r\n\r\n vm.ucExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Existing');\r\n vm.ucNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Added');\r\n vm.ucRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Deleted');\r\n vm.ucTotal = vm.ucExistingTotal + vm.ucNewTotal;\r\n\r\n vm.bpGroupExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Existing');\r\n vm.bpGroupNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Added');\r\n vm.bpGroupRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Deleted');\r\n vm.bpGroupTotal = vm.bpGroupExistingTotal + vm.bpGroupNewTotal;\r\n\r\n vm.bpObjectExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Existing');\r\n vm.bpObjectNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Added');\r\n vm.bpObjectRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Deleted');\r\n vm.bpObjectTotal = vm.bpObjectExistingTotal + vm.bpObjectNewTotal;\r\n }\r\n\r\n vm.notesList = data.Notes;\r\n }\r\n\r\n async function collectTCodeUsage() {\r\n vm.collecting = new createSpinner();\r\n let postBody = {\r\n RequestId: vm.req.Id,\r\n Version: vm.req.Version\r\n };\r\n try {\r\n await $http.post(`${apiUrl}api/identitymanager/requests/${vm.req.Id}/version/${vm.req.Version}/emergencyaccess/usage/collect`, postBody);\r\n await helperService.successfulSaveButton(vm.collecting);\r\n let response = await $http.get(`${apiUrl}api/identitymanager/requests/${vm.req.Id}/version/${vm.req.Version}/emergencyaccess/usage`);\r\n vm.TCodeUsageDataSource = response.data;\r\n await vm.TCodeUsageDataSource.read();\r\n } catch {\r\n vm.collecting.loadingValue = false;\r\n }\r\n }\r\n\r\n async function checkForCancelOrEditAllRequests() {\r\n vm.cancelAllRequests = await openRequestsDataService.checkForCancelOrEditAllRequests(\"Cancel Other User's Requests\");\r\n vm.editAllRequests = await openRequestsDataService.checkForCancelOrEditAllRequests('Edit All Requests');\r\n }\r\n\r\n vm.editRequest = function () {\r\n $rootScope.requestToEdit = { Id: vm.req.Id, Version: vm.req.Version };\r\n $location.path('/IdentityManager/Place/RequestManagement/' + vm.req.Action).search({});\r\n };\r\n\r\n vm.cancelRequest = function () {\r\n swal(helperService.areYouSureParams('Cancel Request', 'Are you sure you want to cancel this request?', 'Yes', 'No')).then(async function () {\r\n var putData = {\r\n \"RequestId\": vm.req.Id,\r\n \"Version\": vm.req.Version\r\n };\r\n\r\n const requireNotes = await helperService.getConfigurationValue('IM_RequireNoteOnCancelledRequests') === '1';\r\n\r\n if (requireNotes) {\r\n openCancellationNotesModal(putData);\r\n } else {\r\n $http.put(`${apiUrl}api/identitymanager/requests/${vm.req.Id}/version/${vm.req.Version}/cancel`, putData).then(function (response) {\r\n $route.reload();\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n async function openCancellationNotesModal(requestData) {\r\n let cancelNotesModal = $uibModal.open({\r\n templateUrl: '/App/Components/IdentityManagerRequestDetails/cancellationNotesModal/cancellationNotesModal.html',\r\n controller: cancellationNotesModalController,\r\n controllerAs: 'cnvm',\r\n backdrop: 'static',\r\n resolve: {\r\n requestData: () => requestData\r\n }\r\n });\r\n\r\n try {\r\n await cancelNotesModal.result;\r\n $route.reload();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n vm.endEmergencyAccessUsage = function () {\r\n swal(helperService.areYouSureParams('End Emergency Access', 'Are you sure you want to end emergency access for the roles in this request?', 'Continue')).then(function () {\r\n var putData = {\r\n \"RequestId\": vm.req.Id,\r\n \"Version\": vm.req.Version\r\n };\r\n $http.delete(apiUrl + `api/identitymanager/requests/${vm.req.Id}/version/${vm.req.Version}/emergencyaccess/end`).then(function (response) {\r\n $route.reload();\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }, function (dismiss) {\r\n return;\r\n });\r\n };\r\n\r\n vm.reprocessRequest = function () {\r\n var putData = {\r\n \"RequestId\": vm.req.Id,\r\n \"Version\": vm.req.Version\r\n };\r\n\r\n $http.put(apiUrl + 'api/identitymanager/requests/' + vm.req.Id + '/version/' + vm.req.Version + '/reprocess', putData).then(function (response) {\r\n helperService.showConfirmationMessage(\"Success\", \"Request is being reprocessed\");\r\n $route.reload();\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n vm.exportReport = function () {\r\n var postData = {\r\n \"RequestId\": vm.req.Id,\r\n \"Version\": vm.req.Version\r\n };\r\n\r\n $http.post(apiUrl + 'api/core/exports/imrequest', postData).then(function successCallback(response) {\r\n var fullExportName;\r\n fullExportName = 'IdentityManagementRequestDetails' + '.pdf';\r\n\r\n response.data = { ExportId: response.data, ExportName: fullExportName };\r\n\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $http.get(apiUrl + 'api/identitymanager/requests/' + requestIdParam + '/version/' + requestVersionParam).then(async function (response) {\r\n\r\n var data = response.data;\r\n vm.linkedTickets = response.data.Tickets;\r\n\r\n if (data.RiskAnalysis && data.RiskAnalysis.UserRisks.length > 0) {\r\n data.RiskAnalysis.UserRisks = $filter('orderBy')(data.RiskAnalysis.UserRisks, 'Comparison');\r\n vm.userRisksData = data.RiskAnalysis.UserRisks;\r\n }\r\n\r\n if (vm.userRisksData && data.CanIReview) {\r\n data.RiskAnalysis.UserRisks.forEach(risk => {\r\n if (risk.RequestMitigationIdentifier) {\r\n risk.RequestMitigation = 'Edit';\r\n } else {\r\n risk.RequestMitigation = 'Request';\r\n }\r\n\r\n vm.requestAllowed = true;\r\n });\r\n } else if (vm.userRisksData && data.RiskAnalysis.UserRisks.length > 0) {\r\n data.RiskAnalysis.UserRisks.forEach(risk => {\r\n if (risk.RequestMitigationIdentifier) {\r\n risk.RequestMitigation = 'Requested Mitigation';\r\n } else {\r\n risk.RequestMitigation = 'N/A';\r\n }\r\n vm.requestAllowed = false;\r\n });\r\n }\r\n\r\n if (data.GeneralUser) {\r\n data.AffectedObject = data.GeneralUser;\r\n }\r\n\r\n data.RequestAccesses.forEach(function (row, i) {\r\n if (row.Access) {\r\n row.Access = row.Access;\r\n }\r\n });\r\n\r\n data.RequestUsers.forEach(function (row, i) {\r\n if (row.User) {\r\n row.User = row.User;\r\n }\r\n });\r\n\r\n vm.req = data;\r\n vm.requestDetails = data;\r\n\r\n vm.terminations = data.TerminatedUserRoles.reduce((accessAccumulator, currentRole) => {\r\n const role = {\r\n Product: currentRole.ProductName,\r\n AccessType: currentRole.TypeID,\r\n Access: currentRole.Name\r\n };\r\n if (currentRole.Companies.length) {\r\n $scope.vm.hasCompany = true;\r\n let roleCompanies = [];\r\n currentRole.Companies.forEach(company => {\r\n roleCompanies.push({ ...role, Company: company.Name });\r\n })\r\n return accessAccumulator.concat(roleCompanies);\r\n }\r\n else {\r\n accessAccumulator.push(role);\r\n return accessAccumulator;\r\n }\r\n }, []);\r\n\r\n vm.accessItems = data.RequestAccesses;\r\n\r\n vm.canReviewAccessRequest = vm.accessItems.some(access => access.CanIReview);\r\n vm.canReviewUserRequest = data.RequestUsers.some(user => user.CanIReview);\r\n\r\n vm.emptyStartEndDates = vm.accessItems.every(access => access.StartDate === null && access.EndDate === null);\r\n\r\n // Check all Access Statuses to determine if 'Edit Effective Dates' button and column should be hidden\r\n vm.checkEveryAccessStatus = vm.accessItems.every(access => access.Status === 'Pending' || access.Status === 'Approved' || access.Status === 'AwaitingEffectiveDateProcessing');\r\n\r\n // Check to see if any Access Request Statuses are Pending, Approved, or Awaiting and disable 'Edit Effective Dates' button and column accordingly\r\n vm.checkSomeAccessStatuses = vm.accessItems.some(access => access.Status === 'Pending' || access.Status === 'Approved' || access.Status === 'AwaitingEffectiveDateProcessing');\r\n\r\n // Check to see if Start Date or End Date is null or in the past\r\n vm.checkEveryStartDate = vm.accessItems.every(access => (access.StartDate === null || (new Date(access.StartDate) < new Date())));\r\n vm.checkEveryEndDate = vm.accessItems.every(access => (access.EndDate === null || (new Date(access.EndDate) < new Date())));\r\n\r\n // Consolidate Access and Date Checks\r\n vm.showRequests = (vm.checkEveryAccessStatus || vm.checkSomeAccessStatuses) && (!vm.checkEveryStartDate || !vm.checkEveryEndDate) && (vm.currentUser.userId === vm.req.Requestor);\r\n\r\n\r\n checkEffectiveDates();\r\n vm.attachments = vm.req.Attachments;\r\n vm.req.hasObjectId = vm.req.AffectedObject.ID === '00000000-0000-0000-0000-000000000000';\r\n await checkForEmergencyAccessStatus(data.RequestAccesses);\r\n createDataSources(data);\r\n updateActionTotals();\r\n vm.reportDetailsComplete = true;\r\n }, function errorCallback(response) {\r\n vm.reportDetailsComplete = true;\r\n });\r\n\r\n function checkEffectiveDates() {\r\n const currentDate = new Date();\r\n\r\n vm.accessItems.forEach(access => {\r\n const startDate = new Date(access.StartDate);\r\n const endDate = new Date(access.EndDate);\r\n access.validStartDate = false;\r\n access.validEndDate = false;\r\n\r\n if (access.StartDate !== null && (startDate >= currentDate)) {\r\n access.validStartDate = true;\r\n } else {\r\n access.validStartDate = false;\r\n }\r\n\r\n if (access.EndDate !== null && (endDate >= currentDate)) {\r\n access.validEndDate = true;\r\n } else {\r\n access.validEndDate = false;\r\n }\r\n\r\n if ((access.EndDate !== null && (endDate >= currentDate)) && (access.StartDate === null || (startDate < currentDate))) {\r\n access.validEndDate = true;\r\n }\r\n\r\n });\r\n\r\n vm.availableEffectiveDatesAccessItems = vm.accessItems.filter(access => (access.validEndDate || access.validStartDate) && (access.Status === 'Pending' || access.Status === 'Approved' || access.Status === 'AwaitingEffectiveDateProcessing'));\r\n }\r\n\r\n //Copy the Request ID to the clipboard\r\n vm.copyToClipboard = function () {\r\n try {\r\n const el = document.createElement('input');\r\n el.value = vm.req.Id;\r\n el.setAttribute('readonly', '');\r\n el.style.position = 'absolute';\r\n el.style.left = '-9999px';\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n }\r\n catch (ex) {\r\n swal({ title: 'Error copying to clipboard', type: 'warning', showCancelButton: false });\r\n }\r\n };\r\n\r\n function defineColumnsAndReports() {\r\n var ApprovalsRequiredColumns = [\r\n { field: \"Type\", filterable: customAutoCompleteFilter },\r\n { field: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Level\", filterable: customAutoCompleteFilter },\r\n { field: \"Quantity\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n var ApprovalsSubmittedColumns = [\r\n { field: \"Reviewer\", title: \"Approver\", filterable: customAutoCompleteFilter },\r\n { field: \"ReviewedOn\", template: \"{{ dataItem.ReviewedOn | date:'short'}}\", title: \"Approval Date\", filterable: customDatePickerFilter },\r\n { field: \"Version\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n var ErrorLogColumns = [\r\n { field: \"Detail\", filterable: customAutoCompleteFilter },\r\n { field: \"TimeStamp\", template: \"{{ dataItem.TimeStamp | date:'short'}}\", title: \"Time\", filterable: customDatePickerFilter }\r\n ];\r\n\r\n var RisksColumns = [\r\n { field: \"Comparison\", width: 100, template: '{{dataItem.Comparison}}' },\r\n { field: \"RequestMitigation\", title: \"Request Mitigation\", template: \"{{dataItem.RequestMitigation}}{{dataItem.RequestMitigation}}\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyName\", title: \"Company\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk Id\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 190, filterable: customAutoCompleteFilter, groupHeaderTemplate: \"#= value #\" },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Current Mitigation\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationStatus\", title: \"Current Mitigation Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RequestMitigationStatusName\", title: \"Request Mitigation Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Current Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RequestMitigationNotes\", title: \"Request Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Current Mitigation Controls\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RequestMitigationControlNames\", title: \"Request Mitigation Controls\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ProductID\", title: \"ProductID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityRoleID\", title: \"Security Role ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectTypeID\", title: \"Security ObjectType ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectID\", title: \"Security Object ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AccessTypeID\", title: \"Access Type ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true }\r\n ];\r\n\r\n const TCodeRequestColumns = [\r\n { field: \"SecurityObjectName\", title: \"TCode\", filterable: false },\r\n { field: \"SecurityObjectAltName\", title: \"Description\", filterable: false }];\r\n\r\n const TCodeUseColumns = [\r\n { field: \"SecurityObjectId\", title: \"TCode\", filterable: false },\r\n { field: \"AccessDate\", title: \"Access Date\", filterable: false }];\r\n\r\n var columnsFromVMBusinessProcess = [\r\n { field: \"CompanyName\", title: \"Company\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object\", width: 180, filterable: customAutoCompleteFilter, hidden: vm.disableObjectLevelRiskAnalysis },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 180, filterable: customAutoCompleteFilter, hidden: vm.disableObjectLevelRiskAnalysis },\r\n { field: \"ObjectComparison\", width: 125, groupHeaderTemplate: \"#= value #\", template: '{{dataItem.ObjectComparison}}', hidden: vm.disableObjectLevelRiskAnalysis },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 150, filterable: customAutoCompleteFilter, hidden: vm.disableObjectLevelRiskAnalysis },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 150, filterable: customAutoCompleteFilter, hidden: vm.disableObjectLevelRiskAnalysis },\r\n { field: \"BusinessProcessGroupName\", title: \"Group\", width: 180, filterable: customAutoCompleteFilter, groupHeaderTemplate: \"#= value #\" },\r\n { field: \"GroupComparison\", width: 125, groupHeaderTemplate: \"#= value #\", template: '{{dataItem.GroupComparison}}' }\r\n ];\r\n\r\n vm.TCodeRequestedOptions = helperService.setNonPageableGridOptions(TCodeRequestColumns);\r\n vm.TCodeUsageOptions = helperService.setNonPageableGridOptions(TCodeUseColumns);\r\n vm.TCodeUsageOptions.noRecords = {\r\n template: \"No TCode Usage Was Recorded
\"\r\n };\r\n\r\n vm.ApprovalsRequiredOptions = helperService.setNonPageableGridOptions(ApprovalsRequiredColumns);\r\n vm.ApprovalsRequiredOptions.dataBound = function (e) {\r\n let items = e.sender.items();\r\n items.each(function () {\r\n var row = $(this);\r\n var dataItem = e.sender.dataItem(row);\r\n // We only want to show the detail template if necessary\r\n if (dataItem.GroupUsers.length === 0) {\r\n row.find(\".k-hierarchy-cell\").html(\"\");\r\n }\r\n });\r\n };\r\n vm.ApprovalsSubmittedOptions = helperService.setNonPageableGridOptions(ApprovalsSubmittedColumns);\r\n vm.ApprovalsSubmittedOptions.detailTemplate = kendo.template($(\"#approvalsSubmittedTemplate\").html());\r\n\r\n vm.ErrorLogOptions = helperService.setNonPageableGridOptions(ErrorLogColumns);\r\n\r\n vm.RisksOptions = helperService.setMainGridOptions(RisksColumns, null);\r\n if (!vm.disableObjectLevelRiskAnalysis) {\r\n vm.RisksOptions.detailTemplate = kendo.template($(\"#risksTemplate\").html());\r\n }\r\n vm.RisksOptions.selectable = false;\r\n vm.RisksOptions.filterable = {\r\n mode: \"row\",\r\n operators: {\r\n string: {\r\n contains: \"Contains\",\r\n doesnotcontain: \"Does not contain\",\r\n eq: \"Equal to\",\r\n neq: \"Not equal to\"\r\n }\r\n }\r\n };\r\n vm.RisksOptions.columnMenu = true;\r\n\r\n vm.BusinessProcessOptions = helperService.setMainGridOptions(columnsFromVMBusinessProcess, null);\r\n vm.BusinessProcessOptions.selectable = false;\r\n\r\n vm.BusinessProcessOptions.filterable = {\r\n mode: \"row\",\r\n operators: {\r\n string: {\r\n contains: \"Contains\",\r\n doesnotcontain: \"Does not contain\",\r\n eq: \"Equal to\",\r\n neq: \"Not equal to\"\r\n }\r\n }\r\n };\r\n }\r\n\r\n function openRequestMitigationModal(dataItem, dataGrid) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/IdentityManagerRequestDetails/UserRisksMitigationModal/requestDetailsUserRisksMitigationModal.html',\r\n controller: requestDetailsUserRisksMitigationModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n row: () => dataItem,\r\n grid: () => dataGrid,\r\n request: () => vm.req\r\n }\r\n });\r\n }\r\n\r\n function requestRiskMitigation(dataItem) {\r\n $scope.riskToMitigate = angular.copy(dataItem);\r\n openRequestMitigationModal(dataItem, vm.userRisksData);\r\n }\r\n\r\n function openExpandDetailsModal(dataGrid, scope) {\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/RequestDetailsModal.html',\r\n controller: requestDetailsModalController,\r\n controllerAs: 'vm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n mainGrid: () => dataGrid,\r\n data: () => scope,\r\n disableObjectData: () => vm.disableObjectLevelRiskAnalysis\r\n }\r\n });\r\n }\r\n\r\n function expandDetails() {\r\n openExpandDetailsModal(vm.userRisksData, vm);\r\n }\r\n\r\n async function openApproveDenyRequestModal() {\r\n let approveDenyRequestModal = $uibModal.open({\r\n templateUrl: '/App/Components/IdentityManagerRequestDetails/ApproveDenyModal/ApproveDenyModal.html',\r\n controller: approveDenyModalController,\r\n controllerAs: 'vm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n request: () => vm.req\r\n }\r\n });\r\n\r\n try {\r\n await approveDenyRequestModal.result;\r\n // we are awaiting request processing so we would want to update the page as such\r\n vm.awaitingRequestProcessing = true;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function updateSelectedAccessItemsForAction() {\r\n if (vm.currentUser.userId === vm.req.Requestor) {\r\n // user is requestor - we are working with effective date selections\r\n vm.allAccessSelected = vm.availableEffectiveDatesAccessItems.every(access => access.selectedForAction);\r\n vm.selectedAccessItemsForAction = vm.availableEffectiveDatesAccessItems.filter(access => access.selectedForAction);\r\n } else {\r\n let reviewableAccessItems = vm.req.RequestAccesses.filter(access => access.CanIReview);\r\n vm.allAccessSelected = reviewableAccessItems.every(access => access.selectedForAction);\r\n vm.selectedAccessItemsForAction = vm.req.RequestAccesses.filter(access => access.selectedForAction && access.CanIReview);\r\n }\r\n }\r\n\r\n function updateSelectedUserItemsForAction() {\r\n vm.allUserSelected = vm.req.RequestUsers.every(user => user.selectedForAction);\r\n vm.selectedUserItemsForAction = vm.req.RequestUsers.filter(user => user.selectedForAction && user.CanIReview);\r\n }\r\n\r\n function selectAllAccesses() {\r\n let selectionStatus = vm.allAccessSelected;\r\n if (vm.currentUser.userId === vm.req.Requestor) {\r\n // user is requestor so we need to set all effective dates available to match the select all\r\n vm.availableEffectiveDatesAccessItems.forEach(access => access.selectedForAction = selectionStatus);\r\n } else {\r\n // user is reviewer so we need to set accesses they can review to match the select all\r\n vm.req.RequestAccesses.forEach(access => {\r\n if (access.CanIReview) {\r\n access.selectedForAction = selectionStatus;\r\n }\r\n });\r\n }\r\n updateSelectedAccessItemsForAction();\r\n }\r\n\r\n function selectAllUsers() {\r\n let selectionStatus = vm.allUserSelected;\r\n vm.req.RequestUsers.forEach(user => user.selectedForAction = selectionStatus);\r\n updateSelectedUserItemsForAction();\r\n }\r\n\r\n async function openEffectiveDateModal() {\r\n const selectedAccessItemsForAction = vm.selectedAccessItemsForAction.map(access => {\r\n let newAccess = { ...access };\r\n if (newAccess.StartDate !== null) {\r\n newAccess.originalStartDate = new Date(newAccess.StartDate);\r\n } else {\r\n newAccess.originalStartDate = null;\r\n }\r\n\r\n if (newAccess.EndDate !== null) {\r\n newAccess.originalEndDate = new Date(newAccess.EndDate);\r\n } else {\r\n newAccess.originalEndDate = null;\r\n }\r\n\r\n return newAccess;\r\n });\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/IdentityManagerRequestDetails/EditEffectiveDatesModal/editEffectiveDatesModal.tmpl.html',\r\n controller: editEffectiveDatesModalController,\r\n controllerAs: 'eedmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n selectedAccessItemsForAction: () => selectedAccessItemsForAction,\r\n request: () => vm.req\r\n }\r\n });\r\n\r\n try {\r\n await modal.result;\r\n $route.reload();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openEditRequestExpirationModal() {\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/IdentityManagerRequestDetails/EditRequestExpirationModal/editRequestExpirationModal.tmpl.html',\r\n controller: editRequestExpirationModalController,\r\n controllerAs: 'eremvm',\r\n backdrop: 'static',\r\n resolve: {\r\n request: () => vm.req\r\n }\r\n });\r\n\r\n try {\r\n await modal.result;\r\n $route.reload();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function applyActionToSelectedItems(action, requestType) {\r\n let items = [];\r\n if (requestType === 'User') {\r\n items = vm.selectedUserItemsForAction;\r\n } else {\r\n items = vm.selectedAccessItemsForAction;\r\n }\r\n if (action === 'Delegate') {\r\n let delegateModal = $uibModal.open({\r\n templateUrl: '/App/Components/IdentityManagerRequestDetails/DelegationModal/requestDelegationModal.html',\r\n controller: requestDelegationModalController,\r\n controllerAs: 'rdmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n request: () => vm.req,\r\n delegationItems: () => items,\r\n requestType: () => requestType\r\n }\r\n });\r\n\r\n try {\r\n let items = await delegateModal.result;\r\n setActionsToDelegated(items);\r\n } catch (_) {\r\n return;\r\n }\r\n } else {\r\n items.forEach(item => {\r\n item.Action = action;\r\n item.selectedForAction = false;\r\n });\r\n vm.changesToSubmit = true;\r\n }\r\n clearSelectedRequestType(requestType);\r\n\r\n updateActionTotals();\r\n }\r\n\r\n function updateActionTotals() {\r\n vm.approvedRequestItems = vm.req.RequestUsers.filter(item => item.Action === 'Approve').length + vm.req.RequestAccesses.filter(item => item.Action === 'Approve').length;\r\n vm.deniedRequestItems = vm.req.RequestUsers.filter(item => item.Action === 'Deny').length + vm.req.RequestAccesses.filter(item => item.Action === 'Deny').length;\r\n }\r\n\r\n\r\n function clearSelectedRequestType(requestType) {\r\n switch (requestType) {\r\n case 'Access':\r\n vm.allAccessSelected = false;\r\n vm.selectedAccessItemsForAction = [];\r\n if (!vm.req.RequestAccesses.some(access => access.Action === 'Deny' || access.Action === 'Approve')) {\r\n vm.changesToSubmit = false;\r\n }\r\n break;\r\n case 'User':\r\n vm.allUserSelected = false;\r\n vm.selectedUserItemsForAction = [];\r\n if (!vm.req.RequestUsers.some(user => user.Action === 'Deny' || user.Action === 'Approve')) {\r\n vm.changesToSubmit = false;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n function setActionsToDelegated(requestItems) {\r\n requestItems.forEach(item => {\r\n item.Action = 'Delegated';\r\n item.CanIReview = false;\r\n item.selectedForAction = false;\r\n });\r\n\r\n }\r\n\r\n function checkForEmergencyAccessStatus(requestAccessItems) {\r\n vm.emergencyAccessItem = requestAccessItems.find(accessItem => accessItem.Status.includes('EmergencyAccess'));\r\n if (vm.emergencyAccessItem) {\r\n vm.emergencyAccessStatus = vm.emergencyAccessItem.Status;\r\n }\r\n }\r\n\r\n}\r\n","import { customAutoCompleteFilter, customDatePickerFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport cancellationNotesModalController from \"../IdentityManagerRequestDetails/cancellationNotesModal/cancellationNotesModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $filter, $uibModal, $location, authenticationService, helperService, openRequestsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.viewDetails = viewDetails;\r\n vm.editRequest = editRequest;\r\n vm.cancelRequest = cancelRequest;\r\n vm.setStatusCssClass = helperService.setStatusCssClass;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.currentUser = await authenticationService.getUser();\r\n\r\n const openRequestsGridColumns = [\r\n { field: \"RequestorName\", title: \"Requestor Name\", filterable: customAutoCompleteFilter },\r\n { field: \"GeneralUser.Name\", title: \"Affected User\", filterable: customAutoCompleteFilter },\r\n { field: \"GeneralUser.Email\", title: \"Affected User Email\", filterable: customAutoCompleteFilter },\r\n { field: \"AffectedType\", title: \"Affected Type\", filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"TicketIds\", title: \"Ticket ID\", filterable: customAutoCompleteFilter },\r\n { field: \"RequestedDate\", title: \"Request Date\", template: \"{{ dataItem.RequestedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"Action\", title: \"Action\", template: \"{{ dataItem.Action | insertSpaceBetweenCapitalWords }}\", filterable: customAutoCompleteFilter },\r\n { field: \"Status\", template: \"{{dataItem.Status | insertSpaceBetweenCapitalWords}}\", filterable: customAutoCompleteFilter },\r\n { template: `Details`, \"title\": \"Details\", width: 90 },\r\n { template: `Edit`, title: \"Edit\", width: 90 },\r\n { template: `Cancel`, \"title\": \"Cancel\", width: 90 }\r\n ];\r\n\r\n checkForCancelOrEditAllRequests();\r\n\r\n vm.openRequestsGridOptions = helperService.setMainGridOptions(openRequestsGridColumns, 600);\r\n vm.openRequestsGridOptions.selectable = false;\r\n\r\n vm.openRequestsGridDataSource = new kendo.data.DataSource({\r\n schema: {\r\n model: {\r\n fields: {\r\n RequestedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let { data } = await openRequestsDataService.getOpenRequests();\r\n\r\n data = $filter('orderBy')(data, 'RequestedDate', true);\r\n\r\n data.forEach(row => {\r\n if (row.AffectedObject) {\r\n let AffectedObject = JSON.parse(row.AffectedObject);\r\n if (AffectedObject) {\r\n row[\"AffectedObjectUserName\"] = AffectedObject.Name;\r\n }\r\n }\r\n row.isCancellable = setIsCancellableProp(row);\r\n row.isEditable = setIsEditableProp(row);\r\n });\r\n options.success(data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function setIsCancellableProp(request) {\r\n return (vm.cancelAllRequests || request.Requestor === vm.currentUser.userId) && (request.Action !== 'EmergencyAccess' || (request.Action === 'EmergencyAccess' && request.Status === \"Pending\"));\r\n }\r\n\r\n function setIsEditableProp(request) {\r\n return (vm.currentUser.userId === request.Requestor || vm.editAllRequests === true) && request.Status === 'Pending' && request.Action !== 'EmergencyAccess';\r\n }\r\n\r\n function viewDetails(request) {\r\n $location.path('/IdentityManager/RequestDetails').search({ RequestId: request.Id, Version: request.Version });\r\n }\r\n\r\n async function checkForCancelOrEditAllRequests() {\r\n vm.cancelAllRequests = await openRequestsDataService.checkForCancelOrEditAllRequests(\"Cancel Other User's Requests\");\r\n vm.editAllRequests = await openRequestsDataService.checkForCancelOrEditAllRequests('Edit All Requests');\r\n }\r\n\r\n function editRequest(request) {\r\n $rootScope.requestToEdit = { Id: request.Id, Version: request.Version };\r\n $location.path('/IdentityManager/Place/RequestManagement/' + request.Action).search({});\r\n }\r\n\r\n async function cancelRequest(request) {\r\n kendo.ui.progress(vm.openRequestsGrid.element, true);\r\n let data = {\r\n \"RequestId\": request.Id,\r\n \"Version\": request.Version\r\n };\r\n\r\n try {\r\n await swal(helperService.areYouSureParams('Cancel Request', 'Are you sure you want to cancel this request?', 'Yes', 'No'));\r\n const requireNotes = await helperService.getConfigurationValue('IM_RequireNoteOnCancelledRequests') === '1';\r\n if (requireNotes) {\r\n openCancellationNotesModal(data);\r\n } else {\r\n await openRequestsDataService.cancelRequest(request, data);\r\n kendo.ui.progress(vm.openRequestsGrid.element, false);\r\n vm.openRequestsGridDataSource.read();\r\n }\r\n } catch {\r\n kendo.ui.progress(vm.openRequestsGrid.element, false);\r\n }\r\n }\r\n\r\n async function openCancellationNotesModal(requestData) {\r\n let cancelNotesModal = $uibModal.open({\r\n templateUrl: '/App/Components/IdentityManagerRequestDetails/cancellationNotesModal/cancellationNotesModal.html',\r\n controller: cancellationNotesModalController,\r\n controllerAs: 'cnvm',\r\n backdrop: 'static',\r\n resolve: {\r\n requestData: () => requestData\r\n }\r\n });\r\n\r\n try {\r\n await cancelNotesModal.result;\r\n kendo.ui.progress(vm.openRequestsGrid.element, false);\r\n vm.openRequestsGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}\r\n","import controller from \"./openRequests.controller\";\r\n\r\n/* openRequests.component.js */\r\n\r\n/**\r\n * @desc component for open IM requests\r\n * @example \r\n */\r\n\r\nconst openRequests = {\r\n controller: controller,\r\n controllerAs: 'orvm',\r\n templateUrl: '/App/Components/openRequests/openRequests.tmpl.html'\r\n};\r\n\r\nexport default openRequests;","export default /*@ngInject*/ function ($rootScope) {\r\n const service = {\r\n valueMap\r\n };\r\n\r\n return service;\r\n\r\n function valueMap(userObject, mailMappingField) {\r\n let mappedObject = {};\r\n\r\n switch (userObject.ProductType) {\r\n case 'AX7':\r\n // AX7_UseAzureAD === 0 ? On-prem Active Directory : Azure AD\r\n mappedObject = {\r\n UserId: null,\r\n UserName: userObject.DisplayName,\r\n Email: $rootScope.ConfigurationValues.AX7_UseAzureAD === '0' ? userObject.Mail : userObject.UserPrincipalName,\r\n NetworkDomain: $rootScope.ConfigurationValues.AX7_UseAzureAD === '0' ? null : userObject.NetworkDomain,\r\n Company: null,\r\n Enabled: userObject.Enabled,\r\n ProductType: userObject.ProductType,\r\n UserType: userObject.UserType\r\n }\r\n break;\r\n\r\n case 'D365S':\r\n mappedObject = {\r\n AzureADObjectId: userObject.Id,\r\n FirstName: userObject.GivenName,\r\n LastName: userObject.SurName,\r\n Title: userObject.JobTitle,\r\n HomePhone: userObject.BusinessPhone,\r\n MobilePhone: userObject.MobilePhone,\r\n Address1_Street1: userObject.StreetAddress,\r\n Address1_City: userObject.City,\r\n Address1_StateOrProvince: userObject.State,\r\n Address1_Country: userObject.Country,\r\n InternalEmailAddress: userObject.Mail,\r\n DomainName: userObject.UserPrincipalName,\r\n ProductType: userObject.ProductType,\r\n UserType: userObject.UserType\r\n };\r\n break;\r\n\r\n case 'ORFC':\r\n mappedObject = {\r\n DisplayName: userObject.DisplayName,\r\n FirstName: userObject.GivenName,\r\n LastName: userObject.SurName,\r\n Email: userObject[mailMappingField],\r\n ProductType: userObject.ProductType,\r\n EndDate: ''\r\n };\r\n break;\r\n\r\n case 'SF':\r\n mappedObject = {\r\n CompanyName: userObject.CompanyName,\r\n Department: userObject.Department,\r\n Email: userObject[mailMappingField],\r\n FirstName: userObject.GivenName,\r\n LastName: userObject.SurName,\r\n ManagerId: '',\r\n MobilePhone: userObject.MobilePhone,\r\n Phone: userObject.BusinessPhones[0],\r\n ProductType: userObject.ProductType,\r\n Title: userObject.JobTitle,\r\n UserEffectiveEndDate: '',\r\n Country: userObject.Country,\r\n Street: userObject.StreetAddress,\r\n City: userObject.City\r\n };\r\n break;\r\n\r\n case 'PS':\r\n mappedObject = {\r\n PrimaryEmail: userObject[mailMappingField],\r\n ProductType: userObject.ProductType,\r\n UserEffectiveEndDate: ''\r\n };\r\n break;\r\n\r\n case 'NS':\r\n mappedObject = {\r\n Email: userObject[mailMappingField],\r\n FirstName: userObject.GivenName,\r\n LastName: userObject.SurName,\r\n Phone: userObject.BusinessPhones[0],\r\n MobilePhone: userObject.MobilePhone,\r\n JobTitle: userObject.JobTitle,\r\n ProductType: userObject.ProductType,\r\n EndDate: ''\r\n };\r\n break;\r\n\r\n case 'OR':\r\n mappedObject = {\r\n ProductType: userObject.ProductType,\r\n Email: userObject[mailMappingField],\r\n EndDate: null\r\n }\r\n break;\r\n\r\n case 'SAP':\r\n mappedObject = {\r\n Email: userObject[mailMappingField],\r\n FirstName: userObject.GivenName,\r\n LastName: userObject.SurName,\r\n Street1: userObject.StreetAddress,\r\n City: userObject.City,\r\n State: userObject.State\r\n };\r\n break;\r\n\r\n default:\r\n mappedObject = userObject;\r\n }\r\n return mappedObject;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http) {\n\n const service = {\n checkAX7,\n checkAX,\n checkGP,\n checkOR,\n checkAAD\n };\n\n return service;\n\n function checkAX7(userId) {\n // AX7\n return $http.get(apiUrl + `api/identitymanager/ax7/users/search?userId=${userId}`);\r\n }\n\n function checkAX(userId, partitionId) {\n // AX R1, R2+\n return $http.get(apiUrl + `api/identitymanager/ax/users/search?userId=${partitionId}|${userId}`);\n }\n\n function checkGP(userId) {\n // GP\n return $http.get(apiUrl + `api/identitymanager/gp/users/search?userId=${userId}`);\r\n }\n\n function checkOR(username) {\r\n return $http.get(`${apiUrl}api/identitymanager/or/users/search?userName=${username}`);\r\n }\n\n function checkAAD(username) {\r\n return $http.get(`${apiUrl}api/identitymanager/aad/users/${username}`);\r\n }\n\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getFilteredAzureADUsers,\r\n getFilteredADUsers,\r\n getFilteredAX7Person,\r\n getFilteredAX2012Person\r\n };\r\n\r\n return service;\r\n\r\n async function getFilteredAzureADUsers(searchString, filterBoolean) {\r\n try {\r\n return await $http({\r\n method: 'GET',\r\n params: {\r\n \"criteria\": searchString,\r\n \"includeInactive\": filterBoolean\r\n },\r\n url: apiUrl + 'api/identitymanager/aad/users/search'\r\n });\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getFilteredADUsers(searchString, filterBoolean) {\r\n try {\r\n return await $http({\r\n method: 'GET',\r\n params: {\r\n \"criteria\": searchString,\r\n \"includeInactive\": filterBoolean\r\n },\r\n url: apiUrl + 'api/identitymanager/activedirectory/users/search'\r\n });\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getFilteredAX7Person(searchString) {\r\n try {\r\n return await $http({\r\n method: 'GET',\r\n params: {\r\n \"criteria\": searchString\r\n\r\n },\r\n url: apiUrl + 'api/identitymanager/ax7/persons/search'\r\n });\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getFilteredAX2012Person(searchString, partitionKey) {\r\n let params = { \"criteria\": searchString };\r\n if (partitionKey) {\r\n params[\"partitionKey\"] = partitionKey;\r\n }\r\n try {\r\n return await $http({\r\n method: 'GET',\r\n params: params,\r\n url: apiUrl + 'api/identitymanager/ax/persons/search'\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n}","import angular from 'angular';\r\nimport aDUserObjectValueMapperService from '../Components/RequestManagement/Services/aDUserObjectValueMapper.service';\r\nimport azureADUserObjectValueMapperService from '../Components/RequestManagement/Services/azureADUserObjectValueMapper.service';\r\nimport existingUserCheckService from '../Components/RequestManagement/Services/existingUserCheck.service';\r\nimport existingUserSearchService from '../Components/RequestManagement/Services/existingUserSearch.service';\r\nexport default angular\r\n .module('app.identityManager.requestManagement.factories', [])\r\n .factory('aDUserObjectValueMapperService', aDUserObjectValueMapperService)\r\n .factory('azureADUserObjectValueMapperService', azureADUserObjectValueMapperService)\r\n .factory('existingUserCheckService', existingUserCheckService)\r\n .factory('existingUserSearchService', existingUserSearchService)\r\n .name;","export default function () {\r\n\r\n const service = {\r\n valueMap\r\n };\r\n\r\n return service;\r\n\r\n function valueMap(userObject, mailMappingField) {\r\n\r\n let mappedObject = {};\r\n\r\n switch (userObject.ProductType) {\r\n case 'AX':\r\n mappedObject = {\r\n NetworkDomain: userObject.Domain,\r\n NetworkAlias: userObject.SamAccountName,\r\n UserName: userObject.DisplayName,\r\n DisplayUserId: userObject.SamAccountName.substring(0, 8),\r\n SID: userObject.Sid\r\n };\r\n break;\r\n\r\n case 'GP':\r\n mappedObject = {\r\n WindowsUserId: userObject.SamAccountName,\r\n NetBiosName: userObject.NetBiosName,\r\n ADUserId: userObject.ObjectGuid,\r\n Id: userObject.SamAccountName,\r\n UserName: userObject.DisplayName,\r\n ProductType: userObject.ProductType\r\n };\r\n break;\r\n\r\n case 'NAV':\r\n mappedObject = {\r\n WindowsUserName: userObject.NetBiosName + '\\\\' + userObject.SamAccountName,\r\n UserName: userObject.NetBiosName + '\\\\' + userObject.SamAccountName,\r\n FullName: userObject.DisplayName,\r\n WindowsSID: userObject.Sid,\r\n LicenseType: 0,\r\n State: '0',\r\n ProductType: userObject.ProductType\r\n };\r\n break;\r\n\r\n case 'ORFC':\r\n mappedObject = {\r\n DisplayName: userObject.DisplayName,\r\n Email: userObject[mailMappingField],\r\n EndDate: userObject.AccountExpirationDate,\r\n ProductType: userObject.ProductType,\r\n FirstName: '',\r\n LastName: ''\r\n };\r\n break;\r\n\r\n case 'SF':\r\n mappedObject = {\r\n CompanyName: userObject.Company,\r\n Department: userObject.Department,\r\n Email: userObject[mailMappingField],\r\n FirstName: '',\r\n LastName: '',\r\n ManagerId: '',\r\n Moble: '',\r\n Phone: '',\r\n ProductType: userObject.ProductType,\r\n Title: userObject.Title,\r\n EndDate: userObject.AccountExpirationDate,\r\n Street: '',\r\n City: '',\r\n };\r\n break;\r\n\r\n case 'PS':\r\n mappedObject = {\r\n PrimaryEmail: userObject[mailMappingField],\r\n ProductType: userObject.ProductType,\r\n EndDate: userObject.AccountExpirationDate\r\n };\r\n break;\r\n\r\n case 'NS':\r\n mappedObject = {\r\n Email: userObject[mailMappingField],\r\n ProductType: userObject.ProductType,\r\n JobTitle: userObject.Title,\r\n EndDate: userObject.AccountExpirationDate,\r\n FirstName: '',\r\n LastName: '',\r\n Phone: '',\r\n MobilePhone: '',\r\n };\r\n break;\r\n\r\n case 'OR':\r\n mappedObject = {\r\n ProductType: userObject.ProductType,\r\n Email: userObject[mailMappingField],\r\n EndDate: userObject.AccountExpirationDate\r\n }\r\n break;\r\n\r\n case 'SAP':\r\n mappedObject = {\r\n Email: userObject[mailMappingField],\r\n EndDate: userObject.AccountExpirationDate,\r\n };\r\n break;\r\n\r\n default:\r\n mappedObject = userObject;\r\n }\r\n return mappedObject;\r\n }\r\n\r\n}","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $filter, $uibModalInstance, helperService, aDUserObjectValueMapperService, existingUserSearchService, userObject) {\r\n\r\n const vm = this;\r\n\r\n vm.title = 'Active Directory User Search';\r\n vm.filterUsersToggle = true;\r\n vm.selectedUser = null;\r\n\r\n vm.doneSearchingUsers = doneSearchingUsers;\r\n vm.changeExistingUserRowSelected = changeExistingUserRowSelected;\r\n vm.selectUser = selectUser;\r\n vm.filterUsers = filterUsers;\r\n\r\n //Search Existing Users\r\n var getExistingUserGridColumns =\r\n [\r\n { field: \"DisplayName\", title: \"User Name\", filterable: false },\r\n { field: \"Domain\", title: \"Domain\", filterable: false },\r\n { field: \"Mail\", title: \"Email\", filterable: false }\r\n ];\r\n\r\n function doneSearchingUsers() {\r\n\r\n $rootScope.IMSelectedExistingUser = null;\r\n\r\n if (vm.ExistingWindowsUserSearchString === '' || vm.ExistingWindowsUserSearchString === null) {\r\n\r\n var raw = vm.ExistingusersGridDataSource.data();\r\n var length = raw.length;\r\n\r\n let item, i;\r\n for (i = length - 1; i >= 0; i--) {\r\n\r\n item = raw[i];\r\n vm.ExistingusersGridDataSource.remove(item);\r\n\r\n }\r\n } else {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n vm.ExistingUsersGridOptions = helperService.setMainGridOptions(getExistingUserGridColumns, 350);\r\n vm.ExistingUsersGridOptions.autoBind = false;\r\n\r\n vm.ExistingusersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n try {\r\n let response = await existingUserSearchService.getFilteredADUsers(vm.ExistingWindowsUserSearchString, vm.filterUsersToggle);\r\n response.data = $filter('orderBy')(response.data, 'DisplayName');\r\n options.success(response.data);\r\n } catch(err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n function changeExistingUserRowSelected(kendoEvent) {\r\n let grid = kendoEvent.sender;\r\n vm.selectedUser = grid.dataItem(grid.select());\r\n }\r\n\r\n function selectUser() {\r\n vm.selectedUser.ProductType = userObject.ProductType; // Add productType for value mapper to map properly\r\n let mappedObject = aDUserObjectValueMapperService.valueMap(vm.selectedUser); // convert selectedUser properties for form models\r\n userObject = Object.assign(userObject, mappedObject); // add mapped properties back into userObject\r\n\r\n vm.ExistingWindowsUserSearchString = null;\r\n $uibModalInstance.close(userObject);\r\n }\r\n\r\n function filterUsers() {\r\n if (vm.ExistingusersGridDataSource._data.length > 0) {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n vm.cancel = () => $uibModalInstance.dismiss();\r\n\r\n}","import aDUserSearchController from \"./aDUserSearch.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.onClick = onClick;\r\n\r\n function onClick() {\r\n\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/ADUserLink/aDUserSearch.html',\r\n controller: aDUserSearchController,\r\n controllerAs: 'adusvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n userObject: () => vm.userObject // bound to parent controller\r\n }\r\n });\r\n modal.result\r\n .then(userObject => vm.userObject = userObject)\r\n .catch(_ => { return });\r\n }\r\n\r\n}","import aDUserController from \"./aDUser.controller\";\r\n\r\n/* aDUser.component.js */\r\n\r\n/**\r\n * @desc component for displaying AD Username search and input fields\r\n * @example \r\n */\r\n\r\nconst adUserSearchLink = {\r\n bindings: {\r\n userObject: '='\r\n },\r\n controller: aDUserController,\r\n controllerAs: 'aduvm',\r\n templateUrl: '/App/Components/RequestManagement/ADUserLink/aDUser.tmpl.html'\r\n};\r\n\r\nexport default adUserSearchLink;","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, existingUserSearchService, $rootScope, $filter, helperService, userObject, aDUserObjectValueMapperService) {\r\n const vm = this;\r\n\r\n vm.title = 'Active Directory User Lookup';\r\n vm.filterUsersToggle = true;\r\n vm.selectedUser = null;\r\n\r\n vm.cancel = cancel;\r\n vm.doneSearchingUsers = doneSearchingUsers;\r\n vm.selectUser = selectUser;\r\n vm.filterUsers = filterUsers;\r\n vm.changeExistingUserRowSelected = changeExistingUserRowSelected;\r\n\r\n if (!userObject) {\r\n userObject = {};\r\n }\r\n\r\n const userGridColumns = [\r\n { field: \"DisplayName\", title: \"User Name\", filterable: false },\r\n { field: \"Mail\", title: \"Email\", filterable: false }\r\n ];\r\n\r\n function doneSearchingUsers() {\r\n\r\n $rootScope.IMSelectedExistingUser = null;\r\n\r\n if (vm.ExistingWindowsUserSearchString === '' || vm.ExistingWindowsUserSearchString === null) {\r\n vm.ExistingusersGridDataSource.data([]);\r\n } else {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n vm.ExistingUsersGridOptions = helperService.setMainGridOptions(userGridColumns, 350);\r\n vm.ExistingUsersGridOptions.autoBind = false;\r\n\r\n vm.ExistingusersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n try {\r\n let { data: existingUsers } = await existingUserSearchService.getFilteredADUsers(vm.ExistingWindowsUserSearchString, vm.filterUsersToggle);\r\n existingUsers = $filter('orderBy')(existingUsers, 'DisplayName');\r\n options.success(existingUsers);\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n async function selectUser() {\r\n let emailMappingField, mappedObject, emailMapConfig = await helperService.getConfigurationValue('IM_ADFieldForEmailMapping');\r\n emailMappingField = emailMapConfig === '0' ? 'UserPrincipalName' : 'Mail';\r\n vm.selectedUser.ProductType = userObject.ProductType; // Add productType for value mapper to map properly\r\n mappedObject = aDUserObjectValueMapperService.valueMap(vm.selectedUser, emailMappingField); // convert selectedUser properties for form models\r\n userObject = Object.assign(userObject, mappedObject); // add mapped properties back into userObject\r\n\r\n vm.ExistingWindowsUserSearchString = null;\r\n $uibModalInstance.close(userObject);\r\n }\r\n\r\n function changeExistingUserRowSelected(kendoEvent) {\r\n let grid = kendoEvent.sender;\r\n vm.selectedUser = grid.dataItem(grid.select());\r\n }\r\n\r\n function filterUsers() {\r\n if (vm.ExistingusersGridDataSource._data.length > 0) {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n}","import aDUserLookupSearchController from \"./aDUserLookupSearch.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal) {\r\n const vm = this;\r\n\r\n vm.onClick = onClick;\r\n\r\n async function onClick() {\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/ADUserLookup/aDUserLookupSearch.html',\r\n controller: aDUserLookupSearchController,\r\n controllerAs: 'adulsvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n userObject: () => vm.userObject // bound to parent controller\r\n }\r\n });\r\n\r\n try {\r\n const user = await modal.result;\r\n vm.onUserUpdated({ user });\r\n }\r\n catch { return; }\r\n }\r\n}","import aDUserLookupController from \"./aDUserLookup.controller\";\r\n\r\n/* aDUserLookup.component.js */\r\n\r\n/**\r\n * @desc component for displaying AD User Lookup\r\n * @example \r\n */\r\n\r\nconst aDUserLookup = {\r\n bindings: {\r\n userObject: '<',\r\n onUserUpdated: '&'\r\n },\r\n controller: aDUserLookupController,\r\n controllerAs: 'adulm',\r\n templateUrl: '/App/Components/RequestManagement/ADUserLookup/aDUserLookup.tmpl.html'\r\n};\r\n\r\nexport default aDUserLookup;","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $filter, $uibModalInstance, helperService, azureADUserObjectValueMapperService, existingUserSearchService, userObject) {\r\n\r\n const vm = this;\r\n\r\n vm.title = 'Active Directory User Search';\r\n vm.filterUsersToggle = true;\r\n vm.selectedUser = null;\r\n vm.adTypeConfigValue = $rootScope.ConfigurationValues.AX7_UseAzureAD === '1' || $rootScope.ConfigurationValues.D365S_UseAzureAD === '1' ? true : false;\r\n\r\n vm.doneSearchingUsers = doneSearchingUsers;\r\n vm.changeExistingUserRowSelected = changeExistingUserRowSelected;\r\n vm.selectUser = selectUser;\r\n vm.filterUsers = filterUsers;\r\n vm.cancel = cancel;\r\n\r\n if (!userObject) {\r\n userObject = {};\r\n }\r\n\r\n function getExistingUserGridColumns() {\r\n if (vm.adTypeConfigValue) {\r\n return [\r\n { field: \"DisplayName\", title: \"User Name\", filterable: false },\r\n { field: \"GivenName\", title: \"Given Name\", filterable: false },\r\n { field: \"Mail\", title: \"Email\", filterable: false },\r\n { field: \"JobTitle\", title: \"Job Title\", filterable: false },\r\n { field: \"UserPrincipalName\", title: \"User Principal Name\", filterable: false }\r\n ];\r\n } else {\r\n return [\r\n { field: \"DisplayName\", title: \"User Name\", filterable: false },\r\n { field: \"Mail\", title: \"Email\", filterable: false }\r\n ];\r\n }\r\n }\r\n\r\n function doneSearchingUsers() {\r\n\r\n $rootScope.IMSelectedExistingUser = null;\r\n\r\n if (vm.ExistingWindowsUserSearchString === '' || vm.ExistingWindowsUserSearchString === null) {\r\n\r\n var raw = vm.ExistingusersGridDataSource.data();\r\n var length = raw.length;\r\n\r\n let item, i;\r\n for (i = length - 1; i >= 0; i--) {\r\n\r\n item = raw[i];\r\n vm.ExistingusersGridDataSource.remove(item);\r\n\r\n }\r\n } else {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n vm.ExistingUsersGridOptions = helperService.setMainGridOptions(getExistingUserGridColumns(), 350);\r\n vm.ExistingUsersGridOptions.autoBind = false;\r\n\r\n vm.ExistingusersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n let response;\r\n try {\r\n if (vm.adTypeConfigValue) {\r\n response = await existingUserSearchService.getFilteredAzureADUsers(vm.ExistingWindowsUserSearchString, vm.filterUsersToggle);\r\n } else {\r\n response = await existingUserSearchService.getFilteredADUsers(vm.ExistingWindowsUserSearchString, vm.filterUsersToggle);\r\n }\r\n response.data = $filter('orderBy')(response.data, 'DisplayName');\r\n options.success(response.data);\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n function changeExistingUserRowSelected(kendoEvent) {\r\n let grid = kendoEvent.sender;\r\n vm.selectedUser = grid.dataItem(grid.select());\r\n }\r\n\r\n function selectUser() {\r\n vm.selectedUser.ProductType = userObject.ProductType; // Add productType for value mapper to map properly\r\n if (vm.selectedUser) {\r\n userObject = Object.assign(userObject, vm.selectedUser);\r\n userObject = azureADUserObjectValueMapperService.valueMap(userObject);\r\n }\r\n if (vm.selectedUser.UserType === 'Guest') {\r\n let emailFromPrincipalName = vm.selectedUser.UserPrincipalName.split(\"#EXT#\")[0];\r\n const underscoreIndex = emailFromPrincipalName.lastIndexOf(\"_\");\r\n userObject.Email = emailFromPrincipalName.substr(0, underscoreIndex) + '@' + emailFromPrincipalName.substr(underscoreIndex + 1);\r\n userObject.NetworkDomain = `https://sts.windows.net/${userObject.Email.slice(userObject.Email.indexOf('@')).slice(1)}`;\r\n }\r\n vm.ExistingWindowsUserSearchString = null;\r\n $uibModalInstance.close(userObject);\r\n }\r\n\r\n function filterUsers() {\r\n if (vm.ExistingusersGridDataSource._data.length > 0) {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n}","import azureADUserSearchController from \"./azureADUserSearch.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.onClick = onClick;\r\n\r\n async function onClick() {\r\n\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/AzureADUserLink/azureADUserSearch.html',\r\n controller: azureADUserSearchController,\r\n controllerAs: 'aadusvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n userObject: () => vm.userObject // bound to parent controller\r\n }\r\n });\r\n\r\n try {\r\n const user = await modal.result;\r\n vm.onUserUpdated({ user });\r\n }\r\n catch(_) { return; }\r\n }\r\n\r\n}","import azureADUserController from \"./azureADUser.controller\";\r\n\r\n/* azureADUser.component.js */\r\n\r\n/**\r\n * @desc component for displaying Azure AD Username search and input fields\r\n * @example \r\n */\r\n\r\nconst azureAdUserSearchLink = {\r\n bindings: {\r\n userObject: '<',\r\n onUserUpdated: '&'\r\n },\r\n controller: azureADUserController,\r\n controllerAs: 'aaduvm',\r\n templateUrl: '/App/Components/RequestManagement/AzureADUserLink/azureADUser.tmpl.html'\r\n};\r\n\r\nexport default azureAdUserSearchLink;","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, existingUserSearchService, $rootScope, $filter, helperService, userObject, azureADUserObjectValueMapperService) {\r\n const vm = this;\r\n\r\n vm.title = 'Entra ID User Lookup';\r\n vm.filterUsersToggle = true;\r\n vm.selectedUser = null;\r\n\r\n vm.cancel = cancel;\r\n vm.doneSearchingUsers = doneSearchingUsers;\r\n vm.selectUser = selectUser;\r\n vm.filterUsers = filterUsers;\r\n vm.changeExistingUserRowSelected = changeExistingUserRowSelected;\r\n \r\n if (!userObject) {\r\n userObject = {};\r\n }\r\n\r\n const userGridColumns = [\r\n { field: \"DisplayName\", title: \"Display Name\", filterable: false },\r\n { field: \"UserPrincipalName\", title: \"Email\", filterable: false },\r\n ];\r\n\r\n function doneSearchingUsers() {\r\n\r\n $rootScope.IMSelectedExistingUser = null;\r\n\r\n if (vm.ExistingWindowsUserSearchString === '' || vm.ExistingWindowsUserSearchString === null) {\r\n vm.ExistingusersGridDataSource.data([]);\r\n } else {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n vm.ExistingUsersGridOptions = helperService.setMainGridOptions(userGridColumns, 350);\r\n vm.ExistingUsersGridOptions.autoBind = false;\r\n\r\n vm.ExistingusersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n try {\r\n if (vm.ExistingWindowsUserSearchString) {\r\n let { data: existingUsers } = await existingUserSearchService.getFilteredAzureADUsers(vm.ExistingWindowsUserSearchString, vm.filterUsersToggle);\r\n existingUsers = $filter('orderBy')(existingUsers, 'DisplayName');\r\n options.success(existingUsers);\r\n } \r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n async function selectUser() {\r\n let emailMappingField, emailMapConfig = await helperService.getConfigurationValue('IM_AADFieldForEmailMapping');\r\n emailMappingField = emailMapConfig === '0' ? 'UserPrincipalName' : 'Mail'\r\n if (vm.selectedUser) {\r\n userObject = Object.assign(userObject, vm.selectedUser);\r\n userObject = azureADUserObjectValueMapperService.valueMap(userObject, emailMappingField);\r\n }\r\n if (vm.selectedUser.UserType === 'Guest') {\r\n let emailFromPrincipalName = vm.selectedUser.UserPrincipalName.split(\"#EXT#\")[0];\r\n const underscoreIndex = emailFromPrincipalName.lastIndexOf(\"_\");\r\n userObject.Email = emailFromPrincipalName.substr(0, underscoreIndex) + '@' + emailFromPrincipalName.substr(underscoreIndex + 1);\r\n userObject.NetworkDomain = `https://sts.windows.net/${userObject.Email.slice(userObject.Email.indexOf('@')).slice(1)}`;\r\n }\r\n vm.ExistingWindowsUserSearchString = null;\r\n $uibModalInstance.close(userObject);\r\n }\r\n\r\n function changeExistingUserRowSelected(kendoEvent) {\r\n let grid = kendoEvent.sender;\r\n vm.selectedUser = grid.dataItem(grid.select());\r\n }\r\n\r\n function filterUsers() {\r\n if (vm.ExistingusersGridDataSource._data.length > 0) {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n}","import azureADUserLookupSearchController from \"./azureADUserLookupSearch.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal) {\r\n const vm = this;\r\n\r\n vm.onClick = onClick;\r\n\r\n async function onClick() {\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/AzureADUserLookup/azureADUserLookupSearch.html',\r\n controller: azureADUserLookupSearchController,\r\n controllerAs: 'aadulsvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n userObject: () => vm.userObject // bound to parent controller\r\n }\r\n });\r\n\r\n try {\r\n const user = await modal.result;\r\n vm.onUserUpdated({ user });\r\n }\r\n catch { return; }\r\n }\r\n}","import azureADUserLookupController from \"./azureADUserLookup.controller\";\r\n\r\n/* azureADUserLookup.component.js */\r\n\r\n/**\r\n * @desc component for displaying Azure AD User Lookup\r\n * @example \r\n */\r\n\r\nconst azureAdUserLookup = {\r\n bindings: {\r\n userObject: '<',\r\n onUserUpdated: '&'\r\n },\r\n controller: azureADUserLookupController,\r\n controllerAs: 'aadulm',\r\n templateUrl: '/App/Components/RequestManagement/AzureADUserLookup/azureADUserLookup.tmpl.html'\r\n};\r\n\r\nexport default azureAdUserLookup;","import { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function (helperService, $http, dataService, reportsDataService) {\r\n\r\n const vm = this;\r\n vm.$onInit = activate;\r\n vm.selectUser = selectUser;\r\n vm.helperService = helperService;\r\n \r\n\r\n async function activate() {\r\n // making metadata call so report is up to date\r\n await reportsDataService.getReportMetadata(reportId);\r\n setupExpansionGrid();\r\n }\r\n\r\n \r\n const reportId = 'e5f3c3b7-2b49-4192-bddb-17ff914682d6';\r\n\r\n async function setupExpansionGrid() {\r\n vm.expansionGridColumns = [\r\n { field: \"FastpathUserName\", title: \"Fastpath User Name\", template: ``, filterable: customAutoCompleteFilter, width: 125 },\r\n { field: \"FastpathEmail\", title: \"Fastpath Email\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"UserCrossPlatformMapping\", title: \"Cross Platform User\", filterable: customBooleanFilter, width: 100 }\r\n ];\r\n\r\n let {data: availableProducts } = await dataService.getProducts();\r\n\r\n availableProducts.forEach(product => {\r\n const productName = helperService.removeSpaces(product.Name)\r\n vm.expansionGridColumns = vm.expansionGridColumns.concat([\r\n { field: productName, title: product.Name, width: 75, },\r\n { field: productName + \"UserId\", title: product.Name + \" ID\", width: 100, },\r\n { field: productName + \"UserName\", title: product.Name + \" User Name\", width: 130, },\r\n { field: productName + \"Email\", title: product.Name + \" Email\", width: 125, }\r\n ]);\r\n });\r\n\r\n\r\n // Table data setup\r\n const fields = { UserCrossPlatformMapping: { type: \"boolean\" } };\r\n availableProducts.forEach(product => {\r\n fields[helperService.removeSpaces(product.Name)] = { type: \"boolean\" }\r\n });\r\n \r\n\r\n vm.ExistingUsersGridOptions = helperService.setMainGridOptions(vm.expansionGridColumns, 350);\r\n vm.ExistingUsersGridOptions.selectable = true;\r\n vm.ExistingUsersGridOptions.persistSelection = true;\r\n vm.ExistingUsersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n id: '_hidden_UserMasterID',\r\n fields: fields\r\n }\r\n }),\r\n transport: {\r\n read: async options => {\r\n const params = {\r\n \"pagesize\": options.data.pageSize,\r\n \"page\": options.data.page\r\n }, sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n try {\r\n let { data } = await $http.post(`${apiUrl}api/core/reports/${reportId}/execute`, sortsAndFilters, { params: params });\r\n options.success(data);\r\n } catch (error) {\r\n options.error();\r\n helperService.showErrorMessage(error.data);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function selectUser(kendoEvent) {\r\n let grid = kendoEvent.sender;\r\n let linkedUser = grid.dataItem(grid.select());\r\n vm.linkedUserChange({ linkedUser });\r\n }\r\n}","import existingUserExpansionController from \"./existingUserExpansion.controller\"\r\n\r\n/* existingUserExpansion.component.js */\r\n\r\n/**\r\n * @desc component for displaying existing user table and linked user info when selected\r\n * @example \r\n */\r\n\r\n\r\nconst existingUserExpansion = {\r\n bindings: {\r\n linkedUserChange: '&'\r\n },\r\n controller: existingUserExpansionController,\r\n controllerAs: 'euevm',\r\n template: `\r\n Select Existing User Account\r\n
\r\n`\r\n};\r\n\r\nexport default existingUserExpansion;","export default /*@ngInject*/ function ($q, RequestManagementAXService) {\r\n\r\n this.loadAX7 = function ($scope) {\r\n var axDfrd = $.Deferred();\r\n\r\n loadAX7Permissions($scope).done(function () {\r\n axDfrd.resolve();\r\n });\r\n\r\n return $.when(axDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n this.loadAX7LoadPermisssions = function ($scope) {\r\n return loadAX7Permissions($scope);\r\n };\r\n //Load the AX permissions, after that completes and if there is an existing AX user load their permissions\r\n function loadAX7Permissions($scope) {\r\n var permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n axRoles = [],\r\n pendingRoles = $scope.vm.User?.AX7User?.PendingRoleCompanies || [],\r\n pendingUserGroups = $scope.vm.User?.AX7User?.PendingUserGroups || [];\r\n\r\n $scope.vm.ListOfSelectedAX7Roles = [];\r\n $scope.vm.ListOfAvailableAX7Roles = [];\r\n $scope.vm.ListOfSelectedAX7UserGroups = [];\r\n $scope.vm.ListOfAvailableAX7UserGroups = [];\r\n\r\n if ($scope.vm.User.AX7User != null && $scope.vm.User.AX7User.UserId != null) {\r\n\r\n //If any axRoles are selected in the request set the axRoles valid property to true below\r\n $scope.vm.numberOfAXRolesValid = false;\r\n\r\n axRoles = $scope.vm.User.AX7User.RoleCompanies || [];\r\n\r\n if (axRoles?.length > 0) {\r\n $scope.vm.numberOfAXRolesValid = true;\r\n }\r\n }\r\n\r\n //Load Available axRoles then process existing security\r\n promises.push(RequestManagementAXService.getAllAX7Roles().then(function (response) {\r\n $scope.vm.ListOfAvailableAX7Roles = response.data.filter(applyPendingByKey.bind(null, \"Role\", pendingRoles));\r\n\r\n // we need to pre-select the system user role\r\n var systemUserRole = $scope.vm.ListOfAvailableAX7Roles.find(role => role.Id === 'SystemUser');\r\n\r\n if ($scope.vm.wizardMode === 'New' && !$scope.defaultRoleTemplate) {\r\n\r\n $scope.vm.ListOfAvailableAX7Roles.forEach((row, i) => {\r\n if (row.Id == systemUserRole.Id) {\r\n $scope.vm.ListOfAvailableAX7Roles.splice(i, 1);\r\n $scope.vm.ListOfSelectedAX7Roles.push(systemUserRole);\r\n }\r\n });\r\n } else if ($scope.vm.wizardMode === \"New\" && $scope.defaultRoleTemplate) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductType === \"AX7\");\r\n\r\n $scope.vm.ListOfSelectedAX7Roles = [...defaultRoles];\r\n $scope.vm.ListOfAvailableAX7Roles = $scope.vm.ListOfAvailableAX7Roles.filter(availableRole => {\r\n let selectedRole = $scope.vm.ListOfSelectedAX7Roles.find(selectedRole => selectedRole.Id === availableRole.Id);\r\n\r\n if (selectedRole) {\r\n selectedRole = Object.merge(selectedRole, availableRole);\r\n }\r\n\r\n return !selectedRole;\r\n });\r\n\r\n $scope.vm.ListOfSelectedAX7Roles.push(systemUserRole);\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedAX7Roles.length) {\r\n $scope.vm.numberOfAXRolesValid = true;\r\n }\r\n\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n promises.push(RequestManagementAXService.getAllAX7Companies().then(function (response) {\r\n $scope.vm.ListOfAX7Companies = response.data;\r\n\r\n if ($scope.vm.axCompanyDropdownDataSource) {\r\n $scope.vm.axCompanyDropdownDataSource.read();\r\n }\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n //Load Available axUserGroups then process existing security\r\n promises.push(RequestManagementAXService.getAllAX7UserGroups().then(function (response) {\r\n $scope.vm.ListOfAvailableAX7UserGroups = response.data.map(applyPending.bind(null, pendingUserGroups));\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n\r\n //Load AX user roles\r\n if ($scope.vm.User.AX7User.RoleCompanies != null) {\r\n $scope.vm.User.AX7User.RoleCompanies.forEach(roleCompany => {\r\n\r\n var axRole = null;\r\n var selectedAXRole = null;\r\n var selectedCompany = null;\r\n\r\n //Get the role information from the available axRoles list\r\n axRole = $scope.vm.ListOfAvailableAX7Roles.find(object => object.Id.toUpperCase() === roleCompany.Role.Id.toUpperCase());\r\n\r\n //Check if the company Id has been set for the current role company\r\n if (roleCompany.Company != null) {\r\n selectedCompany = $scope.vm.ListOfAX7Companies.find(object => object.CompanyId.toUpperCase() === roleCompany.Company.CompanyId.toUpperCase());\r\n }\r\n\r\n\r\n //Check if the role already exists in the selected list\r\n selectedAXRole = $scope.vm.ListOfSelectedAX7Roles.find(object => object.Id.toUpperCase() === roleCompany.Role.Id.toUpperCase());\r\n //If the role already exists add the current company information to the company list\r\n if (selectedAXRole != null && selectedCompany != null) {\r\n if (selectedAXRole.Companies == null) {\r\n selectedAXRole.Companies = [];\r\n }\r\n if (selectedAXRole.Companies.none(company => company.CompanyId.toUpperCase() === selectedCompany.CompanyId.toUpperCase())) {\r\n selectedAXRole.Companies.push(selectedCompany);\r\n }\r\n } else {\r\n if (axRole != null) {\r\n $scope.vm.ListOfSelectedAX7Roles.unshift({\r\n Id: axRole.Id,\r\n Name: axRole.Name,\r\n IsAssignable: axRole.IsAssignable,\r\n Description: axRole.Description,\r\n Identifier: axRole.Identifier,\r\n Companies: selectedCompany == null ? null : [selectedCompany],\r\n Pending: pendingRoles.find(pendingRole => pendingRole.Role.Id.toUpperCase() === axRole.Id.toUpperCase() && axRole.Id !== \"SystemUser\")\r\n });\r\n\r\n $scope.vm.ListOfAvailableAX7Roles.forEach(function (row, j) {\r\n if (row.Id.toUpperCase() === axRole.Id.toUpperCase()) {\r\n $scope.vm.ListOfAvailableAX7Roles.splice(j, 1);\r\n }\r\n });\r\n }\r\n }\r\n\r\n axRole = null;\r\n selectedCompany = null;\r\n\r\n $scope.vm.numberOfAXRolesValid = true;\r\n });\r\n }\r\n $scope.vm.ListOfAvailableAX7Roles = $scope.vm.ListOfAvailableAX7Roles.filter(role => role.IsAssignable);\r\n\r\n //Load AX user groups\r\n if ($scope.vm.User.AX7User.UserGroups != null) {\r\n $scope.vm.User.AX7User.UserGroups.forEach(userGroup => {\r\n\r\n var axUserGroup = null;\r\n var selectedAXUserGroup = null;\r\n\r\n //Get the role information from the available axRoles list\r\n axUserGroup = $scope.vm.ListOfAvailableAX7UserGroups.find(object => object.Id.toUpperCase() === userGroup.Id.toUpperCase());\r\n\r\n\r\n //Check if the role already exists in the selected list\r\n selectedAXUserGroup = $scope.vm.ListOfSelectedAX7UserGroups.find(object => object.Id.toUpperCase() === userGroup.Id.toUpperCase());\r\n if (axUserGroup != null) {\r\n $scope.vm.ListOfSelectedAX7UserGroups.unshift({\r\n Id: axUserGroup.Id, Name: axUserGroup.Name,\r\n Pending: pendingUserGroups.find(pendingGroup => pendingGroup.Id.toUpperCase() === axUserGroup.Id.toUpperCase())\r\n });\r\n\r\n $scope.vm.ListOfAvailableAX7UserGroups.forEach(function (row, j) {\r\n if (row.Id.toUpperCase() === axUserGroup.Id.toUpperCase()) {\r\n $scope.vm.ListOfAvailableAX7UserGroups.splice(j, 1);\r\n }\r\n });\r\n }\r\n axUserGroup = null;\r\n });\r\n }\r\n\r\n $scope.axUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n\r\n }\r\n\r\n this.loadAX2012 = function (scope) {\r\n var axDfrd = $.Deferred();\r\n\r\n loadAX2012Permissions(scope).done(function () {\r\n axDfrd.resolve();\r\n });\r\n\r\n return $.when(axDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n this.loadAX2012LoadPermisssions = function ($scope) {\r\n return loadAX2012Permissions($scope);\r\n };\r\n //Load the AX permissions, after that completes and if there is an existing AX user load their permissions\r\n function loadAX2012Permissions($scope) {\r\n let permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n axRoles = [],\r\n pendingRoles = $scope.vm.User?.AX2012User?.PendingRoleCompanies || [],\r\n pendingUserGroups = $scope.vm.User?.AX2012User?.PendingUserGroups || [];\r\n\r\n $scope.vm.ListOfSelectedAX2012Roles = [];\r\n $scope.vm.ListOfAvailableAX2012Roles = [];\r\n $scope.vm.ListOfSelectedAX2012UserGroups = [];\r\n $scope.vm.ListOfAvailableAX2012UserGroups = [];\r\n\r\n if ($scope.vm.User.AX2012User != null && $scope.vm.User.AX2012User.UserId != null) {\r\n\r\n //If any axRoles are selected in the request set the axRoles valid property to true below\r\n $scope.vm.numberOfAXRolesValid = false;\r\n\r\n axRoles = $scope.vm.User.AX2012User.RoleCompanies;\r\n\r\n if (axRoles.length > 0) {\r\n $scope.vm.numberOfAXRolesValid = true;\r\n }\r\n }\r\n\r\n //Load Available axRoles then process existing security\r\n promises.push(RequestManagementAXService.getAllAX2012Roles().then(function (response) {\r\n $scope.vm.ListOfAvailableAX2012Roles = response.data.map(applyPendingByKey.bind(null, \"Role\", pendingRoles));\r\n let systemUserRole = $scope.vm.ListOfAvailableAX2012Roles.find(role => role.Name === 'SystemUser');\r\n\r\n if ($scope.vm.wizardMode === 'New' && !$scope.defaultRoleTemplate) {\r\n // we need to pre-select the system user role\r\n\r\n $scope.vm.ListOfAvailableAX2012Roles.forEach((row, i) => {\r\n if (row.Id === systemUserRole.Id) {\r\n $scope.vm.ListOfAvailableAX2012Roles.splice(i, 1);\r\n $scope.vm.ListOfSelectedAX2012Roles.push(systemUserRole);\r\n }\r\n });\r\n } else if ($scope.vm.wizardMode === \"New\" && $scope.defaultRoleTemplate) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductType === \"AX\");\r\n\r\n $scope.vm.ListOfSelectedAX2012Roles = [...defaultRoles];\r\n $scope.vm.ListOfAvailableAX2012Roles = $scope.vm.ListOfAvailableAX2012Roles.filter(availableRole => {\r\n let selectedRole = $scope.vm.ListOfSelectedAX2012Roles.find(selectedRole => selectedRole.Id === availableRole.Id);\r\n\r\n if (selectedRole) {\r\n selectedRole = Object.merge(selectedRole, availableRole);\r\n }\r\n\r\n return !selectedRole;\r\n });\r\n $scope.vm.ListOfSelectedAX2012Roles.push(systemUserRole);\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedAX2012Roles.length) {\r\n $scope.vm.numberOfAXRolesValid = true;\r\n }\r\n\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n promises.push(RequestManagementAXService.getAllAX2012Partitions().then(function (response) {\r\n $scope.vm.ListOfAX2012Partitions = response.data;\r\n $scope.vm.User.AX2012User.Partition = $scope.vm.ListOfAX2012Partitions.find(p => p.Key === 'initial');\r\n\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n //Load Available axUserGroups then process existing security\r\n promises.push(RequestManagementAXService.getAllAX2012UserGroups().then(function (response) {\r\n $scope.vm.ListOfAvailableAX2012UserGroups = response.data.map(applyPending.bind(null, pendingUserGroups));\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n $q.all(promises).then(async function () {\r\n\r\n // load AX Companies\r\n let axCompanies = await RequestManagementAXService.getAllAX2012Companies($scope.vm.User.AX2012User.Partition.Key);\r\n\r\n $scope.vm.ListOfAX2012Companies = axCompanies.data;\r\n\r\n if ($scope.vm.axCompanyDropdownDataSource) {\r\n $scope.vm.axCompanyDropdownDataSource.read();\r\n }\r\n //Load AX user roles\r\n if ($scope.vm.User.AX2012User.RoleCompanies != null) {\r\n $scope.vm.User.AX2012User.RoleCompanies.forEach(function (roleCompany) {\r\n\r\n var axRole = null;\r\n var selectedAXRole = null;\r\n var selectedCompany = null;\r\n\r\n //Get the role information from the available axRoles list\r\n axRole = $scope.vm.ListOfAvailableAX2012Roles.find(function (object) {\r\n return object.Id.toUpperCase() === roleCompany.Role.Id.toUpperCase();\r\n });\r\n //Check if the company Id has been set for the current role company\r\n if (roleCompany.Company != null) {\r\n selectedCompany = $scope.vm.ListOfAX2012Companies.find(object => object.CompanyId.toUpperCase() === roleCompany.Company.CompanyId.toUpperCase());\r\n }\r\n\r\n //Check if the role already exists in the selected list\r\n selectedAXRole = $scope.vm.ListOfSelectedAX2012Roles.find(object => object.Id.toUpperCase() === roleCompany.Role.Id.toUpperCase());\r\n //If the role already exists add the current company information to the company list\r\n if (selectedAXRole != null && selectedCompany != null) {\r\n if (selectedAXRole.Companies == null) {\r\n selectedAXRole.Companies = [];\r\n }\r\n if (selectedAXRole.Companies.none(company => company.CompanyId.toUpperCase() === selectedCompany.CompanyId.toUpperCase())) {\r\n selectedAXRole.Companies.push(selectedCompany);\r\n }\r\n }\r\n else {\r\n if (axRole != null) {\r\n $scope.vm.ListOfSelectedAX2012Roles.unshift({\r\n Id: axRole.Id,\r\n Name: axRole.Name,\r\n IsAssignable: axRole.IsAssignable,\r\n Description: axRole.Description,\r\n Identifier: axRole.Identifier,\r\n Companies: selectedCompany == null ? null : [selectedCompany],\r\n Pending: pendingRoles.some(pendingRole => pendingRole.Role.Id.toUpperCase() === axRole.Id.toUpperCase() && axRole.Name !== \"SystemUser\")\r\n });\r\n\r\n\r\n $scope.vm.ListOfAvailableAX2012Roles.forEach(function (row, j) {\r\n if (row.Id.toUpperCase() === axRole.Id.toUpperCase()) {\r\n $scope.vm.ListOfAvailableAX2012Roles.splice(j, 1);\r\n }\r\n });\r\n }\r\n }\r\n\r\n axRole = null;\r\n selectedCompany = null;\r\n\r\n $scope.vm.numberOfAXRolesValid = true;\r\n });\r\n }\r\n $scope.vm.ListOfAvailableAX2012Roles = $scope.vm.ListOfAvailableAX2012Roles.filter(role => role.IsAssignable);\r\n\r\n //Load AX user groups\r\n if ($scope.vm.User.AX2012User.UserGroups != null) {\r\n $scope.vm.User.AX2012User.UserGroups.forEach(userGroup => {\r\n var ax2012UserGroup = null;\r\n\r\n //Get the role information from the available axRoles list\r\n ax2012UserGroup = $scope.vm.ListOfAvailableAX2012UserGroups.find(object => object.Id.toUpperCase() === userGroup.Id.toUpperCase());\r\n\r\n if (ax2012UserGroup != null) {\r\n $scope.vm.ListOfSelectedAX2012UserGroups.unshift({\r\n Id: ax2012UserGroup.Id,\r\n Name: ax2012UserGroup.Name,\r\n Pending: pendingUserGroups.some(pendingUserGroup => pendingUserGroup.Id === ax2012UserGroup.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableAX2012UserGroups.forEach(function (row, j) {\r\n if (row.Id.toUpperCase() === ax2012UserGroup.Id.toUpperCase()) {\r\n $scope.vm.ListOfAvailableAX2012UserGroups.splice(j, 1);\r\n }\r\n });\r\n }\r\n ax2012UserGroup = null;\r\n });\r\n }\r\n\r\n $scope.axUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n }\r\n}\r\n\r\nfunction applyPendingByKey(key, pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem[key].Id.toUpperCase() === item.Id.toUpperCase());\r\n }\r\n\r\n return item;\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Id.toUpperCase() === item.Id.toUpperCase());\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n //AX 7 HTTP Calls\r\n this.getAllAX7Roles = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax7/roles'\r\n });\r\n };\r\n\r\n this.getAllAX7UserGroups = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax7/usergroups'\r\n })\r\n };\r\n\r\n this.getAllAX7Companies = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax7/companies'\r\n });\r\n };\r\n\r\n this.getAX7UserData = function (userId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax7/users/' + userId + '/'\r\n });\r\n };\r\n\r\n this.getAllAX7UserRoleCompanies = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax7/userrolecompanies'\r\n });\r\n };\r\n\r\n //AX 2012\r\n this.getAllAX2012Roles = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax/roles'\r\n });\r\n };\r\n\r\n this.getAllAX2012UserGroups = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax/usergroups'\r\n })\r\n };\r\n\r\n this.getAllAX2012Companies = function (partitionKey) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax/companies/partitions/' + partitionKey\r\n });\r\n };\r\n\r\n this.getAllAX2012Partitions = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ax/partitions'\r\n });\r\n };\r\n}","export const aad_application_id = 'e636d4fc-dd34-4dca-9171-d61270179167';\r\nexport const ax7_application_id = 'c311c379-e109-4e68-8082-f9c2f2e843ff';\r\nexport const ax_application_id = 'e39d0c80-61ea-4f40-8179-a5def6869507';\r\nexport const netsuite_application_id = '919aa6b9-8083-4c08-ace7-9322aa69bc4e';\r\nexport const sap_application_id = 'a4066336-3e11-4856-a7cc-9726460448b0';\r\nexport const oracle_application_id = '34d25422-9dc2-4918-8d85-084373e4bbb3';\r\nexport const oracleCloud_application_id = '286e7a77-4450-4527-987c-c08680356b00';\r\nexport const gp_application_id = 'e0981441-d1f9-4d5a-af74-cbb7339991a0';\r\nexport const nav_application_id = '19c49353-308b-4485-babe-f4200dfd1bf0';\r\nexport const d365s_application_id = '79f1178d-d827-460e-84e5-758c0b799115';\r\nexport const ps_application_id = '52c24698-ed59-4734-a80f-c7bcde27b16f';\r\nexport const universalProduct_application_id = '23fa3370-b057-489e-b6bb-49aa2a2fa040';\r\nexport const salesforce_application_id = '98999322-a76f-4c6e-b025-e62134cda4d1';","import { ax7_application_id, oracle_application_id, oracleCloud_application_id, gp_application_id, nav_application_id, d365s_application_id, netsuite_application_id, sap_application_id, ax_application_id, universalProduct_application_id, aad_application_id, ps_application_id, salesforce_application_id } from \"../../Shared/GlobalVariables/applicationIdVariables\";\r\n\r\nexport default /*@ngInject*/ function ($http) {\r\n var self = this;\r\n //Build request for executeRequest function, isFinishRequest adds in any revoked roles from the available role lists\r\n this.buildRequest = function (vm, isFinishRequest) {\r\n\r\n var request = self.buildHeaderRequest(vm),\r\n isTerminate = vm.wizardMode === \"Terminate\";\r\n\r\n var globalPermissionsWithUnusedRemoved = [];\r\n //Removes all levels from object and populates it with 1 selected Level\r\n if (vm.ListOfSelectedNetSuitePermissions != null) {\r\n globalPermissionsWithUnusedRemoved = vm.ListOfSelectedNetSuitePermissions && vm.ListOfSelectedNetSuitePermissions.map(permission => ({ ...permission }));\r\n }\r\n\r\n if (globalPermissionsWithUnusedRemoved.length > 0) {\r\n globalPermissionsWithUnusedRemoved.forEach(function (row) {\r\n row.Levels = [row.selectedLevel];\r\n delete row.selectedLevel;\r\n delete row.Pending;\r\n });\r\n }\r\n\r\n var netSuiteRequest = {};\r\n var nsApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == netsuite_application_id;\r\n });\r\n\r\n if (vm.User.NetSuiteUser != null && nsApplication != null && (nsApplication?.selected || vm.wizardMode === 'Terminate' && nsApplication?.selected == false)) {\r\n\r\n var nsRoles = vm.ListOfSelectedNetSuiteRoles && vm.ListOfSelectedNetSuiteRoles.map(role => ({ ...role })),\r\n nsPermissions = [];\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n nsRoles = vm.ReturnedRequest?.NetSuiteRequest?.Roles.map(removePendingKey);\r\n nsPermissions = vm.ReturnedRequest?.NetSuiteRequest?.GlobalPermissions;\r\n } else if (!isTerminate && !isFinishRequest) {\r\n nsRoles = nsRoles && nsRoles.map(removePendingKey);\r\n nsPermissions = globalPermissionsWithUnusedRemoved;\r\n } else {\r\n nsRoles = [];\r\n nsPermissions = [];\r\n }\r\n\r\n netSuiteRequest = {\r\n NetSuiteRequest: {\r\n User: {\r\n Id: vm.User.NetSuiteUser.Id,\r\n ProductId: vm.User.NetSuiteUser.ProductId,\r\n FirstName: vm.User.NetSuiteUser.FirstName,\r\n LastName: vm.User.NetSuiteUser.LastName,\r\n Email: vm.User.NetSuiteUser.Email,\r\n Subsidiary: vm.User.NetSuiteUser.Subsidiary,\r\n Password: vm.User.NetSuiteUser.Password,\r\n Department: vm.User.NetSuiteUser.Department == null || vm.User.NetSuiteUser.Department.Id == '' ? null : vm.User.NetSuiteUser.Department,\r\n Class: vm.User.NetSuiteUser.Class == null || vm.User.NetSuiteUser.Class.Id == '' ? null : vm.User.NetSuiteUser.Class,\r\n Location: vm.User.NetSuiteUser.Location == null || vm.User.NetSuiteUser.Location.Id == '' ? null : vm.User.NetSuiteUser.Location,\r\n Phone: vm.User.NetSuiteUser.Phone,\r\n MobilePhone: vm.User.NetSuiteUser.MobilePhone,\r\n JobTitle: vm.User.NetSuiteUser.JobTitle,\r\n Inactive: vm.User.NetSuiteUser.Inactive,\r\n GiveAccess: vm.User.NetSuiteUser.GiveAccess,\r\n StartDate: vm.User.NetSuiteUser.StartDate,\r\n EndDate: vm.User.NetSuiteUser.EndDate,\r\n IsSalesRep: vm.User.NetSuiteUser.IsSalesRep,\r\n IsSupportRep: vm.User.NetSuiteUser.IsSupportRep,\r\n Action: vm.User.NetSuiteUser.Action,\r\n RequirePasswordChange: vm.User.NetSuiteUser.RequirePasswordChange,\r\n SendNotificationEmail: vm.User.NetSuiteUser.SendNotificationEmail,\r\n UserChanges: vm.User.NetSuiteUser.UserChanges\r\n },\r\n Roles: nsRoles,\r\n GlobalPermissions: nsPermissions\r\n }\r\n };\r\n }\r\n else {\r\n netSuiteRequest = {\r\n NetSuiteRequest: null\r\n };\r\n }\r\n //Add NS request\r\n request = $.extend({}, request, netSuiteRequest);\r\n\r\n //SAP Request\r\n var sapApplication = vm.availableApplications.filter(function (application) {\r\n return application.Id == sap_application_id;\r\n });\r\n\r\n var sapRequest = {};\r\n if (vm.User.SAPUser) {\r\n sapRequest.SAPRequest = [];\r\n } else {\r\n sapRequest.SAPRequest = null;\r\n }\r\n sapApplication.forEach(application => {\r\n var productSapRequest = {};\r\n if (vm.User.SAPUser) {\r\n if (vm.User.SAPUser[application.ProductName] != null && application != null && application?.selected == true) {\r\n\r\n function getRoles() {\r\n if (vm.wizardMode !== 'Terminate') {\r\n if (isFinishRequest) {\r\n if (vm.ReturnedRequest.SAPRequest.some(request => request.ProductId === application.ProductID)) {\r\n return vm.ReturnedRequest.SAPRequest.find(request => request.ProductId === application.ProductID).Roles;\r\n } else {\r\n return [];\r\n }\r\n } else {\r\n let allRoles = vm.ListOfSelectedSAPSingleRoles[application.ProductName].concat(vm.ListOfSelectedSAPCompositeRoles[application.ProductName]);\r\n return allRoles;\r\n }\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n function findSAPUserIndex() {\r\n return vm.ReturnedRequest.SAPRequest.findIndex(request => request.ProductId === application.ProductID);\r\n }\r\n\r\n function getSAPUserAction() {\r\n let action = null;\r\n\r\n if (isFinishRequest && vm.alternatePath !== 'EmergencyAccess') {\r\n if (vm.ReturnedRequest) {\r\n if (vm.ReturnedRequest.SAPRequest[findSAPUserIndex()].User) {\r\n action = vm.ReturnedRequest.SAPRequest[findSAPUserIndex()].User.Action;\r\n }\r\n } else {\r\n action = vm.User.SAPUser[application.ProductName].Action;\r\n }\r\n }\r\n return action;\r\n }\r\n\r\n let isEmergencyAccess = vm.alternatePath === \"EmergencyAccess\" ? true : false;\r\n productSapRequest = {\r\n \"ProductId\": application.ProductID,\r\n \"User\": {\r\n \"ProductId\": application.ProductID,\r\n \"Action\": getSAPUserAction(),\r\n \"Status\": vm.User.SAPUser[application.ProductName].Status,\r\n \"StartDate\": vm.User.SAPUser[application.ProductName].StartDate,\r\n \"EndDate\": vm.User.SAPUser[application.ProductName].EndDate,\r\n \"Active\": vm.User.SAPUser[application.ProductName].Active,\r\n \"UserStartDate\": vm.User.SAPUser[application.ProductName].UserStartDate,\r\n \"UserEndDate\": vm.User.SAPUser[application.ProductName].UserEndDate,\r\n \"Email\": vm.User.SAPUser[application.ProductName].Email,\r\n \"FirstName\": vm.User.SAPUser[application.ProductName].FirstName,\r\n \"LastName\": vm.User.SAPUser[application.ProductName].LastName,\r\n \"UserName\": vm.User.SAPUser[application.ProductName].UserName,\r\n \"Street1\": vm.User.SAPUser[application.ProductName].Street1,\r\n \"SNC\": vm.User.SAPUser[application.ProductName].SNC,\r\n \"State\": vm.User.SAPUser[application.ProductName].State,\r\n \"TimeZone\": vm.User.SAPUser[application.ProductName].TimeZone,\r\n \"Title\": vm.User.SAPUser[application.ProductName].Title,\r\n \"UserGroup\": vm.User.SAPUser[application.ProductName].UserGroup,\r\n \"UserType\": vm.User.SAPUser[application.ProductName].UserType === null ? null : vm.User.SAPUser[application.ProductName].UserType,\r\n \"AccountId\": vm.User.SAPUser[application.ProductName].AccountId,\r\n \"City\": vm.User.SAPUser[application.ProductName].City,\r\n \"Password\": vm.User.SAPUser[application.ProductName].Password,\r\n \"UserChanges\": vm.User.SAPUser[application.ProductName].UserChanges\r\n },\r\n \"Roles\": getRoles().map(removePendingKey),\r\n \"IsEmergencyAccess\": isEmergencyAccess,\r\n \"EmergencyAccessObjects\": isEmergencyAccess && vm.ListOfSelectedSAPRoleObjects[application.ProductName] ? vm.ListOfSelectedSAPRoleObjects[application.ProductName].map(o => o.Identifier) : []\r\n };\r\n sapRequest.SAPRequest.push(productSapRequest);\r\n }\r\n } else {\r\n sapRequest.SAPRequest = null;\r\n }\r\n });\r\n request = $.extend({}, request, sapRequest);\r\n\r\n //UP Request\r\n var universalApplication = vm.availableApplications.filter(function (application) {\r\n return application.Id == universalProduct_application_id;\r\n });\r\n\r\n var universalProductRequest = {};\r\n if (vm.User.UPUser) {\r\n universalProductRequest.UniversalRequest = [];\r\n } else {\r\n universalProductRequest.UniversalRequest = null;\r\n }\r\n universalApplication.forEach(application => {\r\n var productUpRequest = {};\r\n if (vm.User.UPUser) {\r\n if (vm.User.UPUser[application.ProductName] != null && application != null && application?.selected == true) {\r\n let upRoles = [];\r\n\r\n if (vm.ListOfSelectedUPRoles[application.ProductName] != null) {\r\n vm.ListOfSelectedUPRoles[application.ProductName].forEach(role => {\r\n if (role.Companies != null) {\r\n\r\n role.Companies.forEach(company => {\r\n upRoles.push(\r\n {\r\n \"UserId\": vm.User.UPUser[application.ProductName].Id,\r\n \"Action\": role.Action,\r\n \"StartDate\": company?.StartDate,\r\n \"EndDate\": company?.EndDate,\r\n \"Role\": {\r\n \"Id\": role.Id,\r\n \"Name\": role.Name,\r\n \"Description\": role.Description,\r\n \"Identifier\": role.Identifier,\r\n \"ProductId\": application.ProductID,\r\n \"ProductName\": application.ProductName\r\n },\r\n \"Company\": {\r\n \"Id\": company?.CompanyId,\r\n \"Name\": company?.CompanyName,\r\n \"ProductId\": company?.ProductId\r\n }\r\n });\r\n });\r\n } else {\r\n upRoles.push(\r\n {\r\n \"UserId\": vm.User.UPUser[application.ProductName].Id,\r\n \"Action\": role.Action,\r\n \"StartDate\": role.StartDate,\r\n \"EndDate\": role.EndDate,\r\n \"Role\": {\r\n \"Id\": role.Id,\r\n \"Name\": role.Name,\r\n \"Description\": role.Description,\r\n \"Identifier\": role.Identifier,\r\n \"ProductId\": application.ProductID,\r\n \"ProductName\": application.ProductName\r\n },\r\n \"Company\": null\r\n });\r\n }\r\n });\r\n }\r\n\r\n function findUPUserIndex() {\r\n return vm.ReturnedRequest.UniversalRequest.findIndex(request => request.ProductId === application?.ProductID);\r\n }\r\n\r\n function getUPUserAction() {\r\n let action = null;\r\n\r\n if (isFinishRequest && vm.ReturnedRequest) {\r\n if (vm.ReturnedRequest.UniversalRequest[findUPUserIndex()].User) {\r\n action = vm.ReturnedRequest.UniversalRequest[findUPUserIndex()].User.Action;\r\n } else {\r\n action = vm.User.UPUser[application.ProductName].Action;\r\n }\r\n }\r\n return action;\r\n }\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n upRoles = vm.ReturnedRequest.UniversalRequest.find(request => request.ProductName === application?.ProductName).UserRoles;\r\n } else if (isTerminate && !isFinishRequest) {\r\n upRoles = [];\r\n }\r\n\r\n productUpRequest = {\r\n \"ProductId\": application.ProductID,\r\n \"ProductName\": application.ProductName,\r\n \"UserId\": vm.User.UPUser[application.ProductName].Id,\r\n \"User\": {\r\n \"ProductId\": application.ProductID,\r\n \"Action\": isTerminate ? \"Delete\" : getUPUserAction(),\r\n \"Id\": vm.User.UPUser[application.ProductName].Id,\r\n \"Name\": vm.User.UPUser[application.ProductName].Name,\r\n \"Description\": vm.User.UPUser[application.ProductName].Description,\r\n \"Email\": vm.User.UPUser[application.ProductName].Email,\r\n \"UserChanges\": vm.User.UPUser[application.ProductName].UserChanges\r\n },\r\n \"UserRoles\": upRoles\r\n };\r\n universalProductRequest.UniversalRequest.push(productUpRequest);\r\n }\r\n } else {\r\n universalProductRequest.UniversalRequest = null;\r\n }\r\n });\r\n request = $.extend({}, request, universalProductRequest);\r\n\r\n //AAD Request\r\n var aadRequest = {};\r\n var aadApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == aad_application_id;\r\n });\r\n\r\n if (vm.User.AadUser != null && vm.User.AadUser.UserPrincipalName != null && aadApplication?.selected == true) {\r\n let aadRoles = vm.ListOfSelectedAADRoles && vm.ListOfSelectedAADRoles.map(role => ({ ...role })),\r\n aadGroups = vm.ListOfSelectedAADGroups && vm.ListOfSelectedAADGroups.map(group => ({ ...group })),\r\n aadLicenses = vm.ListOfSelectedAADLicenses && vm.ListOfSelectedAADLicenses.map(license => ({ ...license }));\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n aadRoles = vm.ReturnedRequest?.AadRequest?.Roles.map(removePendingKey);\r\n aadGroups = vm.ReturnedRequest?.AadRequest?.Groups.map(removePendingKey);\r\n aadLicenses = vm.ReturnedRequest?.AadRequest?.Licenses.map(removePendingKey);\r\n } else if (!isTerminate && !isFinishRequest) {\r\n aadRoles = aadRoles && aadRoles.map(removePendingKey);\r\n aadGroups = aadGroups && aadGroups.map(removePendingKey);\r\n aadLicenses = aadLicenses && aadLicenses.map(removePendingKey);\r\n } else {\r\n aadRoles = [];\r\n aadGroups = [];\r\n aadLicenses = [];\r\n }\r\n\r\n aadRequest = {\r\n AadRequest: {\r\n User: {\r\n AccountEnabled: vm.User.AadUser.AccountEnabled,\r\n BusinessPhones: !vm.User.AadUser.BusinessPhones ? [] : Array.isArray(vm.User.AadUser.BusinessPhones) ? vm.User.AadUser.BusinessPhones : [vm.User.AadUser.BusinessPhones],\r\n City: vm.User.AadUser.City,\r\n Country: vm.User.AadUser.Country,\r\n Department: vm.User.AadUser.Department,\r\n DisplayName: vm.User.AadUser.DisplayName,\r\n GivenName: vm.User.AadUser.GivenName,\r\n Id: vm.User.AadUser.Id,\r\n JobTitle: vm.User.AadUser.JobTitle,\r\n Mail: vm.User.AadUser.Mail,\r\n MobilePhone: vm.User.AadUser.MobilePhone,\r\n OfficeLocation: vm.User.AadUser.OfficeLocation,\r\n PostalCode: vm.User.AadUser.PostalCode,\r\n ProductId: vm.User.AadUser.ProductId,\r\n State: vm.User.AadUser.State,\r\n StreetAddress: vm.User.AadUser.StreetAddress,\r\n SurName: vm.User.AadUser.SurName,\r\n UsageLocation: vm.User.AadUser.UsageLocation,\r\n UserPrincipalName: vm.User.AadUser.Domain ? vm.User.AadUser.UserPrincipalName + '@' + vm.User.AadUser.Domain : vm.User.AadUser.UserPrincipalName,\r\n UserType: \"Member\",\r\n Manager: vm.User.AadUser.Manager,\r\n StartDate: vm.User.AadUser.StartDate,\r\n EndDate: vm.User.AadUser.EndDate,\r\n Action: vm.User.AadUser.Action,\r\n StartDate: vm.User.AadUser.StartDate,\r\n EndDate: vm.User.AadUser.EndDate,\r\n PersonUser: vm.User.AadUser.PersonUser,\r\n PasswordProfile: vm.User.AadUser.PasswordProfile ? {\r\n ForceChangePasswordNextSignIn: vm.User.AadUser.PasswordProfile.ForceChangePasswordNextSignIn,\r\n Password: vm.User.AadUser.PasswordProfile.Password\r\n } : null,\r\n UserChanges: vm.User.AadUser.UserChanges\r\n },\r\n Groups: aadGroups,\r\n Roles: aadRoles,\r\n Licenses:aadLicenses\r\n }\r\n\r\n };\r\n }\r\n else {\r\n aadRequest = {\r\n AadRequest: null\r\n };\r\n }\r\n\r\n request = $.extend({}, request, aadRequest);\r\n\r\n //AX7 Request\r\n var ax7Request = {};\r\n var axApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == ax7_application_id;\r\n });\r\n\r\n if (vm.User.AX7User != null && vm.User.AX7User.UserId != null && axApplication?.selected == true) {\r\n let ax7UserGroups = vm.ListOfSelectedAX7UserGroups && vm.ListOfSelectedAX7UserGroups.map(group => ({ ...group })),\r\n ax7RoleCompanies = [];\r\n\r\n if (vm.ListOfSelectedAX7Roles != null) {\r\n vm.ListOfSelectedAX7Roles.forEach(role => {\r\n if (role.Companies != null) {\r\n\r\n role.Companies.forEach(function (company) {\r\n ax7RoleCompanies.push(\r\n {\r\n UserId: vm.User.AX7User.UserId,\r\n Action: role.Action,\r\n StartDate: company.StartDate,\r\n EndDate: company.EndDate,\r\n Role: {\r\n Id: role.Id,\r\n Name: role.Name,\r\n Description: role.Description\r\n },\r\n Company: {\r\n CompanyId: company.CompanyId,\r\n CompanyName: company.CompanyName,\r\n CompanyType: company.CompanyType\r\n }\r\n });\r\n });\r\n } else {\r\n ax7RoleCompanies.push(\r\n {\r\n UserId: vm.User.AX7User.UserId,\r\n Action: role.Action,\r\n StartDate: role.StartDate,\r\n EndDate: role.EndDate,\r\n Role: {\r\n Id: role.Id,\r\n Name: role.Name,\r\n Description: role.Description\r\n },\r\n Company: null\r\n });\r\n }\r\n });\r\n }\r\n\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n ax7UserGroups = vm.ReturnedRequest?.Ax7Request?.UserGroups.map(removePendingKey);\r\n ax7RoleCompanies = vm.ReturnedRequest?.Ax7Request?.RoleCompanies.map(removePendingKey);\r\n } else if (!isTerminate && !isFinishRequest) {\r\n ax7UserGroups = ax7UserGroups && ax7UserGroups.map(removePendingKey);\r\n } else {\r\n ax7UserGroups = [];\r\n ax7RoleCompanies = [];\r\n }\r\n\r\n ax7Request = {\r\n Ax7Request: {\r\n User: {\r\n ProductId: vm.User.AX7User.ProductId,\r\n Company: vm.User.AX7User.Company == null ? null : vm.User.AX7User.Company,\r\n Email: vm.User.AX7User.Email,\r\n NetworkDomain: vm.User.AX7User.NetworkDomain,\r\n UserId: vm.User.AX7User.UserId,\r\n UserName: vm.User.AX7User.UserName,\r\n Person: vm.User.AX7User.Person,\r\n Enabled: vm.User.AX7User.Enabled,\r\n StartDate: vm.User.AX7User.StartDate,\r\n EndDate: vm.User.AX7User.EndDate,\r\n Action: vm.User.AX7User.Action,\r\n PersonUser: vm.User.AX7User.PersonUser,\r\n UserChanges: vm.User.AX7User.UserChanges\r\n },\r\n RoleCompanies: ax7RoleCompanies,\r\n UserGroups: ax7UserGroups,\r\n //If wizard mode is Modify, current user security was pulled from initiate request - populate it here. Otherwise, null. API will ignore if null.\r\n CurrentUser: vm.wizardMode === 'Modify' && !vm.requestToEdit ? vm.User.AX7User.CurrentAx7User : null\r\n }\r\n };\r\n\r\n }\r\n else {\r\n ax7Request = {\r\n Ax7Request: null\r\n };\r\n }\r\n\r\n request = $.extend({}, request, ax7Request);\r\n\r\n //AX2012 Request\r\n var ax2012Request = {};\r\n var axApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == ax_application_id;\r\n });\r\n\r\n if (vm.User.AX2012User != null && axApplication != null && axApplication?.selected == true) {\r\n let ax2012UserGroups = vm.ListOfSelectedAX2012UserGroups && vm.ListOfSelectedAX2012UserGroups.map(group => ({ ...group })),\r\n ax2012RoleCompanies = [];\r\n\r\n if (vm.ListOfSelectedAX2012Roles != null) {\r\n vm.ListOfSelectedAX2012Roles.forEach(function (role) {\r\n if (role.Companies != null && role?.Companies?.length > 0) {\r\n\r\n role.Companies.forEach(function (company) {\r\n ax2012RoleCompanies.push(\r\n {\r\n UserId: vm.User.AX2012User.UserId,\r\n Action: role.Action,\r\n StartDate: company.StartDate,\r\n EndDate: company.EndDate,\r\n Role: {\r\n Id: role.Id,\r\n Name: role.Name,\r\n Description: role.Description\r\n },\r\n Company: {\r\n CompanyId: company.CompanyId,\r\n CompanyName: company.CompanyName\r\n }\r\n });\r\n });\r\n } else {\r\n ax2012RoleCompanies.push(\r\n {\r\n UserId: vm.User.AX2012User.UserId,\r\n Action: role.Action,\r\n StartDate: role.StartDate,\r\n EndDate: role.EndDate,\r\n Role: {\r\n Id: role.Id,\r\n Name: role.Name,\r\n Description: role.Description\r\n },\r\n Company: null\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n ax2012UserGroups = vm.ReturnedRequest?.AxRequest?.UserGroups.map(removePendingKey);\r\n ax2012RoleCompanies = vm.ReturnedRequest?.AxRequest?.RoleCompanies.map(removePendingKey);\r\n } else if (!isTerminate && !isFinishRequest) {\r\n ax2012UserGroups = ax2012UserGroups && ax2012UserGroups.map(removePendingKey);\r\n } else {\r\n ax2012UserGroups = [];\r\n ax2012RoleCompanies = [];\r\n }\r\n\r\n ax2012Request = {\r\n AxRequest: {\r\n User: {\r\n ProductId: vm.User.AX2012User.ProductId,\r\n Company: vm.User.AX2012User.Company == null ? null : vm.User.AX2012User.Company,\r\n Email: vm.User.AX2012User.Email,\r\n UserId: vm.wizardMode == 'Modify' || vm.wizardMode == 'Terminate' ? vm.User.AX2012User.UserId : vm.User.AX2012User.DisplayUserId,\r\n UserName: vm.User.AX2012User.UserName,\r\n Person: vm.User.AX2012User.Person,\r\n Enabled: vm.User.AX2012User.Enabled,\r\n StartDate: vm.User.AX2012User.StartDate,\r\n EndDate: vm.User.AX2012User.EndDate,\r\n Action: vm.User.AX2012User.Action,\r\n Partition: vm.User.AX2012User.Partition == null ? null : vm.User.AX2012User.Partition.Id,\r\n PartitionKey: vm.User.AX2012User.Partition == null ? null : vm.User.AX2012User.Partition.Key,\r\n SID: vm.User.AX2012User.SID,\r\n NetworkDomain: vm.User.AX2012User.NetworkDomain,\r\n NetworkAlias: vm.User.AX2012User.NetworkAlias,\r\n UserChanges: vm.User.AX2012User.UserChanges\r\n },\r\n RoleCompanies: ax2012RoleCompanies,\r\n UserGroups: ax2012UserGroups,\r\n //If wizard mode is Modify, current user security was pulled from initiate request - populate it here. Otherwise, null. API will ignore if null.\r\n CurrentUser: vm.wizardMode === 'Modify' && !vm.requestToEdit ? vm.User.AX2012User.CurrentAX2012User : null\r\n }\r\n };\r\n }\r\n else {\r\n ax2012Request = {\r\n \"AxRequest\": null\r\n };\r\n }\r\n\r\n request = $.extend({}, request, ax2012Request);\r\n\r\n //ORACLE Request\r\n var oracleApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == oracle_application_id;\r\n });\r\n\r\n var oracleRequest = {};\r\n\r\n if (vm.User.OracleUser != null && oracleApplication != null && oracleApplication?.selected == true) {\r\n let oracleResponsibilities = vm.ListOfSelectedOracleResponsibilities && vm.ListOfSelectedOracleResponsibilities.map(responsibility => ({ ...responsibility })),\r\n oracleRoles = vm.ListOfSelectedOracleRoles && vm.ListOfSelectedOracleRoles.map(role => ({ ...role }));\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n oracleResponsibilities = vm.ReturnedRequest?.EbsRequest?.Responsibilities.map(removePendingKey);\r\n oracleRoles = vm.ReturnedRequest?.EbsRequest?.Roles.map(removePendingKey);\r\n } else if (!isTerminate && !isFinishRequest) {\r\n oracleResponsibilities = oracleResponsibilities && oracleResponsibilities.map(removePendingKey);\r\n oracleRoles = oracleRoles && oracleRoles.map(removePendingKey)\r\n } else {\r\n oracleResponsibilities = [];\r\n oracleRoles = [];\r\n }\r\n\r\n oracleRequest = {\r\n \"EbsRequest\": {\r\n \"User\": {\r\n \"ProductId\": vm.User.OracleUser.ProductId,\r\n \"Action\": vm.User.OracleUser.Action,\r\n \"StartDate\": vm.User.OracleUser.StartDate,\r\n \"EndDate\": vm.User.OracleUser.EndDate,\r\n \"ID\": vm.User.OracleUser.ID,\r\n \"Name\": vm.User.OracleUser.Name,\r\n \"Description\": vm.User.OracleUser.Description,\r\n \"EmployeeID\": vm.User.OracleUser.EmployeeID,\r\n \"Email\": vm.User.OracleUser.Email,\r\n \"Password\": vm.User.OracleUser.Password,\r\n \"PasswordAccesses\": vm.User.OracleUser.Expiration === 'None' || vm.User.OracleUser.Expiration === 'Days' ? null : vm.User.OracleUser.ExpirationValue,\r\n \"PasswordDays\": vm.User.OracleUser.Expiration === 'None' || vm.User.OracleUser.Expiration === 'Accesses' ? null : vm.User.OracleUser.ExpirationValue,\r\n \"UserChanges\": vm.User.OracleUser.UserChanges\r\n },\r\n \"Responsibilities\": oracleResponsibilities\r\n }\r\n };\r\n\r\n if (vm.ORRBACEnabled) {\r\n oracleRequest.EbsRequest.Roles = oracleRoles;\r\n }\r\n\r\n } else {\r\n oracleRequest = {\r\n \"EbsRequest\": null\r\n };\r\n }\r\n request = $.extend({}, request, oracleRequest);\r\n\r\n // Oracle Cloud Request\r\n var oracleCloudApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == oracleCloud_application_id;\r\n });\r\n\r\n var oracleCloudRequest = {};\r\n\r\n if (vm.User.OracleCloudUser != null && oracleCloudApplication != null && oracleCloudApplication?.selected == true) {\r\n var oracleCloudRoles = vm.ListOfSelectedOracleCloudRoles && vm.ListOfSelectedOracleCloudRoles.map(role => ({ ...role }));\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n oracleCloudRoles = vm.ReturnedRequest?.OrfcRequest?.Roles.map(removePendingKey);\r\n \r\n } else if (!isTerminate && !isFinishRequest) {\r\n oracleCloudRoles = oracleCloudRoles && oracleCloudRoles.map(removePendingKey);\r\n } else {\r\n oracleCloudRoles = [];\r\n }\r\n\r\n oracleCloudRequest = {\r\n \"OrfcRequest\": {\r\n \"User\": {\r\n \"Action\": vm.User.OracleCloudUser.Action,\r\n \"ProductId\": vm.User.OracleCloudUser.ProductId,\r\n \"UserID\": vm.User.OracleCloudUser.UserID,\r\n \"UserName\": vm.User.OracleCloudUser.UserName,\r\n \"Password\": vm.User.OracleCloudUser.Password,\r\n \"FirstName\": vm.User.OracleCloudUser.FirstName,\r\n \"LastName\": vm.User.OracleCloudUser.LastName,\r\n \"Email\": vm.User.OracleCloudUser.Email,\r\n \"ExternalID\": vm.User.OracleCloudUser.ExternalID,\r\n \"DisplayName\": vm.User.OracleCloudUser.DisplayName,\r\n \"Active\": vm.User.OracleCloudUser.Active,\r\n \"StartDate\": vm.User.OracleCloudUser.StartDate,\r\n \"EndDate\": vm.User.OracleCloudUser.EndDate,\r\n \"UserChanges\": vm.User.OracleCloudUser.UserChanges\r\n },\r\n \"Roles\": oracleCloudRoles\r\n }\r\n };\r\n\r\n } else {\r\n oracleRequest = {\r\n \"OrfcRequest\": null\r\n };\r\n }\r\n request = $.extend({}, request, oracleCloudRequest);\r\n\r\n //GP Request\r\n var gpApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == gp_application_id;\r\n });\r\n\r\n var gpRequest = {};\r\n if (vm.User.GPUser != null && gpApplication != null && gpApplication?.selected == true) {\r\n let gpRoles = [],\r\n gpCompanies = [];\r\n\r\n if (vm.ListOfStoredGPRoles != null) {\r\n vm.ListOfStoredGPRoles.forEach(function (roleCompany) {\r\n //Find the company for each role, this is used to set the AltModProfile for each role\r\n var foundCompany = vm.User.GPUser.Companies.find(company => company.Company.Id == roleCompany.Company.Id);\r\n\r\n gpRoles.push({\r\n \"UserId\": vm.User.GPUser.Id,\r\n \"Action\": roleCompany.Action,\r\n \"Status\": roleCompany.Status,\r\n \"StartDate\": roleCompany.StartDate,\r\n \"EndDate\": roleCompany.EndDate,\r\n \"AccessType\": roleCompany.AccessType,\r\n \"Role\": {\r\n \"Id\": roleCompany.Role.Id,\r\n \"Name\": roleCompany.Role.Id,\r\n \"Description\": roleCompany.Role.Id\r\n },\r\n \"Company\": {\r\n \"Id\": roleCompany.Company.Id,\r\n \"Name\": roleCompany.Company.Name\r\n },\r\n \"AltModProfile\": foundCompany.AltModProfile.Id\r\n });\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedGPCompanies != null) {\r\n vm.ListOfSelectedGPCompanies.forEach(company => {\r\n gpCompanies.push({\r\n \"UserId\": vm.User.GPUser.Id,\r\n \"Action\": company.Action,\r\n \"Status\": company.Status,\r\n \"AccessType\": company.AccessType,\r\n \"StartDate\": company.StartDate,\r\n \"EndDate\": company.EndDate,\r\n \"Company\": {\r\n \"Id\": company.Id,\r\n \"Name\": company.Name\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n gpRoles = vm.ReturnedRequest?.GPRequest?.RoleCompanies.map(removePendingKeyByKey.bind(null, \"Role\"));\r\n gpCompanies = vm.ReturnedRequest?.GPRequest?.UserCompanies.map(removePendingKey);\r\n } else if (!isTerminate && !isFinishRequest) {\r\n gpCompanies = gpCompanies && gpCompanies.map(removePendingKey);\r\n } else {\r\n gpRoles = [];\r\n gpCompanies = [];\r\n }\r\n\r\n gpRequest = {\r\n \"GPRequest\": {\r\n \"User\": {\r\n \"ProductId\": vm.User.GPUser.ProductId,\r\n \"Action\": vm.User.GPUser.Action,\r\n \"Status\": vm.User.GPUser.Status,\r\n \"StartDate\": vm.User.GPUser.StartDate,\r\n \"EndDate\": vm.User.GPUser.EndDate,\r\n \"Id\": vm.User.GPUser.Id,\r\n \"UserName\": vm.User.GPUser.UserName,\r\n \"UserStatus\": vm.User.GPUser.UserStatus,\r\n \"UserType\": vm.User.GPUser.UserType,\r\n \"WCUser\": vm.User.GPUser.WCUser,\r\n \"Company\": vm.User.GPUser.Company,\r\n \"Class\": vm.User.GPUser.DisplayClass == null ? null : vm.User.GPUser.DisplayClass.RowId,\r\n \"ClassName\": vm.User.GPUser.DisplayClass == null ? null : vm.User.GPUser.DisplayClass.Name,\r\n \"LoginType\": vm.User.GPUser.LoginType,\r\n \"PayrollViewForHR\": vm.User.GPUser.PayrollViewForHR,\r\n \"WindowsUserId\": vm.User.GPUser.WindowsUserId,\r\n \"NetBiosName\": vm.User.GPUser.NetBiosName,\r\n \"ADUserId\": vm.User.GPUser.ADUserId,\r\n \"UserChanges\": vm.User.GPUser.UserChanges\r\n\r\n },\r\n \"RoleCompanies\": gpRoles,\r\n \"UserCompanies\": gpCompanies\r\n }\r\n };\r\n\r\n } else {\r\n gpRequest = {\r\n \"GpRequest\": null\r\n };\r\n }\r\n request = $.extend({}, request, gpRequest);\r\n\r\n\r\n //NAV Request\r\n var navRequest = {};\r\n var navApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == nav_application_id;\r\n });\r\n\r\n if (vm.User.NAVUser != null && vm.User.NAVUser.LicenseType != null && navApplication?.selected == true) {\r\n let navPermissions = [],\r\n navUserGroups = [];\r\n\r\n if (vm.ListOfSelectedNAVPermissionSets != null) {\r\n vm.ListOfSelectedNAVPermissionSets.forEach(permissionSet => {\r\n if (permissionSet.Companies != null && permissionSet.Companies.length > 0) {\r\n\r\n permissionSet.Companies.forEach(company => {\r\n navPermissions.push({\r\n \"UserId\": vm.User.NAVUser.UserId,\r\n \"Action\": permissionSet.Action,\r\n \"Status\": permissionSet.Status,\r\n \"StartDate\": permissionSet.StartDate,\r\n \"EndDate\": permissionSet.EndDate,\r\n \"AccessType\": permissionSet.AccessType,\r\n \"Id\": permissionSet.Id,\r\n \"Name\": permissionSet.Name,\r\n \"Company\": company.Name,\r\n \"StartDate\": company.StartDate,\r\n \"EndDate\": company.EndDate\r\n });\r\n });\r\n } else {\r\n navPermissions.push(\r\n {\r\n \"UserId\": vm.User.NAVUser.UserId,\r\n \"Action\": permissionSet.Action,\r\n \"Status\": permissionSet.Status,\r\n \"StartDate\": permissionSet.StartDate,\r\n \"EndDate\": permissionSet.EndDate,\r\n \"AccessType\": permissionSet.AccessType,\r\n \"Id\": permissionSet.Id,\r\n \"Name\": permissionSet.Name,\r\n \"Company\": null\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedNAVUserGroups != null) {\r\n vm.ListOfSelectedNAVUserGroups.forEach(group => {\r\n if (group.Companies != null && group.Companies.length > 0) {\r\n group.Companies.forEach(company => {\r\n navUserGroups.push(\r\n {\r\n \"UserId\": vm.User.NAVUser.UserId,\r\n \"Action\": group.Action,\r\n \"Status\": group.Status,\r\n \"StartDate\": group.StartDate,\r\n \"EndDate\": group.EndDate,\r\n \"AccessType\": group.AccessType,\r\n \"Id\": group.Id,\r\n \"Name\": group.Name,\r\n \"PermissionSets\": group.PermissionSets,\r\n \"Company\": company.Name\r\n });\r\n });\r\n } else {\r\n navUserGroups.push(\r\n {\r\n \"UserId\": vm.User.NAVUser.UserId,\r\n \"Action\": group.Action,\r\n \"Status\": group.Status,\r\n \"StartDate\": group.StartDate,\r\n \"EndDate\": group.EndDate,\r\n \"AccessType\": group.AccessType,\r\n \"Id\": group.Id,\r\n \"Name\": group.Name,\r\n \"PermissionSets\": group.PermissionSets,\r\n \"Company\": null\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n navPermissions = vm.ReturnedRequest?.NavRequest?.PermissionSets.map(removePendingKey);\r\n navUserGroups = vm.ReturnedRequest?.NavRequest?.UserGroups.map(removePendingKey);\r\n } else if (isTerminate && !isFinishRequest) {\r\n navPermissions = [];\r\n navUserGroups = [];\r\n }\r\n\r\n navRequest = {\r\n \"NavRequest\": {\r\n \"User\": {\r\n \"Action\": vm.User.NAVUser.Action,\r\n \"ProductId\": vm.User.NAVUser.ProductId,\r\n \"Status\": vm.User.NAVUser.Status,\r\n \"StartDate\": vm.User.NAVUser.StartDate,\r\n \"EndDate\": vm.User.NAVUser.EndDate,\r\n \"UserSecurityId\": vm.User.NAVUser.UserSecurityId,\r\n \"UserName\": vm.User.NAVUser.UserName,\r\n \"FullName\": vm.User.NAVUser.FullName,\r\n \"LicenseType\": vm.User.NAVUser.LicenseType.Id,\r\n \"State\": vm.User.NAVUser.State,\r\n \"ExpirySet\": vm.User.NAVUser.ExpiryDate == new Date(-8640000000000000) ? false : true,\r\n \"ExpiryDate\": vm.User.NAVUser.ExpiryDate,\r\n \"ContactEmail\": vm.User.NAVUser.ContactEmail,\r\n \"WindowsUserName\": vm.User.NAVUser.WindowsUserName,\r\n \"WindowsSID\": vm.User.NAVUser.WindowsSID,\r\n \"Domain\": vm.User.NAVUser.Domain,\r\n \"ProfileID\": vm.User.NAVUser.ProfileID,\r\n \"LanguageID\": vm.User.NAVUser.LanguageID,\r\n \"Company\": vm.User.NAVUser.Company,\r\n \"Personalized\": true,\r\n \"UserChanges\": vm.User.NAVUser.UserChanges\r\n },\r\n \"PermissionSets\": navPermissions,\r\n \"UserGroups\": navUserGroups\r\n }\r\n };\r\n }\r\n else {\r\n navRequest = {\r\n \"NavRequest\": null\r\n };\r\n }\r\n\r\n request = $.extend({}, request, navRequest);\r\n\r\n //D365S Request\r\n var d365SRequest = {};\r\n var d365SApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == d365s_application_id;\r\n });\r\n\r\n if (vm.User.D365SUser != null && vm.User.D365SUser.DomainName != null && d365SApplication?.selected == true) {\r\n let d365sRoles = [],\r\n d365sTeams = [];\r\n\r\n if (vm.ListOfSelectedD365SRoles != null) {\r\n vm.ListOfSelectedD365SRoles.forEach(role => {\r\n d365sRoles.push(\r\n {\r\n \"UserId\": vm.User.D365SUser.UserId,\r\n \"Action\": role.Action,\r\n \"StartDate\": role.StartDate,\r\n \"EndDate\": role.EndDate,\r\n \"Role\": {\r\n \"Id\": role.Id,\r\n \"Name\": role.Name,\r\n \"Description\": role.Description\r\n },\r\n \"Company\": null\r\n });\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedD365STeams != null) {\r\n vm.ListOfSelectedD365STeams.forEach(team => {\r\n d365sTeams.push(\r\n {\r\n \"UserId\": vm.User.D365SUser.UserId,\r\n \"Action\": team.Action,\r\n \"StartDate\": team.StartDate,\r\n \"EndDate\": team.EndDate,\r\n \"Team\": {\r\n \"Id\": team.Id,\r\n \"Name\": team.Name,\r\n \"Description\": team.Description\r\n },\r\n \"Company\": null\r\n });\r\n });\r\n }\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n d365sRoles = vm.ReturnedRequest.D365SRequest.UserRoles.map(removePendingKeyByKey.bind(null, \"Role\"));\r\n d365sTeams = vm.ReturnedRequest.D365SRequest.UserTeams.map(removePendingKey);\r\n } else if (isTerminate && !isFinishRequest) {\r\n d365sRoles = [];\r\n d365sTeams = [];\r\n }\r\n\r\n d365SRequest = {\r\n \"D365SRequest\": {\r\n \"User\": {\r\n \"Action\": vm.User.D365SUser.Action,\r\n \"Status\": vm.User.D365SUser.Status,\r\n \"StartDate\": vm.User.D365SUser.StartDate,\r\n \"EndDate\": vm.User.D365SUser.EndDate,\r\n \"ProductId\": vm.User.D365SUser.ProductId,\r\n \"Id\": vm.User.D365SUser.Id,\r\n \"AccessMode\": vm.User.D365SUser.AccessMode,\r\n \"BusinessUnitId\": vm.User.D365SUser.BusinessUnitId,\r\n \"CalType\": vm.User.D365SUser.CalType,\r\n \"DomainName\": vm.User.D365SUser.DomainName,\r\n \"FirstName\": vm.User.D365SUser.FirstName,\r\n \"LastName\": vm.User.D365SUser.LastName,\r\n \"IncomingEmailDeliveryMethod\": vm.User.D365SUser.IncomingEmailDeliveryMethod,\r\n \"InternalEmailAddress\": vm.User.D365SUser.InternalEmailAddress,\r\n \"IsDisabled\": vm.User.D365SUser.IsDisabled,\r\n \"HomePhone\": vm.User.D365SUser.HomePhone,\r\n \"MobilePhone\": vm.User.D365SUser.MobilePhone,\r\n \"OutgoingEmailDeliveryMethod\": vm.User.D365SUser.OutgoingEmailDeliveryMethod,\r\n \"SiteId\": vm.User.D365SUser.SiteId,\r\n \"TerritoryId\": vm.User.D365SUser.TerritoryId,\r\n \"Title\": vm.User.D365SUser.Title,\r\n \"ParentSystemUserId\": vm.User.D365SUser.ParentSystemUserId,\r\n \"AzureADObjectId\": vm.User.D365SUser.AzureADObjectId,\r\n \"UserChanges\": vm.User.D365SUser.UserChanges\r\n },\r\n \"UserRoles\": d365sRoles,\r\n \"UserTeams\": d365sTeams\r\n }\r\n };\r\n\r\n }\r\n else {\r\n d365SRequest = {\r\n \"D365SRequest\": null\r\n };\r\n }\r\n\r\n request = $.extend({}, request, d365SRequest);\r\n\r\n\r\n //Peoplesoft Request\r\n var psRequest = {};\r\n var psApplication = vm.availableApplications.find(function (application) {\r\n return application.Id == ps_application_id;\r\n });\r\n\r\n if (vm.User.PSUser != null && vm.User.PSUser.Id != null && psApplication?.selected == true) {\r\n\r\n let psRoles = vm.ListOfSelectedPSRoles;\r\n\r\n if (vm.User.PSUser.Password === \"\") {\r\n vm.User.PSUser.Password = null;\r\n }\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n psRoles = vm.ReturnedRequest?.PsRequest?.Roles.map(removePendingKeyByKey.bind(null, \"Name\"));\r\n } else if (!isTerminate && !isFinishRequest) {\r\n psRoles = psRoles && psRoles.map(removePendingKey);\r\n } else {\r\n psRoles = [];\r\n }\r\n\r\n psRequest = {\r\n \"PsRequest\": {\r\n \"User\": {\r\n \"Action\": vm.User.PSUser.Action,\r\n \"Status\": vm.User.PSUser.Status,\r\n \"StartDate\": vm.User.PSUser.StartDate,\r\n \"EndDate\": vm.User.PSUser.EndDate,\r\n \"ProductId\": vm.User.PSUser.ProductId,\r\n \"Id\": vm.User.PSUser.Id,\r\n \"Description\": vm.User.PSUser.Description,\r\n \"Alias\": vm.User.PSUser.Alias,\r\n \"PrimaryEmail\": vm.User.PSUser.PrimaryEmail,\r\n \"EmailType\": vm.User.PSUser.EmailType,\r\n \"Password\": vm.User.PSUser.Password,\r\n \"AccountLocked\": vm.User.PSUser.AccountLocked,\r\n \"NavigatorHomePermissionList\": vm.User.PSUser.NavigatorHomePermissionList,\r\n \"ProcessProfilePermissionList\": vm.User.PSUser.ProcessProfilePermissionList,\r\n \"PrimaryPermissionList\": vm.User.PSUser.PrimaryPermissionList,\r\n \"RowSecurityPermissionList\": vm.User.PSUser.RowSecurityPermissionList,\r\n \"UserChanges\": vm.User.PSUser.UserChanges\r\n },\r\n \"Roles\": psRoles,\r\n }\r\n };\r\n\r\n }\r\n else {\r\n psRequest = {\r\n \"PSRequest\": null\r\n };\r\n }\r\n\r\n request = $.extend({}, request, psRequest);\r\n\r\n //Salesforce Request\r\n var salesforceRequest = {};\r\n var salesforceApplication = vm.availableApplications.find(application => application.Id == salesforce_application_id);\r\n\r\n if (vm.User.SalesforceUser != null && vm.User.SalesforceUser.Username && salesforceApplication?.selected == true) {\r\n \r\n let salesforceProfiles, salesforcePermissionSets = vm.ListOfSelectedSalesforcePermissionSets;\r\n\r\n if (!isTerminate && isFinishRequest) {\r\n salesforceProfiles = vm.ReturnedRequest?.SfRequest?.Profiles;\r\n salesforcePermissionSets = vm.ReturnedRequest?.SfRequest?.PermissionSets.map(removePendingKey);\r\n } else if (!isTerminate && !isFinishRequest) {\r\n salesforceProfiles = [vm.User.SalesforceUser.Profile];\r\n salesforcePermissionSets = salesforcePermissionSets && salesforcePermissionSets.map(removePendingKey);\r\n } else {\r\n salesforcePermissionSets = [];\r\n }\r\n\r\n salesforceRequest = {\r\n SfRequest: {\r\n User: {\r\n Action: vm.User.SalesforceUser.Action,\r\n Status: vm.User.SalesforceUser.Status,\r\n StartDate: vm.User.SalesforceUser.StartDate,\r\n EndDate: vm.User.SalesforceUser.EndDate,\r\n ProductId: vm.User.SalesforceUser.ProductId,\r\n Id: vm.User.SalesforceUser.Id,\r\n FirstName: vm.User.SalesforceUser.FirstName,\r\n LastName: vm.User.SalesforceUser.LastName,\r\n Alias: vm.User.SalesforceUser.Alias,\r\n Email: vm.User.SalesforceUser.Email,\r\n Username: vm.User.SalesforceUser.Username,\r\n Nickname: vm.User.SalesforceUser.Nickname,\r\n Title: vm.User.SalesforceUser.Title,\r\n CompanyName: vm.User.SalesforceUser.CompanyName,\r\n Department: vm.User.SalesforceUser.Department,\r\n Division: vm.User.SalesforceUser.Division,\r\n Phone: vm.User.SalesforceUser.Phone,\r\n Extension: vm.User.SalesforceUser.Extension,\r\n Fax: vm.User.SalesforceUser.Fax,\r\n MobilePhone: vm.User.SalesforceUser.MobilePhone,\r\n EmployeeNumber: vm.User.SalesforceUser.EmployeeNumber,\r\n Country: vm.User.SalesforceUser.Country,\r\n Street: vm.User.SalesforceUser.Street,\r\n City: vm.User.SalesforceUser.City,\r\n State: vm.User.SalesforceUser.State,\r\n PostalCode: vm.User.SalesforceUser.PostalCode,\r\n FederationIdentifier: vm.User.SalesforceUser.FederationIdentifier,\r\n ManagerId: vm.User.SalesforceUser.ManagerId,\r\n DelegateApproverId: vm.User.SalesforceUser.DelegateApproverId,\r\n UserRoleId: vm.User.SalesforceUser.UserRoleId,\r\n UserChanges: vm.User.SalesforceUser.UserChanges\r\n },\r\n Profiles: salesforceProfiles,\r\n PermissionSets: salesforcePermissionSets\r\n }\r\n };\r\n\r\n }\r\n else {\r\n salesforceRequest = {\r\n SfRequest: null\r\n };\r\n }\r\n\r\n request = $.extend({}, request, salesforceRequest);\r\n\r\n return request;\r\n };\r\n\r\n this.buildHeaderRequest = function (vm) {\r\n\r\n var request = {\r\n };\r\n\r\n //Add inital settings for the requests\r\n if (vm.User.UserMaster != null) {\r\n request = $.extend({}, request, { \"UserMasterId\": vm.User.UserMaster.Id });\r\n }\r\n if (vm.requestToEdit != null) {\r\n request = $.extend({}, request, { \"RequestId\": vm.requestToEdit.Id });\r\n request = $.extend({}, request, { \"Version\": vm.requestToEdit.Version });\r\n }\r\n\r\n request = $.extend({}, request, { \"Note\": vm.RequestNotes });\r\n if (vm.RiskLevelId != null) {\r\n request = $.extend({}, request, { \"RiskLevelId\": vm.RiskLevelId });\r\n }\r\n if (vm.RiskLevelIdNewOnly != null) {\r\n request = $.extend({}, request, { \"RiskLevelIdNewOnly\": vm.RiskLevelIdNewOnly });\r\n }\r\n if (vm.bypassRiskAnalysis != null) {\r\n request = $.extend({}, request, { \"RiskAnalysisBypassed\": vm.bypassRiskAnalysis });\r\n }\r\n\r\n request = $.extend({}, request, { \"Action\": vm.wizardMode });\r\n if (vm.alternatePath === 'EmergencyAccess') {\r\n // Emergency Access uses modify wizard mode, so we have to intercept and change the request Action\r\n request.Action = 'EmergencyAccess';\r\n }\r\n request = $.extend({}, request, { \"AffectedType\": \"User\" });\r\n\r\n return request;\r\n };\r\n\r\n this.executeRequest = function (request) {\r\n return $http.post(apiUrl + 'api/identitymanager/requests/build', request);\r\n };\r\n}\r\n\r\nfunction removePendingKey(item) {\r\n item = { ...item }\r\n delete item.Pending;\r\n\r\n return item;\r\n}\r\n\r\nfunction removePendingKeyByKey(key, item) {\r\n item = { ...item }\r\n delete item[key].Pending;\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($q, $filter, RequestManagementD365SService) {\r\n\r\n var self = this;\r\n\r\n this.loadD365S = function ($scope, openRequest) {\r\n //Load Data for Products after search row is selected\r\n var d365sDfrd = $q.defer();\r\n\r\n try {\r\n self.loadPermissions($scope, openRequest).then(function () {\r\n d365sDfrd.resolve();\r\n }, function errorCallback(response) {\r\n d365sDfrd.reject(response);\r\n });\r\n }\r\n catch (e) {\r\n d365sDfrd.reject(e);\r\n }\r\n\r\n return $.when(d365sDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.loadPermissions = function ($scope, openRequest) {\r\n let permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n d365SRoles = [],\r\n d365STeams = [],\r\n pendingRoles = $scope.vm.User?.D365SUser?.PendingRoles || [],\r\n pendingTeams = $scope.vm.User?.D365SUser?.PendingTeams || [];\r\n\r\n $scope.vm.businessUnitsDropdownLoading = true;\r\n $scope.vm.usersDropdownLoading = true;\r\n $scope.vm.territoryDropdownLoading = true;\r\n $scope.vm.siteDropdownLoading = true;\r\n $scope.vm.incomingMailDropdownLoading = true;\r\n $scope.vm.outgoingMailDropdownLoading = true;\r\n $scope.vm.accessModeDropdownLoading = true;\r\n\r\n if ($scope.vm.User.D365SUser != null) {\r\n\r\n d365SRoles = $scope.vm.User.D365SUser.Roles;\r\n d365STeams = $scope.vm.User.D365SUser.Teams;\r\n\r\n //We can only get roles if there is a business unit selected\r\n if ($scope.vm.User.D365SUser.BusinessUnitId) {\r\n promises.push(\r\n RequestManagementD365SService.getRolesByBusinessUnitId($scope.vm.User.D365SUser.BusinessUnitId).then(function (response) {\r\n $scope.vm.ListOfAvailableD365SRoles = response.data.map(applyPendingByKey.bind(null, \"Role\", pendingRoles));\r\n })\r\n );\r\n promises.push(RequestManagementD365SService.getTeamsByBusinessUnitId($scope.vm.User.D365SUser.BusinessUnitId).then(function (response) {\r\n $scope.vm.ListOfAvailableD365STeams = response.data.map(applyPendingByKey.bind(null, \"Team\", pendingTeams));\r\n }));\r\n }\r\n }\r\n\r\n promises.push(RequestManagementD365SService.getAllUsers().then(response => {\r\n response.data = $filter('orderBy')(response.data, 'FullName');\r\n $scope.vm.D365SUserDataSource = response.data;\r\n $scope.vm.usersDropdownLoading = false;\r\n }));\r\n\r\n promises.push(RequestManagementD365SService.getAllBusinessUnits().then(response => {\r\n $scope.vm.D365SBusinessUnitDataSource = response.data;\r\n $scope.vm.businessUnitsDropdownLoading = false;\r\n }));\r\n\r\n promises.push(RequestManagementD365SService.getAllTerritories().then(response => {\r\n $scope.vm.D365STerritoryDataSource = response.data;\r\n $scope.vm.territoryDropdownLoading = false;\r\n }));\r\n\r\n promises.push(RequestManagementD365SService.getAllSites().then(response => {\r\n $scope.vm.D365SSiteDataSource = response.data;\r\n $scope.vm.siteDropdownLoading = false;\r\n }));\r\n\r\n promises.push(RequestManagementD365SService.getAllIncomingMailMethods().then(response => {\r\n $scope.vm.D365SIncomingMailMethodsDataSource = response.data.lstOptions;\r\n $scope.vm.incomingMailDropdownLoading = false;\r\n }));\r\n\r\n promises.push(RequestManagementD365SService.getAllOutgoingMailMethods().then(response => {\r\n $scope.vm.D365SOutgoingMailMethodsDataSource = response.data.lstOptions;\r\n $scope.vm.outgoingMailDropdownLoading = false;\r\n }));\r\n\r\n promises.push(RequestManagementD365SService.getAllAccessModes().then(response => {\r\n response.data.lstOptions = $filter('orderBy')(response.data.lstOptions, 'Label');\r\n $scope.vm.D365SAccessModeDataSource = response.data.lstOptions;\r\n $scope.vm.accessModeDropdownLoading = false;\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.vm.User === null) {\r\n $scope.vm.User = {};\r\n }\r\n if ($scope.vm.User.D365SUser === null) {\r\n $scope.vm.User.D365SUser = {};\r\n }\r\n\r\n //Modify Available and Selected company lists to refect users current security\r\n if (d365SRoles != null && $scope.vm.ListOfAvailableD365SRoles != null) {\r\n d365SRoles.forEach(role => {\r\n if ($scope.vm.ListOfSelectedD365SRoles.none(selectedRole => { return selectedRole.Id === role.Role.Id; })) {\r\n\r\n $scope.vm.ListOfSelectedD365SRoles.unshift({\r\n Id: role.Role.Id,\r\n Name: role.Role.Name,\r\n IsAssignable: role.Role.IsAssignable,\r\n Identifier: role.Role.Identifier,\r\n Pending: pendingRoles.find(pendingRole => pendingRole.id === role.Role.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableD365SRoles.forEach((row, j) => {\r\n if (row.Id === role.Role.Id) {\r\n $scope.vm.ListOfAvailableD365SRoles.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (d365STeams != null && $scope.vm.ListOfAvailableD365STeams != null) {\r\n d365STeams.forEach(team => {\r\n if ($scope.vm.ListOfSelectedD365STeams.none(selectedTeam => { return selectedTeam.Id === team.Team.Id; })) {\r\n\r\n $scope.vm.ListOfSelectedD365STeams.unshift({\r\n Id: team.Team.Id,\r\n Name: team.Team.Name,\r\n Pending: pendingTeams.find(pendingTeam => pendingTeam.id === team.Team.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableD365STeams.forEach((row, j) => {\r\n if (row.Id === team.Team.Id) {\r\n $scope.vm.ListOfAvailableD365STeams.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n $scope.vm.ListOfAvailableD365SRoles = $scope.vm.ListOfAvailableD365SRoles.filter(role => role.IsAssignable);\r\n $scope.d365sUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n}\r\n\r\nfunction applyPendingByKey(key, pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem[key].Id === item.Id);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n this.getRolesByBusinessUnitId = function (businessUnitId) {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/roles/businessunit/' + businessUnitId\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Roles';\r\n }\r\n };\r\n\r\n this.getTeamsByBusinessUnitId = function (businessUnitId) {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/teams/businessunit/' + businessUnitId\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Teams';\r\n }\r\n };\r\n\r\n this.getAllSites = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/sites'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Sites';\r\n }\r\n };\r\n\r\n this.getAllTerritories = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/territories'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Territories';\r\n }\r\n };\r\n\r\n this.getAllUsers = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/users'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Users';\r\n }\r\n };\r\n\r\n this.getAllBusinessUnits = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/businessunits'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Business Units';\r\n }\r\n };\r\n\r\n this.getAllIncomingMailMethods = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/picklists/incomingmailmethods'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Business Units';\r\n }\r\n };\r\n\r\n this.getAllOutgoingMailMethods = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/picklists/outgoingmailmethods'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Business Units';\r\n }\r\n };\r\n\r\n this.getAllAccessModes = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/picklists/accessModes'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Business Units';\r\n }\r\n };\r\n\r\n this.getLicenseTypesByAccessModeId = function (accessModeId) {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/d365s/picklists/licensetypes/accessmode/' + accessModeId\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading D365S Business Units';\r\n }\r\n };\r\n\r\n}","export default /*@ngInject*/ function ($q, RequestManagementGPService) {\r\n\r\n var self = this;\r\n\r\n this.loadGP = function ($scope, openRequest) {\r\n //Load Data for Products after search row is selected\r\n var gpDfrd = $.Deferred();\r\n\r\n self.loadGPData($scope);\r\n\r\n try {\r\n self.loadPermissions($scope, openRequest).then(function () {\r\n gpDfrd.resolve();\r\n }, function errorCallback(response) {\r\n gpDfrd.reject(response);\r\n });\r\n }\r\n catch (e) {\r\n gpDfrd.reject(e);\r\n }\r\n\r\n return $.when(gpDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n this.loadPermissions = function ($scope) {\r\n let permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n gpCompanies = [],\r\n pendingCompanies = $scope.vm.User?.GPUser?.PendingCompanies || [];\r\n\r\n $scope.vm.ListOfSelectedGPRoles = [];\r\n $scope.vm.ListOfAvailableGPRoles = [];\r\n $scope.vm.ListOfSelectedGPCompanies = [];\r\n $scope.vm.ListOfAvailableGPCompanies = [];\r\n\r\n if ($scope.vm.User.GPUser != null) {\r\n $scope.vm.ListOfStoredGPRoles = $scope.vm.User.GPUser.RoleCompanies;\r\n gpCompanies = $scope.vm.User.GPUser.Companies;\r\n }\r\n\r\n $scope.vm.PendingGpRoleCompanies = $scope.vm.User?.GPUser?.PendingRoleCompanies || [];\r\n //Load Available gpRoles then process existing security\r\n promises.push(\r\n RequestManagementGPService.getAllRoles().then(function (response) {\r\n // Not filtering pending roles here, they are filtered after choosing a company\r\n $scope.vm.ListOfAllAvailableGPRoles = response.data;\r\n })\r\n );\r\n\r\n promises.push(\r\n RequestManagementGPService.getAllCompanies().then(function (response) {\r\n $scope.vm.ListOfAvailableGPCompanies = response.data.map(applyPending.bind(null, pendingCompanies));\r\n })\r\n );\r\n\r\n promises.push(RequestManagementGPService.getAllClasses().then(function (response) {\r\n $scope.vm.GPClassesDataSource = response.data;\r\n }));\r\n\r\n promises.push(RequestManagementGPService.getAltModProfiles().then(function (response) {\r\n $scope.vm.GPAltModProfileDataSource = response.data;\r\n if ($scope.vm.User != null && $scope.vm.User.GPUser != null && $scope.vm.User.GPUser.Companies != null) {\r\n $scope.vm.User.GPUser.Companies.forEach(function (comp) {\r\n if (comp.AltModProfile != null && comp.AltModProfile !== \"\") {\r\n var altModProfileId = comp.AltModProfile.Id != null ? comp.AltModProfile.Id : comp.AltModProfile;\r\n var dbAltModProfile = $scope.vm.GPAltModProfileDataSource.find(function (profile) {\r\n return profile.Id === altModProfileId;\r\n });\r\n comp.AltModProfile = dbAltModProfile;\r\n }\r\n });\r\n }\r\n }));\r\n\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.vm.User == null) {\r\n $scope.vm.User = {};\r\n }\r\n if ($scope.vm.User.GPUser == null) {\r\n $scope.vm.User.GPUser = {};\r\n $scope.vm.User.GPUser.LoginType = 1;\r\n $scope.vm.User.GPUser.UserType = 1;\r\n $scope.vm.User.GPUser.UserStatus = 1;\r\n }\r\n\r\n //Modify Available and Selected company lists to reflect users current security\r\n if (gpCompanies != null && $scope.vm.ListOfSelectedGPCompanies != null) {\r\n gpCompanies.forEach(company => {\r\n if ($scope.vm.ListOfSelectedGPCompanies.none(selectedRole => selectedRole.Id == company.Company.Id)) {\r\n\r\n $scope.vm.ListOfSelectedGPCompanies.unshift({\r\n Id: company.Company.Id,\r\n Name: company.Company.Name,\r\n Pending: pendingCompanies.some(pendingCompany => pendingCompany.Company.Id === company.Company.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableGPCompanies.forEach(function (row, j) {\r\n if (row.Id == company.Company.Id) {\r\n $scope.vm.ListOfAvailableGPCompanies.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n $scope.vm.ListOfAllAvailableGPRoles = $scope.vm.ListOfAllAvailableGPRoles.filter(role => role.IsAssignable);\r\n\r\n $scope.gpUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n this.loadGPData = function ($scope) {\r\n //Populate the GP Roles with the AltModProfile from the UserCompanies\r\n if ($scope.vm.User != null && $scope.vm.User.GPUser != null && $scope.vm.User.GPUser.RoleCompanies != null) {\r\n $scope.vm.User.GPUser.RoleCompanies.forEach(function (role) {\r\n if (role.AltModProfile == null) {\r\n role.AltModProfile = $scope.vm.User.GPUser.Companies.find(company => company.Company.Id === role.Company.Id).AltModProfile;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.User.GPUser != null) {\r\n $scope.vm.User.GPUser.DisplayClass = { RowId: $scope.vm.User.GPUser.Class, Name: $scope.vm.User.GPUser.ClassName };\r\n }\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Company.Id === item.Id);\r\n } else {\r\n item.Pending = false;\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n this.getGPLoginTypes = function () {\r\n\r\n return [\r\n {\r\n Name: 'Single Sign-On',\r\n Id: 1\r\n },\r\n {\r\n Name: 'Single Sign-On (Password Required)',\r\n Id: 0\r\n },\r\n {\r\n Name: 'Standard',\r\n Id: 2\r\n }\r\n ];\r\n };\r\n\r\n this.getGPUserTypes = function () {\r\n\r\n return [\r\n {\r\n Name: 'Full',\r\n Id: 1\r\n },\r\n {\r\n Name: 'Limited',\r\n Id: 2\r\n },\r\n {\r\n Name: 'Self-Service',\r\n Id: 3\r\n }\r\n ];\r\n };\r\n\r\n this.getGPStatuses = function () {\r\n\r\n return [\r\n {\r\n Name: 'Active',\r\n Id: 1\r\n },\r\n {\r\n Name: 'Inactive',\r\n Id: 2\r\n },\r\n {\r\n Name: 'Lesson User',\r\n Id: 3\r\n }\r\n ];\r\n };\r\n\r\n\r\n this.getExistingGPUserSecurity = function (userId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/gp/userroles/' + userId + '/'\r\n });\r\n };\r\n\r\n this.getGPIMUserSecurity = function (userId, version, useConfigAd) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + `identitymanager/gp/users/user/${userId}/version/${version}/useConfigAd/${useConfigAd}`\r\n });\r\n };\r\n\r\n this.getAllRoles = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/gp/roles'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading GP Roles';\r\n }\r\n };\r\n\r\n this.getAllCompanies = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/gp/companies'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading GP Companies';\r\n }\r\n };\r\n\r\n this.getAllClasses = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/gp/classes'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading GP Classes';\r\n }\r\n };\r\n\r\n this.getAltModProfiles = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/gp/altmodprofiles'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading GP Alt Mod Profiles';\r\n }\r\n };\r\n\r\n this.getClassesBySubsidiary = function (subsidiaryId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/gp/subsidiaries/' + subsidiaryId + '/classes'\r\n });\r\n };\r\n\r\n}","import { ax7_application_id, ax_application_id, netsuite_application_id, oracle_application_id, oracleCloud_application_id, gp_application_id, nav_application_id, d365s_application_id, sap_application_id, universalProduct_application_id, aad_application_id, ps_application_id, salesforce_application_id } from \"../../Shared/GlobalVariables/applicationIdVariables\";\r\n\r\nexport default /*@ngInject*/ function ($http, $q, $rootScope, RequestManagementBuildRequestService, RequestManagementGPLoadDataService, RequestManagementEffectiveDateService, RequestManagementNetSuiteLoadDataService, RequestManagementUPLoadDataService, RequestManagementSAPLoadDataService, RequestManagementAXLoadDataService, RequestManagementAADLoadDataService, RequestManagementNAVLoadDataService, RequestManagementOracleLoadDataService, RequestManagementD365SLoadDataService, RequestManagementOracleCloudLoadDataService, RequestManagementPSLoadDataService, salesforceLoadData, helperService) {\r\n\r\n var self = this;\r\n\r\n //Populate user data from an Open Request for editing\r\n this.loadOpenRequestData = function ($scope) {\r\n\r\n if ($rootScope.requestToEdit) {\r\n\r\n var vm = $scope.vm;\r\n if ($scope.vm.User == null) {\r\n $scope.vm.User = {};\r\n }\r\n\r\n $scope.requestToEdit = $rootScope.requestToEdit;\r\n vm.requestToEdit = $rootScope.requestToEdit;\r\n\r\n delete $rootScope.requestToEdit;\r\n $scope.reportDetailsComplete = false;\r\n\r\n //Get Request data based on request Id and version from the database\r\n $http.get(apiUrl + 'api/identitymanager/requests/edit/' + $scope.requestToEdit.Id + '/version/' + $scope.requestToEdit.Version).then(({ data }) => {\r\n\r\n $scope.linkedTickets = data.Tickets;\r\n\r\n $scope.jiraTicketLinked = $scope.linkedTickets.some(ticket => ticket.TicketProvider === 'Jira');\r\n $scope.zendeskTicketLinked = $scope.linkedTickets.some(ticket => ticket.TicketProvider === 'Zendesk');\r\n $scope.serviceNowTicketLinked = $scope.linkedTickets.some(ticket => ticket.TicketProvider === 'ServiceNow');\r\n $scope.customTicketLinked = $scope.linkedTickets.some(ticket => ticket.TicketProvider === 'Custom');\r\n\r\n //data.AffectedObject = JSON.parse(data.AffectedObject);\r\n $scope.vm.User.UserMaster = data.GeneralUser;\r\n\r\n //Add applications array to store the applications the user has access to\r\n if ($scope.vm.User.Applications == null) {\r\n $scope.vm.User.Applications = [];\r\n }\r\n\r\n $scope.vm.availableApplications = $scope.vm.availableApplications.map(setVisibleAndSelectedApps.bind(null, data));\r\n\r\n if (data.AadUser != null) {\r\n $scope.vm.User.AadUser = data.AadUser;\r\n if ($scope.vm.wizardMode === 'New') {\r\n const splitPrincipalName = $scope.vm.User.AadUser.UserPrincipalName.split('@');\r\n $scope.vm.User.AadUser.UserPrincipalName = splitPrincipalName[0];\r\n $scope.vm.User.AadUser.Domain = splitPrincipalName[1];\r\n }\r\n if ($scope.vm.User.AadUser.StartDate != null) {\r\n $scope.vm.User.AadUser.StartDate = new Date($scope.vm.User.AadUser.StartDate);\r\n }\r\n if ($scope.vm.User.AadUser.EndDate != null) {\r\n $scope.vm.User.AadUser.EndDate = new Date($scope.vm.User.AadUser.EndDate);\r\n }\r\n if ($scope.vm.User.AadUser.PasswordProfile) {\r\n $scope.vm.User.AadUser.ConfirmPassword = $scope.vm.User.AadUser.PasswordProfile.Password;\r\n }\r\n if ($scope.vm.User.AadUser.BusinessPhones.length > 0) {\r\n $scope.vm.User.AadUser.BusinessPhones = $scope.vm.User.AadUser.BusinessPhones.toString();\r\n }\r\n }\r\n if (data.Ax7User != null) {\r\n $scope.vm.User.AX7User = data.Ax7User;\r\n if ($scope.vm.User.AX7User.StartDate != null) {\r\n $scope.vm.User.AX7User.StartDate = new Date($scope.vm.User.AX7User.StartDate);\r\n }\r\n if ($scope.vm.User.AX7User.EndDate != null) {\r\n $scope.vm.User.AX7User.EndDate = new Date($scope.vm.User.AX7User.EndDate);\r\n }\r\n $scope.vm.User.AX7User.ConfirmPassword = $scope.vm.User.AX7User.Password;\r\n }\r\n if (data.AxUser != null) {\r\n $scope.vm.User.AX2012User = data.AxUser;\r\n $scope.vm.User.AX2012User.Partition = { Id: data.AxUser.Partition, Key: data.AxUser.PartitionKey };\r\n\r\n if ($scope.vm.User.AX2012User.StartDate != null) {\r\n $scope.vm.User.AX2012User.StartDate = new Date($scope.vm.User.AX2012User.StartDate);\r\n }\r\n if ($scope.vm.User.AX2012User.EndDate != null) {\r\n $scope.vm.User.AX2012User.EndDate = new Date($scope.vm.User.AX2012User.EndDate);\r\n }\r\n $scope.vm.User.AX2012User.ConfirmPassword = $scope.vm.User.AX2012User.Password;\r\n }\r\n if (data.NetSuiteUser != null) {\r\n $scope.vm.User.NetSuiteUser = data.NetSuiteUser;\r\n if ($scope.vm.User.NetSuiteUser.StartDate != null) {\r\n $scope.vm.User.NetSuiteUser.StartDate = new Date($scope.vm.User.NetSuiteUser.StartDate);\r\n }\r\n if ($scope.vm.User.NetSuiteUser.EndDate != null) {\r\n $scope.vm.User.NetSuiteUser.EndDate = new Date($scope.vm.User.NetSuiteUser.EndDate);\r\n }\r\n $scope.vm.User.NetSuiteUser.ConfirmPassword = $scope.vm.User.NetSuiteUser.Password;\r\n }\r\n if (data.UvUser != null) {\r\n // 'UvUser' gets set to property 'UPUser'\r\n if (!$scope.vm.User.UPUser) { $scope.vm.User.UPUser = []; }\r\n data.UvUser.forEach(user => {\r\n var productName = helperService.getProductName(user.ProductId, $scope.vm.availableApplications);\r\n $scope.vm.User.UPUser[productName] = user;\r\n if ($scope.vm.User.UPUser[productName].StartDate) {\r\n $scope.vm.User.UPUser[productName].StartDate = new Date($scope.vm.User.UPUser[productName].StartDate);\r\n }\r\n if ($scope.vm.User.UPUser[productName].EndDate) {\r\n $scope.vm.User.UPUser[productName].EndDate = new Date($scope.vm.User.UPUser[productName].EndDate);\r\n }\r\n $scope.vm.User.UPUser[productName].ProductName = productName;\r\n });\r\n }\r\n if (data.SapUser != null) {\r\n if (!$scope.vm.User.SAPUser) { $scope.vm.User.SAPUser = []; }\r\n data.SapUser.forEach(user => {\r\n var productName = helperService.getProductName(user.ProductId, $scope.vm.availableApplications);\r\n $scope.vm.User.SAPUser[productName] = user;\r\n if ($scope.vm.User.SAPUser[productName].StartDate) {\r\n $scope.vm.User.SAPUser[productName].StartDate = new Date($scope.vm.User.SAPUser[productName].StartDate);\r\n }\r\n if ($scope.vm.User.SAPUser[productName].EndDate) {\r\n $scope.vm.User.SAPUser[productName].EndDate = new Date($scope.vm.User.SAPUser[productName].EndDate);\r\n }\r\n $scope.vm.User.SAPUser[productName].ConfirmPassword = user.Password;\r\n $scope.vm.User.SAPUser[productName].ProductName = productName;\r\n });\r\n }\r\n if (data.EbsUser != null) {\r\n $scope.vm.User.OracleUser = data.EbsUser;\r\n if ($scope.vm.User.OracleUser.StartDate != null) {\r\n $scope.vm.User.OracleUser.StartDate = new Date($scope.vm.User.OracleUser.StartDate);\r\n }\r\n if ($scope.vm.User.OracleUser.EndDate != null) {\r\n $scope.vm.User.OracleUser.EndDate = new Date($scope.vm.User.OracleUser.EndDate);\r\n }\r\n $scope.vm.User.OracleUser.ConfirmPassword = $scope.vm.User.OracleUser.Password;\r\n $scope.vm.User.OracleUser.Expiration = data.EbsUser.PasswordDays === null && data.EbsUser.PasswordAccesses === null ? 'None' : data.EbsUser.PasswordDays !== null ? 'Days' : 'Accesses';\r\n $scope.vm.User.OracleUser.ExpirationValue = data.EbsUser.PasswordDays !== null ? data.EbsUser.PasswordDays : data.EbsUser.PasswordAccesses;\r\n }\r\n\r\n // Oracle Cloud\r\n if (data.OrfcUser != null) {\r\n $scope.vm.User.OracleCloudUser = data.OrfcUser;\r\n if ($scope.vm.User.OracleCloudUser.StartDate != null) {\r\n $scope.vm.User.OracleCloudUser.StartDate = new Date($scope.vm.User.OracleCloudUser.StartDate);\r\n }\r\n if ($scope.vm.User.OracleCloudUser.EndDate != null) {\r\n $scope.vm.User.OracleCloudUser.EndDate = new Date($scope.vm.User.OracleCloudUser.EndDate);\r\n }\r\n $scope.vm.User.OracleCloudUser.PasswordConfirm = $scope.vm.User.OracleCloudUser.Password;\r\n }\r\n if (data.GPUser != null) {\r\n $scope.vm.User.GPUser = data.GPUser;\r\n $scope.vm.User.GPUser.DisplayClass = { RowId: data.GPUser.Class, Name: data.GPUser.ClassName };\r\n\r\n if ($scope.vm.User.GPUser.StartDate != null) {\r\n $scope.vm.User.GPUser.StartDate = new Date($scope.vm.User.GPUser.StartDate);\r\n }\r\n if ($scope.vm.User.GPUser.EndDate != null) {\r\n $scope.vm.User.GPUser.EndDate = new Date($scope.vm.User.GPUser.EndDate);\r\n }\r\n $scope.vm.User.GPUser.ConfirmPassword = $scope.vm.User.GPUser.Password;\r\n }\r\n if (data.NavUser != null) {\r\n $scope.vm.User.NAVUser = data.NavUser;\r\n if ($scope.vm.User.NAVUser.StartDate != null) {\r\n $scope.vm.User.NAVUser.StartDate = new Date($scope.vm.User.NAVUser.StartDate);\r\n }\r\n if ($scope.vm.User.NAVUser.EndDate != null) {\r\n $scope.vm.User.NAVUser.EndDate = new Date($scope.vm.User.NAVUser.EndDate);\r\n }\r\n }\r\n if (data.D365SUser != null) {\r\n $scope.vm.User.D365SUser = data.D365SUser;\r\n if ($scope.vm.User.D365SUser.StartDate != null) {\r\n $scope.vm.User.D365SUser.StartDate = new Date($scope.vm.User.D365SUser.StartDate);\r\n }\r\n if ($scope.vm.User.D365SUser.EndDate != null) {\r\n $scope.vm.User.D365SUser.EndDate = new Date($scope.vm.User.D365SUser.EndDate);\r\n }\r\n }\r\n if (data.PsUserRequest != null) {\r\n $scope.vm.User.PSUser = data.PsUserRequest;\r\n if ($scope.vm.User.PSUser.StartDate != null) {\r\n $scope.vm.User.PSUser.StartDate = new Date($scope.vm.User.PSUser.StartDate);\r\n }\r\n if ($scope.vm.User.PSUser.EndDate != null) {\r\n $scope.vm.User.PSUser.EndDate = new Date($scope.vm.User.PSUser.EndDate);\r\n }\r\n $scope.vm.User.PSUser.ConfirmPassword = $scope.vm.User.PSUser.Password;\r\n }\r\n\r\n if (data.SfUserRequest != null) {\r\n $scope.vm.User.SalesforceUser = data.SfUserRequest;\r\n if ($scope.vm.User.SalesforceUser.StartDate != null) {\r\n $scope.vm.User.SalesforceUser.StartDate = new Date($scope.vm.User.SalesforceUser.StartDate);\r\n }\r\n if ($scope.vm.User.SalesforceUser.EndDate != null) {\r\n $scope.vm.User.SalesforceUser.EndDate = new Date($scope.vm.User.SalesforceUser.EndDate);\r\n }\r\n }\r\n\r\n //Load application data, this includes security data and any data that is used in dropdown lists\r\n self.loadApplicationData($scope, data).then(function () {\r\n //Set the effective dates from the build request on the initial load of an open request\r\n self.loadOpenRequestEffectiveDates($scope, data).then(function () {\r\n //Check if an application is selected and load ERP steps\r\n $scope.atLeastOneAppSelected();\r\n\r\n\r\n $scope.vm.availableApplications.forEach(application => $scope.loadERPSpecificSteps(application));\r\n $scope.loadingIcon = false;\r\n $scope.stopRequestManagementSpinner = true;\r\n $scope.reportDetailsComplete = true;\r\n $scope.$evalAsync();\r\n });\r\n\r\n\r\n }, function errorCallback(response) {\r\n lockdownOnError($scope, response);\r\n });\r\n }, function (response) {\r\n lockdownOnError($scope, response);\r\n });\r\n }\r\n };\r\n\r\n //Add Start/End dates and Actions to any permissions set in an Open Request\r\n this.loadOpenRequestEffectiveDates = function ($scope, request) {\r\n //Set effective dates on any existing or granted roles in the selected list\r\n //Set effective dates on any revoked roles that will be in the available list\r\n var loadRequestDfrd = $.Deferred();\r\n var returnedRequest = RequestManagementBuildRequestService.buildRequest($scope.vm, false);\r\n $http.post(apiUrl + 'api/identitymanager/requests/build', returnedRequest).then(function (buildResponse) {\r\n var builtRequest = buildResponse.data;\r\n //Find all effective dates and convert them to local time\r\n RequestManagementEffectiveDateService.convertDatesToLocal(builtRequest);\r\n\r\n if (builtRequest.NetSuiteRequest != null) {\r\n\r\n if ($scope.vm.ListOfSelectedNetSuiteRoles != null) {\r\n $scope.vm.ListOfSelectedNetSuiteRoles.forEach(function (role) {\r\n prepareNSAccessItem(role);\r\n\r\n var foundRole = builtRequest.NetSuiteRequest.Roles.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableNetSuiteRoles != null) {\r\n $scope.vm.ListOfAvailableNetSuiteRoles.forEach(function (role) {\r\n prepareNSAccessItem(role);\r\n\r\n var foundRole = builtRequest.NetSuiteRequest.Roles.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedNetSuitePermissions != null) {\r\n $scope.vm.ListOfSelectedNetSuitePermissions.forEach(function (perm) {\r\n prepareNSAccessItem(perm);\r\n\r\n var foundPermission = builtRequest.NetSuiteRequest.GlobalPermissions.find(function (selPerm) {\r\n return selPerm.Id == perm.Id;\r\n });\r\n if (foundPermission != null) {\r\n perm.Action = foundPermission.Action;\r\n perm.StartDate = foundPermission.StartDate;\r\n perm.EndDate = foundPermission.EndDate;\r\n perm.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableNetSuitePermissions != null) {\r\n $scope.vm.ListOfAvailableNetSuitePermissions.forEach(function (perm) {\r\n prepareNSAccessItem(perm);\r\n\r\n var foundPermission = builtRequest.NetSuiteRequest.GlobalPermissions.find(function (selPerm) {\r\n return selPerm.Id == perm.Id;\r\n });\r\n if (foundPermission != null) {\r\n perm.Action = foundPermission.Action;\r\n perm.StartDate = perm.StartDate;\r\n perm.EndDate = perm.EndDate;\r\n perm.AccessType = perm.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n if (builtRequest.AadRequest != null) {\r\n if ($scope.vm.ListOfSelectedAADRoles != null) {\r\n $scope.vm.ListOfSelectedAADRoles.forEach(role => {\r\n var foundRole = builtRequest.AadRequest.Roles.find(adRole => {\r\n return adRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableAADRoles != null) {\r\n $scope.vm.ListOfAvailableAADRoles.forEach(role => {\r\n\r\n var foundRole = builtRequest.AadRequest.Roles.find(adRole => {\r\n return adRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedAADGroups != null) {\r\n $scope.vm.ListOfSelectedAADGroups.forEach(group => {\r\n var foundGroup = builtRequest.AadRequest.Groups.find(adGroup => {\r\n return adGroup.Id == group.Id;\r\n });\r\n if (foundGroup != null) {\r\n group.Action = foundGroup.Action;\r\n group.StartDate = foundGroup.StartDate;\r\n group.EndDate = foundGroup.EndDate;\r\n group.AccessType = foundGroup.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(group);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableAADGroups != null) {\r\n $scope.vm.ListOfAvailableAADGroups.forEach(group => {\r\n\r\n var foundGroup = builtRequest.AadRequest.Groups.find(adGroup => {\r\n return adGroup.Id == group.Id;\r\n });\r\n if (foundGroup != null) {\r\n group.Action = foundGroup.Action;\r\n group.StartDate = foundGroup.StartDate;\r\n group.EndDate = foundGroup.EndDate;\r\n group.AccessType = foundGroup.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(group);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedAADLicenses != null) {\r\n $scope.vm.ListOfSelectedAADLicenses.forEach(license => {\r\n var foundLicense = builtRequest.AadRequest.Licenses.find(adLicense => {\r\n return adLicense.Id == license.Id;\r\n });\r\n if (foundLicense != null) {\r\n license.Action = foundLicense.Action;\r\n license.StartDate = foundLicense.StartDate;\r\n license.EndDate = foundLicense.EndDate;\r\n license.AccessType = foundLicense.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(license);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableAADLicenses != null) {\r\n $scope.vm.ListOfAvailableAADLicenses.forEach(license => {\r\n\r\n var foundLicense = builtRequest.AadRequest.Licenses.find(adLicense => {\r\n return adLicense.Id == license.Id;\r\n });\r\n if (foundLicense != null) {\r\n license.Action = foundLicense.Action;\r\n license.StartDate = foundLicense.StartDate;\r\n license.EndDate = foundLicense.EndDate;\r\n license.AccessType = foundLicense.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(license);\r\n });\r\n }\r\n }\r\n if (builtRequest.Ax7Request != null) {\r\n if ($scope.vm.ListOfSelectedAX7Roles != null) {\r\n $scope.vm.ListOfSelectedAX7Roles.forEach(function (role) {\r\n\r\n if (role.Companies != null && role.Companies) {\r\n role.Companies.forEach(function (company) {\r\n var foundRole = builtRequest.Ax7Request.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id == role.Id && axRole.Company.CompanyId == company.CompanyId;\r\n });\r\n\r\n if (foundRole != null) {\r\n company.Action = foundRole.Action;\r\n company.StartDate = foundRole.StartDate;\r\n company.EndDate = foundRole.EndDate;\r\n company.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n } else {\r\n var foundRole = builtRequest.Ax7Request.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n }\r\n\r\n prepareAX7AccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableAX7Roles != null) {\r\n $scope.vm.ListOfAvailableAX7Roles.forEach(function (role) {\r\n\r\n var foundRole = builtRequest.Ax7Request.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAX7AccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedAX7UserGroups != null) {\r\n $scope.vm.ListOfSelectedAX7UserGroups.forEach(function (userGroup) {\r\n var foundUserGroup = builtRequest.Ax7Request.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id == userGroup.Id;\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.StartDate = foundUserGroup.StartDate;\r\n userGroup.EndDate = foundUserGroup.EndDate;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX7AccessItem(userGroup);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableAX7UserGroups != null) {\r\n $scope.vm.ListOfAvailableAX7UserGroups.forEach(function (userGroup) {\r\n\r\n var foundUserGroup = builtRequest.Ax7Request.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id == userGroup.Id;\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.StartDate = foundUserGroup.StartDate;\r\n userGroup.EndDate = foundUserGroup.EndDate;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX7AccessItem(userGroup);\r\n });\r\n }\r\n }\r\n if (builtRequest.AxRequest != null) {\r\n if ($scope.vm.ListOfSelectedAX2012Roles != null) {\r\n $scope.vm.ListOfSelectedAX2012Roles.forEach(function (role) {\r\n\r\n if (role.Companies != null && role.Companies) {\r\n role.Companies.forEach(function (company) {\r\n var foundRole = builtRequest.AxRequest.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id == role.Id && axRole?.Company?.CompanyId == company.CompanyId;\r\n });\r\n\r\n if (foundRole != null) {\r\n company.Action = foundRole.Action;\r\n company.StartDate = foundRole.StartDate;\r\n company.EndDate = foundRole.EndDate;\r\n company.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n } else {\r\n var foundRole = builtRequest.AxRequest.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n }\r\n\r\n prepareAX2012AccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableAX2012Roles != null) {\r\n $scope.vm.ListOfAvailableAX2012Roles.forEach(function (role) {\r\n\r\n var foundRole = builtRequest.AxRequest.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAX2012AccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedAX2012UserGroups != null) {\r\n $scope.vm.ListOfSelectedAX2012UserGroups.forEach(function (userGroup) {\r\n var foundUserGroup = builtRequest.AxRequest.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id == userGroup.Id;\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.StartDate = foundUserGroup.StartDate;\r\n userGroup.EndDate = foundUserGroup.EndDate;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX2012AccessItem(userGroup);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableAX2012UserGroups != null) {\r\n $scope.vm.ListOfAvailableAX2012UserGroups.forEach(function (userGroup) {\r\n\r\n var foundUserGroup = builtRequest.AxRequest.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id == userGroup.Id;\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.StartDate = foundUserGroup.StartDate;\r\n userGroup.EndDate = foundUserGroup.EndDate;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX2012AccessItem(userGroup);\r\n });\r\n }\r\n }\r\n if (builtRequest.SAPRequest != null) {\r\n // for Single Roles\r\n if ($scope.vm.ListOfSelectedSAPSingleRoles != null) {\r\n $scope.vm.ListOfSelectedSAPSingleRoles.forEach(function (role) {\r\n prepareSAPAccessItem(role);\r\n\r\n var foundRole = builtRequest.SAPRequest.Roles.find(function (sapRole) {\r\n return sapRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableSAPSingleRoles != null) {\r\n $scope.vm.ListOfAvailableSAPSingleRoles.forEach(function (role) {\r\n prepareSAPAccessItem(role);\r\n\r\n var foundRole = builtRequest.SAPRequest.Roles.find(function (sapRole) {\r\n return sapRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n // for Composite Roles\r\n if ($scope.vm.ListOfSelectedSAPCompositeRoles != null) {\r\n $scope.vm.ListOfSelectedSAPCompositeRoles.forEach(function (compositeRole) {\r\n prepareSAPAccessItem(compositeRole);\r\n\r\n var foundCompositeRole = builtRequest.SAPRequest.Roles.find(function (sapCompositeRole) {\r\n return sapCompositeRole.Id == compositeRole.Id;\r\n });\r\n if (foundCompositeRole != null) {\r\n compositeRole.Action = foundCompositeRole.Action;\r\n compositeRole.StartDate = foundCompositeRole.StartDate;\r\n compositeRole.EndDate = foundCompositeRole.EndDate;\r\n compositeRole.AccessType = foundCompositeRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableSAPCompositeRoles != null) {\r\n $scope.vm.ListOfAvailableSAPCompositeRoles.forEach(function (compositeRole) {\r\n prepareSAPAccessItem(compositeRole);\r\n\r\n var foundCompositeRole = builtRequest.SAPRequest.Roles.find(function (sapCompositeRole) {\r\n return sapCompositeRole.Id == compositeRole.Id;\r\n });\r\n if (foundCompositeRole != null) {\r\n compositeRole.Action = foundCompositeRole.Action;\r\n compositeRole.StartDate = foundCompositeRole.StartDate;\r\n compositeRole.EndDate = foundCompositeRole.EndDate;\r\n compositeRole.AccessType = foundCompositeRole.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n if (builtRequest.EbsRequest != null) {\r\n if ($scope.vm.ListOfSelectedOracleResponsibilities != null) {\r\n $scope.vm.ListOfSelectedOracleResponsibilities.forEach(function (responsibility) {\r\n prepareORAccessItem(responsibility);\r\n\r\n var foundResponsibility = builtRequest.EbsRequest.Responsibilities.find(function (oracle) {\r\n return oracle.Id == responsibility.Id;\r\n });\r\n\r\n if (foundResponsibility != null) {\r\n responsibility.Action = foundResponsibility.Action;\r\n responsibility.StartDate = foundResponsibility.StartDate;\r\n responsibility.EndDate = foundResponsibility.EndDate;\r\n responsibility.AccessType = foundResponsibility.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableOracleResponsibilities != null) {\r\n $scope.vm.ListOfAvailableOracleResponsibilities.forEach(function (responsibility) {\r\n prepareORAccessItem(responsibility);\r\n\r\n var foundResponsibility = builtRequest.EbsRequest.Responsibilities.find(function (oracle) {\r\n return oracle.Id == responsibility.Id;\r\n });\r\n\r\n if (foundResponsibility != null) {\r\n responsibility.Action = foundResponsibility.Action;\r\n responsibility.StartDate = foundResponsibility.StartDate;\r\n responsibility.EndDate = foundResponsibility.EndDate;\r\n responsibility.AccessType = foundResponsibility.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedOracleRoles != null) {\r\n $scope.vm.ListOfSelectedOracleRoles.forEach(function (role) {\r\n prepareORAccessItem(role);\r\n\r\n var foundRole = builtRequest.EbsRequest.Roles.find(function (oracle) {\r\n return oracle.Id == role.Id;\r\n });\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableOracleRoles != null) {\r\n $scope.vm.ListOfAvailableOracleRoles.forEach(function (role) {\r\n prepareORAccessItem(role);\r\n\r\n var foundRole = builtRequest.EbsRequest.Roles.find(function (oracle) {\r\n return oracle.Id == role.Id;\r\n });\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n // Oracle Cloud\r\n if (builtRequest.OrfcRequest != null) {\r\n if ($scope.vm.ListOfSelectedOracleCloudRoles != null) {\r\n $scope.vm.ListOfSelectedOracleCloudRoles.forEach(function (role) {\r\n prepareORFCAccessItem(role);\r\n\r\n var foundRole = builtRequest.OrfcRequest.Roles.find(function (OrfcRole) {\r\n return OrfcRole.RoleID == role.RoleID;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableOracleCloudRoles != null) {\r\n $scope.vm.ListOfAvailableOracleCloudRoles.forEach(function (role) {\r\n prepareORFCAccessItem(role);\r\n\r\n var foundRole = builtRequest.OrfcRequest.Roles.find(function (OrfcRole) {\r\n return OrfcRole.RoleID == role.RoleID;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n if (builtRequest.NavRequest != null) {\r\n if ($scope.vm.ListOfSelectedNAVPermissionSets != null) {\r\n\r\n $scope.vm.ListOfSelectedNAVPermissionSets.forEach(permissionSet => {\r\n if (permissionSet.Companies != null && permissionSet.Companies.length > 0) {\r\n permissionSet.Companies.forEach(company => {\r\n var foundPermission = builtRequest.NavRequest.PermissionSets.find(permission => permission.Id == permissionSet.Id && permission.Company == company);\r\n\r\n if (foundPermission != null) {\r\n company.Action = foundPermission.Action;\r\n company.StartDate = foundPermission.StartDate;\r\n company.EndDate = foundPermission.EndDate;\r\n company.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n } else {\r\n var foundPermission = builtRequest.NavRequest.PermissionSets.find(permission => permission.Id == permissionSet.Id);\r\n\r\n if (foundPermission != null) {\r\n permissionSet.Action = foundPermission.Action;\r\n permissionSet.StartDate = foundPermission.StartDate;\r\n permissionSet.EndDate = foundPermission.EndDate;\r\n permissionSet.AccessType = foundPermission.AccessType;\r\n }\r\n }\r\n\r\n prepareNAVAccessItem(permissionSet);\r\n });\r\n }\r\n }\r\n if (builtRequest.D365Request != null) {\r\n\r\n if ($scope.vm.ListOfSelectedD365SRoles != null) {\r\n $scope.vm.ListOfSelectedD365SRoles.forEach(function (role) {\r\n\r\n var foundRole = builtRequest.D365Request.Roles.find(function (d365sRole) {\r\n return d365sRole.Role.Id === role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableD365SRoles != null) {\r\n $scope.vm.ListOfAvailableD365SRoles.forEach(function (role) {\r\n\r\n var foundRole = builtRequest.D365Request.Roles.find(function (d365sRole) {\r\n return d365sRole.Role.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(role);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfSelectedD365STeams != null) {\r\n $scope.vm.ListOfSelectedD365STeams.forEach(function (team) {\r\n\r\n var foundTeam = builtRequest.D365Request.UserTeams.find(function (d365sTeam) {\r\n return d365sTeam.Team.Id === team.Id;\r\n });\r\n if (foundTeam != null) {\r\n team.Action = foundTeam.Action;\r\n team.StartDate = foundTeam.StartDate;\r\n team.EndDate = foundTeam.EndDate;\r\n team.AccessType = foundTeam.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(team);\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableD365STeams != null) {\r\n $scope.vm.ListOfAvailableD365STeams.forEach(function (team) {\r\n\r\n var foundTeam = builtRequest.D365Request.UserTeams.find(function (d365sTeam) {\r\n return d365sTeam.Team.Id == team.Id;\r\n });\r\n if (foundTeam != null) {\r\n team.Action = foundTeam.Action;\r\n team.StartDate = foundTeam.StartDate;\r\n team.EndDate = foundTeam.EndDate;\r\n team.AccessType = foundTeam.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(team);\r\n });\r\n }\r\n }\r\n\r\n // PeopleSoft\r\n if (builtRequest.PsRequest != null) {\r\n if ($scope.vm.ListOfSelectedPSRoles != null) {\r\n $scope.vm.ListOfSelectedPSRoles.forEach(function (role) {\r\n preparePSAccessItem(role);\r\n\r\n var foundRole = builtRequest.PsRequest.Roles.find(function (PsRole) {\r\n return PsRole.Name == role.Name;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailablePSRoles != null) {\r\n $scope.vm.ListOfAvailablePSRoles.forEach(function (role) {\r\n preparePSAccessItem(role);\r\n\r\n var foundRole = builtRequest.PsRequest.Roles.find(function (PsRole) {\r\n return PsRole.Name == role.Name;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.StartDate = foundRole.StartDate;\r\n role.EndDate = foundRole.EndDate;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Salesforce\r\n if (builtRequest.SalesForceRequest != null) {\r\n if ($scope.vm.ListOfSelectedSalesforcePermissionSets != null) {\r\n $scope.vm.ListOfSelectedSalesforcePermissionSets.forEach(permission => {\r\n prepareSalesforceAccessItem(permission);\r\n\r\n var foundPermission = builtRequest.SalesForceRequest.Permissions.find(requestPermission => requestPermission.Name == permission.Name);\r\n\r\n if (foundPermission != null) {\r\n permission.Action = foundPermission.Action;\r\n permission.StartDate = foundPermission.StartDate;\r\n permission.EndDate = foundPermission.EndDate;\r\n permission.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableSalesforcePermissionSets != null) {\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets.forEach(permission => {\r\n prepareSalesForceAccessItem(permission);\r\n\r\n var foundPermission = builtRequest.SalesForceRequest.Permissions.find(requestPermission => requestPermission.Name === permission.Name);\r\n if (foundPermission != null) {\r\n permission.Action = foundPermission.Action;\r\n permission.StartDate = foundPermission.StartDate;\r\n permission.EndDate = foundPermission.EndDate;\r\n permission.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if ($scope.vm.User.SalesforceUser.Profile) {\r\n let profile = $scope.vm.User.SalesforceUser.Profile,\r\n foundProfile = builtRequest.SalesForceRequest.Profiles.find(requestProfile => requestProfile.Id === profile.Id);\r\n\r\n prepareSalesforceAccessItem(profile);\r\n\r\n if (foundProfile) {\r\n profile.Action = foundProfile.Action;\r\n profile.StartDate = foundProfile.StartDate;\r\n profile.EndDate = foundProfile.EndDate;\r\n profile.AccessType = foundProfile.AccessType;\r\n }\r\n }\r\n\r\n if ($scope.vm.salesforceProfiles) {\r\n $scope.vm.salesforceProfiles.forEach(profile => {\r\n prepareSalesForceAccessItem(profile);\r\n\r\n var foundProfile = builtRequest.SalesForceRequest.Profiles.find(requestProfile => requestProfile.Id === profile.Id);\r\n if (foundProfile != null) {\r\n profile.Action = foundProfile.Action;\r\n profile.StartDate = foundProfile.StartDate;\r\n profile.EndDate = foundProfile.EndDate;\r\n profile.AccessType = foundProfile.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n\r\n loadRequestDfrd.resolve();\r\n });\r\n\r\n\r\n return $.when(loadRequestDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.loadUserMasterERPData = function ($scope, userMaster, applications) {\r\n var User = {};\r\n var vm = $scope.vm;\r\n $scope.vm.helperService = helperService;\r\n $scope.vm.typeOf = typeOf;\r\n\r\n $scope.vm.userProperties = [];\r\n $scope.vm.userPropertyInfo = [];\r\n $scope.vm.terminationDisplay = [];\r\n\r\n if (vm == null) {\r\n vm = {};\r\n if ($scope.vm == null) {\r\n $scope.vm = vm;\r\n }\r\n }\r\n if ($scope.vm.User == null) {\r\n $scope.vm.User = User;\r\n }\r\n\r\n var userMasterDfrd = $.Deferred();\r\n\r\n $scope.vm.User.UserMaster = userMaster;\r\n var userMasterId = '';\r\n if (userMaster.Id) {\r\n userMasterId = userMaster.Id;\r\n } else if (userMaster.ID) {\r\n userMasterId = userMaster.ID;\r\n }\r\n $scope.netSuiteUserLoaded = false;\r\n $scope.upUserLoaded = false;\r\n $scope.sapUserLoaded = false;\r\n $scope.aadUserLoaded = false;\r\n $scope.axUserLoaded = false;\r\n $scope.gpUserLoaded = false;\r\n $scope.navUserLoaded = false;\r\n $scope.d365sUserLoaded = false;\r\n $scope.psUserLoaded = false;\r\n $scope.salesforceUserLoaded = false;\r\n\r\n //Reset all applications selected to false\r\n applications.forEach(function (app) {\r\n app.selected = false;\r\n app.Visible = false;\r\n });\r\n\r\n let isEmergencyAccess = vm.alternatePath === \"EmergencyAccess\" ? true : false;\r\n\r\n //Load data for existing users\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/requests/initiate/' + userMasterId\r\n\r\n }).then(({ data }) => {\r\n //Loop through Products and load ERP user data\r\n\r\n //Add list of errors, if any\r\n if (data.Errors != null) {\r\n $scope.vm.Errors = data.Errors;\r\n }\r\n\r\n $scope.vm.availableApplications = $scope.vm.availableApplications.map(setVisibleAndSelectedApps.bind(null, data));\r\n let dataCopy = { ...data };\r\n\r\n $scope.vm.availableUsers = Object.values(terminationSummaryFilter(dataCopy));\r\n createUserDetailsInstances($scope.vm.availableUsers);\r\n\r\n for (let i = 0; i < $scope.vm.availableUsers.length; i++) {\r\n $scope.vm.userProperties.push(Object.keys($scope.vm.availableUsers[i]));\r\n $scope.vm.userPropertyInfo.push(Object.values($scope.vm.availableUsers[i]));\r\n }\r\n\r\n $scope.vm.terminationDisplay = $scope.vm.availableUsers.reduce((acc, user, j) => {\r\n let tempArray = [];\r\n Object.keys(user).forEach((key, k) => {\r\n let tempObject = {\r\n UserProperty: $scope.vm.userProperties[j][k],\r\n UserPropertyInfo: $scope.vm.userPropertyInfo[j][k]\r\n }\r\n tempArray.push(tempObject);\r\n });\r\n tempArray.push(user.ProductId);\r\n acc.push(tempArray);\r\n return acc;\r\n }, []);\r\n\r\n if (data.AadUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.AadUser = data.AadUser;\r\n if ($scope.vm.User.AadUser.PasswordProfile) {\r\n $scope.vm.User.AadUser.ConfirmPassword = $scope.vm.User.AadUser.PasswordProfile.Password;\r\n }\r\n if ($scope.vm.User.AadUser.BusinessPhones.length > 0) {\r\n $scope.vm.User.AadUser.BusinessPhones = $scope.vm.User.AadUser.BusinessPhones.toString();\r\n }\r\n }\r\n if (data.AxUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.AX2012User = data.AxUser;\r\n $scope.vm.User.AX2012User.CurrentAX2012User = { ...data.AxUser };\r\n $scope.vm.User.AX2012User.ConfirmPassword = $scope.vm.User.AX2012User.Password;\r\n $scope.vm.User.AX2012User.Partition = { Id: data.AxUser.Partition, Key: data.AxUser.PartitionKey };\r\n }\r\n if (data.Ax7User != null && !isEmergencyAccess) {\r\n $scope.vm.User.AX7User = data.Ax7User;\r\n $scope.vm.User.AX7User.CurrentAx7User = { ...data.Ax7User };\r\n $scope.vm.User.AX7User.ConfirmPassword = $scope.vm.User.AX7User.Password;\r\n }\r\n if (data.NetSuiteUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.NetSuiteUser = data.NetSuiteUser;\r\n $scope.vm.User.NetSuiteUser.ConfirmPassword = $scope.vm.User.NetSuiteUser.Password;\r\n }\r\n if (data.EbsUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.OracleUser = data.EbsUser;\r\n $scope.vm.User.OracleUser.ConfirmPassword = $scope.vm.User.OracleUser.Password;\r\n\r\n $scope.vm.User.OracleUser.Expiration = data.EbsUser.PasswordAccesses === null && data.EbsUser.PasswordDays === null ? 'None' : data.EbsUser.PasswordAccesses !== null ? 'Accesses' : 'Days';\r\n $scope.vm.User.OracleUser.ExpirationValue = data.EbsUser.Expiration === 'Days' ? data.EbsUser.PasswordDays : data.EbsUser.PasswordAccesses;\r\n }\r\n\r\n if (data.SapUser != null && data.SapUser.length > 0) {\r\n data.SapUser.forEach((user, i) => {\r\n var productName = helperService.getProductName(user.ProductId, applications);\r\n if (!$scope.vm.User.SAPUser) {\r\n $scope.vm.User.SAPUser = [];\r\n }\r\n $scope.vm.User.SAPUser[productName] = user;\r\n $scope.vm.User.SAPUser[productName].ConfirmPassword = $scope.vm.User.SAPUser[productName].Password;\r\n $scope.vm.User.SAPUser[productName].ProductName = productName;\r\n });\r\n\r\n let userApplications = [];\r\n // get a list of applications the user has access to\r\n for (const userProduct in data) {\r\n if (Array.isArray(data[userProduct])) {\r\n data[userProduct].forEach(item => userApplications.push(item.ProductId));\r\n } else if (data[userProduct] && data[userProduct].ProductId) {\r\n userApplications.push(data[userProduct].ProductId);\r\n }\r\n }\r\n\r\n // filter out applications that the user does not have access to\r\n $scope.vm.availableApplications.forEach((application, index, applications) => {\r\n if (!userApplications.some(app => app === application.ProductID)) {\r\n applications.splice(index, 1);\r\n }\r\n });\r\n }\r\n if (data.UvUser != null && data.UvUser.length > 0 && !isEmergencyAccess) {\r\n data.UvUser.forEach((user, i) => {\r\n var productName = helperService.getProductName(user.ProductId, applications);\r\n if (!$scope.vm.User.UPUser) {\r\n $scope.vm.User.UPUser = [];\r\n }\r\n $scope.vm.User.UPUser[productName] = user;\r\n $scope.vm.User.UPUser[productName].ProductName = productName;\r\n });\r\n\r\n let userApplications = [];\r\n // get a list of applications the user has access to\r\n for (const userProduct in data) {\r\n if (Array.isArray(data[userProduct])) {\r\n data[userProduct].forEach(item => userApplications.push(item.ProductId));\r\n } else if (data[userProduct] && data[userProduct].ProductId) {\r\n userApplications.push(data[userProduct].ProductId);\r\n }\r\n }\r\n\r\n // filter out applications that the user does not have access to\r\n $scope.vm.availableApplications.forEach((application, index, applications) => {\r\n if (!userApplications.some(app => app === application.ProductID)) {\r\n applications.splice(index, 1);\r\n }\r\n });\r\n }\r\n\r\n // Oracle Cloud User\r\n if (data.OrfcUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.OracleCloudUser = data.OrfcUser;\r\n $scope.vm.User.OracleCloudUser.PasswordConfirm = $scope.vm.User.OracleCloudUser.Password;\r\n }\r\n\r\n if (data.GPUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.GPUser = data.GPUser;\r\n $scope.vm.User.GPUser.SamAccountName = data.GPUser.WindowsUserId;\r\n }\r\n\r\n if (data.NavUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.NAVUser = data.NavUser;\r\n }\r\n if (data.D365SUser != null && !isEmergencyAccess) {\r\n $scope.vm.User.D365SUser = data.D365SUser;\r\n\r\n if ($scope.vm.User.D365SUser.AccessMode !== null) {\r\n $rootScope.$broadcast('im-request-d365s-getlicenseTypes');\r\n }\r\n }\r\n if (data.PsUserRequest != null && !isEmergencyAccess) {\r\n $scope.vm.User.PSUser = data.PsUserRequest;\r\n if (data.PsUserRequest.PrimaryEmail) {\r\n $scope.vm.originalPSEmail = data.PsUserRequest.PrimaryEmail.slice();\r\n } else {\r\n $scope.vm.originalPSEmail = null;\r\n }\r\n }\r\n\r\n if (data.SfUserRequest != null && !isEmergencyAccess) {\r\n $scope.vm.User.SalesforceUser = data.SfUserRequest;\r\n }\r\n\r\n userMasterDfrd.resolve(data);\r\n\r\n }, function errorCallback(response) {\r\n userMasterDfrd.reject(response.data);\r\n });\r\n\r\n return $.when(userMasterDfrd).done(function () {\r\n }).promise();\r\n };\r\n //Load any user information lists displayed on the User Information pages\r\n this.loadApplicationData = function ($scope, openRequest) {\r\n var loadAppsDfrd = $.Deferred();\r\n var promises = [];\r\n\r\n try {\r\n if (openRequest.NetSuiteUser != null) {\r\n promises.push(RequestManagementNetSuiteLoadDataService.loadNetSuite($scope, openRequest.NetSuiteUser.Subsidiary.Id, openRequest));\r\n }\r\n\r\n if (openRequest.SapUser != null) {\r\n var selectedSapApplications = $scope.vm.availableApplications.filter(application => application.selected === true);\r\n selectedSapApplications.forEach(application => {\r\n if (application.ProductType === 'SAP') {\r\n promises.push(RequestManagementSAPLoadDataService.loadSAP($scope, application, null));\r\n }\r\n });\r\n }\r\n\r\n if (openRequest.UvUser != null) {\r\n var selectedUvApplications = $scope.vm.availableApplications.filter(application => application.selected === true);\r\n\r\n selectedUvApplications.forEach(application => {\r\n if (application.Name === 'Universal') {\r\n promises.push(RequestManagementUPLoadDataService.loadUP($scope, application, null));\r\n }\r\n });\r\n }\r\n\r\n if (openRequest.AadUser != null) {\r\n promises.push(RequestManagementAADLoadDataService.loadAAD($scope, openRequest.AadUser))\r\n }\r\n\r\n if (openRequest.Ax7User != null) {\r\n promises.push(RequestManagementAXLoadDataService.loadAX7($scope, openRequest.Ax7User));\r\n }\r\n\r\n if (openRequest.AxUser != null) {\r\n promises.push(RequestManagementAXLoadDataService.loadAX2012($scope, openRequest.AxUser));\r\n }\r\n\r\n if (openRequest.EbsUser != null) {\r\n promises.push(RequestManagementOracleLoadDataService.loadOracle($scope));\r\n }\r\n // Oracle Cloud\r\n if (openRequest.OrfcUser != null) {\r\n promises.push(RequestManagementOracleCloudLoadDataService.loadOracleCloud($scope));\r\n }\r\n\r\n if (openRequest.GPUser != null) {\r\n promises.push(RequestManagementGPLoadDataService.loadGP($scope));\r\n }\r\n\r\n if (openRequest.NavUser != null) {\r\n promises.push(RequestManagementNAVLoadDataService.loadNAV($scope));\r\n }\r\n\r\n if (openRequest.D365SUser != null) {\r\n promises.push(RequestManagementD365SLoadDataService.loadD365S($scope, openRequest.D365SUser));\r\n }\r\n\r\n if (openRequest.PsUserRequest != null) {\r\n promises.push(RequestManagementPSLoadDataService.loadPS($scope, openRequest.PSUser));\r\n }\r\n\r\n if (openRequest.SfUserRequest != null) {\r\n promises.push(salesforceLoadData.loadSalesforce($scope, openRequest.SfUserRequest));\r\n }\r\n\r\n $q.all(promises).then(function () {\r\n loadAppsDfrd.resolve();\r\n }, function errorCallback(response) {\r\n loadAppsDfrd.reject(response);\r\n });\r\n\r\n }\r\n catch (e) {\r\n loadAppsDfrd.reject(e);\r\n }\r\n\r\n return $.when(loadAppsDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n function lockdownOnError($scope, errorMessage) {\r\n $scope.reportDetailsComplete = false;\r\n $scope.stopRequestManagementSpinner = true;\r\n\r\n //helperService.showErrorMessage(errorMessage);\r\n $rootScope.$emit('RequestManagementStopGridLoadingEvent', \"Error\");\r\n }\r\n //Find any permission changes for display, currently on Access Effective Dates and Summary\r\n this.findAccessChanges = function (request, accessChanges) {\r\n var changeList = [];\r\n\r\n if (request.GPRequest != null) {\r\n request.GPRequest.RoleCompanies.forEach(function (item) {\r\n changeList.push(prepareGPAccessItem(item));\r\n });\r\n\r\n request.GPRequest.UserCompanies.forEach(function (item) {\r\n changeList.push(prepareGPAccessItem(item));\r\n });\r\n }\r\n\r\n if (request.NetSuiteRequest != null) {\r\n\r\n request.NetSuiteRequest.Roles.forEach(function (item) {\r\n changeList.push(prepareNSAccessItem(item));\r\n });\r\n\r\n request.NetSuiteRequest.GlobalPermissions.forEach(function (item) {\r\n changeList.push(prepareNSAccessItem(item));\r\n });\r\n }\r\n\r\n if (request.UniversalRequest != null) {\r\n request.UniversalRequest.forEach(universalRequest => {\r\n universalRequest.UserRoles.forEach(function (item) {\r\n changeList.push(prepareUniversalAccessItem(item, item.Role.ProductName));\r\n });\r\n });\r\n }\r\n\r\n if (request.SAPRequest != null) {\r\n request.SAPRequest.forEach(sapRequest => {\r\n sapRequest.Roles.forEach(function (item) {\r\n changeList.push(prepareSAPAccessItem(item));\r\n });\r\n });\r\n }\r\n\r\n if (request.AadRequest != null) {\r\n request.AadRequest.Roles.forEach(function (item) {\r\n changeList.push(prepareAADAccessItem(item));\r\n });\r\n\r\n request.AadRequest.Groups.forEach(function (item) {\r\n changeList.push(prepareAADAccessItem(item));\r\n });\r\n\r\n request.AadRequest.Licenses.forEach(function (item) {\r\n changeList.push(prepareAADAccessItem(item));\r\n });\r\n }\r\n\r\n if (request.Ax7Request != null) {\r\n request.Ax7Request.RoleCompanies.forEach(function (item) {\r\n changeList.push(prepareAX7AccessItem(item));\r\n });\r\n\r\n request.Ax7Request.UserGroups.forEach(function (item) {\r\n changeList.push(prepareAX7AccessItem(item));\r\n });\r\n }\r\n\r\n if (request.AxRequest != null) {\r\n request.AxRequest.RoleCompanies.forEach(function (item) {\r\n changeList.push(prepareAX2012AccessItem(item));\r\n });\r\n\r\n request.AxRequest.UserGroups.forEach(function (item) {\r\n changeList.push(prepareAX2012AccessItem(item));\r\n });\r\n }\r\n\r\n if (request.NavRequest != null) {\r\n request.NavRequest.PermissionSets.forEach(function (item) {\r\n changeList.push(prepareNAVAccessItem(item));\r\n });\r\n\r\n request.NavRequest.UserGroups.forEach(function (item) {\r\n changeList.push(prepareNAVAccessItem(item));\r\n });\r\n }\r\n\r\n if (request.EbsRequest != null) {\r\n request.EbsRequest.Responsibilities.forEach(function (item) {\r\n changeList.push(prepareORAccessItem(item));\r\n });\r\n\r\n request.EbsRequest.Roles.forEach(function (item) {\r\n changeList.push(prepareORAccessItem(item));\r\n });\r\n }\r\n // Oracle Cloud\r\n if (request.OrfcRequest != null) {\r\n request.OrfcRequest.Roles.forEach(function (item) {\r\n changeList.push(prepareORFCAccessItem(item));\r\n });\r\n }\r\n\r\n if (request.D365SRequest != null) {\r\n request.D365SRequest.UserRoles.forEach(function (item) {\r\n changeList.push(prepareD365SAccessItem(item));\r\n });\r\n request.D365SRequest.UserTeams.forEach(function (item) {\r\n changeList.push(prepareD365SAccessItem(item));\r\n });\r\n }\r\n\r\n if (request.PsRequest != null) {\r\n request.PsRequest.Roles.forEach(function (item) {\r\n changeList.push(preparePSAccessItem(item));\r\n });\r\n }\r\n\r\n if (request.SfRequest != null) {\r\n request.SfRequest.Profiles.forEach(item => {\r\n changeList.push(prepareSalesforceAccessItem(item));\r\n });\r\n request.SfRequest.PermissionSets.forEach(item => {\r\n changeList.push(prepareSalesforceAccessItem(item));\r\n });\r\n }\r\n\r\n\r\n changeList.forEach(function (access) {\r\n\r\n self.addEffectiveDates(access, accessChanges);\r\n\r\n if (access.StartDate != null && access.MinDate == null) {\r\n access.MinDate = access.StartDate;\r\n }\r\n\r\n if (access.MinDate == null) {\r\n access.MinDate = new Date(2000, 0, 1, 0, 0, 0);\r\n }\r\n });\r\n\r\n return changeList;\r\n };\r\n //Find if a change is being made to a User, currently displayed on the Summary page\r\n this.findUserChanges = function (data) {\r\n var changeList = [];\r\n\r\n if (data.User.NetSuiteUser != null && data.User.NetSuiteUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.NetSuiteUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.NetSuiteUser);\r\n }\r\n\r\n if (data.User.SAPUser != null) {\r\n Object.keys(data.User.SAPUser).forEach(key => {\r\n const currentObject = data.User.SAPUser[key];\r\n\r\n if (currentObject && currentObject.Action && data.availableApplications.some(availableApp => key === availableApp.ProductName && availableApp.selected)) {\r\n changeList.push(currentObject);\r\n }\r\n });\r\n }\r\n\r\n if (data.User.AadUser != null && data.User.AadUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.AadUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.AadUser);\r\n }\r\n\r\n if (data.User.AX7User != null && data.User.AX7User.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.AX7User.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.AX7User);\r\n }\r\n\r\n if (data.User.AX2012User != null && data.User.AX2012User.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.AX2012User.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.AX2012User);\r\n }\r\n\r\n if (data.User.OracleUser != null && data.User.OracleUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.OracleUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.OracleUser);\r\n }\r\n\r\n if (data.User.OracleCloudUser != null && data.User.OracleCloudUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.OracleCloudUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.OracleCloudUser);\r\n }\r\n\r\n if (data.User.GPUser != null && data.User.GPUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.GPUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.GPUser);\r\n }\r\n\r\n if (data.User.NAVUser != null && data.User.NAVUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.NAVUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.NAVUser);\r\n }\r\n\r\n if (data.User.D365SUser != null && data.User.D365SUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.D365SUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.D365SUser);\r\n }\r\n\r\n if (data.User.PSUser != null && data.User.PSUser.Action != null && data.availableApplications.some(availableApp => availableApp.ProductID === data.User.PSUser.ProductId && availableApp.selected)) {\r\n changeList.push(data.User.PSUser);\r\n }\r\n\r\n if (data.User.SalesforceUser != null) {\r\n if (data.User.SalesforceUser != null && data.User.SalesforceUser.Action != null) {\r\n changeList.push(data.User.SalesforceUser);\r\n }\r\n }\r\n\r\n if (data.User.UPUser != null) {\r\n Object.keys(data.User.UPUser).forEach(key => {\r\n const currentObject = data.User.UPUser[key];\r\n if (currentObject && currentObject.Action && data.availableApplications.some(availableApp => key === availableApp.ProductName && availableApp.selected)) {\r\n changeList.push(currentObject);\r\n }\r\n });\r\n }\r\n\r\n return changeList;\r\n };\r\n //Populate IM with data returned from the Build call\r\n this.loadRequestData = function (toStep, fromStep, vm, scope, request) {\r\n var loadRequestDfrd = $.Deferred();\r\n\r\n if (request.NetSuiteRequest != null) {\r\n if (request.NetSuiteRequest.User != null) {\r\n vm.User.NetSuiteUser.ConfirmPassword = request.NetSuiteRequest.User.Password;\r\n vm.User.NetSuiteUser.Action = request.NetSuiteRequest.User.Action;\r\n vm.User.NetSuiteUser.ProductId = request.NetSuiteRequest.User.ProductId;\r\n vm.User.NetSuiteUser.ApplicationType = request.NetSuiteRequest.User.ApplicationType;\r\n vm.User.NetSuiteUser.UserChanges = request.NetSuiteRequest.User.UserChanges;\r\n }\r\n vm.User.NetSuiteUser.ApplicationId = netsuite_application_id;\r\n\r\n if (vm.ListOfSelectedNetSuiteRoles != null) {\r\n //Remove all actions in between builds\r\n vm.ListOfSelectedNetSuiteRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedNetSuiteRoles.forEach(function (role) {\r\n prepareNSAccessItem(role);\r\n\r\n var foundRole = request.NetSuiteRequest.Roles.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableNetSuiteRoles != null) {\r\n vm.ListOfAvailableNetSuiteRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableNetSuiteRoles.forEach(function (role) {\r\n prepareNSAccessItem(role);\r\n\r\n var foundRole = request.NetSuiteRequest.Roles.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n\r\n if (vm.ListOfSelectedNetSuitePermissions != null) {\r\n vm.ListOfSelectedNetSuitePermissions.forEach(function (perm) {\r\n perm.Action = null;\r\n });\r\n vm.ListOfSelectedNetSuitePermissions.forEach(function (perm) {\r\n prepareNSAccessItem(perm);\r\n\r\n\r\n var foundPermission = request.NetSuiteRequest.GlobalPermissions.find(function (selPerm) {\r\n return selPerm.Id == perm.Id;\r\n });\r\n if (foundPermission != null) {\r\n perm.Action = foundPermission.Action;\r\n perm.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableNetSuitePermissions != null) {\r\n vm.ListOfAvailableNetSuitePermissions.forEach(function (perm) {\r\n perm.Action = null;\r\n });\r\n vm.ListOfAvailableNetSuitePermissions.forEach(function (perm) {\r\n prepareNSAccessItem(perm);\r\n\r\n var foundPermission = request.NetSuiteRequest.GlobalPermissions.find(function (selPerm) {\r\n return selPerm.Id == perm.Id;\r\n });\r\n if (foundPermission != null) {\r\n perm.Action = foundPermission.Action;\r\n perm.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n if (request.AadRequest != null) {\r\n if (request.AadRequest.User != null) {\r\n if (request.AadRequest.User.PasswordProfile) {\r\n vm.User.AadUser.ConfirmPassword = request.AadRequest.User.PasswordProfile.Password;\r\n }\r\n vm.User.AadUser.Action = request.AadRequest.User.Action;\r\n vm.User.AadUser.ProductId = request.AadRequest.User.ProductId;\r\n vm.User.AadUser.ApplicationType = request.AadRequest.User.ApplicationType;\r\n vm.User.AadUser.UserChanges = request.AadRequest.User.UserChanges;\r\n }\r\n vm.User.AadUser.ApplicationId = aad_application_id;\r\n\r\n if (vm.ListOfSelectedAADRoles != null) {\r\n vm.ListOfSelectedAADRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedAADRoles.forEach(function (role) {\r\n\r\n var foundRole = request.AadRequest.Roles.find(function (adRole) {\r\n return adRole.Id.toUpperCase() == role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableAADRoles != null) {\r\n vm.ListOfAvailableAADRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableAADRoles.forEach(function (role) {\r\n\r\n var foundRole = request.AadRequest.Roles.find(function (adRole) {\r\n return adRole.Id.toUpperCase() == role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedAADGroups != null) {\r\n vm.ListOfSelectedAADGroups.forEach(function (group) {\r\n group.Action = null;\r\n });\r\n vm.ListOfSelectedAADGroups.forEach(function (group) {\r\n\r\n var foundLicense = request.AadRequest.Groups.find(function (adGroup) {\r\n return adGroup.Id.toUpperCase() == group.Id.toUpperCase();\r\n });\r\n if (foundLicense != null) {\r\n group.Action = foundLicense.Action;\r\n group.AccessType = foundLicense.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(group);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableAADGroups != null) {\r\n vm.ListOfAvailableAADGroups.forEach(function (group) {\r\n group.Action = null;\r\n });\r\n vm.ListOfAvailableAADGroups.forEach(function (group) {\r\n\r\n var foundLicense = request.AadRequest.Groups.find(function (adGroup) {\r\n return adGroup.Id.toUpperCase() == group.Id.toUpperCase();\r\n });\r\n if (foundLicense != null) {\r\n group.Action = foundLicense.Action;\r\n group.AccessType = foundLicense.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(group);\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedAADLicenses != null) {\r\n vm.ListOfSelectedAADLicenses.forEach(function (license) {\r\n license.Action = null;\r\n });\r\n vm.ListOfSelectedAADLicenses.forEach(function (license) {\r\n\r\n var foundLicense = request.AadRequest.Licenses.find(function (adLicense) {\r\n return adLicense.SkuId.toUpperCase() == license.SkuId.toUpperCase();\r\n });\r\n if (foundLicense != null) {\r\n license.Action = foundLicense.Action;\r\n license.AccessType = foundLicense.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(license);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableAADLicenses != null) {\r\n vm.ListOfAvailableAADLicenses.forEach(function (license) {\r\n license.Action = null;\r\n });\r\n vm.ListOfAvailableAADLicenses.forEach(function (license) {\r\n\r\n var foundLicense = request.AadRequest.Licenses.find(function (adLicense) {\r\n return adLicense.SkuId.toUpperCase() == license.SkuId.toUpperCase();\r\n });\r\n if (foundLicense != null) {\r\n license.Action = foundLicense.Action;\r\n license.AccessType = foundLicense.AccessType;\r\n }\r\n\r\n prepareAADAccessItem(license);\r\n });\r\n }\r\n }\r\n if (request.Ax7Request != null) {\r\n if (request.Ax7Request.User != null) {\r\n vm.User.AX7User.ConfirmPassword = request.Ax7Request.User.Password;\r\n vm.User.AX7User.Action = request.Ax7Request.User.Action;\r\n vm.User.AX7User.ProductId = request.Ax7Request.User.ProductId;\r\n vm.User.AX7User.ApplicationType = request.Ax7Request.User.ApplicationType;\r\n vm.User.AX7User.UserChanges = request.Ax7Request.User.UserChanges;\r\n }\r\n vm.User.AX7User.ApplicationId = ax7_application_id;\r\n\r\n if (vm.ListOfSelectedAX7Roles != null) {\r\n vm.ListOfSelectedAX7Roles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedAX7Roles.forEach(function (role) {\r\n\r\n var foundRole = request.Ax7Request.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id.toUpperCase() == role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAX7AccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableAX7Roles != null) {\r\n vm.ListOfAvailableAX7Roles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableAX7Roles.forEach(function (role) {\r\n\r\n var foundRole = request.Ax7Request.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id.toUpperCase() == role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAX7AccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedAX7UserGroups != null) {\r\n vm.ListOfSelectedAX7UserGroups.forEach(function (userGroup) {\r\n userGroup.Action = null;\r\n });\r\n vm.ListOfSelectedAX7UserGroups.forEach(function (userGroup) {\r\n\r\n var foundUserGroup = request.Ax7Request.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id.toUpperCase() == userGroup.Id.toUpperCase();\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX7AccessItem(userGroup);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableAX7UserGroups != null) {\r\n vm.ListOfAvailableAX7UserGroups.forEach(function (userGroup) {\r\n userGroup.Action = null;\r\n });\r\n vm.ListOfAvailableAX7UserGroups.forEach(function (userGroup) {\r\n\r\n var foundUserGroup = request.Ax7Request.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id.toUpperCase() == userGroup.Id.toUpperCase();\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX7AccessItem(userGroup);\r\n });\r\n }\r\n }\r\n if (request.AxRequest != null) {\r\n if (request.AxRequest.User != null) {\r\n vm.User.AX2012User.ApplicationType = request.AxRequest.User.ApplicationType;\r\n vm.User.AX2012User.Action = request.AxRequest.User.Action;\r\n vm.User.AX2012User.ProductId = request.AxRequest.User.ProductId;\r\n vm.User.AX2012User.UserChanges = request.AxRequest.User.UserChanges;\r\n }\r\n vm.User.AX2012User.ApplicationId = ax_application_id;\r\n\r\n if (vm.ListOfSelectedAX2012Roles != null) {\r\n vm.ListOfSelectedAX2012Roles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedAX2012Roles.forEach(function (role) {\r\n\r\n var foundRole = request.AxRequest.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id.toUpperCase() == role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAX2012AccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableAX2012Roles != null) {\r\n vm.ListOfAvailableAX2012Roles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableAX2012Roles.forEach(function (role) {\r\n\r\n var foundRole = request.AxRequest.RoleCompanies.find(function (axRole) {\r\n return axRole.Role.Id.toUpperCase() == role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareAX2012AccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedAX2012UserGroups != null) {\r\n vm.ListOfSelectedAX2012UserGroups.forEach(function (userGroup) {\r\n userGroup.Action = null;\r\n });\r\n vm.ListOfSelectedAX2012UserGroups.forEach(function (userGroup) {\r\n\r\n var foundUserGroup = request.AxRequest.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id.toUpperCase() == userGroup.Id.toUpperCase();\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX2012AccessItem(userGroup);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableAX2012UserGroups != null) {\r\n vm.ListOfAvailableAX2012UserGroups.forEach(function (userGroup) {\r\n userGroup.Action = null;\r\n });\r\n vm.ListOfAvailableAX2012UserGroups.forEach(function (userGroup) {\r\n\r\n var foundUserGroup = request.AxRequest.UserGroups.find(function (axUserGroup) {\r\n return axUserGroup.Id.toUpperCase() == userGroup.Id.toUpperCase();\r\n });\r\n if (foundUserGroup != null) {\r\n userGroup.Action = foundUserGroup.Action;\r\n userGroup.AccessType = foundUserGroup.AccessType;\r\n }\r\n\r\n prepareAX2012AccessItem(userGroup);\r\n });\r\n }\r\n }\r\n if (request.UniversalRequest != null) {\r\n request.UniversalRequest.forEach(universalRequest => {\r\n var productName = vm.availableApplications.find(application => application.ProductID === universalRequest.ProductId).ProductName;\r\n\r\n if (universalRequest.User != null) {\r\n vm.User.UPUser[productName].Action = universalRequest.User.Action;\r\n vm.User.UPUser[productName].ApplicationType = universalRequest.User.ApplicationType;\r\n vm.User.UPUser[productName].ProductId = universalRequest.User.ProductId;\r\n vm.User.UPUser[productName].UserChanges = universalRequest.User.UserChanges;\r\n }\r\n vm.User.UPUser[productName].ApplicationId = universalProduct_application_id;\r\n\r\n if (vm.ListOfSelectedUPRoles[productName] != null) {\r\n vm.ListOfSelectedUPRoles[productName].forEach(function (role) {\r\n role.Action = null;\r\n });\r\n\r\n vm.ListOfSelectedUPRoles[productName].forEach(function (role) {\r\n prepareUniversalAccessItem(role, productName);\r\n var foundRole = universalRequest.UserRoles.find(function (universalRole) {\r\n return universalRole.Id == role.Id;\r\n });\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableUPRoles[productName] != null) {\r\n vm.ListOfAvailableUPRoles[productName].forEach(function (role) {\r\n role.Action = null;\r\n });\r\n\r\n vm.ListOfAvailableUPRoles[productName].forEach(function (role) {\r\n prepareUniversalAccessItem(role, productName);\r\n var foundRole = universalRequest.UserRoles.find(function (universalRole) {\r\n return universalRole.Id == role.Id;\r\n });\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n if (request.SAPRequest != null) {\r\n request.SAPRequest.forEach(sapRequest => {\r\n var productName = vm.availableApplications.find(application => application.ProductID === sapRequest.ProductId).ProductName;\r\n\r\n if (sapRequest.User != null) {\r\n vm.User.SAPUser[productName].ConfirmPassword = sapRequest.User.Password;\r\n vm.User.SAPUser[productName].Action = sapRequest.User.Action;\r\n vm.User.SAPUser[productName].ApplicationType = sapRequest.User.ApplicationType;\r\n vm.User.SAPUser[productName].ProductId = sapRequest.User.ProductId;\r\n vm.User.SAPUser[productName].UserChanges = sapRequest.User.UserChanges;\r\n }\r\n vm.User.SAPUser[productName].ApplicationId = sap_application_id;\r\n\r\n // for Single Roles\r\n if (vm.ListOfSelectedSAPSingleRoles[productName] != null) {\r\n vm.ListOfSelectedSAPSingleRoles[productName].forEach(role => {\r\n role.Action = null;\r\n });\r\n\r\n vm.ListOfSelectedSAPSingleRoles[productName].forEach(role => {\r\n prepareSAPAccessItem(role);\r\n var foundRole = sapRequest.Roles.find(sapRole => sapRole.Id == role.Id);\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableSAPSingleRoles[productName] != null) {\r\n vm.ListOfAvailableSAPSingleRoles[productName].forEach(role => {\r\n role.Action = null;\r\n });\r\n\r\n vm.ListOfAvailableSAPSingleRoles[productName].forEach(role => {\r\n prepareSAPAccessItem(role);\r\n var foundRole = sapRequest.Roles.find(sapRole => sapRole.Id == role.Id);\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n // for Composite Roles\r\n if (vm.ListOfSelectedSAPCompositeRoles[productName] != null) {\r\n vm.ListOfSelectedSAPCompositeRoles[productName].forEach(compositeRole => {\r\n compositeRole.Action = null;\r\n });\r\n\r\n vm.ListOfSelectedSAPCompositeRoles[productName].forEach(compositeRole => {\r\n prepareSAPAccessItem(compositeRole);\r\n var foundCompositeRole = sapRequest.Roles.find(sapCompositeRole => sapCompositeRole.Id == compositeRole.Id);\r\n\r\n if (foundCompositeRole != null) {\r\n compositeRole.Action = foundCompositeRole.Action;\r\n compositeRole.AccessType = foundCompositeRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableSAPCompositeRoles[productName] != null) {\r\n vm.ListOfAvailableSAPCompositeRoles[productName].forEach(compositeRole => {\r\n compositeRole.Action = null;\r\n });\r\n\r\n vm.ListOfAvailableSAPCompositeRoles[productName].forEach(compositeRole => {\r\n prepareSAPAccessItem(compositeRole);\r\n var foundCompositeRole = sapRequest.Roles.find(sapCompositeRole => sapCompositeRole.Id == compositeRole.Id);\r\n\r\n if (foundCompositeRole != null) {\r\n compositeRole.Action = foundCompositeRole.Action;\r\n compositeRole.AccessType = foundCompositeRole.AccessType;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n if (request.EbsRequest != null) {\r\n if (request.EbsRequest.User != null) {\r\n vm.User.OracleUser.ConfirmPassword = request.EbsRequest.User.Password;\r\n vm.User.OracleUser.Action = request.EbsRequest.User.Action;\r\n vm.User.OracleUser.ProductId = request.EbsRequest.User.ProductId;\r\n vm.User.OracleUser.ApplicationType = request.EbsRequest.User.ApplicationType;\r\n vm.User.OracleUser.Expiration = request.EbsRequest.User.PasswordAccesses === null && request.EbsRequest.User.PasswordDays === null ? 'None' : request.EbsRequest.User.PasswordAccesses === null ? 'Days' : 'Accesses';\r\n vm.User.OracleUser.ExpirationValue = vm.User.OracleUser.Expiration === 'Days' ? request.EbsRequest.User.PasswordDays : request.EbsRequest.User.PasswordAccesses;\r\n vm.User.OracleUser.UserChanges = request.EbsRequest.User.UserChanges;\r\n }\r\n vm.User.OracleUser.ApplicationId = oracle_application_id;\r\n\r\n if (vm.ListOfSelectedOracleResponsibilities != null) {\r\n vm.ListOfSelectedOracleResponsibilities.forEach(function (responsibility) {\r\n responsibility.Action = null;\r\n });\r\n vm.ListOfSelectedOracleResponsibilities.forEach(function (responsibility) {\r\n prepareORAccessItem(responsibility);\r\n\r\n var foundResponsibility = request.EbsRequest.Responsibilities.find(function (oracle) {\r\n return oracle.Id == responsibility.Id;\r\n });\r\n\r\n if (foundResponsibility != null) {\r\n responsibility.Action = foundResponsibility.Action;\r\n responsibility.AccessType = foundResponsibility.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableOracleResponsibilities != null) {\r\n vm.ListOfAvailableOracleResponsibilities.forEach(function (responsibility) {\r\n responsibility.Action = null;\r\n });\r\n vm.ListOfAvailableOracleResponsibilities.forEach(function (responsibility) {\r\n prepareORAccessItem(responsibility);\r\n\r\n var foundResponsibility = request.EbsRequest.Responsibilities.find(function (oracle) {\r\n return oracle.Id == responsibility.Id;\r\n });\r\n\r\n if (foundResponsibility != null) {\r\n responsibility.Action = foundResponsibility.Action;\r\n responsibility.AccessType = foundResponsibility.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedOracleRoles != null) {\r\n vm.ListOfSelectedOracleRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedOracleRoles.forEach(function (role) {\r\n prepareORAccessItem(role);\r\n\r\n var foundRole = request.EbsRequest.Roles.find(function (oracle) {\r\n return oracle.Id == role.Id;\r\n });\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableOracleRoles != null) {\r\n vm.ListOfAvailableOracleRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableOracleRoles.forEach(function (role) {\r\n prepareORAccessItem(role);\r\n\r\n var foundRole = request.EbsRequest.Roles.find(function (oracle) {\r\n return oracle.Id == role.Id;\r\n });\r\n\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Oracle Cloud\r\n if (request.OrfcRequest != null) {\r\n if (request.OrfcRequest.User != null) {\r\n vm.User.OracleCloudUser = request.OrfcRequest.User;\r\n vm.User.OracleCloudUser.Action = request.OrfcRequest.User.Action;\r\n vm.User.OracleCloudUser.PasswordConfirm = request.OrfcRequest.User.Password;\r\n vm.User.OracleCloudUser.UserChanges = request.OrfcRequest.User.UserChanges;\r\n }\r\n vm.User.OracleCloudUser.ApplicationId = oracleCloud_application_id;\r\n\r\n if (vm.User.OrfcUser != null && vm.ListOfStoredOracleCloudRoles != null) {\r\n //Remove all actions in between builds\r\n vm.ListOfStoredOracleCloudRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfStoredOracleCloudRoles.forEach(function (role) {\r\n prepareORFCAccessItem(role);\r\n\r\n var foundRole = request.OrfcRequest.Roles.find(function (orfcRole) {\r\n return orfcRole.RoleID == role.RoleID;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableOracleCloudRoles != null) {\r\n vm.ListOfAvailableOracleCloudRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableOracleCloudRoles.forEach(function (role) {\r\n prepareORFCAccessItem(role);\r\n\r\n var foundRole = request.OrfcRequest.Roles.find(function (orfcRole) {\r\n return orfcRole.RoleID == role.RoleID;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n // END\r\n\r\n if (request.GPRequest != null) {\r\n if (request.GPRequest.User != null) {\r\n vm.User.GPUser.ConfirmPassword = request.GPRequest.User.Password;\r\n vm.User.GPUser.Action = request.GPRequest.User.Action;\r\n vm.User.GPUser.ProductId = request.GPRequest.User.ProductId;\r\n vm.User.GPUser.ApplicationType = request.GPRequest.User.ApplicationType;\r\n vm.User.GPUser.UserChanges = request.GPRequest.User.UserChanges;\r\n }\r\n vm.User.GPUser.ApplicationId = gp_application_id;\r\n\r\n if (vm.User.GPUser != null && vm.ListOfStoredGPRoles != null) {\r\n //Remove all actions in between builds\r\n vm.ListOfStoredGPRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfStoredGPRoles.forEach(function (role) {\r\n prepareGPAccessItem(role);\r\n\r\n var foundRole = request.GPRequest.RoleCompanies.find(function (nsRole) {\r\n return nsRole.Role.Id == role.Role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableGPRoles != null) {\r\n vm.ListOfAvailableGPRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableGPRoles.forEach(function (role) {\r\n prepareGPAccessItem(role);\r\n\r\n var foundRole = request.GPRequest.RoleCompanies.find(function (nsRole) {\r\n return nsRole.Role.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedGPCompanies != null) {\r\n vm.ListOfSelectedGPCompanies.forEach(function (perm) {\r\n perm.Action = null;\r\n });\r\n vm.ListOfSelectedGPCompanies.forEach(function (perm) {\r\n prepareGPAccessItem(perm);\r\n\r\n var foundPermission = request.GPRequest.UserCompanies.find(function (selPerm) {\r\n return selPerm.Company.Id == perm.Id;\r\n });\r\n if (foundPermission != null) {\r\n perm.Action = foundPermission.Action;\r\n perm.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableGPCompanies != null) {\r\n vm.ListOfAvailableGPCompanies.forEach(function (perm) {\r\n perm.Action = null;\r\n });\r\n vm.ListOfAvailableGPCompanies.forEach(function (perm) {\r\n prepareGPAccessItem(perm);\r\n\r\n var foundPermission = request.GPRequest.UserCompanies.find(function (selPerm) {\r\n return selPerm.Company.Id == perm.Id;\r\n });\r\n if (foundPermission != null) {\r\n perm.Action = foundPermission.Action;\r\n perm.AccessType = foundPermission.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n if (request.NavRequest != null) {\r\n if (request.NavRequest.User != null) {\r\n vm.User.NAVUser.Action = request.NavRequest.User.Action;\r\n vm.User.NAVUser.ProductId = request.NavRequest.User.ProductId;\r\n vm.User.NAVUser.ApplicationType = request.NavRequest.User.ApplicationType;\r\n vm.User.NAVUser.UserChanges = request.NavRequest.User.UserChanges;\r\n }\r\n vm.User.NAVUser.ApplicationId = netsuite_application_id;\r\n\r\n if (vm.ListOfSelectedNAVPermissionSets != null) {\r\n //Remove all actions in between builds\r\n vm.ListOfSelectedNAVPermissionSets.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedNAVPermissionSets.forEach(function (role) {\r\n prepareNAVAccessItem(role);\r\n\r\n var foundRole = request.NavRequest.PermissionSets.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableNAVPermissionSets != null) {\r\n vm.ListOfAvailableNAVPermissionSets.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableNAVPermissionSets.forEach(function (role) {\r\n prepareNAVAccessItem(role);\r\n\r\n var foundRole = request.NavRequest.PermissionSets.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedNAVUserGroups != null) {\r\n //Remove all actions in between builds\r\n vm.ListOfSelectedNAVUserGroups.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedNAVUserGroups.forEach(function (role) {\r\n prepareNAVAccessItem(role);\r\n\r\n var foundRole = request.NavRequest.UserGroups.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableNAVUserGroups != null) {\r\n vm.ListOfAvailableNAVUserGroups.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableNAVUserGroups.forEach(function (role) {\r\n prepareNAVAccessItem(role);\r\n\r\n var foundRole = request.NavRequest.UserGroups.find(function (nsRole) {\r\n return nsRole.Id == role.Id;\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n });\r\n }\r\n }\r\n if (request.D365SRequest != null) {\r\n if (request.D365SRequest.User != null) {\r\n vm.User.D365SUser.Action = request.D365SRequest.User.Action;\r\n vm.User.D365SUser.ProductId = request.D365SRequest.User.ProductId;\r\n vm.User.D365SUser.ApplicationType = request.D365SRequest.User.ApplicationType;\r\n vm.User.D365SUser.UserChanges = request.D365SRequest.User.UserChanges;\r\n }\r\n vm.User.D365SUser.ApplicationId = d365s_application_id;\r\n\r\n if (vm.ListOfSelectedD365SRoles != null) {\r\n vm.ListOfSelectedD365SRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedD365SRoles.forEach(function (role) {\r\n\r\n var foundRole = request.D365SRequest.UserRoles.find(function (d365sRole) {\r\n return d365sRole.Role.Id.toUpperCase() === role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableD365SRoles != null) {\r\n vm.ListOfAvailableD365SRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailableD365SRoles.forEach(function (role) {\r\n\r\n var foundRole = request.D365SRequest.UserRoles.find(function (d365sRole) {\r\n return d365sRole.Role.Id.toUpperCase() === role.Id.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfSelectedD365STeams != null) {\r\n vm.ListOfSelectedD365STeams.forEach(function (team) {\r\n\r\n var foundTeam = request.D365SRequest.UserTeams.find(function (d365sTeam) {\r\n return d365sTeam.Team.Id.toUpperCase() === team.Id;\r\n });\r\n if (foundTeam != null) {\r\n team.Action = foundTeam.Action;\r\n team.AccessType = foundTeam.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(team);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableD365STeams != null) {\r\n vm.ListOfAvailableD365STeams.forEach(function (team) {\r\n\r\n var foundTeam = request.D365SRequest.UserTeams.find(function (d365sTeam) {\r\n return d365sTeam.Team.Id.toUpperCase() === team.Id;\r\n });\r\n if (foundTeam != null) {\r\n team.Action = foundTeam.Action;\r\n team.AccessType = foundTeam.AccessType;\r\n }\r\n\r\n prepareD365SAccessItem(team);\r\n });\r\n }\r\n }\r\n\r\n // PeopleSoft\r\n if (request.PsRequest != null) {\r\n if (request.PsRequest.User != null) {\r\n vm.User.PSUser.ConfirmPassword = request.PsRequest.User.Password;\r\n vm.User.PSUser.ApplicationType = request.PsRequest.User.ApplicationType;\r\n vm.User.PSUser.Action = request.PsRequest.User.Action;\r\n vm.User.PSUser.ProductId = request.PsRequest.User.ProductId;\r\n vm.User.PSUser.UserChanges = request.PsRequest.User.UserChanges;\r\n }\r\n vm.User.PSUser.ApplicationId = ps_application_id;\r\n\r\n if (vm.ListOfSelectedPSRoles != null) {\r\n vm.ListOfSelectedPSRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfSelectedPSRoles.forEach(function (role) {\r\n\r\n var foundRole = request.PsRequest.Roles.find(function (psRole) {\r\n return psRole.Name.toUpperCase() === role.Name.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n preparePSAccessItem(role);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailablePSRoles != null) {\r\n vm.ListOfAvailablePSRoles.forEach(function (role) {\r\n role.Action = null;\r\n });\r\n vm.ListOfAvailablePSRoles.forEach(function (role) {\r\n\r\n var foundRole = request.PsRequest.Roles.find(function (psRole) {\r\n return psRole.Name.toUpperCase() == role.Name.toUpperCase();\r\n });\r\n if (foundRole != null) {\r\n role.Action = foundRole.Action;\r\n role.AccessType = foundRole.AccessType;\r\n }\r\n\r\n preparePSAccessItem(role);\r\n });\r\n }\r\n }\r\n\r\n // Salesforce\r\n if (request.SfRequest != null) {\r\n if (request.SfRequest.User != null) {\r\n vm.User.SalesforceUser.ApplicationType = request.SfRequest.User.ApplicationType;\r\n vm.User.SalesforceUser.Action = request.SfRequest.User.Action;\r\n vm.User.SalesforceUser.ProductId = request.SfRequest.User.ProductId;\r\n vm.User.SalesforceUser.UserChanges = request.SfRequest.User.UserChanges;\r\n }\r\n\r\n vm.User.SalesforceUser.ApplicationId = salesforce_application_id;\r\n\r\n if (vm.ListOfSelectedSalesforcePermissionSets != null) {\r\n vm.ListOfSelectedSalesforcePermissionSets.forEach(permission => {\r\n permission.Action = null;\r\n });\r\n vm.ListOfSelectedSalesforcePermissionSets.forEach(permission => {\r\n\r\n var foundPermission = request.SfRequest.PermissionSets.find(salesforcePermission => salesforcePermission.Name.toUpperCase() === permission.Name.toUpperCase());\r\n if (foundPermission != null) {\r\n permission.Action = foundPermission.Action;\r\n permission.AccessType = foundPermission.AccessType;\r\n }\r\n\r\n prepareSalesforceAccessItem(permission);\r\n });\r\n }\r\n\r\n if (vm.ListOfAvailableSalesforcePermissionSets != null) {\r\n vm.ListOfAvailableSalesforcePermissionSets.forEach(permission => {\r\n permission.Action = null;\r\n });\r\n vm.ListOfAvailableSalesforcePermissionSets.forEach(permission => {\r\n let foundPermission = request.SfRequest.PermissionSets.find(salesforcePermission => salesforcePermission.Name.toUpperCase() == permission.Name.toUpperCase());\r\n if (foundPermission != null) {\r\n permission.Action = foundPermission.Action;\r\n permission.AccessType = foundPermission.AccessType;\r\n }\r\n\r\n prepareSalesforceAccessItem(permission);\r\n });\r\n }\r\n\r\n if (vm.User.SalesforceUser.Profile) {\r\n let profile = vm.User.SalesforceUser.Profile,\r\n foundProfile = request.SfRequest.Profiles.find(requestProfile => requestProfile.Id === profile.Id);\r\n\r\n profile.Action = null;\r\n\r\n if (foundProfile) {\r\n profile.Action = foundProfile.Action;\r\n profile.AccessType = foundProfile.AccessType;\r\n }\r\n\r\n prepareSalesforceAccessItem(profile);\r\n }\r\n\r\n if (vm.salesforceProfiles) {\r\n let profile = vm.User.SalesforceUser.Profile,\r\n foundProfile = request.SfRequest.Profiles.find(requestProfile => requestProfile.Id == profile.Id);\r\n\r\n profile.Action = null;\r\n\r\n if (foundProfile) {\r\n profile.Action = foundProfile.Action;\r\n profile.StartDate = foundProfile.StartDate;\r\n profile.EndDate = foundProfile.EndDate;\r\n profile.AccessType = foundProfile.AccessType;\r\n }\r\n\r\n prepareSalesforceAccessItem(profile);\r\n }\r\n }\r\n // END\r\n\r\n if (toStep == \"Access Effective Dates\") {\r\n //Find the access changes after the build request returns\r\n scope.loadEffectiveDateData(request);\r\n vm.hasCompany = vm.AccessChanges.find(function (access) { return access.Company != null; }) != null;\r\n if (vm.AccessChanges.some(access => access.Action === 'Grant') && vm.AccessChanges.some(access => access.Action === 'Revoke')) {\r\n vm.allowApplyAllDates = false;\r\n } else {\r\n vm.allowApplyAllDates = true;\r\n if (vm.AccessChanges.length > 0 && vm.AccessChanges.every(access => access.Action === 'Revoke')) {\r\n vm.allDatesRevoke = true;\r\n } else {\r\n vm.allDatesRevoke = false;\r\n }\r\n }\r\n }\r\n\r\n if (toStep == \"Summary\") {\r\n //Find access and user changes for summary page\r\n scope.loadEffectiveDateData(request);\r\n vm.AccessChanges = this.findAccessChanges(request, vm.AccessChanges);\r\n vm.hasCompany = vm.AccessChanges.find(function (access) { return access.Company != null; }) != null;\r\n vm.UserChanges = this.findUserChanges(vm);\r\n }\r\n\r\n loadRequestDfrd.resolve();\r\n\r\n return $.when(loadRequestDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.addEffectiveDates = function (accessItem, accessChanges) {\r\n var foundAccessItem = null;\r\n var foundAccessItems = [];\r\n var companyId = null;\r\n\r\n if (accessItem.Company != null) {\r\n if (accessItem.Company.Id != null) {\r\n companyId = accessItem.Company.Id;\r\n } else if (accessItem.Company.CompanyId != null) {\r\n companyId = accessItem.Company.CompanyId;\r\n } else {\r\n companyId = accessItem.Company;\r\n }\r\n }\r\n\r\n //ternary operator for GP since GP can grant companies as a type\r\n if (accessItem.Company != null && (accessItem.ProductId == 'GP' && accessItem.AccessType == 'Company' ? false : true)) {\r\n //Find all access items that have the same Id and AppId\r\n foundAccessItems = accessChanges.filter(access => (access.Id != null && accessItem.Id != null && access.Id == accessItem.Id || access.Role != null && accessItem.Role != null && access.Role.Id != null && access.Role.Id == accessItem.Role.Id) && access.AppId == accessItem.AppId);\r\n for (let item of foundAccessItems) {\r\n //If there is more than one filter by company\r\n if (item.Company != null) {\r\n if (item.Company.Id != null && item.Company.Id == companyId) {\r\n foundAccessItem = item;\r\n } else if (item.Company.CompanyId != null && item.Company.CompanyId == companyId) {\r\n foundAccessItem = item;\r\n } else if (item.Company == companyId) {\r\n foundAccessItem = item;\r\n }\r\n\r\n if (foundAccessItem != null) {\r\n break;\r\n }\r\n }\r\n }\r\n } else if (accessItem.Company != null && (accessItem.ProductId == 'GP' && accessItem.AccessType == 'Company')) {\r\n foundAccessItem = accessChanges.find(function (item) {\r\n return item.Company.Id == companyId && item.AccessType == 'Company';\r\n });\r\n } else if (accessItem.RoleID) { // If RoleID exists, Oracle Cloud\r\n foundAccessItem = accessChanges.find(access => {\r\n return access.RoleID == accessItem.RoleID && access.AppId == accessItem.AppId;\r\n });\r\n }\r\n else {\r\n foundAccessItem = accessChanges.find(access => {\r\n return (access.Id != null && accessItem.Id != null && access.Id == accessItem.Id || access.Role != null && accessItem.Role != null && access.Role.Id != null && access.Role.Id == accessItem.Role.Id || access.SkuId != null && accessItem.SkuId != null & access.SkuId == accessItem.SkuId || access.Team != null && accessItem.Team != null && access.Team.Id != null && access.Team.Id == accessItem.Team.Id || access.Name != null && accessItem.Name != null && access.Name == accessItem.Name) && access.AppId == accessItem.AppId && access.Company == null;\r\n });\r\n }\r\n\r\n //Populate Start/End dates\r\n if (foundAccessItem != null) {\r\n accessItem.StartDate = foundAccessItem.StartDate;\r\n accessItem.EndDate = foundAccessItem.EndDate;\r\n }\r\n };\r\n\r\n this.getSelfServiceMapping = getSelfServiceMapping;\r\n\r\n async function getSelfServiceMapping() {\r\n try {\r\n let response = await $http.get(apiUrl + 'api/identitymanager/users/selfservice');\r\n return response.data;\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n\r\n //Removes null instances and empty arrays from 'data'\r\n function terminationSummaryFilter(data) {\r\n\r\n Object.keys(data).forEach(key => {\r\n if (data[key] === null) {\r\n delete data[key];\r\n }\r\n });\r\n\r\n if (Array.isArray(data)) {\r\n const temp = data.reduce((r, v) => {\r\n v = terminationSummaryFilter(v);\r\n if (v !== '') r.push(v);\r\n return r;\r\n }, []);\r\n return temp.length\r\n ? temp\r\n : '';\r\n }\r\n if (data && typeof data === 'object') {\r\n const temp = Object.entries(data).reduce((r, [k, v]) => {\r\n v = terminationSummaryFilter(v);\r\n if (v !== '') r.push([k, v]);\r\n return r;\r\n }, []);\r\n return temp.length\r\n ? Object.fromEntries(temp)\r\n : '';\r\n }\r\n return data;\r\n }\r\n\r\n //Creates a new object with a subset of data properties based on the ProductId/ProductType of the data instance\r\n function createUserDetailsInstances(data) {\r\n for (let i = 0; i < data.length; i++) {\r\n if (data[i].ProductId) {\r\n switch (data[i].ProductId) {\r\n case 'AX7': //Dynamics 365FO\r\n data[i] = {\r\n UserID: data[i].UserId,\r\n UserName: data[i].UserName,\r\n Email: data[i].Email,\r\n Company: data[i].Company,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'NS': //Netsuite\r\n data[i] = {\r\n FirstName: data[i].FirstName,\r\n LastName: data[i].LastName,\r\n Email: data[i].Email,\r\n Subsidiary: data[i].Subsidiary.Name,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'ORFC': //Oracle Cloud\r\n data[i] = {\r\n UserName: data[i].UserName,\r\n FirstName: data[i].FirstName,\r\n LastName: data[i].LastName,\r\n Email: data[i].Email,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'OR': //Oracle EBS\r\n data[i] = {\r\n UserName: data[i].Name,\r\n Description: data[i].Description,\r\n Email: data[i].Email,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'SF': //Salesforce\r\n data[i] = {\r\n FirstName: data[i].FirstName,\r\n LastName: data[i].LastName,\r\n Alias: data[i].Alias,\r\n Email: data[i].Email,\r\n UserName: data[i].Username,\r\n NickName: data[i].Nickname,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'AAD': //Azure Active Directory now Entra ID\r\n data[i] = {\r\n DisplayName: data[i].DisplayName,\r\n UserName: data[i].UserPrincipalName,\r\n FirstName: data[i].GivenName,\r\n LastName: data[i].SurName,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'AX': //Dynamics AX 2012\r\n data[i] = {\r\n UserID: data[i].UserId,\r\n UserName: data[i].UserName,\r\n Company: data[i].Company,\r\n Email: data[i].Email,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'D365S': //Dynamics 365 CE\r\n data[i] = {\r\n FirstName: data[i].FirstName,\r\n LastName: data[i].LastName,\r\n Email: data[i].InternalEmailAddress,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'GP': //Dynamics GP\r\n data[i] = {\r\n UserID: data[i].Id,\r\n UserName: data[i].UserName,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'NAV': //Dynamics NAV\r\n data[i] = {\r\n UserName: data[i].UserName,\r\n FullName: data[i].FullName,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n case 'PS': //Peoplesoft\r\n data[i] = {\r\n UserID: data[i].UserId,\r\n Description: data[i].Description,\r\n PrimaryEmail: data[i].PrimaryEmail,\r\n ProductId: data[i].ProductId\r\n };\r\n break;\r\n default:\r\n data[i] = {\r\n Name: data[i].Name,\r\n Email: data[i].Email,\r\n ProductId: data[i].ProductId\r\n }\r\n break;\r\n }\r\n } else {\r\n data[i] = { //SAP User case\r\n FirstName: data[i][0].FirstName,\r\n LastName: data[i][0].LastName,\r\n Email: data[i][0].Email,\r\n User: data[i][0].UserName,\r\n ProductId: data[i][0].ProductId\r\n }\r\n }\r\n }\r\n }\r\n\r\n //Returns the type of value\r\n function typeOf(value) {\r\n return typeof value; \r\n }\r\n\r\n //Functions to add AppId and ProductId onto each access item. Used for display purposes on UI side\r\n function prepareAADAccessItem(access) {\r\n access.AppId = aad_application_id;\r\n access.ProductId = 'AAD';\r\n\r\n return access;\r\n }\r\n function prepareAX7AccessItem(access) {\r\n access.AppId = ax7_application_id;\r\n access.ProductId = 'AX7';\r\n\r\n return access;\r\n }\r\n function prepareAX2012AccessItem(access) {\r\n access.AppId = ax_application_id;\r\n access.ProductId = 'AX';\r\n\r\n return access;\r\n }\r\n function prepareORAccessItem(access) {\r\n access.AppId = oracle_application_id;\r\n access.ProductId = 'OR';\r\n\r\n return access;\r\n }\r\n function prepareORFCAccessItem(access) {\r\n access.AppId = oracleCloud_application_id;\r\n access.ProductId = 'ORFC';\r\n\r\n return access;\r\n }\r\n function prepareNSAccessItem(access) {\r\n access.AppId = netsuite_application_id;\r\n access.ProductId = 'NS';\r\n\r\n return access;\r\n }\r\n function prepareUniversalAccessItem(access, productName) {\r\n access.AppId = universalProduct_application_id;\r\n access.ProductId = productName;\r\n return access;\r\n }\r\n function prepareSAPAccessItem(access) {\r\n access.AppId = sap_application_id;\r\n\r\n return access;\r\n }\r\n function prepareNAVAccessItem(access) {\r\n access.AppId = nav_application_id;\r\n access.ProductId = 'NAV';\r\n\r\n return access;\r\n }\r\n function prepareGPAccessItem(access) {\r\n access.AppId = gp_application_id;\r\n access.ProductId = 'GP';\r\n\r\n return access;\r\n }\r\n function prepareD365SAccessItem(access) {\r\n access.AppId = d365s_application_id;\r\n access.ProductId = 'D365S';\r\n\r\n return access;\r\n }\r\n function preparePSAccessItem(access) {\r\n access.AppId = ps_application_id;\r\n access.ProductId = 'PS';\r\n\r\n return access;\r\n }\r\n function prepareSalesforceAccessItem(access) {\r\n access.AppId = salesforce_application_id;\r\n access.ProductId = 'SF';\r\n\r\n return access;\r\n }\r\n this.searchByKey = function (obj, key) {\r\n for (var i in obj) {\r\n if (obj[i].Key == key) {\r\n return obj[i].Value;\r\n }\r\n }\r\n return 0;\r\n };\r\n}\r\n\r\nconst appMap = [{\r\n key: \"AadUser\",\r\n id: aad_application_id\r\n}, {\r\n key: \"Ax7User\",\r\n id: ax7_application_id\r\n}, {\r\n key: \"AxUser\",\r\n id: ax_application_id\r\n}, {\r\n key: \"D365SUser\",\r\n id: d365s_application_id\r\n}, {\r\n key: \"EbsUser\",\r\n id: oracle_application_id\r\n}, {\r\n key: \"GPUser\",\r\n id: gp_application_id\r\n}, {\r\n key: \"NavUser\",\r\n id: nav_application_id\r\n}, {\r\n key: \"NetSuiteUser\",\r\n id: netsuite_application_id\r\n}, {\r\n key: \"OrfcUser\",\r\n id: oracleCloud_application_id\r\n}, {\r\n key: \"PsUserRequest\",\r\n id: ps_application_id\r\n}, {\r\n key: \"SfUserRequest\",\r\n id: salesforce_application_id\r\n}, {\r\n key: \"SapUser\",\r\n id: sap_application_id\r\n}, {\r\n key: \"UvUser\",\r\n id: universalProduct_application_id\r\n}];\r\n\r\nfunction setVisibleAndSelectedApps(data, app) {\r\n let map = appMap.find(item => item.id === app.Id),\r\n appData = data[map.key],\r\n isArray = Array.isArray(appData),\r\n errors = data.Errors,\r\n subApp;\r\n\r\n if (appData && !isArray) {\r\n app.selected = true;\r\n app.Visible = true;\r\n } else if (!isArray) {\r\n app.Visible = false;\r\n } else if (isArray && appData.length) {\r\n subApp = appData.find(application => application.ProductId === app.ProductID);\r\n\r\n if (subApp) {\r\n app.Visible = true;\r\n app.selected = true;\r\n } else {\r\n app.Visible = false;\r\n }\r\n } else {\r\n app.Visible = false;\r\n }\r\n\r\n // If app has errors, make sure it is visible\r\n if (!app.Visible && !isArray) {\r\n app.Visible = errors.some(error => error.ApplicationID === app.Id);\r\n } else if (!app.Visible && subApp) {\r\n app.Visible = errors.some(error => error.ApplicationID === subApp.Id);\r\n }\r\n\r\n return app;\r\n}\r\n","export default /*@ngInject*/ function ($q, RequestManagementNAVService) {\r\n\r\n var self = this;\r\n\r\n this.loadNAV = function ($scope, openRequest) {\r\n //Load Data for Products after search row is selected\r\n var navDfrd = $.Deferred();\r\n\r\n self.loadNAVData($scope);\r\n\r\n try {\r\n self.loadPermissions($scope, openRequest).then(function () {\r\n navDfrd.resolve();\r\n }, function errorCallback(response) {\r\n navDfrd.reject(response);\r\n });\r\n }\r\n catch (e) {\r\n navDfrd.reject(e);\r\n }\r\n\r\n return $.when(navDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.loadPermissions = function ($scope) {\r\n let permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n navPermissionSets = [],\r\n navUserGroups = [],\r\n pendingPermissionSets = $scope.vm.User?.NAVUser?.PendingPermissionSets || [],\r\n pendingUserGroups = $scope.vm.User?.NAVUser?.PendingUserGroups || [];\r\n\r\n $scope.vm.ListOfSelectedNAVPermissionSets = [];\r\n $scope.vm.ListOfAvailableNAVPermissionSets = [];\r\n $scope.vm.ListOfSelectedNAVUserGroups = [];\r\n $scope.vm.ListOfAvailableNAVUserGroups = [];\r\n\r\n if ($scope.vm.User.NAVUser != null) {\r\n navPermissionSets = $scope.vm.User.NAVUser.PermissionSets;\r\n navUserGroups = $scope.vm.User.NAVUser.UserGroups;\r\n }\r\n\r\n //Load Available NAV Roles then process existing security\r\n promises.push(\r\n RequestManagementNAVService.getAllPermissionSets().then(response => {\r\n $scope.vm.ListOfAvailableNAVPermissionSets = response.data.filter(applyPending.bind(null, pendingPermissionSets));\r\n })\r\n );\r\n\r\n promises.push(RequestManagementNAVService.getAllCompanies().then(response => {\r\n $scope.vm.ListOfNAVCompanies = response.data;\r\n }));\r\n\r\n promises.push(RequestManagementNAVService.getAllProfiles().then(response => {\r\n $scope.vm.NAVProfileDataSource = response.data;\r\n }));\r\n\r\n promises.push(RequestManagementNAVService.getAllUserGroups().then(response => {\r\n $scope.vm.ListOfAvailableNAVUserGroups = response.data.filter(applyPending.bind(null, pendingUserGroups));\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) {\r\n let defaultPermissionSets = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Permission Set\" && role.ProductType === \"NAV\");\r\n\r\n navPermissionSets = [...defaultPermissionSets];\r\n }\r\n\r\n if (navPermissionSets != null && $scope.vm.ListOfSelectedNAVPermissionSets != null) {\r\n let permissionSetArray = [];\r\n\r\n navPermissionSets.reduce(consolidatePermissionSets, permissionSetArray);\r\n\r\n function consolidatePermissionSets(permissions, item) {\r\n let permission = permissions.find(p => p.Id === item.Id);\r\n\r\n if (permission) {\r\n permission.Companies.push({\r\n Name: item.Company\r\n });\r\n permission.CompanyNames.push(item.Company);\r\n } else {\r\n item = {\r\n Id: item.Id,\r\n Name: item.Name,\r\n Companies: [{\r\n Name: item.Company\r\n }],\r\n CompanyNames: [item.Company]\r\n }\r\n permissions.push(item);\r\n }\r\n\r\n return permissions;\r\n }\r\n\r\n permissionSetArray.forEach(function (role) {\r\n if ($scope.vm.ListOfSelectedNAVPermissionSets.none(selectedRole => selectedRole.Id == role.Id)) {\r\n\r\n $scope.vm.ListOfSelectedNAVPermissionSets.unshift({\r\n Id: role.Id,\r\n Name: role.Name,\r\n IsAssignable: role.IsAssignable,\r\n Identifier: role.Identifier,\r\n Companies: role.Companies,\r\n CompanyNames: role.CompanyNames,\r\n Pending: pendingPermissionSets.some(pendingPermissionSet => pendingPermissionSet.Id === role.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableNAVPermissionSets.forEach((row, j) => {\r\n if (row.Id == role.Id) {\r\n $scope.vm.ListOfAvailableNAVPermissionSets.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (navUserGroups != null && $scope.vm.ListOfSelectedNAVUserGroups != null) {\r\n //Group all the companies for each Permission Set under one single permission set\r\n let userGroupArray = [];\r\n\r\n navUserGroups.reduce(consolidateUserGroups, userGroupArray);\r\n\r\n function consolidateUserGroups(userGroups, item) {\r\n let userGroup = userGroups.find(group => group.Id === item.Id);\r\n\r\n if (userGroup) {\r\n userGroup.Companies.push({\r\n Name: item.Company\r\n });\r\n userGroup.CompanyNames.push(item.Company);\r\n } else {\r\n item = {\r\n Id: item.Id,\r\n Name: item.Name,\r\n PermissionSets: item.PermissionSets,\r\n Companies: [{\r\n Name: item.Company\r\n }],\r\n CompanyNames: [item.Company]\r\n }\r\n userGroups.push(item);\r\n }\r\n\r\n return userGroups;\r\n }\r\n\r\n userGroupArray.forEach(function (userGroup) {\r\n if ($scope.vm.ListOfSelectedNAVUserGroups.none(selectedUserGroup => selectedUserGroup.Id === userGroup.Id)) {\r\n\r\n $scope.vm.ListOfSelectedNAVUserGroups.unshift({\r\n Id: userGroup.Id,\r\n Name: userGroup.Name,\r\n Companies: userGroup.Companies,\r\n CompanyNames: userGroup.CompanyNames,\r\n Pending: pendingUserGroups.some(pendingUserGroup => pendingUserGroup.Id === userGroup.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableNAVUserGroups.forEach((row, j) => {\r\n if (row.Id === userGroup.Id) {\r\n $scope.vm.ListOfAvailableNAVUserGroups.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n $scope.vm.ListOfAvailableNAVPermissionSets = $scope.vm.ListOfAvailableNAVPermissionSets.filter(permissionSet => permissionSet.IsAssignable);\r\n $scope.navUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.loadNAVData = function ($scope) {\r\n if ($scope.vm.User.NAVUser == null) {\r\n $scope.vm.User.NAVUser = {};\r\n $scope.vm.User.NAVUser.State = '0';\r\n }\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Id === item.Id);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n this.getNAVLicenseTypes = function () {\r\n\r\n return [\r\n {\r\n Name: 'Full User',\r\n Id: 0\r\n },\r\n {\r\n Name: 'Limited User',\r\n Id: 1\r\n },\r\n {\r\n Name: 'Device Only User',\r\n Id: 2\r\n },\r\n {\r\n Name: 'Windows Group',\r\n Id: 3\r\n },\r\n {\r\n Name: 'External User',\r\n Id: 4\r\n }\r\n ];\r\n };\r\n\r\n\r\n this.getExistingNAVUserSecurity = function (userId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/nav/employees/userid/' + userId + '/'\r\n });\r\n };\r\n\r\n this.getAllPermissionSets = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/nav/permissionsets'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading NAV Permission Sets';\r\n }\r\n };\r\n\r\n this.getAllCompanies = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/nav/companies'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading NAV Companies';\r\n }\r\n };\r\n\r\n this.getAllProfiles = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/nav/profiles'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading NAV Profiles';\r\n }\r\n };\r\n\r\n this.getAllUserGroups = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/nav/usergroups'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading NAV User Groups';\r\n }\r\n };\r\n\r\n this.getClassesBySubsidiary = function (subsidiaryId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/nav/subsidiaries/' + subsidiaryId + '/classes'\r\n });\r\n };\r\n\r\n\r\n}","export default /*@ngInject*/ function ($q, RequestManagementNetSuiteService) {\r\n\r\n var self = this;\r\n\r\n this.loadNetSuite = function ($scope, subsidiaryId, openRequest) {\r\n //Load Data for Products after search row is selected\r\n var netSuiteDfrd = $.Deferred();\r\n\r\n if (subsidiaryId != null) {\r\n self.loadNetSuiteData($scope, subsidiaryId);\r\n }\r\n\r\n try {\r\n self.loadPermissions($scope, openRequest).then(function () {\r\n netSuiteDfrd.resolve();\r\n }, function errorCallback(response) {\r\n netSuiteDfrd.reject(response);\r\n });\r\n }\r\n catch (e) {\r\n netSuiteDfrd.reject(e);\r\n }\r\n\r\n return $.when(netSuiteDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.loadPermissions = function ($scope, openRequest) {\r\n let permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n nsRoles = [],\r\n nsPermissions = [],\r\n pendingRoles = $scope.vm.User?.NetSuiteUser?.PendingRoles || [],\r\n pendingPermissions = $scope.vm.User?.NetSuiteUser?.PendingPermissions || [];\r\n\r\n $scope.vm.ListOfSelectedNetSuiteRoles = [];\r\n $scope.vm.ListOfSelectedNetSuitePermissions = [];\r\n\r\n if ($scope.vm.User.NetSuiteUser != null) {\r\n\r\n //If any nsRoles are selected in the request set the nsRoles valid property to true below\r\n $scope.vm.numberOfNetSuiteRolesValid = false;\r\n\r\n nsRoles = $scope.vm.User.NetSuiteUser.Roles;\r\n nsPermissions = $scope.vm.User.NetSuiteUser.Permissions;\r\n\r\n if (nsRoles.length > 0) {\r\n $scope.vm.numberOfNetSuiteRolesValid = true;\r\n }\r\n }\r\n\r\n //Load Available nsRoles then process existing security\r\n promises.push(\r\n RequestManagementNetSuiteService.getAllRoles().then(response => {\r\n $scope.vm.ListOfAvailableNetSuiteRoles = response.data.map(applyPending.bind(null, pendingRoles));\r\n })\r\n );\r\n\r\n //Load Levels list for existing users global nsPermissions. also pre selecting level in the dropdown\r\n promises.push(RequestManagementNetSuiteService.getAllPermissions().then(response => {\r\n $scope.vm.ListOfAvailableNetSuitePermissions = response.data.map(applyPending.bind(null, pendingPermissions));\r\n }));\r\n\r\n promises.push(RequestManagementNetSuiteService.getAllSubsidiaries().then(function (response) {\r\n $scope.vm.NSSubsidaryDataSource = response.data;\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductType === \"NS\");\r\n\r\n if (defaultRoles.length) {\r\n $scope.vm.numberOfNetSuiteRolesValid = true;\r\n }\r\n\r\n $scope.vm.ListOfSelectedNetSuiteRoles = [...defaultRoles];\r\n $scope.vm.ListOfAvailableNetSuiteRoles = $scope.vm.ListOfAvailableNetSuiteRoles.filter(availableRole => {\r\n let selectedRole = $scope.vm.ListOfSelectedNetSuiteRoles.find(selectedRole => selectedRole.Identifier === availableRole.Identifier);\r\n\r\n if (selectedRole) {\r\n selectedRole = Object.merge(selectedRole, availableRole);\r\n }\r\n\r\n return !selectedRole;\r\n });\r\n } else if (nsRoles != null && $scope.vm.ListOfSelectedNetSuiteRoles != null) {\r\n nsRoles.forEach(function (role) {\r\n if ($scope.vm.ListOfSelectedNetSuiteRoles.none(selectedRole => selectedRole.Id === role.Id)) {\r\n\r\n $scope.vm.ListOfSelectedNetSuiteRoles.unshift({\r\n Id: role.Id,\r\n Name: role.Name,\r\n IsAssignable: role.IsAssignable,\r\n Identifier: role.Identifier,\r\n Pending: pendingRoles.find(pendingRole => pendingRole.Id === role.Id)\r\n });\r\n }\r\n\r\n if ($scope.vm.ListOfAvailableNetSuiteRoles.some(availableRole => {\r\n return availableRole.Id === role.Id;\r\n })) {\r\n $scope.vm.ListOfAvailableNetSuiteRoles.forEach(function (row, j) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableNetSuiteRoles.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n //Global Permissions\r\n var foundItemArray = [];\r\n foundItemArray = [];\r\n\r\n var availPermission = null;\r\n var level = null;\r\n var globalPermissionAccess = null;\r\n\r\n //Load user's existing permissions\r\n if (nsPermissions != null && $scope.vm.ListOfAvailableNetSuitePermissions != null) {\r\n nsPermissions.forEach(function (globalPermission) {\r\n\r\n availPermission = $scope.vm.ListOfAvailableNetSuitePermissions.filter(e => e.Id == globalPermission.Id)[0];\r\n\r\n if (globalPermission.EventType == \"Revoke\") {\r\n //Dont add the item to the selected list\r\n }\r\n else {\r\n if (availPermission != null && availPermission.Levels != null) {\r\n level = availPermission.Levels.filter(e => e.Id == globalPermission.Levels[0].Id)[0];\r\n\r\n //Only add it to the list if it's not already there\r\n if ($scope.vm.ListOfSelectedNetSuitePermissions != null && $scope.vm.ListOfSelectedNetSuitePermissions.none(role => role.Id == globalPermission.Id)) {\r\n //Do not modify the lists if the global permission is in the request access list\r\n if ($scope.vm.reqAccesses == null || $scope.vm.reqAccesses != null && $scope.vm.reqAccesses.none(raGlobalPermission => JSON.parse(raGlobalPermission.Access.Id) == globalPermission.Id)) {\r\n $scope.vm.ListOfSelectedNetSuitePermissions.unshift({\r\n Id: globalPermission.Id,\r\n Name: globalPermission.Name,\r\n Levels: availPermission.Levels,\r\n selectedLevel: level,\r\n Pending: pendingPermissions.find(pendingPermission => pendingPermission.Id === globalPermission.Id)\r\n });\r\n\r\n $scope.vm.existingGlobalPermissions.unshift({\r\n Id: globalPermission.Id,\r\n Name: globalPermission.Name,\r\n Levels: availPermission.Levels,\r\n selectedLevel: level,\r\n Pending: pendingPermissions.find(pendingPermission => pendingPermission.Id === globalPermission.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableNetSuitePermissions.forEach(function (row, j) {\r\n if (row.Id == globalPermission.Id) {\r\n $scope.vm.ListOfAvailableNetSuitePermissions.splice(j, 1);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.vm.ListOfAvailableNetSuiteRoles = $scope.vm.ListOfAvailableNetSuiteRoles.filter(role => role.IsAssignable);\r\n $scope.netSuiteUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.loadNetSuiteData = function ($scope, subsidiaryId) {\r\n RequestManagementNetSuiteService.getDepartmentsBySubsidiary(subsidiaryId).then(function (response) {\r\n $scope.vm.NSDepartmentDataSource = response.data;\r\n });\r\n\r\n RequestManagementNetSuiteService.getClassesBySubsidiary(subsidiaryId).then(function (response) {\r\n $scope.vm.NSClassDataSource = response.data;\r\n });\r\n\r\n RequestManagementNetSuiteService.getLocationsBySubsidiary(subsidiaryId).then(function (response) {\r\n $scope.vm.NSLocationDataSource = response.data;\r\n });\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Id === item.Id);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n this.getExistingNetSuiteUserSecurity = function (userId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/employees/userid/' + userId + '/'\r\n });\r\n };\r\n\r\n this.getAllRoles = function () {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/roles'\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading NetSuite Roles';\r\n }\r\n };\r\n\r\n this.getAllPermissions = function (userId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/permissions'\r\n });\r\n };\r\n\r\n this.getAllSubsidiaries = function (userId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/subsidiaries'\r\n });\r\n };\r\n\r\n this.getDepartmentsBySubsidiary = function (subsidiaryId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/subsidiaries/' + subsidiaryId + '/departments'\r\n });\r\n };\r\n\r\n this.getClassesBySubsidiary = function (subsidiaryId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/subsidiaries/' + subsidiaryId + '/classes'\r\n });\r\n };\r\n\r\n this.getLocationsBySubsidiary = function (subsidiaryId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/subsidiaries/' + subsidiaryId + '/locations'\r\n });\r\n };\r\n\r\n}","export default /*@ngInject*/ function (RequestManagementOracleCloudService) {\r\n //Load Oracle Cloud roles, if an Oracle Cloud user exists move their roles into the selected list\r\n this.loadOracleCloud = function ($scope) {\r\n var orDfrd = $.Deferred();\r\n\r\n $scope.vm.ListOfAvailableOracleCloudRolesIsLoading = true;\r\n\r\n RequestManagementOracleCloudService.getOracleCloudRoles().then(response => {\r\n let pendingRoles = $scope.vm.User?.OracleCloudUser?.PendingRoles || [];\r\n\r\n $scope.vm.ListOfAvailableOracleCloudRoles = [];\r\n $scope.vm.ListOfSelectedOracleCloudRoles = [];\r\n\r\n $scope.vm.ListOfAvailableOracleCloudRoles = response.data.filter(applyPending.bind(null, pendingRoles));\r\n\r\n $scope.vm.ListOfAvailableOracleCloudRolesIsLoading = false;\r\n\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductType === \"ORFC\");\r\n\r\n $scope.vm.User.OracleCloudUser.Roles = [...defaultRoles];\r\n }\r\n\r\n if ($scope.vm.User.OracleCloudUser != null && $scope.vm.User.OracleCloudUser.Roles != null) {\r\n $scope.vm.User.OracleCloudUser.Roles.forEach(role => {\r\n var oracleCloudRole = null;\r\n if ($scope.vm.ListOfAvailableOracleCloudRoles != null) {\r\n //Get role information from the available roles list\r\n oracleCloudRole = $scope.vm.ListOfAvailableOracleCloudRoles.find(object => object.RoleID === role.RoleID);\r\n // Add already selected Roles\r\n if (oracleCloudRole != null) {\r\n $scope.vm.ListOfSelectedOracleCloudRoles.unshift({\r\n RoleID: oracleCloudRole.RoleID,\r\n Id: oracleCloudRole.Id,\r\n IsAssignable: oracleCloudRole.IsAssignable,\r\n Identifier: oracleCloudRole.Identifier,\r\n RoleName: oracleCloudRole.RoleName,\r\n DisplayName: oracleCloudRole.DisplayName,\r\n Description: oracleCloudRole.Description,\r\n ProductId: oracleCloudRole.ProductId,\r\n Pending: pendingRoles.find(pendingRole => pendingRole.RoleID === oracleCloudRole.RoleID)\r\n });\r\n // Remove them from Available list\r\n $scope.vm.ListOfAvailableOracleCloudRoles.forEach(function (row, j) {\r\n if (row.RoleID == oracleCloudRole.RoleID) {\r\n $scope.vm.ListOfAvailableOracleCloudRoles.splice(j, 1);\r\n }\r\n });\r\n }\r\n\r\n oracleCloudRole = null;\r\n\r\n $scope.vm.numberOfOracleCloudRolesValid = true;\r\n }\r\n });\r\n\r\n $scope.oracleCloudUserLoaded = true;\r\n }\r\n\r\n $scope.vm.ListOfAvailableOracleCloudRoles = $scope.vm.ListOfAvailableOracleCloudRoles.filter(role => role.IsAssignable);\r\n orDfrd.resolve();\r\n });\r\n\r\n return $.when(orDfrd).done(function () {\r\n }).promise();\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.RoleID === item.RoleID);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n this.getPasswordExpirationTypes = function () {\r\n return [\r\n 'Days',\r\n 'Accesses',\r\n 'None'\r\n ];\r\n };\r\n\r\n this.getOracleCloudRoles = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/orfc/roles'\r\n });\r\n };\r\n\r\n}","export default /*@ngInject*/ function (RequestManagementOracleService) {\r\n //Load Oracle responsibilities, if an Oracle user exists move their roles into the selected list\r\n this.loadOracle = async function ($scope) {\r\n var orDfrd = $.Deferred();\r\n\r\n $scope.vm.ORRBACEnabled = JSON.parse(localStorage.getItem('ConfigurationValues'))['OR_RBACEnabled'] === '1' ? true : false;\r\n\r\n RequestManagementOracleService.getOracleResponsibilities().then(function (response) {\r\n let pendingResponsibilities = $scope.vm.User?.OracleUser?.PendingResponsibilities || [];\r\n\r\n $scope.vm.ListOfAvailableOracleResponsibilities = [];\r\n $scope.vm.ListOfSelectedOracleResponsibilities = [];\r\n\r\n $scope.vm.ListOfAvailableOracleResponsibilities = response.data.filter(applyPending.bind(null, pendingResponsibilities));\r\n\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\") {\r\n let defaultResponsibilities = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Responsibility\" && role.ProductType === \"OR\");\r\n\r\n $scope.vm.User.OracleUser = {\r\n Responsibilities: [...defaultResponsibilities]\r\n }\r\n }\r\n\r\n if ($scope.vm.User.OracleUser != null && $scope.vm.User.OracleUser.Responsibilities != null) {\r\n $scope.vm.User.OracleUser.Responsibilities.forEach(responsibility => {\r\n var oracleResponsibility = null;\r\n if ($scope.vm.ListOfAvailableOracleResponsibilities != null) {\r\n //Get the responsibility information from the available oracleResponsibilities list\r\n oracleResponsibility = $scope.vm.ListOfAvailableOracleResponsibilities.find(object => object.Id === responsibility.Id && object.ApplicationId === responsibility.ApplicationId);\r\n\r\n if (oracleResponsibility != null) {\r\n $scope.vm.ListOfSelectedOracleResponsibilities.unshift({\r\n Id: oracleResponsibility.Id,\r\n Name: oracleResponsibility.Name,\r\n IsAssignable: oracleResponsibility.IsAssignable,\r\n Identifier: oracleResponsibility.Identifier,\r\n ApplicationId: oracleResponsibility.ApplicationId,\r\n ApplicationShortName: oracleResponsibility.ApplicationShortName,\r\n Key: oracleResponsibility.Key,\r\n Pending: pendingResponsibilities.find(pendingResponsibility => pendingResponsibility.Id === oracleResponsibility.Id)\r\n });\r\n\r\n $scope.vm.ListOfAvailableOracleResponsibilities.forEach(function (row, j) {\r\n if (row.Id == oracleResponsibility.Id) {\r\n $scope.vm.ListOfAvailableOracleResponsibilities.splice(j, 1);\r\n }\r\n });\r\n }\r\n\r\n oracleResponsibility = null;\r\n\r\n $scope.vm.numberOfOracleResponsibilitiesValid = true;\r\n }\r\n });\r\n\r\n $scope.oracleUserLoaded = true;\r\n }\r\n\r\n $scope.vm.ListOfAvailableOracleResponsibilities = $scope.vm.ListOfAvailableOracleResponsibilities.filter(responsibility => responsibility.IsAssignable);\r\n orDfrd.resolve();\r\n });\r\n\r\n if ($scope.vm.ORRBACEnabled) {\r\n RequestManagementOracleService.getOracleRoles().then(function (response) {\r\n let pendingRoles = $scope.vm.User?.OracleUser?.PendingRoles || [];\r\n\r\n $scope.vm.ListOfAvailableOracleRoles = response.data.filter(applyPendingByName.bind(null, pendingRoles));\r\n\r\n if ($scope.vm.User.OracleUser != null && $scope.vm.User.OracleUser.Roles != null) {\r\n $scope.vm.User.OracleUser.Roles.forEach(function (role) {\r\n var oracleRole = null;\r\n if ($scope.vm.ListOfAvailableOracleRoles != null) {\r\n //Get the role information from the available oracleRoles list\r\n oracleRole = $scope.vm.ListOfAvailableOracleRoles.find(object => object.Name === role.Name);\r\n\r\n if (oracleRole) {\r\n $scope.vm.ListOfSelectedOracleRoles.unshift({\r\n DisplayName: oracleRole.DisplayName,\r\n IsAssignable: oracleRole.IsAssignable,\r\n Name: oracleRole.Name,\r\n ProductId: oracleRole.ProductId,\r\n Pending: pendingRoles.find(pendingRole => pendingRole.Name === oracleRole.Name)\r\n });\r\n\r\n $scope.vm.ListOfAvailableOracleRoles.forEach(function (row, j) {\r\n if (row.Name === oracleRole.Name) {\r\n $scope.vm.ListOfAvailableOracleRoles.splice(j, 1);\r\n }\r\n });\r\n }\r\n\r\n oracleRole = null;\r\n\r\n $scope.vm.numberOfOracleResponsibilitiesValid = true;\r\n }\r\n });\r\n\r\n $scope.oracleUserLoaded = true;\r\n }\r\n\r\n $scope.vm.ListOfAvailableOracleRoles = $scope.vm.ListOfAvailableOracleRoles.filter(role => role.IsAssignable);\r\n orDfrd.resolve();\r\n });\r\n }\r\n\r\n return $.when(orDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Id === item.Id);\r\n }\r\n\r\n return item;\r\n}\r\n\r\nfunction applyPendingByName(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Name === item.Name);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n this.getPasswordExpirationTypes = function () {\r\n return [\r\n 'Days',\r\n 'Accesses',\r\n 'None'\r\n ];\r\n };\r\n\r\n this.getOracleResponsibilities = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/or/responsibilities'\r\n });\r\n };\r\n\r\n this.getOracleRoles = function () {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/or/roles'\r\n });\r\n };\r\n\r\n this.getOracleProductConfig = function () {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/universal/products/or/configuration`\r\n });\r\n };\r\n}","export default /*@ngInject*/ function ($http, $q, RequestManagementSAPService) {\r\n\r\n this.loadSAP = function ($scope, application) {\r\n //Load Data for Products after search row is selected\r\n var sapDfrd = $.Deferred();\r\n\r\n if (!$scope.vm.User.SAPUser) {\r\n // Need to set up the User Objects for each SAP instance\r\n $scope.vm.User.SAPUser = {};\r\n }\r\n\r\n if (!$scope.vm.User.SAPUser[application.ProductName]) {\r\n $scope.vm.User.SAPUser[application.ProductName] = {};\r\n $scope.vm.User.SAPUser[application.ProductName].ProductType = application.ProductType;\r\n }\r\n\r\n loadPermissions($scope, application).done(function () {\r\n sapDfrd.resolve();\r\n });\r\n\r\n return $.when(sapDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n this.loadSAPRoleObjects = async function ($scope, application) {\r\n $scope.vm.loadingSAPRoleObjects = true;\r\n let data = [], compositeRoleData, compositeRoleIds, response;\r\n $scope.vm.ListOfSelectedSAPSingleRoles[application.ProductName].forEach(role => data.push(role.Identifier));\r\n // get role ids from composite roles because we can't get tCodes based on Composite Role Identifiers\r\n compositeRoleData = {\r\n ProductId: application.ProductID,\r\n CompositeRoleIds: $scope.vm.ListOfSelectedSAPCompositeRoles[application.ProductName].map(compositeRole => compositeRole.Identifier)\r\n };\r\n compositeRoleIds = await RequestManagementSAPService.getRolesByCompositeRole(compositeRoleData);\r\n // add the ids for the roles that come from the composite roles\r\n data = data.concat(compositeRoleIds.data.map(compRole => compRole.RoleIdentifier));\r\n\r\n response = await $http.post(`${apiUrl}api/universal/securityobjects/securityroles`, data);\r\n response.data = response.data.filter(role => role.SecurityObjectTypeId === \"TCode\");\r\n\r\n $scope.vm.ListOfAvailableSAPRoleObjects[application.ProductName] = response.data;\r\n $scope.vm.ListOfSelectedSAPRoleObjects[application.ProductName] = [];\r\n\r\n $scope.vm.loadingSAPRoleObjects = false;\r\n };\r\n\r\n var loadPermissions = function ($scope, application) {\r\n var permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n sapRoles = [],\r\n sapCompositeRoles = [],\r\n pendingRoles = $scope.vm.User?.SAPUser?.[application.ProductName]?.PendingRoles || [];\r\n\r\n if ($scope.vm.User.SAPUser && $scope.vm.User.SAPUser[application.ProductName] && $scope.vm.User.SAPUser[application.ProductName].ProductName === application.ProductName) {\r\n if ($scope.vm.alternatePath === 'EmergencyAccess') {\r\n $scope.vm.User.SAPUser[application.ProductName].Roles = $scope.vm.User.SAPUser[application.ProductName].Roles.filter(role => role.IsEmergencyAccess);\r\n }\r\n sapRoles = $scope.vm.User.SAPUser[application.ProductName].Roles.filter(role => !role.IsComposite);\r\n sapCompositeRoles = $scope.vm.User.SAPUser[application.ProductName].Roles.filter(compositeRole => compositeRole.IsComposite);\r\n }\r\n\r\n //Load Available sapRoles then process existing security\r\n promises.push(RequestManagementSAPService.getAllRoles(application.ProductID).then(function (response) {\r\n if ($scope.vm.alternatePath === 'EmergencyAccess') {\r\n // filter out roles that aren't emergency access designated\r\n response.data = response.data.filter(role => role.IsEmergencyAccess);\r\n // remove any emergency access roles the user already has from available roles\r\n if (response.data.length > 0 && $scope.vm.User.SAPUser[application.ProductName].Roles.length > 0) {\r\n response.data.forEach((role, index, allRolesArray) => {\r\n if ($scope.vm.User.SAPUser[application.ProductName].Roles.some(r => r.Identifier === role.Identifier)) {\r\n allRolesArray.splice(index, 1);\r\n }\r\n });\r\n }\r\n }\r\n // filter out composite roles to create a list of single roles\r\n $scope.vm.ListOfAvailableSAPSingleRoles[application.ProductName] = response.data.filter(item => !item.IsComposite).map(applyPending.bind(null, pendingRoles));\r\n $scope.vm.ListOfSelectedSAPSingleRoles[application.ProductName] = [];\r\n\r\n // filter out single roles to create a list of composite roles\r\n $scope.vm.ListOfAvailableSAPCompositeRoles[application.ProductName] = response.data.filter(item => item.IsComposite).map(applyPending.bind(null, pendingRoles));\r\n\r\n $scope.vm.ListOfSelectedSAPCompositeRoles[application.ProductName] = [];\r\n\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductType === application.ProductType);\r\n\r\n sapRoles = [...defaultRoles];\r\n sapCompositeRoles = [...defaultRoles];\r\n\r\n $scope.vm.User.SAPUser = {\r\n [application.ProductName]: {\r\n Roles: sapRoles\r\n }\r\n }\r\n }\r\n\r\n // Single Roles\r\n if (sapRoles.length > 0 && $scope.vm.alternatePath !== 'EmergencyAccess') {\r\n if ($scope.vm.User.SAPUser[application.ProductName] && $scope.vm.User.SAPUser[application.ProductName].Roles) {\r\n $scope.vm.User.SAPUser[application.ProductName].Roles.forEach(role => {\r\n var sapRole = null;\r\n\r\n if ($scope.vm.ListOfAvailableSAPSingleRoles[application.ProductName]) {\r\n //Get the role information from the available sapRoles list\r\n sapRole = $scope.vm.ListOfAvailableSAPSingleRoles[application.ProductName].find(object => object.Id === role.Id);\r\n\r\n if (sapRole) {\r\n $scope.vm.ListOfSelectedSAPSingleRoles[application.ProductName].unshift({\r\n Id: sapRole.Id,\r\n Name: sapRole.Name,\r\n IsAssignable: sapRole.IsAssignable,\r\n Identifier: sapRole.Identifier,\r\n IsComposite: sapRole.IsComposite,\r\n Pending: pendingRoles.some(pendingRole => pendingRole.Id === sapRole.Id && !sapRole.IsComposite)\r\n });\r\n\r\n $scope.vm.ListOfAvailableSAPSingleRoles[application.ProductName].forEach(function (row, j) {\r\n if (row.Id === sapRole.Id) {\r\n $scope.vm.ListOfAvailableSAPSingleRoles[application.ProductName].splice(j, 1);\r\n }\r\n });\r\n }\r\n\r\n sapRole = null;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Composite Roles\r\n if (sapCompositeRoles.length > 0 && $scope.vm.alternatePath !== 'EmergencyAccess') {\r\n if ($scope.vm.User.SAPUser[application.ProductName] && $scope.vm.User.SAPUser[application.ProductName].Roles) {\r\n $scope.vm.User.SAPUser[application.ProductName].Roles.forEach(function (role) {\r\n\r\n var sapCompositeRole = null;\r\n\r\n if ($scope.vm.ListOfAvailableSAPCompositeRoles[application.ProductName]) {\r\n //Get the role information from the available sapCompositeRoles list\r\n sapCompositeRole = $scope.vm.ListOfAvailableSAPCompositeRoles[application.ProductName].find(object => object.Id === role.Id);\r\n\r\n if (sapCompositeRole) {\r\n $scope.vm.ListOfSelectedSAPCompositeRoles[application.ProductName].unshift({\r\n Id: sapCompositeRole.Id,\r\n Name: sapCompositeRole.Name,\r\n IsAssignable: sapCompositeRole.IsAssignable,\r\n IsComposite: sapCompositeRole.IsComposite,\r\n Pending: pendingRoles.some(pendingRole => pendingRole.Id === sapCompositeRole.Id && sapCompositeRole.IsComposite)\r\n });\r\n\r\n\r\n $scope.vm.ListOfAvailableSAPCompositeRoles[application.ProductName].forEach(function (row, j) {\r\n if (row.Id === sapCompositeRole.Id) {\r\n $scope.vm.ListOfAvailableSAPCompositeRoles[application.ProductName].splice(j, 1);\r\n }\r\n });\r\n }\r\n\r\n sapCompositeRole = null;\r\n }\r\n });\r\n }\r\n }\r\n\r\n $scope.vm.ListOfAvailableSAPSingleRoles[application.ProductName] = $scope.vm.ListOfAvailableSAPSingleRoles?.[application.ProductName]?.filter(role => role.IsAssignable) || [];\r\n $scope.vm.ListOfAvailableSAPCompositeRoles[application.ProductName] = $scope.vm.ListOfAvailableSAPCompositeRoles?.[application.ProductName]?.filter(compositeRole => compositeRole.IsAssignable) || [];\r\n $scope.sapUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Id === item.Id);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n\r\n this.getSAPUserTypes = function () {\r\n\r\n return [\r\n {\r\n Name: 'Dialog',\r\n Id: \"A\"\r\n },\r\n {\r\n Name: 'System',\r\n Id: \"B\"\r\n },\r\n {\r\n Name: 'Communications Data',\r\n Id: \"C\"\r\n },\r\n {\r\n Name: 'Reference (Logon not possible)',\r\n Id: \"L\"\r\n },\r\n {\r\n Name: 'Service',\r\n Id: \"S\"\r\n }\r\n ];\r\n };\r\n\r\n this.getSAPUserData = function (productId, userId) {\r\n if (userID != null) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/sap/' + productId + '/users/' + userId\r\n });\r\n }\r\n };\r\n\r\n this.getAllRoles = function (productId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/sap/' + productId + '/roles'\r\n });\r\n };\r\n\r\n this.getRolesByCompositeRole = function (data) {\r\n return $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/identitymanager/sap/' + data.ProductId + '/roles/bycomposites',\r\n data: data\r\n })\r\n .catch(function (response) {\r\n errorsDataService.catch(response);\r\n });\r\n }\r\n\r\n this.getCollectionUsageSchedule = function (productId) {\r\n return $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/sap/' + productId + '/collectusageschedules'\r\n });\r\n }\r\n\r\n this.setCollectionUsageSchedule = async (productId, data) => {\r\n try {\r\n return await $http.post(`${apiUrl}api/identitymanager/sap/${productId}/collectusageschedules`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n this.deleteCollectionUsageSchedule = async (productId) => {\r\n try {\r\n return await $http.delete(`${apiUrl}api/identitymanager/sap/${productId}/collectusageschedules`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($q, RequestManagementUPService) {\r\n const vm = this;\r\n\r\n this.loadUP = function ($scope, application) {\r\n //Load Data for Products after search row is selected\r\n var upDfrd = $.Deferred();\r\n\r\n try {\r\n vm.loadPermissions($scope, application).then(function () {\r\n upDfrd.resolve();\r\n }, function errorCallback(response) {\r\n upDfrd.reject(response);\r\n });\r\n }\r\n catch (e) {\r\n upDfrd.reject(e);\r\n }\r\n\r\n return $.when(upDfrd).done(function () {\r\n }).promise();\r\n\r\n };\r\n\r\n this.loadPermissions = function ($scope, application) {\r\n var permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n upRoles = [],\r\n pendingRoles = $scope.vm.User?.UPUser?.[application.ProductName]?.PendingRoles || [];\r\n\r\n $scope.vm.ListOfSelectedUPRoles[application.ProductName] = [];\r\n $scope.vm.ListOfAvailableUPRoles[application.ProductName] = [];\r\n\r\n if ($scope.vm.User?.UPUser?.[application.ProductName].ProductName === application.ProductName) {\r\n //If any upRoles are selected in the request set the upRoles valid property to true below\r\n if (!$scope.vm.numberOfUPRolesValid) {\r\n $scope.vm.numberOfUPRolesValid = [];\r\n $scope.vm.numberOfUPRolesValid[application.ProductName] = null;\r\n }\r\n $scope.vm.numberOfUPRolesValid[application.ProductName] = null;\r\n upRoles = $scope.vm.User.UPUser[application.ProductName].Roles;\r\n\r\n if (upRoles.length > 0) {\r\n $scope.vm.numberOfUPRolesValid[application.ProductName] = true;\r\n }\r\n }\r\n\r\n //Load Available upRoles then process existing security\r\n promises.push(\r\n RequestManagementUPService.getAllRoles(application.ProductID).then(function (response) {\r\n $scope.vm.ListOfAvailableUPRoles[application.ProductName] = response.data.filter(applyPending.bind(null, pendingRoles));\r\n $scope.vm.ListOfSelectedUPRoles[application.ProductName] = [];\r\n })\r\n );\r\n\r\n promises.push(RequestManagementUPService.getAllCompanies(application.ProductID).then(function (response) {\r\n $scope.vm.ListOfUPCompanies[application.ProductName] = response.data;\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductName === application.ProductName);\r\n\r\n upRoles = [...defaultRoles];\r\n\r\n if (upRoles.length) {\r\n $scope.vm.numberOfUPRolesValid = {\r\n [application.ProductName]: true\r\n };\r\n }\r\n\r\n $scope.vm.User.UPUser = {\r\n [application.ProductName]: {\r\n Roles: upRoles.map(role => {\r\n role.Role = role;\r\n\r\n return role;\r\n })\r\n }\r\n }\r\n }\r\n if (upRoles.length > 0 && $scope.vm.User.UPUser[application.ProductName] && $scope.vm.User.UPUser[application.ProductName].Roles) {\r\n $scope.vm.User.UPUser[application.ProductName].Roles.forEach(role => {\r\n let upRole = null,\r\n selectedUpRole = null,\r\n selectedCompany = null;\r\n\r\n if ($scope.vm.ListOfAvailableUPRoles[application.ProductName]) {\r\n //Get the role information from the available upRoles list\r\n upRole = $scope.vm.ListOfAvailableUPRoles[application.ProductName].find(object => object.Id === role.Role.Id);\r\n\r\n //Check if the company Id has been set for the current role company\r\n if (role.Company != null) {\r\n selectedCompany = $scope.vm.ListOfUPCompanies[application.ProductName].find(object => object.CompanyId.toUpperCase() === role.Company.Id.toUpperCase());\r\n }\r\n\r\n //Check if the role already exists in the selected list\r\n selectedUpRole = $scope.vm.ListOfSelectedUPRoles[application.ProductName].find(object => object.Id.toUpperCase() === role.Role.Id.toUpperCase());\r\n //If the role already exists add the current company information to the company list\r\n if (selectedUpRole != null && selectedCompany != null) {\r\n if (selectedUpRole.Companies == null) {\r\n selectedUpRole.Companies = [];\r\n }\r\n if (selectedUpRole.Companies.none(company => company.CompanyId === selectedCompany.CompanyId)) {\r\n selectedUpRole.Companies.push(selectedCompany);\r\n }\r\n }\r\n\r\n if (upRole) {\r\n $scope.vm.ListOfSelectedUPRoles[application.ProductName].unshift({\r\n Id: upRole.Id,\r\n Name: upRole.Name,\r\n IsAssignable: upRole.IsAssignable,\r\n Identifier: upRole.Identifier,\r\n Companies: selectedCompany === null ? null : [selectedCompany],\r\n Pending: upRole.Pending\r\n });\r\n\r\n $scope.vm.ListOfAvailableUPRoles[application.ProductName].forEach(function (row, j) {\r\n if (row.Id === upRole.Id) {\r\n $scope.vm.ListOfAvailableUPRoles[application.ProductName].splice(j, 1);\r\n }\r\n });\r\n }\r\n\r\n upRole = null;\r\n $scope.vm.numberOfUPRolesValid[application.ProductName] = true;\r\n }\r\n });\r\n }\r\n\r\n $scope.vm.ListOfAvailableUPRoles[application.ProductName] = $scope.vm.ListOfAvailableUPRoles[application.ProductName].filter(role => role.IsAssignable);\r\n $scope.upUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Id === item.Id);\r\n }\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n this.getAllRoles = function (productId) {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/uv/roles/product/${productId}`\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading GP Roles';\r\n }\r\n };\r\n\r\n this.getAllCompanies = function (productId) {\r\n try {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/uv/companies/product/${productId}`\r\n });\r\n }\r\n catch (ex) {\r\n throw 'Error loading GP Companies';\r\n }\r\n };\r\n\r\n}","export default /*@ngInject*/ function (salesforceService) {\r\n this.loadSalesforce = async function ($scope) {\r\n let { data } = await salesforceService.getPermissionSets(),\r\n pendingPermissions = $scope.vm.User?.SalesforceUser?.PendingPermissionSets || [],\r\n licenseId = $scope.vm.User?.SalesforceUser?.Profile?.UserLicenseId,\r\n pendingLicenseId = $scope.vm.User?.SalesforceUser?.PendingProfile?.UserLicenseId,\r\n permission;\r\n\r\n $scope.vm.assignedSalesforcePermissionSets = [];\r\n $scope.vm.assignedSalesforceLicenseId = licenseId;\r\n $scope.vm.assignedSalesforceEmail = $scope.vm.User?.SalesforceUser?.Email;\r\n $scope.vm.showSalesforceLicenseChangeMessage = false;\r\n $scope.vm.salesforceLicensePending = pendingLicenseId && licenseId !== pendingLicenseId;\r\n // Needa master list to handle when User License Changes\r\n $scope.vm.ListOfAllSalesforcePermissionSets = data.filter(applyPending.bind(null, pendingPermissions));\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets = data.filter(applyPending.bind(null, pendingPermissions));\r\n\r\n if ($scope.vm.User.SalesforceUser != null && $scope.vm.User.SalesforceUser.PermissionSets != null) {\r\n $scope.vm.User.SalesforceUser.PermissionSets.forEach(permissionSet => {\r\n permission = $scope.vm.ListOfAvailableSalesforcePermissionSets.find(existingPermission => existingPermission.Id === permissionSet.Id);\r\n\r\n if (permission) {\r\n let selectedPermission = {\r\n Id: permission.Id,\r\n Name: permission.Name,\r\n Label: permission.Label,\r\n IsAssignable: permission.IsAssignable,\r\n Pending: pendingPermissions.find(pendingPermission => pendingPermission.Id === permission.Id)\r\n };\r\n\r\n $scope.vm.ListOfSelectedSalesforcePermissionSets.unshift(selectedPermission);\r\n\r\n $scope.vm.assignedSalesforcePermissionSets.unshift(selectedPermission);\r\n\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets = $scope.vm.ListOfAvailableSalesforcePermissionSets.filter(availablePermission => availablePermission.Id !== permission.Id);\r\n }\r\n\r\n $scope.vm.numberOfSalesforcePermissionSetsValid = true;\r\n });\r\n\r\n }\r\n\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets = $scope.vm.ListOfAvailableSalesforcePermissionSets.filter(permissionSet => permissionSet.IsAssignable);\r\n\r\n $scope.vm.ListOfAllSalesforcePermissionSets = angular.copy($scope.vm.ListOfAvailableSalesforcePermissionSets);\r\n $scope.salesforceUserLoaded = true;\r\n };\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Id === item.Id);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getUsers,\r\n getPermissionSets,\r\n getCountries,\r\n getUserLicenses,\r\n getProfiles,\r\n getRoles\r\n };\r\n\r\n return service;\r\n\r\n //GET Requests\r\n async function getUsers(search, field) {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/sf/users?search=${search}&field=${field}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getPermissionSets() {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/sf/permission-sets`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getCountries() {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/sf/countries`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getUserLicenses(params) {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/sf/profiles/user-licenses`, {params: params});\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getProfiles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/sf/profiles`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getRoles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/sf/profiles/user-roles`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n //AX 7 HTTP Calls\r\n this.getAllAADRoles = function () {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/aad/roles`\r\n });\r\n };\r\n\r\n this.getAllAADGroups = function () {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/aad/groups`\r\n });\r\n };\r\n\r\n this.getAllAADLicenses = function () {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/aad/licenses`\r\n });\r\n };\r\n\r\n this.getAADUserData = function (userId) {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/aad/users/${userId}`\r\n });\r\n };\r\n}","export default /*@ngInject*/ function ($q, RequestManagementAADService) {\r\n\r\n this.loadAAD = function ($scope) {\r\n var adDfrd = $.Deferred();\r\n\r\n loadAADPermissions($scope).done(function () {\r\n adDfrd.resolve();\r\n });\r\n\r\n return $.when(adDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n this.loadAADLoadPermisssions = function ($scope) {\r\n return loadAADPermissions($scope);\r\n };\r\n //Load the AAD permissions, after that completes and if there is an existing AAD user load their permissions\r\n function loadAADPermissions($scope) {\r\n let permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n aadRoles = [],\r\n aadGroups = [],\r\n aadLicenses = [],\r\n pendingRoles = $scope.vm.User?.AadUser?.PendingUserRoles || [],\r\n pendingGroups = $scope.vm.User?.AadUser?.PendingUserGroups || [],\r\n pendingLicenses = $scope.vm.User?.AadUser?.PendingLicenses || [];\r\n\r\n $scope.vm.ListOfSelectedAADRoles = [];\r\n $scope.vm.ListOfAvailableAADRoles = [];\r\n $scope.vm.ListOfSelectedAADGroups = [];\r\n $scope.vm.ListOfAvailableAADGroups = [];\r\n $scope.vm.ListOfSelectedAADLicenses = [];\r\n $scope.vm.ListOfAvailableAADLicenses = [];\r\n\r\n if ($scope.vm.User.AadUser != null) {\r\n aadRoles = $scope.vm.User.AadUser.UserRoles || [];\r\n aadGroups = $scope.vm.User.AadUser.UserGroups || [];\r\n aadLicenses = $scope.vm.User.AadUser.AssignedLicenses || [];\r\n }\r\n\r\n //Load Available aadRoles then process existing security\r\n promises.push(RequestManagementAADService.getAllAADRoles().then(function (response) {\r\n $scope.vm.ListOfAvailableAADRoles = response.data.map(applyPendingByKey.bind(null, pendingRoles, \"Id\"));\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n promises.push(RequestManagementAADService.getAllAADGroups().then(function (response) {\r\n $scope.vm.ListOfAvailableAADGroups = response.data.map(applyPendingByKey.bind(null, pendingGroups, \"Id\"));\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n promises.push(RequestManagementAADService.getAllAADLicenses().then(function (response) {\r\n $scope.vm.ListOfAvailableAADLicenses = response.data.map(applyPendingByKey.bind(null, pendingLicenses, \"SkuId\"));\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.vm.User === null) {\r\n $scope.vm.User = {};\r\n }\r\n if ($scope.vm.User.AadUser === null) {\r\n $scope.vm.User.AadUser = {};\r\n }\r\n\r\n //Modify Available and Selected roles lists to reflect users current security\r\n if (aadRoles != null && $scope.vm.ListOfAvailableAADRoles != null) {\r\n aadRoles.forEach(role => {\r\n if ($scope.vm.ListOfSelectedAADRoles.none(selectedRole => selectedRole.Id === role.Id)) {\r\n\r\n role.Pending = pendingRoles.some(pendingRole => pendingRole.Id === role.Id);\r\n\r\n $scope.vm.ListOfSelectedAADRoles.unshift(role);\r\n\r\n $scope.vm.ListOfAvailableAADRoles.forEach((row, j) => {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableAADRoles.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n //Modify Available and Selected group lists to reflect users current security\r\n if (aadGroups != null && $scope.vm.ListOfAvailableAADGroups != null) {\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Group\" && role.ProductType === \"AAD\");\r\n\r\n $scope.vm.ListOfSelectedAADGroups = [...defaultRoles];\r\n $scope.vm.ListOfAvailableAADGroups = $scope.vm.ListOfAvailableAADGroups.filter(availableGroup => {\r\n let selectedGroup = $scope.vm.ListOfSelectedAADGroups.find(selectedGroup => selectedGroup.Id === availableGroup.Id);\r\n\r\n if (selectedGroup) {\r\n selectedGroup = Object.merge(selectedGroup, availableGroup);\r\n }\r\n\r\n return !selectedGroup;\r\n });\r\n } else {\r\n aadGroups.forEach(group => {\r\n if ($scope.vm.ListOfSelectedAADGroups.none(selectedGroup => selectedGroup.Id === group.Id)) {\r\n\r\n group.Pending = pendingGroups.some(pendingGroup => pendingGroup.Id === group.Id);\r\n\r\n $scope.vm.ListOfSelectedAADGroups.unshift(group);\r\n\r\n $scope.vm.ListOfAvailableAADGroups.forEach((row, j) => {\r\n if (row.Id === group.Id) {\r\n $scope.vm.ListOfAvailableAADGroups.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n //Modify Available and Selected license lists to refect users current security\r\n if (aadLicenses != null && $scope.vm.ListOfAvailableAADLicenses != null) {\r\n aadLicenses.forEach(license => {\r\n if ($scope.vm.ListOfSelectedAADLicenses.none(selectedLicense => selectedLicense.SkuId === license.SkuId)) {\r\n\r\n license.Pending = pendingLicenses.some(pendingLicense => pendingLicense.SkuId === license.SkuId);\r\n\r\n $scope.vm.ListOfSelectedAADLicenses.unshift(license);\r\n\r\n $scope.vm.ListOfAvailableAADLicenses.forEach((row, j) => {\r\n if (row.SkuId === license.SkuId) {\r\n $scope.vm.ListOfAvailableAADLicenses.splice(j, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n $scope.aadUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n }\r\n}\r\n\r\nfunction applyPendingByKey(pendingItems, key, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.find(pendingItem => pendingItem[key] === item[key]);\r\n }\r\n\r\n return item;\r\n}","export default /*@ngInject*/ function ($http) {\r\n\r\n //PeopleSoft HTTP Calls\r\n this.getAllPSRoles = function () {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/ps/roles`\r\n });\r\n };\r\n\r\n this.getPSPermissionLists = function () {\r\n return $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/ps/permissionlists`\r\n });\r\n };\r\n\r\n this.getPSEmailTypes = function () {\r\n return [\r\n {\r\n DisplayValue: \"Work\",\r\n Value: 'WORK'\r\n },\r\n {\r\n DisplayValue: \"Home\",\r\n Value: 'HOME'\r\n },\r\n {\r\n DisplayValue: \"Other\",\r\n Value: 'OTH'\r\n },\r\n {\r\n DisplayValue: \"Business\",\r\n Value: 'BUS'\r\n },\r\n {\r\n DisplayValue: \"Blackberry\",\r\n Value: 'BB'\r\n },\r\n ];\r\n }\r\n}","export default /*@ngInject*/ function ($q, RequestManagementPSService, $filter) {\r\n\r\n this.loadPS = function ($scope) {\r\n var psDfrd = $.Deferred();\r\n\r\n loadPSPermissions($scope).done(function () {\r\n psDfrd.resolve();\r\n });\r\n\r\n return $.when(psDfrd).done(function () {\r\n }).promise();\r\n };\r\n\r\n this.loadPSLoadPermisssions = function ($scope) {\r\n return loadPSPermissions($scope);\r\n };\r\n //Load the PS permissions, after that completes and if there is an existing PS user load their permissions\r\n function loadPSPermissions($scope) {\r\n let permissionsDfrd = $.Deferred(),\r\n promises = [],\r\n pendingRoles = $scope.vm.User?.PSUser?.PendingRoles || [];\r\n\r\n $scope.vm.ListOfSelectedPSRoles = [];\r\n $scope.vm.ListOfAvailablePSRoles = [];\r\n\r\n //Load Available psRoles then process existing security\r\n promises.push(RequestManagementPSService.getAllPSRoles().then(function (response) {\r\n $scope.vm.ListOfAvailablePSRoles = response.data.filter(applyPending.bind(null, pendingRoles));\r\n }, function errorCallback(response) {\r\n permissionsDfrd.reject();\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) {\r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductType === \"PS\");\r\n\r\n $scope.vm.User.PSUser.Roles = [...defaultRoles];\r\n }\r\n //Load PS user roles\r\n if ($scope.vm.User.PSUser.Roles != null) {\r\n $scope.vm.User.PSUser.Roles.forEach(Role => {\r\n\r\n var psRole = null;\r\n\r\n //Get the role information from the available psRoles list\r\n psRole = $scope.vm.ListOfAvailablePSRoles.find(object => object.Name === Role.Name);\r\n\r\n if (psRole != null) {\r\n $scope.vm.ListOfSelectedPSRoles.unshift({\r\n Name: psRole.Name,\r\n IsAssignable: psRole.IsAssignable,\r\n Pending: pendingRoles.find(pendingRole => pendingRole.Name === psRole.Name)\r\n });\r\n\r\n $scope.vm.ListOfAvailablePSRoles.forEach((row, j) => {\r\n if (row.Name === psRole.Name) {\r\n $scope.vm.ListOfAvailablePSRoles.splice(j, 1);\r\n }\r\n });\r\n }\r\n\r\n psRole = null;\r\n\r\n $scope.vm.numberOfPSRolesValid = true;\r\n });\r\n }\r\n $scope.vm.ListOfAvailablePSRoles = $scope.vm.ListOfAvailablePSRoles.filter(role => role.IsAssignable);\r\n\r\n $scope.psUserLoaded = true;\r\n permissionsDfrd.resolve();\r\n });\r\n\r\n return $.when(permissionsDfrd).done(function () {\r\n }).promise();\r\n }\r\n}\r\n\r\nfunction applyPending(pendingItems, item) {\r\n if (pendingItems.length) {\r\n item.Pending = pendingItems.some(pendingItem => pendingItem.Name === item.Name);\r\n }\r\n\r\n return item;\r\n}","import angular from 'angular';\r\nimport RequestManagementAXLoadDataService from '../Components/RequestManagement/RequestManagementAXLoadDataService';\r\nimport RequestManagementAXService from '../Components/RequestManagement/RequestManagementAXService';\r\nimport RequestManagementBuildRequestService from '../Components/RequestManagement/RequestManagementBuildRequestService';\r\nimport RequestManagementD365SLoadDataService from '../Components/RequestManagement/RequestManagementD365SLoadDataService';\r\nimport RequestManagementD365SService from '../Components/RequestManagement/RequestManagementD365SService';\r\nimport RequestManagementEffectiveDateService from '../Components/RequestManagement/RequestManagementEffectiveDateService';\r\nimport RequestManagementGPLoadDataService from '../Components/RequestManagement/RequestManagementGPLoadDataService';\r\nimport RequestManagementGPService from '../Components/RequestManagement/RequestManagementGPService';\r\nimport RequestManagementLoadDataService from '../Components/RequestManagement/RequestManagementLoadDataService';\r\nimport RequestManagementNAVLoadDataService from '../Components/RequestManagement/RequestManagementNAVLoadDataService';\r\nimport RequestManagementNAVService from '../Components/RequestManagement/RequestManagementNAVService';\r\nimport RequestManagementNetSuiteLoadDataService from '../Components/RequestManagement/RequestManagementNetSuiteLoadDataService';\r\nimport RequestManagementNetSuiteService from '../Components/RequestManagement/RequestManagementNetSuiteService';\r\nimport RequestManagementOracleCloudLoadDataService from '../Components/RequestManagement/RequestManagementOracleCloudLoadDataService';\r\nimport RequestManagementOracleCloudService from '../Components/RequestManagement/RequestManagementOracleCloudService';\r\nimport RequestManagementOracleLoadDataService from '../Components/RequestManagement/RequestManagementOracleLoadDataService';\r\nimport RequestManagementOracleService from '../Components/RequestManagement/RequestManagementOracleService';\r\nimport RequestManagementSAPLoadDataService from '../Components/RequestManagement/RequestManagementSAPLoadDataService';\r\nimport RequestManagementSAPService from '../Components/RequestManagement/RequestManagementSAPService';\r\nimport RequestManagementShowStepsService from '../Components/RequestManagement/RequestManagementShowStepsService';\r\nimport RequestManagementStepDefinitions from '../Components/RequestManagement/RequestManagementStepDefinitions';\r\nimport RequestManagementWizardController from '../Components/RequestManagement/RequestManagementWizardController';\r\nimport RequestManagementUPLoadDataService from '../Components/RequestManagement/RequestManagementUPLoadDataService';\r\nimport RequestManagementUPService from '../Components/RequestManagement/RequestManagementUPService';\r\nimport salesforceLoadData from '../Components/RequestManagement/salesforceLoadData';\r\nimport salesforceService from '../Components/RequestManagement/salesforceDataService.factory';\r\nimport RequestManagementAADService from '../Components/RequestManagement/RequestManagementAADService';\r\nimport RequestManagementAADLoadDataService from '../Components/RequestManagement/RequestManagementAADLoadDataService';\r\nimport RequestManagementPSService from '../Components/RequestManagement/RequestManagementPSService';\r\nimport RequestManagementPSLoadDataService from '../Components/RequestManagement/RequestManagementPSLoadDataService';\r\n\r\nexport default angular\r\n .module('app.identityManager.requestManagement.services', [])\r\n .service('RequestManagementUPLoadDataService', RequestManagementUPLoadDataService)\r\n .service('RequestManagementUPService', RequestManagementUPService)\r\n .service('RequestManagementAADService', RequestManagementAADService)\r\n .service('salesforceLoadData', salesforceLoadData)\r\n .service('salesforceService', salesforceService)\r\n .service('RequestManagementAADLoadDataService', RequestManagementAADLoadDataService)\r\n .service('RequestManagementAXLoadDataService', RequestManagementAXLoadDataService)\r\n .service('RequestManagementAXService', RequestManagementAXService)\r\n .service('RequestManagementBuildRequestService', RequestManagementBuildRequestService)\r\n .service('RequestManagementD365SLoadDataService', RequestManagementD365SLoadDataService)\r\n .service('RequestManagementD365SService', RequestManagementD365SService)\r\n .service('RequestManagementEffectiveDateService', RequestManagementEffectiveDateService)\r\n .service('RequestManagementGPLoadDataService', RequestManagementGPLoadDataService)\r\n .service('RequestManagementGPService', RequestManagementGPService)\r\n .service('RequestManagementLoadDataService', RequestManagementLoadDataService)\r\n .service('RequestManagementNAVLoadDataService', RequestManagementNAVLoadDataService)\r\n .service('RequestManagementNAVService', RequestManagementNAVService)\r\n .service('RequestManagementNetSuiteLoadDataService', RequestManagementNetSuiteLoadDataService)\r\n .service('RequestManagementNetSuiteService', RequestManagementNetSuiteService)\r\n .service('RequestManagementOracleCloudLoadDataService', RequestManagementOracleCloudLoadDataService)\r\n .service('RequestManagementOracleCloudService', RequestManagementOracleCloudService)\r\n .service('RequestManagementOracleLoadDataService', RequestManagementOracleLoadDataService)\r\n .service('RequestManagementOracleService', RequestManagementOracleService)\r\n .service('RequestManagementPSLoadDataService', RequestManagementPSLoadDataService)\r\n .service('RequestManagementPSService', RequestManagementPSService)\r\n .service('RequestManagementSAPLoadDataService', RequestManagementSAPLoadDataService)\r\n .service('RequestManagementSAPService', RequestManagementSAPService)\r\n .service('RequestManagementShowStepsService', RequestManagementShowStepsService)\r\n .service('RequestManagementStepDefinitions', RequestManagementStepDefinitions)\r\n .service('RequestManagementWizardController', RequestManagementWizardController)\r\n .name;","export default function () {\r\n //Convert User and Role start/end dates to Date type\r\n this.convertRequestDates = function (request) {\r\n convertRequestDatesHelper(request);\r\n };\r\n //Helper function that finds all Start/End Dates in the request and converts them to a Date type\r\n function convertRequestDatesHelper(obj) {\r\n for (var property in obj) {\r\n if (obj.hasOwnProperty(property)) {\r\n if (typeof obj[property] === \"object\") {\r\n convertRequestDatesHelper(obj[property]);\r\n }\r\n else {\r\n if (property === \"StartDate\" && obj[property] != null) {\r\n obj[property] = new Date(obj[property]);\r\n }\r\n if (property === \"EndDate\" && obj[property] != null) {\r\n obj[property] = new Date(obj[property]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //Convert User and Role dates to local time\r\n this.convertDatesToLocal = function (request) {\r\n convertDatesToLocalHelper(request);\r\n };\r\n //Helper function that loops thru request and finds all Start/End dates and convert them to local time\r\n function convertDatesToLocalHelper(obj) {\r\n for (var property in obj) {\r\n if (obj.hasOwnProperty(property)) {\r\n if (typeof obj[property] === \"object\")\r\n { convertDatesToLocalHelper(obj[property]); }\r\n else {\r\n if (property === \"StartDate\" && obj[property] != null) {\r\n obj[property] = convertTolocalISOTime(obj[property]);\r\n }\r\n if (property === \"EndDate\" && obj[property] != null) {\r\n obj[property] = convertTolocalISOTime(obj[property]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //Helper function to convert UTC dates to local date time\r\n var convertTolocalISOTime = function (date) {\r\n var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds\r\n var localISOTime = (new Date(new Date(date) - tzoffset)).toISOString().slice(0, -1);\r\n\r\n return localISOTime;\r\n };\r\n}","export default function () {\r\n\r\n //If App is selected the child steps are set to true else false\r\n function toggleVisibleAppSteps (steps, stepIsVisible, parentStep) {\r\n steps.forEach(step => {\r\n if (step.parent === parentStep) {\r\n step.visible = stepIsVisible;\r\n }\r\n });\r\n }\r\n\r\n this.createCustomSteps = function (application, steps) {\r\n let customSteps = [];\r\n const baseProductName = steps.find(step => step.parent !== application.ProductName && step.parent === application.Name).parent;\r\n const firstBaseIndex = steps.findIndex(step => step.parent !== application.ProductName && step.parent === application.Name);\r\n const customStepBase = steps.filter(step => step.parent !== application.ProductName && step.parent === application.Name);\r\n\r\n customStepBase.forEach(step => {\r\n let newCustomStep = Object.assign({}, step);\r\n if (application.Name === 'Universal') {\r\n newCustomStep.title = application.ProductName + ' ' + newCustomStep.title;\r\n newCustomStep.productId = application.ProductID;\r\n } else {\r\n newCustomStep.title = step.title.replace(application.Name, application.ProductName);\r\n }\r\n newCustomStep.parent = application.ProductName;\r\n newCustomStep.isCustom = true;\r\n customSteps.push(newCustomStep);\r\n });\r\n\r\n // See where the steps need to go order-wise\r\n if (baseProductName < application.ProductName) {\r\n // Custom Product Name is after parent product steps alpha so they follow them\r\n steps.splice(firstBaseIndex + customStepBase.length, 0, ...customSteps);\r\n } else {\r\n // Custom Product Name is before parent product steps alpha so they precede them\r\n steps.splice(firstBaseIndex, 0, ...customSteps);\r\n }\r\n\r\n return steps;\r\n };\r\n\r\n function checkIfApplicationIsSelectedAndMatches (availableApplications, steps, applicationName) {\r\n var appSelected = false;\r\n\r\n availableApplications.forEach(application => {\r\n if (application.ProductName === applicationName) {\r\n toggleVisibleAppSteps(steps, application.selected, applicationName);\r\n appSelected = application.selected;\r\n } else {\r\n toggleVisibleAppSteps(steps, application.selected, application.ProductName);\r\n }\r\n });\r\n\r\n return appSelected;\r\n };\r\n\r\n //NetSuite Selected\r\n this.setNetSuiteStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'NetSuite');\r\n };\r\n\r\n //SAP Selected\r\n this.setSAPStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'SAP');\r\n };\r\n\r\n //AAD Selected\r\n this.setAADStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Azure Active Directory');\r\n };\r\n\r\n //AX7 Selected\r\n this.setAX7StepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Dynamics 365 for Finance and Operations');\r\n };\r\n\r\n //AX2012 Selected\r\n this.setAX2012StepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Dynamics AX');\r\n };\r\n\r\n //Oracle Selected\r\n this.setOracleStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Oracle EBS');\r\n };\r\n\r\n //Oracle Cloud Selected\r\n this.setOracleCloudStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Oracle Cloud');\r\n };\r\n\r\n //GP Selected\r\n this.setGPStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Dynamics GP');\r\n };\r\n\r\n //NAV Selected\r\n this.setNAVStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Dynamics NAV');\r\n };\r\n\r\n //D365S Selected\r\n this.setD365SStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Dynamics 365 Customer Engagement');\r\n };\r\n\r\n //PeopleSoft Selected\r\n this.setPSStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'PeopleSoft');\r\n };\r\n\r\n //Salesforce Selected\r\n this.setSalesforceStepsToVisible = function (availableApplications, steps) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, 'Salesforce');\r\n };\r\n\r\n //Custom Product Selected\r\n this.setCustomStepsToVisible = function (availableApplications, steps, application) {\r\n return checkIfApplicationIsSelectedAndMatches(availableApplications, steps, application.ProductName);\r\n };\r\n}","export default /*@ngInject*/ function () {\r\n\r\n this.getListOfSteps = function (wizardMode, alternatePath, requestToEdit) {\r\n var steps = [];\r\n if (wizardMode === 'New' || wizardMode === 'Modify' && requestToEdit) {\r\n steps = [\r\n SelectApplicationsStep,\r\n UniversalProductUserInformationStep,\r\n UniversalProductRolesStep,\r\n AX2012UserInformationStep,\r\n AX2012RolesStep,\r\n AX2012UserGroupsStep,\r\n D365SUserInformationStep,\r\n D365SRolesStep,\r\n D365STeamsStep,\r\n AX7UserInformationStep,\r\n AX7RolesStep,\r\n AX7UserGroupsStep,\r\n AADUserInformationStep,\r\n AADGroupsStep,\r\n AADLicensesStep,\r\n AADRolesStep,\r\n SalesforceUserInformationStep,\r\n SalesforceUserProfilesStep,\r\n SalesforceUserPermissionsStep,\r\n GPUserInformationStep,\r\n GPCompaniesStep,\r\n GPRolesStep,\r\n NAVUserInformationStep,\r\n NAVPermissionSetsStep,\r\n NAVUserGroupsStep,\r\n NetSuiteUserInformationStep,\r\n NetSuiteRolesStep,\r\n NetSuiteGlobalPermissionsStep,\r\n OracleUserInformationStep,\r\n OracleRolesStep,\r\n OracleResponsibilitiesStep,\r\n OracleCloudUserInformationStep,\r\n OracleCloudRolesStep,\r\n PeopleSoftUserInformationStep,\r\n PeopleSoftRolesStep,\r\n SAPUserInformationStep,\r\n SAPSingleRolesStep,\r\n SAPCompositeRolesStep,\r\n EffectiveDatesStep,\r\n RiskAnalysisStep,\r\n RequestNotesStep,\r\n SummaryStep\r\n ];\r\n } else if (wizardMode === 'Modify' && alternatePath === 'SelfService' && !requestToEdit) {\r\n steps = [\r\n SelectApplicationsStep,\r\n UniversalProductUserInformationStep,\r\n UniversalProductRolesStep,\r\n AX2012UserInformationStep,\r\n AX2012RolesStep,\r\n AX2012UserGroupsStep,\r\n D365SUserInformationStep,\r\n D365SRolesStep,\r\n D365STeamsStep,\r\n AX7UserInformationStep,\r\n AX7RolesStep,\r\n AX7UserGroupsStep,\r\n AADUserInformationStep,\r\n AADGroupsStep,\r\n AADLicensesStep,\r\n AADRolesStep,\r\n SalesforceUserInformationStep,\r\n SalesforceUserProfilesStep,\r\n SalesforceUserPermissionsStep,\r\n GPUserInformationStep,\r\n GPCompaniesStep,\r\n GPRolesStep,\r\n NAVUserInformationStep,\r\n NAVPermissionSetsStep,\r\n NAVUserGroupsStep,\r\n NetSuiteUserInformationStep,\r\n NetSuiteRolesStep,\r\n NetSuiteGlobalPermissionsStep,\r\n OracleUserInformationStep,\r\n OracleRolesStep,\r\n OracleResponsibilitiesStep,\r\n OracleCloudUserInformationStep,\r\n OracleCloudRolesStep,\r\n PeopleSoftUserInformationStep,\r\n PeopleSoftRolesStep,\r\n SAPUserInformationStep,\r\n SAPSingleRolesStep,\r\n SAPCompositeRolesStep,\r\n EffectiveDatesStep,\r\n RiskAnalysisStep,\r\n RequestNotesStep,\r\n SummaryStep\r\n ];\r\n } else if (wizardMode === 'Modify' && alternatePath === 'EmergencyAccess' && !requestToEdit) {\r\n steps = [\r\n SelectApplicationsStep,\r\n SAPSingleRolesStep,\r\n SAPCompositeRolesStep,\r\n EmergencyAccessUsageStep,\r\n EffectiveDatesStep,\r\n RequestNotesStep,\r\n SummaryStep\r\n ];\r\n } else if (wizardMode === 'Modify' && !requestToEdit) {\r\n steps = [\r\n SearchExistingUsersStep,\r\n SelectApplicationsStep,\r\n UniversalProductUserInformationStep,\r\n UniversalProductRolesStep,\r\n AX2012UserInformationStep,\r\n AX2012RolesStep,\r\n AX2012UserGroupsStep,\r\n D365SUserInformationStep,\r\n D365SRolesStep,\r\n D365STeamsStep,\r\n AX7UserInformationStep,\r\n AX7RolesStep,\r\n AX7UserGroupsStep,\r\n AADUserInformationStep,\r\n AADGroupsStep,\r\n AADLicensesStep,\r\n AADRolesStep,\r\n SalesforceUserInformationStep,\r\n SalesforceUserProfilesStep,\r\n SalesforceUserPermissionsStep,\r\n GPUserInformationStep,\r\n GPCompaniesStep,\r\n GPRolesStep,\r\n NAVUserInformationStep,\r\n NAVPermissionSetsStep,\r\n NAVUserGroupsStep,\r\n NetSuiteUserInformationStep,\r\n NetSuiteRolesStep,\r\n NetSuiteGlobalPermissionsStep,\r\n OracleUserInformationStep,\r\n OracleRolesStep,\r\n OracleResponsibilitiesStep,\r\n OracleCloudUserInformationStep,\r\n OracleCloudRolesStep,\r\n PeopleSoftUserInformationStep,\r\n PeopleSoftRolesStep,\r\n SAPUserInformationStep,\r\n SAPSingleRolesStep,\r\n SAPCompositeRolesStep,\r\n EffectiveDatesStep,\r\n RiskAnalysisStep,\r\n RequestNotesStep,\r\n SummaryStep\r\n ];\r\n } else if (wizardMode === 'Terminate' && !requestToEdit) {\r\n steps = [\r\n SearchExistingUsersStep,\r\n SelectApplicationsStep,\r\n RequestNotesStep,\r\n SummaryStep\r\n ];\r\n } else if (wizardMode === 'Terminate' && requestToEdit) {\r\n steps = [\r\n SelectApplicationsStep,\r\n RequestNotesStep,\r\n SummaryStep\r\n ];\r\n }\r\n //removes reference from array\r\n var copySteps = angular.copy(steps);\r\n return copySteps;\r\n };\r\n\r\n var SearchExistingUsersStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/SearchExistingUsers.html',\r\n title: 'Search Existing Users',\r\n visible: true,\r\n parent: null\r\n };\r\n var SelectApplicationsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/SelectApplications.html',\r\n title: 'Select Applications',\r\n visible: true,\r\n parent: null\r\n };\r\n var UniversalProductUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/UniversalProduct/UPUserInformation.html',\r\n title: 'User Information',\r\n visible: false,\r\n parent: 'Universal'\r\n }\r\n var UniversalProductRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/UniversalProduct/UPRoles.html',\r\n title: 'Roles',\r\n visible: false,\r\n parent: 'Universal'\r\n }\r\n var AX2012UserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AX2012/AXUserInformation.html',\r\n title: 'Dynamics AX User Information',\r\n visible: false,\r\n parent: 'Dynamics AX'\r\n };\r\n var AX2012RolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AX2012/AXRoles.html',\r\n title: 'Dynamics AX Roles',\r\n visible: false,\r\n parent: 'Dynamics AX'\r\n };\r\n var AX2012UserGroupsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AX2012/AXUserGroups.html',\r\n title: 'Dynamics AX User Groups',\r\n visible: false,\r\n parent: 'Dynamics AX'\r\n };\r\n var D365SUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/D365S/D365SUserInformation.html',\r\n title: 'Dynamics 365 Customer Engagement User Information',\r\n visible: false,\r\n parent: 'Dynamics 365 Customer Engagement'\r\n };\r\n var D365SRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/D365S/D365SRoles.html',\r\n title: 'Dynamics 365 Customer Engagement Roles',\r\n visible: false,\r\n parent: 'Dynamics 365 Customer Engagement'\r\n };\r\n var D365STeamsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/D365S/D365STeams.html',\r\n title: 'Dynamics 365 Customer Engagement Teams',\r\n visible: false,\r\n parent: 'Dynamics 365 Customer Engagement'\r\n };\r\n var AX7UserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AX7/AXUserInformation.html',\r\n title: 'Dynamics 365 for Finance and Supply Chain User Information',\r\n visible: false,\r\n parent: 'Dynamics 365 for Finance and Supply Chain'\r\n };\r\n var AX7RolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AX7/AXRoles.html',\r\n title: 'Dynamics 365 for Finance and Supply Chain Roles',\r\n visible: false,\r\n parent: 'Dynamics 365 for Finance and Supply Chain'\r\n };\r\n var AX7UserGroupsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AX7/AXUserGroups.html',\r\n title: 'Dynamics 365 for Finance and Supply Chain User Groups',\r\n visible: false,\r\n parent: 'Dynamics 365 for Finance and Supply Chain'\r\n };\r\n var AADUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AAD/AADUserInformation.html',\r\n title: 'Entra ID User Information',\r\n visible: false,\r\n parent: 'Entra ID'\r\n };\r\n var AADRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AAD/AADRoles.html',\r\n title: 'Entra ID Roles',\r\n visible: false,\r\n parent: 'Entra ID'\r\n };\r\n var AADGroupsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AAD/AADGroups.html',\r\n title: 'Entra ID Groups',\r\n visible: false,\r\n parent: 'Entra ID'\r\n };\r\n var AADLicensesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AAD/AADLicenses.html',\r\n title: 'Entra ID Licenses',\r\n visible: false,\r\n parent: 'Entra ID'\r\n };\r\n var SalesforceUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Salesforce/salesforceUserForm.tmpl.html',\r\n title: 'Salesforce User Information',\r\n visible: false,\r\n parent: 'Salesforce'\r\n };\r\n var SalesforceUserProfilesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Salesforce/salesforceProfileForm.tmpl.html',\r\n title: 'Salesforce Profiles',\r\n visible: false,\r\n parent: 'Salesforce'\r\n };\r\n var SalesforceUserPermissionsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Salesforce/salesforcePermissionSets.tmpl.html',\r\n title: 'Salesforce Permission Sets',\r\n visible: false,\r\n parent: 'Salesforce'\r\n };\r\n var GPUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/GP/GPUserInformation.html',\r\n title: 'Dynamics GP User Information',\r\n visible: false,\r\n parent: 'Dynamics GP'\r\n };\r\n var GPRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/GP/GPRoles.html',\r\n title: 'Dynamics GP Roles',\r\n visible: false,\r\n parent: 'Dynamics GP'\r\n };\r\n var GPCompaniesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/GP/GPCompanies.html',\r\n title: 'Dynamics GP Companies',\r\n visible: false,\r\n parent: 'Dynamics GP'\r\n };\r\n var NAVUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/NAV/NAVUserInformation.html',\r\n title: 'Dynamics NAV User Information',\r\n visible: false,\r\n parent: 'Dynamics NAV'\r\n };\r\n var NAVPermissionSetsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/NAV/NAVPermissionSets.html',\r\n title: 'Dynamics NAV Permission Sets',\r\n visible: false,\r\n parent: 'Dynamics NAV'\r\n };\r\n var NAVUserGroupsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/NAV/NAVUserGroups.html',\r\n title: 'Dynamics NAV User Groups',\r\n visible: false,\r\n parent: 'Dynamics NAV'\r\n };\r\n var NetSuiteUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/NetSuite/NSUserInformation.html',\r\n title: 'NetSuite User Information',\r\n visible: false,\r\n parent: 'NetSuite'\r\n };\r\n var NetSuiteRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/NetSuite/NSRoles.html',\r\n title: 'NetSuite Roles',\r\n visible: false,\r\n parent: 'NetSuite'\r\n };\r\n var NetSuiteGlobalPermissionsStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/NetSuite/NSGlobalPermissions.html',\r\n title: 'NetSuite Global Permissions',\r\n visible: false,\r\n parent: 'NetSuite'\r\n };\r\n var OracleUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Oracle/ORUserInformation.html',\r\n title: 'Oracle EBS User Information',\r\n visible: false,\r\n parent: 'Oracle EBS'\r\n };\r\n var OracleRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Oracle/ORRoles.html',\r\n title: 'Oracle EBS Roles',\r\n visible: false,\r\n parent: 'Oracle EBS'\r\n };\r\n var OracleResponsibilitiesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Oracle/ORResponsibilities.html',\r\n title: 'Oracle EBS Responsibilities',\r\n visible: false,\r\n parent: 'Oracle EBS'\r\n };\r\n var OracleCloudUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/OracleCloud/ORCloudUserInformation.html',\r\n title: 'Oracle Cloud User Information',\r\n visible: false,\r\n parent: 'Oracle Cloud'\r\n };\r\n var OracleCloudRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/OracleCloud/ORCloudRoles.html',\r\n title: 'Oracle Cloud Roles',\r\n visible: false,\r\n parent: 'Oracle Cloud'\r\n };\r\n var PeopleSoftUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/PeopleSoft/PSUserInformation.html',\r\n title: 'PeopleSoft User Information',\r\n visible: false,\r\n parent: 'PeopleSoft'\r\n };\r\n var PeopleSoftRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/PeopleSoft/PSRoles.html',\r\n title: 'PeopleSoft Roles',\r\n visible: false,\r\n parent: 'PeopleSoft'\r\n };\r\n var SAPUserInformationStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/SAP/SAPUserInformation.html',\r\n title: 'SAP User Information',\r\n visible: false,\r\n parent: 'SAP'\r\n };\r\n var SAPSingleRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/SAP/SAPRoles.html',\r\n title: 'SAP Single Roles',\r\n visible: false,\r\n parent: 'SAP'\r\n };\r\n var SAPCompositeRolesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/SAP/SAPCompositeRoles.html',\r\n title: 'SAP Composite Roles',\r\n visible: false,\r\n parent: 'SAP'\r\n };\r\n var EmergencyAccessUsageStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/SAP/emergencyAccess.html',\r\n title: 'SAP Emergency Access Usage',\r\n visible: false,\r\n parent: 'SAP'\r\n };\r\n var EffectiveDatesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/EffectiveDates.html',\r\n title: 'Access Effective Dates',\r\n visible: true,\r\n parent: 'Summary'\r\n };\r\n var RiskAnalysisStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/RiskAnalysis.html',\r\n title: 'Risk Analysis',\r\n visible: true,\r\n parent: 'Summary'\r\n };\r\n var RequestNotesStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/RequestNotes.html',\r\n title: 'Request Notes',\r\n visible: true,\r\n parent: 'Summary'\r\n };\r\n var SummaryStep = {\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/Summary.html',\r\n title: 'Summary',\r\n visible: true,\r\n parent: 'Summary'\r\n };\r\n\r\n}","export default function () {\r\n\r\n this.stepDisabled = function (title, wizardInstance, $scope) {\r\n\r\n var enabledSteps = wizardInstance.getEnabledSteps(),\r\n positionInArray = null,\r\n steps = $scope.steps;\r\n\r\n enabledSteps.forEach(function (row, i) {\r\n if (title === row.title) {\r\n positionInArray = i;\r\n }\r\n });\r\n\r\n if ($scope.vm?.salesforceLicensePending && (title === \"Salesforce Profiles\" || title === \"Salesforce Permission Sets\")) {\r\n return true;\r\n }\r\n\r\n if (positionInArray === 0) {\r\n return false;\r\n }\r\n\r\n var firstVisibleNotValidStep = null;\r\n\r\n for (var i = 0; i < enabledSteps.length; i++) {\r\n if (enabledSteps[i].canexit === false && steps[i].visible === true) {\r\n firstVisibleNotValidStep = i;\r\n break;\r\n } if (steps[i].visible === true) {\r\n firstVisibleNotValidStep = positionInArray + 1;\r\n }\r\n }\r\n\r\n if (positionInArray > firstVisibleNotValidStep) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n this.setParentStepToActive = function (parent, wizardInstance, steps) {\r\n var stepIndex = wizardInstance.currentStepNumber() - 1;\r\n\r\n if (stepIndex != -1) {\r\n if (steps[stepIndex].parent === parent) {\r\n return true;\r\n } else { return false; }\r\n } else { return false; }\r\n };\r\n\r\n this.atLeastOneAppSelected = function (availableApplications, wizardMode) {\r\n var validAppsSelected = null;\r\n for (var i = 0; i < availableApplications.length; i++) {\r\n\r\n if (wizardMode != null && wizardMode == 'Terminate' && availableApplications[i].selected == true) {\r\n validAppsSelected = false;\r\n } else if (availableApplications[i].selected == true) {\r\n validAppsSelected = true;\r\n }\r\n }\r\n return validAppsSelected;\r\n };\r\n\r\n this.goToNextVisiblePage = function (steps, wizardInstance) {\r\n for (var i = wizardInstance.currentStepNumber(); i < steps.length; i++) {\r\n var step = steps[i];\r\n if (step.visible == true) {\r\n return step;\r\n }\r\n }\r\n };\r\n\r\n this.goToPreviousVisiblePage = function (steps, wizardInstance) {\r\n for (var i = wizardInstance.currentStepNumber() - 2; i > -1; i--) {\r\n var step = steps[i];\r\n if (step.visible == true) {\r\n return step;\r\n }\r\n }\r\n };\r\n\r\n this.getCurrentStepsTitle = function (wizardInstance) {\r\n if (wizardInstance.currentStep()) {\r\n return wizardInstance.currentStep().title;\r\n }\r\n };\r\n\r\n}","import swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($scope, helperService) {\r\n\r\n $scope.applyCompanyRestrictionsToAllSelectedRoles = applyCompanyRestrictionsToAllSelectedRoles;\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n var RoleCompany = function (params) {\r\n this.RoleId = params.RoleId;\r\n this.CompanyId = params.CompanyId;\r\n this.RoleName = params.RoleName;\r\n this.CompanyName = params.CompanyName;\r\n this.AllCompanies = params.AllCompanies;\r\n };\r\n\r\n $scope.AllCompanies = false;\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableAX2012Roles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableAX2012Roles.splice(i, 1);\r\n $scope.vm.ListOfSelectedAX2012Roles.push(role);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedAX2012Roles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedAX2012Roles.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableAX2012Roles.push(row);\r\n }\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteExcludedRole = function (role) {\r\n $scope.vm.ListOfExcludedAX2012Roles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfExcludedAX2012Roles.splice(i, 1);\r\n $scope.vm.ListOfAvailableAX2012Roles.push(row);\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.addRoleCompany = function (company, selected) {\r\n $scope.vm.ListOfSelectedAX2012Roles.forEach(function (row, i) {\r\n if (row.Id === $scope.selectedRole.Id) {\r\n\r\n if (!row.CompanyId || selected === false) {\r\n $scope.vm.AXRoleCompanyList.splice(i, 1);\r\n }\r\n if (selected === true) {\r\n $scope.vm.AXRoleCompanyList.push(\r\n new RoleCompany({\r\n RoleId: row.RoleId,\r\n CompanyId: company.CompanyId,\r\n RoleName: row.RoleName,\r\n CompanyName: company.CompanyName,\r\n AllCompanies: false\r\n }));\r\n }\r\n\r\n }\r\n });\r\n };\r\n\r\n $scope.updateSelectedRoleCompanies = function (selectedRole, prop, value, applyToAll) {\r\n if (applyToAll) {\r\n $scope.vm.ListOfSelectedAX2012Roles.forEach(role => {\r\n role[prop] = value;\r\n })\r\n } else {\r\n selectedRole[prop] = value;\r\n }\r\n };\r\n\r\n\r\n async function applyCompanyRestrictionsToAllSelectedRoles(selectedRole) {\r\n try {\r\n await swal(helperService.areYouSureParams('Apply Company Restrictions to all Selected Roles', `Are you sure you want to apply the Company Restrictions for Role ${selectedRole.Name} to all currently Selected Roles?`, 'Apply'));\r\n $scope.vm.ListOfSelectedAX2012Roles.forEach(role => {\r\n role['Companies'] = selectedRole.Companies;\r\n });\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n $scope.selectedRole = null;\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","export default /*@ngInject*/ function ($scope, $uibModal, $http, RequestManagementAXService, existingUserCheckService, errorsDataService) {\r\n\r\n //General User\r\n $scope.vm.axUserFromDateObject = null;\r\n $scope.vm.axUserToDateObject = null;\r\n $scope.vm.axUserMaxDate = new Date();\r\n var axUserMinDate = new Date();\r\n axUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.axUserMinDate = axUserMinDate;\r\n if (!$scope.vm.User.AX2012User) {\r\n $scope.vm.User.AX2012User = {};\r\n }\r\n if ($scope.vm.wizardMode === 'New') {\r\n $scope.vm.User.AX2012User.Enabled = true;\r\n }\r\n $scope.vm.User.AX2012User.ProductType = 'AX';\r\n\r\n activate();\r\n\r\n async function activate() {\r\n $scope.showDepartmentControl = await getProductConfig();\r\n createCompanyDropdown();\r\n }\r\n\r\n async function getProductConfig() {\r\n // check for the tishman config value and use it to determine whether to display the department control when a person record has been selected\r\n try {\r\n const response = await $http.get(`${apiUrl}api/universal/products/ax/configuration/IM_TishmanDepartmentCustomization`);\r\n if (response.data.Value === '1') {\r\n await createDepartmentDropdown();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (error) {\r\n return false;\r\n }\r\n\r\n }\r\n\r\n async function createDepartmentDropdown() {\r\n const response = await $http.get(`${apiUrl}api/identitymanager/ax/departments`);\r\n $scope.vm.axDepartments = response.data;\r\n }\r\n\r\n function createCompanyDropdown() {\r\n $scope.vm.axCompanyDropdownOptions = {\r\n valuePrimitive: true,\r\n template: `\r\n {{dataItem.CompanyName}} | {{dataItem.CompanyId}}\r\n `,\r\n filter: \"contains\",\r\n autoBind: true,\r\n minLength: 3,\r\n optionLabel: '-- Select Company --'\r\n };\r\n\r\n $scope.vm.axCompanyDropdownDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n\r\n options.success($scope.vm.ListOfAX2012Companies);\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.axUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.AX2012User.StartDate == '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.AX2012User.StartDate);\r\n }\r\n\r\n $scope.vm.axUserMinDate = date;\r\n $scope.vm.nsMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.AX2012User == null) {\r\n $scope.vm.User.AX2012User = {};\r\n }\r\n };\r\n\r\n $scope.axUserToDateChanged = function () {\r\n $scope.vm.axUserMaxDate = new Date($scope.vm.User.AX2012User.EndDate);\r\n $scope.vm.nsMaxDate = new Date($scope.vm.User.AX2012User.EndDate);\r\n $scope.vm.fromMaxDate = new Date($scope.vm.User.AX2012User.StartDate);\r\n if ($scope.vm.User.AX2012User == null) {\r\n $scope.vm.User.AX2012User = {};\r\n }\r\n };\r\n\r\n $scope.clearWindowsUser = function () {\r\n $scope.vm.User.AX2012User.SID = null;\r\n $scope.vm.User.AX2012User.NetworkDomain = null;\r\n $scope.vm.User.AX2012User.NetworkAlias = null;\r\n $scope.vm.User.AX2012User.UserName = null;\r\n $scope.vm.User.AX2012User.DisplayUserId = null;\r\n };\r\n\r\n //Watch for AX UserId updates the display value of the user Id by removing the partiion\r\n $scope.$watch('vm.User.AX2012User', function (newVal) {\r\n if ($scope.vm.User != null && $scope.vm.User.AX2012User != null && $scope.vm.User.AX2012User.UserId != null) {\r\n $scope.vm.User.AX2012User.DisplayUserId = $scope.vm.User.AX2012User.UserId.slice($scope.vm.User.AX2012User.UserId.indexOf('|') + 1, $scope.vm.User.AX2012User.UserId.length);\r\n }\r\n }, true);\r\n\r\n $scope.openModal = function () {\r\n $scope.vm.ExistingWindowsUserSearchString = null;\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/SearchWindowsUsersModal.html',\r\n controller: 'SearchAXWindowsUsersController',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n $scope.$watch('vm.User.AX2012User.Partition', function (newVal) {\r\n if ($scope.vm.User != null && $scope.vm.User.AX2012User != null && $scope.vm.User.AX2012User.Partition != null) {\r\n $scope.partitionChange();\r\n }\r\n }, true);\r\n\r\n $scope.partitionChange = function () {\r\n if ($scope.vm.User.AX2012User.Partition != null) {\r\n RequestManagementAXService.getAllAX2012Companies($scope.vm.User.AX2012User.Partition.Key).then(function (response) {\r\n $scope.vm.ListOfAX2012Companies = response.data;\r\n $scope.vm.axCompanyDropdownDataSource.read();\r\n }, function errorCallback(response) {\r\n //permissionsDfrd.reject();\r\n });\r\n }\r\n };\r\n\r\n $scope.existingUserCheck = function (userId, partitionId) {\r\n existingUserCheckService.checkAX(userId, partitionId)\r\n .then(response => {\r\n if (response.data === true) {\r\n $scope.userExists = true;\r\n $scope.wizardForm.AXuserId.$setValidity(\"AXuserId\", false);\r\n }\r\n else {\r\n $scope.userExists = false;\r\n $scope.wizardForm.AXuserId.$setValidity(\"AXuserId\", true);\r\n }\r\n\r\n })\r\n .catch(error => {\r\n errorsDataService.catch(error);\r\n });\r\n };\r\n\r\n $scope.$watchGroup([\"vm.User.AX2012User.Partition\", \"vm.User.AX2012User.DisplayUserId\"], () => {\r\n if ($scope.vm.User.AX2012User.DisplayUserId && $scope.vm.User.AX2012User.Partition && $scope.vm.wizardMode === 'New') {\r\n $scope.existingUserCheck($scope.vm.User.AX2012User.DisplayUserId, $scope.vm.User.AX2012User.Partition.Key);\r\n }\r\n });\r\n\r\n $scope.setPersonName = function (personObject) {\r\n $scope.vm.User.AX2012User.Person = {\r\n PartyNumber: personObject.PartyNumber,\r\n PersonNameAlias: personObject.PersonNameAlias,\r\n PersonName: personObject.PersonName,\r\n PersonPrimaryEmail: personObject.PersonPrimaryEmail\r\n };\r\n\r\n $scope.personSelected = true;\r\n }\r\n}","export default /*@ngInject*/ function ($scope, configurationDataService) {\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await setRoleDescConfigValue();\r\n await setOrgHierarchiesConfigValue();\r\n }\r\n\r\n async function setRoleDescConfigValue() {\r\n let response = await configurationDataService.getProductConfigurationValueByName('ax7', 'IM_ShowRoleDescription');\r\n $scope.roleDesc = response.data.Value === '1';\r\n }\r\n\r\n async function setOrgHierarchiesConfigValue() {\r\n let response = await configurationDataService.getProductConfigurationValueByName('ax7', 'IM_EnableOrgHierarchies');\r\n $scope.vm.orgHierarchiesEnabled = response.data.Value === '1';\r\n }\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n var RoleCompany = function (params) {\r\n this.RoleId = params.RoleId;\r\n this.CompanyId = params.CompanyId;\r\n this.RoleName = params.RoleName;\r\n this.CompanyName = params.CompanyName;\r\n this.AllCompanies = params.AllCompanies;\r\n };\r\n\r\n $scope.AllCompanies = false;\r\n $scope.validateNumberOfAXRoles = validateNumberOfAXRoles;\r\n\r\n function validateNumberOfAXRoles() {\r\n $scope.vm.numberOfAXRolesValid = null;\r\n if ($scope.vm.ListOfSelectedAX7Roles.length > 0) {\r\n $scope.vm.numberOfAXRolesValid = true;\r\n }\r\n if ($scope.vm.ListOfExcludedAX7Roles.length > 0) {\r\n $scope.vm.numberOfAXRolesValid = true;\r\n }\r\n }\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableAX7Roles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableAX7Roles.splice(i, 1);\r\n $scope.vm.ListOfSelectedAX7Roles.push(role);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfAXRoles();\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedAX7Roles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedAX7Roles.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableAX7Roles.push(row);\r\n }\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfAXRoles();\r\n };\r\n\r\n $scope.deleteExcludedRole = function (role) {\r\n $scope.vm.ListOfExcludedAX7Roles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfExcludedAX7Roles.splice(i, 1);\r\n $scope.vm.ListOfAvailableAX7Roles.push(row);\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfAXRoles();\r\n };\r\n\r\n $scope.addRoleCompany = function (company, selected) {\r\n $scope.vm.ListOfSelectedAX7Roles.forEach(function (row, i) {\r\n if (row.Id === $scope.selectedRole.Id) {\r\n\r\n if (!row.CompanyId || selected === false) {\r\n $scope.vm.AX7RoleCompanyList.splice(i, 1);\r\n }\r\n if (selected === true) {\r\n $scope.vm.AX7RoleCompanyList.push(\r\n new RoleCompany({\r\n RoleId: row.RoleId,\r\n CompanyId: company.CompanyId,\r\n RoleName: row.RoleName,\r\n CompanyName: company.CompanyName,\r\n AllCompanies: false\r\n }));\r\n }\r\n\r\n }\r\n });\r\n };\r\n\r\n $scope.updateSelectedRoleCompanies = function (selectedRole, prop, value, applyToAll) {\r\n if (applyToAll) {\r\n $scope.vm.ListOfSelectedAX7Roles.forEach(role => {\r\n role[prop] = value;\r\n })\r\n } else {\r\n selectedRole[prop] = value;\r\n }\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n\r\n $scope.selectedRole = null;\r\n\r\n}","export default /*@ngInject*/ function ($scope, existingUserCheckService, errorsDataService, configurationDataService, $http) {\r\n\r\n //General User\r\n $scope.vm.axUserFromDateObject = null;\r\n $scope.vm.axUserToDateObject = null;\r\n $scope.vm.axUserMaxDate = new Date();\r\n var axUserMinDate = new Date();\r\n axUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.selectADUser = selectADUser;\r\n\r\n $scope.vm.axUserMinDate = axUserMinDate;\r\n\r\n if (!$scope.vm.User.AX7User) {\r\n $scope.vm.User.AX7User = {};\r\n }\r\n $scope.vm.User.AX7User.ProductType = \"AX7\";\r\n\r\n activate();\r\n\r\n function activate() {\r\n if ($scope.vm.ListOfAX7Companies && $scope.vm.ListOfAX7Companies.length > 0) { \r\n setAADFieldRestrictionConfig();\r\n if (!$scope.vm.User.AX7User.NetworkDomain) {\r\n getProvider();\r\n }\r\n\r\n createCompanyDropdown();\r\n }\r\n }\r\n\r\n async function setAADFieldRestrictionConfig() {\r\n try {\r\n const response = await configurationDataService.getProductConfigurationValueByName('ax7', 'IM_DisableAADUserFields');\r\n $scope.disableAADFields = response.data.Value === '1';\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async function getProvider() {\r\n let response = await $http.get(`${apiUrl}api/universal/products/AX7/configuration/im_provider`);\r\n $scope.vm.User.AX7User.NetworkDomain = response.data.Value;\r\n }\r\n\r\n function createCompanyDropdown() {\r\n $scope.vm.axCompanyDropdownOptions = {\r\n valuePrimitive: true,\r\n template: `\r\n {{dataItem.CompanyName}} | {{dataItem.CompanyId}}\r\n `,\r\n filter: \"contains\",\r\n autoBind: true,\r\n minLength: 3,\r\n optionLabel: '-- Select Company --',\r\n filtering: item => {\r\n var filterValue = item.filter != undefined ? item.filter.value : \"\";\r\n item.preventDefault();\r\n\r\n item.sender.dataSource.filter({\r\n logic: \"or\",\r\n filters: [\r\n {\r\n field: \"CompanyName\",\r\n operator: \"contains\",\r\n value: filterValue\r\n },\r\n {\r\n field: \"CompanyId\",\r\n operator: \"contains\",\r\n value: filterValue\r\n }\r\n ]\r\n });\r\n }\r\n };\r\n\r\n $scope.vm.axCompanyDropdownDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n // Only allow Legal Entity Companies to be assigned as Default Company\r\n options.success($scope.vm.ListOfAX7Companies.filter(company => company.CompanyType === 'LegalEntity'));\r\n }\r\n }\r\n });\r\n }\r\n if ($scope.vm.wizardMode === 'New') {\r\n $scope.vm.User.AX7User.Enabled = true;\r\n }\r\n if (!$scope.vm.User.AX7User.PersonUser) {\r\n $scope.vm.User.AX7User.PersonUser = {};\r\n }\r\n\r\n $scope.axUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.AX7User.StartDate === '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.AX7User.StartDate);\r\n }\r\n\r\n $scope.vm.axUserMinDate = date;\r\n $scope.vm.nsMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.AX7User == null) {\r\n $scope.vm.User.AX7User = {};\r\n }\r\n };\r\n\r\n $scope.axUserToDateChanged = function () {\r\n $scope.vm.axUserMaxDate = new Date($scope.vm.User.AX7User.EndDate);\r\n $scope.vm.nsMaxDate = new Date($scope.vm.User.AX7User.EndDate);\r\n $scope.vm.fromMaxDate = new Date($scope.vm.User.AX7User.StartDate);\r\n if ($scope.vm.User.AX7User == null) {\r\n $scope.vm.User.AX7User = {};\r\n }\r\n };\r\n\r\n $scope.existingUserCheck = function (userId) {\r\n existingUserCheckService.checkAX7(userId)\r\n .then(response => {\r\n if (response.data === true) {\r\n $scope.userExists = true;\r\n $scope.wizardForm.AX7userId.$setValidity(\"AX7userId\", false);\r\n }\r\n else {\r\n $scope.userExists = false;\r\n $scope.wizardForm.AX7userId.$setValidity(\"AX7userId\", true);\r\n }\r\n })\r\n .catch(error => {\r\n errorsDataService.catch(error);\r\n });\r\n };\r\n\r\n $scope.$watch(\"vm.User.AX7User.UserId\", () => {\r\n if ($scope.vm.User?.AX7User?.UserId && $scope.vm.wizardMode === 'New') {\r\n $scope.existingUserCheck($scope.vm.User.AX7User.UserId);\r\n }\r\n });\r\n\r\n $scope.$watch(\"vm.ListOfAX7Companies\", () => {\r\n activate();\r\n });\r\n\r\n $scope.setPersonName = function (personObject) {\r\n $scope.vm.User.AX7User.PersonUser = {\r\n PartyNumber: personObject.PartyNumber,\r\n PersonNameAlias: personObject.PersonNameAlias,\r\n PersonName: personObject.PersonName,\r\n PersonPrimaryEmail: personObject.PersonPrimaryEmail\r\n };\r\n\r\n $scope.personSelected = true;\r\n }\r\n\r\n function selectADUser(user) {\r\n $scope.vm.User.AX7User = user;\r\n if (user.UserType !== 'Guest') {\r\n getProvider();\r\n }\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n $scope.addRoleToList = addRoleToList;\r\n $scope.deleteSelectedRole = deleteSelectedRole;\r\n $scope.setSelectedRoleTemplates = setSelectedRoleTemplates;\r\n\r\n function addRoleToList(role) {\r\n $scope.vm.ListOfAvailableD365SRoles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableD365SRoles.splice(i, 1);\r\n $scope.vm.ListOfSelectedD365SRoles.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfD365SRoles();\r\n }\r\n\r\n function deleteSelectedRole(role) {\r\n $scope.vm.ListOfSelectedD365SRoles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedD365SRoles.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableD365SRoles.push(row);\r\n }\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfD365SRoles();\r\n }\r\n\r\n function validateNumberOfD365SRoles() {\r\n $scope.vm.numberOfD365SRolesValid = null;\r\n if ($scope.vm.ListOfSelectedD365SRoles.length > 0) {\r\n $scope.vm.numberOfD365SRolesValid = true;\r\n }\r\n }\r\n\r\n function setSelectedRoleTemplates(selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n $scope.addTeamToList = addTeamToList;\r\n $scope.deleteSelectedTeam = deleteSelectedTeam;\r\n\r\n function addTeamToList(team) {\r\n $scope.vm.ListOfAvailableD365STeams.forEach(function (row, i) {\r\n if (row.Id === team.Id) {\r\n $scope.vm.ListOfAvailableD365STeams.splice(i, 1);\r\n $scope.vm.ListOfSelectedD365STeams.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfD365STeams();\r\n }\r\n\r\n function deleteSelectedTeam(team) {\r\n $scope.vm.ListOfSelectedD365STeams.forEach(function (row, i) {\r\n if (row.Id === team.Id) {\r\n $scope.vm.ListOfSelectedD365STeams.splice(i, 1);\r\n $scope.vm.ListOfAvailableD365STeams.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfD365STeams();\r\n }\r\n\r\n function validateNumberOfD365STeams() {\r\n $scope.vm.numberOf365STeamsValid = null;\r\n if ($scope.vm.ListOfSelectedD365STeams.length > 0) {\r\n $scope.vm.numberOf365STeamsValid = true;\r\n }\r\n }\r\n}","export default /*@ngInject*/ function ($scope, $filter, RequestManagementD365SService, helperService) {\r\n\r\n var vm = this;\r\n vm.licenseTypeDisabled = true;\r\n vm.getLicenseTypes = getLicenseTypes;\r\n vm.businessUnitDropdownChange = businessUnitDropdownChange;\r\n $scope.vm.selectADUser = selectADUser;\r\n if (!$scope.vm.User.D365SUser) {\r\n $scope.vm.User.D365SUser = {};\r\n }\r\n $scope.vm.User.D365SUser.ProductType = 'D365S';\r\n\r\n $scope.$on('im-request-d365s-getlicenseTypes', (event, args) => getLicenseTypes());\r\n\r\n function activate() {\r\n vm.businessUnitsDropdownLoading = true;\r\n vm.usersDropdownLoading = true;\r\n vm.territoryDropdownLoading = true;\r\n vm.siteDropdownLoading = true;\r\n vm.incomingMailDropdownLoading = true;\r\n vm.outgoingMailDropdownLoading = true;\r\n vm.accessModeDropdownLoading = true;\r\n\r\n RequestManagementD365SService.getAllUsers().then(response => {\r\n response.data = $filter('orderBy')(response.data, 'FullName');\r\n vm.D365SUserDataSource = response.data;\r\n vm.usersDropdownLoading = false;\r\n });\r\n\r\n RequestManagementD365SService.getAllBusinessUnits().then(response => {\r\n vm.D365SBusinessUnitDataSource = response.data;\r\n vm.businessUnitsDropdownLoading = false;\r\n });\r\n\r\n RequestManagementD365SService.getAllTerritories().then(response => {\r\n vm.D365STerritoryDataSource = response.data;\r\n vm.territoryDropdownLoading = false;\r\n });\r\n\r\n RequestManagementD365SService.getAllSites().then(response => {\r\n vm.D365SSiteDataSource = response.data;\r\n vm.siteDropdownLoading = false;\r\n });\r\n\r\n RequestManagementD365SService.getAllIncomingMailMethods().then(response => {\r\n vm.D365SIncomingMailMethodsDataSource = response.data.lstOptions;\r\n vm.incomingMailDropdownLoading = false;\r\n });\r\n\r\n RequestManagementD365SService.getAllOutgoingMailMethods().then(response => {\r\n vm.D365SOutgoingMailMethodsDataSource = response.data.lstOptions;\r\n vm.outgoingMailDropdownLoading = false;\r\n });\r\n\r\n RequestManagementD365SService.getAllAccessModes().then(response => {\r\n response.data.lstOptions = $filter('orderBy')(response.data.lstOptions, 'Label');\r\n vm.D365SAccessModeDataSource = response.data.lstOptions;\r\n vm.accessModeDropdownLoading = false;\r\n });\r\n\r\n }\r\n\r\n //activate();\r\n\r\n function getLicenseTypes() {\r\n if ($scope.vm.User.D365SUser.AccessMode !== null) {\r\n vm.licenseTypeDropdownLoading = true;\r\n RequestManagementD365SService.getLicenseTypesByAccessModeId($scope.vm.User.D365SUser.AccessMode).then(response => {\r\n response.data.lstOptions = $filter('orderBy')(response.data.lstOptions, 'Label');\r\n vm.D365SLicenseTypeDataSource = response.data.lstOptions;\r\n vm.licenseTypeDropdownLoading = false;\r\n vm.licenseTypeDisabled = false;\r\n }).catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n vm.licenseTypeDropdownLoading = false;\r\n });\r\n } else {\r\n vm.licenseTypeDisabled = true;\r\n vm.D365SLicenseTypeDataSource = null;\r\n }\r\n }\r\n\r\n function businessUnitDropdownChange() {\r\n $scope.vm.ListOfSelectedD365SRoles = [];\r\n $scope.vm.ListOfSelectedD365STeams = [];\r\n\r\n RequestManagementD365SService.getRolesByBusinessUnitId($scope.vm.User.D365SUser.BusinessUnitId).then(response => {\r\n response.data = response.data.filter(role => role.IsAssignable);\r\n $scope.vm.ListOfAvailableD365SRoles = response.data;\r\n });\r\n\r\n RequestManagementD365SService.getTeamsByBusinessUnitId($scope.vm.User.D365SUser.BusinessUnitId).then(response => {\r\n $scope.vm.ListOfAvailableD365STeams = response.data;\r\n });\r\n }\r\n\r\n function selectADUser(user) {\r\n $scope.vm.User.D365SUser = user;\r\n }\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addCompanyToList = function (company) {\r\n $scope.vm.ListOfAvailableGPCompanies.forEach(function (row, i) {\r\n if (row.Id === company.Id) {\r\n $scope.vm.ListOfAvailableGPCompanies.splice(i, 1);\r\n $scope.vm.ListOfSelectedGPCompanies.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedCompany = function (company) {\r\n $scope.vm.ListOfSelectedGPCompanies.forEach(function (row, i) {\r\n if (row.Id === company.Id) {\r\n $scope.vm.ListOfSelectedGPCompanies.splice(i, 1);\r\n $scope.vm.ListOfAvailableGPCompanies.push(row);\r\n\r\n $scope.vm.ListOfStoredGPRoles = $scope.vm.ListOfStoredGPRoles.filter(selectedRole => selectedRole.Company.Id !== company.Id);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n}","export default /*@ngInject*/ function ($scope, configurationDataService) {\r\n\r\n getRoleDescConfigValue();\r\n\r\n async function getRoleDescConfigValue() {\r\n let response = await configurationDataService.getProductConfigurationValueByName('gp', 'IM_ShowRoleDescription');\r\n $scope.vm.roleDesc = response.data.Value;\r\n }\r\n\r\n if (!$scope.vm.ListOfStoredGPRoles) $scope.vm.ListOfStoredGPRoles = [];\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableGPRoles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableGPRoles.splice(i, 1);\r\n if (!$scope.vm.ListOfStoredGPRoles) $scope.vm.ListOfStoredGPRoles = [];\r\n $scope.vm.ListOfStoredGPRoles.push({ Role: row, Company: $scope.vm.selectedCompany });\r\n $scope.vm.ListOfSelectedGPRoles.push({ Role: row, Company: $scope.vm.selectedCompany });\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedGPRoles.forEach(function (row, i) {\r\n if (row.Role.Id === role.Role.Id && row.Company.Id === role.Company.Id) {\r\n\r\n $scope.vm.ListOfSelectedGPRoles.splice(i, 1);\r\n //This company is for display purposes on the Summary page\r\n row.Role.Company = row.Company;\r\n if (role.Role.IsAssignable) {\r\n $scope.vm.ListOfAvailableGPRoles.push(row.Role);\r\n }\r\n }\r\n });\r\n $scope.vm.ListOfStoredGPRoles.forEach(function (row, i) {\r\n if (row.Role.Id === role.Role.Id && row.Company.Id === role.Company.Id) {\r\n $scope.vm.ListOfStoredGPRoles.splice(i, 1);\r\n }\r\n });\r\n\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.addNewCompany = function () {\r\n var newCompany = angular.copy($scope.vm.selectedCompany);\r\n $scope.vm.User.GPUser.Companies.push({ AltModProfile: $scope.vm.currentAltModProfile, Company: newCompany });\r\n };\r\n\r\n $scope.companyDropdownChange = function () {\r\n $scope.refreshLists();\r\n };\r\n\r\n $scope.profileDropdownChange = function () {\r\n //Set the AltModProfile on the company\r\n if (!$scope.vm.User.GPUser.Companies) {\r\n $scope.vm.User.GPUser.Companies = [];\r\n }\r\n\r\n var foundCompany = $scope.vm.User.GPUser.Companies.find(function (company) {\r\n return company.Company.Id === $scope.vm.selectedCompany.Id;\r\n });\r\n\r\n if (foundCompany) {\r\n foundCompany.AltModProfile = $scope.vm.currentAltModProfile;\r\n } else {\r\n $scope.addNewCompany();\r\n }\r\n };\r\n\r\n $scope.refreshLists = function () {\r\n //Sets the AltModProfile for the selected company if there is an existing user\r\n if ($scope.vm.selectedCompany && $scope.vm.User.GPUser && $scope.vm.User.GPUser.Companies) {\r\n let foundCompany = $scope.vm.User.GPUser.Companies.find(company => company?.Company?.Id === $scope.vm.selectedCompany.Id);\r\n\r\n if (foundCompany) {\r\n if (foundCompany.AltModProfile !== \"\") {\r\n var altModProfileId = foundCompany.AltModProfile.Id ? foundCompany.AltModProfile.Id : foundCompany.AltModProfile;\r\n $scope.vm.currentAltModProfile = $scope.vm.GPAltModProfileDataSource.find(profile => profile.Id === altModProfileId);\r\n }\r\n else {\r\n foundCompany.AltModProfile = $scope.vm.GPAltModProfileDataSource[0];\r\n $scope.vm.currentAltModProfile = $scope.vm.GPAltModProfileDataSource[0];\r\n }\r\n } else {\r\n $scope.vm.currentAltModProfile = $scope.vm.GPAltModProfileDataSource[0];\r\n $scope.addNewCompany();\r\n }\r\n } else {\r\n if (!$scope.vm.User.GPUser.Companies) {\r\n $scope.vm.User.GPUser.Companies = [];\r\n }\r\n $scope.vm.currentAltModProfile = $scope.vm.GPAltModProfileDataSource[0];\r\n $scope.addNewCompany();\r\n }\r\n\r\n if (!$scope.vm.selectedCompany) {\r\n $scope.vm.ListOfAvailableGPRoles = [];\r\n $scope.vm.currentAltModProfile = null;\r\n }\r\n\r\n $scope.vm.ListOfSelectedGPRoles = [];\r\n\r\n //Load the Roles for the selected company\r\n if ($scope.vm.selectedCompany) {\r\n $scope.vm.ListOfAvailableGPRoles = angular.copy($scope.vm.ListOfAllAvailableGPRoles);\r\n if ($scope.defaultRoleTemplate && $scope.vm.wizardMode === \"New\" && !$scope.vm.requestToEdit) { \r\n let defaultRoles = $scope.defaultRoleTemplate.Roles.filter(role => role.TypeId === \"Role\" && role.ProductType === \"GP\");\r\n\r\n defaultRoles.forEach(role => {\r\n $scope.addRoleToList(role);\r\n });\r\n } else if ($scope.vm.ListOfStoredGPRoles) {\r\n $scope.vm.ListOfStoredGPRoles.forEach(roleCompany => {\r\n if (roleCompany.Company.Id.toString() === $scope.vm.selectedCompany.Id.toString()) {\r\n\r\n roleCompany.Pending = $scope.vm.PendingGpRoleCompanies.some(pendingRole => pendingRole.Role.Id === roleCompany.Role.Id && pendingRole.Company.Id === roleCompany.Company.Id);\r\n\r\n $scope.vm.ListOfSelectedGPRoles.push(roleCompany);\r\n\r\n $scope.vm.ListOfAvailableGPRoles.forEach(function (row, i) {\r\n if (row.Id === roleCompany.Role.Id) {\r\n $scope.vm.ListOfAvailableGPRoles.splice(i, 1);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Remove Pending Roles by Company Here\r\n $scope.vm.ListOfAvailableGPRoles = $scope.vm.ListOfAvailableGPRoles.map(availableItem => {\r\n availableItem.Pending = $scope.vm?.PendingGpRoleCompanies?.find(byCompanyAndRole.bind(null, $scope.vm.selectedCompany, availableItem));\r\n\r\n return availableItem;\r\n });\r\n }\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}\r\n\r\nfunction byCompanyAndRole(selectedCompany, availableItem, pendingItem) {\r\n return availableItem.Id === pendingItem.Role.Id && selectedCompany.Id === pendingItem.Company.Id;\r\n}","export default /*@ngInject*/ function ($scope, $rootScope, $filter, $uibModal, RequestManagementGPService, errorsDataService, existingUserCheckService) {\r\n\r\n var vm = $scope.vm;\r\n vm.GPUserExists = null;\r\n\r\n if (!$scope.vm.User.GPUser) {\r\n $scope.vm.User.GPUser = {};\r\n }\r\n $scope.vm.User.GPUser.ProductType = 'GP';\r\n\r\n function getLoginTypes() {\r\n $scope.vm.GPLoginTypesDataSource = RequestManagementGPService.getGPLoginTypes();\r\n }\r\n function getUserTypes() {\r\n\r\n $scope.vm.GPUserTypesDataSource = RequestManagementGPService.getGPUserTypes();\r\n\r\n //If version is less than GP 2015, remove Self Service user type\r\n if ($rootScope.ConfigurationValues.GP_Version < 5) {\r\n $scope.vm.GPUserTypesDataSource = $filter('filter')($scope.vm.GPUserTypesDataSource, { Id: '!' + 3 });\r\n }\r\n }\r\n function getStatuses() {\r\n $scope.vm.GPStatusesDataSource = RequestManagementGPService.getGPStatuses();\r\n }\r\n\r\n getLoginTypes();\r\n getUserTypes();\r\n getStatuses();\r\n\r\n //General User\r\n vm.gpUserFromDateObject = null;\r\n vm.gpUserToDateObject = null;\r\n vm.gpUserMnsDate = new Date();\r\n var gpUserMinDate = new Date();\r\n gpUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n vm.gpUserMinDate = gpUserMinDate;\r\n vm.gpUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.GPUser.StartDate === '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.GPUser.StartDate);\r\n }\r\n\r\n $scope.vm.gpUserMinDate = date;\r\n $scope.vm.gpMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.GPUser == null) {\r\n $scope.vm.User.GPUser = {};\r\n }\r\n };\r\n vm.gpUserToDateChanged = function () {\r\n $scope.vm.gpUserMnsDate = new Date($scope.vm.User.GPUser.EndDate);\r\n $scope.vm.gpMnsDate = new Date($scope.vm.User.GPUser.EndDate);\r\n $scope.vm.fromMnsDate = new Date($scope.vm.User.GPUser.StartDate);\r\n if ($scope.vm.User.GPUser == null) {\r\n $scope.vm.User.GPUser = {};\r\n }\r\n };\r\n\r\n vm.clearWindowsUser = function () {\r\n if (vm.User != null && vm.User.GPUser != null) {\r\n vm.User.GPUser.WindowsUserId = null;\r\n vm.User.GPUser.NetBiosName = null;\r\n vm.User.GPUser.ADUserId = null;\r\n\r\n vm.User.GPUser.Id = null;\r\n vm.User.GPUser.UserName = null;\r\n\r\n vm.GPUserExists = null;\r\n }\r\n };\r\n\r\n $scope.existingUserCheck = function (userId) {\r\n existingUserCheckService.checkGP(userId)\r\n .then(response => {\r\n $scope.vm.GPUserExists = response.data;\r\n if (response.data === true) {\r\n $scope.wizardForm.GPuserId.$setValidity(\"GPuserId\", false);\r\n } else {\r\n $scope.wizardForm.GPuserId.$setValidity(\"GPuserId\", true);\r\n }\r\n }).catch(error => {\r\n errorsDataService.catch(error);\r\n });\r\n };\r\n\r\n $scope.$watch(\"vm.User.GPUser.Id\", () => {\r\n if (vm.User.GPUser.Id && vm.wizardMode === 'New') {\r\n $scope.existingUserCheck(vm.User.GPUser.Id);\r\n }\r\n });\r\n\r\n}\r\n","export default /*@ngInject*/ function ($scope, configurationDataService) {\r\n\r\n getRoleDescConfigValue();\r\n\r\n async function getRoleDescConfigValue() {\r\n let response = await configurationDataService.getProductConfigurationValueByName('nav', 'IM_ShowRoleDescription');\r\n $scope.roleDesc = response.data.Value;\r\n }\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n var RoleCompany = function (params) {\r\n this.RoleId = params.RoleId;\r\n this.CompanyId = params.CompanyId;\r\n this.RoleName = params.RoleName;\r\n this.CompanyName = params.CompanyName;\r\n this.AllCompanies = params.AllCompanies;\r\n };\r\n\r\n $scope.AllCompanies = false;\r\n\r\n $scope.handleNavPermissionCompany = function (permissionSet) {\r\n permissionSet.Companies = permissionSet.CompanyNames.map(name => {\r\n return { Name: name };\r\n });\r\n };\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableNAVPermissionSets.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableNAVPermissionSets.splice(i, 1);\r\n $scope.vm.ListOfSelectedNAVPermissionSets.push(role);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedNAVPermissionSets.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedNAVPermissionSets.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableNAVPermissionSets.push(row);\r\n }\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.addRoleCompany = function (company, selected) {\r\n $scope.vm.ListOfSelectedNAVPermissionSets.forEach(function (row, i) {\r\n if (row.Id === $scope.selectedRole.Id) {\r\n\r\n if (!row.CompanyId || selected === false) {\r\n $scope.vm.NAVRoleCompanyList.splice(i, 1);\r\n }\r\n if (selected === true) {\r\n $scope.vm.NAVRoleCompanyList.push(\r\n new RoleCompany({\r\n RoleId: row.RoleId,\r\n CompanyId: company.CompanyId,\r\n RoleName: row.RoleName,\r\n CompanyName: company.CompanyName,\r\n AllCompanies: false\r\n }));\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.selectedRole = null;\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.changeClass = function(userGroup){\r\n $scope.vm.ListOfAvailableNAVUserGroups.forEach(function (group) {\r\n group.isSelected = false;\r\n });\r\n userGroup.isSelected = true;\r\n };\r\n\r\n var RoleCompany = function (params) {\r\n this.RoleId = params.RoleId;\r\n this.CompanyId = params.CompanyId;\r\n this.RoleName = params.RoleName;\r\n this.CompanyName = params.CompanyName;\r\n this.AllCompanies = params.AllCompanies;\r\n };\r\n\r\n $scope.AllCompanies = false;\r\n\r\n $scope.handleNavGroupCompany = function (group) {\r\n group.Companies = group.CompanyNames.map(name => {\r\n return { Name: name };\r\n });\r\n };\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableNAVUserGroups.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableNAVUserGroups.splice(i, 1);\r\n $scope.vm.ListOfSelectedNAVUserGroups.push(role);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedNAVUserGroups.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedNAVUserGroups.splice(i, 1);\r\n $scope.vm.ListOfAvailableNAVUserGroups.push(row);\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.addRoleCompany = function (company, selected) {\r\n $scope.vm.ListOfSelectedNAVUserGroups.forEach(function (row, i) {\r\n if (row.Id === $scope.selectedRole.Id) {\r\n\r\n if (row.CompanyId == null || selected == false) {\r\n $scope.vm.NAVRoleCompanyList.splice(i, 1);\r\n }\r\n if (selected == true) {\r\n $scope.vm.NAVRoleCompanyList.push(\r\n new RoleCompany({\r\n RoleId: row.RoleId,\r\n CompanyId: company.CompanyId,\r\n RoleName: row.RoleName,\r\n CompanyName: company.CompanyName,\r\n AllCompanies: false\r\n }));\r\n }\r\n\r\n }\r\n });\r\n };\r\n\r\n $scope.selectedRole = null;\r\n\r\n}","export default /*@ngInject*/ function ($scope, $uibModal, RequestManagementNAVService) {\r\n $scope.testing = {};\r\n\r\n function getNAVLicenseTypes() {\r\n $scope.vm.NAVLicenseTypeDataSource = RequestManagementNAVService.getNAVLicenseTypes();\r\n }\r\n\r\n if (!$scope.vm.User.NAVUser) {\r\n $scope.vm.User.NAVUser = {};\r\n }\r\n $scope.vm.User.NAVUser.ProductType = 'NAV';\r\n $scope.vm.User.NAVUser.State = '0';\r\n\r\n getNAVLicenseTypes();\r\n \r\n //General User\r\n $scope.vm.nsUserFromDateObject = null;\r\n $scope.vm.nsUserToDateObject = null;\r\n $scope.vm.nsUserMnsDate = new Date();\r\n var nsUserMinDate = new Date();\r\n nsUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.nsUserMinDate = nsUserMinDate;\r\n\r\n $scope.nsUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.NAVUser.StartDate == '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.NAVUser.StartDate);\r\n }\r\n\r\n $scope.vm.nsUserMinDate = date;\r\n $scope.vm.nsMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.NAVUser == null) {\r\n $scope.vm.User.NAVUser = {};\r\n $scope.vm.User.NAVUser.State = 0;\r\n }\r\n };\r\n\r\n $scope.nsUserToDateChanged = function () {\r\n $scope.vm.nsUserMnsDate = new Date($scope.vm.User.NAVUser.EndDate);\r\n $scope.vm.nsMnsDate = new Date($scope.vm.User.NAVUser.EndDate);\r\n $scope.vm.fromMnsDate = new Date($scope.vm.User.NAVUser.StartDate);\r\n if ($scope.vm.User.NAVUser == null) {\r\n $scope.vm.User.NAVUser = {};\r\n $scope.vm.User.NAVUser.State = 0;\r\n }\r\n };\r\n\r\n}\r\n\r\n","import { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, data, helperService) {\r\n\r\n var vm = $scope.vm = {};\r\n\r\n //Search Existing Users\r\n var getDuplicateGridColumns = function () {\r\n return [\r\n { field: \"FirstName\", title: \"First Name\", filterable: false },\r\n { field: \"LastName\", title: \"Last Name\", filterable: false },\r\n { field: \"Email\", title: \"Email\", filterable: false }\r\n ];\r\n };\r\n\r\n vm.DuplicateUserGridOptions = helperService.setMainGridOptions(getDuplicateGridColumns(), 350);\r\n vm.DuplicateUserGridOptions.autoBind = true;\r\n\r\n $scope.DuplicateNetSuiteUserGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n data: data.NetSuiteUsers\r\n });\r\n\r\n vm.changeSelectedUser = function (kendoEvent) {\r\n\r\n var grid = kendoEvent.sender;\r\n var selectedExistingUser = grid.dataItem(grid.select());\r\n\r\n var User = {};\r\n User.Applications = [];\r\n User.UserMaster = data.UserMasterRecord;\r\n\r\n User.NetSuiteUser = selectedExistingUser;\r\n $uibModalInstance.close(User);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addNSPermissionToList = function (permission) {\r\n\r\n $scope.vm.ListOfAvailableNetSuitePermissions.forEach(function (row, i) {\r\n if (row.Id === permission.Id) {\r\n $scope.vm.ListOfAvailableNetSuitePermissions.splice(i, 1);\r\n row.selectedLevel = null;\r\n $scope.vm.ListOfSelectedNetSuitePermissions.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedPermission = function (selectedPermission) {\r\n $scope.vm.ListOfSelectedNetSuitePermissions.forEach(function (row, i) {\r\n if (row.Id === selectedPermission.Id) {\r\n $scope.vm.ListOfSelectedNetSuitePermissions.splice(i, 1);\r\n $scope.vm.ListOfAvailableNetSuitePermissions.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n \r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.validateNumberOfNetSuiteRoles = validateNumberOfNetSuiteRoles;\r\n\r\n function validateNumberOfNetSuiteRoles() {\r\n $scope.vm.numberOfNetSuiteRolesValid = null;\r\n if ($scope.vm.wizardMode === 'Modify') {\r\n $scope.vm.numberOfNetSuiteRolesValid = true;\r\n } else {\r\n if ($scope.vm.ListOfSelectedNetSuiteRoles.length > 0) {\r\n $scope.vm.numberOfNetSuiteRolesValid = true;\r\n }\r\n }\r\n }\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableNetSuiteRoles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableNetSuiteRoles.splice(i, 1);\r\n $scope.vm.ListOfSelectedNetSuiteRoles.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfNetSuiteRoles();\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedNetSuiteRoles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedNetSuiteRoles.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableNetSuiteRoles.push(row);\r\n }\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfNetSuiteRoles();\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","import { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, RequestManagementNetSuiteService, manageDataDataService, $http) {\r\n\r\n if (!$scope.vm.User.NetSuiteUser) {\r\n $scope.vm.User.NetSuiteUser = {};\r\n }\r\n\r\n $scope.vm.selectUser = selectUser;\r\n $scope.vm.User.NetSuiteUser.ProductType = \"NS\";\r\n setFieldConfigurationValues();\r\n\r\n $scope.vm.subsidiaryDropdownChange = function (netSuiteUser) {\r\n getDepartments(netSuiteUser);\r\n getClasses(netSuiteUser);\r\n getLocations(netSuiteUser);\r\n };\r\n\r\n function getDepartments(netSuiteUser) {\r\n //If the user is not passed in try the $scope to get the data\r\n if (netSuiteUser == null) {\r\n netSuiteUser = $scope.vm.User.NetSuiteUser;\r\n }\r\n\r\n if (netSuiteUser.Subsidiary) {\r\n RequestManagementNetSuiteService.getDepartmentsBySubsidiary(netSuiteUser.Subsidiary.Id).then(function (response) {\r\n $scope.vm.NSDepartmentDataSource = response.data;\r\n });\r\n }\r\n }\r\n\r\n function getClasses(netSuiteUser) {\r\n //If the user is not passed in try the $scope to get the data\r\n if (netSuiteUser == null) {\r\n netSuiteUser = $scope.vm.User.NetSuiteUser;\r\n }\r\n\r\n if (netSuiteUser.Subsidiary) {\r\n RequestManagementNetSuiteService.getClassesBySubsidiary(netSuiteUser.Subsidiary.Id).then(function (response) {\r\n $scope.vm.NSClassDataSource = response.data;\r\n });\r\n }\r\n }\r\n\r\n function getLocations(netSuiteUser) {\r\n //If the user is not passed in try the $scope to get the data\r\n if (netSuiteUser == null) {\r\n netSuiteUser = $scope.vm.User.NetSuiteUser;\r\n }\r\n\r\n if (netSuiteUser.Subsidiary) {\r\n RequestManagementNetSuiteService.getLocationsBySubsidiary(netSuiteUser.Subsidiary.Id).then(function (response) {\r\n $scope.vm.NSLocationDataSource = response.data;\r\n });\r\n }\r\n }\r\n\r\n $scope.vm.clearNSUser = function () {\r\n $scope.vm.User.NetSuiteUser = null;\r\n $scope.vm.NSDepartmentDataSource = null;\r\n $scope.vm.NSLocationDataSource = null;\r\n $scope.vm.NSClassDataSource = null;\r\n };\r\n\r\n //General User\r\n $scope.vm.nsUserFromDateObject = null;\r\n $scope.vm.nsUserToDateObject = null;\r\n $scope.vm.nsUserMnsDate = new Date();\r\n var nsUserMinDate = new Date();\r\n nsUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.nsUserMinDate = nsUserMinDate;\r\n\r\n $scope.nsUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.NetSuiteUser.StartDate === '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.NetSuiteUser.StartDate);\r\n }\r\n\r\n $scope.vm.nsUserMinDate = date;\r\n $scope.vm.nsMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.NetSuiteUser == null) {\r\n $scope.vm.User.NetSuiteUser = {};\r\n }\r\n };\r\n\r\n $scope.nsUserToDateChanged = function () {\r\n $scope.vm.nsUserMnsDate = new Date($scope.vm.User.NetSuiteUser.EndDate);\r\n $scope.vm.nsMnsDate = new Date($scope.vm.User.NetSuiteUser.EndDate);\r\n $scope.vm.fromMnsDate = new Date($scope.vm.User.NetSuiteUser.StartDate);\r\n if ($scope.vm.User.NetSuiteUser == null) {\r\n $scope.vm.User.NetSuiteUser = {};\r\n }\r\n };\r\n\r\n $scope.openModal = function () {\r\n $scope.vm.ExistingWindowsUserSearchString = null;\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/SearchWindowsUsersModal.html',\r\n controller: SearchNonNSUsersController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n };\r\n\r\n async function setFieldConfigurationValues() {\r\n $scope.vm.showADUserLookup = $scope.vm.config.find(config => config.Name === 'AD_Active').Value === '1';\r\n $scope.vm.showAADUserLookup = $scope.vm.config.find(config => config.Name === 'AAD_Active').Value === '1';\r\n let response = await manageDataDataService.getConfigurationByProductId('NS');\r\n $scope.vm.disableADUserFields = response.data.find(config => config.Name === 'IM_DisableADUserFields').Value === '1' && $scope.vm.showADUserLookup;\r\n $scope.vm.disableAADUserFields = response.data.find(config => config.Name === 'IM_DisableAADUserFields').Value === '1' && $scope.vm.showAADUserLookup;\r\n }\r\n\r\n function selectUser(user) {\r\n $scope.vm.User.NetSuiteUser = user;\r\n if (user.UserType !== 'Guest') {\r\n setProvider();\r\n }\r\n }\r\n\r\n async function setProvider() {\r\n const { data } = await $http.get(`${apiUrl}api/universal/products/NS/configuration/im_provider`);\r\n $scope.vm.User.NetSuiteUser.NetworkDomain = data.Value;\r\n }\r\n\r\n}\r\n\r\nfunction SearchNonNSUsersController($scope, $rootScope, $filter, $http, $uibModalInstance, helperService) {\r\n\r\n var vm = $scope.vm;\r\n $scope.selectedUser = null;\r\n $scope.modalTitle = 'Search for Existing NetSuite Employee';\r\n vm.ExistingWindowsUserSearchString = '';\r\n\r\n //Search Existing Users\r\n var getExistingUserGridColumns = function () {\r\n return [\r\n { field: \"FirstName\", title: \"First Name\", filterable: false },\r\n { field: \"LastName\", title: \"Last Name\", filterable: false },\r\n { field: \"Email\", title: \"Email\", filterable: false }\r\n ];\r\n };\r\n\r\n $scope.doneSearchingUsers = function (vm) {\r\n $rootScope.IMSelectedExistingUser = null;\r\n\r\n if (vm.ExistingWindowsUserSearchString === '' || vm.ExistingWindowsUserSearchString == null) {\r\n\r\n var raw = vm.ExistingusersGridDataSource.data();\r\n var length = raw.length;\r\n\r\n var item, i;\r\n for (i = length - 1; i >= 0; i--) {\r\n\r\n item = raw[i];\r\n vm.ExistingusersGridDataSource.remove(item);\r\n\r\n }\r\n } else {\r\n if (vm.wizardMode === 'Terminate') {\r\n vm.ExistingusersGridDataSource.read();\r\n } else {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n };\r\n\r\n vm.ExistingUsersGridOptions = helperService.setMainGridOptions(getExistingUserGridColumns(), 350);\r\n vm.ExistingUsersGridOptions.autoBind = false;\r\n vm.ExistingUsersGridOptions.pageable = false;\r\n\r\n vm.ExistingusersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: `${apiUrl}api/identitymanager/ns/employees/search`,\r\n params: { searchStr: vm.ExistingWindowsUserSearchString }\r\n }).then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'UserName');\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n vm.searchKeyDown = function () {\r\n vm.SearchExistingUserSelected = null;\r\n };\r\n\r\n vm.changeExistingUserRowSelected = function (kendoEvent) {\r\n var grid = kendoEvent.sender;\r\n $scope.selectedUser = grid.dataItem(grid.select());\r\n };\r\n\r\n $scope.selectUser = function () {\r\n if ($scope.selectedUser != null) {\r\n if (vm.User.NetSuiteUserUser == null) {\r\n vm.User.NetSuiteUserUser = {};\r\n }\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/ns/employees/' + $scope.selectedUser.Id\r\n\r\n }).then(function (response) {\r\n\r\n vm.User.NetSuiteUser = response.data;\r\n vm.ListOfSelectedNetSuiteRoles = response.data.Roles;\r\n updateListOfAvailableRoles();\r\n vm.subsidiaryDropdownChange();\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n\r\n }\r\n vm.ExistingWindowsUserSearchString = null;\r\n\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n function updateListOfAvailableRoles() {\r\n vm.ListOfSelectedNetSuiteRoles.forEach(function (role) {\r\n vm.ListOfAvailableNetSuiteRoles.forEach(function (availableRole, j) {\r\n if (availableRole.Id === role.Id) {\r\n vm.ListOfAvailableNetSuiteRoles.splice(j, 1);\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n $scope.vm.validateNumberOfOracleResponsibilities = validateNumberOfOracleResponsibilities;\r\n\r\n function validateNumberOfOracleResponsibilities() {\r\n $scope.vm.numberOfOracleResponsibilitiesValid = null;\r\n if ($scope.vm.ORRBACEnabled) {\r\n if ($scope.vm.ListOfSelectedOracleResponsibilities.length > 0 || $scope.vm.ListOfSelectedOracleRoles.length > 0) {\r\n $scope.vm.numberOfOracleResponsibilitiesValid = true;\r\n }\r\n }\r\n if ($scope.vm.ListOfSelectedOracleResponsibilities.length > 0) {\r\n $scope.vm.numberOfOracleResponsibilitiesValid = true;\r\n }\r\n }\r\n\r\n $scope.addResponsibilityToList = function (responsibility) {\r\n $scope.vm.ListOfAvailableOracleResponsibilities.forEach(function (row, i) {\r\n if (row.Id === responsibility.Id) {\r\n $scope.vm.ListOfAvailableOracleResponsibilities.splice(i, 1);\r\n $scope.vm.ListOfSelectedOracleResponsibilities.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfOracleResponsibilities();\r\n };\r\n\r\n $scope.deleteSelectedResponsibility = function (responsibility) {\r\n $scope.vm.ListOfSelectedOracleResponsibilities.forEach(function (row, i) {\r\n if (row.Id === responsibility.Id) {\r\n $scope.vm.ListOfSelectedOracleResponsibilities.splice(i, 1);\r\n if (responsibility.IsAssignable) {\r\n $scope.vm.ListOfAvailableOracleResponsibilities.push(row);\r\n }\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfOracleResponsibilities();\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableOracleRoles.forEach(function (row, i) {\r\n if (row.Name === role.Name) {\r\n $scope.vm.ListOfAvailableOracleRoles.splice(i, 1);\r\n $scope.vm.ListOfSelectedOracleRoles.push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n $scope.vm.validateNumberOfOracleResponsibilities();\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedOracleRoles.forEach(function (row, i) {\r\n if (row.Name === role.Name) {\r\n $scope.vm.ListOfSelectedOracleRoles.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableOracleRoles.push(row);\r\n }\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n $scope.vm.validateNumberOfOracleResponsibilities();\r\n };\r\n}","export default /*@ngInject*/ function ($scope, RequestManagementOracleService, existingUserCheckService, errorsDataService, manageDataDataService, $http) {\r\n\r\n $scope.vm.PasswordExpirationOptions = RequestManagementOracleService.getPasswordExpirationTypes();\r\n\r\n //General User\r\n $scope.vm.userFromDateObject = null;\r\n $scope.vm.userToDateObject = null;\r\n $scope.vm.userMinDate = new Date();\r\n if (!$scope.vm.User.OracleUser) {\r\n $scope.vm.User.OracleUser = {};\r\n }\r\n $scope.vm.selectUser = selectUser;\r\n $scope.vm.User.OracleUser.ProductType = \"OR\";\r\n setFieldConfigurationValues();\r\n var userMinDate = new Date();\r\n userMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.userMinDate = userMinDate;\r\n\r\n $scope.userFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.OracleUser.StartDate == '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.OracleUser.StartDate);\r\n }\r\n\r\n $scope.vm.userMinDate = date;\r\n $scope.vm.minDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.OracleUser == null) {\r\n $scope.vm.User.OracleUser = {};\r\n }\r\n };\r\n\r\n $scope.userToDateChanged = function () {\r\n $scope.vm.userMinDate = new Date($scope.vm.User.OracleUser.EndDate);\r\n $scope.vm.minDate = new Date($scope.vm.User.OracleUser.EndDate);\r\n $scope.vm.fromMinDate = new Date($scope.vm.User.OracleUser.StartDate);\r\n if ($scope.vm.User.OracleUser == null) {\r\n $scope.vm.User.OracleUser = {};\r\n }\r\n };\r\n\r\n async function existingUserCheck(username) {\r\n try {\r\n const res = await existingUserCheckService.checkOR(username);\r\n if (res.data === true) {\r\n $scope.wizardForm.ORusername.$setValidity(\"ORusername\", false);\r\n $scope.vm.userExists = true;\r\n }\r\n else {\r\n $scope.wizardForm.ORusername.$setValidity(\"ORusername\", true);\r\n $scope.vm.userExists = false;\r\n }\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n };\r\n\r\n $scope.$watch(\"vm.User.OracleUser.Name\", () => {\r\n if ($scope.vm.User.OracleUser.Name && $scope.vm.wizardMode === 'New') {\r\n existingUserCheck($scope.vm.User.OracleUser.Name)\r\n }\r\n });\r\n\r\n async function setFieldConfigurationValues() {\r\n $scope.vm.showADUserLookup = $scope.vm.config.find(config => config.Name === 'AD_Active').Value === '1';\r\n $scope.vm.showAADUserLookup = $scope.vm.config.find(config => config.Name === 'AAD_Active').Value === '1';\r\n let response = await manageDataDataService.getConfigurationByProductId('OR');\r\n $scope.vm.disableADUserFields = response.data.find(config => config.Name === 'IM_DisableADUserFields').Value === '1' && $scope.vm.showADUserLookup;\r\n $scope.vm.disableAADUserFields = response.data.find(config => config.Name === 'IM_DisableAADUserFields').Value === '1' && $scope.vm.showAADUserLookup;\r\n }\r\n\r\n function selectUser(user) {\r\n $scope.vm.User.OracleUser = user;\r\n if (user.UserType !== 'Guest') {\r\n setProvider();\r\n }\r\n }\r\n\r\n async function setProvider() {\r\n const { data } = await $http.get(`${apiUrl}api/universal/products/NS/configuration/im_provider`);\r\n $scope.vm.User.OracleUser.NetworkDomain = data.Value;\r\n }\r\n}","export default /*@ngInject*/ function ($scope, configurationDataService) {\r\n\r\n getRoleDescConfigValue();\r\n\r\n async function getRoleDescConfigValue() {\r\n let response = await configurationDataService.getProductConfigurationValueByName('orfc', 'IM_ShowRoleDescription');\r\n $scope.roleDesc = response.data.Value;\r\n }\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableOracleCloudRoles.forEach(function (row, i) {\r\n if (row.RoleID === role.RoleID) {\r\n $scope.vm.ListOfAvailableOracleCloudRoles.splice(i, 1);\r\n $scope.vm.ListOfStoredOracleCloudRoles.push({ Role: row });\r\n $scope.vm.ListOfSelectedOracleCloudRoles.push(role);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n\r\n $scope.vm.ListOfSelectedOracleCloudRoles.forEach(function (row, i) {\r\n if (row.RoleID === role.RoleID) {\r\n $scope.vm.ListOfSelectedOracleCloudRoles.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableOracleCloudRoles.push(role);\r\n }\r\n }\r\n });\r\n $scope.vm.ListOfStoredOracleCloudRoles.forEach(function (row, j) {\r\n if (row.RoleID === role.RoleID) {\r\n $scope.vm.ListOfStoredOracleCloudRoles.splice(j, 1);\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n\r\n}","export default /*@ngInject*/ function ($scope, manageDataDataService, $http) {\r\n var orfcUserMinDate = new Date();\r\n orfcUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.selectUser = selectUser;\r\n\r\n setFieldConfigurationValues();\r\n\r\n if (!$scope.vm.User.OracleCloudUser) {\r\n $scope.vm.User.OracleCloudUser = {};\r\n }\r\n $scope.vm.User.OracleCloudUser.ProductType = \"ORFC\";\r\n\r\n $scope.vm.orfcUserMinDate = orfcUserMinDate;\r\n if (!$scope.vm.User.OracleCloudUser) {\r\n $scope.vm.User.OracleCloudUser = {};\r\n }\r\n\r\n\r\n $scope.orfcUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.OracleCloudUser.StartDate === '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.OracleCloudUser.StartDate);\r\n }\r\n\r\n $scope.vm.orfcUserMinDate = date;\r\n $scope.vm.orfcMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.OracleCloudUser == null) {\r\n $scope.vm.User.OracleCloudUser = {};\r\n }\r\n };\r\n\r\n $scope.orfcUserToDateChanged = function () {\r\n $scope.vm.orfcUserMinDate = new Date($scope.vm.User.OracleCloudUser.EndDate);\r\n $scope.vm.orfcMinDate = new Date($scope.vm.User.OracleCloudUser.EndDate);\r\n $scope.vm.fromMinDate = new Date($scope.vm.User.OracleCloudUser.StartDate);\r\n if ($scope.vm.User.OracleCloudUser == null) {\r\n $scope.vm.User.OracleCloudUser = {};\r\n }\r\n };\r\n\r\n async function setFieldConfigurationValues() {\r\n $scope.vm.showADUserLookup = $scope.vm.config.find(config => config.Name === 'AD_Active').Value === '1';\r\n $scope.vm.showAADUserLookup = $scope.vm.config.find(config => config.Name === 'AAD_Active').Value === '1';\r\n let response = await manageDataDataService.getConfigurationByProductId('ORFC');\r\n $scope.vm.disableADUserFields = response.data.find(config => config.Name === 'IM_DisableADUserFields').Value === '1' && $scope.vm.showADUserLookup;\r\n $scope.vm.disableAADUserFields = response.data.find(config => config.Name === 'IM_DisableAADUserFields').Value === '1' && $scope.vm.showAADUserLookup;\r\n }\r\n\r\n function selectUser(user) {\r\n $scope.vm.User.OracleCloudUser = user;\r\n if (user.UserType !== 'Guest') {\r\n setProvider();\r\n }\r\n }\r\n\r\n async function setProvider() {\r\n const { data } = await $http.get(`${apiUrl}api/universal/products/ORFC/configuration/im_provider`);\r\n $scope.vm.User.OracleCloudUser.NetworkDomain = data.Value;\r\n }\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n $scope.validateNumberOfSAPRoleObjects = validateNumberOfSAPRoleObjects;\r\n\r\n $scope.addRoleObjectToList = function (roleObject, productName) {\r\n $scope.vm.ListOfAvailableSAPRoleObjects[productName].forEach(function (row, i) {\r\n if (row.Id === roleObject.Id) {\r\n $scope.vm.ListOfAvailableSAPRoleObjects[productName].splice(i, 1);\r\n $scope.vm.ListOfSelectedSAPRoleObjects[productName].push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfSAPRoleObjects(productName);\r\n };\r\n\r\n $scope.deleteSelectedRoleObject = function (roleObject, productName) {\r\n $scope.vm.ListOfSelectedSAPRoleObjects[productName].forEach(function (row, i) {\r\n if (row.Id === roleObject.Id) {\r\n $scope.vm.ListOfSelectedSAPRoleObjects[productName].splice(i, 1);\r\n $scope.vm.ListOfAvailableSAPRoleObjects[productName].push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfSAPRoleObjects(productName);\r\n };\r\n\r\n function validateNumberOfSAPRoleObjects(productName) {\r\n if (!$scope.vm.numberOfSAPRoleObjectsValid) {\r\n $scope.vm.numberOfSAPRoleObjectsValid = [];\r\n }\r\n $scope.vm.numberOfSAPRoleObjectsValid[productName] = null;\r\n if ($scope.vm.ListOfSelectedSAPRoleObjects[productName].length > 0) {\r\n $scope.vm.numberOfSAPRoleObjectsValid[productName] = true;\r\n }\r\n }\r\n}","export default /*@ngInject*/ function ($scope, configurationDataService) {\r\n\r\n getRoleDescConfigValue();\r\n\r\n async function getRoleDescConfigValue() {\r\n let response = await configurationDataService.getProductConfigurationValueByName('sap', 'IM_ShowRoleDescription');\r\n $scope.roleDesc = response.data.Value;\r\n }\r\n\r\n $scope.addSingleRoleToList = function (role, productName) {\r\n $scope.vm.ListOfAvailableSAPSingleRoles[productName].forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableSAPSingleRoles[productName].splice(i, 1);\r\n $scope.vm.ListOfSelectedSAPSingleRoles[productName].push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedSingleRole = function (role, productName) {\r\n $scope.vm.ListOfSelectedSAPSingleRoles[productName].forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedSAPSingleRoles[productName].splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableSAPSingleRoles[productName].push(row);\r\n }\r\n if (role.IsEmergencyAccess) {\r\n // Clear out selected TCodes\r\n $scope.vm.ListOfAvailableSAPRoleObjects[productName] = null;\r\n $scope.vm.ListOfSelectedSAPRoleObjects[productName] = null;\r\n }\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","export default /*@ngInject*/ function ($scope, RequestManagementSAPService, passwordCriteriaDataService, manageDataDataService) {\r\n $scope.vm.selectUser = selectUser;\r\n\r\n function getUserTypes() {\r\n $scope.vm.SAPUserTypeDataSource = RequestManagementSAPService.getSAPUserTypes();\r\n }\r\n\r\n getUserTypes();\r\n\r\n if (!$scope.vm.User.SAPUser) {\r\n $scope.vm.User.SAPUser = {};\r\n }\r\n\r\n //General User\r\n $scope.vm.sapUserFromDateObject = null;\r\n $scope.vm.sapUserToDateObject = null;\r\n $scope.vm.sapUserMaxDate = new Date();\r\n var sapUserMinDate = new Date();\r\n sapUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.sapUserMinDate = sapUserMinDate;\r\n setFieldConfigurationValues();\r\n\r\n $scope.sapUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.SAPUser.StartDate === '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.SAPUser.StartDate);\r\n }\r\n\r\n $scope.vm.sapUserMinDate = date;\r\n $scope.vm.nsMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.SAPUser == null) {\r\n $scope.vm.User.SAPUser = {};\r\n }\r\n };\r\n\r\n $scope.sapUserToDateChanged = function () {\r\n $scope.vm.sapUserMaxDate = new Date($scope.vm.User.SAPUser.EndDate);\r\n $scope.vm.nsMaxDate = new Date($scope.vm.User.SAPUser.EndDate);\r\n $scope.vm.fromMaxDate = new Date($scope.vm.User.SAPUser.StartDate);\r\n if ($scope.vm.User.SAPUser == null) {\r\n $scope.vm.User.SAPUser = {};\r\n }\r\n };\r\n\r\n async function setFieldConfigurationValues() {\r\n $scope.vm.showADUserLookup = $scope.vm.config.find(config => config.Name === 'AD_Active').Value === '1';\r\n $scope.vm.showAADUserLookup = $scope.vm.config.find(config => config.Name === 'AAD_Active').Value === '1';\r\n let response = await manageDataDataService.getConfigurationByProductId('SAP');\r\n $scope.vm.disableADUserFields = response.data.find(config => config.Name === 'IM_DisableADUserFields').Value === '1' && $scope.vm.showADUserLookup && $scope.vm.wizardMode === 'New';\r\n $scope.vm.disableAADUserFields = response.data.find(config => config.Name === 'IM_DisableAADUserFields').Value === '1' && $scope.vm.showAADUserLookup && $scope.vm.wizardMode === 'New';\r\n }\r\n\r\n function selectUser(user, product) {\r\n $scope.vm.User.SAPUser[product] = user;\r\n }\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n $scope.invalidEmergencyAccessEndDate = false;\r\n\r\n if ($scope.vm.alternatePath === \"EmergencyAccess\") {\r\n $scope.emergencyAccessPeriod = Number(JSON.parse(localStorage.getItem(\"ConfigurationValues\")).MaxFirefighterAccessPeriod);\r\n $scope.maxEndDate = new Date();\r\n $scope.maxEndDate.setTime($scope.maxEndDate.getTime() + ($scope.emergencyAccessPeriod * 60 * 60 * 1000));\r\n }\r\n\r\n $scope.clearEffectiveDates = function (dataItem) {\r\n dataItem.StartDate = null;\r\n dataItem.EndDate = null;\r\n\r\n $scope.vm.fromDateString = '';\r\n $scope.vm.toDateString = '';\r\n\r\n $scope.setSelectedEffectiveDates(null, null, dataItem);\r\n };\r\n\r\n $scope.vm.fromDateString = '';\r\n $scope.vm.fromDateObject;\r\n $scope.vm.toDateString = '';\r\n $scope.vm.toDateObject;\r\n $scope.vm.maxDate = new Date();\r\n $scope.vm.minDate = new Date(2000, 0, 1, 0, 0, 0);\r\n $scope.vm.fromMinDate = Date();\r\n\r\n $scope.vm.nsMaxDate = new Date(2900, 0, 1, 0, 0, 0);\r\n $scope.vm.nsMinDate = new Date();\r\n\r\n $scope.fromDateChanged = function (access) {\r\n access.MinDate = access.StartDate;\r\n if ($scope.vm.alternatePath === 'EmergencyAccess') {\r\n $scope.maxEndDate = new Date(access.StartDate);\r\n $scope.maxEndDate.setTime($scope.maxEndDate.getTime() + ($scope.emergencyAccessPeriod * 60 * 60 * 1000));\r\n }\r\n $scope.rebindEffectiveDates = $scope.rebindEffectiveDates === 0 ? 1 : 0;\r\n };\r\n\r\n $scope.toDateChanged = function (access) {\r\n var date;\r\n\r\n if ($scope.isDate(access.EndDate)) {\r\n date = new Date(access.EndDate);\r\n } else {\r\n date = new Date();\r\n access.EndDate = null;\r\n }\r\n\r\n $scope.vm.fromMinDate = date;\r\n\r\n if ($scope.vm.alternatePath === 'EmergencyAccess') {\r\n if (access.EndDate > $scope.maxEndDate) {\r\n access.invalidEmergencyAccessEndDate = true;\r\n } else {\r\n access.invalidEmergencyAccessEndDate = false;\r\n }\r\n }\r\n $scope.rebindEffectiveDates = $scope.rebindEffectiveDates === 0 ? 1 : 0;\r\n };\r\n\r\n $scope.generalStartDateChanged = function (accessChanges, startDate) {\r\n accessChanges.forEach(access => access.StartDate = startDate);\r\n };\r\n\r\n $scope.generalEndDateChanged = function (accessChanges, endDate) {\r\n if ($scope.vm.alternatePath === 'EmergencyAccess') {\r\n if (endDate > $scope.maxEndDate) {\r\n $scope.invalidEmergencyAccessEndDate = true;\r\n } else {\r\n $scope.invalidEmergencyAccessEndDate = false;\r\n }\r\n }\r\n accessChanges.forEach(access => access.EndDate = endDate);\r\n };\r\n\r\n $scope.isDate = function (x) {\r\n return x instanceof Date;\r\n };\r\n\r\n $scope.validate = function (event) {\r\n event.preventDefault();\r\n\r\n if ($scope.vm.toDateObject < $scope.vm.fromDateObject) {\r\n $scope.validationMessage = 'End Date cannot come before Start Date';\r\n }\r\n };\r\n\r\n $scope.getUserStartDate = function (access) {\r\n var startDate;\r\n\r\n if (access && $scope.vm.wizardMode === 'New') {\r\n if (access.ProductId === 'NS') {\r\n startDate = $scope.vm.User.NetSuiteUser.StartDate;\r\n }\r\n if (access.ProductId === 'OR') {\r\n startDate = $scope.vm.User.OracleUser.StartDate;\r\n }\r\n if (access.ProductId === 'ORFC') {\r\n startDate = $scope.vm.User.OracleCloudUser.StartDate;\r\n }\r\n if (access.ProductId === 'AX7') {\r\n startDate = $scope.vm.User.AX7User.StartDate;\r\n }\r\n if (access.ProductId === 'AX') {\r\n startDate = $scope.vm.User.AX2012User.StartDate;\r\n }\r\n if (access.ProductId === 'PS') {\r\n startDate = $scope.vm.User.PSUser.StartDate;\r\n }\r\n if (access.ProductType === 'SAP') {\r\n const availableSAPApps = $scope.vm.availableApplications.filter(application => application.ProductType === 'SAP');\r\n availableSAPApps.forEach(app => startDate = $scope.vm.User.SAPUser[app.ProductName].StartDate);\r\n }\r\n if (access.ProductId === 'SF') {\r\n startDate = $scope.vm.User.SalesforceUser.StartDate;\r\n }\r\n }\r\n\r\n if (!startDate) {\r\n startDate = new Date();\r\n }\r\n\r\n if (access) {\r\n if (new Date(access.StartDate) > new Date(startDate)) {\r\n access.MinDate = access.StartDate;\r\n }\r\n else {\r\n access.MinDate = startDate;\r\n }\r\n }\r\n\r\n return startDate;\r\n };\r\n\r\n $scope.getUserEndDate = function (access) {\r\n\r\n if ($scope.invalidEmergencyAccessEndDate) {\r\n $scope.invalidEmergencyAccessEndDate = false;\r\n }\r\n var endDate;\r\n\r\n if ($scope.vm.alternatePath === 'EmergencyAccess' && !access.EndDate) {\r\n endDate = $scope.maxEndDate;\r\n access.EndDate = endDate;\r\n }\r\n\r\n if ($scope.vm.wizardMode === 'New') {\r\n if (access.ProductId === 'NS') {\r\n endDate = $scope.vm.User.NetSuiteUser.EndDate;\r\n }\r\n if (access.ProductId === 'OR') {\r\n endDate = $scope.vm.User.OracleUser.EndDate;\r\n }\r\n if (access.ProductId === 'ORFC') {\r\n endDate = $scope.vm.User.OracleCloudUser.EndDate;\r\n }\r\n if (access.ProductId === 'AX7') {\r\n endDate = $scope.vm.User.AX7User.EndDate;\r\n }\r\n if (access.ProductId === 'AX') {\r\n endDate = $scope.vm.User.AX2012User.EndDate;\r\n }\r\n if (access.ProductType === 'SAP') {\r\n $scope.vm.availableApplications.forEach(app => endDate = $scope.vm.User.SAPUser[app.ProductName].EndDate);\r\n }\r\n if (access.ProductId === 'SF') {\r\n endDate = $scope.vm.User.SalesforceUser.EndDate;\r\n }\r\n }\r\n\r\n if (!endDate) {\r\n endDate = new Date(2900, 0, 1, 0, 0, 0);\r\n }\r\n\r\n access.MaxDate = endDate;\r\n\r\n return endDate;\r\n };\r\n\r\n $scope.applyAllDatesChanged = function (accessChanges) {\r\n if ($scope.invalidEmergencyAccessEndDate) {\r\n $scope.invalidEmergencyAccessEndDate = false;\r\n }\r\n let endDate;\r\n\r\n if ($scope.vm.alternatePath === 'EmergencyAccess' && !$scope.generalEndDate && $scope.vm.applyAllDates) {\r\n endDate = $scope.maxEndDate;\r\n $scope.generalEndDate = endDate;\r\n accessChanges.forEach(access => access.EndDate = endDate);\r\n }\r\n };\r\n\r\n $scope.clearAllEffectiveDates = function (accessChanges) {\r\n accessChanges.forEach(access => access.StartDate = null);\r\n accessChanges.forEach(access => access.EndDate = null);\r\n $scope.generalStartDate = null;\r\n $scope.generalEndDate = null;\r\n };\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, $filter, $timeout, helperService, $http, row, grid, statusDataService) {\r\n\r\n const vm = this;\r\n\r\n $scope.originalMitigation = $scope.riskToMitigate.MitigationID;\r\n $scope.originalStatus = $scope.riskToMitigate.StatusID;\r\n $scope.originalMitigationNotes = $scope.riskToMitigate.MitigationNotes;\r\n\r\n function activate() {\r\n\r\n getItemPillLabels();\r\n getStandardMitigations();\r\n getMitigations();\r\n setupAdditionalMitigationsObject();\r\n getAdditionalCompaniesDataSource();\r\n\r\n if (row.RequestMitigation === 'Edit') {\r\n populateModalFieldsWithEditedMitigationRequestData();\r\n } else {\r\n setupDefaultModalFields();\r\n }\r\n }\r\n\r\n activate();\r\n\r\n function getStandardMitigations() {\r\n $http.get(apiUrl + 'api/core/configuration/ARM_StandardMitigations').then(function (response) {\r\n $scope.standardMitigations = response.data;\r\n });\r\n }\r\n\r\n function getControlLibrary() {\r\n $scope.controlsLoading = true;\r\n return $http.get(apiUrl + 'api/arm/controls').then(function (response) {\r\n $scope.controlLibrary = response.data;\r\n $scope.controlsLoading = false;\r\n });\r\n }\r\n\r\n function setupControls() {\r\n $scope.selectedControls = new Array();\r\n $scope.originalControls = new Array();\r\n return;\r\n }\r\n\r\n function getStatuses() {\r\n statusDataService.getStatuses().then(function (response) {\r\n response.data = $filter('filter')(response.data, { CanCurrentUserAccess: true });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.statuses = response.data;\r\n });\r\n }\r\n\r\n function populateModalFieldsWithEdits() {\r\n\r\n $scope.UserMitigations.some(mitigation => {\r\n\r\n if (row.RiskId === mitigation.RiskId && row.CompanyMasterID === mitigation.CompanyMasterId) {\r\n\r\n if (mitigation.Controls && mitigation.Controls.length > 0) {\r\n $scope.selectedControls = new Array();\r\n mitigation.Controls.forEach(control => {\r\n $scope.controlLibrary.forEach(option => {\r\n if (option.Identifier === control) {\r\n $scope.selectedControls.push(option);\r\n }\r\n });\r\n });\r\n $scope.controlsLoading = false;\r\n }\r\n\r\n if (mitigation.MitigationId && mitigation.MitigationId !== null) {\r\n $scope.riskToMitigate.MitigationID = mitigation.MitigationId;\r\n }\r\n $scope.riskToMitigate.StatusID = mitigation.StatusId;\r\n $scope.riskToMitigate.MitigationNotes = mitigation.MitigationNotes;\r\n // Request Mitigation in additional companies is not populated.\r\n }\r\n });\r\n }\r\n\r\n function setupDefaultModalFields() {\r\n getControlLibrary().then(_ => setupControls()).then(_ => getStatuses());\r\n }\r\n\r\n function populateModalFieldsWithEditedMitigationRequestData() {\r\n getControlLibrary().then(_ => setupControls()).then(_ => getStatuses()).then(_ => populateModalFieldsWithEdits());\r\n }\r\n\r\n function getAdditionalCompaniesDataSource() {\r\n\r\n $scope.mitigateAddtionalDataSource = [];\r\n\r\n grid.forEach(item => {\r\n if (item.RiskId === row.RiskId && item.CompanyName !== row.CompanyName) {\r\n $scope.mitigateAddtionalDataSource.push(item);\r\n }\r\n });\r\n }\r\n\r\n function getItemPillLabels() {\r\n $http.get(apiUrl + 'api/arm/risks/' + $scope.riskToMitigate.RiskId).then(function (response) {\r\n $scope.riskObjects = response.data;\r\n });\r\n }\r\n\r\n function getMitigations() {\r\n $http.get(apiUrl + 'api/arm/mitigations').then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.mitigations = response.data;\r\n });\r\n }\r\n\r\n function setupAdditionalMitigationsObject() {\r\n $scope.mitigatedRisk = {\r\n selectedMitigateAddtional: '',\r\n companyIds: ''\r\n };\r\n }\r\n\r\n $scope.requestRiskMitigation = function (event) {\r\n\r\n\r\n let userMitigation = {\r\n \"RequestMitigationId\": $scope.riskToMitigate.RequestMitigationId,\r\n \"CompanyMasterId\": $scope.riskToMitigate.CompanyMasterID,\r\n \"RiskId\": $scope.riskToMitigate.RiskId,\r\n \"MitigationId\": $scope.riskToMitigate.MitigationID,\r\n \"MitigationNotes\": $scope.riskToMitigate.MitigationNotes,\r\n \"StatusId\": $scope.riskToMitigate.StatusID,\r\n \"Controls\": $scope.selectedControls.map(x => x.Identifier)\r\n };\r\n\r\n if ($scope.riskToMitigate.MitigationID) {\r\n userMitigation.Controls = null;\r\n } else if ($scope.selectedControls) {\r\n userMitigation.MitigationId = null;\r\n }\r\n\r\n $scope.riskToMitigate.updateInProgress = new createSpinner();\r\n\r\n $scope.UserMitigations.forEach(mitigation => {\r\n // Remove previous mitigation request for this risk.\r\n if (row.RequestMitigation === 'Edit' && mitigation.RiskId === userMitigation.RiskId && mitigation.CompanyMasterId === userMitigation.CompanyMasterId) {\r\n $scope.UserMitigations.remove(mitigation);\r\n }\r\n });\r\n\r\n grid.forEach(item => {\r\n // Create status for new request.\r\n if (item.RiskId === userMitigation.RiskId && item.CompanyMasterID === userMitigation.CompanyMasterId) {\r\n item.RequestMitigation = 'Edit';\r\n }\r\n });\r\n\r\n // Push new request to UserMitigations array.\r\n $scope.UserMitigations.push(userMitigation);\r\n\r\n //Remove $timeout when additional companies are mitigated.\r\n $timeout(function () {\r\n $scope.killModal = true;\r\n helperService.successfulSaveButton($scope.riskToMitigate.updateInProgress).then(function (result) {\r\n $scope.riskToMitigate.updateInProgress.loadingValue = false;\r\n $scope.mitigateInAdditionalCompanies();\r\n $uibModalInstance.close();\r\n $scope.$parent.userRisksGridDataSource.read();\r\n });\r\n }, 1000);\r\n }, function errorCallback(response) {\r\n $scope.riskToMitigate.updateInProgress.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n };\r\n\r\n $scope.mitigateInAdditionalCompanies = function () {\r\n if ($scope.mitigatedRisk !== null && $scope.mitigatedRisk.additionalCompanies !== null) {\r\n if ($scope.mitigatedRisk.additionalCompanies && $scope.mitigatedRisk.additionalCompanies.length > 0) {\r\n mitigateRisk();\r\n }\r\n }\r\n function mitigateRisk() {\r\n $scope.mitigatedRisk.additionalCompanies.forEach(company => {\r\n\r\n let additionalUserMitigation = {\r\n \"RequestMitigationId\": $scope.riskToMitigate.RequestMitigationId,\r\n \"CompanyMasterId\": company.CompanyMasterID,\r\n \"RiskId\": $scope.riskToMitigate.RiskId,\r\n \"MitigationId\": $scope.riskToMitigate.MitigationID,\r\n \"MitigationNotes\": $scope.riskToMitigate.MitigationNotes,\r\n \"StatusId\": $scope.riskToMitigate.StatusID,\r\n \"Controls\": $scope.selectedControls.map(x => x.Identifier)\r\n };\r\n\r\n if ($scope.riskToMitigate.MitigationID) {\r\n additionalUserMitigation.Controls = null;\r\n } else if ($scope.selectedControls) {\r\n additionalUserMitigation.MitigationId = null;\r\n }\r\n\r\n grid.forEach(item => {\r\n $scope.UserMitigations.forEach(mitigation => {\r\n // Remove previous mitigation request for this risk.\r\n if (item.RequestMitigation === 'Edit' && mitigation.RiskId === additionalUserMitigation.RiskId && mitigation.CompanyMasterId === additionalUserMitigation.CompanyMasterId) {\r\n $scope.UserMitigations.remove(mitigation);\r\n }\r\n });\r\n // Create status for new request.\r\n if (item.RiskId === additionalUserMitigation.RiskId && item.CompanyMasterID === additionalUserMitigation.CompanyMasterId) {\r\n item.RequestMitigation = 'Edit';\r\n }\r\n });\r\n // Push new request to UserMitigations array.\r\n $scope.UserMitigations.push(additionalUserMitigation);\r\n });\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}\r\n","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\nimport riskAnalysisUserRisksMitigationModalController from \"./riskAnalysisUserRisksMitigationModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, helperService, $rootScope, $uibModal) {\r\n //Show Summary screen by default\r\n\r\n var vm = $scope.vm;\r\n\r\n vm.requestRiskMitigation = requestRiskMitigation;\r\n\r\n $scope.showSummary = true;\r\n $scope.showUserRiskDetails = false;\r\n $scope.showBusinessProcessDetails = false;\r\n\r\n //Watch for role change and update navigation and user security object lists\r\n $scope.$on('broadcast-im-wizardstepchange', function (event, args) {\r\n if (args != null && args.toStep === 'Risk Analysis') {\r\n $scope.showSummary = true;\r\n }\r\n $scope.showUserRiskDetails = false;\r\n $scope.showBusinessProcessDetails = false;\r\n });\r\n\r\n $scope.showBPSummary = function () {\r\n\r\n var hasBP = false;\r\n //Check to see if any of the selected applications require the Business Process section on Risk Analysis\r\n if ($scope.vm.availableApplications != null) {\r\n\r\n $scope.vm.availableApplications.forEach(function (app) {\r\n if (app.selected) {\r\n var product = $rootScope.availableProductsForUser.find(function (product) {\r\n if (app.Name === 'Universal') {\r\n return product.Name === app.ProductName;\r\n } else {\r\n return product.Name === app.Name;\r\n }\r\n });\r\n if (product != null) {\r\n hasBP = true;\r\n }\r\n }\r\n });\r\n }\r\n return hasBP;\r\n };\r\n\r\n $scope.toggleScreen = function (screen) {\r\n\r\n $scope.showSummary = false;\r\n $scope.showUserRiskDetails = false;\r\n $scope.showBusinessProcessDetails = false;\r\n\r\n if (screen == 'UserRiskDetails') {\r\n $scope.showUserRiskDetails = true;\r\n }\r\n if (screen == 'BusinessProcessDetails') {\r\n $scope.showBusinessProcessDetails = true;\r\n }\r\n if (screen == 'Summary') {\r\n $scope.showSummary = true;\r\n }\r\n };\r\n\r\n var columnsFromVMUserRisks = [\r\n { field: \"Comparison\", width: 100, template: '{{dataItem.Comparison}}' },\r\n { field: \"RequestMitigation\", title: \"Request Mitigation\", template: \"{{dataItem.RequestMitigation}}\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"CompanyName\", title: \"Company\", width: 180, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationControls\", title: \"Mitigation Controls\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationStatus\", title: \"Mitigation Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ProductID\", title: \"ProductID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityRoleID\", title: \"Security Role ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectTypeID\", title: \"Security ObjectType ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectID\", title: \"Security Object ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AccessTypeID\", title: \"Access Type ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true }\r\n ];\r\n\r\n var columnsFromVMBusinessProcess = [\r\n { field: \"CompanyName\", title: \"Company\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", width: 150, filterable: customAutoCompleteFilter },\r\n { field: \"SecurityObjectAltName\", title: \"Security Object\", width: 180, filterable: customAutoCompleteFilter, hidden: $scope.disableObjectLevelRiskAnalysis },\r\n { field: \"SecurityObjectTypeName\", title: \"Security Object Type\", width: 180, filterable: customAutoCompleteFilter, hidden: $scope.disableObjectLevelRiskAnalysis },\r\n { field: \"ObjectComparison\", width: 125, groupHeaderTemplate: \"#= value #\", template: '{{dataItem.ObjectComparison}}', hidden: $scope.disableObjectLevelRiskAnalysis },\r\n { field: \"AccessLevelName\", title: \"Access Level\", width: 150, filterable: customAutoCompleteFilter, hidden: $scope.disableObjectLevelRiskAnalysis },\r\n { field: \"AccessTypeName\", title: \"Access Type\", width: 150, filterable: customAutoCompleteFilter, hidden: $scope.disableObjectLevelRiskAnalysis },\r\n { field: \"BusinessProcessGroupName\", title: \"Group\", width: 180, filterable: customAutoCompleteFilter, groupHeaderTemplate: \"#= value #\" },\r\n { field: \"GroupComparison\", width: 125, template: '{{dataItem.GroupComparison}}' }\r\n ];\r\n\r\n $scope.userRisksGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n data: $scope.UserRisksDataSource,\r\n sort: { field: \"Comparison\", dir: \"asc\" },\r\n schema: {\r\n model: {\r\n fields: {\r\n RiskId: { type: \"number\" }\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.userRisksGridOptions = helperService.setMainGridOptions(columnsFromVMUserRisks, 500);\r\n $scope.userRisksGridOptions.autoBind = true;\r\n if (!$scope.disableObjectLevelRiskAnalysis) {\r\n $scope.userRisksGridOptions.detailTemplate = kendo.template($(\"#risksTemplate\").html());\r\n }\r\n $scope.userRisksGridOptions.columnMenu = true;\r\n\r\n $scope.businessProcessGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n data: $scope.BusinessProcessDataSource,\r\n group: [{ field: \"BusinessProcessGroupName\", dir: \"asc\" }, { field: \"ObjectComparison\", dir: \"asc\" }]\r\n });\r\n\r\n $scope.businessProcessGridOptions = helperService.setMainGridOptions(columnsFromVMBusinessProcess, 500);\r\n $scope.businessProcessGridOptions.autoBind = true;\r\n\r\n vm.expandDetails = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/RequestDetailsModal.html',\r\n controller: riskDetailsModalController,\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n disableObjectData: () => $scope.disableObjectLevelRiskAnalysis\r\n }\r\n });\r\n };\r\n\r\n function openRequestMitigationModal(dataItem, dataGrid) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Universal/riskAnalysisUserRisksMitigationModal.html',\r\n controller: riskAnalysisUserRisksMitigationModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n row: () => dataItem,\r\n grid: () => dataGrid\r\n }\r\n });\r\n }\r\n\r\n function requestRiskMitigation(dataItem) {\r\n $scope.riskToMitigate = angular.copy(dataItem);\r\n openRequestMitigationModal(dataItem, $scope.UserRisksDataSource);\r\n }\r\n\r\n}\r\n\r\nfunction riskDetailsModalController($scope, $uibModalInstance, helperService, disableObjectData) {\r\n\r\n var vm = $scope.vm;\r\n\r\n var RisksColumns = [\r\n { field: \"CompanyName\", title: \"Company\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskId\", title: \"Risk ID\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskName\", title: \"Risk Name\", width: 190, filterable: customAutoCompleteFilter, groupHeaderTemplate: \"#= value #\" },\r\n { field: \"BusinessCycle\", title: \"Business Cycle\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"RiskLevel\", title: \"Risk Level\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"Policy\", title: \"Policy\", width: 110, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"RiskTypeName\", title: \"Risk Type\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Mitigation\", title: \"Mitigation\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationStatus\", title: \"Mitigation Status\", width: 130, filterable: customAutoCompleteFilter },\r\n { field: \"MitigationNotes\", title: \"Mitigation Notes\", width: 190, filterable: customAutoCompleteFilter },\r\n { field: \"Comparison\", width: 100, template: '{{dataItem.Comparison}}' },\r\n { field: \"ProductID\", title: \"ProductID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityRoleID\", title: \"Security Role ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectTypeID\", title: \"Security ObjectType ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"SecurityObjectID\", title: \"Security Object ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"AccessTypeID\", title: \"Access Type ID\", width: 150, filterable: customAutoCompleteFilter, hidden: true }\r\n ];\r\n\r\n vm.RisksOptions = helperService.setMainGridOptions(RisksColumns, null);\r\n if (!disableObjectData) {\r\n vm.RisksOptions.detailTemplate = kendo.template($(\"#risksTemplate\").html());\r\n }\r\n vm.RisksOptions.selectable = false;\r\n vm.RisksOptions.columnMenu = true;\r\n vm.RisksOptions.filterable = {\r\n mode: \"row\",\r\n operators: {\r\n string: {\r\n contains: \"Contains\",\r\n doesnotcontain: \"Does not contain\",\r\n eq: \"Equal to\",\r\n neq: \"Not equal to\"\r\n }\r\n }\r\n };\r\n\r\n vm.RisksDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n data: $scope.UserRisksDataSource,\r\n schema: {\r\n model: {\r\n fields: {\r\n RiskId: { type: \"number\" }\r\n }\r\n }\r\n },\r\n pageable: false\r\n });\r\n\r\n vm.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $filter, $http, helperService) {\r\n\r\n var vm = $scope.vm;\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n\r\n //Search Existing Users\r\n var getExistingUserGridColumns = function () {\r\n return [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"PrimarySystemUserId\", title: \"User ID\", filterable: customAutoCompleteFilter },\r\n { field: \"Email\", title: \"Email\", filterable: customAutoCompleteFilter },\r\n { field: \"PendingRequest\", title: \"Pending Request\", filterable: customAutoCompleteFilter },\r\n { field: \"Products\", title: \"Products\", filterable: customAutoCompleteFilter }\r\n ];\r\n };\r\n\r\n $scope.doneSearchingUsers = function (vm) {\r\n $rootScope.IMSelectedExistingUser = null;\r\n\r\n if (vm.ExistingUserSearchString === '' || !vm.ExistingUserSearchString) {\r\n\r\n var raw = vm.ExistingusersGridDataSource.data();\r\n var length = raw.length;\r\n\r\n var item, i;\r\n for (i = length - 1; i >= 0; i--) {\r\n\r\n item = raw[i];\r\n vm.ExistingusersGridDataSource.remove(item);\r\n\r\n }\r\n } else {\r\n if (vm.wizardMode === 'Terminate') {\r\n vm.ExistingusersGridDataSource.read();\r\n } else {\r\n vm.ExistingusersGridDataSource.read();\r\n }\r\n }\r\n };\r\n\r\n vm.ExistingUsersGridOptions = helperService.setMainGridOptions(getExistingUserGridColumns(), 350);\r\n vm.ExistingUsersGridOptions.autoBind = false;\r\n\r\n vm.ExistingusersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/users',\r\n params: {\r\n searchString: vm.ExistingUserSearchString\r\n }\r\n\r\n }).then(function (response) {\r\n\r\n response.data.forEach(function (row, i) {\r\n if (response.data[i].PendingRequest !== null) {\r\n response.data[i].PendingRequest = response.data[i].PendingRequest.toString();\r\n }\r\n });\r\n\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n }, function errorCallback(response) {\r\n options.error();\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n }\r\n });\r\n\r\n vm.searchKeyDown = function () {\r\n vm.SearchExistingUserSelected = null;\r\n $scope.vm.wizardClass = \"wizard-nav-container disabledDiv\";\r\n };\r\n\r\n vm.changeExistingUserRowSelected = function (kendoEvent) {\r\n var grid = kendoEvent.sender,\r\n isTerminate = vm.wizardMode === \"Terminate\",\r\n canModify = false,\r\n canTerminate = false,\r\n selectedUser;\r\n\r\n $rootScope.IMSelectedExistingUser = grid.dataItem(grid.select());\r\n $rootScope.IMSelectedExistingUser.HasERPDataLoaded = false;\r\n\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n selectedUser = grid.dataItem(grid.select());\r\n\r\n canModify = !selectedUser?.PendingTerminateRequest && !isTerminate;\r\n // selectedUser.PendingRequest gets converted to a string for display in grid\r\n canTerminate = selectedUser?.PendingRequest === \"false\" && isTerminate;\r\n\r\n if (canModify || canTerminate) {\r\n if (vm.User.SalesforceUser) {\r\n // deselect SF app when switching between users - logic in Profiles step needs to be run again\r\n const salesforceApp = vm.availableApplications.find(app => app.ProductType === 'SF');\r\n salesforceApp.selected = false;\r\n vm.appSelectedChange(salesforceApp);\r\n }\r\n vm.SearchExistingUserSelected = true;\r\n $scope.vm.User = {};\r\n $scope.vm.validAppsSelected = null;\r\n } else if (!canModify || !canTerminate) {\r\n alertUser(isTerminate);\r\n }\r\n else {\r\n vm.SearchExistingUserSelected = null;\r\n }\r\n };\r\n\r\n function alertUser(isTerminate) {\r\n let message;\r\n\r\n if (isTerminate) {\r\n message = \"Users with pending requests may not be terminated\"\r\n } else {\r\n message = \"Users with pending termination requests may not be modified\"\r\n }\r\n\r\n swal(\"Alert\", message, \"warning\");\r\n }\r\n\r\n function stopGridLoading(data) {\r\n //Reset grid after search completes\r\n var unlockGrid = true;\r\n if (data) {\r\n if (data === \"Error\") {\r\n unlockGrid = false;\r\n }\r\n }\r\n var usersGrid = $(\"#ExistingusersGrid\");\r\n kendo.ui.progress(usersGrid, false);\r\n if (unlockGrid) {\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n }\r\n }\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, userMappingOptions) {\r\n\r\n const vm = this;\r\n\r\n vm.saveUserMapping = saveUserMapping;\r\n vm.dismiss = dismiss;\r\n\r\n activate();\r\n\r\n function activate() {\r\n vm.userMappingOptions = userMappingOptions;\r\n }\r\n\r\n function saveUserMapping() {\r\n $uibModalInstance.close(vm.selectedItem);\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport selectUserMappingModalController from \"./selectUserMappingModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $location, $uibModal, RequestManagementLoadDataService, errorsDataService, $http) {\r\n\r\n const vm = this;\r\n\r\n activate();\r\n\r\n function activate() {\r\n securePaths();\r\n }\r\n\r\n vm.selectWizardMode = selectWizardMode;\r\n vm.executeAlternateWizardPath = executeAlternateWizardPath;\r\n\r\n function selectWizardMode(wizardMode) {\r\n $location.path('/IdentityManager/Place/RequestManagement/' + wizardMode);\r\n }\r\n\r\n async function securePaths() {\r\n let security = JSON.parse(localStorage.getItem('UserSecurityObjects'));\r\n let products = await $http.get(apiUrl + 'api/identitymanager/applications');\r\n\r\n vm.showNew = security.find(o => o.ObjectID === 11402);\r\n vm.showModify = security.find(o => o.ObjectID === 11403);\r\n vm.showTerminate = security.find(o => o.ObjectID === 11404);\r\n vm.showSelfService = security.find(o => o.ObjectID === 11405);\r\n vm.showEmergencyAccess = security.find(o => o.ObjectID === 11406) && products.data.some(p => p.ProductType === 'SAP');\r\n\r\n }\r\n\r\n async function executeAlternateWizardPath(wizardMode, requestType) {\r\n try {\r\n $rootScope.IMSelectedExistingUser = await RequestManagementLoadDataService.getSelfServiceMapping();\r\n let userMappingArray = $rootScope.IMSelectedExistingUser.length > 1 ? $rootScope.IMSelectedExistingUser : null;\r\n\r\n $rootScope.IMSelectedExistingUser.forEach(user => {\r\n if (user.PendingRequest) {\r\n user.HasERPDataLoaded = false;\r\n }\r\n });\r\n\r\n if ($rootScope.IMSelectedExistingUser.length > 1) {\r\n try {\r\n await openSelectUserMappingModal(userMappingArray);\r\n } catch (error) {\r\n throw error;\r\n }\r\n } else {\r\n $rootScope.IMSelectedExistingUser = $rootScope.IMSelectedExistingUser[0];\r\n }\r\n\r\n switch (requestType) {\r\n case 'SelfService':\r\n $location.path('/IdentityManager/Place/RequestManagement/' + wizardMode).search({ selfservice: 'true' });\r\n break;\r\n case 'EmergencyAccess':\r\n $location.path('/IdentityManager/Place/RequestManagement/' + wizardMode).search({ emergencyaccess: 'true' });\r\n break;\r\n }\r\n } catch (error) {\r\n if (error.status === 404) {\r\n // Custom error message for non mapped system users trying to create a Self-Service or Emergency Access Request\r\n let message =\r\n `\r\n Your Fastpath user is not mapped to a system user so you cannot start any ${requestType} requests.\r\n
\r\n \r\n Your Fastpath user will need to be mapped to a system user on the Maintain System Users page in the System Configuration module.\r\n
`;\r\n swal({ title: 'Error', html: message, type: 'warning' });\r\n } else {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n }\r\n\r\n async function openSelectUserMappingModal(options) {\r\n let selectUserMappingModal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/selectUserMappingModal.html',\r\n controller: selectUserMappingModalController,\r\n controllerAs: 'summvm',\r\n backdrop: 'static',\r\n resolve: {\r\n userMappingOptions: () => options\r\n }\r\n });\r\n\r\n try {\r\n $rootScope.IMSelectedExistingUser = await selectUserMappingModal.result;\r\n } catch (error) { throw error; }\r\n }\r\n\r\n}","import createSpinner from \"../../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, linkedTicketsArray, helperService) {\r\n\r\n var modalVm = $scope.modalVm = {};\r\n\r\n modalVm.linkCustomTicket = async function () {\r\n modalVm.saving = new createSpinner();\r\n let linkedCustomTicket = {};\r\n\r\n linkedCustomTicket.TicketId = modalVm.customTicketId;\r\n linkedCustomTicket.TicketProvider = 'Custom';\r\n\r\n linkedTicketsArray.push(linkedCustomTicket);\r\n\r\n $scope.$parent.customTicketLinked = true;\r\n await helperService.successfulSaveButton(modalVm.saving);\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.cancel = function () { $uibModalInstance.close(); };\r\n}","import { customAutoCompleteFilterEqualToOnly, customAutoCompleteFilter, customDatePickerFilter } from \"../../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, helperService, $http, linkedTicketsArray) {\r\n\r\n var modalVm = $scope.modalVm = {};\r\n var statusTemplate = \"{{dataItem.Status}}\";\r\n\r\n var columnsFromVM = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n {\r\n title: ' ', width: 90, template: `Link\r\n Unlink`\r\n }\r\n ];\r\n\r\n $scope.$evalAsync(function () {\r\n modalVm.gridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n modalVm.gridOptions.selectable = false;\r\n modalVm.gridOptions.pageable = false;\r\n modalVm.gridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n });\r\n\r\n modalVm.createZendeskLink = function (dataItem) {\r\n\r\n let linkedZendeskTicket = {};\r\n\r\n linkedZendeskTicket.TicketId = dataItem.Id;\r\n linkedZendeskTicket.TicketProvider = 'Zendesk';\r\n\r\n linkedTicketsArray.push(linkedZendeskTicket);\r\n\r\n dataItem.isLinked = true;\r\n modalVm.ticketLinked = true;\r\n $scope.$parent.zendeskTicketLinked = true;\r\n\r\n $uibModalInstance.close();\r\n };\r\n\r\n modalVm.gridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n var sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n var postBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n\r\n $http.post(apiUrl + 'api/core/tickets/zendesk/search/', postBody).then(function (response) {\r\n modalVm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n }, function (response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.cancel = function () { $uibModalInstance.close(); };\r\n}","import { customAutoCompleteFilterEqualToOnly, customAutoCompleteFilter, customDatePickerFilter } from \"../../../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, helperService, $http, linkedTicketsArray) {\r\n\r\n var modalVm = $scope.modalVm = {};\r\n var statusTemplate = \"{{dataItem.Status}}\";\r\n\r\n var columnsFromVM = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n {\r\n title: ' ', width: 90, template: `Link\r\n Unlink`\r\n }\r\n ];\r\n\r\n $scope.$evalAsync(function () {\r\n modalVm.gridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n modalVm.gridOptions.selectable = false;\r\n modalVm.gridOptions.pageable = false;\r\n modalVm.gridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n });\r\n\r\n modalVm.createLink = function (dataItem) {\r\n\r\n let linkedTicket = {};\r\n\r\n linkedTicket.TicketId = dataItem.Id;\r\n linkedTicket.TicketProvider = 'ServiceNow';\r\n\r\n linkedTicketsArray.push(linkedTicket);\r\n\r\n dataItem.isLinked = true;\r\n modalVm.ticketLinked = true;\r\n $scope.$parent.serviceNowTicketLinked = true;\r\n\r\n $uibModalInstance.close();\r\n };\r\n\r\n modalVm.gridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n var sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n var postBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n\r\n $http.post(apiUrl + 'api/core/tickets/servicenow/search/', postBody).then(function (response) {\r\n modalVm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n }, function (response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.cancel = function () { $uibModalInstance.close(); };\r\n\r\n}","import { customAutoCompleteFilterEqualToOnly, customAutoCompleteFilter, customDatePickerFilter } from \"../../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, helperService, $http, linkedTicketsArray) {\r\n\r\n var modalVm = $scope.modalVm = {};\r\n var statusTemplate = \"{{dataItem.Status}}\";\r\n\r\n var columnsFromVM = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n {\r\n title: ' ', width: 90, template: `Link\r\n Unlink`\r\n }\r\n ];\r\n\r\n $scope.$evalAsync(function () {\r\n modalVm.gridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n modalVm.gridOptions.selectable = false;\r\n modalVm.gridOptions.pageable = false;\r\n modalVm.gridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n });\r\n\r\n modalVm.createJiraLink = function (dataItem) {\r\n\r\n let linkedJiraTicket = {};\r\n\r\n linkedJiraTicket.TicketId = dataItem.Id;\r\n linkedJiraTicket.TicketProvider = 'Jira';\r\n\r\n linkedTicketsArray.push(linkedJiraTicket);\r\n\r\n dataItem.isLinked = true;\r\n modalVm.ticketLinked = true;\r\n $scope.$parent.jiraTicketLinked = true;\r\n\r\n $uibModalInstance.close();\r\n };\r\n\r\n modalVm.gridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n var sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n var postBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n\r\n $http.post(apiUrl + 'api/core/tickets/jira/search/', postBody).then(function (response) {\r\n modalVm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n }, function (response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.cancel = function () { $uibModalInstance.close(); };\r\n\r\n}","import { customAutoCompleteFilterEqualToOnly, customAutoCompleteFilter, customDatePickerFilter } from \"../../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModalInstance, helperService, $http, linkedTicketsArray) {\r\n\r\n var modalVm = $scope.modalVm = {};\r\n var statusTemplate = \"{{dataItem.Status}}\";\r\n\r\n var columnsFromVM = [\r\n { field: \"Status\", title: \"Status\", template: statusTemplate, filterable: false },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilterEqualToOnly },\r\n { field: \"Subject\", title: \"Subject\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", template: \"{{ dataItem.Description }}\", filterable: customAutoCompleteFilter }, // use template to handle possible issues with characters in description field\r\n { field: \"CreatedDate\", title: \"Date Created\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n {\r\n title: ' ', width: 90, template: `Link\r\n Unlink`\r\n }\r\n ];\r\n\r\n $scope.$evalAsync(function () {\r\n modalVm.gridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n modalVm.gridOptions.selectable = false;\r\n modalVm.gridOptions.pageable = false;\r\n modalVm.gridOptions.filterable = {\r\n mode: 'row',\r\n operators: {\r\n string: {\r\n contains: \"Contains\"\r\n }\r\n }\r\n };\r\n });\r\n\r\n modalVm.createFreshServiceLink = function (dataItem) {\r\n\r\n let linkedFreshServiceTicket = {};\r\n\r\n linkedFreshServiceTicket.TicketId = dataItem.Id;\r\n linkedFreshServiceTicket.TicketProvider = 'Freshservice';\r\n\r\n linkedTicketsArray.push(linkedFreshServiceTicket);\r\n\r\n dataItem.isLinked = true;\r\n modalVm.ticketLinked = true;\r\n $scope.$parent.freshServiceTicketLinked = true;\r\n\r\n $uibModalInstance.close();\r\n };\r\n\r\n modalVm.gridDataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: function (options) {\r\n var sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n var postBody = {\r\n \"Criteria\": sortsAndFilters.Filters\r\n };\r\n\r\n\r\n $http.post(apiUrl + 'api/core/tickets/freshservice/search/', postBody).then(function (response) {\r\n modalVm.TotalTicketCount = response.data.Count;\r\n options.success(response.data.Tickets);\r\n }, function (response) {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n\r\n $scope.cancel = function () { $uibModalInstance.close(); };\r\n\r\n}","import IMRequestCustomTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestCustomTicketModal.controller\";\r\nimport IMRequestZendeskTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestZendeskTicketModal.controller\";\r\nimport IMRequestServiceNowTicketModalController from \"./WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.controller\";\r\nimport IMRequestJiraTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestJiraTicketModal.controller\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { ax7_application_id, netsuite_application_id, sap_application_id, ax_application_id, oracle_application_id, oracleCloud_application_id, gp_application_id, nav_application_id, d365s_application_id, universalProduct_application_id, aad_application_id, ps_application_id, salesforce_application_id } from \"../../Shared/GlobalVariables/applicationIdVariables\";\r\nimport IMRequestFreshServiceTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestFreshServiceTicketModal.controller\";\r\nimport swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $filter, RequestManagementShowStepsService, RequestManagementStepDefinitions, RequestManagementWizardController, RequestManagementUPLoadDataService, RequestManagementAXLoadDataService, RequestManagementAADLoadDataService, RequestManagementSAPLoadDataService, RequestManagementNetSuiteLoadDataService, RequestManagementOracleLoadDataService, RequestManagementNAVLoadDataService, RequestManagementGPLoadDataService, RequestManagementD365SLoadDataService, RequestManagementPSLoadDataService, RequestManagementBuildRequestService, RequestManagementEffectiveDateService, RequestManagementLoadDataService, controlLibraryDataService, FileSaver, WizardHandler, $rootScope, objectIdDataService, $http, $q, $location, helperService, RequestManagementOracleCloudLoadDataService, salesforceLoadData, passwordCriteriaDataService, manageDataDataService, configurationDataService) {\r\n\r\n //Page initialization\r\n var vm = $scope.vm = {},\r\n salesforceEmailMessage = \"To ensure system security, the owner of the new email address must verify this change. When you click OK, an email will be sent to the specified address with directions on confirming this change. Click Cancel if you do not want to make this change.\"\r\n\r\n $scope.vmh = helperService;\r\n $scope.helperService = helperService;\r\n $scope.updatePending = {};\r\n $scope.UserMitigations = [];\r\n vm.existingFilesDataSource = [];\r\n vm.AccessChanges = [];\r\n vm.hasCompany = false;\r\n $scope.hasAX = false;\r\n vm.RequestNotes = '';\r\n var locationPath = $location.path().split(\"/\");\r\n vm.wizardMode = locationPath[4];\r\n\r\n $scope.requireTickets = false;\r\n $scope.disableObjectLevelRiskAnalysis = false;\r\n\r\n\r\n //Common Functions - duplicate functions on each path\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n activate();\r\n\r\n async function activate() {\r\n var { data: config } = await configurationDataService.getConfigurationValues()\r\n vm.config = config;\r\n $scope.requireTickets = config.some(item => item.Name === \"IM_RequireTicketAssociation\" && item?.Value === \"1\");\r\n vm.bypassRiskAnalysis = config.some(item => item.Name === \"IM_BypassRiskAnalysis\" && item?.Value === \"1\");\r\n $scope.disableObjectLevelRiskAnalysis = config.some(item => item.Name === \"IM_DisableObjectLevelRiskAnalysis\" && item?.Value === \"1\");\r\n vm.roleTemplatesOnlyEnabled = config.some(item => item.Name === \"IM_RoleTemplatesOnlyEnabled\" && item?.Value === \"1\");\r\n\r\n securityCheck();\r\n getApplications();\r\n }\r\n\r\n function securityCheck() {\r\n let security = JSON.parse(localStorage.getItem('UserSecurityObjects'));\r\n\r\n if ($location.url().includes('selfservice=true')) {\r\n if (security.find(o => o.ObjectID === 11405)) vm.alternatePath = 'SelfService';\r\n else $location.path('/403');\r\n } else if ($location.url().includes('emergencyaccess=true')) {\r\n if (security.find(o => o.ObjectID === 11406)) vm.alternatePath = 'EmergencyAccess';\r\n } else {\r\n if (security.find(o => o.ObjectID === 11403)) return;\r\n else $location.path('/403');\r\n }\r\n }\r\n\r\n async function calculateExpirationDate() {\r\n let numberOfDaysToAdd = Number(vm.config.find(configuration => configuration.Name === 'IM_DefaultExpirationDays').Value);\r\n\r\n if (numberOfDaysToAdd) {\r\n vm.ExpirationDate = new Date();\r\n vm.ExpirationDate.setDate(vm.ExpirationDate.getDate() + numberOfDaysToAdd);\r\n }\r\n }\r\n\r\n async function getAdditionalRequestDetails() {\r\n const response = await $http.get(`${apiUrl}api/identitymanager/requests/${$scope.requestToEdit.Id}/version/${$scope.requestToEdit.Version}`);\r\n vm.existingFilesDataSource = response.data.Attachments;\r\n $scope.vm.ExpirationDate = response.data.ExpirationDate ? new Date(response.data.ExpirationDate) : null;\r\n }\r\n\r\n $scope.getApplicationName = (applicationId) => $scope.vmh.getApplicationName(applicationId, vm.availableApplications);\r\n\r\n $scope.getProductName = (productId) => $scope.vmh.getProductName(productId, vm.availableApplications);\r\n //--End Common Page Functions\r\n\r\n async function getAX7UserGroupConfigValue() {\r\n let response = await manageDataDataService.getConfigurationByProductId('AX7');\r\n const ax7UserGroupConfigValue = response.data.find(config => config.Name === 'IM_EnableUserGroups');\r\n\r\n vm.EnableAX7UserGroups = ax7UserGroupConfigValue.Value === '1' ? true : false;\r\n }\r\n\r\n $scope.resetUserValues = function () {\r\n $scope.requestUserList = [];\r\n $scope.vm.effectiveDateList = [];\r\n\r\n vm.RiskLevelId = 0;\r\n vm.RiskLevelIdNewOnly = 0;\r\n\r\n //Universal Product Access variables\r\n $scope.vm.ListOfSelectedUPRoles = [];\r\n $scope.vm.ListOfAvailableUPRoles = [];\r\n $scope.vm.ListOfUPCompanies = [];\r\n\r\n //SAP Access variables\r\n $scope.vm.ListOfSelectedSAPSingleRoles = [];\r\n $scope.vm.ListOfAvailableSAPSingleRoles = [];\r\n $scope.vm.ListOfSelectedSAPRoleObjects = [];\r\n $scope.vm.ListOfAvailableSAPRoleObjects = [];\r\n\r\n $scope.vm.ListOfSelectedSAPCompositeRoles = [];\r\n $scope.vm.ListOfAvailableSAPCompositeRoles = [];\r\n\r\n //AAD Access variables\r\n vm.ListOfSelectedAADRoles = [];\r\n vm.ListOfAvailableAADRoles = [];\r\n vm.ListOfSelectedAADGroups = [];\r\n vm.ListOfAvailableAADGroups = [];\r\n vm.ListOfSelectedAADLicenses = [];\r\n vm.ListOfAvailableAADLicenses = [];\r\n\r\n //AX7 Access variables\r\n vm.ListOfSelectedAX7Roles = [];\r\n vm.ListOfExcludedAX7Roles = [];\r\n vm.ListOfAvailableAX7Roles = [];\r\n vm.ListOfAX7Companies = [];\r\n vm.AX7RoleCompanyList = [];\r\n vm.ListOfAvailableAX7UserGroups = [];\r\n vm.ListOfSelectedAX7UserGroups = [];\r\n\r\n //AX2012 Access variables\r\n vm.ListOfSelectedAX2012Roles = [];\r\n vm.ListOfExcludedAX2012Roles = [];\r\n vm.ListOfAvailableAX2012Roles = [];\r\n vm.ListOfAX2012Companies = [];\r\n vm.AX2012RoleCompanyList = [];\r\n vm.ListOfAX2012Partitions = [];\r\n vm.ListOfAvailableAX2012UserGroups = [];\r\n vm.ListOfSelectedAX2012UserGroups = [];\r\n\r\n //NetSuite Access varibles\r\n vm.ListOfSelectedNetSuiteRoles = [];\r\n vm.ListOfAvailableNetSuiteRoles = [];\r\n vm.ListOfSelectedNetSuitePermissions = [];\r\n vm.ListOfAvailableNetSuitePermissions = [];\r\n vm.existingGlobalPermissions = [];\r\n\r\n //Oracle Responsibility variables\r\n vm.ListOfAvailableOracleResponsibilities = [];\r\n vm.ListOfSelectedOracleResponsibilities = [];\r\n vm.ListOfAvailableOracleRoles = [];\r\n vm.ListOfSelectedOracleRoles = [];\r\n\r\n // Oracle Cloud roles variables\r\n vm.ListOfAvailableOracleCloudRoles = [];\r\n vm.ListOfSelectedOracleCloudRoles = [];\r\n vm.ListOfStoredOracleCloudRoles = [];\r\n\r\n // PeopleSoft roles variables\r\n vm.ListOfAvailablePSRoles = [];\r\n vm.ListOfSelectedPSRoles = [];\r\n\r\n //NAV Access varibles\r\n vm.ListOfSelectedNAVRoles = [];\r\n vm.ListOfAvailableNAVRoles = [];\r\n vm.ListOfAvailableNAVPermissionSets = [];\r\n vm.ListOfSelectedNAVPermissionSets = [];\r\n vm.ListOfSelectedNAVUserGroups = [];\r\n vm.ListOfAvailableNAVUserGroups = [];\r\n\r\n //GP Access varibles\r\n vm.ListOfSelectedGPRoles = [];\r\n vm.ListOfAvailableGPRoles = [];\r\n vm.ListOfStoredGPRoles = [];\r\n vm.ListOfSelectedGPCompanies = [];\r\n vm.ListOfAvailableGPCompanies = [];\r\n\r\n //D365S Access varibles\r\n vm.ListOfSelectedD365SRoles = [];\r\n vm.ListOfAvailableD365SRoles = [];\r\n vm.ListOfSelectedD365STeams = [];\r\n vm.ListOfAvailableD365STeams = [];\r\n\r\n //Salesforce Access Variables\r\n vm.ListOfAvailableSalesforcePermissionSets = [];\r\n vm.ListOfSelectedSalesforcePermissionSets = [];\r\n\r\n $scope.vm.User = {};\r\n };\r\n\r\n $scope.resetUserValues();\r\n\r\n function getApplications() {\r\n $http.get(apiUrl + 'api/identitymanager/applications').then(function (response) {\r\n\r\n response.data.forEach(row => {\r\n row.selected = false;\r\n });\r\n if (vm.alternatePath === 'EmergencyAccess') {\r\n response.data = response.data.filter(app => app.ProductType === 'SAP');\r\n }\r\n response.data = $filter('orderBy')(response.data, 'ProductName');\r\n $scope.vm.availableApplications = response.data;\r\n $scope.atLeastOneAppSelected();\r\n\r\n //If the user is modifying an open request load the data after the available applications have populated\r\n if ($rootScope.requestToEdit) {\r\n RequestManagementLoadDataService.loadOpenRequestData($scope);\r\n }\r\n\r\n //Check if custom apps exist\r\n var existingSteps = RequestManagementStepDefinitions.getListOfSteps(vm.wizardMode, vm.alternatePath, $scope.requestToEdit);\r\n $scope.vm.availableApplications.forEach(application => {\r\n $scope.vm.ListOfSelectedSAPSingleRoles[application.ProductName] = [];\r\n $scope.vm.ListOfSelectedSAPCompositeRoles[application.ProductName] = [];\r\n $scope.vm.ListOfSelectedUPRoles[application.ProductName] = [];\r\n if (!existingSteps.some(step => step.parent && step.parent === application.ProductName)) {\r\n $scope.steps = RequestManagementShowStepsService.createCustomSteps(application, existingSteps);\r\n }\r\n });\r\n if (!$scope.steps) {\r\n $scope.steps = RequestManagementStepDefinitions.getListOfSteps(vm.wizardMode, vm.alternatePath, $scope.requestToEdit);\r\n }\r\n\r\n // Remove Risk Analysis Step if Configuration is enabled\r\n if ($scope.vm.bypassRiskAnalysis) {\r\n const riskAnalysisStepIndex = $scope.steps.findIndex(step => step.title === 'Risk Analysis');\r\n $scope.steps.splice(riskAnalysisStepIndex, 1);\r\n }\r\n\r\n if (vm.alternatePath) setupAlternatePath();\r\n });\r\n }\r\n\r\n async function setupAlternatePath() {\r\n await $scope.buildRequest(null, \"Select Applications\");\r\n }\r\n\r\n //Select Application Functions\r\n vm.appSelectedChange = async function (application) {\r\n if (application.selected) {\r\n if (application.Id === netsuite_application_id) {\r\n RequestManagementNetSuiteLoadDataService.loadNetSuite($scope, null, null, null);\r\n }\r\n\r\n if (application.Id === sap_application_id) {\r\n RequestManagementSAPLoadDataService.loadSAP($scope, application, null);\r\n //Load SAP Password Criteria\r\n passwordCriteriaDataService.getPasswordCriteria(application.ProductID).then(function (response) {\r\n $scope.vm.sapPasswordCriteria = {};\r\n $scope.vm.sapPasswordCriteria[application.ProductName] = response.data;\r\n });\r\n }\r\n\r\n if (application.Id == aad_application_id) {\r\n RequestManagementAADLoadDataService.loadAAD($scope, null);\r\n //Load AAD Password Criteria\r\n passwordCriteriaDataService.getPasswordCriteria(application.ProductID).then(function (response) {\r\n $scope.vm.aadPasswordCriteria = {};\r\n $scope.vm.aadPasswordCriteria = response.data;\r\n });\r\n\r\n\r\n }\r\n\r\n if (application.Id == ps_application_id) {\r\n RequestManagementPSLoadDataService.loadPS($scope, null);\r\n //Load PS Password Criteria\r\n passwordCriteriaDataService.getPasswordCriteria(application.ProductID).then(function (response) {\r\n $scope.vm.psPasswordCriteria = {};\r\n $scope.vm.psPasswordCriteria = response.data;\r\n }).catch(function (response) {\r\n $scope.vm.psPasswordCriteria = {};\r\n });\r\n }\r\n\r\n if (application.Id === ax7_application_id) {\r\n RequestManagementAXLoadDataService.loadAX7($scope, null);\r\n }\r\n\r\n if (application.Id === ax_application_id) {\r\n RequestManagementAXLoadDataService.loadAX2012($scope, null);\r\n }\r\n\r\n if (application.Id === oracle_application_id) {\r\n await RequestManagementOracleLoadDataService.loadOracle($scope, null);\r\n }\r\n\r\n if (application.Id === oracleCloud_application_id) {\r\n RequestManagementOracleCloudLoadDataService.loadOracleCloud($scope, null);\r\n }\r\n\r\n if (application.Id === gp_application_id) {\r\n RequestManagementGPLoadDataService.loadGP($scope, null);\r\n }\r\n\r\n if (application.Id === nav_application_id) {\r\n RequestManagementNAVLoadDataService.loadNAV($scope, null);\r\n }\r\n\r\n if (application.Id === d365s_application_id) {\r\n RequestManagementD365SLoadDataService.loadD365S($scope, null);\r\n }\r\n\r\n if (application.Id === universalProduct_application_id) {\r\n RequestManagementUPLoadDataService.loadUP($scope, application, null);\r\n }\r\n\r\n if (application.Id === salesforce_application_id) {\r\n salesforceLoadData.loadSalesforce($scope);\r\n }\r\n }\r\n\r\n $scope.atLeastOneAppSelected();\r\n\r\n $scope.loadERPSpecificSteps(application);\r\n };\r\n\r\n $scope.loadERPSpecificSteps = async function (application) {\r\n switch (application.ProductType) {\r\n case 'OR':\r\n if (!vm.ORRBACEnabled) {\r\n const rolesStepIndex = $scope.steps.findIndex(step => step.title === 'Oracle EBS Roles');\r\n if (rolesStepIndex > -1) {\r\n $scope.steps.splice(rolesStepIndex, 1);\r\n }\r\n }\r\n RequestManagementShowStepsService.setOracleStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'SAP':\r\n if (application.ProductName === 'SAP') {\r\n RequestManagementShowStepsService.setSAPStepsToVisible(vm.availableApplications, $scope.steps);\r\n } else {\r\n RequestManagementShowStepsService.setCustomStepsToVisible(vm.availableApplications, $scope.steps, application);\r\n }\r\n break;\r\n case 'NS':\r\n RequestManagementShowStepsService.setNetSuiteStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AAD':\r\n RequestManagementShowStepsService.setAADStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AX7':\r\n await getAX7UserGroupConfigValue();\r\n if (!vm.EnableAX7UserGroups) {\r\n const userGroupsStepIndex = $scope.steps.findIndex(step => step.title === 'Dynamics 365 for Finance and Supply Chain User Groups');\r\n if (userGroupsStepIndex > -1) {\r\n $scope.steps.splice(userGroupsStepIndex, 1);\r\n }\r\n }\r\n RequestManagementShowStepsService.setAX7StepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AX':\r\n RequestManagementShowStepsService.setAX2012StepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'GP':\r\n RequestManagementShowStepsService.setGPStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'NAV':\r\n RequestManagementShowStepsService.setNAVStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'D365S':\r\n RequestManagementShowStepsService.setD365SStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'PS':\r\n RequestManagementShowStepsService.setPSStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'SF':\r\n if ($scope.vm?.User?.SalesforceUser.IsActive) {\r\n RequestManagementShowStepsService.setSalesforceStepsToVisible(vm.availableApplications, $scope.steps);\r\n application.inactiveUser = false;\r\n } else {\r\n application.selected = false;\r\n application.inactiveUser = true;\r\n }\r\n\r\n break;\r\n default:\r\n RequestManagementShowStepsService.setCustomStepsToVisible(vm.availableApplications, $scope.steps, application);\r\n break;\r\n }\r\n };\r\n\r\n $scope.atLeastOneAppSelected = function () {\r\n vm.validAppsSelected = RequestManagementWizardController.atLeastOneAppSelected(vm.availableApplications);\r\n };\r\n //--End Select Application events\r\n\r\n\r\n $scope.stepDisabled = function (title) {\r\n return RequestManagementWizardController.stepDisabled(title, WizardHandler.wizard(), $scope);\r\n };\r\n\r\n $scope.setParentStepToActive = function (parent) {\r\n return RequestManagementWizardController.setParentStepToActive(parent, WizardHandler.wizard(), $scope.steps);\r\n };\r\n\r\n $scope.goToNextVisiblePage = function () {\r\n var step = RequestManagementWizardController.goToNextVisiblePage($scope.steps, WizardHandler.wizard());\r\n $scope.setActivePage(step.title);\r\n };\r\n\r\n $scope.goToPreviousVisiblePage = function () {\r\n var step = RequestManagementWizardController.goToPreviousVisiblePage($scope.steps, WizardHandler.wizard());\r\n $scope.setActivePage(step.title);\r\n };\r\n\r\n $scope.setCurrentStepToActive = function () {\r\n return RequestManagementWizardController.getCurrentStepsTitle(WizardHandler.wizard());\r\n };\r\n\r\n $scope.setActivePage = function (stepTitle) {\r\n var wizardInstance = WizardHandler.wizard();\r\n var currentStepNumber = wizardInstance.currentStepNumber();\r\n var enabledSteps = wizardInstance.getEnabledSteps();\r\n var step = enabledSteps[currentStepNumber - 1];\r\n if (step.canexit === true) {\r\n $scope.buildRequest(step.title, stepTitle);\r\n }\r\n wizardInstance.goTo(stepTitle);\r\n };\r\n //---End of Wizard Navigation\r\n\r\n $scope.buildRequest = async function (fromStep, toStep) {\r\n\r\n $scope.$broadcast('broadcast-im-wizardstepchange', { fromStep: fromStep, toStep: toStep });\r\n\r\n if (toStep === \"Select Applications\") {\r\n\r\n $scope.selectApplicationsHelpText = 'The following is a list of applications available to this user. Select the application(s) you wish to modify';\r\n //Load data for an existing user\r\n if ($rootScope.IMSelectedExistingUser && !$rootScope.IMSelectedExistingUser.HasERPDataLoaded) {\r\n $scope.resetUserValues();\r\n\r\n $scope.showRMLoadingIcon = true;\r\n $scope.vm.wizardClass = \"wizard-nav-container disabledDiv\";\r\n\r\n var promises = [];\r\n RequestManagementLoadDataService.loadUserMasterERPData($scope, $rootScope.IMSelectedExistingUser, $scope.vm.availableApplications).then(function () {\r\n\r\n vm.availableApplications.forEach(function (application) {\r\n if (application.selected) {\r\n if (application.Id === netsuite_application_id) {\r\n var nsUser = null;\r\n var subsidiaryId = null;\r\n\r\n if ($scope.vm.User.NetSuiteUser) {\r\n nsUser = $scope.vm.User.NetSuiteUser;\r\n subsidiaryId = $scope.vm.User.NetSuiteUser.Subsidiary.Id;\r\n }\r\n promises.push(RequestManagementNetSuiteLoadDataService.loadNetSuite($scope, subsidiaryId, null));\r\n }\r\n\r\n if (application.Id === sap_application_id) {\r\n promises.push(RequestManagementSAPLoadDataService.loadSAP($scope, application, null));\r\n }\r\n\r\n if (application.Id === universalProduct_application_id) {\r\n promises.push(RequestManagementUPLoadDataService.loadUP($scope, application, null));\r\n }\r\n\r\n if (application.Id === aad_application_id) {\r\n promises.push(RequestManagementAADLoadDataService.loadAAD($scope, null));\r\n }\r\n\r\n if (application.Id === ax7_application_id) {\r\n promises.push(RequestManagementAXLoadDataService.loadAX7($scope, null));\r\n }\r\n\r\n if (application.Id === ax_application_id) {\r\n promises.push(RequestManagementAXLoadDataService.loadAX2012($scope, null));\r\n }\r\n\r\n if (application.Id === oracle_application_id) {\r\n promises.push(RequestManagementOracleLoadDataService.loadOracle($scope));\r\n }\r\n\r\n if (application.Id === oracleCloud_application_id) {\r\n promises.push(RequestManagementOracleCloudLoadDataService.loadOracleCloud($scope));\r\n }\r\n\r\n if (application.Id === gp_application_id) {\r\n promises.push(RequestManagementGPLoadDataService.loadGP($scope));\r\n }\r\n\r\n if (application.Id === nav_application_id) {\r\n promises.push(RequestManagementNAVLoadDataService.loadNAV($scope));\r\n }\r\n\r\n if (application.Id === d365s_application_id) {\r\n promises.push(RequestManagementD365SLoadDataService.loadD365S($scope));\r\n }\r\n\r\n if (application.Id === ps_application_id) {\r\n promises.push(RequestManagementPSLoadDataService.loadPS($scope));\r\n }\r\n\r\n if (application.Id === salesforce_application_id) {\r\n promises.push(salesforceLoadData.loadSalesforce($scope));\r\n }\r\n\r\n $scope.loadERPSpecificSteps(application);\r\n }\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n //Check if an application is selected and load ERP steps\r\n $scope.atLeastOneAppSelected();\r\n $rootScope.IMSelectedExistingUser.HasERPDataLoaded = true;\r\n $scope.showRMLoadingIcon = false;\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n if (fromStep === 'Search Existing Users' && $scope.vm.availableApplications.length === 1) {\r\n $scope.goToNextVisiblePage();\r\n }\r\n }, function errorCallback(response) {\r\n $scope.showRMLoadingIcon = false;\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n helperService.showErrorMessage(response);\r\n });\r\n }, function errorCallback(response) {\r\n $scope.showRMLoadingIcon = false;\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n helperService.showErrorMessage(response);\r\n }\r\n );\r\n\r\n }\r\n }\r\n vm.builtRequest = RequestManagementBuildRequestService.buildRequest(vm, false);\r\n\r\n if (toStep.includes('Emergency Access Usage')) {\r\n vm.availableApplications.forEach(function (application) {\r\n if (application.selected && application.ProductType === 'SAP' && (!vm.ListOfSelectedSAPRoleObjects[application.ProductName] || vm.ListOfSelectedSAPRoleObjects[application.ProductName].length === 0)) {\r\n RequestManagementSAPLoadDataService.loadSAPRoleObjects($scope, application);\r\n }\r\n });\r\n }\r\n\r\n if (toStep === \"Access Effective Dates\" || toStep === \"Summary\") {\r\n\r\n $scope.loadingIcon = true;\r\n $scope.minimumExpirationDate = new Date();\r\n if (vm.config.find(config => config.Name === 'IM_DefaultExpirationEnabled').Value === '1') {\r\n calculateExpirationDate();\r\n }\r\n\r\n RequestManagementBuildRequestService.executeRequest(vm.builtRequest).then(function (response) {\r\n vm.ReturnedRequest = response.data;\r\n\r\n RequestManagementLoadDataService.loadRequestData(toStep, fromStep, vm, $scope, vm.ReturnedRequest).done(function () {\r\n $scope.loadingIcon = false;\r\n });\r\n\r\n //Check if AX roles have been selected. Changes screens on Access Effective Dates and Summary page\r\n if (vm.ListOfSelectedAX7Roles && vm.ListOfSelectedAX7Roles.length > 0 || vm.ListOfSelectedAX2012Roles && vm.ListOfSelectedAX2012Roles.length > 0) {\r\n $scope.hasAX = true;\r\n } else {\r\n $scope.hasAX = false;\r\n }\r\n });\r\n\r\n }\r\n\r\n if (toStep === \"Risk Analysis\") {\r\n\r\n vm.buildReviewRisksDataSource(vm.builtRequest);\r\n }\r\n\r\n };\r\n\r\n $scope.loadEffectiveDateData = function (request) {\r\n vm.AccessChanges = RequestManagementLoadDataService.findAccessChanges(request, vm.AccessChanges);\r\n\r\n //Show the AX grid if the request contains AX\r\n if (vm.ListOfSelectedAX7Roles.length > 0 || vm.ListOfAvailableAX2012Roles.length > 0) {\r\n $scope.hasAX = true;\r\n } else {\r\n $scope.hasAX = false;\r\n }\r\n };\r\n vm.riskResults = null;\r\n\r\n vm.clearRiskAnalysisResults = function () {\r\n vm.riskResults = null;\r\n\r\n //Assign totals for summary grids\r\n $scope.ucExistingTotal = '';\r\n $scope.ucNewTotal = '';\r\n $scope.ucRemovedTotal = '';\r\n $scope.ucTotal = '';\r\n\r\n $scope.caGroupExistingTotal = '';\r\n $scope.caGroupNewTotal = '';\r\n $scope.caGroupRemovedTotal = '';\r\n $scope.caGroupTotal = '';\r\n\r\n $scope.caObjectExistingTotal = '';\r\n $scope.caObjectNewTotal = '';\r\n $scope.caObjectRemovedTotal = '';\r\n $scope.caObjectTotal = '';\r\n\r\n $scope.bpGroupExistingTotal = '';\r\n $scope.bpGroupNewTotal = '';\r\n $scope.bpGroupRemovedTotal = '';\r\n $scope.bpGroupTotal = '';\r\n\r\n $scope.bpObjectExistingTotal = '';\r\n $scope.bpObjectNewTotal = '';\r\n $scope.bpObjectRemovedTotal = '';\r\n $scope.bpObjectTotal = '';\r\n\r\n //Datasource for Risk Analysis User Risks grid\r\n $scope.UserRisksDataSource = [];\r\n $scope.BusinessProcessDataSource = [];\r\n };\r\n\r\n //Review Risks\r\n vm.buildReviewRisksDataSource = function (request) {\r\n $scope.showReviewRisksLoadingIcon = true;\r\n\r\n vm.clearRiskAnalysisResults();\r\n\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/identitymanager/requests/riskanalysis/v2',\r\n data: request\r\n }).then(function (response) {\r\n\r\n vm.riskResults = response.data;\r\n\r\n\r\n $scope.showSummary = true;\r\n $scope.showUserRiskDetails = false;\r\n $scope.showBusinessProcessDetails = false;\r\n\r\n //Assign totals for summary grids\r\n $scope.ucExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Existing');\r\n $scope.ucNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Added');\r\n $scope.ucRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Deleted');\r\n $scope.ucTotal = $scope.ucExistingTotal + $scope.ucNewTotal;\r\n\r\n $scope.bpGroupExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Existing');\r\n $scope.bpGroupNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Added');\r\n $scope.bpGroupRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Deleted');\r\n $scope.bpGroupTotal = $scope.bpGroupExistingTotal + $scope.bpGroupNewTotal;\r\n\r\n $scope.bpObjectExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Existing');\r\n $scope.bpObjectNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Added');\r\n $scope.bpObjectRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Deleted');\r\n $scope.bpObjectTotal = $scope.bpObjectExistingTotal + $scope.bpObjectNewTotal;\r\n\r\n //Datasource for Risk Analysis User Risks grid\r\n\r\n $scope.UserRisksDataSource = response.data.UserRisks;\r\n updateUserRisksDetailedViewGridIfMitigationRequestsExist();\r\n\r\n function updateUserRisksDetailedViewGridIfMitigationRequestsExist() {\r\n $scope.UserRisksDataSource.forEach(item => {\r\n if ($scope.UserMitigations.length > 0) {\r\n let match = $scope.UserMitigations.some(mitigation => {\r\n return mitigation.RiskId === item.RiskId && mitigation.CompanyMasterId === item.CompanyMasterID;\r\n });\r\n if (match) {\r\n item.RequestMitigation = 'Edit';\r\n }\r\n else if (!match && item.MitigationStatus !== 'New' && item.MitigationStatus) {\r\n return;\r\n }\r\n else {\r\n item.RequestMitigation = 'Request';\r\n }\r\n } else if (item.MitigationStatus === 'New' || !item.MitigationStatus) {\r\n item.RequestMitigation = 'Request';\r\n }\r\n else {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n $scope.BusinessProcessDataSource = response.data.BusinessProcesses;\r\n\r\n var addedList = response.data.UserRisks.filter(e => e.Comparison === 'Added');\r\n var addedPlusCurrentList = response.data.UserRisks.filter(e => e.Comparison === 'Existing' || e.Comparison === 'Added');\r\n\r\n if (addedPlusCurrentList.length > 0) {\r\n vm.RiskLevelId = Math.max.apply(Math, addedPlusCurrentList.map(function (o) { return o.RiskLevelId; }));\r\n } else {\r\n vm.RiskLevelId = 0;\r\n }\r\n\r\n if (addedList.length > 0) {\r\n vm.RiskLevelIdNewOnly = Math.max.apply(Math, addedList.map(function (o) { return o.RiskLevelId; }));\r\n } else {\r\n vm.RiskLevelIdNewOnly = 0;\r\n }\r\n\r\n vm.IsRisksReviewed = true;\r\n $scope.showReviewRisksLoadingIcon = false;\r\n }, function errorCallback(response) {\r\n $scope.showReviewRisksLoadingIcon = false;\r\n });\r\n };\r\n\r\n if ($scope.requestToEdit) {\r\n getAdditionalRequestDetails();\r\n }\r\n\r\n $scope.removeFile = async function (file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n\r\n const index = vm.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.existingFilesDataSource.splice(index, 1);\r\n $scope.fileActionPending = false;\r\n } catch {\r\n $scope.fileActionPending = false;\r\n }\r\n };\r\n\r\n $scope.downloadFile = async function (file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n const response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n $scope.fileActionPending = false;\r\n } catch {\r\n $scope.fileActionPending = false;\r\n }\r\n };\r\n\r\n $scope.uploadFiles = async function (files, requestId) {\r\n let fd = new FormData();\r\n\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"ImRequest\");\r\n fd.append(\"DataTypeId\", requestId);\r\n\r\n await controlLibraryDataService.addAttachments(fd);\r\n };\r\n\r\n // Link Ticket logic ========================\r\n\r\n if (!$scope.linkedTickets) $scope.linkedTickets = [];\r\n\r\n $scope.openIMRequestJiraTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestJiraTicketModal.html',\r\n controller: IMRequestJiraTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestFreshServiceTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestFreshServiceTicketModal.html',\r\n controller: IMRequestFreshServiceTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestServiceNowTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.html',\r\n controller: IMRequestServiceNowTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestZendeskTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestZendeskTicketModal.html',\r\n controller: IMRequestZendeskTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestCustomTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestCustomTicketModal.html',\r\n controller: IMRequestCustomTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.removeIMRequestTicketLink = function (providerString) {\r\n $scope.linkedTickets = $scope.linkedTickets.filter(ticket => ticket.TicketProvider !== providerString);\r\n\r\n if (providerString === 'Jira') $scope.jiraTicketLinked = false;\r\n else if (providerString === 'ServiceNow') $scope.serviceNowTicketLinked = false;\r\n else if (providerString === 'Zendesk') $scope.zendeskTicketLinked = false;\r\n else if (providerString === 'Custom') $scope.customTicketLinked = false;\r\n };\r\n\r\n //Submit request functions\r\n $scope.finishedWizard = function () {\r\n\r\n // add selected role template names to request notes if restriction is on\r\n if (vm.selectedRoleTemplates?.length && vm.roleTemplatesOnlyEnabled) {\r\n if (!vm.RequestNotes.includes(' Selected Role Templates: ')) {\r\n vm.RequestNotes += \" Selected Role Templates: \"\r\n }\r\n vm.selectedRoleTemplates.forEach(template => {\r\n if (!vm.RequestNotes.includes(template.Name)) {\r\n vm.RequestNotes += template.Name + \" \";\r\n }\r\n });\r\n }\r\n\r\n $scope.updatePending = new createSpinner();\r\n var builtRequest = RequestManagementBuildRequestService.buildRequest(vm, true);\r\n //Make a copy of the request before the dates are changed so the actual data is not affected by converting dates\r\n var builtRequestCopy = angular.copy(builtRequest);\r\n //Convert request dates to Date before sending them to the DB\r\n RequestManagementLoadDataService.addEffectiveDates(builtRequestCopy, vm.AccessChanges);\r\n //Convert request dates to Date before sending them to the DB\r\n RequestManagementEffectiveDateService.convertRequestDates(builtRequestCopy);\r\n builtRequestCopy.UserMitigations = $scope.UserMitigations;\r\n builtRequestCopy.Tickets = $scope.linkedTickets;\r\n builtRequestCopy.ExpirationDate = $scope.vm.ExpirationDate ? new Date($scope.vm.ExpirationDate).toUTCString() : null;\r\n\r\n //Update request if there is currently an open request\r\n if ($scope.requestToEdit) {\r\n $scope.updateExistingRequest(builtRequestCopy);\r\n } else {\r\n $scope.alertUser(builtRequestCopy);\r\n }\r\n };\r\n\r\n $scope.alertUser = async function (request) {\r\n $scope.updatePending = new createSpinner();\r\n if (request.SfRequest?.User?.Email !== $scope.vm.assignedSalesforceEmail) {\r\n try {\r\n await swal(helperService.areYouSureParams(\"Warning\", salesforceEmailMessage, \"OK\", \"Cancel\"));\r\n $scope.submitRequest(request);\r\n } catch {\r\n $scope.updatePending.loadingValue = false;\r\n }\r\n } else {\r\n $scope.submitRequest(request);\r\n }\r\n };\r\n\r\n $scope.submitRequest = async function (request) {\r\n try {\r\n let { data } = await $http.post(apiUrl + 'api/identitymanager/requests', request);\r\n\r\n $scope.updatePending.loadingValue = false;\r\n\r\n if (vm.attachments.flow.files.length > 0) {\r\n const requestId = data;\r\n $scope.uploadFiles(vm.attachments.flow.files, requestId);\r\n }\r\n helperService.showConfirmationMessage(\"Success\", \"Your request has been submitted for approval.\");\r\n $location.path('/IdentityManager/Place/RequestManagement').search({});\r\n } catch (error) {\r\n $scope.updatePending.loadingValue = false;\r\n helperService.showErrorMessage(error.data);\r\n }\r\n }\r\n\r\n\r\n $scope.updateExistingRequest = function (request) {\r\n $scope.updatePending = new createSpinner();\r\n\r\n\r\n $http.put(apiUrl + 'api/identitymanager/requests/' + $scope.requestToEdit.Id + '/version/' + $scope.requestToEdit.Version, request).then(function (response) {\r\n\r\n if (vm.attachments?.flow?.files?.length > 0) {\r\n $scope.uploadFiles(vm.attachments.flow.files, $scope.requestToEdit.Id);\r\n }\r\n\r\n helperService.showConfirmationMessage(\"Success\", \"Your request has been updated.\");\r\n $location.path('/IdentityManager/Place/RequestManagement').search({});\r\n }, function errorCallback(response) {\r\n $scope.updatePending.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport IMRequestJiraTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestJiraTicketModal.controller\";\r\nimport IMRequestServiceNowTicketModalController from \"./WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.controller\";\r\nimport IMRequestZendeskTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestZendeskTicketModal.controller\";\r\nimport IMRequestCustomTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestCustomTicketModal.controller\";\r\nimport { ax7_application_id, ax_application_id, oracle_application_id, oracleCloud_application_id, gp_application_id, nav_application_id, d365s_application_id, sap_application_id, netsuite_application_id, universalProduct_application_id, aad_application_id, ps_application_id, salesforce_application_id } from \"../../Shared/GlobalVariables/applicationIdVariables\";\r\nimport { standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport IMRequestFreshServiceTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestFreshServiceTicketModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, RequestManagementBuildRequestService, manageDataDataService, RequestManagementShowStepsService, RequestManagementStepDefinitions, RequestManagementWizardController, RequestManagementGPLoadDataService, RequestManagementOracleLoadDataService, RequestManagementEffectiveDateService, RequestManagementLoadDataService, RequestManagementAXLoadDataService, RequestManagementSAPLoadDataService, RequestManagementNetSuiteLoadDataService, RequestManagementNAVLoadDataService, RequestManagementD365SLoadDataService, RequestManagementUPLoadDataService, RequestManagementAADLoadDataService, RequestManagementPSLoadDataService, salesforceLoadData, WizardHandler, $rootScope, objectIdDataService, $http, $filter, $location, helperService, RequestManagementOracleCloudLoadDataService, passwordCriteriaDataService, controlLibraryDataService, FileSaver, configurationDataService) {\r\n\r\n var vm = $scope.vm = {};\r\n $scope.vmh = helperService;\r\n $scope.helperService = helperService;\r\n $scope.UserMitigations = [];\r\n vm.existingFilesDataSource = [];\r\n $scope.requireTickets = false;\r\n $scope.disableObjectLevelRiskAnalysis = false;\r\n\r\n //Common path functions\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n activate();\r\n\r\n async function activate() {\r\n var { data: config } = await configurationDataService.getConfigurationValues(),\r\n defaultTemplateEnabled = config.some(item => item.Name === \"IM_DefaultRoleTemplateForNewUserRequestsEnabled\" && item?.Value === \"1\"),\r\n { Value: defaultTemplateId } = config.find(item => item.Name === \"IM_DefaultRoleTemplateForNewUserRequests\"),\r\n roleTemplates;\r\n\r\n vm.config = config;\r\n vm.showExistingUserExpansion = true;\r\n vm.toggleExistingUserExpansion = false;\r\n\r\n\r\n vm.bypassRiskAnalysis = config.some(item => item.Name === \"IM_BypassRiskAnalysis\" && item?.Value === \"1\")\r\n $scope.requireTickets = config.find(item => item.Name === \"IM_RequireTicketAssociation\").Value === '1';\r\n vm.roleTemplatesOnlyEnabled = config.some(item => item.Name === \"IM_RoleTemplatesOnlyEnabled\" && item.Value === \"1\");\r\n $scope.disableObjectLevelRiskAnalysis = config.some(item => item.Name === \"IM_DisableObjectLevelRiskAnalysis\" && item?.Value === \"1\");\r\n\r\n if (defaultTemplateEnabled) {\r\n roleTemplates = await $http.get(`${apiUrl}api/universal/roletemplates`);\r\n $scope.defaultRoleTemplate = roleTemplates.data.find(template => template.Id === defaultTemplateId);\r\n }\r\n\r\n securityCheck();\r\n getApplications();\r\n }\r\n\r\n function securityCheck() {\r\n let security = JSON.parse(localStorage.getItem('UserSecurityObjects'));\r\n if (security.find(o => o.ObjectID === 11402)) return;\r\n else $location.path('/403');\r\n }\r\n\r\n async function calculateExpirationDate() {\r\n let numberOfDaysToAdd = Number(vm.config.find(configuration => configuration.Name === 'IM_DefaultExpirationDays').Value);\r\n\r\n if (numberOfDaysToAdd) {\r\n vm.ExpirationDate = new Date();\r\n vm.ExpirationDate.setDate(vm.ExpirationDate.getDate() + numberOfDaysToAdd);\r\n }\r\n }\r\n\r\n async function getAdditionalRequestDetails() {\r\n const response = await $http.get(`${apiUrl}api/identitymanager/requests/${$scope.requestToEdit.Id}/version/${$scope.requestToEdit.Version}`);\r\n vm.existingFilesDataSource = response.data.Attachments;\r\n $scope.vm.ExpirationDate = response.data.ExpirationDate ? new Date(response.data.ExpirationDate) : null;\r\n }\r\n\r\n $scope.getApplicationName = function (applicationId) {\r\n return $scope.vmh.getApplicationName(applicationId, vm.availableApplications);\r\n };\r\n\r\n $scope.getProductName = function (productId) {\r\n return $scope.vmh.getProductName(productId, vm.availableApplications);\r\n };\r\n //--end common path functions\r\n\r\n async function getAX7UserGroupConfigValue() {\r\n let response = await manageDataDataService.getConfigurationByProductId('AX7');\r\n const ax7UserGroupConfigValue = response.data.find(config => config.Name === 'IM_EnableUserGroups');\r\n\r\n vm.EnableAX7UserGroups = ax7UserGroupConfigValue.Value === '1' ? true : false;\r\n }\r\n\r\n $scope.loadingIcon = false;\r\n\r\n vm.BuiltRequest = null;\r\n vm.ReturnedRequest = null;\r\n\r\n vm.RiskLevelId = 0;\r\n vm.RiskLevelIdNewOnly = 0;\r\n\r\n $scope.hasAX = false;\r\n vm.availableApplications = [];\r\n vm.AccessChanges = [];\r\n\r\n //Universal Product Access variables\r\n $scope.vm.ListOfSelectedUPRoles = [];\r\n $scope.vm.ListOfAvailableUPRoles = [];\r\n $scope.vm.ListOfUPCompanies = [];\r\n\r\n\r\n //SAP Access variables\r\n $scope.vm.ListOfSelectedSAPSingleRoles = [];\r\n $scope.vm.ListOfAvailableSAPSingleRoles = [];\r\n\r\n $scope.vm.ListOfSelectedSAPCompositeRoles = [];\r\n $scope.vm.ListOfAvailableSAPCompositeRoles = [];\r\n\r\n //AAD Access variables\r\n vm.ListOfSelectedAADRoles = [];\r\n vm.ListOfAvailableAADRoles = [];\r\n vm.ListOfSelectedAADGroups = [];\r\n vm.ListOfAvailableAADGroups = [];\r\n vm.ListOfSelectedAADLicenses = [];\r\n vm.ListOfAvailableAADLicenses = [];\r\n\r\n //AX7 Access variables\r\n vm.ListOfSelectedAX7Roles = [];\r\n vm.ListOfExcludedAX7Roles = [];\r\n vm.ListOfAvailableAX7Roles = [];\r\n vm.ListOfAX7Companies = [];\r\n vm.AX7RoleCompanyList = [];\r\n vm.ListOfAvailableAX7UserGroups = [];\r\n vm.ListOfSelectedAX7UserGroups = [];\r\n\r\n //AX2012 Access variables\r\n vm.ListOfSelectedAX2012Roles = [];\r\n vm.ListOfExcludedAX2012Roles = [];\r\n vm.ListOfAvailableAX2012Roles = [];\r\n vm.ListOfAX2012Companies = [];\r\n vm.AX2012RoleCompanyList = [];\r\n vm.ListOfAX2012Partitions = [];\r\n vm.ListOfAvailableAX2012UserGroups = [];\r\n vm.ListOfSelectedAX2012UserGroups = [];\r\n\r\n //NetSuite Access varibles\r\n vm.ListOfSelectedNetSuiteRoles = [];\r\n vm.ListOfAvailableNetSuiteRoles = [];\r\n vm.ListOfSelectedNetSuitePermissions = [];\r\n vm.ListOfAvailableNetSuitePermissions = [];\r\n vm.existingGlobalPermissions = [];\r\n vm.netSuiteRequireExistingEmployee = false;\r\n\r\n //Oracle Responsibility variables\r\n vm.ListOfAvailableOracleResponsibilities = [];\r\n vm.ListOfSelectedOracleResponsibilities = [];\r\n vm.ListOfAvailableOracleRoles = [];\r\n vm.ListOfSelectedOracleRoles = [];\r\n\r\n // Oracle Cloud roles variables\r\n vm.ListOfAvailableOracleCloudRoles = [];\r\n vm.ListOfSelectedOracleCloudRoles = [];\r\n vm.ListOfStoredOracleCloudRoles = [];\r\n\r\n // PeopleSoft roles variables\r\n vm.ListOfAvailablePSRoles = [];\r\n vm.ListOfSelectedPSRoles = [];\r\n\r\n //NAV Access varibles\r\n vm.ListOfSelectedNAVRoles = [];\r\n vm.ListOfAvailableNAVRoles = [];\r\n vm.ListOfAvailableNAVPermissionSets = [];\r\n vm.ListOfSelectedNAVPermissionSets = [];\r\n vm.ListOfSelectedNAVUserGroups = [];\r\n vm.ListOfAvailableNAVUserGroups = [];\r\n\r\n //GP Access varibles\r\n vm.ListOfSelectedGPRoles = [];\r\n vm.ListOfAvailableGPRoles = [];\r\n\r\n vm.ListOfStoredGPRoles = [];\r\n\r\n vm.ListOfSelectedGPCompanies = [];\r\n vm.ListOfAvailableGPCompanies = [];\r\n\r\n //D365S Access varibles\r\n vm.ListOfSelectedD365SRoles = [];\r\n vm.ListOfAvailableD365SRoles = [];\r\n vm.ListOfSelectedD365STeams = [];\r\n vm.ListOfAvailableD365STeams = [];\r\n\r\n //Salesforce Access Variables\r\n vm.ListOfAvailableSalesforcePermissionSets = [];\r\n vm.ListOfSelectedSalesforcePermissionSets = [];\r\n\r\n vm.RequestNotes = '';\r\n\r\n //Provided default values\r\n $scope.vm.User = {};\r\n\r\n $scope.updatePending = {};\r\n\r\n var locationPath = $location.path().split(\"/\");\r\n vm.wizardMode = locationPath[4];\r\n\r\n function getApplications() {\r\n $http.get(apiUrl + 'api/identitymanager/applications').then(function (response) {\r\n\r\n response.data.forEach(function (row, i) {\r\n row.selected = false;\r\n });\r\n response.data = $filter('orderBy')(response.data, 'ProductName');\r\n $scope.vm.availableApplications = response.data;\r\n $scope.atLeastOneAppSelected();\r\n\r\n //If the user is modifying an open request load the data after the available applications have populated\r\n if ($rootScope.requestToEdit) {\r\n RequestManagementLoadDataService.loadOpenRequestData($scope);\r\n }\r\n\r\n //Check if custom apps exist\r\n var existingSteps = RequestManagementStepDefinitions.getListOfSteps(vm.wizardMode, vm.alternatePath, $rootScope.requestToEdit);\r\n $scope.vm.availableApplications.forEach(application => {\r\n $scope.vm.ListOfSelectedSAPSingleRoles[application.ProductName] = [];\r\n $scope.vm.ListOfSelectedSAPCompositeRoles[application.ProductName] = [];\r\n $scope.vm.ListOfSelectedUPRoles[application.ProductName] = [];\r\n if (!existingSteps.some(step => step.parent && step.parent === application.ProductName)) {\r\n $scope.steps = RequestManagementShowStepsService.createCustomSteps(application, existingSteps);\r\n }\r\n });\r\n if (!$scope.steps) {\r\n $scope.steps = RequestManagementStepDefinitions.getListOfSteps(vm.wizardMode, vm.alternatePath, $rootScope.requestToEdit);\r\n }\r\n\r\n // Remove Risk Analysis Step if Configuration is enabled\r\n if ($scope.vm.bypassRiskAnalysis) {\r\n const riskAnalysisStepIndex = $scope.steps.findIndex(step => step.title === 'Risk Analysis');\r\n $scope.steps.splice(riskAnalysisStepIndex, 1);\r\n }\r\n });\r\n }\r\n\r\n $scope.selectApplicationsHelpText = 'Select the application(s) the user will access';\r\n\r\n vm.linkedUserChange = function (linkedUser) {\r\n $scope.vm.linkedUser = linkedUser;\r\n };\r\n\r\n vm.disabledAppSelection = function (application) {\r\n const appName = helperService.removeSpaces(application.Name);\r\n if (vm.linkedUser) {\r\n if (vm.linkedUser[appName]) {\r\n application.selected = false;\r\n }\r\n return vm.linkedUser[appName];\r\n }\r\n return false;\r\n }\r\n\r\n vm.linkedUserCheck = function() {\r\n if (!vm.toggleExistingUserExpansion) {\r\n vm.linkedUserChange(null);\r\n }\r\n }\r\n\r\n //Application\r\n vm.appSelectedChange = async function (application) {\r\n vm.IsRisksReviewed = null;\r\n if (application.selected) {\r\n if (application.Id == netsuite_application_id) {\r\n RequestManagementNetSuiteLoadDataService.loadNetSuite($scope, null, null, null);\r\n $scope.getNsRequireExistingEmployee().then(function (requireExisting) {\r\n return vm.netSuiteRequireExistingEmployee = requireExisting;\r\n });\r\n }\r\n\r\n if (application.Id == sap_application_id) {\r\n RequestManagementSAPLoadDataService.loadSAP($scope, application, null);\r\n //Load SAP Password Criteria\r\n passwordCriteriaDataService.getPasswordCriteria(application.ProductID).then(function (response) {\r\n $scope.vm.sapPasswordCriteria = {};\r\n $scope.vm.sapPasswordCriteria[application.ProductName] = response.data;\r\n }).catch(function (response) {\r\n $scope.vm.sapPasswordCriteria = {};\r\n });\r\n }\r\n\r\n if (application.Id == aad_application_id) {\r\n RequestManagementAADLoadDataService.loadAAD($scope, null);\r\n //Load AAD Password Criteria\r\n passwordCriteriaDataService.getPasswordCriteria(application.ProductID).then(function (response) {\r\n $scope.vm.aadPasswordCriteria = {};\r\n $scope.vm.aadPasswordCriteria = response.data;\r\n }).catch(function (response) {\r\n $scope.vm.aadPasswordCriteria = {};\r\n });\r\n }\r\n\r\n if (application.Id == ps_application_id) {\r\n RequestManagementPSLoadDataService.loadPS($scope, null);\r\n //Load PS Password Criteria\r\n passwordCriteriaDataService.getPasswordCriteria(application.ProductID).then(function (response) {\r\n $scope.vm.psPasswordCriteria = {};\r\n $scope.vm.psPasswordCriteria = response.data;\r\n }).catch(function (response) {\r\n $scope.vm.psPasswordCriteria = {};\r\n });\r\n }\r\n\r\n if (application.Id == ax7_application_id) {\r\n RequestManagementAXLoadDataService.loadAX7($scope, null);\r\n }\r\n\r\n if (application.Id == ax_application_id) {\r\n RequestManagementAXLoadDataService.loadAX2012($scope, null);\r\n }\r\n\r\n if (application.Id == oracle_application_id) {\r\n await RequestManagementOracleLoadDataService.loadOracle($scope, null);\r\n }\r\n\r\n if (application.Id == oracleCloud_application_id) {\r\n RequestManagementOracleCloudLoadDataService.loadOracleCloud($scope, null);\r\n }\r\n\r\n if (application.Id == gp_application_id) {\r\n RequestManagementGPLoadDataService.loadGP($scope, null);\r\n }\r\n\r\n if (application.Id == nav_application_id) {\r\n RequestManagementNAVLoadDataService.loadNAV($scope, null);\r\n }\r\n\r\n if (application.Id === d365s_application_id) {\r\n RequestManagementD365SLoadDataService.loadD365S($scope, null);\r\n }\r\n\r\n if (application.Id === universalProduct_application_id) {\r\n RequestManagementUPLoadDataService.loadUP($scope, application, null);\r\n }\r\n\r\n if (application.Id === salesforce_application_id) {\r\n salesforceLoadData.loadSalesforce($scope, application, null);\r\n }\r\n }\r\n\r\n $scope.atLeastOneAppSelected();\r\n\r\n $scope.loadERPSpecificSteps(application);\r\n };\r\n\r\n $scope.loadERPSpecificSteps = async function (application) {\r\n switch (application.ProductType) {\r\n case 'OR':\r\n if (!vm.ORRBACEnabled) {\r\n const rolesStepIndex = $scope.steps.findIndex(step => step.title === 'Oracle EBS Roles');\r\n if (rolesStepIndex > -1) {\r\n $scope.steps.splice(rolesStepIndex, 1);\r\n }\r\n }\r\n RequestManagementShowStepsService.setOracleStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'SAP':\r\n if (application.ProductName === 'SAP') {\r\n RequestManagementShowStepsService.setSAPStepsToVisible(vm.availableApplications, $scope.steps);\r\n } else {\r\n RequestManagementShowStepsService.setCustomStepsToVisible(vm.availableApplications, $scope.steps, application);\r\n }\r\n break;\r\n case 'NS':\r\n RequestManagementShowStepsService.setNetSuiteStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AAD':\r\n RequestManagementShowStepsService.setAADStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AX7':\r\n await getAX7UserGroupConfigValue();\r\n if (!vm.EnableAX7UserGroups) {\r\n const userGroupsStepIndex = $scope.steps.findIndex(step => step.title === 'Dynamics 365 for Finance and Supply Chain User Groups');\r\n if (userGroupsStepIndex > -1) {\r\n $scope.steps.splice(userGroupsStepIndex, 1);\r\n }\r\n }\r\n RequestManagementShowStepsService.setAX7StepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AX':\r\n RequestManagementShowStepsService.setAX2012StepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'GP':\r\n RequestManagementShowStepsService.setGPStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'NAV':\r\n RequestManagementShowStepsService.setNAVStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'D365S':\r\n RequestManagementShowStepsService.setD365SStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'PS':\r\n RequestManagementShowStepsService.setPSStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'SF':\r\n RequestManagementShowStepsService.setSalesforceStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n default:\r\n RequestManagementShowStepsService.setCustomStepsToVisible(vm.availableApplications, $scope.steps, application);\r\n break;\r\n }\r\n };\r\n\r\n $scope.atLeastOneAppSelected = function () {\r\n vm.validAppsSelected = RequestManagementWizardController.atLeastOneAppSelected(vm.availableApplications);\r\n };\r\n\r\n $scope.getNsRequireExistingEmployee = function () {\r\n return $http.get(apiUrl + 'api/core/configuration/NS_ImRequireExistingEmployee').then(function (response) {\r\n return response.data === 1;\r\n });\r\n };\r\n\r\n //Wizard Navigation\r\n $scope.stepDisabled = function (title) {\r\n return RequestManagementWizardController.stepDisabled(title, WizardHandler.wizard(), $scope);\r\n };\r\n\r\n $scope.setParentStepToActive = function (parent) {\r\n return RequestManagementWizardController.setParentStepToActive(parent, WizardHandler.wizard(), $scope.steps);\r\n };\r\n\r\n $scope.goToNextVisiblePage = function () {\r\n var step = RequestManagementWizardController.goToNextVisiblePage($scope.steps, WizardHandler.wizard());\r\n $scope.setActivePage(step.title);\r\n };\r\n\r\n $scope.goToPreviousVisiblePage = function () {\r\n var step = RequestManagementWizardController.goToPreviousVisiblePage($scope.steps, WizardHandler.wizard());\r\n $scope.setActivePage(step.title);\r\n };\r\n\r\n $scope.setCurrentStepToActive = function () {\r\n return RequestManagementWizardController.getCurrentStepsTitle(WizardHandler.wizard());\r\n };\r\n\r\n $scope.setActivePage = function (stepTitle) {\r\n var wizardInstance = WizardHandler.wizard();\r\n var currentStepNumber = wizardInstance.currentStepNumber();\r\n var enabledSteps = wizardInstance.getEnabledSteps();\r\n var step = enabledSteps[currentStepNumber - 1];\r\n if (step.canexit == true) {\r\n $scope.buildRequest(step.title, stepTitle);\r\n }\r\n wizardInstance.goTo(stepTitle);\r\n };\r\n //---End of Wizard Navigation\r\n\r\n $scope.buildRequest = async function (fromStep, toStep) {\r\n\r\n vm.builtRequest = RequestManagementBuildRequestService.buildRequest(vm, false);\r\n $scope.$broadcast('broadcast-im-wizardstepchange', { fromStep: fromStep, toStep: toStep });\r\n\r\n if (fromStep == \"Access Effective Dates\") {\r\n if (vm.AccessChanges != null) {\r\n vm.AccessChanges.forEach(function (access) {\r\n //Loop thru AX roles and update start/end dates set on effective dates page\r\n if (access.Company != null) {\r\n if (access.Companies != null) {\r\n vm.ListOfSelectedAX7Roles.forEach(function (role) {\r\n\r\n if (role.Companies != null) {\r\n var company = role.Companies.find(function (company) {\r\n return company.CompanyId == access.Company.CompanyId;\r\n });\r\n company.StartDate = access.StartDate;\r\n company.EndDate = access.EndDate;\r\n }\r\n });\r\n }\r\n }\r\n //Loop thru Oracle Cloud roles and update start/end dates set on effective dates page\r\n if (access.ProductId === 'ORFC' && vm.ListOfSelectedOracleCloudRoles.length > 0) {\r\n vm.ListOfSelectedOracleCloudRoles.forEach(r => {\r\n if (r.RoleID === access.RoleID) {\r\n r.StartDate = access.StartDate;\r\n r.EndDate = access.EndDate;\r\n }\r\n });\r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n if (toStep == \"Access Effective Dates\" || toStep == \"Summary\") {\r\n\r\n if (toStep == \"Summary\") {\r\n //Display loading icon on the summary page while build is working\r\n $scope.loadingIcon = true;\r\n $scope.rebindEffectiveDates = $scope.rebindEffectiveDates == 0 ? 1 : 0;\r\n //Default value check property = default, set minimum date property\r\n $scope.minimumExpirationDate = new Date();\r\n if (vm.config.find(config => config.Name === 'IM_DefaultExpirationEnabled').Value === '1') {\r\n calculateExpirationDate();\r\n }\r\n }\r\n\r\n RequestManagementBuildRequestService.executeRequest(vm.builtRequest).then(function (response) {\r\n vm.ReturnedRequest = response.data;\r\n\r\n RequestManagementLoadDataService.loadRequestData(toStep, fromStep, vm, $scope, vm.ReturnedRequest).done(function () {\r\n $scope.loadingIcon = false;\r\n });\r\n\r\n //Check if AX roles have been selected. Changes screens on Access Effective Dates and Summary page\r\n if (vm.ListOfSelectedAX7Roles != null && vm.ListOfSelectedAX7Roles.length > 0 || vm.ListOfSelectedAX2012Roles != null && vm.ListOfSelectedAX2012Roles.length > 0) {\r\n $scope.hasAX = true;\r\n } else {\r\n $scope.hasAX = false;\r\n }\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n if (toStep == \"Risk Analysis\") {\r\n vm.buildReviewRisksDataSource(vm.builtRequest);\r\n }\r\n\r\n };\r\n\r\n $scope.organizationEnabled = false;\r\n\r\n // Link Ticket logic ========================\r\n\r\n if (!$scope.linkedTickets) $scope.linkedTickets = [];\r\n\r\n $scope.openIMRequestJiraTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestJiraTicketModal.html',\r\n controller: IMRequestJiraTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestFreshServiceTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestFreshServiceTicketModal.html',\r\n controller: IMRequestFreshServiceTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestServiceNowTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.html',\r\n controller: IMRequestServiceNowTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestZendeskTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestZendeskTicketModal.html',\r\n controller: IMRequestZendeskTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestCustomTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestCustomTicketModal.html',\r\n controller: IMRequestCustomTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.removeIMRequestTicketLink = function (providerString) {\r\n $scope.linkedTickets = $scope.linkedTickets.filter(ticket => ticket.TicketProvider !== providerString);\r\n\r\n if (providerString === 'Jira') $scope.jiraTicketLinked = false;\r\n else if (providerString === 'ServiceNow') $scope.serviceNowTicketLinked = false;\r\n else if (providerString === 'Zendesk') $scope.zendeskTicketLinked = false;\r\n else if (providerString === 'Custom') $scope.customTicketLinked = false;\r\n };\r\n\r\n // Attachments logic\r\n\r\n if ($scope.requestToEdit) {\r\n getAdditionalRequestDetails();\r\n }\r\n\r\n $scope.removeFile = async function (file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n\r\n const index = vm.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.existingFilesDataSource.splice(index, 1);\r\n $scope.fileActionPending = false;\r\n } catch {\r\n $scope.fileActionPending = false;\r\n }\r\n };\r\n\r\n $scope.downloadFile = async function (file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n const response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n $scope.fileActionPending = false;\r\n } catch {\r\n $scope.fileActionPending = false;\r\n }\r\n };\r\n\r\n $scope.uploadFiles = async function (files, requestId) {\r\n let fd = new FormData();\r\n\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"ImRequest\");\r\n fd.append(\"DataTypeId\", requestId);\r\n\r\n await controlLibraryDataService.addAttachments(fd);\r\n };\r\n\r\n //Build requests for finished wizard\r\n $scope.createNewRequest = function (request) {\r\n\r\n $scope.updatePending = new createSpinner();\r\n\r\n $http.post(apiUrl + 'api/identitymanager/requests', request).then(async function (response) {\r\n if (vm.attachments.flow.files.length > 0) {\r\n const requestId = response.data;\r\n $scope.uploadFiles(vm.attachments.flow.files, requestId);\r\n }\r\n helperService.showConfirmationMessage(\"Success\", \"Your request has been submitted for approval.\");\r\n $location.path('/IdentityManager/Place/RequestManagement').search({});\r\n\r\n },\r\n function errorCallback(response) {\r\n $scope.updatePending.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n\r\n $scope.updateExistingRequest = function (request) {\r\n $scope.updatePending = new createSpinner();\r\n\r\n $http.put(apiUrl + 'api/identitymanager/requests/' + $scope.requestToEdit.Id + '/version/' + $scope.requestToEdit.Version, request).then(function (response) {\r\n\r\n if (vm.attachments.flow.files.length > 0) {\r\n $scope.uploadFiles(vm.attachments.flow.files, $scope.requestToEdit.Id);\r\n }\r\n\r\n helperService.showConfirmationMessage(\"Success\", \"Your request has been updated.\");\r\n $location.path('/IdentityManager/Place/RequestManagement').search({});\r\n }, function errorCallback(response) {\r\n $scope.updatePending.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.finishedWizard = function () {\r\n\r\n // add selected role template names to request notes if restrction is on\r\n if (vm.selectedRoleTemplates?.length && vm.roleTemplatesOnlyEnabled) {\r\n if (!vm.RequestNotes.includes(' Selected Role Templates: ')) {\r\n vm.RequestNotes += \" Selected Role Templates: \"\r\n }\r\n vm.selectedRoleTemplates.forEach(template => {\r\n if (!vm.RequestNotes.includes(template.Name)) {\r\n vm.RequestNotes += template.Name + \" \";\r\n }\r\n });\r\n }\r\n\r\n $scope.updatePending = new createSpinner();\r\n var builtRequest = RequestManagementBuildRequestService.buildRequest(vm, true);\r\n //Make a copy of the request before the dates are changed so the actual data is not affected by converting dates\r\n var builtRequestCopy = angular.copy(builtRequest);\r\n builtRequestCopy.UserMitigations = $scope.UserMitigations;\r\n builtRequestCopy.Tickets = $scope.linkedTickets;\r\n builtRequestCopy.ExpirationDate = $scope.vm.ExpirationDate ? new Date($scope.vm.ExpirationDate).toUTCString() : null;\r\n builtRequestCopy.UserMasterID = $scope.vm.linkedUser?.id ?? null;\r\n //Convert request dates to Date before sending them to the DB\r\n RequestManagementLoadDataService.addEffectiveDates(builtRequestCopy, vm.AccessChanges);\r\n //Convert request dates to Date before sending them to the DB\r\n RequestManagementEffectiveDateService.convertRequestDates(builtRequestCopy);\r\n\r\n //Update request if there is currently an open request\r\n if ($scope.requestToEdit) {\r\n $scope.updateExistingRequest(builtRequestCopy);\r\n } else {\r\n $scope.createNewRequest(builtRequestCopy);\r\n }\r\n };\r\n\r\n $scope.loadEffectiveDateData = function (request) {\r\n vm.AccessChanges = RequestManagementLoadDataService.findAccessChanges(request, vm.AccessChanges);\r\n\r\n $scope.RequestAccessListDataSource = new kendo.data.DataSource({\r\n data: vm.AccessChanges\r\n });\r\n\r\n //Show the AX grid if the request contains AX\r\n if (vm.ListOfSelectedAX7Roles.length > 0 || vm.ListOfSelectedAX2012Roles.length > 0) {\r\n $scope.hasAX = true;\r\n } else {\r\n $scope.hasAX = false;\r\n }\r\n };\r\n\r\n vm.clearRiskAnalysisResults = function () {\r\n vm.riskResults = null;\r\n\r\n //Assign totals for summary grids\r\n $scope.ucExistingTotal = '';\r\n $scope.ucNewTotal = '';\r\n $scope.ucRemovedTotal = '';\r\n $scope.ucTotal = '';\r\n\r\n $scope.caGroupExistingTotal = '';\r\n $scope.caGroupNewTotal = '';\r\n $scope.caGroupRemovedTotal = '';\r\n $scope.caGroupTotal = '';\r\n\r\n $scope.caObjectExistingTotal = '';\r\n $scope.caObjectNewTotal = '';\r\n $scope.caObjectRemovedTotal = '';\r\n $scope.caObjectTotal = '';\r\n\r\n $scope.bpGroupExistingTotal = '';\r\n $scope.bpGroupNewTotal = '';\r\n $scope.bpGroupRemovedTotal = '';\r\n $scope.bpGroupTotal = '';\r\n\r\n $scope.bpObjectExistingTotal = '';\r\n $scope.bpObjectNewTotal = '';\r\n $scope.bpObjectRemovedTotal = '';\r\n $scope.bpObjectTotal = '';\r\n\r\n //Datasource for Risk Analysis User Risks grid\r\n $scope.UserRisksDataSource = [];\r\n $scope.BusinessProcessDataSource = [];\r\n };\r\n\r\n //Review Risks\r\n vm.buildReviewRisksDataSource = function (request) {\r\n $scope.showReviewRisksLoadingIcon = true;\r\n request.UserMasterId = $scope.vm.linkedUser?.id ?? null;\r\n vm.clearRiskAnalysisResults();\r\n\r\n $scope.reviewRisksGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/identitymanager/requests/riskanalysis/v2',\r\n data: request\r\n }).then(function (response) {\r\n\r\n vm.riskResults = response.data;\r\n\r\n //Assign totals for summary grids\r\n $scope.ucExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Existing');\r\n $scope.ucNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Added');\r\n $scope.ucRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.UserRiskAnalysis.CountByComparison, 'Deleted');\r\n $scope.ucTotal = $scope.ucExistingTotal + $scope.ucNewTotal;\r\n\r\n $scope.bpGroupExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Existing');\r\n $scope.bpGroupNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Added');\r\n $scope.bpGroupRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.GroupCountByComparison, 'Deleted');\r\n $scope.bpGroupTotal = $scope.bpGroupExistingTotal + $scope.bpGroupNewTotal;\r\n\r\n $scope.bpObjectExistingTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Existing');\r\n $scope.bpObjectNewTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Added');\r\n $scope.bpObjectRemovedTotal = RequestManagementLoadDataService.searchByKey(vm.riskResults.BusinessProcessAnalysis.ObjectCountByComparison, 'Deleted');\r\n $scope.bpObjectTotal = $scope.bpObjectExistingTotal + $scope.bpObjectNewTotal;\r\n\r\n\r\n //Datasource for Risk Analysis User Risks grid\r\n $scope.UserRisksDataSource = response.data.UserRisks;\r\n updateUserRisksDetailedViewGridIfMitigationRequestsExist();\r\n\r\n function updateUserRisksDetailedViewGridIfMitigationRequestsExist() {\r\n $scope.UserRisksDataSource.forEach(item => {\r\n if ($scope.UserMitigations.length > 0) {\r\n let match = $scope.UserMitigations.some(mitigation => {\r\n return mitigation.RiskId === item.RiskId && mitigation.CompanyMasterId === item.CompanyMasterID;\r\n });\r\n if (match) {\r\n item.RequestMitigation = 'Edit';\r\n }\r\n else if (!match && item.MitigationStatus !== 'New' && item.MitigationStatus) {\r\n return;\r\n }\r\n else {\r\n item.RequestMitigation = 'Request';\r\n }\r\n } else if (item.MitigationStatus === 'New' || !item.MitigationStatus) {\r\n item.RequestMitigation = 'Request';\r\n }\r\n else {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n $scope.BusinessProcessDataSource = response.data.BusinessProcesses;\r\n\r\n //Return the highest RiskId from the data\r\n var addedList = response.data.UserRisks.filter(e => e.Comparison == 'Added');\r\n var addedPlusCurrentList = response.data.UserRisks.filter(e => e.Comparison == 'Existing' || e.Comparison == 'Added');\r\n\r\n if (addedPlusCurrentList.length > 0) {\r\n vm.RiskLevelId = Math.max.apply(Math, addedPlusCurrentList.map(function (o) { return o.RiskLevelId; }));\r\n } else {\r\n vm.RiskLevelId = 0;\r\n }\r\n\r\n if (addedList.length > 0) {\r\n vm.RiskLevelIdNewOnly = Math.max.apply(Math, addedList.map(function (o) { return o.RiskLevelId; }));\r\n } else {\r\n vm.RiskLevelIdNewOnly = 0;\r\n }\r\n\r\n vm.IsRisksReviewed = true;\r\n $scope.showReviewRisksLoadingIcon = false;\r\n }, function errorCallback(response) {\r\n vm.IsRisksReviewed = true;\r\n $scope.showReviewRisksLoadingIcon = false;\r\n options.error();\r\n });\r\n }\r\n },\r\n sort: { field: \"Comparison\", dir: \"asc\" }\r\n });\r\n\r\n $scope.reviewRisksGridDataSource.read();\r\n };\r\n\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport IMRequestJiraTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestJiraTicketModal.controller\";\r\nimport IMRequestServiceNowTicketModalController from \"./WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.controller\";\r\nimport IMRequestZendeskTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestZendeskTicketModal.controller\";\r\nimport IMRequestCustomTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestCustomTicketModal.controller\";\r\nimport { ax7_application_id, sap_application_id, netsuite_application_id, ax_application_id, oracle_application_id, oracleCloud_application_id, gp_application_id, nav_application_id, d365s_application_id, universalProduct_application_id, aad_application_id, ps_application_id, salesforce_application_id } from \"../../Shared/GlobalVariables/applicationIdVariables\";\r\nimport IMRequestFreshServiceTicketModalController from \"./WizardSteps/Universal/linkTickets/IMRequestFreshServiceTicketModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, RequestManagementShowStepsService, RequestManagementStepDefinitions, RequestManagementWizardController, RequestManagementLoadDataService, RequestManagementBuildRequestService, WizardHandler, $rootScope, objectIdDataService, $http, $q, $location, helperService, controlLibraryDataService, FileSaver, userRolesDataService) {\r\n\r\n //Page initialization\r\n var vm = $scope.vm = {};\r\n $scope.vmh = helperService;\r\n $scope.helperService = helperService;\r\n $scope.updatePending = {};\r\n var locationPath = $location.path().split(\"/\");\r\n vm.wizardMode = locationPath[4];\r\n vm.availableApplications = [];\r\n vm.existingFilesDataSource = [];\r\n var RiskLevelId = 0;\r\n var RiskLevelIdNewOnly = 0;\r\n var selectedExistingUser = null;\r\n $scope.vm.nsMaxDate = new Date(2900, 0, 1, 0, 0, 0);\r\n $scope.vm.nsMinDate = new Date();\r\n\r\n $scope.requireTickets = false;\r\n helperService.getConfigurationValue('IM_RequireTicketAssociation').then(function (data) {\r\n $scope.requireTickets = data === \"1\" ? true : false;\r\n });\r\n\r\n //Common Functions - duplicate functions on each pathon\r\n objectIdDataService.getObjectID().then(function (objectId) {\r\n $scope.ObjectId = objectId;\r\n\r\n var securityObject = helperService.getSecurityObjectDetailsFromObjectId($scope.ObjectId);\r\n $scope.pageInfo = securityObject;\r\n $scope.pageDescription = securityObject.HelpLink;\r\n $scope.reportName = securityObject.Name;\r\n\r\n });\r\n\r\n activate();\r\n\r\n function activate() {\r\n securityCheck();\r\n }\r\n\r\n function securityCheck() {\r\n let security = JSON.parse(localStorage.getItem('UserSecurityObjects'));\r\n if (security.find(o => o.ObjectID === 11404)) return;\r\n else $location.path('/403');\r\n }\r\n\r\n async function calculateExpirationDate() {\r\n let numberOfDaysToAdd = Number(vm.config.find(configuration => configuration.Name === 'IM_DefaultExpirationDays').Value);\r\n\r\n if (numberOfDaysToAdd) {\r\n vm.ExpirationDate = new Date();\r\n vm.ExpirationDate.setDate(vm.ExpirationDate.getDate() + numberOfDaysToAdd);\r\n }\r\n }\r\n\r\n async function getAdditionalRequestDetails() {\r\n const response = await $http.get(`${apiUrl}api/identitymanager/requests/${$scope.requestToEdit.Id}/version/${$scope.requestToEdit.Version}`);\r\n vm.existingFilesDataSource = response.data.Attachments;\r\n $scope.vm.ExpirationDate = response.data.ExpirationDate ? new Date(response.data.ExpirationDate) : null;\r\n }\r\n\r\n $scope.getApplicationName = function (applicationId) {\r\n return $scope.vmh.getApplicationName(applicationId, vm.availableApplications);\r\n };\r\n\r\n $scope.getProductName = function (productId) {\r\n return $scope.vmh.getProductName(productId, vm.availableApplications);\r\n };\r\n //--End Common Page Functions\r\n\r\n\r\n $scope.resetUserValues = function () {\r\n $scope.requestUserList = [];\r\n $scope.vm.effectiveDateList = [];\r\n\r\n vm.RiskLevelId = 0;\r\n vm.RiskLevelIdNewOnly = 0;\r\n\r\n var selectedExistingUser = null;\r\n var editRequestExistingUser = {};\r\n\r\n //Universal Product Access variables\r\n $scope.vm.ListOfSelectedUPRoles = [];\r\n $scope.vm.ListOfAvailableUPRoles = [];\r\n $scope.vm.ListOfUPCompanies = [];\r\n\r\n //SAP Access variables\r\n vm.ListOfSelectedSAPSingleRoles = [];\r\n vm.ListOfAvailableSAPSingleRoles = [];\r\n vm.ListOfSelectedSAPCompositeRoles = [];\r\n vm.ListOfAvailableSAPCompositeRoles = [];\r\n\r\n //AAD Access variables\r\n vm.ListOfSelectedAADRoles = [];\r\n vm.ListOfAvailableAADRoles = [];\r\n vm.ListOfSelectedAADGroups = [];\r\n vm.ListOfAvailableAADGroups = [];\r\n vm.ListOfSelectedAADLicenses = [];\r\n vm.ListOfAvailableAADLicenses = [];\r\n\r\n //AX7 Access variables\r\n vm.ListOfSelectedAX7Roles = [];\r\n vm.ListOfExcludedAX7Roles = [];\r\n vm.ListOfAvailableAX7Roles = [];\r\n vm.ListOfAX7Companies = [];\r\n vm.AX7RoleCompanyList = [];\r\n\r\n //AX2012 Access variables\r\n vm.ListOfSelectedAX2012Roles = [];\r\n vm.ListOfExcludedAX2012Roles = [];\r\n vm.ListOfAvailableAX2012Roles = [];\r\n vm.ListOfAX2012Companies = [];\r\n vm.AX2012RoleCompanyList = [];\r\n vm.ListOfAX2012Partitions = [];\r\n\r\n //NetSuite Access varibles\r\n vm.ListOfSelectedNetSuiteRoles = [];\r\n vm.ListOfAvailableNetSuiteRoles = [];\r\n vm.ListOfSelectedNetSuitePermissions = [];\r\n vm.ListOfAvailableNetSuitePermissions = [];\r\n vm.existingGlobalPermissions = [];\r\n\r\n //Oracle Responsibility variables\r\n vm.ListOfAvailableOracleResponsibilities = [];\r\n vm.ListOfSelectedOracleResponsibilities = [];\r\n\r\n // Oracle Cloud roles variables\r\n vm.ListOfAvailableOracleCloudRoles = [];\r\n vm.ListOfSelectedOracleCloudRoles = [];\r\n vm.ListOfStoredOracleCloudRoles = [];\r\n\r\n // PeopleSoft roles variables\r\n vm.ListOfAvailablePSRoles = [];\r\n vm.ListOfSelectedPSRoles = [];\r\n\r\n //NAV Access varibles\r\n vm.ListOfSelectedNAVRoles = [];\r\n vm.ListOfAvailableNAVRoles = [];\r\n vm.ListOfAvailableNAVPermissionSets = [];\r\n vm.ListOfSelectedNAVPermissionSets = [];\r\n vm.ListOfSelectedNAVUserGroups = [];\r\n vm.ListOfAvailableNAVUserGroups = [];\r\n\r\n //GP Access varibles\r\n vm.ListOfSelectedGPRoles = [];\r\n vm.ListOfAvailableGPRoles = [];\r\n vm.ListOfStoredGPRoles = [];\r\n vm.ListOfSelectedGPCompanies = [];\r\n vm.ListOfAvailableGPCompanies = [];\r\n\r\n //D365S Access varibles\r\n vm.ListOfSelectedD365SRoles = [];\r\n vm.ListOfAvailableD365SRoles = [];\r\n vm.ListOfSelectedD365STeams = [];\r\n vm.ListOfAvailableD365STeams = [];\r\n\r\n //Salesforce Access Variables\r\n vm.ListOfAvailableSalesforcePermissionSets = [];\r\n vm.ListOfSelectedSalesforcePermissionSets = [];\r\n\r\n $scope.vm.User = [];\r\n };\r\n\r\n $scope.resetUserValues();\r\n\r\n\r\n //--Select Application Functions\r\n vm.appSelectedChange = function (application) {\r\n\r\n if (!application.selected && $scope.vm.UserChanges) {\r\n var index = $scope.vm.UserChanges.findIndex(change => change.ProductId === application.ProductID);\r\n if (index > -1) {\r\n $scope.vm.UserChanges.splice(index, 1);\r\n }\r\n }\r\n\r\n $scope.atLeastOneAppSelected();\r\n $scope.loadERPSpecificSteps(application);\r\n };\r\n\r\n $scope.loadERPSpecificSteps = function (application) {\r\n switch (application.ProductType) {\r\n case 'OR':\r\n RequestManagementShowStepsService.setOracleStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'SAP':\r\n RequestManagementShowStepsService.setSAPStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AAD':\r\n RequestManagementShowStepsService.setAADStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'NS':\r\n RequestManagementShowStepsService.setNetSuiteStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AX7':\r\n RequestManagementShowStepsService.setAX7StepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'AX':\r\n RequestManagementShowStepsService.setAX2012StepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'GP':\r\n RequestManagementShowStepsService.setGPStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'NAV':\r\n RequestManagementShowStepsService.setNAVStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'D365S':\r\n RequestManagementShowStepsService.setD365SStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'PS':\r\n RequestManagementShowStepsService.setPSStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n case 'SF':\r\n RequestManagementShowStepsService.setSalesforceStepsToVisible(vm.availableApplications, $scope.steps);\r\n break;\r\n default:\r\n RequestManagementShowStepsService.setCustomStepsToVisible(vm.availableApplications, $scope.steps, application);\r\n break;\r\n }\r\n };\r\n\r\n $scope.atLeastOneAppSelected = function () {\r\n vm.validAppsSelected = RequestManagementWizardController.atLeastOneAppSelected(vm.availableApplications, vm.wizardMode);\r\n };\r\n\r\n $scope.vm.applicationTerminationEffectiveDate = function (application, value) {\r\n if (application.Id == universalProduct_application_id) {\r\n $scope.vm.User.UPUser[application.ProductName].StartDate = new Date(value);\r\n }\r\n if (application.Id == sap_application_id) {\r\n $scope.vm.User.SAPUser[application.ProductName].StartDate = new Date(value);\r\n }\r\n if (application.Id == netsuite_application_id) {\r\n $scope.vm.User.NetSuiteUser.StartDate = new Date(value);\r\n }\r\n if (application.Id == aad_application_id) {\r\n $scope.vm.User.AadUser.StartDate = new Date(value);\r\n }\r\n if (application.Id == ax7_application_id) {\r\n $scope.vm.User.AX7User.StartDate = new Date(value);\r\n }\r\n if (application.Id == ax_application_id) {\r\n $scope.vm.User.AX2012User.StartDate = new Date(value);\r\n }\r\n if (application.Id == oracle_application_id) {\r\n $scope.vm.User.OracleUser.StartDate = new Date(value);\r\n }\r\n if (application.Id == oracleCloud_application_id) {\r\n $scope.vm.User.OracleCloudUser.StartDate = new Date(value);\r\n }\r\n if (application.Id == gp_application_id) {\r\n $scope.vm.User.GPUser.StartDate = new Date(value);\r\n }\r\n if (application.Id == nav_application_id) {\r\n $scope.vm.User.NAVUser.StartDate = new Date(value);\r\n }\r\n if (application.Id == d365s_application_id) {\r\n $scope.vm.User.D365SUser.StartDate = new Date(value);\r\n }\r\n if (application.Id == ps_application_id) {\r\n $scope.vm.User.PSUser.StartDate = new Date(value);\r\n }\r\n if (application.Id === salesforce_application_id) {\r\n $scope.vm.User.SalesforceUser.StartDate = new Date(value);\r\n }\r\n };\r\n //--End Select Application events\r\n\r\n\r\n //Wizard Navigation\r\n $scope.steps = RequestManagementStepDefinitions.getListOfSteps(vm.wizardMode, vm.alternatePath, $rootScope.requestToEdit);\r\n\r\n $scope.stepDisabled = function (title) {\r\n return RequestManagementWizardController.stepDisabled(title, WizardHandler.wizard(), $scope);\r\n };\r\n\r\n $scope.setParentStepToActive = function (parent) {\r\n return RequestManagementWizardController.setParentStepToActive(parent, WizardHandler.wizard(), $scope.steps);\r\n };\r\n\r\n $scope.goToNextVisiblePage = function () {\r\n var step = RequestManagementWizardController.goToNextVisiblePage($scope.steps, WizardHandler.wizard());\r\n $scope.setActivePage(step.title);\r\n };\r\n\r\n $scope.goToPreviousVisiblePage = function () {\r\n var step = RequestManagementWizardController.goToPreviousVisiblePage($scope.steps, WizardHandler.wizard());\r\n $scope.setActivePage(step.title);\r\n };\r\n\r\n $scope.setCurrentStepToActive = function () {\r\n return RequestManagementWizardController.getCurrentStepsTitle(WizardHandler.wizard());\r\n };\r\n\r\n $scope.setActivePage = function (stepTitle) {\r\n var wizardInstance = WizardHandler.wizard();\r\n var currentStepNumber = wizardInstance.currentStepNumber();\r\n var enabledSteps = wizardInstance.getEnabledSteps();\r\n var step = enabledSteps[currentStepNumber - 1];\r\n if (step.canexit == true) {\r\n $scope.buildRequest(step.title, stepTitle);\r\n }\r\n $scope.helpText = null;\r\n wizardInstance.goTo(stepTitle);\r\n };\r\n //---End of Wizard Navigation\r\n\r\n // Attachments logic\r\n\r\n if ($scope.requestToEdit) {\r\n getAdditionalRequestDetails();\r\n }\r\n\r\n $scope.removeFile = async function (file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n\r\n const index = vm.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.existingFilesDataSource.splice(index, 1);\r\n $scope.fileActionPending = false;\r\n } catch {\r\n $scope.fileActionPending = false;\r\n }\r\n };\r\n\r\n $scope.downloadFile = async function (file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n const response = await controlLibraryDataService.downloadAttachment(file.Identifier);\r\n FileSaver.saveAs(response.data, file.FileName);\r\n $scope.fileActionPending = false;\r\n } catch {\r\n $scope.fileActionPending = false;\r\n }\r\n };\r\n\r\n $scope.uploadFiles = async function (files, requestId) {\r\n let fd = new FormData();\r\n\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n fd.append(\"DataType\", \"ImRequest\");\r\n fd.append(\"DataTypeId\", requestId);\r\n\r\n await controlLibraryDataService.addAttachments(fd);\r\n };\r\n\r\n // Link Ticket logic ========================\r\n\r\n if (!$scope.linkedTickets) $scope.linkedTickets = [];\r\n\r\n $scope.openIMRequestJiraTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestJiraTicketModal.html',\r\n controller: IMRequestJiraTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestFreshServiceTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestFreshServiceTicketModal.html',\r\n controller: IMRequestFreshServiceTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestServiceNowTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.html',\r\n controller: IMRequestServiceNowTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestZendeskTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestZendeskTicketModal.html',\r\n controller: IMRequestZendeskTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.openIMRequestCustomTicketModal = function () {\r\n\r\n $uibModal.open({\r\n templateUrl: 'App/Components/RequestManagement/WizardSteps/Universal/linkTickets/IMRequestCustomTicketModal.html',\r\n controller: IMRequestCustomTicketModalController,\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n linkedTicketsArray: () => $scope.linkedTickets\r\n }\r\n });\r\n };\r\n\r\n $scope.removeIMRequestTicketLink = function (providerString) {\r\n $scope.linkedTickets = $scope.linkedTickets.filter(ticket => ticket.TicketProvider !== providerString);\r\n\r\n if (providerString === 'Jira') $scope.jiraTicketLinked = false;\r\n else if (providerString === 'ServiceNow') $scope.serviceNowTicketLinked = false;\r\n else if (providerString === 'Zendesk') $scope.zendeskTicketLinked = false;\r\n else if (providerString === 'Custom') $scope.customTicketLinked = false;\r\n };\r\n\r\n\r\n $scope.buildRequest = async function (fromStep, toStep) {\r\n\r\n $scope.$broadcast('broadcast-im-wizardstepchange', { fromStep: fromStep, toStep: toStep });\r\n\r\n if (toStep == \"Select Applications\" && fromStep == \"Search Existing Users\") {\r\n $scope.selectApplicationsHelpText = 'The following is a list of applications available to this user. Select the application(s) you wish to terminate and enter the corresponding effective date (if applicable)';\r\n\r\n //Load data for an existing user\r\n if ($rootScope.IMSelectedExistingUser != null && $rootScope.IMSelectedExistingUser.HasERPDataLoaded === false) {\r\n $scope.resetUserValues();\r\n\r\n $scope.showRMLoadingIcon = true;\r\n $scope.vm.wizardClass = \"wizard-nav-container disabledDiv\";\r\n\r\n var promises = [];\r\n RequestManagementLoadDataService.loadUserMasterERPData($scope, $rootScope.IMSelectedExistingUser, $scope.vm.availableApplications).then(function () {\r\n\r\n vm.availableApplications.forEach(function (application) {\r\n if (application.selected) {\r\n\r\n if (application.Id == netsuite_application_id) {\r\n var nsUser = null;\r\n var subsidiaryId = null;\r\n\r\n if ($scope.vm.User.NetSuiteUser != null) {\r\n nsUser = $scope.vm.User.NetSuiteUser;\r\n subsidiaryId = $scope.vm.User.NetSuiteUser.Subsidiary.Id;\r\n }\r\n }\r\n\r\n //Reverse the selected so user must toggle on the tile instead of toggle it off\r\n application.selected = !application.selected;\r\n }\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n //Check if an application is selected and load ERP steps\r\n $scope.atLeastOneAppSelected();\r\n $scope.vm.availableApplications.forEach(application => $scope.loadERPSpecificSteps(application));\r\n $rootScope.IMSelectedExistingUser.HasERPDataLoaded = true;\r\n $scope.showRMLoadingIcon = false;\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n }, function errorCallback(response) {\r\n $scope.showRMLoadingIcon = false;\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n helperService.showErrorMessage(response);\r\n });\r\n }, function errorCallback(response) {\r\n $scope.showRMLoadingIcon = false;\r\n $scope.vm.wizardClass = \"wizard-nav-container\";\r\n helperService.showErrorMessage(response);\r\n }\r\n );\r\n\r\n\r\n }\r\n }\r\n vm.builtRequest = RequestManagementBuildRequestService.buildRequest(vm, false);\r\n\r\n if (toStep == \"Summary\") {\r\n\r\n $scope.loadingIcon = true;\r\n $scope.minimumExpirationDate = new Date();\r\n if (await helperService.getConfigurationValue('IM_DefaultExpirationEnabled') === '1') {\r\n calculateExpirationDate();\r\n }\r\n\r\n function checkSelected(product) {\r\n if (Array.isArray(product)) {\r\n Object.keys(product).forEach(key => {\r\n const currentObject = product[key];\r\n if ($scope.vm.availableApplications.find(app => app.ProductID === currentObject.ProductId)?.selected) {\r\n currentObject.Action = 'Delete';\r\n changeList.push(currentObject);\r\n }\r\n });\r\n } else {\r\n if ($scope.vm.availableApplications.find(app => app.ProductID === product.ProductId)?.selected) {\r\n product.Action = 'Delete';\r\n changeList.push(product);\r\n }\r\n }\r\n };\r\n\r\n var changeList = [];\r\n if ($scope.vm.User.NetSuiteUser != null) {\r\n checkSelected($scope.vm.User.NetSuiteUser);\r\n }\r\n if ($scope.vm.User.AadUser != null) {\r\n checkSelected($scope.vm.User.AadUser);\r\n }\r\n if ($scope.vm.User.AX7User != null) {\r\n checkSelected($scope.vm.User.AX7User);\r\n }\r\n if ($scope.vm.User.AX2012User != null) {\r\n checkSelected($scope.vm.User.AX2012User);\r\n }\r\n if ($scope.vm.User.UPUser != null) {\r\n checkSelected($scope.vm.User.UPUser);\r\n }\r\n if ($scope.vm.User.SAPUser != null) {\r\n checkSelected($scope.vm.User.SAPUser);\r\n }\r\n if ($scope.vm.User.OracleUser != null) {\r\n checkSelected($scope.vm.User.OracleUser);\r\n }\r\n if ($scope.vm.User.OracleCloudUser != null) {\r\n checkSelected($scope.vm.User.OracleCloudUser);\r\n }\r\n if ($scope.vm.User.GPUser != null) {\r\n checkSelected($scope.vm.User.GPUser);\r\n }\r\n if ($scope.vm.User.NAVUser != null) {\r\n checkSelected($scope.vm.User.NAVUser);\r\n }\r\n if ($scope.vm.User.D365SUser != null) {\r\n checkSelected($scope.vm.User.D365SUser);\r\n }\r\n if ($scope.vm.User.PSUser != null) {\r\n checkSelected($scope.vm.User.PSUser);\r\n }\r\n\r\n if ($scope.vm.User.SalesforceUser != null) {\r\n checkSelected($scope.vm.User.SalesforceUser);\r\n }\r\n\r\n vm.UserChanges = changeList;\r\n\r\n let terminatedProducts = vm.UserChanges.map(uc => uc.ProductId);\r\n\r\n let { data: userRoles } = await userRolesDataService.getRolesByUserMasterId($scope.vm.User.UserMaster.Id || $scope.vm.User.UserMaster.ID);\r\n userRoles = userRoles.filter(ur => terminatedProducts.filter(p => p == ur.ProductID).length);\r\n $scope.vm.currentAccess = userRoles.reduce((accessAccumulator, currentRole) => {\r\n const role = {\r\n Product: $scope.getProductName(currentRole.ProductID),\r\n AccessType: currentRole.TypeID,\r\n Access: currentRole.Name\r\n };\r\n if (currentRole.Companies.length) {\r\n $scope.vm.hasCompany = true;\r\n let roleCompanies = [];\r\n currentRole.Companies.forEach(company => {\r\n roleCompanies.push({ ...role, Company: company.Name });\r\n })\r\n return accessAccumulator.concat(roleCompanies);\r\n }\r\n else {\r\n accessAccumulator.push(role);\r\n return accessAccumulator;\r\n }\r\n }, []);\r\n\r\n $scope.loadingIcon = false;\r\n }\r\n\r\n };\r\n\r\n $http.get(apiUrl + 'api/identitymanager/applications').then(function (response) {\r\n\r\n response.data.forEach(function (row, i) {\r\n row.selected = false;\r\n });\r\n\r\n $scope.vm.availableApplications = response.data;\r\n\r\n $scope.atLeastOneAppSelected();\r\n\r\n //If the user is modifying an open request load the data after the available applications have populated\r\n if ($rootScope.requestToEdit) {\r\n $scope.LoadOpenRequestData($scope);\r\n }\r\n });\r\n\r\n //-------------------------------\r\n $scope.LoadOpenRequestData = function () {\r\n if ($rootScope.requestToEdit) {\r\n $scope.requestToEdit = $rootScope.requestToEdit;\r\n\r\n vm.requestToEdit = $scope.requestToEdit;\r\n\r\n delete $rootScope.requestToEdit;\r\n $scope.reportDetailsComplete = false;\r\n\r\n //Get Request data based on request Id and version from the database\r\n $http.get(apiUrl + 'api/identitymanager/requests/edit/' + $scope.requestToEdit.Id + '/version/' + $scope.requestToEdit.Version).then(function (response) {\r\n\r\n var requestData = response.data;\r\n\r\n $scope.linkedTickets = response.data.Tickets;\r\n\r\n $scope.jiraTicketLinked = $scope.linkedTickets.some(ticket => ticket.TicketProvider === 'Jira');\r\n $scope.zendeskTicketLinked = $scope.linkedTickets.some(ticket => ticket.TicketProvider === 'Zendesk');\r\n $scope.customTicketLinked = $scope.linkedTickets.some(ticket => ticket.TicketProvider === 'Custom');\r\n\r\n $http.get(apiUrl + 'api/identitymanager/applications').then(function (response) {\r\n\r\n var applications = response.data;\r\n\r\n applications.forEach(function (row, i) {\r\n row.selected = false;\r\n });\r\n\r\n //Hide any applications that the user doesn't have access to\r\n var nsApp = applications.find(function (app) {\r\n return app.Id == netsuite_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, netsuite_application_id) && nsApp != null) {\r\n nsApp.Visible = false;\r\n }\r\n\r\n //SAP application setup\r\n var sapApp = applications.find(function (app) {\r\n return app.Id == sap_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, sap_application_id) && sapApp != null) {\r\n sapApp.Visible = false;\r\n }\r\n\r\n //AAD application setup\r\n var aadApp = applications.find(function (app) {\r\n return app.Id == aad_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, aad_application_id) && aadApp != null) {\r\n aadApp.Visible = false;\r\n }\r\n\r\n //AX application setup\r\n var axApp = applications.find(function (app) {\r\n return app.Id == ax_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, ax_application_id) && axApp != null) {\r\n axApp.Visible = false;\r\n }\r\n\r\n //EBS application setup\r\n var oracleApp = applications.find(function (app) {\r\n return app.Id == oracle_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, oracle_application_id) && oracleApp != null) {\r\n oracleApp.Visible = false;\r\n }\r\n\r\n //Oracle Cloud application setup\r\n var oracleCloudApp = applications.find(function (app) {\r\n return app.Id == oracleCloud_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, oracleCloud_application_id) && oracleCloudApp != null) {\r\n oracleCloudApp.Visible = false;\r\n }\r\n\r\n //GP application setup\r\n var gpApp = applications.find(function (app) {\r\n return app.Id == gp_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, gp_application_id) && gpApp != null) {\r\n gpApp.Visible = false;\r\n }\r\n\r\n //NAV application setup\r\n var navApp = applications.find(function (app) {\r\n return app.Id == nav_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, nav_application_id) && navApp != null) {\r\n navApp.Visible = false;\r\n }\r\n\r\n //D365S application setup\r\n var d365sApp = applications.find(function (app) {\r\n return app.Id == d365s_application_id;\r\n });\r\n if (!userHasApplication(requestData.Applications, d365s_application_id) && d365sApp != null) {\r\n d365sApp.Visible = false;\r\n }\r\n\r\n //PS application setup\r\n var psApp = applications.find(function (app) {\r\n return app.Id == ps_application_id;\r\n });\r\n\r\n if (!userHasApplication(requestData.Applications, ps_application_id) && psApp != null) {\r\n psApp.Visible = false;\r\n }\r\n\r\n var salesforceApp = applications.find(app => app.Id == salesforce_application_id);\r\n\r\n if (!userHasApplication(requestData.Applications, salesforce_application_id) && salesforceApp != null) {\r\n salesforceApp.Visible = false;\r\n }\r\n\r\n $scope.vm.availableApplications = applications;\r\n\r\n\r\n //Load End date and selected values for open request\r\n var user = {};\r\n $scope.vm.User = {};\r\n\r\n $scope.vm.User.UserMaster = requestData.GeneralUser;\r\n\r\n //NetSuite application setup\r\n var nsApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == netsuite_application_id;\r\n });\r\n if (requestData.NetSuiteUser != null) {\r\n $scope.vm.User.NetSuiteUser = requestData.NetSuiteUser;\r\n nsApp.selected = true;\r\n nsApp.StartDate = new Date(requestData.NetSuiteUser.StartDate);\r\n }\r\n\r\n //Universal application setup\r\n var uvApps = $scope.vm.availableApplications.filter(function (app) {\r\n return app.Id == universalProduct_application_id;\r\n });\r\n if (requestData.UvUser != null) {\r\n $scope.vm.User.UPUser.forEach((user, i) => {\r\n user = requestData.UvUser[i];\r\n uvApps.find(app => app.ProductId === user.ProductID)[selected = true][StartDate = new Date(requestData.UvUser[i].StartDate)];\r\n });\r\n }\r\n\r\n //SAP application setup\r\n var sapApps = $scope.vm.availableApplications.filter(app => app.Id == sap_application_id);\r\n\r\n if (requestData.SapUser != null) {\r\n $scope.vm.User.SAPUser = $scope.vm.User.SAPUser || {};\r\n\r\n sapApps.forEach(sapApp => {\r\n let selectedApp = requestData.SapUser.find(userApp => userApp.ProductId === sapApp.ProductID);\r\n\r\n if (selectedApp) {\r\n sapApp.selected = true;\r\n sapApp.Visible = true;\r\n } else {\r\n sapApp.Visible = false;\r\n }\r\n\r\n sapApp.ProductId = sapApp.ProductID;\r\n $scope.vm.User.SAPUser[sapApp.ProductName] = Object.merge(sapApp, selectedApp);\r\n });\r\n }\r\n\r\n //AAD application setup\r\n var aadApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == aad_application_id;\r\n });\r\n if (requestData.AadUser != null) {\r\n $scope.vm.User.AadUser = requestData.AadUser;\r\n aadApp.selected = true;\r\n aadApp.StartDate = new Date(requestData.AadUser.StartDate);\r\n }\r\n\r\n //AX7 application setup\r\n var ax7App = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == ax7_application_id;\r\n });\r\n if (requestData.Ax7User != null) {\r\n $scope.vm.User.AX7User = requestData.Ax7User;\r\n ax7App.selected = true;\r\n ax7App.StartDate = new Date(requestData.Ax7User.StartDate);\r\n }\r\n\r\n //AX2012 application setup\r\n var ax2012App = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == ax_application_id;\r\n });\r\n if (requestData.AxUser != null) {\r\n $scope.vm.User.AX2012User = requestData.AxUser;\r\n\r\n ax2012App.selected = true;\r\n ax2012App.StartDate = new Date(requestData.AxUser.StartDate);\r\n }\r\n\r\n //EBS application setup\r\n var oracleApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == oracle_application_id;\r\n });\r\n if (requestData.EbsUser != null) {\r\n $scope.vm.User.OracleUser = requestData.EbsUser;\r\n oracleApp.selected = true;\r\n oracleApp.StartDate = new Date(requestData.EbsUser.StartDate);\r\n }\r\n\r\n //Oracle Cloud application setup\r\n var oracleCloudApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == oracleCloud_application_id;\r\n });\r\n if (requestData.OrfcUser != null) {\r\n $scope.vm.User.OracleCloudUser = requestData.OrfcUser;\r\n oracleApp.selected = true;\r\n oracleCloudApp.StartDate = new Date(requestData.OrfcUser.StartDate);\r\n }\r\n\r\n //GP application setup\r\n var gpApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == gp_application_id;\r\n });\r\n if (requestData.GPUser != null) {\r\n $scope.vm.User.GPUser = requestData.GPUser;\r\n\r\n gpApp.selected = true;\r\n gpApp.StartDate = new Date(requestData.GPUser.StartDate);\r\n }\r\n\r\n //NAV application setup\r\n var navApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == nav_application_id;\r\n });\r\n if (requestData.NavUser != null) {\r\n $scope.vm.User.NAVUser = requestData.NavUser;\r\n navApp.selected = true;\r\n navApp.StartDate = new Date(requestData.NavUser.StartDate);\r\n }\r\n\r\n //D365S application setup\r\n var d365sApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == d365s_application_id;\r\n });\r\n if (requestData.D365SUser != null) {\r\n $scope.vm.User.D365SUser = requestData.D365SUser;\r\n d365sApp.selected = true;\r\n d365sApp.StartDate = new Date(requestData.D365SUser.StartDate);\r\n }\r\n\r\n //PS application setup\r\n var psApp = $scope.vm.availableApplications.find(function (app) {\r\n return app.Id == ps_application_id;\r\n });\r\n if (requestData.PsUserRequest != null) {\r\n $scope.vm.User.PSUser = requestData.PsUserRequest;\r\n psApp.selected = true;\r\n psApp.StartDate = new Date(requestData.PsUserRequest.StartDate);\r\n }\r\n\r\n var salesforceApp = $scope.vm.availableApplications.find(app => app.Id == salesforce_application_id);\r\n\r\n if (requestData.SfUserRequest != null) {\r\n $scope.vm.User.SalesforceUser = requestData.SfUserRequest;\r\n salesforceApp.selected = true;\r\n salesforceApp.StartDate = new Date(requestData.SfUserRequest.StartDate);\r\n }\r\n\r\n $scope.atLeastOneAppSelected();\r\n $scope.reportDetailsComplete = true;\r\n $scope.stopRequestManagementSpinner = true;\r\n vm.validAppsSelected = true;\r\n });\r\n\r\n }, function (response) {\r\n $scope.reportDetailsComplete = true;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n };\r\n\r\n $scope.createNewRequest = function (request) {\r\n $scope.updatePending = new createSpinner();\r\n\r\n $http.post(apiUrl + 'api/identitymanager/requests', request).then(async function (response) {\r\n\r\n if (vm.attachments.flow.files.length > 0) {\r\n const requestId = response.data;\r\n $scope.uploadFiles(vm.attachments.flow.files, requestId);\r\n }\r\n helperService.showConfirmationMessage(\"Success\", \"Your request has been submitted for approval.\");\r\n $location.path('/IdentityManager/Place/RequestManagement').search({});\r\n },\r\n function errorCallback(response) {\r\n $scope.updatePending.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.updateExistingRequest = function (request) {\r\n $scope.updatePending = new createSpinner();\r\n\r\n $http.put(apiUrl + 'api/identitymanager/requests/' + $scope.requestToEdit.Id + '/version/' + $scope.requestToEdit.Version, request).then(function (response) {\r\n\r\n if (vm.attachments.flow.files.length > 0) {\r\n $scope.uploadFiles(vm.attachments.flow.files, $scope.requestToEdit.Id);\r\n }\r\n\r\n helperService.showConfirmationMessage(\"Success\", \"Your request has been updated.\");\r\n $location.path('/IdentityManager/Place/RequestManagement').search({});\r\n }, function errorCallback(response) {\r\n $scope.updatePending.loadingValue = false;\r\n helperService.showErrorMessage(response.data);\r\n });\r\n };\r\n\r\n $scope.finishedWizard = function () {\r\n\r\n $scope.updatePending = new createSpinner();\r\n vm.builtRequest = RequestManagementBuildRequestService.buildRequest(vm, true);\r\n vm.builtRequest.Tickets = $scope.linkedTickets;\r\n vm.builtRequest.ExpirationDate = $scope.vm.ExpirationDate ? new Date($scope.vm.ExpirationDate).toUTCString() : null;\r\n\r\n //Update request if there is currently an open request\r\n if ($scope.requestToEdit) {\r\n $scope.updateExistingRequest(vm.builtRequest);\r\n } else {\r\n $scope.createNewRequest(vm.builtRequest);\r\n }\r\n };\r\n\r\n var userHasApplication = function (applications, appId) {\r\n var hasApp = false;\r\n\r\n var app = applications.find(function (app) {\r\n return app.Value === appId || app._value === appId;\r\n });\r\n if (app != null) {\r\n hasApp = true;\r\n }\r\n\r\n return hasApp;\r\n };\r\n}","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModalInstance, partitionKey, axVersion, helperService, existingUserSearchService) {\r\n\r\n const vm = this;\r\n\r\n vm.title = 'Person Search';\r\n vm.filterUsersToggle = true;\r\n vm.selectedPerson = null;\r\n\r\n vm.doneSearchingPerson = doneSearchingPerson;\r\n vm.changePersonRowSelected = changePersonRowSelected;\r\n vm.selectPerson = selectPerson;\r\n vm.filterPerson = filterPerson;\r\n vm.cancel = cancel;\r\n\r\n vm.ax7PersonGridColumns = [\r\n { field: \"PersonName\", title: \"Name\", filterable: false },\r\n { field: \"PersonNameAlias\", title: \"Alias\", filterable: false },\r\n { field: \"PartyNumber\", title: \"Party Number\", filterable: false },\r\n { field: \"PersonPrimaryEmail\", title: \"Email\", filterable: false }\r\n ];\r\n\r\n function doneSearchingPerson() {\r\n if (vm.ax7PersonSearchString === '' || vm.ax7PersonSearchString === null) {\r\n\r\n var raw = vm.ax7PersonGridDataSource.data();\r\n var length = raw.length;\r\n\r\n let item, i;\r\n for (i = length - 1; i >= 0; i--) {\r\n\r\n item = raw[i];\r\n vm.ax7PersonGridDataSource.remove(item);\r\n\r\n }\r\n } else {\r\n vm.ax7PersonGridDataSource.read();\r\n }\r\n }\r\n\r\n vm.ax7PersonGridOptions = helperService.setMainGridOptions(vm.ax7PersonGridColumns, 350);\r\n vm.ax7PersonGridOptions.autoBind = false;\r\n\r\n vm.ax7PersonGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n let response;\r\n try {\r\n if (axVersion) {\r\n response = await existingUserSearchService.getFilteredAX2012Person(vm.ax7PersonSearchString, partitionKey);\r\n } else {\r\n response = await existingUserSearchService.getFilteredAX7Person(vm.ax7PersonSearchString);\r\n }\r\n\r\n response.data = $filter('orderBy')(response.data, 'PersonName');\r\n options.success(response.data);\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n function changePersonRowSelected(kendoEvent) {\r\n let grid = kendoEvent.sender;\r\n vm.selectedPerson = grid.dataItem(grid.select());\r\n }\r\n\r\n function selectPerson() {\r\n if (vm.selectedPerson) {\r\n vm.personObject = { ...vm.selectedPerson };\r\n }\r\n vm.ax7PersonSearchString = null;\r\n $uibModalInstance.close(vm.personObject);\r\n }\r\n\r\n function filterPerson() {\r\n if (vm.ax7PersonGridDataSource._data.length > 0) {\r\n vm.ax7PersonGridDataSource.read();\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n\r\n}","import AX7PersonSearchController from \"./AX7PersonSearch.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.onClick = onClick;\r\n\r\n async function onClick() {\r\n\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/AX7Person/ax7PersonSearch.html',\r\n controller: AX7PersonSearchController,\r\n controllerAs: 'axpsvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n partitionKey: () => vm.axPartitionKey,\r\n axVersion: () => vm.axVersion\r\n }\r\n\r\n });\r\n\r\n try {\r\n let personObject = await modal.result;\r\n vm.onUpdatePersonName({ personObject });\r\n }\r\n\r\n catch (_) { return; }\r\n }\r\n\r\n}","import AX7PersonController from \"./AX7Person.controller\";\r\n\r\n/* ax7Person.component.js */\r\n\r\n/**\r\n * @desc component for displaying AX7 Person search and input fields\r\n * @example \r\n */\r\n\r\nconst ax7PersonSearchLink = {\r\n bindings: {\r\n onUpdatePersonName: '&',\r\n axPartitionKey: '<',\r\n axVersion: '<'\r\n },\r\n controller: AX7PersonController,\r\n controllerAs: 'axpvm',\r\n templateUrl: '/App/Components/RequestManagement/AX7Person/ax7Person.tmpl.html'\r\n};\r\n\r\nexport default ax7PersonSearchLink;","export default /*@ngInject*/ function ($scope) {\r\n\r\n if (!$scope.vm.ListOfStoredUPRoles) $scope.vm.ListOfStoredUPRoles = [];\r\n\r\n var RoleCompany = function (params) {\r\n this.RoleId = params.RoleId;\r\n this.CompanyId = params.CompanyId;\r\n this.RoleName = params.RoleName;\r\n this.CompanyName = params.CompanyName;\r\n this.AllCompanies = params.AllCompanies;\r\n };\r\n\r\n $scope.AllCompanies = false;\r\n $scope.validateNumberOfUPRoles = validateNumberOfUPRoles;\r\n\r\n function validateNumberOfUPRoles(productName) {\r\n if (!$scope.vm.numberOfUPRolesValid) {\r\n $scope.vm.numberOfUPRolesValid = [];\r\n }\r\n $scope.vm.numberOfUPRolesValid[productName] = null;\r\n if ($scope.vm.ListOfSelectedUPRoles[productName].length > 0) {\r\n $scope.vm.numberOfUPRolesValid[productName] = true;\r\n }\r\n }\r\n\r\n $scope.addRoleToList = function (role, productName) {\r\n $scope.vm.ListOfAvailableUPRoles[productName].forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableUPRoles[productName].splice(i, 1);\r\n $scope.vm.ListOfSelectedUPRoles[productName].push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfUPRoles(productName)\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role, productName) {\r\n $scope.vm.ListOfSelectedUPRoles[productName].forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedUPRoles[productName].splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailableUPRoles[productName].push(row);\r\n }\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n validateNumberOfUPRoles(productName);\r\n };\r\n\r\n $scope.updateSelectedRoleCompanies = function (productName, selectedRole, prop, value) {\r\n selectedRole[prop] = value;\r\n if (selectedRole[prop].length === $scope.vm.ListOfUPCompanies[productName].length) {\r\n selectedRole[prop] = null;\r\n }\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","export default /*@ngInject*/ function ($scope) {\r\n return;\r\n}\r\n","const countryCodes = [\r\n {\r\n \"Code\": \"AF\",\r\n \"Name\": \"Afghanistan\"\r\n },\r\n {\r\n \"Code\": \"AX\",\r\n \"Name\": \"\\u00c5land Islands\"\r\n },\r\n {\r\n \"Code\": \"AL\",\r\n \"Name\": \"Albania\"\r\n },\r\n {\r\n \"Code\": \"DZ\",\r\n \"Name\": \"Algeria\"\r\n },\r\n {\r\n \"Code\": \"AS\",\r\n \"Name\": \"American Samoa\"\r\n },\r\n {\r\n \"Code\": \"AD\",\r\n \"Name\": \"Andorra\"\r\n },\r\n {\r\n \"Code\": \"AO\",\r\n \"Name\": \"Angola\"\r\n },\r\n {\r\n \"Code\": \"AI\",\r\n \"Name\": \"Anguilla\"\r\n },\r\n {\r\n \"Code\": \"AQ\",\r\n \"Name\": \"Antarctica\"\r\n },\r\n {\r\n \"Code\": \"AG\",\r\n \"Name\": \"Antigua and Barbuda\"\r\n },\r\n {\r\n \"Code\": \"AR\",\r\n \"Name\": \"Argentina\"\r\n },\r\n {\r\n \"Code\": \"AM\",\r\n \"Name\": \"Armenia\"\r\n },\r\n {\r\n \"Code\": \"AW\",\r\n \"Name\": \"Aruba\"\r\n },\r\n {\r\n \"Code\": \"AU\",\r\n \"Name\": \"Australia\"\r\n },\r\n {\r\n \"Code\": \"AT\",\r\n \"Name\": \"Austria\"\r\n },\r\n {\r\n \"Code\": \"AZ\",\r\n \"Name\": \"Azerbaijan\"\r\n },\r\n {\r\n \"Code\": \"BS\",\r\n \"Name\": \"Bahamas\"\r\n },\r\n {\r\n \"Code\": \"BH\",\r\n \"Name\": \"Bahrain\"\r\n },\r\n {\r\n \"Code\": \"BD\",\r\n \"Name\": \"Bangladesh\"\r\n },\r\n {\r\n \"Code\": \"BB\",\r\n \"Name\": \"Barbados\"\r\n },\r\n {\r\n \"Code\": \"BY\",\r\n \"Name\": \"Belarus\"\r\n },\r\n {\r\n \"Code\": \"BE\",\r\n \"Name\": \"Belgium\"\r\n },\r\n {\r\n \"Code\": \"BZ\",\r\n \"Name\": \"Belize\"\r\n },\r\n {\r\n \"Code\": \"BJ\",\r\n \"Name\": \"Benin\"\r\n },\r\n {\r\n \"Code\": \"BM\",\r\n \"Name\": \"Bermuda\"\r\n },\r\n {\r\n \"Code\": \"BT\",\r\n \"Name\": \"Bhutan\"\r\n },\r\n {\r\n \"Code\": \"BO\",\r\n \"Name\": \"Bolivia, Plurinational State of\"\r\n },\r\n {\r\n \"Code\": \"BQ\",\r\n \"Name\": \"Bonaire, Sint Eustatius and Saba\"\r\n },\r\n {\r\n \"Code\": \"BA\",\r\n \"Name\": \"Bosnia and Herzegovina\"\r\n },\r\n {\r\n \"Code\": \"BW\",\r\n \"Name\": \"Botswana\"\r\n },\r\n {\r\n \"Code\": \"BV\",\r\n \"Name\": \"Bouvet Island\"\r\n },\r\n {\r\n \"Code\": \"BR\",\r\n \"Name\": \"Brazil\"\r\n },\r\n {\r\n \"Code\": \"IO\",\r\n \"Name\": \"British Indian Ocean Territory\"\r\n },\r\n {\r\n \"Code\": \"BN\",\r\n \"Name\": \"Brunei Darussalam\"\r\n },\r\n {\r\n \"Code\": \"BG\",\r\n \"Name\": \"Bulgaria\"\r\n },\r\n {\r\n \"Code\": \"BF\",\r\n \"Name\": \"Burkina Faso\"\r\n },\r\n {\r\n \"Code\": \"BI\",\r\n \"Name\": \"Burundi\"\r\n },\r\n {\r\n \"Code\": \"KH\",\r\n \"Name\": \"Cambodia\"\r\n },\r\n {\r\n \"Code\": \"CM\",\r\n \"Name\": \"Cameroon\"\r\n },\r\n {\r\n \"Code\": \"CA\",\r\n \"Name\": \"Canada\"\r\n },\r\n {\r\n \"Code\": \"CV\",\r\n \"Name\": \"Cape Verde\"\r\n },\r\n {\r\n \"Code\": \"KY\",\r\n \"Name\": \"Cayman Islands\"\r\n },\r\n {\r\n \"Code\": \"CF\",\r\n \"Name\": \"Central African Republic\"\r\n },\r\n {\r\n \"Code\": \"TD\",\r\n \"Name\": \"Chad\"\r\n },\r\n {\r\n \"Code\": \"CL\",\r\n \"Name\": \"Chile\"\r\n },\r\n {\r\n \"Code\": \"CN\",\r\n \"Name\": \"China\"\r\n },\r\n {\r\n \"Code\": \"CX\",\r\n \"Name\": \"Christmas Island\"\r\n },\r\n {\r\n \"Code\": \"CC\",\r\n \"Name\": \"Cocos (Keeling) Islands\"\r\n },\r\n {\r\n \"Code\": \"CO\",\r\n \"Name\": \"Colombia\"\r\n },\r\n {\r\n \"Code\": \"KM\",\r\n \"Name\": \"Comoros\"\r\n },\r\n {\r\n \"Code\": \"CG\",\r\n \"Name\": \"Congo\"\r\n },\r\n {\r\n \"Code\": \"CD\",\r\n \"Name\": \"Congo, the Democratic Republic of the\"\r\n },\r\n {\r\n \"Code\": \"CK\",\r\n \"Name\": \"Cook Islands\"\r\n },\r\n {\r\n \"Code\": \"CR\",\r\n \"Name\": \"Costa Rica\"\r\n },\r\n {\r\n \"Code\": \"CI\",\r\n \"Name\": \"C\\u00f4te d'Ivoire\"\r\n },\r\n {\r\n \"Code\": \"HR\",\r\n \"Name\": \"Croatia\"\r\n },\r\n {\r\n \"Code\": \"CU\",\r\n \"Name\": \"Cuba\"\r\n },\r\n {\r\n \"Code\": \"CW\",\r\n \"Name\": \"Cura\\u00e7ao\"\r\n },\r\n {\r\n \"Code\": \"CY\",\r\n \"Name\": \"Cyprus\"\r\n },\r\n {\r\n \"Code\": \"CZ\",\r\n \"Name\": \"Czech Republic\"\r\n },\r\n {\r\n \"Code\": \"DK\",\r\n \"Name\": \"Denmark\"\r\n },\r\n {\r\n \"Code\": \"DJ\",\r\n \"Name\": \"Djibouti\"\r\n },\r\n {\r\n \"Code\": \"DM\",\r\n \"Name\": \"Dominica\"\r\n },\r\n {\r\n \"Code\": \"DO\",\r\n \"Name\": \"Dominican Republic\"\r\n },\r\n {\r\n \"Code\": \"EC\",\r\n \"Name\": \"Ecuador\"\r\n },\r\n {\r\n \"Code\": \"EG\",\r\n \"Name\": \"Egypt\"\r\n },\r\n {\r\n \"Code\": \"SV\",\r\n \"Name\": \"El Salvador\"\r\n },\r\n {\r\n \"Code\": \"GQ\",\r\n \"Name\": \"Equatorial Guinea\"\r\n },\r\n {\r\n \"Code\": \"ER\",\r\n \"Name\": \"Eritrea\"\r\n },\r\n {\r\n \"Code\": \"EE\",\r\n \"Name\": \"Estonia\"\r\n },\r\n {\r\n \"Code\": \"ET\",\r\n \"Name\": \"Ethiopia\"\r\n },\r\n {\r\n \"Code\": \"FK\",\r\n \"Name\": \"Falkland Islands (Malvinas)\"\r\n },\r\n {\r\n \"Code\": \"FO\",\r\n \"Name\": \"Faroe Islands\"\r\n },\r\n {\r\n \"Code\": \"FJ\",\r\n \"Name\": \"Fiji\"\r\n },\r\n {\r\n \"Code\": \"FI\",\r\n \"Name\": \"Finland\"\r\n },\r\n {\r\n \"Code\": \"FR\",\r\n \"Name\": \"France\"\r\n },\r\n {\r\n \"Code\": \"GF\",\r\n \"Name\": \"French Guiana\"\r\n },\r\n {\r\n \"Code\": \"PF\",\r\n \"Name\": \"French Polynesia\"\r\n },\r\n {\r\n \"Code\": \"TF\",\r\n \"Name\": \"French Southern Territories\"\r\n },\r\n {\r\n \"Code\": \"GA\",\r\n \"Name\": \"Gabon\"\r\n },\r\n {\r\n \"Code\": \"GM\",\r\n \"Name\": \"Gambia\"\r\n },\r\n {\r\n \"Code\": \"GE\",\r\n \"Name\": \"Georgia\"\r\n },\r\n {\r\n \"Code\": \"DE\",\r\n \"Name\": \"Germany\"\r\n },\r\n {\r\n \"Code\": \"GH\",\r\n \"Name\": \"Ghana\"\r\n },\r\n {\r\n \"Code\": \"GI\",\r\n \"Name\": \"Gibraltar\"\r\n },\r\n {\r\n \"Code\": \"GR\",\r\n \"Name\": \"Greece\"\r\n },\r\n {\r\n \"Code\": \"GL\",\r\n \"Name\": \"Greenland\"\r\n },\r\n {\r\n \"Code\": \"GD\",\r\n \"Name\": \"Grenada\"\r\n },\r\n {\r\n \"Code\": \"GP\",\r\n \"Name\": \"Guadeloupe\"\r\n },\r\n {\r\n \"Code\": \"GU\",\r\n \"Name\": \"Guam\"\r\n },\r\n {\r\n \"Code\": \"GT\",\r\n \"Name\": \"Guatemala\"\r\n },\r\n {\r\n \"Code\": \"GG\",\r\n \"Name\": \"Guernsey\"\r\n },\r\n {\r\n \"Code\": \"GN\",\r\n \"Name\": \"Guinea\"\r\n },\r\n {\r\n \"Code\": \"GW\",\r\n \"Name\": \"Guinea-Bissau\"\r\n },\r\n {\r\n \"Code\": \"GY\",\r\n \"Name\": \"Guyana\"\r\n },\r\n {\r\n \"Code\": \"HT\",\r\n \"Name\": \"Haiti\"\r\n },\r\n {\r\n \"Code\": \"HM\",\r\n \"Name\": \"Heard Island and McDonald Islands\"\r\n },\r\n {\r\n \"Code\": \"VA\",\r\n \"Name\": \"Holy See (Vatican City State)\"\r\n },\r\n {\r\n \"Code\": \"HN\",\r\n \"Name\": \"Honduras\"\r\n },\r\n {\r\n \"Code\": \"HK\",\r\n \"Name\": \"Hong Kong\"\r\n },\r\n {\r\n \"Code\": \"HU\",\r\n \"Name\": \"Hungary\"\r\n },\r\n {\r\n \"Code\": \"IS\",\r\n \"Name\": \"Iceland\"\r\n },\r\n {\r\n \"Code\": \"IN\",\r\n \"Name\": \"India\"\r\n },\r\n {\r\n \"Code\": \"ID\",\r\n \"Name\": \"Indonesia\"\r\n },\r\n {\r\n \"Code\": \"IR\",\r\n \"Name\": \"Iran, Islamic Republic of\"\r\n },\r\n {\r\n \"Code\": \"IQ\",\r\n \"Name\": \"Iraq\"\r\n },\r\n {\r\n \"Code\": \"IE\",\r\n \"Name\": \"Ireland\"\r\n },\r\n {\r\n \"Code\": \"IM\",\r\n \"Name\": \"Isle of Man\"\r\n },\r\n {\r\n \"Code\": \"IL\",\r\n \"Name\": \"Israel\"\r\n },\r\n {\r\n \"Code\": \"IT\",\r\n \"Name\": \"Italy\"\r\n },\r\n {\r\n \"Code\": \"JM\",\r\n \"Name\": \"Jamaica\"\r\n },\r\n {\r\n \"Code\": \"JP\",\r\n \"Name\": \"Japan\"\r\n },\r\n {\r\n \"Code\": \"JE\",\r\n \"Name\": \"Jersey\"\r\n },\r\n {\r\n \"Code\": \"JO\",\r\n \"Name\": \"Jordan\"\r\n },\r\n {\r\n \"Code\": \"KZ\",\r\n \"Name\": \"Kazakhstan\"\r\n },\r\n {\r\n \"Code\": \"KE\",\r\n \"Name\": \"Kenya\"\r\n },\r\n {\r\n \"Code\": \"KI\",\r\n \"Name\": \"Kiribati\"\r\n },\r\n {\r\n \"Code\": \"KP\",\r\n \"Name\": \"Korea, Democratic People's Republic of\"\r\n },\r\n {\r\n \"Code\": \"KR\",\r\n \"Name\": \"Korea, Republic of\"\r\n },\r\n {\r\n \"Code\": \"KW\",\r\n \"Name\": \"Kuwait\"\r\n },\r\n {\r\n \"Code\": \"KG\",\r\n \"Name\": \"Kyrgyzstan\"\r\n },\r\n {\r\n \"Code\": \"LA\",\r\n \"Name\": \"Lao People's Democratic Republic\"\r\n },\r\n {\r\n \"Code\": \"LV\",\r\n \"Name\": \"Latvia\"\r\n },\r\n {\r\n \"Code\": \"LB\",\r\n \"Name\": \"Lebanon\"\r\n },\r\n {\r\n \"Code\": \"LS\",\r\n \"Name\": \"Lesotho\"\r\n },\r\n {\r\n \"Code\": \"LR\",\r\n \"Name\": \"Liberia\"\r\n },\r\n {\r\n \"Code\": \"LY\",\r\n \"Name\": \"Libya\"\r\n },\r\n {\r\n \"Code\": \"LI\",\r\n \"Name\": \"Liechtenstein\"\r\n },\r\n {\r\n \"Code\": \"LT\",\r\n \"Name\": \"Lithuania\"\r\n },\r\n {\r\n \"Code\": \"LU\",\r\n \"Name\": \"Luxembourg\"\r\n },\r\n {\r\n \"Code\": \"MO\",\r\n \"Name\": \"Macao\"\r\n },\r\n {\r\n \"Code\": \"MK\",\r\n \"Name\": \"Macedonia, the Former Yugoslav Republic of\"\r\n },\r\n {\r\n \"Code\": \"MG\",\r\n \"Name\": \"Madagascar\"\r\n },\r\n {\r\n \"Code\": \"MW\",\r\n \"Name\": \"Malawi\"\r\n },\r\n {\r\n \"Code\": \"MY\",\r\n \"Name\": \"Malaysia\"\r\n },\r\n {\r\n \"Code\": \"MV\",\r\n \"Name\": \"Maldives\"\r\n },\r\n {\r\n \"Code\": \"ML\",\r\n \"Name\": \"Mali\"\r\n },\r\n {\r\n \"Code\": \"MT\",\r\n \"Name\": \"Malta\"\r\n },\r\n {\r\n \"Code\": \"MH\",\r\n \"Name\": \"Marshall Islands\"\r\n },\r\n {\r\n \"Code\": \"MQ\",\r\n \"Name\": \"Martinique\"\r\n },\r\n {\r\n \"Code\": \"MR\",\r\n \"Name\": \"Mauritania\"\r\n },\r\n {\r\n \"Code\": \"MU\",\r\n \"Name\": \"Mauritius\"\r\n },\r\n {\r\n \"Code\": \"YT\",\r\n \"Name\": \"Mayotte\"\r\n },\r\n {\r\n \"Code\": \"MX\",\r\n \"Name\": \"Mexico\"\r\n },\r\n {\r\n \"Code\": \"FM\",\r\n \"Name\": \"Micronesia, Federated States of\"\r\n },\r\n {\r\n \"Code\": \"MD\",\r\n \"Name\": \"Moldova, Republic of\"\r\n },\r\n {\r\n \"Code\": \"MC\",\r\n \"Name\": \"Monaco\"\r\n },\r\n {\r\n \"Code\": \"MN\",\r\n \"Name\": \"Mongolia\"\r\n },\r\n {\r\n \"Code\": \"ME\",\r\n \"Name\": \"Montenegro\"\r\n },\r\n {\r\n \"Code\": \"MS\",\r\n \"Name\": \"Montserrat\"\r\n },\r\n {\r\n \"Code\": \"MA\",\r\n \"Name\": \"Morocco\"\r\n },\r\n {\r\n \"Code\": \"MZ\",\r\n \"Name\": \"Mozambique\"\r\n },\r\n {\r\n \"Code\": \"MM\",\r\n \"Name\": \"Myanmar\"\r\n },\r\n {\r\n \"Code\": \"NA\",\r\n \"Name\": \"Namibia\"\r\n },\r\n {\r\n \"Code\": \"NR\",\r\n \"Name\": \"Nauru\"\r\n },\r\n {\r\n \"Code\": \"NP\",\r\n \"Name\": \"Nepal\"\r\n },\r\n {\r\n \"Code\": \"NL\",\r\n \"Name\": \"Netherlands\"\r\n },\r\n {\r\n \"Code\": \"NC\",\r\n \"Name\": \"New Caledonia\"\r\n },\r\n {\r\n \"Code\": \"NZ\",\r\n \"Name\": \"New Zealand\"\r\n },\r\n {\r\n \"Code\": \"NI\",\r\n \"Name\": \"Nicaragua\"\r\n },\r\n {\r\n \"Code\": \"NE\",\r\n \"Name\": \"Niger\"\r\n },\r\n {\r\n \"Code\": \"NG\",\r\n \"Name\": \"Nigeria\"\r\n },\r\n {\r\n \"Code\": \"NU\",\r\n \"Name\": \"Niue\"\r\n },\r\n {\r\n \"Code\": \"NF\",\r\n \"Name\": \"Norfolk Island\"\r\n },\r\n {\r\n \"Code\": \"MP\",\r\n \"Name\": \"Northern Mariana Islands\"\r\n },\r\n {\r\n \"Code\": \"NO\",\r\n \"Name\": \"Norway\"\r\n },\r\n {\r\n \"Code\": \"OM\",\r\n \"Name\": \"Oman\"\r\n },\r\n {\r\n \"Code\": \"PK\",\r\n \"Name\": \"Pakistan\"\r\n },\r\n {\r\n \"Code\": \"PW\",\r\n \"Name\": \"Palau\"\r\n },\r\n {\r\n \"Code\": \"PS\",\r\n \"Name\": \"Palestine, State of\"\r\n },\r\n {\r\n \"Code\": \"PA\",\r\n \"Name\": \"Panama\"\r\n },\r\n {\r\n \"Code\": \"PG\",\r\n \"Name\": \"Papua New Guinea\"\r\n },\r\n {\r\n \"Code\": \"PY\",\r\n \"Name\": \"Paraguay\"\r\n },\r\n {\r\n \"Code\": \"PE\",\r\n \"Name\": \"Peru\"\r\n },\r\n {\r\n \"Code\": \"PH\",\r\n \"Name\": \"Philippines\"\r\n },\r\n {\r\n \"Code\": \"PN\",\r\n \"Name\": \"Pitcairn\"\r\n },\r\n {\r\n \"Code\": \"PL\",\r\n \"Name\": \"Poland\"\r\n },\r\n {\r\n \"Code\": \"PT\",\r\n \"Name\": \"Portugal\"\r\n },\r\n {\r\n \"Code\": \"PR\",\r\n \"Name\": \"Puerto Rico\"\r\n },\r\n {\r\n \"Code\": \"QA\",\r\n \"Name\": \"Qatar\"\r\n },\r\n {\r\n \"Code\": \"RE\",\r\n \"Name\": \"R\\u00e9union\"\r\n },\r\n {\r\n \"Code\": \"RO\",\r\n \"Name\": \"Romania\"\r\n },\r\n {\r\n \"Code\": \"RU\",\r\n \"Name\": \"Russian Federation\"\r\n },\r\n {\r\n \"Code\": \"RW\",\r\n \"Name\": \"Rwanda\"\r\n },\r\n {\r\n \"Code\": \"BL\",\r\n \"Name\": \"Saint Barth\\u00e9lemy\"\r\n },\r\n {\r\n \"Code\": \"SH\",\r\n \"Name\": \"Saint Helena, Ascension and Tristan da Cunha\"\r\n },\r\n {\r\n \"Code\": \"KN\",\r\n \"Name\": \"Saint Kitts and Nevis\"\r\n },\r\n {\r\n \"Code\": \"LC\",\r\n \"Name\": \"Saint Lucia\"\r\n },\r\n {\r\n \"Code\": \"MF\",\r\n \"Name\": \"Saint Martin (French part)\"\r\n },\r\n {\r\n \"Code\": \"PM\",\r\n \"Name\": \"Saint Pierre and Miquelon\"\r\n },\r\n {\r\n \"Code\": \"VC\",\r\n \"Name\": \"Saint Vincent and the Grenadines\"\r\n },\r\n {\r\n \"Code\": \"WS\",\r\n \"Name\": \"Samoa\"\r\n },\r\n {\r\n \"Code\": \"SM\",\r\n \"Name\": \"San Marino\"\r\n },\r\n {\r\n \"Code\": \"ST\",\r\n \"Name\": \"Sao Tome and Principe\"\r\n },\r\n {\r\n \"Code\": \"SA\",\r\n \"Name\": \"Saudi Arabia\"\r\n },\r\n {\r\n \"Code\": \"SN\",\r\n \"Name\": \"Senegal\"\r\n },\r\n {\r\n \"Code\": \"RS\",\r\n \"Name\": \"Serbia\"\r\n },\r\n {\r\n \"Code\": \"SC\",\r\n \"Name\": \"Seychelles\"\r\n },\r\n {\r\n \"Code\": \"SL\",\r\n \"Name\": \"Sierra Leone\"\r\n },\r\n {\r\n \"Code\": \"SG\",\r\n \"Name\": \"Singapore\"\r\n },\r\n {\r\n \"Code\": \"SX\",\r\n \"Name\": \"Sint Maarten (Dutch part)\"\r\n },\r\n {\r\n \"Code\": \"SK\",\r\n \"Name\": \"Slovakia\"\r\n },\r\n {\r\n \"Code\": \"SI\",\r\n \"Name\": \"Slovenia\"\r\n },\r\n {\r\n \"Code\": \"SB\",\r\n \"Name\": \"Solomon Islands\"\r\n },\r\n {\r\n \"Code\": \"SO\",\r\n \"Name\": \"Somalia\"\r\n },\r\n {\r\n \"Code\": \"ZA\",\r\n \"Name\": \"South Africa\"\r\n },\r\n {\r\n \"Code\": \"GS\",\r\n \"Name\": \"South Georgia and the South Sandwich Islands\"\r\n },\r\n {\r\n \"Code\": \"SS\",\r\n \"Name\": \"South Sudan\"\r\n },\r\n {\r\n \"Code\": \"ES\",\r\n \"Name\": \"Spain\"\r\n },\r\n {\r\n \"Code\": \"LK\",\r\n \"Name\": \"Sri Lanka\"\r\n },\r\n {\r\n \"Code\": \"SD\",\r\n \"Name\": \"Sudan\"\r\n },\r\n {\r\n \"Code\": \"SR\",\r\n \"Name\": \"Suriname\"\r\n },\r\n {\r\n \"Code\": \"SJ\",\r\n \"Name\": \"Svalbard and Jan Mayen\"\r\n },\r\n {\r\n \"Code\": \"SZ\",\r\n \"Name\": \"Swaziland\"\r\n },\r\n {\r\n \"Code\": \"SE\",\r\n \"Name\": \"Sweden\"\r\n },\r\n {\r\n \"Code\": \"CH\",\r\n \"Name\": \"Switzerland\"\r\n },\r\n {\r\n \"Code\": \"SY\",\r\n \"Name\": \"Syrian Arab Republic\"\r\n },\r\n {\r\n \"Code\": \"TW\",\r\n \"Name\": \"Taiwan, Province of China\"\r\n },\r\n {\r\n \"Code\": \"TJ\",\r\n \"Name\": \"Tajikistan\"\r\n },\r\n {\r\n \"Code\": \"TZ\",\r\n \"Name\": \"Tanzania, United Republic of\"\r\n },\r\n {\r\n \"Code\": \"TH\",\r\n \"Name\": \"Thailand\"\r\n },\r\n {\r\n \"Code\": \"TL\",\r\n \"Name\": \"Timor-Leste\"\r\n },\r\n {\r\n \"Code\": \"TG\",\r\n \"Name\": \"Togo\"\r\n },\r\n {\r\n \"Code\": \"TK\",\r\n \"Name\": \"Tokelau\"\r\n },\r\n {\r\n \"Code\": \"TO\",\r\n \"Name\": \"Tonga\"\r\n },\r\n {\r\n \"Code\": \"TT\",\r\n \"Name\": \"Trinidad and Tobago\"\r\n },\r\n {\r\n \"Code\": \"TN\",\r\n \"Name\": \"Tunisia\"\r\n },\r\n {\r\n \"Code\": \"TR\",\r\n \"Name\": \"Turkey\"\r\n },\r\n {\r\n \"Code\": \"TM\",\r\n \"Name\": \"Turkmenistan\"\r\n },\r\n {\r\n \"Code\": \"TC\",\r\n \"Name\": \"Turks and Caicos Islands\"\r\n },\r\n {\r\n \"Code\": \"TV\",\r\n \"Name\": \"Tuvalu\"\r\n },\r\n {\r\n \"Code\": \"UG\",\r\n \"Name\": \"Uganda\"\r\n },\r\n {\r\n \"Code\": \"UA\",\r\n \"Name\": \"Ukraine\"\r\n },\r\n {\r\n \"Code\": \"AE\",\r\n \"Name\": \"United Arab Emirates\"\r\n },\r\n {\r\n \"Code\": \"GB\",\r\n \"Name\": \"United Kingdom\"\r\n },\r\n {\r\n \"Code\": \"US\",\r\n \"Name\": \"United States\"\r\n },\r\n {\r\n \"Code\": \"UM\",\r\n \"Name\": \"United States Minor Outlying Islands\"\r\n },\r\n {\r\n \"Code\": \"UY\",\r\n \"Name\": \"Uruguay\"\r\n },\r\n {\r\n \"Code\": \"UZ\",\r\n \"Name\": \"Uzbekistan\"\r\n },\r\n {\r\n \"Code\": \"VU\",\r\n \"Name\": \"Vanuatu\"\r\n },\r\n {\r\n \"Code\": \"VE\",\r\n \"Name\": \"Venezuela, Bolivarian Republic of\"\r\n },\r\n {\r\n \"Code\": \"VN\",\r\n \"Name\": \"Viet Nam\"\r\n },\r\n {\r\n \"Code\": \"VG\",\r\n \"Name\": \"Virgin Islands, British\"\r\n },\r\n {\r\n \"Code\": \"VI\",\r\n \"Name\": \"Virgin Islands, U.S.\"\r\n },\r\n {\r\n \"Code\": \"WF\",\r\n \"Name\": \"Wallis and Futuna\"\r\n },\r\n {\r\n \"Code\": \"EH\",\r\n \"Name\": \"Western Sahara\"\r\n },\r\n {\r\n \"Code\": \"YE\",\r\n \"Name\": \"Yemen\"\r\n },\r\n {\r\n \"Code\": \"ZM\",\r\n \"Name\": \"Zambia\"\r\n },\r\n {\r\n \"Code\": \"ZW\",\r\n \"Name\": \"Zimbabwe\"\r\n }\r\n];\r\n\r\nexport default countryCodes;","import { standardGridPageSize } from \"../../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $http, $uibModalInstance, helperService, requestUserId) {\r\n\r\n var vm = this;\r\n\r\n vm.searchComplete = searchComplete;\r\n vm.searchKeyDown = searchKeyDown;\r\n vm.changeExistingUserRowSelected = changeExistingUserRowSelected;\r\n vm.selectUser = selectUser;\r\n vm.dismiss = dismiss;\r\n\r\n activate();\r\n\r\n function activate() {\r\n const existingUserGridColumns = [\r\n { field: \"DisplayName\", title: \"Name\", filterable: false },\r\n { field: \"UserPrincipalName\", title: \"User Principal Name\", filterable: false }\r\n ];\r\n vm.existingUsersGridOptions = helperService.setMainGridOptions(existingUserGridColumns, 400);\r\n vm.existingUsersGridOptions.autoBind = false;\r\n vm.existingUsersGridOptions.pageable = {\r\n alwaysVisible: false\r\n }\r\n\r\n vm.existingUsersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/identitymanager/aad/users/search',\r\n params: {\r\n criteria: vm.existingUserSearchString,\r\n //includeInactive: false\r\n }\r\n });\r\n // Remove request user from list as they cannot be selected as manager\r\n const requestUserIndex = response.data.findIndex(user => user.Id === requestUserId);\r\n if (requestUserIndex > -1) {\r\n response.data.splice(requestUserIndex, 1);\r\n }\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n } catch (error) {\r\n options.error();\r\n helperService.showErrorMessage(error.data);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function searchComplete() {\r\n if (vm.existingUserSearchString === '' || !vm.existingUserSearchString) {\r\n var raw = vm.existingUsersGridDataSource.data();\r\n var length = raw.length;\r\n\r\n var item, i;\r\n for (i = length - 1; i >= 0; i--) {\r\n item = raw[i];\r\n vm.existingUsersGridDataSource.remove(item);\r\n }\r\n } else {\r\n vm.existingUsersGridDataSource.read();\r\n }\r\n }\r\n\r\n function searchKeyDown () {\r\n vm.SearchExistingUserSelected = null;\r\n }\r\n\r\n function changeExistingUserRowSelected(kendoEvent) {\r\n var grid = kendoEvent.sender;\r\n\r\n vm.selectedManager = grid.dataItem(grid.select());\r\n }\r\n\r\n function selectUser() {\r\n $uibModalInstance.close(vm.selectedManager);\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import countryCodes from \"../../../../Shared/GlobalVariables/countryCodes\";\r\nimport managerSearchController from \"./ManagerSearch/managerSearch.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $http, $uibModal, helperService, existingUserCheckService) {\r\n\r\n $scope.openManagerSearchModal = openManagerSearchModal;\r\n\r\n //General User\r\n $scope.vm.adUserFromDateObject = null;\r\n $scope.vm.adUserToDateObject = null;\r\n $scope.vm.adUserMaxDate = new Date();\r\n var adUserMinDate = new Date();\r\n adUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.adUserMinDate = adUserMinDate;\r\n\r\n if (!$scope.vm.User.AadUser) {\r\n $scope.vm.User.AadUser = {};\r\n }\r\n if ($scope.vm.User.AadUser.AccountEnabled === undefined) {\r\n $scope.vm.User.AadUser.AccountEnabled = true;\r\n }\r\n $scope.vm.User.AadUser.ProductType = \"AAD\";\r\n $scope.vm.User.AadUser.Enabled = true;\r\n $scope.vm.ListOfCountryCodes = countryCodes;\r\n\r\n $scope.vm.existingUserCheck = existingUserCheck;\r\n\r\n $scope.adUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.AadUser.StartDate == '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.AadUser.StartDate);\r\n }\r\n\r\n $scope.vm.adUserMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.AadUser == null) {\r\n $scope.vm.User.AadUser = {};\r\n }\r\n };\r\n\r\n $scope.adUserToDateChanged = function () {\r\n $scope.vm.adUserMaxDate = new Date($scope.vm.User.AadUser.EndDate);\r\n if ($scope.vm.User.AadUser == null) {\r\n $scope.vm.User.AadUser = {};\r\n }\r\n };\r\n\r\n activate();\r\n\r\n function activate() {\r\n if ($scope.vm.wizardMode === 'New') {\r\n getDomains();\r\n }\r\n }\r\n\r\n async function existingUserCheck() {\r\n if ($scope.vm.wizardMode === 'New' && $scope.vm.User.AadUser.Domain) {\r\n try {\r\n let response = await existingUserCheckService.checkAAD($scope.vm.User.AadUser.UserPrincipalName);\r\n if (response.data.UserPrincipalName === $scope.vm.User.AadUser.UserPrincipalName + '@' + $scope.vm.User.AadUser.Domain) {\r\n $scope.vm.aadUserExists = true;\r\n $scope.wizardForm.AADUserName.$setValidity(\"AADUserName\", false);\r\n }\r\n } catch (error) {\r\n if (error.status === 404) {\r\n $scope.vm.aadUserExists = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n async function getDomains() {\r\n try {\r\n let response = await $http.get(`${apiUrl}api/identitymanager/aad/domains`);\r\n $scope.vm.ListOfAADDomains = response.data;\r\n } catch (error) {\r\n helperService.showErrorMessage(error.data);\r\n }\r\n }\r\n\r\n async function openManagerSearchModal() {\r\n let managerSearchModal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/AAD/ManagerSearch/managerSearch.tmpl.html',\r\n controller: managerSearchController,\r\n controllerAs: 'msmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n requestUserId: () => $scope.vm.User.AadUser.Id\r\n }\r\n });\r\n\r\n try {\r\n let selectedManager = await managerSearchModal.result;\r\n $scope.vm.User.AadUser.Manager = selectedManager;\r\n } catch { return; }\r\n }\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailableAADRoles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfAvailableAADRoles.splice(i, 1);\r\n $scope.vm.ListOfSelectedAADRoles.push(role);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedAADRoles.forEach(function (row, i) {\r\n if (row.Id === role.Id) {\r\n $scope.vm.ListOfSelectedAADRoles.splice(i, 1);\r\n $scope.vm.ListOfAvailableAADRoles.push(row);\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.selectedRole = null;\r\n\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addGroupToList = function (group) {\r\n $scope.vm.ListOfAvailableAADGroups.forEach(function (row, i) {\r\n if (row.Id === group.Id) {\r\n $scope.vm.ListOfAvailableAADGroups.splice(i, 1);\r\n $scope.vm.ListOfSelectedAADGroups.push(group);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedGroup = function (group) {\r\n $scope.vm.ListOfSelectedAADGroups.forEach(function (row, i) {\r\n if (row.Id === group.Id) {\r\n $scope.vm.ListOfSelectedAADGroups.splice(i, 1);\r\n $scope.vm.ListOfAvailableAADGroups.push(row);\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addLicenseToList = function (license) {\r\n $scope.vm.ListOfAvailableAADLicenses.forEach(function (row, i) {\r\n if (row.SkuId === license.SkuId) {\r\n $scope.vm.ListOfAvailableAADLicenses.splice(i, 1);\r\n $scope.vm.ListOfSelectedAADLicenses.push(license);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedLicense = function (license) {\r\n $scope.vm.ListOfSelectedAADLicenses.forEach(function (row, i) {\r\n if (row.SkuId === license.SkuId) {\r\n $scope.vm.ListOfSelectedAADLicenses.splice(i, 1);\r\n $scope.vm.ListOfAvailableAADLicenses.push(row);\r\n }\r\n });\r\n\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n}","import { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, RequestManagementPSService, manageDataDataService, $http) {\r\n\r\n //General User\r\n $scope.vm.selectUser = selectUser;\r\n $scope.vm.psUserFromDateObject = null;\r\n $scope.vm.psUserToDateObject = null;\r\n $scope.vm.psUserMaxDate = new Date();\r\n var psUserMinDate = new Date();\r\n psUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n $scope.vm.psUserMinDate = psUserMinDate;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getPermissionlists();\r\n await setFieldConfigurationValues();\r\n createPermissionListDropdowns();\r\n $scope.vm.ListOfPSEmailTypes = RequestManagementPSService.getPSEmailTypes();\r\n }\r\n\r\n if (!$scope.vm.User.PSUser) {\r\n $scope.vm.User.PSUser = {};\r\n }\r\n $scope.vm.User.PSUser.ProductType = \"PS\";\r\n\r\n async function getPermissionlists() {\r\n let response = await RequestManagementPSService.getPSPermissionLists()\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n $scope.vm.psPermissionLists = response.data;\r\n }\r\n\r\n function createPermissionListDropdowns() {\r\n $scope.vm.permissionListsDropdownOptions = {\r\n valuePrimitive: true,\r\n template: `\r\n {{dataItem.Id}} | {{dataItem.Name}}\r\n `,\r\n filter: \"contains\",\r\n autoBind: true,\r\n minLength: 3,\r\n optionLabel: '-- Select a Permission List --',\r\n filtering: ev => {\r\n var filterValue = ev.filter != undefined ? ev.filter.value : \"\";\r\n ev.preventDefault();\r\n\r\n ev.sender.dataSource.filter({\r\n logic: \"or\",\r\n filters: [\r\n {\r\n field: \"Name\",\r\n operator: \"contains\",\r\n value: filterValue\r\n },\r\n {\r\n field: \"Id\",\r\n operator: \"contains\",\r\n value: filterValue\r\n }\r\n ]\r\n });\r\n }\r\n };\r\n\r\n\r\n\r\n $scope.vm.psNavPermissionsListsDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n options.success($scope.vm.psPermissionLists);\r\n }\r\n }\r\n });\r\n\r\n $scope.vm.psPrimaryPermissionsListsDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n options.success($scope.vm.psPermissionLists);\r\n }\r\n }\r\n });\r\n\r\n $scope.vm.psProcessPermissionsListsDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n options.success($scope.vm.psPermissionLists);\r\n }\r\n }\r\n });\r\n\r\n $scope.vm.psRowSecurityPermissionsListsDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: options => {\r\n options.success($scope.vm.psPermissionLists);\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.psUserFromDateChanged = function () {\r\n var date;\r\n if ($scope.vm.User.PSUser.StartDate === '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.PSUser.StartDate);\r\n }\r\n\r\n $scope.vm.psUserMinDate = date;\r\n $scope.vm.nsMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n if ($scope.vm.User.PSUser == null) {\r\n $scope.vm.User.PSUser = {};\r\n }\r\n };\r\n\r\n $scope.psUserToDateChanged = function () {\r\n $scope.vm.psUserMaxDate = new Date($scope.vm.User.PSUser.EndDate);\r\n $scope.vm.nsMaxDate = new Date($scope.vm.User.PSUser.EndDate);\r\n $scope.vm.fromMaxDate = new Date($scope.vm.User.PSUser.StartDate);\r\n if ($scope.vm.User.PSUser == null) {\r\n $scope.vm.User.PSUser = {};\r\n }\r\n };\r\n\r\n async function setFieldConfigurationValues() {\r\n $scope.vm.showADUserLookup = $scope.vm.config.find(config => config.Name === 'AD_Active').Value === '1';\r\n $scope.vm.showAADUserLookup = $scope.vm.config.find(config => config.Name === 'AAD_Active').Value === '1';\r\n let response = await manageDataDataService.getConfigurationByProductId('PS');\r\n $scope.vm.disableADUserFields = response.data.find(config => config.Name === 'IM_DisableADUserFields').Value === '1' && $scope.vm.showADUserLookup;\r\n $scope.vm.disableAADUserFields = response.data.find(config => config.Name === 'IM_DisableAADUserFields').Value === '1' && $scope.vm.showAADUserLookup;\r\n }\r\n\r\n function selectUser(user) {\r\n $scope.vm.User.PSUser = user;\r\n if (user.UserType !== 'Guest') {\r\n setProvider();\r\n }\r\n }\r\n\r\n async function setProvider() {\r\n const { data } = await $http.get(`${apiUrl}api/universal/products/ORFC/configuration/im_provider`);\r\n $scope.vm.User.PSUser.NetworkDomain = data.Value;\r\n }\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addRoleToList = function (role) {\r\n $scope.vm.ListOfAvailablePSRoles.forEach(function (row, i) {\r\n if (row.Name === role.Name) {\r\n $scope.vm.ListOfAvailablePSRoles.splice(i, 1);\r\n $scope.vm.ListOfSelectedPSRoles.push(role);\r\n }\r\n });\r\n };\r\n\r\n $scope.deleteSelectedRole = function (role) {\r\n $scope.vm.ListOfSelectedPSRoles.forEach(function (row, i) {\r\n if (row.Name === role.Name) {\r\n $scope.vm.ListOfSelectedPSRoles.splice(i, 1);\r\n if (role.IsAssignable) {\r\n $scope.vm.ListOfAvailablePSRoles.push(row);\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.selectedRole = null;\r\n\r\n $scope.setSelectedRoleTemplates = function (selectedRoleTemplates) {\r\n $scope.vm.selectedRoleTemplates = selectedRoleTemplates;\r\n };\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addUserGroupToList = addUserGroupToList;\r\n $scope.deleteSelectedUserGroup = deleteSelectedUserGroup;\r\n\r\n function addUserGroupToList(userGroup) {\r\n $scope.vm.ListOfAvailableAX7UserGroups.forEach((row, i) => {\r\n if (row.Id === userGroup.Id) {\r\n $scope.vm.ListOfAvailableAX7UserGroups.splice(i, 1);\r\n $scope.vm.ListOfSelectedAX7UserGroups.push(userGroup);\r\n }\r\n });\r\n };\r\n\r\n\r\n function deleteSelectedUserGroup(userGroup) {\r\n $scope.vm.ListOfSelectedAX7UserGroups.forEach((row, i) => {\r\n if (row.Id === userGroup.Id) {\r\n $scope.vm.ListOfSelectedAX7UserGroups.splice(i, 1);\r\n $scope.vm.ListOfAvailableAX7UserGroups.push(row);\r\n }\r\n });\r\n };\r\n\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n\r\n $scope.addUserGroupToList = addUserGroupToList;\r\n $scope.deleteSelectedUserGroup = deleteSelectedUserGroup;\r\n\r\n function addUserGroupToList(userGroup) {\r\n $scope.vm.ListOfAvailableAX2012UserGroups.forEach((row, i) => {\r\n if (row.Id === userGroup.Id) {\r\n $scope.vm.ListOfAvailableAX2012UserGroups.splice(i, 1);\r\n $scope.vm.ListOfSelectedAX2012UserGroups.push(userGroup);\r\n }\r\n });\r\n };\r\n\r\n\r\n function deleteSelectedUserGroup(userGroup) {\r\n $scope.vm.ListOfSelectedAX2012UserGroups.forEach((row, i) => {\r\n if (row.Id === userGroup.Id) {\r\n $scope.vm.ListOfSelectedAX2012UserGroups.splice(i, 1);\r\n $scope.vm.ListOfAvailableAX2012UserGroups.push(row);\r\n }\r\n });\r\n };\r\n\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n $scope.addCompositeRoleToList = function (compositeRole, productName) {\r\n $scope.vm.ListOfAvailableSAPCompositeRoles[productName].forEach(function (row, i) {\r\n if (row.Id === compositeRole.Id) {\r\n $scope.vm.ListOfAvailableSAPCompositeRoles[productName].splice(i, 1);\r\n $scope.vm.ListOfSelectedSAPCompositeRoles[productName].push(row);\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n\r\n $scope.deleteSelectedCompositeRole = function (compositeRole, productName) {\r\n $scope.vm.ListOfSelectedSAPCompositeRoles[productName].forEach(function (row, i) {\r\n if (row.Id === compositeRole.Id) {\r\n $scope.vm.ListOfSelectedSAPCompositeRoles[productName].splice(i, 1);\r\n if (compositeRole.IsAssignable) {\r\n $scope.vm.ListOfAvailableSAPCompositeRoles[productName].push(row);\r\n }\r\n if (compositeRole.IsEmergencyAccess) {\r\n // Clear out selected TCodes\r\n $scope.vm.ListOfAvailableSAPRoleObjects[productName] = null;\r\n $scope.vm.ListOfSelectedSAPRoleObjects[productName] = null;\r\n }\r\n }\r\n });\r\n $scope.vm.IsRisksReviewed = null;\r\n };\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModalInstance, salesforceService, helperService, requestUserId, type) {\r\n\r\n var vm = this;\r\n\r\n vm.typeDisplay = type.charAt(0).toUpperCase() + type.slice(1)\r\n vm.searchComplete = searchComplete;\r\n vm.searchKeyDown = searchKeyDown;\r\n vm.changeUserRowSelected = changeUserRowSelected;\r\n vm.selectUser = selectUser;\r\n vm.dismiss = dismiss;\r\n\r\n activate();\r\n\r\n function activate() {\r\n // TODO: Verify column names and fields\r\n let columns = [\r\n { field: \"Name\", title: \"Name\", filterable: false },\r\n { field: \"Username\", title: \"Username\", filterable: false }\r\n ];\r\n\r\n vm.usersGridOptions = helperService.setMainGridOptions(columns, 400);\r\n vm.usersGridOptions.autoBind = false;\r\n vm.usersGridOptions.pageable = {\r\n alwaysVisible: false\r\n }\r\n\r\n vm.usersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let { data } = await salesforceService.getUsers(vm.userSearchString, \"name\");\r\n\r\n data.map(user => {\r\n user.Name = `${user.FirstName} ${user.LastName}`\r\n });\r\n\r\n // Remove request user from list as they cannot be selected \r\n data = data.filter(user => user.Id !== requestUserId);\r\n\r\n data = $filter('orderBy')(data, 'FirstName');\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function searchComplete() {\r\n if (vm.userSearchString === '' || !vm.userSearchString) {\r\n let data = vm.usersGridDataSource.data();\r\n\r\n data.forEach(item => {\r\n vm.usersGridDataSource.remove(item);\r\n });\r\n } else {\r\n vm.usersGridDataSource.read();\r\n }\r\n }\r\n\r\n function searchKeyDown () {\r\n vm.searchUserSelected = null;\r\n }\r\n\r\n function changeUserRowSelected(kendoEvent) {\r\n var grid = kendoEvent.sender;\r\n\r\n vm.selectedUser = grid.dataItem(grid.select());\r\n }\r\n\r\n function selectUser() {\r\n $uibModalInstance.close(vm.selectedUser);\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import searchController from \"./searchModal/search.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModal, salesforceService, errorsDataService, manageDataDataService, $http) {\r\n\r\n const salesforceUserMinDate = new Date();\r\n\r\n salesforceUserMinDate.setHours(0, 0, 0, 0);\r\n\r\n if (!$scope.vm.User.SalesforceUser) {\r\n $scope.vm.User.SalesforceUser = {};\r\n }\r\n\r\n $scope.vm.User.SalesforceUser.ProductType = \"SF\";\r\n $scope.vm.openSalesforceSearchModal = openSearchModal;\r\n $scope.vm.existingSalesforceUserCheck = existingUserCheck;\r\n $scope.userFromDateChanged = userFromDateChanged;\r\n $scope.userToDateChanged = userToDateChanged;\r\n $scope.vm.salesforceUserMinDate = salesforceUserMinDate;\r\n $scope.vm.selectUser = selectUser;\r\n $scope.vm.User.SalesforceUser.ProfileId = $scope.vm.User.SalesforceUser?.ProfileId || \"\";\r\n $scope.vm.handleSalesforceCountrySelection = handleCountrySelection;\r\n $scope.vm.clearSalesforceInput = clearInput;\r\n $scope.vm.selectedManager = \"\";\r\n $scope.vm.selectedApprover = \"\";\r\n $scope.vm.salesforceEmailChangeMessage = \"To ensure system security, the owner of the new email address must verify this change. When the request is submitted, an email will be sent to the specified address with directions on confirming this change.\"\r\n\r\n activate();\r\n\r\n async function activate() {\r\n setFieldConfigurationValues();\r\n let { data: countries } = await salesforceService.getCountries();\r\n $scope.vm.salesforceCountriesDatasource = $filter('orderBy')(countries, 'Name');\r\n $scope.vm.salesforceStatesDatasource = $filter('orderBy')(countries.first()?.States || [], 'Name');\r\n if ($scope.vm.User.SalesforceUser.Country) {\r\n handleCountrySelection();\r\n }\r\n }\r\n\r\n async function handleCountrySelection() {\r\n $scope.vm.salesforceStatesDatasource = $scope.vm.salesforceCountriesDatasource.find(country => country.Name === $scope.vm.User.SalesforceUser.Country).States;\r\n }\r\n\r\n async function existingUserCheck(username) {\r\n try {\r\n const { data } = await salesforceService.getUsers(username, \"username\"),\r\n currentId = $scope.vm.User?.SalesforceUser?.Id;\r\n\r\n if (data?.length && data?.first().Id !== currentId) {\r\n $scope.wizardForm.Username.$setValidity(\"Username\", false);\r\n $scope.vm.salesforceUserExists = true;\r\n } else {\r\n $scope.wizardForm.Username.$setValidity(\"Username\", true);\r\n $scope.vm.salesforceUserExists = false;\r\n }\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n };\r\n\r\n $scope.$watch(\"vm.User.SalesforceUser.Username\", () => {\r\n if ($scope.vm.User.SalesforceUser?.Username && $scope.vm.wizardMode === 'New') {\r\n existingUserCheck($scope.vm.User.SalesforceUser.Username)\r\n }\r\n });\r\n\r\n async function openSearchModal(type) {\r\n let searchModal = $uibModal.open({\r\n templateUrl: '/App/Components/RequestManagement/WizardSteps/Salesforce/searchModal/search.tmpl.html',\r\n controller: searchController,\r\n controllerAs: 'svm',\r\n backdrop: 'static',\r\n resolve: {\r\n requestUserId: () => $scope.vm.User.SalesforceUser.Id,\r\n type: () => type\r\n }\r\n });\r\n\r\n try {\r\n let result = await searchModal.result;\r\n\r\n if (type === \"manager\") {\r\n $scope.vm.User.SalesforceUser.ManagerId = result.Id;\r\n $scope.vm.selectedManager = result.Name;\r\n } else {\r\n $scope.vm.User.SalesforceUser.DelegateApproverId = result.Id;\r\n $scope.vm.selectedApprover = result.Name;\r\n }\r\n \r\n } catch { return; }\r\n }\r\n\r\n function clearInput(type) {\r\n if (type === \"Approver\") {\r\n $scope.vm.User.SalesforceUser.DelegateApproverId = null;\r\n $scope.vm.selectedApprover = \"\";\r\n } else {\r\n $scope.vm.User.SalesforceUser.ManagerId = null;\r\n $scope.vm.selectedManager = \"\";\r\n }\r\n }\r\n\r\n function userFromDateChanged () {\r\n var date;\r\n\r\n if ($scope.vm.User.SalesforceUser.StartDate === '') {\r\n date = new Date();\r\n } else {\r\n date = new Date($scope.vm.User.SalesforceUser.StartDate);\r\n }\r\n\r\n $scope.vm.salesforceUserMinDate = date;\r\n $scope.vm.fromMinDate = date;\r\n\r\n if ($scope.vm.User.SalesforceUser == null) {\r\n $scope.vm.User.SalesforceUser = {};\r\n }\r\n };\r\n\r\n function userToDateChanged() {\r\n $scope.vm.salesforceUserMaxDate = new Date($scope.vm.User.SalesforceUser.EndDate);\r\n $scope.vm.fromMaxDate = new Date($scope.vm.User.SalesforceUser.StartDate);\r\n if ($scope.vm.User.SalesforceUser == null) {\r\n $scope.vm.User.SalesforceUser = {};\r\n }\r\n };\r\n\r\n async function setFieldConfigurationValues() {\r\n $scope.vm.showADUserLookup = $scope.vm.config.find(config => config.Name === 'AD_Active').Value === '1';\r\n $scope.vm.showAADUserLookup = $scope.vm.config.find(config => config.Name === 'AAD_Active').Value === '1';\r\n let response = await manageDataDataService.getConfigurationByProductId('SF');\r\n $scope.vm.disableADUserFields = response.data.find(config => config.Name === 'IM_DisableADUserFields').Value === '1' && $scope.vm.showADUserLookup;\r\n $scope.vm.disableAADUserFields = response.data.find(config => config.Name === 'IM_DisableAADUserFields').Value === '1' && $scope.vm.showAADUserLookup;\r\n }\r\n\r\n function selectUser(user) {\r\n $scope.vm.User.SalesforceUser = user;\r\n if (user.UserType !== 'Guest') {\r\n setProvider();\r\n }\r\n }\r\n\r\n async function setProvider() {\r\n const { data } = await $http.get(`${apiUrl}api/universal/products/ORFC/configuration/im_provider`);\r\n $scope.vm.User.SalesforceUser.NetworkDomain = data.Value;\r\n }\r\n}","import swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $scope, salesforceService) {\r\n $scope.vm.salesforceProfileHasRoles = false;\r\n\r\n if (!$scope.vm.User.SalesforceUser) {\r\n $scope.vm.User.SalesforceUser = {};\r\n }\r\n\r\n $scope.vm.User.SalesforceUser.ProductType = \"SF\";\r\n $scope.vm.allowSalesforceRoleSelection = $scope.vm.User?.SalesforceUser?.Profile?.UserType === \"Standard\";\r\n $scope.vm.salesforceProfilesDisabled = $scope.vm.User?.SalesforceUser?.PendingProfile;\r\n $scope.vm.handleSalesforceLicenseSelection = handleLicenseSelection;\r\n $scope.vm.handleSalesforceProfileSelection = handleProfileSelection;\r\n $scope.vm.salesforceProfiles = [];\r\n $scope.vm.dropdownOptions = {\r\n template: '{{dataItem.Name}}',\r\n autoBind: true,\r\n dataTextField: \"Name\",\r\n dataValueField: \"Id\",\r\n height: 325\r\n };\r\n\r\n activate();\r\n\r\n function activate() {\r\n getUserLicenses();\r\n getRoles();\r\n getProfiles();\r\n\r\n if (!$scope.vm.User.SalesforceUser?.Profile?.Id) {\r\n $scope.wizardForm.$valid = false;\r\n $scope.wizardForm.$invalid = true;\r\n }\r\n }\r\n\r\n function getUserLicenses() {\r\n $scope.vm.salesforceUserLicensesDatasource = new kendo.data.DataSource({\r\n transport: {\r\n read: async function (options) {\r\n const params = { 'currentLicenseId': $scope.vm.User?.SalesforceUser?.Profile?.UserLicenseId };\r\n let { data } = await salesforceService.getUserLicenses(params);\r\n\r\n options.success($filter('orderBy')(data, 'Name'));\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getProfiles() {\r\n $scope.vm.salesforceProfilesDatasource = new kendo.data.DataSource({\r\n transport: {\r\n read: async function (options) {\r\n let { data: profiles } = await salesforceService.getProfiles(),\r\n profile;\r\n\r\n profiles = $filter('orderBy')(profiles, 'Name');\r\n\r\n // Filter profiles by selected User License Id\r\n if (profiles && $scope.vm.User.SalesforceUser.Profile?.UserLicenseId) {\r\n profiles = profiles.filter(systemProfile => systemProfile.UserLicenseId === $scope.vm.User.SalesforceUser.Profile.UserLicenseId);\r\n }\r\n\r\n // If only one profile found, set it as the user's profile\r\n if (profiles.length === 1) {\r\n profile = profiles.first();\r\n\r\n $scope.vm.User.SalesforceUser.Profile = { ...profile };\r\n $scope.vm.allowSalesforceRoleSelection = profile?.UserType === \"Standard\";\r\n }\r\n\r\n // Set form to invalid to prevent continuing if user is assigned unassignable profile\r\n if ($scope.vm.User.SalesforceUser.Profile && !$scope.vm.User.SalesforceUser.Profile.IsAssignable) {\r\n $scope.wizardForm.$valid = false;\r\n $scope.wizardForm.$invalid = true;\r\n }\r\n\r\n // Filter out profiles that are not assignable\r\n profiles = profiles.filter(profile => profile.IsAssignable);\r\n\r\n if (!$scope.vm.allowSalesforceRoleSelection) {\r\n $scope.vm.User.SalesforceUser.UserRoleId = null;\r\n }\r\n\r\n $scope.vm.salesforceProfiles = profiles;\r\n\r\n options.success(profiles);\r\n\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets = filterPermissons($scope.vm.User.SalesforceUser.Profile?.UserLicenseId, $scope.vm.ListOfAllSalesforcePermissionSets);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getRoles() {\r\n $scope.vm.salesforceRolesDatasource = new kendo.data.DataSource({\r\n transport: {\r\n read: async function (options) {\r\n let { data } = await salesforceService.getRoles();\r\n\r\n options.success($filter('orderBy')(data, 'Name'));\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function handleLicenseSelection(conflictsReviewed) {\r\n let userId = $scope.vm.User?.SalesforceUser?.Id,\r\n licenseId = $scope.vm.User?.SalesforceUser?.Profile?.UserLicenseId;\r\n\r\n $scope.vm.ListOfSelectedSalesforcePermissionSets = [];\r\n\r\n if (userId && licenseId !== $scope.vm.assignedSalesforceLicenseId) {\r\n //Alert user and set bit used to filter assigned permission sets so they are hidden\r\n alertUser();\r\n } else if (userId) {\r\n // If modify and original license id selected, set to original assigned permission sets to prevent inconsistencies\r\n $scope.vm.ListOfSelectedSalesforcePermissionSets = [...$scope.vm.assignedSalesforcePermissionSets];\r\n $scope.vm.salesforceHideAssignedPermissionSets = false;\r\n } else {\r\n $scope.vm.salesforceHideAssignedPermissionSets = false;\r\n $scope.vm.showSalesforceLicenseChangeMessage = false;\r\n }\r\n\r\n await $scope.vm.salesforceProfilesDatasource.read();\r\n $scope.vm.IsConflictsReviewed = conflictsReviewed;\r\n\r\n handleProfileSelection();\r\n\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets = filterPermissons(licenseId, $scope.vm.ListOfAllSalesforcePermissionSets);\r\n }\r\n\r\n\r\n function alertUser() {\r\n let message = \"Changing this user's license will also remove any permission sets and permission set licenses that are assigned to this user. A welcome email from the community will be sent to new community users, regardless of their preferences.\"\r\n\r\n if (!$scope.vm.showSalesforceLicenseChangeMessage) {\r\n swal(\"Warning\", message, \"warning\");\r\n\r\n $scope.vm.showSalesforceLicenseChangeMessage = true;\r\n $scope.vm.salesforceHideAssignedPermissionSets = true;\r\n }\r\n }\r\n\r\n function handleProfileSelection() {\r\n let profile = $scope.vm.salesforceProfiles.find(profile => $scope.vm.User.SalesforceUser?.Profile.Id === profile.Id);\r\n\r\n if (profile?.Id) {\r\n profile.UserRoleId = null;\r\n $scope.vm.User.SalesforceUser.Profile = { ...profile };\r\n $scope.wizardForm.$valid = true;\r\n $scope.wizardForm.$invalid = false;\r\n } else {\r\n $scope.wizardForm.$valid = false;\r\n $scope.wizardForm.$invalid = true;\r\n }\r\n\r\n $scope.vm.allowSalesforceRoleSelection = profile?.UserType === \"Standard\";\r\n $scope.vm.IsConflictsReviewed = null;\r\n }\r\n}\r\n\r\nfunction filterPermissons(licenseId, permissions = []) {\r\n return permissions.filter(availablePermission => availablePermission.LicenseId === licenseId || !availablePermission.LicenseId);\r\n}","export default /*@ngInject*/ function ($scope) {\r\n\r\n //If $scope variable doesnt exist in child it looks in parent\r\n $scope.addPermission = function (permission) {\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets.forEach((row, i) => {\r\n if (row.Id === permission.Id) {\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets.splice(i, 1);\r\n row.new = true;\r\n $scope.vm.ListOfSelectedSalesforcePermissionSets.push(row);\r\n }\r\n });\r\n $scope.vm.IsConflictsReviewed = null;\r\n };\r\n\r\n $scope.removePermission = function (selectedPermission) {\r\n $scope.vm.ListOfSelectedSalesforcePermissionSets.forEach((row, i) => {\r\n if (row.Id === selectedPermission.Id) {\r\n $scope.vm.ListOfSelectedSalesforcePermissionSets.splice(i, 1);\r\n row.new = false;\r\n $scope.vm.ListOfAvailableSalesforcePermissionSets.push(row);\r\n }\r\n });\r\n };\r\n\r\n $scope.filterSalesforcePermissions = function (permission) {\r\n //Only showing newly added and pending permissions when license has changed\r\n return !$scope.vm.salesforceHideAssignedPermissionSets || permission.new || permission.Pending;\r\n }\r\n}","import angular from 'angular';\r\nimport identityManagerRequestManagementFactoriesModule from './identityManager.requestManagement.factories.module';\r\nimport adUserSearchLink from '../Components/RequestManagement/ADUserLink/aDUser.component';\r\nimport adUserLookup from '../Components/RequestManagement/ADUserLookup/aDUserLookup.component';\r\nimport azureAdUserSearchLink from '../Components/RequestManagement/AzureADUserLink/azureADUser.component';\r\nimport azureAdUserLookup from '../Components/RequestManagement/AzureADUserLookup/azureADUserLookup.component';\r\nimport existingUserExpansion from '../Components/RequestManagement/ExistingUserExpansion/existingUserExpansion.component'\r\nimport identityManagerRequestManagementServicesModule from './identityManager.requestManagement.services.module';\r\nimport AXRolesController from '../Components/RequestManagement/WizardSteps/AX2012/AXRolesController';\r\nimport AXUserInformationController from '../Components/RequestManagement/WizardSteps/AX2012/AXUserInformationController';\r\nimport AX7RolesController from '../Components/RequestManagement/WizardSteps/AX7/AXRolesController';\r\nimport AX7UserInformationController from '../Components/RequestManagement/WizardSteps/AX7/AXUserInformationController';\r\nimport D365SRolesController from '../Components/RequestManagement/WizardSteps/D365S/D365SRolesController';\r\nimport D365STeamsController from '../Components/RequestManagement/WizardSteps/D365S/D365STeamsController';\r\nimport D365SUserInformationController from '../Components/RequestManagement/WizardSteps/D365S/D365SUserInformationController';\r\nimport GPCompaniesController from '../Components/RequestManagement/WizardSteps/GP/GPCompaniesController';\r\nimport GPRolesController from '../Components/RequestManagement/WizardSteps/GP/GPRolesController';\r\nimport GPUserInformationController from '../Components/RequestManagement/WizardSteps/GP/GPUserInformationController';\r\nimport NAVPermissionSetsController from '../Components/RequestManagement/WizardSteps/NAV/NAVPermissionSetsController';\r\nimport NAVUserGroupsController from '../Components/RequestManagement/WizardSteps/NAV/NAVUserGroupsController';\r\nimport NAVUserInformationController from '../Components/RequestManagement/WizardSteps/NAV/NAVUserInformationController';\r\nimport NSDuplicateUserController from '../Components/RequestManagement/WizardSteps/NetSuite/NSDuplicateUserController';\r\nimport NSPermissionsController from '../Components/RequestManagement/WizardSteps/NetSuite/NSPermissionsController';\r\nimport NSRolesController from '../Components/RequestManagement/WizardSteps/NetSuite/NSRolesController';\r\nimport NSUserInformationController from '../Components/RequestManagement/WizardSteps/NetSuite/NSUserInformationController';\r\nimport ORResponsibilitiesController from '../Components/RequestManagement/WizardSteps/Oracle/ORResponsibilitiesController';\r\nimport ORRolesController from '../Components/RequestManagement/WizardSteps/Oracle/ORRoles.controller';\r\nimport ORUserInformationController from '../Components/RequestManagement/WizardSteps/Oracle/ORUserInformationController';\r\nimport ORCloudRolesController from '../Components/RequestManagement/WizardSteps/OracleCloud/ORCloudRolesController';\r\nimport ORCloudUserInformationController from '../Components/RequestManagement/WizardSteps/OracleCloud/ORCloudUserInformationController';\r\nimport emergencyAccessController from '../Components/RequestManagement/WizardSteps/SAP/emergencyAccess.controller';\r\nimport SAPRolesController from '../Components/RequestManagement/WizardSteps/SAP/SAPRolesController';\r\nimport SAPUserInformationController from '../Components/RequestManagement/WizardSteps/SAP/SAPUserInformationController';\r\nimport EffectiveDatesController from '../Components/RequestManagement/WizardSteps/Universal/EffectiveDatesController';\r\nimport RiskAnalysisController from '../Components/RequestManagement/WizardSteps/Universal/RiskAnalysisController';\r\nimport RequestManagementSearchExistingUsers from '../Components/RequestManagement/RequestManagementSearchExistingUsers';\r\nimport RequestManagementSelection from '../Components/RequestManagement/RequestManagementSelection';\r\nimport RequestManagementViewModelModify from '../Components/RequestManagement/RequestManagementViewModelModify';\r\nimport RequestManagementViewModelNew from '../Components/RequestManagement/RequestManagementViewModelNew';\r\nimport RequestManagementViewModelTerminate from '../Components/RequestManagement/RequestManagementViewModelTerminate';\r\nimport ax7PersonSearchLink from '../Components/RequestManagement/AX7Person/AX7Person.component';\r\nimport UPRolesController from '../Components/RequestManagement/WizardSteps/UniversalProduct/UPRolesController';\r\nimport UPUserInformationController from '../Components/RequestManagement/WizardSteps/UniversalProduct/UPUserInformationController';\r\nimport AADUserInformationController from '../Components/RequestManagement/WizardSteps/AAD/AADUserInformationController';\r\nimport AADRolesController from '../Components/RequestManagement/WizardSteps/AAD/AADRolesController';\r\nimport AADGroupsController from '../Components/RequestManagement/WizardSteps/AAD/AADGroupsController';\r\nimport AADLicensesController from '../Components/RequestManagement/WizardSteps/AAD/AADLicensesController';\r\nimport PSUserInformationController from '../Components/RequestManagement/WizardSteps/PeopleSoft/PSUserInformationController';\r\nimport PSRolesController from '../Components/RequestManagement/WizardSteps/PeopleSoft/PSRolesController';\r\nimport AX7UserGroupsController from '../Components/RequestManagement/WizardSteps/AX7/AXUserGroupsController';\r\nimport AXUserGroupsController from '../Components/RequestManagement/WizardSteps/AX2012/AXUserGroupsController';\r\nimport SAPCompositeRolesController from '../Components/RequestManagement/WizardSteps/SAP/SAPCompositeRolesController';\r\nimport salesforceUserFormController from '../Components/RequestManagement/WizardSteps/Salesforce/salesforceUserForm.controller';\r\nimport salesforceProfileFormController from '../Components/RequestManagement/WizardSteps/Salesforce/salesforceProfileForm.controller';\r\nimport salesforcePermissionSetsController from '../Components/RequestManagement/WizardSteps/Salesforce/salesforcePermissionSets.controller';\r\n\r\nexport default angular\r\n .module('app.identityManager.requestManagement', [identityManagerRequestManagementFactoriesModule, identityManagerRequestManagementServicesModule])\r\n .component('adUserSearchLink', adUserSearchLink)\r\n .component('adUserLookup', adUserLookup)\r\n .component('azureAdUserSearchLink', azureAdUserSearchLink)\r\n .component('azureAdUserLookup', azureAdUserLookup)\r\n .component('ax7PersonSearchLink', ax7PersonSearchLink)\r\n .component('existingUserExpansion', existingUserExpansion)\r\n .controller('AADUserInformationController', AADUserInformationController)\r\n .controller('AADRolesController', AADRolesController)\r\n .controller('AADGroupsController', AADGroupsController)\r\n .controller('AADLicensesController', AADLicensesController)\r\n .controller('UPRolesController', UPRolesController)\r\n .controller('UPUserInformationController', UPUserInformationController)\r\n .controller('AX2012RolesController', AXRolesController)\r\n .controller('AX2012UserInformationController', AXUserInformationController)\r\n .controller('AX2012UserGroupsController', AXUserGroupsController)\r\n .controller('AX7RolesController', AX7RolesController)\r\n .controller('AX7UserGroupsController', AX7UserGroupsController)\r\n .controller('AX7UserInformationController', AX7UserInformationController)\r\n .controller('D365SRolesController', D365SRolesController)\r\n .controller('D365STeamsController', D365STeamsController)\r\n .controller('D365SUserInformationController', D365SUserInformationController)\r\n .controller('GPCompaniesController', GPCompaniesController)\r\n .controller('GPRolesController', GPRolesController)\r\n .controller('GPUserInformationController', GPUserInformationController)\r\n .controller('NAVPermissionSetsController', NAVPermissionSetsController)\r\n .controller('NAVUserGroupsController', NAVUserGroupsController)\r\n .controller('NAVUserInformationController', NAVUserInformationController)\r\n .controller('NSDuplicateUserController', NSDuplicateUserController)\r\n .controller('NSPermissionsController', NSPermissionsController)\r\n .controller('NSRolesController', NSRolesController)\r\n .controller('NSUserInformationController', NSUserInformationController)\r\n .controller('ORResponsibilitiesController', ORResponsibilitiesController)\r\n .controller('ORRolesController', ORRolesController)\r\n .controller('ORUserInformationController', ORUserInformationController)\r\n .controller('ORCloudRolesController', ORCloudRolesController)\r\n .controller('ORCloudUserInformationController', ORCloudUserInformationController)\r\n .controller('EmergencyAccessUsageController', emergencyAccessController)\r\n .controller('SAPRolesController', SAPRolesController)\r\n .controller('SAPCompositeRolesController', SAPCompositeRolesController)\r\n .controller('SAPUserInformationController', SAPUserInformationController)\r\n .controller('salesforceUserFormController', salesforceUserFormController)\r\n .controller('salesforceProfileFormController', salesforceProfileFormController)\r\n .controller('salesforcePermissionSetsController', salesforcePermissionSetsController)\r\n .controller('EffectiveDatesController', EffectiveDatesController)\r\n .controller('RiskAnalysisController', RiskAnalysisController)\r\n .controller(\"RequestManagementSearchExistingUsers\", RequestManagementSearchExistingUsers)\r\n .controller(\"requestManagementSelection\", RequestManagementSelection)\r\n .controller(\"requestManagementModifyViewModel\", RequestManagementViewModelModify)\r\n .controller(\"requestManagementNewViewModel\", RequestManagementViewModelNew)\r\n .controller(\"requestManagementTerminateViewModel\", RequestManagementViewModelTerminate)\r\n .controller('PSUserInformationController', PSUserInformationController)\r\n .controller('PSRolesController', PSRolesController)\r\n .name;","import { customDatePickerFilter, customAutoCompleteFilter, standardGridPageSize, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, SavedReportSelectorService, $filter, CustomReportServices, objectIdDataService, $location, helperService, reportsService, reportsDataService, requestHistoryDataService) {\r\n const vm = this,\r\n timeout = 408;\r\n\r\n vm.runSavedReport = runSavedReport;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.deselectSelectedStatus = deselectSelectedStatus;\r\n vm.viewDetails = viewDetails;\r\n vm.openStartDate = openStartDate;\r\n vm.openEndDate = openEndDate;\r\n vm.applySelectedFilter = applySelectedFilter;\r\n vm.clearAllFilters = clearAllFilters;\r\n vm.onReadGrid = onReadGrid;\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n\r\n vm.startDatePopup = {\r\n opened: false\r\n }\r\n\r\n vm.endDatePopup = {\r\n opened: false\r\n };\r\n\r\n vm.dateCriteria = [\r\n {\r\n DataType: \"DateTime\",\r\n FieldName: \"Date\",\r\n IsNullable: false\r\n }\r\n ];\r\n\r\n vm.hasDetailedVersion = true;\r\n vm.statusSelectedIds = [];\r\n\r\n //Start Date and End Date picker settings\r\n vm.startDateOptions = {\r\n dateDisabled: disabled,\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n vm.endDateOptions = {\r\n showWeeks: false,\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n startingDay: 1\r\n };\r\n\r\n // Set up Grid\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n vm.filterCriteria.dateQuery = [];\r\n // ---\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n activate();\r\n\r\n async function activate() {\r\n if ($location.path().includes('Detailed')) {\r\n vm.isDetailed = true;\r\n vm.urlString = apiUrl + 'api/identitymanager/requests/history/detailed';\r\n vm.requestedDate = { field: \"RequestDate\", dir: \"desc\" }\r\n } else {\r\n vm.isDetailed = false;\r\n vm.urlString = apiUrl + 'api/identitymanager/requests/history';\r\n vm.requestedDate = { field: \"RequestedDate\", dir: \"desc\" }\r\n }\r\n\r\n await setObjectId();\r\n\r\n createRequestHistoryGrid()\r\n await getStatuses();\r\n today();\r\n thirtyDaysAgo();\r\n\r\n await getReportMetadata();\r\n\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n }\r\n\r\n async function setObjectId() {\r\n const objectId = await objectIdDataService.getObjectID();\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectId(objectId);\r\n\r\n vm.ObjectId = objectId;\r\n vm.reportName = securityObject.Name;\r\n vm.reportId = securityObject.ReportID;\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(vm.ObjectId);\r\n }\r\n\r\n function runSavedReport() {\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.statusDataSource && vm.filterCriteria.fields) {\r\n $scope.$evalAsync(() => {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.dateQuery = reportsService.getSavedReportDateFilters();\r\n generateGridWithSelectedValues();\r\n vm.filterCriteria.needsUpdate = true;\r\n });\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.statusDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n };\r\n\r\n async function getStatuses() {\r\n let statuses = await requestHistoryDataService.getStatuses();\r\n\r\n statuses = $filter('orderBy')(statuses.data, 'StatusName');\r\n\r\n vm.allStatusesDropdownObject = { \"StatusName\": \"All Statuses\", \"Id\": 'AllObjectsInMultiSelect' };\r\n statuses.unshift(vm.allStatusesDropdownObject);\r\n\r\n vm.statusDataSource = statuses;\r\n vm.statusSelectedIds = [statuses.first()];\r\n vm.statusSelectedIds = SavedReportSelectorService.checkSavedReportForStatus($rootScope.loadedSavedReport, statuses, vm.statusSelectedIds);\r\n }\r\n\r\n function deselectSelectedStatus() {\r\n vm.statusSelectedIds = helperService.deselectAllObjectsIfOtherIsClicked(vm.statusSelectedIds, vm.allStatusesDropdownObject);\r\n populateCriteriaModel();\r\n };\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (!vm.startDate || !vm.endDate || vm.statusSelectedIds === undefined) {\r\n return;\r\n }\r\n\r\n let criteria = [];\r\n\r\n vm.savedStartDate = helperService.setDateToBeginningOfDay(vm.startDate);\r\n vm.savedEndDate = helperService.setDateToEndOfDay(vm.endDate);\r\n\r\n vm.statuses = helperService.returnNullIfAllIsFound(vm.statusSelectedIds.map(el => el.Id));\r\n\r\n criteria.push(CustomReportServices.CreateCriteria(\"StartDate\", 'StartDate', vm.savedStartDate, vm.savedStartDate));\r\n criteria.push(CustomReportServices.CreateCriteria(\"EndDate\", 'EndDate', vm.savedEndDate, vm.savedEndDate));\r\n vm.statusSelectedIds.forEach((row, i) => criteria.push(CustomReportServices.CreateCriteria(\"Statuses\", 'Status', row.StatusName, row.Id)));\r\n\r\n vm.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0 && vm.reportName) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n };\r\n\r\n function generateGridWithSelectedValues() {\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n if (vm.startDate <= vm.endDate) {\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n\r\n } else {\r\n helperService.showErrorMessage(\"Start Date must be before or equal to End Date\");\r\n }\r\n };\r\n\r\n function createRequestHistoryGrid() {\r\n if (vm.isDetailed === true) {\r\n vm.mainGridColumns = [\r\n { field: \"RequestDate\", title: \"Request Date\", template: \"{{ dataItem.RequestDate | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"Requestor\", title: \"Requestor\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestAction\", title: \"Request Action\", filterable: customAutoCompleteFilter, width: 100 }, \r\n { field: \"AffectedUser\", title: \"Affected User\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"AffectedUserEmail\", title: \"Affected User Email\", filterable: customAutoCompleteFilter, width: 125 },\r\n { field: \"TicketId\", title: \"Ticket ID\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"StatusID\", title: \"Status ID\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestStatus\", title: \"Request Status\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestUserId\", title: \"Request User ID\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestUserName\", title: \"Request User Name\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestUserEventType\", title: \"Request User Event Type\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestUserProductName\", title: \"Request User Product Name\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"UserStartDate\", title: \"User Start Date\", template: \"{{ dataItem.UserStartDate | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"UserEndDate\", title: \"User End Date\", template: \"{{ dataItem.UserEndDate | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"RequestUserStatus\", title: \"Request User Status\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestUserReviewedOn\", title: \"Request User Reviewed On\", template: \"{{ dataItem.RequestUserReviewedOn | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"RequestUserReviewedByName\", title: \"Request User Reviewed By\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestUserIsApproved\", title: \"Request User Is Approved\", filterable: customBooleanFilter, width: 125 },\r\n { field: \"RequestAccessType\", title: \"Request Access Type\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestAccessUserId\", title: \"Request Access User ID\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"Access\", title: \"Access\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestAccessEventType\", title: \"Request Access Event Type\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestAccessProductName\", title: \"Request Access Product Name\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"AccessStartDate\", title: \"Access Start Date\", template: \"{{ dataItem.AccessStartDate | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"AccessEndDate\", title: \"Access End Date\", template: \"{{ dataItem.AccessEndDate | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"RequestAccessStatus\", title: \"Request Access Status\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestAccessReviewedOn\", title: \"Request Access Reviewed On\", template: \"{{ dataItem.RequestAccessReviewedOn | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"RequestAccessReviewedByName\", title: \"Request Access Reviewed By\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestAccessIsApproved\", title: \"Request Access Is Approved\", filterable: customBooleanFilter, width: 125 },\r\n { field: \"ApprovalNotes\", title: \"Approval Notes\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestorNotes\", title: \"Requestor Notes\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestorEmail\", title: \"Requestor Email\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"CancelledBy\", title: \"Cancelled By\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"CancelledComments\", title: \"Cancelled Comments\", filterable: customAutoCompleteFilter, width: 350 },\r\n { template: 'Details', title: \"\", width: 100 }\r\n ];\r\n } else {\r\n vm.mainGridColumns = [\r\n { field: \"RequestedDate\", title: \"Request Date\", template: \"{{ dataItem.RequestedDate | date: 'short'}} \", filterable: customDatePickerFilter, width: 100 },\r\n { field: \"RequestorName\", title: \"Requestor\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestAction\", title: \"Request Action\", filterable: customAutoCompleteFilter, width: 100 }, \r\n { field: \"AffectedObjectUserName\", title: \"Affected User\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"AffectedUserEmail\", title: \"Affected User Email\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"TicketId\", title: \"Ticket ID\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"Status\", title: \"Status\", filterable: customAutoCompleteFilter, width: 100 },\r\n { template: 'Details', title: \"\", width: 100 }\r\n ];\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n RequestedDate: { type: \"date\" },\r\n RequestDate: { type: \"date\" },\r\n UserStartDate: { type: \"date\" },\r\n UserEndDate: { type: \"date\" },\r\n AccessStartDate: { type: \"date\" },\r\n AccessEndDate: { type: \"date\" },\r\n RequestUserIsApproved: { type: \"boolean\" },\r\n RequestAccessIsApproved: { type: \"boolean\" },\r\n RequestUserReviewedOn: { type: \"date\" },\r\n RequestAccessReviewedOn: { type: \"date\" },\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n sort: vm.requestedDate,\r\n transport: {\r\n read: async options => {\r\n delete $rootScope.loadedSavedReport;\r\n let payLoad = {\r\n StartDate: vm.savedStartDate,\r\n EndDate: vm.savedEndDate,\r\n Statuses: vm.statuses\r\n };\r\n\r\n vm.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n payLoad['QueryInput'] = vm.sortsAndFilters;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n payLoad['QueryInput'].Filters = payLoad['QueryInput'].Filters.concat(vm.filterCriteria.query);\r\n payLoad['QueryInput'].DateFilters = vm.filterCriteria.dateQuery;\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n try {\r\n let { data } = await requestHistoryDataService.getRequests(vm.urlString, payLoad, { params: { 'pagesize': options.data.pageSize, 'page': options.data.page } }),\r\n reportData = data._embedded.reportData;\r\n\r\n reportData.forEach(row => {\r\n if (row.AffectedObject) {\r\n const AffectedObject = JSON.parse(row.AffectedObject);\r\n if (AffectedObject) {\r\n row[\"AffectedObjectUserName\"] = AffectedObject.Name;\r\n }\r\n }\r\n });\r\n\r\n options.success(data);\r\n vm.enableGrid = true;\r\n } catch (error) {\r\n if (error.status !== timeout) {\r\n helperService.showErrorMessage(error.data);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n setLayout();\r\n }\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm, null);\r\n }\r\n }\r\n\r\n function viewDetails(dataItem) {\r\n const data = JSON.stringify(vm.gridDataSource.data());\r\n if (data) {\r\n localStorage.setItem(\"requestHistoryReportData\", data);\r\n }\r\n $location.path('/IdentityManager/RequestDetails').search({ RequestId: dataItem.RequestId, Version: dataItem.RequestVersion });\r\n }\r\n\r\n //Set Datetime for start and end date time pickers\r\n function today() {\r\n vm.endDate = new Date();\r\n vm.endDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"EndDate\", vm.endDate);\r\n }\r\n\r\n function thirtyDaysAgo() {\r\n let newDate = new Date();\r\n\r\n newDate.setDate(newDate.getDate() - 30);\r\n vm.startDate = newDate;\r\n vm.startDate = SavedReportSelectorService.checkSavedReportForDate($rootScope.loadedSavedReport, \"StartDate\", vm.startDate);\r\n };\r\n\r\n function disabled(data) {\r\n let date = data.date,\r\n mode = data.mode;\r\n\r\n return mode === 'day' && date > vm.endDate;\r\n }\r\n\r\n function openStartDate() {\r\n vm.startDatePopup.opened = true;\r\n }\r\n\r\n function openEndDate() {\r\n vm.endDatePopup.opened = true;\r\n }\r\n\r\n function applySelectedFilter() {\r\n helperService.applyFilterCatchError(vm);\r\n }\r\n\r\n // apply filters for Detailed report toolbar\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function clearAllFilters() {\r\n vm.gridDataSource.filter({});\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function getReportMetadata() {\r\n let data = await reportsDataService.getReportMetadata(vm.reportId);\r\n\r\n vm.reportMetadata = data.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n\r\n return vm.reportMetadata;\r\n }\r\n}\r\n","import controller from \"./requestHistory.controller\";\r\n\r\n/* requestHistory.component.js */\r\n\r\n/**\r\n * @desc component for identity manager request history\r\n * @example \r\n */\r\n\r\nconst requestHistory = {\r\n controller: controller,\r\n controllerAs: 'rhvm',\r\n templateUrl: '/App/Components/requestHistory/requestHistory.tmpl.html'\r\n};\r\n\r\nexport default requestHistory;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, approvalRulesDataService, $filter, helperService) {\r\n\r\n const vm = this;\r\n vm.updatedPriorities = [];\r\n\r\n vm.priorityChanged = priorityChanged;\r\n vm.updateRuleTypes = updateRuleTypes;\r\n vm.dismiss = dismiss;\r\n\r\n activate();\r\n\r\n function activate() {\r\n getApprovalRuleTypes();\r\n }\r\n\r\n async function getApprovalRuleTypes() {\r\n let response = await approvalRulesDataService.getApprovalRuleTypes();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.approvalRuleTypesDataSource = response.data;\r\n }\r\n\r\n function priorityChanged(ruleType) {\r\n if (ruleType.Priority > 0) {\r\n const ruleTypeToUpdate = {\r\n Id: ruleType.Id,\r\n Priority: ruleType.Priority\r\n };\r\n const ruleTypeIndex = vm.updatedPriorities.findIndex(e => e.Id === ruleType.Id);\r\n if (ruleTypeIndex < 0) {\r\n vm.updatedPriorities.push(ruleTypeToUpdate);\r\n } else {\r\n vm.updatedPriorities[ruleTypeIndex] = ruleTypeToUpdate;\r\n }\r\n }\r\n }\r\n\r\n async function updateRuleTypes() {\r\n vm.updateInProgress = new createSpinner();\r\n const ruleTypes = vm.updatedPriorities;\r\n try {\r\n for (const ruleType of ruleTypes) {\r\n await approvalRulesDataService.updateApprovalRuleType(ruleType.Id, ruleType);\r\n }\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n cancel();\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, dataService, manageDataDataService, configurationDataService, requesterGroupsDataService, approvalGroupsDataService, riskLevelsData, $http, helperService, approvalRulesDataService, supervisorRuleDisabled, allCompaniesRuleDisabled, companyTemplatesData, ownershipGroupsDataService, modalType, approvalRule) {\r\n\r\n const vm = this;\r\n\r\n vm.supervisorRuleDisabled = supervisorRuleDisabled;\r\n vm.allCompaniesRuleDisabled = allCompaniesRuleDisabled;\r\n\r\n vm.helperService = helperService;\r\n vm.dismiss = dismiss;\r\n vm.saveApprovalRule = saveApprovalRule;\r\n vm.ruleTypeDropdownChange = ruleTypeDropdownChange;\r\n vm.productDropdownChange = productDropdownChange;\r\n vm.enforceCompanyApprovalRulesChange = enforceCompanyApprovalRulesChange;\r\n vm.userGroupDropdownChange = userGroupDropdownChange;\r\n vm.dropdownChange = dropdownChange;\r\n vm.modalType = modalType;\r\n vm.updateAutoApproveUser = updateAutoApproveUser; \r\n\r\n vm.updateInProgress = false;\r\n vm.configUpdated = false;\r\n vm.dropdownsLoaded = false;\r\n if (modalType === 'Edit') {\r\n vm.disableSaveButton = true;\r\n } else {\r\n vm.disableSaveButton = false;\r\n }\r\n vm.approversList = [];\r\n vm.availableProducts = [];\r\n\r\n\r\n activate();\r\n\r\n async function activate() { \r\n vm.ruleTypesLoading = true;\r\n vm.approversLoading = true;\r\n vm.usersLoading = true;\r\n vm.hideApproverSection = false;\r\n vm.saveEnforceApprovalRulesConfig = false;\r\n await getRuleTypes();\r\n selectInitialRuleType();\r\n if (vm.availableProducts.some(prod => prod.ID === 'AX7')) {\r\n let companyApprovalRuleConfig = await configurationDataService.getProductConfigurationValueByName('ax7', 'AX7_ImEnforceCompanyApprovalRules');\r\n vm.AX7_ImEnforceCompanyApprovalRules = companyApprovalRuleConfig.data.Value; \r\n }\r\n setEnforceApprovalRulesToggle();\r\n await getUsers();\r\n await getApprovalGroups();\r\n getRiskLevels();\r\n getApplications();\r\n getCompanyTemplates();\r\n if (vm.selectedRuleType !== 7 && vm.selectedRuleType !== 2) {\r\n filterApproverDropdown();\r\n }\r\n vm.dropdownsLoaded = true;\r\n }\r\n\r\n function setEnforceApprovalRulesToggle() { \r\n //define toggle default value to False when adding new rule\r\n if (modalType === 'Edit') {\r\n vm.enforceCompanyApprovalRules = vm.AX7_ImEnforceCompanyApprovalRules;\r\n } else {\r\n vm.enforceCompanyApprovalRules = '0';\r\n }\r\n }\r\n\r\n function updateAutoApproveUser() {\r\n if (modalType === 'Edit') {\r\n vm.disableSaveButton = false;\r\n if (!vm.autoApproveUser && !vm.selectedApprover) {\r\n vm.selectedApprover = vm.approverUserGroupDataSource[0];\r\n }\r\n }\r\n }\r\n\r\n async function selectInitialRuleType() {\r\n vm.isUser = true;\r\n vm.isRole = false;\r\n vm.isRiskTolerance = false;\r\n vm.isApplication = false;\r\n vm.isGroup = false;\r\n vm.isRequest = false;\r\n vm.isCompany = false;\r\n vm.isCompanyTemplate = false;\r\n vm.requestApplicationDataSource = [\r\n {\r\n Name: 'New',\r\n Id: 1\r\n },\r\n {\r\n Name: 'Modify',\r\n Id: 2\r\n },\r\n {\r\n Name: 'Terminate',\r\n Id: 3\r\n }\r\n ];\r\n vm.selectedRequest = vm.requestApplicationDataSource[0];\r\n\r\n if (modalType === 'Edit') {\r\n vm.isUser = false;\r\n switch (approvalRule.TypeId) {\r\n case 1:\r\n vm.isUser = true;\r\n break;\r\n case 2:\r\n vm.isRole = true;\r\n await getRoleOwnershipGroups();\r\n break;\r\n case 3:\r\n vm.isRiskTolerance = true;\r\n vm.riskToleranceLoading = true;\r\n break;\r\n case 4:\r\n vm.isApplication = true;\r\n vm.applicationLoading = true;\r\n break;\r\n case 6:\r\n vm.isRequest = true;\r\n vm.selectedRequest = vm.requestApplicationDataSource.find(requestAction => requestAction.Name === approvalRule.RequesterName);\r\n break;\r\n case 8:\r\n vm.isCompany = true;\r\n vm.companiesDropdownLoading = true;\r\n await getProducts();\r\n break;\r\n case 9:\r\n vm.isCompanyTemplate = true;\r\n vm.companyTemplatesLoading = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n async function getRuleTypes() {\r\n let response = await approvalRulesDataService.getApprovalRuleTypes();\r\n if (vm.supervisorRuleDisabled) {\r\n response.data = response.data.filter(ruleType => ruleType.Name !== 'Supervisor');\r\n }\r\n\r\n let showCompanyType = false;\r\n await getProducts();\r\n\r\n if (vm.availableProducts.some(prod => prod.ID === 'AX' || prod.ID === 'GP' || prod.ID === 'D365S' || prod.ID === 'AX7' || prod.ID === 'NAV')) {\r\n showCompanyType = true;\r\n }\r\n\r\n if (!showCompanyType) {\r\n response.data = response.data.filter(ruleType => ruleType.Name !== 'Company');\r\n }\r\n\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.ruleTypeDataSource = response.data;\r\n if (modalType === 'Edit') {\r\n vm.selectedRuleType = approvalRule.TypeId;\r\n vm.autoApproveUser = approvalRule.AutoApproveUser;\r\n } else {\r\n vm.selectedRuleType = 1;\r\n }\r\n vm.ruleTypesLoading = false;\r\n return vm.ruleTypeDataSource;\r\n }\r\n\r\n async function getUsers() {\r\n vm.userGroupDataSource = [];\r\n const users = await dataService.getUsers();\r\n vm.usersDataSource = $filter('filter')(users.data, { Active: true });\r\n vm.usersDataSource.forEach(user => {\r\n vm.userGroupDataSource.push({ Name: user.UserLogonName, Id: user.UserID, Type: 'User' });\r\n });\r\n\r\n const requesterGroupResponse = await requesterGroupsDataService.getRequesterGroups();\r\n requesterGroupResponse.data.forEach(group => {\r\n vm.userGroupDataSource.push({ Name: group.Name, Id: group.Id, Type: 'Group' });\r\n });\r\n\r\n if (vm.userGroupDataSource.length > 0 && modalType === 'Edit' && approvalRule.RequesterType === 'User') {\r\n vm.selectedUser = vm.userGroupDataSource.find(user => user.Name === approvalRule.RequesterName);\r\n } else if (vm.userGroupDataSource.length > 0) {\r\n vm.selectedUser = vm.userGroupDataSource[0];\r\n }\r\n vm.usersLoading = false;\r\n\r\n return vm.userGroupDataSource;\r\n }\r\n\r\n async function getApprovalGroups() {\r\n const approvalGroups = await approvalGroupsDataService.getApprovalGroups();\r\n approvalGroups.data.forEach(group => {\r\n vm.approversList.push({ Name: group.Name, Id: group.Id, Type: 'Group' });\r\n });\r\n vm.usersDataSource.forEach(user => {\r\n vm.approversList.push({ Name: user.UserLogonName, Id: user.UserID, Type: 'User' });\r\n });\r\n vm.approversList = $filter('orderBy')(vm.approversList, 'Name');\r\n vm.approversLoading = false;\r\n return vm.approversList;\r\n }\r\n\r\n async function getRiskLevels() {\r\n vm.riskToleranceLoading = true;\r\n let response = await riskLevelsData.getRiskLevels();\r\n vm.riskDataSource = response.data;\r\n if (vm.riskDataSource.length > 0 && modalType === 'Edit' && approvalRule.RequesterType === 'Risk Tolerance') {\r\n vm.selectedRiskTolerance = vm.riskDataSource.find(riskLevel => riskLevel.Name === approvalRule.RequesterName);\r\n } else if (vm.riskDataSource.length > 0) {\r\n vm.selectedRiskTolerance = vm.riskDataSource[0];\r\n }\r\n vm.riskToleranceLoading = false;\r\n }\r\n\r\n async function getApplications() {\r\n vm.applicationLoading = true;\r\n let response = await $http.get(apiUrl + 'api/identitymanager/applications');\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.applicationDataSource = response.data;\r\n if (vm.applicationDataSource.length > 0 && modalType === 'Edit' && approvalRule.RequesterType === 'Application') {\r\n vm.selectedApplication = vm.applicationDataSource.find(application => application.Name === approvalRule.RequesterName);\r\n } else if (vm.applicationDataSource && vm.applicationDataSource.length > 0) {\r\n vm.selectedApplication = vm.applicationDataSource[0];\r\n }\r\n vm.applicationLoading = false;\r\n }\r\n\r\n async function getCompanyTemplates() {\r\n vm.companyTemplatesLoading = true;\r\n let response = await companyTemplatesData.getCompanyTemplates();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.companyTemplateDataSource = response.data;\r\n\r\n\r\n\r\n if (vm.companyTemplateDataSource.length === 0) {\r\n vm.companyTemplateDataSource.unshift({ \"Companies\": null, \"Id\": null, \"Name\": \"-- No Company Templates Available --\" });\r\n vm.selectedCompanyTemplate = vm.companyTemplateDataSource[0];\r\n } else if (vm.companyTemplateDataSource.length > 0 && modalType === 'Edit' && approvalRule.RequesterType === 'Company Template') {\r\n vm.selectedCompanyTemplate = vm.companyTemplateDataSource.find(companyTemplate => companyTemplate.Id === approvalRule.RequesterId);\r\n } else {\r\n vm.selectedCompanyTemplate = vm.companyTemplateDataSource[0];\r\n }\r\n\r\n vm.companyTemplatesLoading = false;\r\n\r\n }\r\n\r\n async function getProducts() {\r\n vm.productsLoading = true;\r\n let response = await $http.get(`${apiUrl}api/core/modules/identitymanager/products`);\r\n vm.availableProducts = response.data;\r\n if (vm.isCompany) {\r\n vm.productsDataSource = vm.availableProducts.filter(product => product.ID === 'AX' || product.ID === 'AX7' || product.ID === 'NAV' || product.ID === 'D365S' || product.ID === 'GP');\r\n }\r\n\r\n vm.productsDataSource = response.data;\r\n if (response.data.length > 0 && modalType === 'Edit' && approvalRule.ProductId) {\r\n vm.selectedProduct = vm.productsDataSource.find(product => product.ID === approvalRule.ProductId);\r\n } else if (response.data.length > 0) {\r\n vm.selectedProduct = response.data[0];\r\n }\r\n vm.productsLoading = false;\r\n if (vm.isCompany) {\r\n loadCompanies();\r\n }\r\n return vm.availableProducts;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n //Functions\r\n\r\n function saveApprovalRule() {\r\n let postBody = {};\r\n\r\n switch (vm.selectedRuleType) {\r\n case 1:\r\n postBody.RequesterId = vm.selectedUser.Id;\r\n postBody.RequesterType = vm.selectedUser.Type;\r\n postBody.RequesterName = vm.selectedUser.Name;\r\n break;\r\n case 2:\r\n postBody.RequesterId = vm.selectedOwnershipGroup.Id;\r\n postBody.RequesterType = 'RoleOwnershipGroup';\r\n break;\r\n case 3:\r\n postBody.RequesterId = vm.selectedRiskTolerance.Id;\r\n postBody.RequesterName = vm.selectedRiskTolerance.Name;\r\n postBody.RequesterType = 'RiskTolerance';\r\n break;\r\n case 4:\r\n postBody.RequesterId = vm.selectedApplication.Id;\r\n postBody.RequesterName = vm.selectedApplication.Name;\r\n postBody.RequesterType = 'Application';\r\n break;\r\n case 5:\r\n break;\r\n case 6:\r\n postBody.RequesterId = vm.selectedRequest.Id;\r\n postBody.RequesterName = vm.selectedRequest.Name;\r\n postBody.AutoApproveUser = vm.autoApproveUser;\r\n postBody.RequesterType = 'RequestAction';\r\n break;\r\n case 7:\r\n break;\r\n case 8:\r\n postBody.ConfigUpdated = false;\r\n\r\n if (vm.selectedCompany.ID === '-1') {\r\n vm.saveEnforceApprovalRulesConfig = true;\r\n }\r\n\r\n if (vm.configUpdated) {\r\n postBody.ConfigUpdated = true;\r\n }\r\n\r\n postBody.RequesterId = vm.selectedCompany.ID;\r\n postBody.RequesterName = vm.selectedCompany.Name;\r\n postBody.ProductId = vm.selectedCompany.ProductID;\r\n postBody.RequesterType = 'Company';\r\n break;\r\n case 9:\r\n postBody.RequesterId = vm.selectedCompanyTemplate.Id;\r\n postBody.RequesterName = vm.selectedCompanyTemplate.Name;\r\n postBody.RequesterType = 'CompanyTemplate';\r\n break;\r\n default:\r\n postBody.RequesterId = vm.selectedCompanyTemplate.Id;\r\n postBody.RequesterName = vm.selectedCompanyTemplate.Name;\r\n postBody.RequesterType = 'CompanyTemplate';\r\n break;\r\n }\r\n\r\n postBody.TypeId = vm.selectedRuleType;\r\n\r\n if (vm.selectedRuleType !== 7 && vm.selectedRuleType !== 2 && !vm.autoApproveUser) {\r\n postBody.ApproverId = vm.enforceCompanyApprovalRules === '1' ? null : vm.selectedApprover.Id;\r\n postBody.ApproverType = vm.enforceCompanyApprovalRules === '1' ? null : vm.selectedApprover.Type;\r\n postBody.ApproverName = vm.enforceCompanyApprovalRules === '1' ? null : vm.selectedApprover.Name;\r\n }\r\n\r\n if (modalType === 'Edit') {\r\n postBody.ApprovalRuleId = approvalRule.Id;\r\n }\r\n\r\n addRule(postBody);\r\n }\r\n\r\n async function addRule(data) {\r\n vm.updateInProgress = new createSpinner();\r\n try {\r\n if (vm.saveEnforceApprovalRulesConfig) {\r\n let configData = {\r\n \"Configurations\": [{\r\n \"Name\": 'AX7_ImEnforceCompanyApprovalRules',\r\n \"Value\": vm.enforceCompanyApprovalRules\r\n }],\r\n \"ProductId\": data.ProductId\r\n };\r\n\r\n await manageDataDataService.setProductConfiguration(data.ProductId, configData);\r\n }\r\n\r\n if (modalType === 'Edit') {\r\n await approvalRulesDataService.updateApprovalRule(approvalRule.Id, data);\r\n } else {\r\n await approvalRulesDataService.addApprovalRule(data);\r\n }\r\n\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n cancel();\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function userGroupDropdownChange() {\r\n vm.disableSaveButton = false;\r\n filterApproverDropdown();\r\n }\r\n\r\n function dropdownChange() {\r\n vm.disableSaveButton = false;\r\n }\r\n\r\n async function ruleTypeDropdownChange() {\r\n vm.isUser = false;\r\n vm.isRole = false;\r\n vm.isRiskTolerance = false;\r\n vm.isApplication = false;\r\n vm.isRequest = false;\r\n vm.isCompany = false;\r\n vm.isCompanyTemplate = false;\r\n\r\n switch (vm.selectedRuleType) {\r\n case 1:\r\n vm.isUser = true;\r\n break;\r\n case 2:\r\n vm.isRole = true;\r\n await getRoleOwnershipGroups();\r\n break;\r\n case 3:\r\n vm.isRiskTolerance = true;\r\n break;\r\n case 4:\r\n vm.isApplication = true;\r\n break;\r\n case 6:\r\n vm.isRequest = true;\r\n break;\r\n case 8:\r\n vm.isCompany = true;\r\n await getProducts();\r\n break;\r\n case 9:\r\n vm.isCompanyTemplate = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n filterApproverDropdown();\r\n }\r\n\r\n function productDropdownChange() {\r\n vm.disableSaveButton = false;\r\n if (vm.isCompany) {\r\n loadCompanies();\r\n }\r\n }\r\n\r\n function enforceCompanyApprovalRulesChange(toggled) {\r\n if (vm.selectedCompany.Name === 'All Companies' && vm.enforceCompanyApprovalRules === '1') {\r\n vm.hideApproverSection = true;\r\n } else {\r\n vm.hideApproverSection = false;\r\n }\r\n\r\n if (toggled) {\r\n vm.updateConfig = true;\r\n }\r\n vm.disableSaveButton = false;\r\n }\r\n\r\n async function getRoleOwnershipGroups() {\r\n vm.ownershipGroupsDropdownLoading = true;\r\n let { data } = await ownershipGroupsDataService.getOwnershipGroups();\r\n vm.roleOwnershipGroupsDataSource = data.filter(group => group.GroupType === 'role');\r\n\r\n if (vm.roleOwnershipGroupsDataSource.length === 0) {\r\n vm.roleOwnershipGroupsDataSource.unshift({ \"GroupType\": \"Role\", \"Name\": \"-- No Ownership Groups Available --\", \"Id\": null });\r\n vm.selectedOwnershipGroup = vm.roleOwnershipGroupsDataSource[0];\r\n } else if (vm.roleOwnershipGroupsDataSource.length > 0 && modalType === 'Edit' && approvalRule.RequesterType === 'Role Ownership Group') {\r\n vm.selectedOwnershipGroup = vm.roleOwnershipGroupsDataSource.find(ownershipGroup => ownershipGroup.Id.toString() === approvalRule.RequesterId);\r\n } else {\r\n vm.selectedOwnershipGroup = vm.roleOwnershipGroupsDataSource[0];\r\n }\r\n\r\n vm.ownershipGroupsDropdownLoading = false;\r\n }\r\n\r\n\r\n async function loadCompanies() {\r\n vm.companiesDropdownLoading = true;\r\n let response;\r\n if (vm.selectedProduct.Type === 'AX7') {\r\n let allCompaniesOption = {\r\n Name: 'All Companies',\r\n ID: '-1',\r\n Type: 'All',\r\n ProductID: vm.selectedProduct.ID\r\n };\r\n\r\n // we need an alternate call for D365FSC companies so we can include Org Hierarchies\r\n response = await $http.get(`${apiUrl}api/identitymanager/ax7/companies`);\r\n response.data = response.data.map(company => {\r\n return {\r\n Name: company.CompanyName,\r\n ID: company.CompanyId,\r\n Type: company.CompanyType,\r\n ProductID: vm.selectedProduct.ID\r\n }\r\n });\r\n\r\n if (!vm.allCompaniesRuleDisabled || (modalType === 'Edit' && approvalRule.RequesterId === '-1')) {\r\n response.data.push(allCompaniesOption);\r\n }\r\n } else {\r\n response = await dataService.getCompaniesByProductId(vm.selectedProduct.ID);\r\n }\r\n vm.companiesDataSource = response.data;\r\n vm.companiesDataSource = $filter('orderBy')(vm.companiesDataSource, 'Name');\r\n if (modalType === 'Edit' && approvalRule.TypeName === 'Company') {\r\n vm.selectedCompany = vm.companiesDataSource.find(company => company.ID === approvalRule.RequesterId);\r\n } else {\r\n vm.selectedCompany = vm.companiesDataSource[0];\r\n }\r\n\r\n enforceCompanyApprovalRulesChange(false);\r\n\r\n vm.companiesDropdownLoading = false;\r\n }\r\n\r\n //If user is the selected rule type remove the selected user from the approver list\r\n function filterApproverDropdown() {\r\n if (vm.selectedRuleType === 1) {\r\n vm.approverUserGroupDataSource = vm.approversList.filter(approver => approver.Id !== vm.selectedUser.Id);\r\n //Remove the Default Approver group from the approver list\r\n vm.approverUserGroupDataSource = vm.approverUserGroupDataSource.filter(userGroup => userGroup.Id !== 'da812a09-e9e3-46bf-9c8f-32d267b12440');\r\n\r\n if (vm.approverUserGroupDataSource.length > 0 && (!vm.selectedApprover || vm.selectedApprover.Id === vm.selectedUser.Id) && modalType === 'Edit' && approvalRule) {\r\n vm.selectedApprover = vm.approverUserGroupDataSource.find(approver => approver.Id === approvalRule.ApproverId);\r\n } else if (vm.approverUserGroupDataSource.length > 0 && (!vm.selectedApprover || vm.selectedApprover.Id === vm.selectedUser.Id)) {\r\n vm.selectedApprover = vm.approverUserGroupDataSource[0];\r\n }\r\n }\r\n else {\r\n //Remove the Default Approver group from the approver list\r\n vm.approverUserGroupDataSource = vm.approversList.filter(approver => approver.Id !== 'da812a09-e9e3-46bf-9c8f-32d267b12440');\r\n\r\n if (vm.approverUserGroupDataSource.length > 0 && (!vm.selectedApprover || vm.selectedApprover.Id === vm.selectedUser.Id) && modalType === 'Edit' && approvalRule) {\r\n vm.selectedApprover = vm.approverUserGroupDataSource.find(approver => approver.Id === approvalRule.ApproverId);\r\n\r\n if (!vm.selectedApprover && vm.isCompany) {\r\n vm.selectedApprover = vm.approverUserGroupDataSource[0];\r\n }\r\n }\r\n }\r\n }\r\n}","import { standardGridPageSize, customAutoCompleteFilter, customBooleanFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport ruleTypePriorityModalController from \"./RuleTypePriorityModal/ruleTypePriorityModal.controller\";\r\nimport swal from \"sweetalert2\";\r\nimport newEditApprovalRuleModalController from \"./NewEditApprovalRuleModal/newEditApprovalRuleModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (approvalRulesDataService, $filter, helperService, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.openNewEditModal = openNewEditModal;\r\n vm.openRuleTypePriorityModal = openRuleTypePriorityModal;\r\n vm.deleteRule = deleteRule;\r\n\r\n async function activate() {\r\n let data = await helperService.getConfigurationValue('IM_SODThresholdNewOnly');\r\n vm.IM_SODThresholdNewOnly = data;\r\n\r\n const approvalRulesGridColumns = [\r\n { field: \"TypeName\", title: \"Approval Rule Type\", filterable: customAutoCompleteFilter, width: 125 },\r\n { field: \"RequesterType\", title: \"Requested Type\", filterable: customAutoCompleteFilter },\r\n { field: \"ProductName\", title: \"Product\", filterable: customAutoCompleteFilter },\r\n { field: \"RequesterName\", title: \"Requested\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"ApproverType\", title: \"Approver Type\", filterable: customAutoCompleteFilter },\r\n { field: \"ApproverName\", title: \"Approver\", filterable: customAutoCompleteFilter },\r\n { field: \"AutoApproveUser\", title: \"Auto Approve User\", filterable: customBooleanFilter, width: 150 },\r\n { template: `Edit`, \"title\": \"Edit\", width: 65 },\r\n { template: `Delete`, \"title\": \"Delete\", width: 75 }\r\n ];\r\n\r\n vm.approvalRulesGridOptions = helperService.setMainGridOptions(approvalRulesGridColumns, 600);\r\n vm.approvalRulesGridOptions.selectable = false;\r\n\r\n vm.approvalRulesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n AutoApproveUser: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n\r\n read: async options => {\r\n try {\r\n let response = await approvalRulesDataService.getApprovalRules();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n response.data.forEach(rule => {\r\n rule.RequesterType = $filter('insertSpaceBetweenCapitalWordsAndAcronyms')(rule.RequesterType);\r\n });\r\n options.success(response.data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n activate();\r\n\r\n\r\n\r\n async function openNewEditModal(approvalRule, modalType) {\r\n const supervisorRuleExists = vm.approvalRulesGridDataSource._data.some(rule => rule.TypeName === 'Supervisor');\r\n const allCompaniesRuleExists = vm.approvalRulesGridDataSource._data.some(rule => rule.RequesterName === 'All Companies');\r\n\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/ApprovalRules/NewEditApprovalRuleModal/newEditApprovalRuleModal.html',\r\n controller: newEditApprovalRuleModalController,\r\n controllerAs: 'nearmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n supervisorRuleDisabled: () => supervisorRuleExists,\r\n allCompaniesRuleDisabled: () => allCompaniesRuleExists,\r\n modalType: () => modalType,\r\n approvalRule: () => approvalRule\r\n }\r\n });\r\n\r\n try {\r\n await openModal.result;\r\n vm.approvalRulesGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openRuleTypePriorityModal() {\r\n vm.configDropdownOpen = false;\r\n let rulePriorityModal = $uibModal.open({\r\n templateUrl: '/App/Components/ApprovalRules/RuleTypePriorityModal/ruleTypePriorityModal.html',\r\n controller: ruleTypePriorityModalController,\r\n controllerAs: 'rtpmvm',\r\n backdrop: 'static'\r\n });\r\n\r\n try {\r\n await rulePriorityModal.result;\r\n return;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteRule(approvalRuleId) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Rule', 'Are you sure you want to this rule?', 'Delete'));\r\n await approvalRulesDataService.removeApprovalRule(approvalRuleId);\r\n vm.approvalRulesGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n}","/* approvalRules.component.js */\r\n\r\nimport approvalRulesController from \"./approvalRules.controller\";\r\n\r\n/**\r\n * @desc component for creating, updating, and deleting Approval Rules\r\n * @example \r\n */\r\n\r\nconst approvalRules = {\r\n controller: approvalRulesController,\r\n controllerAs: 'arvm',\r\n templateUrl: '/App/Components/ApprovalRules/approvalRules.tmpl.html'\r\n};\r\n\r\nexport default approvalRules;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getRequests,\r\n getStatuses\r\n };\r\n\r\n return factory;\r\n\r\n async function getRequests(url, data, config) {\r\n try {\r\n return await $http.post(url, data, config);\r\n } catch (err) {\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getStatuses() {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/requests/statuses`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","import { customAutoCompleteFilter, customDatePickerFilter, customYesNoBooleanFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $http, $location, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.saveConfiguration = saveConfiguration;\r\n vm.viewDetails = viewDetails;\r\n\r\n async function activate() {\r\n vm.origValue = await helperService.getConfigurationValue('IM_ReminderThreshold');\r\n vm.IM_ReminderThreshold = vm.origValue;\r\n\r\n createOutstandingApprovalsGridDataSource();\r\n\r\n const columnsFromVM = [\r\n { field: \"RequestorName\", title: \"Requestor Name\", filterable: customAutoCompleteFilter },\r\n { field: \"GeneralUser.Name\", title: \"Affected User\", filterable: customAutoCompleteFilter },\r\n { field: \"GeneralUser.Email\", title: \"Affected User Email\", filterable: customAutoCompleteFilter },\r\n { field: \"AffectedType\", title: \"Affected Type\", filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"TicketIds\", title: \"Ticket ID\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"RequestedDate\", title: \"Request Date\", template: \"{{dataItem.RequestedDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"ExpirationDate\", title: \"Expiration Date\", template: \"{{dataItem.ExpirationDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"Action\", template: \"{{ dataItem.Action | insertSpaceBetweenCapitalWords }}\", filterable: customAutoCompleteFilter },\r\n { field: \"Status\", template: \"{{dataItem.Status | insertSpaceBetweenCapitalWords}}\", filterable: customAutoCompleteFilter }, { field: \"CanIReview\", title: \"Requires Your Review\", template: \"{{dataItem.CanIReview | booleanToYesNo}}\", filterable: customYesNoBooleanFilter },\r\n { template: \"Details\", \"title\": \"Details\", width: 100 }\r\n ];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(columnsFromVM, 600);\r\n }\r\n\r\n activate();\r\n\r\n function saveConfiguration() {\r\n vm.origValue = vm.IM_ReminderThreshold;\r\n helperService.setConfigurationValueClosePopup('IM_ReminderThreshold', vm.IM_ReminderThreshold, vm);\r\n }\r\n\r\n function createOutstandingApprovalsGridDataSource() {\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let { data } = await $http.get(`${apiUrl}api/identitymanager/requests/outstanding`);\r\n data = $filter('orderBy')(data, 'RequestedDate', true);\r\n\r\n data.forEach(row => {\r\n if (row.AffectedObject) {\r\n let AffectedObject = JSON.parse(row.AffectedObject);\r\n if (AffectedObject) {\r\n row[\"AffectedObjectUserName\"] = AffectedObject.Name;\r\n }\r\n }\r\n });\r\n options.success(data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n },\r\n schema: {\r\n model: {\r\n fields: {\r\n RequestedDate: { type: \"date\" },\r\n ExpirationDate: { type: \"date\" },\r\n CanIReview: { type: \"boolean\" },\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function viewDetails(dataItem) {\r\n $location.path('/IdentityManager/RequestDetails').search({ RequestId: dataItem.Id, Version: dataItem.Version });\r\n }\r\n}\r\n","/* outstandingApprovalsGrid.component.js */\r\n\r\nimport outstandingApprovalsGridController from \"./outstandingApprovalsGrid.controller\";\r\n\r\n/**\r\n * @desc component to display Outstanding Approvals Grid\r\n * @example \r\n */\r\n\r\nconst outstandingApprovalsGrid = {\r\n controller: outstandingApprovalsGridController,\r\n controllerAs: 'oagvm',\r\n templateUrl: '/App/Components/outstandingApprovals/outstandingApprovalsGrid.tmpl.html'\r\n};\r\n\r\nexport default outstandingApprovalsGrid;","import angular from 'angular';\r\nimport identityManagerFactoriesModule from './identityManager.factories.module';\r\nimport IdentityManagerRequestDetailsViewModel from '../Components/IdentityManagerRequestDetails/IdentityManagerRequestDetailsViewModel';\r\nimport openRequests from '../Components/openRequests/openRequests.component';\r\nimport identityManagerRequestManagementModule from './identityManager.requestManagement.module';\r\nimport requestHistory from '../Components/requestHistory/requestHistory.component';\r\nimport approvalRules from '../Components/ApprovalRules/approvalRules.component';\r\nimport requestHistoryDataService from '../Components/requestHistory/requestHistoryDataService.factory';\r\nimport outstandingApprovals from '../Components/outstandingApprovals/outstandingApprovals.component'\r\nimport outstandingApprovalsGrid from '../Components/outstandingApprovals/outstandingApprovalsGrid.component';\r\n\r\n\r\nexport default angular\r\n .module('app.identityManager', [identityManagerFactoriesModule, identityManagerRequestManagementModule])\r\n .factory('requestHistoryDataService', requestHistoryDataService)\r\n .controller(\"identityManagerRequestDetailsViewModel\", IdentityManagerRequestDetailsViewModel)\r\n .component('approvalRules', approvalRules)\r\n .component(\"openRequests\", openRequests)\r\n .component('requestHistory', requestHistory)\r\n .component('outstandingApprovals', outstandingApprovals)\r\n .component('outstandingApprovalsGrid', outstandingApprovalsGrid)\r\n .name;","/* outstandingApprovals.component.js */\r\n\r\n/**\r\n * @desc component to display Outstanding Approvals\r\n * @example \r\n */\r\n\r\nconst outstandingApprovals = {\r\n templateUrl: '/App/Components/outstandingApprovals/outstandingApprovals.tmpl.html'\r\n};\r\n\r\nexport default outstandingApprovals;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport ReportSchedulerModalController from \"../../Shared/Controllers/ReportSchedulerModalController\";\r\nimport swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $rootScope, $filter, schedulesDataService, controlLibraryDataService, helperService, FileSaver) {\r\n const vm = this;\r\n\r\n vm.$onInit = activate;\r\n\r\n vm.openNewReportScheduleModal = openNewReportScheduleModal;\r\n vm.openEditScheduleModal = openEditScheduleModal;\r\n vm.changeScheduleRowSelected = changeScheduleRowSelected;\r\n vm.deleteScheduleOutput = deleteScheduleOutput;\r\n vm.deleteSchedule = deleteSchedule;\r\n vm.downloadFile = downloadFile;\r\n vm.checkForFileType = checkForFileType;\r\n vm.getFileTypeImage = getFileTypeImage;\r\n vm.downloadAttachment = downloadAttachment;\r\n vm.runSchedule = runSchedule;\r\n vm.securityActions = {\r\n newSchedule: helperService.objectExists(\"1402\"),\r\n editSchedule: helperService.objectExists(\"1403\"),\r\n deleteSchedule: helperService.objectExists(\"1405\"),\r\n runSchedule: helperService.objectExists(\"1406\")\r\n }\r\n\r\n function activate() {\r\n //Define columns for main grid\r\n const schedulesGridColumns = [\r\n { field: \"SavedReportName\", title: \"Report Name\", filterable: customAutoCompleteFilter },\r\n { field: \"OwnerLogonName\", title: \"Created By\", filterable: customAutoCompleteFilter },\r\n { field: \"Frequency\", title: \"Occurs\", filterable: customAutoCompleteFilter },\r\n { field: \"StartTime\", title: \"Start\", template: \"{{ dataItem.StartTime | date:'short'}}\", filterable: false },\r\n { field: \"NextExecutionTime\", title: \"Next Execution\", template: \"{{ dataItem.NextExecutionTime | date:'short'}}\", filterable: false },\r\n { field: \"EndTime\", title: \"End\", template: \"{{ dataItem.EndTime | date:'short'}}\", filterable: false },\r\n { template: `Run Now`, \"title\": \"Run Now\", hidden: !vm.securityActions['runSchedule'] },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90, hidden: !vm.securityActions['editSchedule'] },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90, hidden: !vm.securityActions['deleteSchedule'] }\r\n ],\r\n deliveryGridColumns = [\r\n { field: \"UserLogonName\", title: \"User Logon Name\", filterable: customAutoCompleteFilter },\r\n { field: \"DeliveryType\", title: \"Delivery Type\", filterable: customAutoCompleteFilter },\r\n { field: \"Format\", filterable: customAutoCompleteFilter },\r\n { template: `Delete`, \"title\": \"Delete\", width: 90, hidden: !vm.securityActions['deleteSchedule'] }\r\n ],\r\n executionsGridColumns = [\r\n { field: \"ExecutionDate\", title: \"Execution Date\", template: \"{{ dataItem.ExecutionDate | date:'short'}}\", filterable: false },\r\n {\r\n template: ``, width: 200, \"title\": \"Download\"\r\n },\r\n { template: ``, width: 200, \"title\": \"Attachments\" }\r\n ];\r\n\r\n vm.schedulesGridOptions = helperService.setMainGridOptions(schedulesGridColumns, 611);\r\n vm.deliveryMethodGridOptions = helperService.setNonPageableGridOptions(deliveryGridColumns, 200);\r\n vm.deliveryMethodGridOptions.selectable = false;\r\n vm.executionsGridOptions = helperService.setNonPageableGridOptions(executionsGridColumns, 300);\r\n }\r\n\r\n async function openNewReportScheduleModal() {\r\n let newScheduleModal = $uibModal.open({\r\n templateUrl: '/App/Shared/Controllers/ReportSchedulerModal.html',\r\n controller: ReportSchedulerModalController,\r\n backdrop: 'static',\r\n size: 'md',\r\n scope: $scope\r\n });\r\n\r\n try {\r\n await newScheduleModal.result;\r\n vm.schedulesGridDataSource.read()\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function openEditScheduleModal(selectedID) {\r\n $rootScope.scheduleToEdit = selectedID;\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Controllers/ReportSchedulerModal.html',\r\n controller: ReportSchedulerModalController,\r\n backdrop: 'static',\r\n size: 'md',\r\n scope: $scope\r\n });\r\n }\r\n\r\n async function changeScheduleRowSelected(dataItem) {\r\n let executions = await schedulesDataService.getReportScheduleExecutions(dataItem.ID);\r\n if (executions.data.length) {\r\n executions = $filter('orderBy')(executions.data, '-ExecutionDate');\r\n }\r\n\r\n vm.deliveryGridDataSource = new kendo.data.DataSource({\r\n data: dataItem.Outputs\r\n });\r\n\r\n vm.executionsGridDataSource = new kendo.data.DataSource({\r\n data: executions\r\n });\r\n }\r\n\r\n vm.schedulesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async function (options) {\r\n let response = await schedulesDataService.getReportSchedules();\r\n response.data = $filter('orderBy')(response.data, 'SavedReportName');\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n\r\n //Delete based on ID of Schedule\r\n function deleteScheduleOutput(id, ScheduleID) {\r\n let rows = vm.deliveryGridDataSource.data();\r\n\r\n rows.forEach(async row => {\r\n if (row.ID.toString() === id.toString()) {\r\n if (row.ScheduleID.toString() === ScheduleID.toString()) {\r\n try {\r\n await schedulesDataService.deleteScheduleOutput(id, ScheduleID)\r\n rows.remove(row);\r\n } catch {\r\n return;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n //Delete based on ID of Schedule\r\n async function deleteSchedule(id) {\r\n vm.deliveryGridDataSource = null;\r\n vm.executionsGridDataSource = null;\r\n try {\r\n await schedulesDataService.deleteSchedule(id);\r\n vm.schedulesGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function checkForFileType(fileType, files) {\r\n return files.find(file => file.FileFormat === fileType);\r\n }\r\n\r\n function getFileTypeImage(fileExtension) {\r\n switch (fileExtension) {\r\n case 'xlsx': //Excel\r\n return 'excel-file-icon-16';\r\n break;\r\n case 'pdf': //PDF \r\n return 'pdf-file-icon-16';\r\n break;\r\n case 'csv': //Csv\r\n return 'csv-file-icon-16';\r\n break;\r\n default: \r\n return 'default-file-icon-16';\r\n break;\r\n }\r\n }\r\n\r\n async function downloadFile(fileType, executionId) {\r\n let response,\r\n fileExtension;\r\n\r\n vm.downloadFilePending = true;\r\n\r\n try {\r\n response = await schedulesDataService.downloadExecutionFile(fileType, executionId);\r\n\r\n fileExtension = fileType.toLowerCase();\r\n\r\n if (fileExtension === 'excel') {\r\n fileExtension = 'xlsx';\r\n }\r\n FileSaver.saveAs(response.data, 'Executions.' + fileExtension);\r\n vm.downloadFilePending = false;\r\n } catch {\r\n vm.downloadFilePending = false;\r\n }\r\n }\r\n\r\n async function downloadAttachment(attachment) {\r\n let response;\r\n vm.downloadPending = true;\r\n\r\n try {\r\n response = await controlLibraryDataService.downloadAttachment(attachment.Identifier);\r\n\r\n FileSaver.saveAs(response.data, attachment.FileName);\r\n vm.downloadPending = false;\r\n } catch {\r\n vm.downloadPending = false;\r\n }\r\n }\r\n\r\n async function runSchedule(schedule) {\r\n try {\r\n await schedulesDataService.runReportSchedule(schedule.ID);\r\n swal(\"\", `The schedule for report ${schedule.SavedReportName} has been initiated. Recipients will be receiving the report soon.`, 'success');\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","import controller from \"./schedules.controller\";\r\n\r\n/* schedules.component.js */\r\n\r\n/**\r\n * @desc component for report schedules\r\n * @example \r\n */\r\n\r\nconst schedules = {\r\n controller: controller,\r\n controllerAs: 'svm',\r\n templateUrl: '/App/Components/Schedules/schedules.tmpl.html'\r\n};\r\n\r\nexport default schedules;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, helperService, reportId, selectedReport, $uibModalInstance, savedReportsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.dismiss = dismiss;\r\n vm.close = close;\r\n vm.saveReport = saveReport;\r\n vm.reportName = selectedReport.Name;\r\n vm.reportDescription = selectedReport.Description;\r\n\r\n function saveReport() {\r\n\r\n vm.pleaseWait = new createSpinner();\r\n\r\n let putData = {\r\n \"Id\": selectedReport.Id,\r\n \"Name\": vm.reportName,\r\n \"Description\": vm.reportDescription,\r\n \"ReportDefinition\": {\r\n \"ReportId\": selectedReport.ReportDefinition.ReportId,\r\n \"Columns\": selectedReport.ReportDefinition.Columns,\r\n \"Sortings\": selectedReport.ReportDefinition.Sortings,\r\n \"Criteria\": selectedReport.ReportDefinition.Criteria,\r\n \"Filters\": selectedReport.ReportDefinition.Filters,\r\n \"DateFilters\": selectedReport.ReportDefinition.DateFilters\r\n }\r\n };\r\n\r\n savedReportsDataService.editSavedReport(reportId, putData).then(async function (response) {\r\n vm.killModal = true;\r\n await helperService.successfulSaveButton(vm.pleaseWait).then(function (result) {\r\n close();\r\n });\r\n\r\n }, function (response) {\r\n helperService.showErrorMessage(response.data);\r\n vm.pleaseWait.loadingValue = false;\r\n });\r\n\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport savedReportsEditModalController from \"./savedReportsEditModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, savedReportsDataService, helperService, CustomReportServices, $uibModal) {\r\n\r\n const vm = this;\r\n vm.deleteSavedReport = deleteSavedReport;\r\n vm.runReport = runReport;\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.getFilterDisplayName = getFilterDisplayName;\r\n vm.getCriteriaDisplayName = getCriteriaDisplayName;\r\n vm.openEditSavedReportModal = openEditSavedReportModal;\r\n\r\n function activate() {\r\n const savedReportsGridColumns = [\r\n { field: \"Id\", title: \"ID\", filterable: customAutoCompleteFilter, hidden: true },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"ReportDefinition.ReportName\", title: \"Report Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Owner.UserLogonName\", title: \"Creator\", filterable: customAutoCompleteFilter },\r\n { template: 'Run', \"title\": \"Run\", width: 90 },\r\n { template: 'Edit', \"title\": \"Edit\", width: 90 },\r\n { template: 'Delete', \"title\": \"Delete\", width: 90, hidden: !helperService.objectExists('1407') }\r\n ];\r\n\r\n vm.savedReportsGridOptions = helperService.setMainGridOptions(savedReportsGridColumns, 600);\r\n\r\n vm.savedReportsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n savedReportsDataService.getSavedReports().then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.allSavedReports = response.data;\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n activate();\r\n\r\n\r\n function deleteSavedReport(reportId) {\r\n savedReportsDataService.getSavedReportSchedules(reportId).then(function (response) {\r\n if (response.data.length > 0) {\r\n swal(helperService.areYouSureParams('Existing Schedule(s)', 'Are you sure you want to delete this saved report? There is one or more associated schedules.', 'Delete')).then(function () {\r\n deleteReport(reportId);\r\n }, function (dismiss) {\r\n return;\r\n });\r\n } else {\r\n deleteReport(reportId);\r\n }\r\n });\r\n\r\n }\r\n\r\n function openEditSavedReportModal(reportId) {\r\n vm.reportId = reportId;\r\n vm.selectedReport = vm.allSavedReports.find(r => r.Id === reportId);\r\n let editModal = $uibModal.open({\r\n templateUrl: '/App/Components/SavedReports/savedReportsEditModal.tmpl.html',\r\n controller: savedReportsEditModalController,\r\n controllerAs: 'sremvm',\r\n backdrop: 'static',\r\n resolve: {\r\n reportId: () => vm.reportId,\r\n selectedReport: () => vm.selectedReport\r\n }\r\n });\r\n\r\n editModal.result\r\n .then(_ => {\r\n vm.savedReportsGridDataSource.read();\r\n }).catch(_ => {\r\n return;\r\n });\r\n }\r\n\r\n function deleteReport(reportId) {\r\n savedReportsDataService.removeSavedReport(reportId)\r\n .then(_ => {\r\n vm.savedReportsGridDataSource.read();\r\n vm.currentSelectedSavedReport = null;\r\n }).catch(response => {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n\r\n function runReport(savedReportId) {\r\n var savedReport = vm.allSavedReports.find(report => report.Id === savedReportId);\r\n CustomReportServices.loadSavedReport(savedReport);\r\n }\r\n\r\n function changeRowSelected(dataItem) {\r\n\r\n if (dataItem) {\r\n vm.currentSelectedSavedReport = vm.allSavedReports.find(e => e.Id === dataItem.Id);\r\n vm.savedReportCriteriaLength = vm.currentSelectedSavedReport.ReportDefinition.Criteria.filter(criteria => criteria.CriteriaType).length;\r\n if (vm.currentSelectedSavedReport.ReportDefinition.Criteria.some(criteria => !criteria.CriteriaType)) {\r\n const criteriaFiltersLength = vm.currentSelectedSavedReport.ReportDefinition.Criteria.filter(criteria => !criteria.CriteriaType).length;\r\n vm.savedReportFiltersLength = vm.currentSelectedSavedReport.ReportDefinition.Filters.length + criteriaFiltersLength;\r\n } else {\r\n vm.savedReportFiltersLength = vm.currentSelectedSavedReport.ReportDefinition.Filters.length;\r\n }\r\n savedReportsDataService.getSavedReportSchedules(dataItem.Id).then(response => {\r\n vm.schedulesForCurrentSelectedSavedReport = response.data;\r\n });\r\n } else {\r\n vm.currentSelectedSavedReport = null;\r\n }\r\n\r\n }\r\n\r\n function getFilterDisplayName(fieldName) {\r\n //Find the column Display Name for the filter. This is used for display purposes\r\n var displayName = \"\";\r\n var column = vm.currentSelectedSavedReport.ReportDefinition.Columns.find(column => {\r\n var columnUpper = column.FieldName.toUpperCase();\r\n return columnUpper === fieldName.toUpperCase();\r\n });\r\n if (column) {\r\n displayName = column.DisplayName;\r\n } else {\r\n displayName = $filter('insertSpaceBetweenCapitalWords')(fieldName);\r\n }\r\n\r\n return displayName;\r\n }\r\n\r\n function getCriteriaDisplayName(criteria) {\r\n //Find the column Display Name for the Criteria. This is used for display purposes\r\n var displayName = \"\";\r\n if (criteria.CriteriaDisplayName) {\r\n displayName = criteria.CriteriaDisplayName;\r\n } else {\r\n displayName = criteria.CriteriaType;\r\n }\r\n\r\n return displayName;\r\n }\r\n}\r\n","import controller from \"./savedReports.controller\";\r\n\r\n/* savedReports.component.js */\r\n\r\n/**\r\n * @desc component for saved reports\r\n * @example \r\n */\r\n\r\nconst savedReports = {\r\n controller: controller,\r\n controllerAs: 'srvm',\r\n templateUrl: '/App/Components/SavedReports/savedReports.tmpl.html'\r\n};\r\n\r\nexport default savedReports;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var service = {\r\n getSavedReports,\r\n addSavedReport,\r\n getSavedReportSchedules,\r\n editSavedReport,\r\n removeSavedReport\r\n };\r\n\r\n return service;\r\n\r\n function getSavedReports() {\r\n return $http.get(apiUrl + 'api/core/savedreports/')\r\n .then(workComplete)\r\n .catch(workFailed);\r\n }\r\n\r\n function addSavedReport(data) {\r\n return $http.post(apiUrl + 'api/core/savedreports/', data)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n }\r\n\r\n\r\n function getSavedReportSchedules(savedReportId) {\r\n return $http.get(apiUrl + 'api/core/reportschedules/savedreports/' + savedReportId)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n }\r\n\r\n function editSavedReport(savedReportId, putData) {\r\n return $http.put(`${apiUrl}api/core/savedreports/${savedReportId}`, putData)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n }\r\n\r\n\r\n function removeSavedReport(savedReportId) {\r\n return $http.delete(apiUrl + 'api/core/savedreports/' + savedReportId)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n }\r\n\r\n function workComplete(response) {\r\n return response;\r\n }\r\n\r\n function workFailed(response) {\r\n errorsDataService.catch(response);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var service = {\r\n getReportSchedules,\r\n getReportScheduleExecutions,\r\n deleteSchedule,\r\n deleteScheduleOutput,\r\n downloadExecutionFile,\r\n runReportSchedule\r\n };\r\n\r\n return service;\r\n\r\n async function getReportSchedules() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/reportschedules`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getReportScheduleExecutions(id) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/reportschedules/${id}/executions`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function deleteSchedule(id) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/reportschedules/${id}`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function deleteScheduleOutput(id, ScheduleID) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/reportschedules/${ScheduleID}/outputs/${id}`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function downloadExecutionFile(fileType, executionId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/reportschedules/executions/${executionId}/download?fileFormat=${fileType}`, { responseType: \"blob\" })\r\n } catch (err) {\r\n showError(err);\r\n sendError(err)\r\n }\r\n }\r\n\r\n async function runReportSchedule(scheduleId) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/reportschedules/${scheduleId}/run`)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","import angular from 'angular';\r\nimport schedules from '../Components/Schedules/schedules.component';\r\nimport savedReports from '../Components/SavedReports/savedReports.component';\r\nimport savedReportsDataServiceFactory from '../Components/SavedReports/savedReportsDataService.factory';\r\nimport schedulesService from '../Components/Schedules/schedules.service';\r\n\r\nexport default angular\r\n .module('app.reportManagement', [])\r\n .component(\"schedules\", schedules)\r\n .component(\"savedReports\", savedReports)\r\n .factory('savedReportsDataService', savedReportsDataServiceFactory)\r\n .factory('schedulesDataService', schedulesService)\r\n .name;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (control, $rootScope, $uibModalInstance, controlManagementDataService, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.control = control;\r\n vm.cancel = cancel;\r\n vm.saveEditModal = saveEditModal;\r\n vm.conditions = [];\r\n\r\n async function activate() {\r\n vm.conditions = vm.control.Conditions;\r\n vm.frequencies = ['Weekly', 'Monthly', 'Quarterly', 'Yearly'];\r\n vm.daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n vm.daysInMonth = helperService.getDayOfMonthDropdownOptions();\r\n vm.months = helperService.getMonthsDropdownOptions();\r\n vm.startTimeForControlSchedule = new Date();\r\n setupControlSchedule();\r\n }\r\n\r\n activate();\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n async function saveEditModal() {\r\n vm.saving = new createSpinner();\r\n\r\n try {\r\n await updateControls();\r\n if (vm.conditions.length > 0) {\r\n await updateConditions();\r\n }\r\n\r\n if (vm.controlScheduleIsOn == false && vm.control.Schedule) {\r\n await setUpdateControlSchedule(false);\r\n } else {\r\n await setUpdateControlSchedule(true);\r\n }\r\n\r\n await helperService.successfulSaveButton(vm.saving);\r\n cancel();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateControls() {\r\n let putData = {\r\n \"Id\": vm.control.Id,\r\n \"Name\": vm.control.Name,\r\n \"Description\": vm.control.Description,\r\n \"Enabled\": vm.control.Enabled,\r\n \"ReferenceNumber\": vm.control.ReferenceNumber,\r\n \"Notes\": vm.control.Notes,\r\n \"AutoClose\": vm.control.AutoClose\r\n }\r\n\r\n try {\r\n await controlManagementDataService.updateControl(vm.control.Id, putData);\r\n } catch {\r\n return\r\n }\r\n }\r\n\r\n function updateConditions() {\r\n\r\n vm.conditions.forEach(async condition => {\r\n let putData = {\r\n \"ConditionId\": condition.Id,\r\n \"Value\": !condition.Value ? null : condition.Value\r\n };\r\n\r\n await controlManagementDataService.updateControlConditions(vm.control.Id, condition.Id, putData);\r\n });\r\n }\r\n\r\n // Schedule Control Code\r\n function setupControlSchedule() {\r\n if (vm.control.Schedule && vm.control.Schedule.NextExecutionTime) {\r\n vm.selectedFrequency = vm.control.Schedule.Frequency;\r\n vm.selectedDayOfWeek = vm.control.Schedule.DayOfWeek;\r\n vm.selectedDayOfMonth = vm.control.Schedule.DayOfMonth ? { Value: vm.control.Schedule.DayOfMonth } : null;\r\n vm.selectedMonth = vm.control.Schedule.Month\r\n vm.startTime = new Date(vm.control.Schedule.StartTime);\r\n vm.controlScheduleIsOn = true;\r\n } else {\r\n vm.controlScheduleIsOn = false;\r\n }\r\n }\r\n\r\n function setUpdateControlSchedule(isOn) {\r\n updateControlSchedule(isOn, vm.selectedFrequency, vm.selectedDayOfWeek, vm.selectedDayOfMonth, vm.selectedMonth, vm.startTime);\r\n }\r\n\r\n async function updateControlSchedule(scheduleIsOn, frequency, dayOfWeek, dayOfMonth, month, startTime) {\r\n vm.updateInProgress = new createSpinner();\r\n\r\n if (scheduleIsOn) {\r\n\r\n let dayOfMonthRequest;\r\n let dayOfWeekRequest;\r\n let monthRequest;\r\n\r\n\r\n if (frequency === 'Weekly') {\r\n dayOfMonthRequest = [];\r\n monthRequest = [];\r\n dayOfWeekRequest = [dayOfWeek];\r\n } if (frequency === 'Monthly') {\r\n dayOfMonthRequest = [dayOfMonth.Value];\r\n dayOfWeekRequest = [];\r\n monthRequest = [];\r\n } if (frequency === 'Quarterly') {\r\n dayOfMonthRequest = [dayOfMonth.Value];\r\n monthRequest = [month];\r\n dayOfWeekRequest = [];\r\n } if (frequency === 'Yearly') {\r\n dayOfMonthRequest = [dayOfMonth.Value];\r\n monthRequest = [month];\r\n dayOfWeekRequest = [];\r\n }\r\n\r\n let adjustedStartTime = new Date();\r\n adjustedStartTime.setHours(startTime.getHours());\r\n adjustedStartTime.setMinutes(startTime.getMinutes());\r\n adjustedStartTime = new Date(adjustedStartTime.toUTCString());\r\n adjustedStartTime = adjustedStartTime.toISOString();\r\n\r\n const putData = {\r\n \"ControlId\": control.Id,\r\n \"Schedule\": {\r\n \"DayOfMonth\": dayOfMonthRequest[0],\r\n \"DayOfWeek\": dayOfWeekRequest[0],\r\n \"Month\": monthRequest[0],\r\n \"Frequency\": frequency,\r\n \"StartTime\": adjustedStartTime,\r\n \"TimeZone\": $rootScope.applicationTimeZone\r\n }\r\n };\r\n\r\n try {\r\n await controlManagementDataService.scheduleControl(vm.control.Id, putData);\r\n await setupControlSchedule();\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n if (!scheduleIsOn && control.Schedule) {\r\n let disablePutData = {\r\n ControlId: vm.control.Id\r\n }\r\n\r\n try {\r\n await controlManagementDataService.disableControlSchedule(control.Id, disablePutData);\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n }\r\n\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, $uibModalInstance, controlManagementDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.saveGlobalConditions = saveGlobalConditions;\r\n vm.cancel = cancel;\r\n\r\n\r\n async function activate() {\r\n vm.globalConditions = [];\r\n await getGlobalConditions();\r\n }\r\n\r\n activate();\r\n\r\n async function getGlobalConditions() {\r\n let response = await controlManagementDataService.getGlobalParameters();\r\n vm.globalConditions = response.data;\r\n }\r\n\r\n async function saveGlobalConditions() {\r\n vm.savingConditions = new createSpinner();\r\n\r\n try {\r\n vm.globalConditions.forEach(globalCondition => {\r\n let putData = {\r\n \"Id\": globalCondition.Id,\r\n \"Value\": globalCondition.GlobalValue\r\n };\r\n\r\n controlManagementDataService.updateGlobalParameter(globalCondition.Id, putData);\r\n });\r\n\r\n await helperService.successfulSaveButton(vm.savingConditions);\r\n cancel();\r\n } catch {\r\n vm.savingConditions.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport editControlModalController from \"./EditControlModal/editControlModal.controller\";\r\nimport globalConditionsModalController from \"./GlobalConditionsModal/globalConditionsModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, helperService, controlManagementDataService, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.shouldBeOpen = true;\r\n\r\n vm.openEditControlModal = openEditControlModal;\r\n vm.openGlobalConditionsModal = openGlobalConditionsModal;\r\n vm.runNow = runNow;\r\n\r\n async function activate() {\r\n let controlManagementGridColumns =\r\n [\r\n { template: `Edit`, \"title\": \"Edit\", width: 65 },\r\n { template: `Run Now`, \"title\": \"Run Now\", width: 80 },\r\n { field: \"Id\", title: \"Id\", filterable: customAutoCompleteFilter, width: 55 },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter, width: 350 }, \r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"ReferenceNumber\", title: \"Reference Number\", filterable: customAutoCompleteFilter, width: 125 },\r\n { field: \"Notes\", title: \"Notes\", filterable: customAutoCompleteFilter },\r\n { field: \"AutoClose\", title: \"Auto Close\", filterable: customBooleanFilter, width: 125 },\r\n { field: \"Enabled\", title: \"Enabled\", filterable: customBooleanFilter, width: 125 }, \r\n { template: `{{dataItem.Schedule.LastExecutionTime | date:'short'}}`, \"title\": \"Last Ran\", width: 130 },\r\n { template: `{{dataItem.Schedule.NextExecutionTime | date:'short'}}`, \"title\": \"Scheduled Next\", width: 130 }\r\n ];\r\n\r\n vm.controlManagementGridOptions = helperService.setMainGridOptions(controlManagementGridColumns, 600);\r\n vm.controlManagementGridOptions.selectable = false;\r\n\r\n vm.controlManagementGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n AutoClose: { type: \"boolean\" },\r\n Enabled: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async function (options) {\r\n try {\r\n let response = await controlManagementDataService.getListOfControls();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n activate();\r\n\r\n async function openEditControlModal(control) {\r\n\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/TransactionMonitoring/ControlManagement/EditControlModal/editControlModal.tmpl.html',\r\n controller: editControlModalController,\r\n controllerAs: 'ecmvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n size: 'lg',\r\n resolve: {\r\n control: () => control\r\n }\r\n });\r\n\r\n await openModal.result;\r\n vm.controlManagementGridDataSource.read();\r\n }\r\n\r\n async function openGlobalConditionsModal() {\r\n\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/TransactionMonitoring/ControlManagement/GlobalConditionsModal/globalConditionsModal.tmpl.html',\r\n controller: globalConditionsModalController,\r\n controllerAs: 'gcmvm',\r\n backdrop: 'static',\r\n scope: $scope\r\n });\r\n\r\n await openModal.result;\r\n vm.controlManagementGridDataSource.read();\r\n }\r\n\r\n async function runNow(control) {\r\n vm.disableButton = true;\r\n\r\n try {\r\n await controlManagementDataService.onDemandControl(control.Id);\r\n vm.controlManagementGridDataSource.read();\r\n vm.disableButton = false;\r\n } catch {\r\n vm.disableButton = false;\r\n }\r\n }\r\n}","/* controlManagement.component.js */\r\n\r\nimport controlManagementController from \"./controlManagement.controller\";\r\n\r\n/**\r\n * @desc component for displaying the report toolbar\r\n * @example \r\n */\r\n\r\nconst controlManagement = {\r\n controller: controlManagementController,\r\n controllerAs: 'cmvm',\r\n templateUrl: '/App/Components/TransactionMonitoring/ControlManagement/controlManagement.tmpl.html'\r\n\r\n};\r\n\r\nexport default controlManagement;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, $filter, incident, $uibModalInstance, incidentManagementDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.saveIncident = saveIncident;\r\n vm.cancel = cancel;\r\n vm.incident = incident;\r\n\r\n\r\n async function activate() {\r\n await getStatuses();\r\n }\r\n\r\n activate();\r\n\r\n async function getStatuses() {\r\n vm.selectedStatus = { \"Id\": vm.incident.StatusId, \"Name\": vm.incident.StatusName };\r\n let response = await incidentManagementDataService.getStatuses();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.statusDataSource = response.data.filter(status => status.Name !== 'Closed: Resolved' && status.Name !== 'Closed: Aged Out');\r\n }\r\n\r\n async function saveIncident() {\r\n vm.saving = new createSpinner();\r\n\r\n const putData = {\r\n \"Id\": vm.incident.IncidentId,\r\n \"Status\": vm.selectedStatus.Id,\r\n \"StatusReason\": vm.incident.StatusReason\r\n };\r\n\r\n try {\r\n await incidentManagementDataService.updateIncident(vm.incident.IncidentId, putData);\r\n await helperService.successfulSaveButton(vm.saving);\r\n cancel();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import { customAutoCompleteFilter, customBooleanFilter, customDatePickerFilter, customDatePickerNotNullableFilter, customNotStringEmptyFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../Shared/kendo.module\";\r\nimport editIncidentModalController from \"./EditIncidentModal/editIncidentModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, $http, SavedReportSelectorService, $uibModal, objectIdDataService, CustomReportServices, $filter, reportsDataService, reportsService, helperService, controlManagementDataService, incidentManagementDataService) {\r\n\r\n const vm = this;\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.runSavedReport = runSavedReport;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.controlSelectedChanged = controlSelectedChanged;\r\n vm.onReadGrid = onReadGrid;\r\n vm.onClearFilters = onClearFilters;\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.deleteFilter = deleteFilter;\r\n vm.generateGridWithSelectedValues = generateGridWithSelectedValues;\r\n vm.openEditIncidentModal = openEditIncidentModal;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n // ---\r\n\r\n async function activate() {\r\n if ($rootScope.loadedSavedReport) {\r\n vm.savedReportFilters = $rootScope.loadedSavedReport.ReportDefinition.Filters;\r\n }\r\n\r\n // Get ObjectId and reportName for layouts and tabs\r\n vm.ObjectId = await objectIdDataService.getObjectID();\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectId(vm.ObjectId);\r\n vm.reportName = securityObject.Name;\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(null, 600);\r\n vm.mainGridOptions.autoBind = false;\r\n\r\n getControls();\r\n }\r\n\r\n activate();\r\n\r\n async function runSavedReport() {\r\n\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.controlDataSource && vm.periodDataSource && vm.filterCriteria.fields) {\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n // clear out ImportId and ControlId filters because they are represented by dropdowns\r\n vm.filterCriteria.query = vm.filterCriteria.query.filter(query => query.FieldName !== 'ImportId' && query.FieldName !== 'ControlId');\r\n vm.filterCriteria.needsUpdate = true;\r\n // ---\r\n generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.controlDataSource && vm.periodDataSource && vm.filterCriteria.fields) {\r\n // We want the necessary report details available to be able to use the report toolbar without running the report\r\n populateCriteriaModel();\r\n }\r\n }\r\n\r\n function setupMetaDataColumns(metadataColumns) {\r\n metadataColumns = $filter('orderBy')(vm.reportMetadata.Columns, 'Ordinal');\r\n metadataColumns = metadataColumns.filter(d => !d.FieldName.includes('_hidden_'));\r\n\r\n // Omit these columns from the UI completely to prevent user from accessing and causing errors\r\n metadataColumns = metadataColumns.filter(column => column.FieldName !== 'StatusId' && column.FieldName !== 'StatusUpdatedById');\r\n\r\n metadataColumns.forEach(function (column) {\r\n if (column.DataType === 'DateTime') {\r\n column.DataType = 'dateTime';\r\n } else if (column.DataType === 'Date') {\r\n column.DataType = 'date';\r\n } else if (column.DataType === 'Time') {\r\n column.DataType = 'time';\r\n } else if (column.DataType === 'Boolean') {\r\n column.DataType = 'boolean';\r\n } else if (column.DataType === 'String') {\r\n column.DataType = 'string';\r\n } else if (column.DataType === 'Number') {\r\n column.DataType = 'number';\r\n }\r\n });\r\n\r\n return metadataColumns;\r\n }\r\n\r\n async function setupGridColumns(metaDataColumns) {\r\n vm.gridColumns = [];\r\n metaDataColumns = $filter('orderBy')(metaDataColumns, 'Ordinal');\r\n metaDataColumns.forEach(column => {\r\n // Ensure column display name includes a space (filter dropdown options match column titles)\r\n column.DisplayName = !column.DisplayName ? helperService.headerStringTransformer(column.FieldName) : helperService.headerStringTransformer(column.DisplayName);\r\n\r\n // Ensure IsVisible property is properly set for unnecessary columns\r\n if (column.FieldName === 'ControlId' || column.FieldName === 'ImportId') {\r\n column.IsVisible = false;\r\n }\r\n\r\n let baseColumn = { \"field\": column.FieldName, \"title\": !column.DisplayName ? helperService.headerStringTransformer(column.FieldName) : column.DisplayName, filterable: customAutoCompleteFilter, hidden: !column.IsVisible, ordinal: column.Ordinal };\r\n\r\n if (column.DataType === 'dateTime' || column.DataType === 'date' || column.DataType === 'time') {\r\n baseColumn.filterable = column.IsNullable ? customDatePickerFilter : customDatePickerNotNullableFilter;\r\n baseColumn.template = column.DataType === 'date' ? \"{{dataItem.\" + column.FieldName + \" | date:'M/d/yy'}}\" : \"{{dataItem.\" + column.FieldName + \" | date:'short'}}\";\r\n }\r\n if (column.DataType === 'boolean') {\r\n baseColumn.filterable = customBooleanFilter;\r\n }\r\n if (column.DataType === 'number') {\r\n baseColumn.filterable = customAutoCompleteFilter;\r\n }\r\n if (column.DataType === 'string') {\r\n // prevents kendo from parsing any code found in the string\r\n baseColumn.template = \"{{dataItem.\" + column.FieldName + \"}}\";\r\n }\r\n if (column.DataType !== 'string' && column.IsNullable) {\r\n baseColumn.filterable = customNotStringEmptyFilter;\r\n }\r\n\r\n vm.gridColumns.push(baseColumn);\r\n\r\n });\r\n\r\n // Add edit column\r\n vm.gridColumns.unshift({ \"field\": 'Edit', \"title\": 'Edit', \"template\": `Edit`, filterable: false, ordinal: 0 });\r\n return vm.gridColumns;\r\n }\r\n\r\n async function createIncidentManagementGrid() {\r\n\r\n // Don't allow filtering and sorting yet because they will force the report to run\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.mainGridOptions.sortable = false;\r\n\r\n vm.mainGridOptions.filterable = false;\r\n }\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: determineTypeOfField(vm.reportMetadata.Columns)\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n let data = {};\r\n vm.sortsAndFilters = helperService.prepareSortsAndFilters(options);\r\n\r\n vm.sortsAndFilters.Filters.push({\r\n \"FieldName\": 'ImportId',\r\n \"Operator\": 'Equals',\r\n \"Value\": vm.selectedPeriod.Id\r\n });\r\n\r\n vm.sortsAndFilters.Filters.push({\r\n \"FieldName\": 'ControlId',\r\n \"Operator\": 'Equals',\r\n \"Value\": vm.selectedControl.Id\r\n });\r\n\r\n data = vm.sortsAndFilters;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data.Filters = data.Filters.concat(vm.filterCriteria.query);\r\n }\r\n // ---\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n let params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n\r\n try {\r\n let response = await $http.post(`${apiUrl}api/core/reports/${vm.reportId}/execute`, data, { params: params });\r\n data = response.data._embedded.reportData;\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n }\r\n });\r\n\r\n if (vm.reportId) {\r\n setLayout();\r\n }\r\n\r\n return vm.gridDataSource;\r\n }\r\n\r\n function determineTypeOfField(columnsWithType) {\r\n var fields = {};\r\n columnsWithType.forEach(function (column) {\r\n if (column.DataType === 'date' || column.DataType === 'time' || column.DataType === 'dateTime') {\r\n fields[column.FieldName] = { type: 'date' };\r\n } else {\r\n fields[column.FieldName] = { type: column.DataType };\r\n }\r\n });\r\n return fields;\r\n }\r\n\r\n\r\n async function getControls() {\r\n vm.controlsLoading = true;\r\n let response = await controlManagementDataService.getListOfControls();\r\n response.data = $filter('filter')(response.data, { Enabled: true });\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.controlDataSource = response.data;\r\n vm.controlsLoading = false;\r\n\r\n if (vm.savedReportFilters) {\r\n vm.selectedControl = vm.controlDataSource.find(c => c.Id === vm.savedReportFilters.find(f => f.FieldName === 'ControlId').Value);\r\n }\r\n\r\n if (vm.selectedControl) {\r\n vm.reportId = vm.selectedControl.ReportId;\r\n await controlSelectedChanged();\r\n }\r\n\r\n return vm.controlDataSource;\r\n }\r\n\r\n async function getPeriods() {\r\n vm.periodsLoading = true;\r\n vm.reportId = vm.selectedControl.ReportId;\r\n\r\n let response = await incidentManagementDataService.getIncidentLogsByControlId(vm.selectedControl.Id);\r\n response.data = $filter('orderBy')(response.data, 'StartDate', true);\r\n vm.periodDataSource = response.data;\r\n vm.periodsLoading = false;\r\n\r\n if (vm.savedReportFilters) {\r\n vm.selectedPeriod = vm.periodDataSource.find(period => period.Id === vm.savedReportFilters.find(f => f.FieldName === 'ImportId').Value);\r\n }\r\n\r\n return vm.periodDataSource;\r\n }\r\n\r\n async function controlSelectedChanged() {\r\n try {\r\n if (vm.selectedControl) {\r\n await getPeriods();\r\n\r\n populateCriteriaModel();\r\n\r\n if (vm.periodDataSource.length > 0) {\r\n vm.noIncidentLogs = false;\r\n await getReportMetadata();\r\n await setupGridColumns(vm.reportMetadata.Columns);\r\n await createIncidentManagementGrid();\r\n await runSavedReport();\r\n } else {\r\n vm.noIncidentLogs = true;\r\n }\r\n }\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // do not continue if the proper criteria are not loaded\r\n if (vm.selectedControl === undefined || vm.selectedPeriod === undefined) {\r\n return;\r\n }\r\n\r\n let criteria = [];\r\n\r\n\r\n vm.reportDetailsModel = criteria;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n }\r\n\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid(_, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.gridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function onReadGrid() {\r\n vm.gridDataSource.read();\r\n }\r\n\r\n function onClearFilters() {\r\n vm.gridDataSource.filter({});\r\n }\r\n\r\n\r\n function generateGridWithSelectedValues() {\r\n\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n populateCriteriaModel();\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n\r\n SavedReportSelectorService.queryGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n }\r\n\r\n function deleteFilter(id) {\r\n CustomReportServices.deleteFilterFilterManager(vm, id);\r\n }\r\n\r\n function setLayout() {\r\n if (!$rootScope.loadedSavedReport) {\r\n CustomReportServices.loadSavedGridLayout(vm);\r\n }\r\n }\r\n\r\n\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function getReportMetadata() {\r\n if (vm.reportId) {\r\n let response = await reportsDataService.getReportMetadata(vm.reportId);\r\n vm.reportMetadata = response.data._embedded.reportData;\r\n vm.reportMetadata.Columns = setupMetaDataColumns(vm.reportMetadata.Columns);\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n vm.filterCriteria.fields.forEach(field => field.displayName = $filter('insertSpaceBetweenCapitalWords')(field.displayName));\r\n return vm.reportMetadata;\r\n }\r\n }\r\n // ---\r\n\r\n async function openEditIncidentModal(incident) {\r\n\r\n let openModal = $uibModal.open({\r\n templateUrl: '/App/Components/TransactionMonitoring/Incidents/EditIncidentModal/editIncidentModal.tmpl.html',\r\n controller: editIncidentModalController,\r\n controllerAs: 'eimvm',\r\n backdrop: 'static',\r\n scope: $scope,\r\n resolve: {\r\n incident: () => incident\r\n }\r\n });\r\n\r\n await openModal.result;\r\n vm.gridDataSource.read();\r\n }\r\n}","import incidentManagementController from \"./incidentManagement.controller\";\r\n\r\n/* incidentManagement.component.js */\r\n\r\n/**\r\n * @desc component for Oracle EBS Transaction Monitoring Incident Management\r\n * @example \r\n */\r\n\r\nconst transactionMonitoringIncidentManagement = {\r\n controller: incidentManagementController,\r\n controllerAs: 'imvm',\r\n templateUrl: '/App/Components/TransactionMonitoring/Incidents/incidentManagement.tmpl.html'\r\n};\r\n\r\nexport default transactionMonitoringIncidentManagement;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getControl,\r\n getListOfControls,\r\n updateControl,\r\n updateControlConditions,\r\n scheduleControl,\r\n disableControlSchedule,\r\n onDemandControl,\r\n getGlobalParameters,\r\n updateGlobalParameter\r\n };\r\n\r\n return service;\r\n\r\n // Controls\r\n\r\n async function getControl(controlId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/transactionmonitoring/or/controls/${controlId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n async function getListOfControls() {\r\n try {\r\n return await $http.get(`${apiUrl}api/transactionmonitoring/or/controls`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n async function updateControl(controlId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/transactionmonitoring/or/controls/${controlId}`, putData)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n async function updateControlConditions(controlId, conditionId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/transactionmonitoring/or/controls/${controlId}/conditions/${conditionId}`, putData)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n // Control Schedule\r\n\r\n async function scheduleControl(controlId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/transactionmonitoring/or/controls/${controlId}/schedule`, putData)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n async function disableControlSchedule(controlId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/transactionmonitoring/or/controls/${controlId}/schedule/disable`, putData)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n // Send control for processing\r\n\r\n async function onDemandControl(controlId) {\r\n try {\r\n return await $http.put(`${apiUrl}api/transactionmonitoring/or/controls/${controlId}/run`)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n // Global Parameters\r\n\r\n async function getGlobalParameters() {\r\n try {\r\n return await $http.get(`${apiUrl}api/transactionmonitoring/or/controls/conditiontypes`)\r\n } catch (err) {\r\n showError(err);\r\n sendError();\r\n };\r\n }\r\n\r\n async function updateGlobalParameter(conditionTypeId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/transactionmonitoring/or/controls/conditiontypes/${conditionTypeId}`, putData)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n // Error Handling\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getIncidentLogsByControlId,\r\n getStatuses, \r\n updateIncident\r\n };\r\n\r\n return service;\r\n\r\n async function getIncidentLogsByControlId(controlId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/transactionmonitoring/or/controls/${controlId}/imports`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n async function getStatuses() {\r\n try {\r\n return await $http.get(`${apiUrl}api/transactionmonitoring/or/statuses`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateIncident(incidentId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/transactionmonitoring/or/incidents/${incidentId}`, putData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n };\r\n }\r\n\r\n // Error Handling\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","import angular from 'angular';\r\nimport controlManagementDataServiceFactory from '../Components/TransactionMonitoring/ControlManagement/controlManagementDataService.factory';\r\nimport incidentManagementDataServiceFactory from '../Components/TransactionMonitoring/Incidents/incidentManagementDataService.factory';\r\n\r\nexport default angular\r\n .module('app.transactionMonitoring.factories', [])\r\n .factory('controlManagementDataService', controlManagementDataServiceFactory)\r\n .factory('incidentManagementDataService', incidentManagementDataServiceFactory)\r\n .name;","import angular from 'angular';\r\nimport controlManagement from '../Components/TransactionMonitoring/ControlManagement/controlManagement.component';\r\nimport transactionMonitoringIncidentManagement from '../Components/TransactionMonitoring/Incidents/incidentManagement.component';\r\nimport transactionMonitoringFactoriesModule from './transactionMonitoring.factories.module';\r\n\r\nexport default angular\r\n .module('app.transactionMonitoring', [transactionMonitoringFactoriesModule])\r\n .component('controlManagement', controlManagement)\r\n .component('transactionMonitoringIncidentManagement', transactionMonitoringIncidentManagement)\r\n .name;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, ownershipGroup, isImport, helperService, ownershipGroupsDataService) {\r\n const vm = this;\r\n\r\n vm.isImport = isImport;\r\n\r\n vm.saveOwnershipGroup = saveOwnershipGroup;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n function activate() {\r\n getOwnershipGroupTypes();\r\n }\r\n\r\n async function saveOwnershipGroup() {\r\n vm.successText = 'Saved';\r\n vm.savePending = new createSpinner();\r\n if (vm.ownershipGroup.Id) {\r\n editGroup();\r\n } else if (isImport) {\r\n importOwnershipGroups();\r\n } else {\r\n createGroup();\r\n }\r\n }\r\n\r\n async function createGroup() {\r\n let data = { Name: vm.ownershipGroup.Name, TypeId: vm.ownershipGroup.Type.Id };\r\n try {\r\n let response = await ownershipGroupsDataService.createGroup(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(response.data);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function editGroup() {\r\n let data = { Name: vm.ownershipGroup.Name, GroupId: vm.ownershipGroup.Id };\r\n delete data.Id;\r\n try {\r\n await ownershipGroupsDataService.updateGroup(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function importOwnershipGroups() {\r\n vm.successText = 'Import Started';\r\n let fd = new FormData();\r\n fd.append(vm.files.files[0].name, vm.files.files[0].file);\r\n\r\n try {\r\n await ownershipGroupsDataService.importOwnershipGroups(fd);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n async function getOwnershipGroupTypes() {\r\n let response = await ownershipGroupsDataService.getOwnershipGroupTypes();\r\n vm.typesDataSource = response.data;\r\n if (vm.typesDataSource.length === 1) {\r\n vm.ownershipGroup.Type = vm.typesDataSource[0].Name;\r\n }\r\n }\r\n\r\n function close(roleId) {\r\n $uibModalInstance.close(roleId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport ownershipGroupModalController from \"./ownershipGroupModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (ownershipGroupsDataService, helperService, $uibModal, $filter, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedOwnershipGroup = changeSelectedOwnershipGroup;\r\n vm.deleteOwnershipGroup = deleteOwnershipGroup;\r\n vm.openOwnershipGroupModal = openOwnershipGroupModal;\r\n vm.exportOwnershipGroups = exportOwnershipGroups;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openOwnershipGroupModal(item.ownershipGroup, false);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteOwnershipGroup(item.ownershipGroup);\r\n }\r\n }\r\n ];\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n getOwnershipGroups();\r\n }\r\n\r\n async function getOwnershipGroups() {\r\n vm.ownershipGroupsLoading = true;\r\n let response = await ownershipGroupsDataService.getOwnershipGroups();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.ownershipGroups = response.data;\r\n vm.ownershipGroupsLoading = false;\r\n }\r\n\r\n function changeSelectedOwnershipGroup(ownershipGroup) {\r\n vm.selectedOwnershipGroup = ownershipGroup;\r\n vm.onSelectedOwnershipGroupChanged({ ownershipGroup });\r\n }\r\n\r\n async function openOwnershipGroupModal(ownershipGroup, isImport) {\r\n let ownershipGroupModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupsList/ownershipGroupModal.tmpl.html',\r\n controller: ownershipGroupModalController,\r\n controllerAs: 'ogmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => ownershipGroup || null,\r\n isImport: () => isImport || null\r\n }\r\n });\r\n\r\n try {\r\n let newOwnershipGroupId = await ownershipGroupModal.result;\r\n if (!isImport) {\r\n await getOwnershipGroups();\r\n }\r\n if (newOwnershipGroupId) {\r\n // We know a new ownership group was created so we need to select it\r\n changeSelectedOwnershipGroup(vm.ownershipGroups.find(group => group.Id === newOwnershipGroupId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function deleteOwnershipGroup(ownershipGroup) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Delete Ownership Group`, `Are you sure you want to delete Ownership Group ${ownershipGroup.Name}?`, `Yes`, 'No'))\r\n await ownershipGroupsDataService.deleteGroup(ownershipGroup.Id);\r\n getOwnershipGroups();\r\n if (vm.selectedOwnershipGroup.Id === ownershipGroup.Id) {\r\n changeSelectedOwnershipGroup(null);\r\n } \r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function exportOwnershipGroups() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n const response = await ownershipGroupsDataService.exportOwnershipGroups();\r\n await helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(response.data, 'OwnershipGroups.xlsx');\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n}","import ownershipGroupsListController from \"./ownershipGroupsList.controller\";\r\n\r\n/* ownershipGroupsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of ownership groups\r\n * @example \r\n */\r\n\r\nconst ownershipGroupsList = {\r\n bindings: {\r\n onSelectedOwnershipGroupChanged: '&',\r\n },\r\n controller: ownershipGroupsListController,\r\n controllerAs: 'oglvm',\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupsList/ownershipGroupsList.tmpl.html'\r\n};\r\n\r\nexport default ownershipGroupsList;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getOwnershipGroups,\r\n getOwnershipGroupTypes,\r\n exportOwnershipGroups,\r\n createGroup,\r\n addItemsToGroupObject,\r\n addOwnersToGroupObject,\r\n updateGroup,\r\n importOwnershipGroups,\r\n deleteGroup\r\n };\r\n\r\n return factory;\r\n\r\n async function getOwnershipGroups() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getOwnershipGroupTypes() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/types`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function exportOwnershipGroups() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createGroup(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/ownershipgroups`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addItemsToGroupObject(ownershipGroup, groupOwner, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/owners/${groupOwner.Id}/additems`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addOwnersToGroupObject(groupId, type, itemId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/items/${itemId}/addowners`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateGroup(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/ownershipgroups/${data.GroupId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importOwnershipGroups(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/ownershipgroups/import`, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n \r\n\r\n async function deleteGroup(groupId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/ownershipgroups/${groupId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getGroupOwners,\r\n getAllOwners,\r\n getAvailableOwners,\r\n getAvailableOwnersForItem,\r\n getGroupItemOwners,\r\n addOwnerToGroup,\r\n removeOwnerFromOwnershipGroup \r\n };\r\n\r\n return factory;\r\n\r\n async function getGroupOwners(groupId, type) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/owners`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAllOwners() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/allowners`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableOwners(groupId, type) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/availableowners`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableOwnersForItem(groupId, groupItemId, type) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/items/${groupItemId}/availableowners`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getGroupItemOwners(ownershipGroup, groupItem) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/items/${groupItem.Id}/owners`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addOwnerToGroup(groupId, type, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/owner`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeOwnerFromOwnershipGroup(groupId, type, ownerId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/owners/${ownerId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, existingOwners, helperService, ownershipGroupOwnerDataService, ownershipGroupItemsDataService) {\r\n const vm = this;\r\n\r\n vm.saveRoleOwner = saveRoleOwner;\r\n vm.selectedRoleTypeChanged = selectedRoleTypeChanged;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.selectedRoleType = 'Role';\r\n setupRoleDropdown();\r\n await getOwners();\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let response = await ownershipGroupOwnerDataService.getAvailableOwners(ownershipGroup.Id, ownershipGroup.GroupType);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n response.data = response.data.filter(masterOwner => !existingOwners.some(owner => owner.Id === masterOwner.Id));\r\n vm.availableOwnersDataSource = response.data;\r\n vm.ownersDataSourceLoading = false;\r\n }\r\n\r\n function setupRoleDropdown() {\r\n vm.rolesDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.rolesDataSource, 'Identifier'));\r\n }\r\n },\r\n height: 325\r\n };\r\n\r\n\r\n vm.roleDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n let { data } = await ownershipGroupItemsDataService.getAllItems(ownershipGroup);\r\n data = data.filter(role => role.Type === vm.selectedRoleType);\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.rolesDropdown.setOptions({ placeholder: `-- Select ${$filter('insertSpaceBetweenCapitalWords')(vm.selectedRoleType)}s --` });\r\n vm.rolesDataSource = data;\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function saveRoleOwner() {\r\n vm.savePending = new createSpinner();\r\n let newOwnerId;\r\n let owners = [];\r\n\r\n owners.push(vm.selectedOwner);\r\n\r\n let data = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: owners,\r\n Items: vm.selectedRoles\r\n };\r\n\r\n try {\r\n let response = await ownershipGroupOwnerDataService.addOwnerToGroup(ownershipGroup.Id, ownershipGroup.GroupType, data);\r\n newOwnerId = response.data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newOwnerId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedRoleTypeChanged() {\r\n vm.rolesDropdown.value([]);\r\n vm.selectedRoles = null;\r\n vm.roleDropdownDataSource.read();\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwner = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(ownerId) {\r\n $uibModalInstance.close(ownerId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, helperService, ownershipGroupOwnerDataService, ownershipGroupItemsDataService) {\r\n const vm = this;\r\n\r\n vm.saveProductOwner = saveProductOwner;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getProducts();\r\n await getOwners();\r\n\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function getProducts() {\r\n vm.productsDataSourceLoading = true;\r\n let { data } = await ownershipGroupItemsDataService.getAllItems(ownershipGroup);\r\n vm.productsDataSource = data;\r\n vm.productsDataSourceLoading = false;\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let { data } = await ownershipGroupOwnerDataService.getAvailableOwners(ownershipGroup.Id, ownershipGroup.GroupType);\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.availableOwnersDataSource = data;\r\n vm.ownersDataSourceLoading = false;\r\n }\r\n\r\n async function saveProductOwner() {\r\n vm.savePending = new createSpinner();\r\n let newOwnerId;\r\n let productIds = vm.selectedProducts.map(product => product.ProductId);\r\n\r\n let postData = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: [vm.selectedOwner],\r\n ProductIds: productIds\r\n };\r\n\r\n try {\r\n const { data } = await ownershipGroupOwnerDataService.addOwnerToGroup(ownershipGroup.Id, ownershipGroup.GroupType, postData);\r\n newOwnerId = data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newOwnerId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(newOwnerId) {\r\n $uibModalInstance.close(newOwnerId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, helperService, ownershipGroupItemsDataService, riskRulesetService, ownershipGroupOwnerDataService) {\r\n const vm = this;\r\n\r\n vm.saveBusinessProcessOwner = saveBusinessProcessOwner;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.setupBusinessProcessDropdown = setupBusinessProcessDropdown;\r\n vm.changeRuleset = changeRuleset;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getRulesets();\r\n await getOwners();\r\n\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function getRulesets() {\r\n let { data } = await riskRulesetService.getRiskRulesetList();\r\n vm.rulesets = data;\r\n\r\n vm.selectedRuleset = vm.rulesets.find(ruleset => ruleset.IsDefault).RulesetId;\r\n setupBusinessProcessDropdown();\r\n }\r\n\r\n function changeRuleset() {\r\n vm.selectedBusinessProcesses = null;\r\n vm.businessProcessDropdownDataSource.read();\r\n }\r\n\r\n async function setupBusinessProcessDropdown() {\r\n\r\n vm.businessProcessDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.businessProcessDataSource, 'BusinessProcessId'));\r\n }\r\n },\r\n height: 325\r\n };\r\n\r\n vm.businessProcessDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n const { data } = await ownershipGroupItemsDataService.getAllBusinessProcesses(ownershipGroup.Id, vm.selectedRuleset);\r\n vm.businessProcessDropdown.setOptions({ placeholder: `-- Select Business Processes --` });\r\n vm.businessProcessDataSource = data;\r\n options.success(data);\r\n }\r\n }\r\n });\r\n\r\n return vm.businessProcessDropdownDataSource;\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let { data } = await ownershipGroupOwnerDataService.getAvailableOwners(ownershipGroup.Id, ownershipGroup.GroupType);\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.availableOwnersDataSource = data;\r\n vm.ownersDataSourceLoading = false;\r\n }\r\n\r\n async function saveBusinessProcessOwner() {\r\n vm.savePending = new createSpinner();\r\n let newOwnerId;\r\n let postData = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: [vm.selectedOwner],\r\n BusinessProcessIds: vm.selectedBusinessProcesses\r\n };\r\n\r\n try {\r\n let { data } = await ownershipGroupOwnerDataService.addOwnerToGroup(ownershipGroup.Id, ownershipGroup.GroupType, postData);\r\n newOwnerId = data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newOwnerId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(newOwnerId) {\r\n $uibModalInstance.close(newOwnerId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $http, $filter, existingOwners, ownershipGroup, helperService, riskRulesetService, risksDataService, ownershipGroupOwnerDataService, ownershipGroupItemsDataService) {\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.saveRiskOwner = saveRiskOwner;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.selectedRiskInfoChanged = selectedRiskInfoChanged;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getRulesets();\r\n await getOwners();\r\n \r\n getRiskTypes();\r\n\r\n vm.selectedRiskType = 0;\r\n vm.selectedOwnerType = 'User';\r\n\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let { data } = await ownershipGroupOwnerDataService.getAvailableOwners(ownershipGroup.Id, ownershipGroup.GroupType);\r\n data = $filter('orderBy')(data, 'Name');\r\n data = data.filter(masterOwner => !existingOwners.some(owner => owner.Id === masterOwner.Id));\r\n vm.availableOwnersDataSource = data;\r\n vm.ownersDataSourceLoading = false;\r\n }\r\n\r\n async function getRulesets() {\r\n let { data } = await riskRulesetService.getRiskRulesetList();\r\n vm.rulesets = data;\r\n\r\n vm.selectedRulesetId = vm.rulesets.find(ruleset => ruleset.IsDefault).RulesetId;\r\n setupRiskDropdown();\r\n }\r\n\r\n async function getRiskTypes() {\r\n let { data } = await risksDataService.getRiskTypes();\r\n vm.riskTypes = data;\r\n }\r\n\r\n async function setupRiskDropdown() {\r\n vm.riskDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.riskDataSource, 'RiskId'));\r\n }\r\n },\r\n height: 325\r\n };\r\n\r\n vm.kendoRiskDropdownDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n const { data } = await ownershipGroupItemsDataService.getAllRisksForOwner(ownershipGroup.Id, vm.selectedRulesetId);\r\n vm.riskDropdown.setOptions({ placeholder: `-- Select Risks --` });\r\n\r\n\r\n if (vm.selectedRiskType && vm.selectedRiskType === 1) {\r\n vm.riskDataSource = data.filter(risk => risk.RiskType === 'SOD');\r\n } else if (vm.selectedRiskType && vm.selectedRiskType === 2) {\r\n vm.riskDataSource = data.filter(risk => risk.RiskType === 'SA');\r\n } else {\r\n vm.riskDataSource = data;\r\n }\r\n\r\n options.success(vm.riskDataSource);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function selectedRiskInfoChanged() {\r\n vm.riskDropdown.value([]);\r\n vm.selectedRisks = null;\r\n vm.kendoRiskDropdownDataSource.read();\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwner = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n async function saveRiskOwner() {\r\n vm.savePending = new createSpinner();\r\n let newOwnerId;\r\n let owners = [];\r\n\r\n owners.push(vm.selectedOwner);\r\n\r\n let data = {\r\n GroupId: ownershipGroup.Id,\r\n RulesetId: vm.selectedRulesetId,\r\n RiskType: vm.selectedRiskType,\r\n Owners: owners,\r\n RiskIds: vm.selectedRisks\r\n };\r\n\r\n try {\r\n let response = await ownershipGroupOwnerDataService.addOwnerToGroup(ownershipGroup.Id, ownershipGroup.GroupType, data);\r\n newOwnerId = response.data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newOwnerId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(ownerId) {\r\n $uibModalInstance.close(ownerId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, existingOwners, helperService, ownershipGroupOwnerDataService, ownershipGroupItemsDataService) {\r\n const vm = this;\r\n\r\n vm.saveCompanyOwner = saveCompanyOwner;\r\n vm.selectedCompanyTypeChanged = selectedCompanyTypeChanged;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.selectedCompanyType = 'Company';\r\n setupCompanyDropdown();\r\n await setOwners();\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function setOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let { data } = await ownershipGroupOwnerDataService.getAvailableOwners(ownershipGroup.Id, ownershipGroup.GroupType);\r\n data = $filter('orderBy')(data, 'Name');\r\n data = data.filter(masterOwner => !existingOwners.some(owner => owner.Id === masterOwner.Id));\r\n vm.availableOwnersDataSource = data;\r\n vm.ownersDataSourceLoading = false;\r\n }\r\n\r\n function setupCompanyDropdown() {\r\n vm.companiesDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.companiesDataSource, 'Id'));\r\n }\r\n },\r\n height: 325\r\n };\r\n\r\n\r\n vm.companyDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n let { data } = await ownershipGroupItemsDataService.getAllItems(ownershipGroup);\r\n data = data.filter(company => company.Type === vm.selectedCompanyType);\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.companiesDropdown.setOptions({ placeholder: `-- Select one or more ${$filter('insertSpaceBetweenCapitalWords')(vm.selectedCompanyType)}s --` });\r\n vm.companiesDataSource = data;\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function saveCompanyOwner() {\r\n const data = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: [vm.selectedOwner],\r\n Items: vm.selectedCompanies\r\n };\r\n\r\n vm.savePending = new createSpinner();\r\n\r\n try {\r\n let { data: newOwnerId } = await ownershipGroupOwnerDataService.addOwnerToGroup(ownershipGroup.Id, ownershipGroup.GroupType, data); \r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newOwnerId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedCompanyTypeChanged() {\r\n vm.companiesDropdown.value([]);\r\n vm.selectedCompanies = null;\r\n vm.companyDropdownDataSource.read();\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwner = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(ownerId) {\r\n $uibModalInstance.close(ownerId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport groupOwnerRoleModalController from \"./groupOwnerRoleModal/groupOwnerRoleModal.controller\";\r\nimport groupOwnerProductModalController from \"./groupOwnerProductModal/groupOwnerProductModal.controller\";\r\nimport groupOwnerBusinessProcessModalController from \"./groupOwnerBusinessProcessModal/groupOwnerBusinessProcessModal.controller\";\r\nimport groupOwnerRiskModalController from \"./groupOwnerRiskModal/groupOwnerRiskModal.controller\";\r\nimport groupOwnerCompaniesModalController from \"./groupOwnerCompaniesModal/groupOwnerCompaniesModal.controller\";\r\n\r\n\r\nexport default /*@ngInject*/ function (ownershipGroupOwnerDataService, helperService, $uibModal, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedOwner = changeSelectedOwner;\r\n vm.openGroupOwnerItemModal = openGroupOwnerItemModal;\r\n vm.removeOwnerFromGroup = removeOwnerFromGroup;\r\n vm.changeGroupItemType = changeGroupItemType;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n vm.selectedOwner = null;\r\n await getOwners();\r\n vm.ownersRadioFilter = null;\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersLoading = true;\r\n let response = await ownershipGroupOwnerDataService.getGroupOwners(vm.selectedOwnershipGroup.Id, vm.selectedOwnershipGroup.GroupType);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.owners = response.data;\r\n vm.ownersLoading = false;\r\n return vm.owners;\r\n }\r\n\r\n async function changeSelectedOwner(owner) {\r\n vm.selectedOwner = owner;\r\n vm.onSelectedOwnerChange({ owner });\r\n }\r\n\r\n async function removeOwnerFromGroup(owner) {\r\n try {\r\n await ownershipGroupOwnerDataService.removeOwnerFromOwnershipGroup(vm.selectedOwnershipGroup.Id, vm.selectedOwnershipGroup.GroupType, owner.Id);\r\n if (owner.Id === vm.selectedOwner.Id) {\r\n vm.selectedOwner = null;\r\n changeSelectedOwner(null);\r\n }\r\n getOwners();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function changeGroupItemType() {\r\n let groupItemType = vm.selectedGroupItemType;\r\n vm.onGroupItemTypeChange({ groupItemType });\r\n }\r\n\r\n function openGroupOwnerItemModal() {\r\n switch (vm.selectedOwnershipGroup.GroupType) {\r\n case 'role':\r\n openGroupOwnerRoleModal();\r\n break;\r\n case 'product':\r\n openGroupOwnerProductModal();\r\n break;\r\n case 'businessprocess':\r\n openGroupOwnerBusinessProcessModal();\r\n break;\r\n case 'risk':\r\n openGroupOwnerRiskModal();\r\n break;\r\n case 'company':\r\n openGroupOwnerCompaniesModal();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n // Group Owner Item Modals\r\n async function openGroupOwnerRoleModal() {\r\n let ownerModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnerRoleModal/groupOwnerRoleModal.tmpl.html',\r\n controller: groupOwnerRoleModalController,\r\n controllerAs: 'gormvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingOwners: () => vm.owners\r\n }\r\n });\r\n\r\n try {\r\n let ownerId = await ownerModal.result;\r\n await getOwners();\r\n if (ownerId) {\r\n changeSelectedOwner(vm.owners.find(r => r.Id === ownerId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function openGroupOwnerProductModal() {\r\n let ownerProductModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnerProductModal/groupOwnerProductModal.tmpl.html',\r\n controller: groupOwnerProductModalController,\r\n controllerAs: 'gopmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup\r\n }\r\n });\r\n\r\n try {\r\n let ownerId = await ownerProductModal.result;\r\n await getOwners();\r\n if (ownerId) {\r\n changeSelectedOwner(vm.owners.find(r => r.Id === ownerId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function openGroupOwnerBusinessProcessModal() {\r\n let ownerModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnerBusinessProcessModal/groupOwnerBusinessProcessModal.tmpl.html',\r\n controller: groupOwnerBusinessProcessModalController,\r\n controllerAs: 'gobpmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup\r\n }\r\n });\r\n\r\n try {\r\n let ownerId = await ownerModal.result;\r\n await getOwners();\r\n if (ownerId) {\r\n changeSelectedOwner(vm.owners.find(r => r.Id === ownerId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n\r\n async function openGroupOwnerRiskModal() {\r\n let ownerModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnerRiskModal/groupOwnerRiskModal.tmpl.html',\r\n controller: groupOwnerRiskModalController,\r\n controllerAs: 'gormvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingOwners: () => vm.owners\r\n }\r\n });\r\n\r\n try {\r\n let ownerId = await ownerModal.result;\r\n await getOwners();\r\n if (ownerId) {\r\n changeSelectedOwner(vm.owners.find(r => r.Id === ownerId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function openGroupOwnerCompaniesModal() {\r\n let ownerCompanyModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnerCompaniesModal/groupOwnerCompaniesModal.tmpl.html',\r\n controller: groupOwnerCompaniesModalController,\r\n controllerAs: 'gocmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingOwners: () => vm.owners\r\n }\r\n });\r\n\r\n try {\r\n let ownerId = await ownerCompanyModal.result;\r\n await getOwners();\r\n if (ownerId) {\r\n changeSelectedOwner(vm.owners.find(owner => owner.Id === ownerId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import groupOwnersListController from \"./groupOwnersList.controller\";\r\n\r\n/* groupOwnersList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of ownership group owners\r\n * @example \r\n */\r\n\r\nconst groupOwnersList = {\r\n bindings: {\r\n selectedOwnershipGroup: '<',\r\n selectedGroupItemType: '<',\r\n onGroupItemTypeChange: '&',\r\n onSelectedOwnerChange: '&'\r\n },\r\n controller: groupOwnersListController,\r\n controllerAs: 'golvm',\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnersList.tmpl.html'\r\n};\r\n\r\nexport default groupOwnersList;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, existingRoles, helperService, ownershipGroupItemsDataService, ownershipGroupOwnerDataService) {\r\n const vm = this;\r\n\r\n vm.saveRole = saveRole;\r\n vm.selectedRoleTypeChanged = selectedRoleTypeChanged;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.selectedRoleType = 'Role';\r\n setupRoleDropdown();\r\n await getOwners();\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function setupRoleDropdown() {\r\n\r\n vm.roleDropdownOptions = {\r\n filter: \"contains\",\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325,\r\n optionLabel: '-- Select a Role --'\r\n };\r\n\r\n\r\n vm.roleDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n let { data } = await ownershipGroupItemsDataService.getAvailableItems(ownershipGroup);\r\n vm.rolesDataSource = data.filter(masterRole => !existingRoles.some(role => role.Identifier === masterRole.Identifier) && masterRole.Type === vm.selectedRoleType);\r\n options.success(vm.rolesDataSource);\r\n }\r\n }\r\n });\r\n\r\n return vm.roleDropdownDataSource;\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let response = await ownershipGroupOwnerDataService.getAllOwners(ownershipGroup.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.availableOwnersDataSource = response.data;\r\n vm.ownersDataSourceLoading = false;\r\n return vm.availableOwnersDataSource;\r\n }\r\n\r\n async function saveRole() {\r\n vm.savePending = new createSpinner();\r\n let newRoleId;\r\n let items = [];\r\n items.push(vm.selectedRole);\r\n let data = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: vm.selectedOwners,\r\n Items: items\r\n };\r\n\r\n try {\r\n\r\n data.SecurityRoleIdentifier = vm.selectedRole.SecurityRoleIdentifier;\r\n let response = await ownershipGroupItemsDataService.addItemToGroup(data, ownershipGroup.Id, ownershipGroup.GroupType);\r\n newRoleId = response.data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newRoleId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedRoleTypeChanged() {\r\n vm.roleDropdown.value([]);\r\n vm.selectedRole = null;\r\n vm.roleDropdown.setOptions({ optionLabel: `-- Select a ${$filter('insertSpaceBetweenCapitalWords')(vm.selectedRoleType)} --` });\r\n vm.roleDropdownDataSource.read();\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(roleId) {\r\n $uibModalInstance.close(roleId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, existingCompanies, helperService, ownershipGroupItemsDataService, ownershipGroupOwnerDataService) {\r\n const vm = this;\r\n\r\n vm.saveCompany = saveCompany;\r\n vm.selectedCompanyTypeChanged = selectedCompanyTypeChanged;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.selectedCompanyType = 'Company';\r\n setupCompanyDropdown();\r\n await setOwners();\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function setupCompanyDropdown() {\r\n\r\n vm.companyDropdownOptions = {\r\n filter: \"contains\",\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325,\r\n optionLabel: '-- Select a Company --'\r\n };\r\n\r\n\r\n vm.companyDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n let { data } = await ownershipGroupItemsDataService.getAvailableItems(ownershipGroup);\r\n vm.companiesDataSource = data.filter(masterCompany => !existingCompanies.some(company => company.CompanyId === masterCompany.CompanyId) && masterCompany.Type === vm.selectedCompanyType);\r\n options.success(vm.companiesDataSource);\r\n }\r\n }\r\n });\r\n\r\n return vm.companyDropdownDataSource;\r\n }\r\n\r\n async function setOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let { data } = await ownershipGroupOwnerDataService.getAllOwners(ownershipGroup.Id);\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.availableOwnersDataSource = data;\r\n vm.ownersDataSourceLoading = false;\r\n }\r\n\r\n async function saveCompany() {\r\n vm.savePending = new createSpinner();\r\n const data = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: vm.selectedOwners,\r\n Items: [vm.selectedCompany],\r\n SecurityCompanyIdentifier: vm.selectedCompany.SecurityCompanyIdentifier\r\n };\r\n\r\n try {\r\n \r\n let { data: newCompanyId } = await ownershipGroupItemsDataService.addItemToGroup(data, ownershipGroup.Id, ownershipGroup.GroupType);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newCompanyId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedCompanyTypeChanged() {\r\n vm.companyDropdown.value([]);\r\n vm.selectedCompany = null;\r\n vm.companyDropdown.setOptions({ optionLabel: `-- Select a ${$filter('insertSpaceBetweenCapitalWords')(vm.selectedCompanyType)} --` });\r\n vm.companyDropdownDataSource.read();\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(companyId) {\r\n $uibModalInstance.close(companyId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, dataService, helperService, ownershipGroupItemsDataService, ownershipGroupOwnerDataService) {\r\n const vm = this;\r\n\r\n vm.saveProduct = saveProduct;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getProducts();\r\n await getOwners();\r\n\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function getProducts() {\r\n let { data } = await ownershipGroupItemsDataService.getAvailableItems(ownershipGroup);\r\n vm.products = data;\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let response = await ownershipGroupOwnerDataService.getAllOwners(ownershipGroup.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.availableOwnersDataSource = response.data;\r\n vm.ownersDataSourceLoading = false;\r\n return vm.availableOwnersDataSource;\r\n }\r\n\r\n async function saveProduct() {\r\n vm.savePending = new createSpinner();\r\n let newProductId;\r\n let productIds = [vm.selectedProduct];\r\n let postData = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: vm.selectedOwners,\r\n ProductIds: productIds\r\n };\r\n\r\n try {\r\n const { data } = await ownershipGroupItemsDataService.addItemToGroup(postData, ownershipGroup.Id, ownershipGroup.GroupType);\r\n newProductId = data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newProductId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(productId) {\r\n $uibModalInstance.close(productId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, helperService, ownershipGroupItemsDataService, riskRulesetService, ownershipGroupOwnerDataService) {\r\n const vm = this;\r\n\r\n vm.saveBusinessProcess = saveBusinessProcess;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.setupBusinessProcessDropdown = setupBusinessProcessDropdown;\r\n vm.changeRuleset = changeRuleset;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getRulesets();\r\n await getOwners();\r\n\r\n vm.selectedOwnerType = 'User';\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function getRulesets() {\r\n let { data } = await riskRulesetService.getRiskRulesetList();\r\n vm.rulesets = data;\r\n\r\n vm.selectedRuleset = vm.rulesets.find(ruleset => ruleset.IsDefault).RulesetId;\r\n setupBusinessProcessDropdown();\r\n }\r\n\r\n function changeRuleset() {\r\n vm.selectedBusinessProcess = null;\r\n vm.businessProcessDropdownDataSource.read();\r\n }\r\n\r\n async function setupBusinessProcessDropdown() {\r\n\r\n vm.businessProcessDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325,\r\n optionLabel: '-- Select a Business Process --'\r\n };\r\n\r\n vm.businessProcessDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n const { data } = await ownershipGroupItemsDataService.getAvailableBusinessProcesses(ownershipGroup.Id, vm.selectedRuleset);\r\n vm.bpDataSource = data;\r\n options.success(vm.bpDataSource);\r\n }\r\n }\r\n });\r\n\r\n return vm.businessProcessDropdownDataSource;\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let response = await ownershipGroupOwnerDataService.getAllOwners(ownershipGroup.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.availableOwnersDataSource = response.data;\r\n vm.ownersDataSourceLoading = false;\r\n return vm.availableOwnersDataSource;\r\n }\r\n\r\n async function saveBusinessProcess() {\r\n vm.savePending = new createSpinner();\r\n\r\n let newBusinessProcessId;\r\n let data = {\r\n GroupId: ownershipGroup.Id,\r\n Owners: vm.selectedOwners,\r\n BusinessProcessIds: [vm.selectedBusinessProcess.BusinessProcessId]\r\n };\r\n\r\n try {\r\n let response = await ownershipGroupItemsDataService.addItemToGroup(data, ownershipGroup.Id, ownershipGroup.GroupType);\r\n newBusinessProcessId = response.data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(newBusinessProcessId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(bpId) {\r\n $uibModalInstance.close(bpId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, riskCriteriaItem, modalType, riskLevelsData, businessCyclesDataService, risksDataService, helperService, ownershipGroupItemsDataService, riskRulesetService, ownershipGroupOwnerDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.saveRisk = saveRisk;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.updateRiskInfo = updateRiskInfo;\r\n vm.resetDropdowns = resetDropdowns;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n vm.modalType = modalType;\r\n\r\n vm.selectedBusinessCycles = [];\r\n vm.selectedRiskLevels = [];\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getRulesets();\r\n await getOwners();\r\n\r\n await getRiskTypes();\r\n await getBusinessCycles();\r\n await getRiskLevels();\r\n\r\n vm.selectedOwnerType = 'User';\r\n if (modalType === 'edit') {\r\n vm.riskCreationType = 'Risk Criteria';\r\n vm.riskCriteriaName = riskCriteriaItem.Name;\r\n setupRiskCriteriaGrid();\r\n } else {\r\n vm.riskCreationType = 'Risk';\r\n vm.selectedRiskType = 0;\r\n }\r\n selectedOwnerTypeChanged();\r\n }\r\n\r\n async function getRulesets() {\r\n let { data } = await riskRulesetService.getRiskRulesetList();\r\n vm.rulesets = data;\r\n\r\n vm.defaultRulesetId = vm.rulesets.find(ruleset => ruleset.IsDefault).RulesetId;\r\n if (modalType === 'edit') {\r\n vm.selectedRulesetId = riskCriteriaItem.RulesetId;\r\n } else {\r\n vm.selectedRulesetId = vm.defaultRulesetId;\r\n await setupRiskDropdown();\r\n await setupRiskCriteriaGrid();\r\n }\r\n\r\n }\r\n\r\n async function getRiskTypes() {\r\n let typeId;\r\n let { data } = await risksDataService.getRiskTypes();\r\n vm.riskTypes = data;\r\n\r\n if (modalType === 'edit') {\r\n if (riskCriteriaItem.RiskCriteria.RiskType === 'SOD') {\r\n typeId = 1;\r\n } else if (riskCriteriaItem.RiskCriteria.RiskType === 'SA') {\r\n typeId = 2;\r\n } else {\r\n typeId = 0;\r\n }\r\n vm.selectedRiskType = typeId;\r\n }\r\n }\r\n\r\n async function getBusinessCycles() {\r\n let { data } = await businessCyclesDataService.getBusinessCycles();\r\n vm.businessCyclesDataSource = data;\r\n\r\n if (modalType === 'edit') {\r\n vm.businessCycleIds = riskCriteriaItem.RiskCriteria.BusinessCycleIds.length ? riskCriteriaItem.RiskCriteria.BusinessCycleIds : [];\r\n vm.selectedBusinessCycles = riskCriteriaItem.RiskCriteria.BusinessCycleIds.map(id => vm.businessCyclesDataSource.find(cycle => cycle.ID === id));\r\n }\r\n }\r\n\r\n async function getRiskLevels() {\r\n vm.riskLevelsDataSourceLoading = true;\r\n let { data } = await riskLevelsData.getRiskLevels();\r\n vm.riskLevelsDataSource = data;\r\n vm.riskLevelsDataSourceLoading = false;\r\n\r\n if (modalType === 'edit') {\r\n vm.riskLevelIds = riskCriteriaItem.RiskCriteria.RiskLevelIds.length ? riskCriteriaItem.RiskCriteria.RiskLevelIds : [];\r\n vm.selectedRiskLevels = riskCriteriaItem.RiskCriteria.RiskLevelIds.map(id => vm.riskLevelsDataSource.find(level => level.Id === id));\r\n }\r\n }\r\n\r\n async function setupRiskDropdown() {\r\n\r\n vm.riskDropdownOptions = {\r\n filter: \"contains\",\r\n minLength: 3,\r\n virtual: {\r\n itemHeight: 26\r\n },\r\n height: 325,\r\n optionLabel: '-- Select a Risk --'\r\n };\r\n\r\n vm.riskDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n const { data } = await ownershipGroupItemsDataService.getAvailableRisks(ownershipGroup.Id, vm.selectedRulesetId);\r\n\r\n if (vm.selectedRiskType === 1) {\r\n vm.riskDataSource = data.filter(risk => risk.RiskType === 'SOD');\r\n } else if (vm.selectedRiskType === 2) {\r\n vm.riskDataSource = data.filter(risk => risk.RiskType === 'SA');\r\n } else {\r\n vm.riskDataSource = data;\r\n }\r\n\r\n options.success(vm.riskDataSource);\r\n }\r\n }\r\n });\r\n\r\n return vm.riskDropdownDataSource;\r\n }\r\n\r\n function setupRiskCriteriaGrid() {\r\n vm.riskCriteriaGridColumns = [\r\n { field: \"RiskName\", title: \"Risk\", width: 120, filterable: customAutoCompleteFilter },\r\n { field: \"RiskDescription\", title: \"Risk Description\", width: 120, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.riskCriteriaGridOptions = helperService.setMainGridOptions(vm.riskCriteriaGridColumns, 400);\r\n\r\n vm.riskCriteriaGridDataSource = new kendo.data.DataSource({\r\n schema: {\r\n data: \"_embedded.reportData\",\r\n total: \"TotalItems\"\r\n },\r\n pageSize: standardGridPageSize,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n noRecords: {\r\n template: \"No items to display
\"\r\n },\r\n transport: {\r\n read: async options => {\r\n try {\r\n let sortsAndFilters = await helperService.prepareSortsAndFilters(options);\r\n\r\n if (vm.selectedRulesetId) {\r\n sortsAndFilters.Filters.push({ FieldName: \"RulesetId\", Operator: \"Equals\", Value: vm.selectedRulesetId });\r\n }\r\n\r\n if (vm.selectedRiskType) {\r\n sortsAndFilters.Filters.push({ FieldName: \"RiskTypeId\", Operator: \"Equals\", Value: vm.selectedRiskType });\r\n }\r\n\r\n if (vm.selectedRiskLevels) {\r\n vm.riskLevelIds.forEach(levelId => {\r\n sortsAndFilters.Filters.push({ FieldName: \"RiskLevelId\", Operator: \"Equals\", Value: levelId });\r\n }); \r\n }\r\n\r\n if (vm.selectedBusinessCycles) {\r\n vm.businessCycleIds.forEach(cycleId => {\r\n sortsAndFilters.Filters.push({ FieldName: \"BusinessCycleId\", Operator: \"Equals\", Value: cycleId });\r\n });\r\n }\r\n\r\n const { page, pageSize } = options.data,\r\n { data } = await ownershipGroupItemsDataService.getRisksByRiskCriteria(ownershipGroup.Id, sortsAndFilters, page, pageSize);\r\n\r\n options.success(data);\r\n } catch (err) {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function resetDropdowns() {\r\n vm.selectedOwners = null;\r\n vm.selectedRisk = null;\r\n vm.selectedRiskType = 0;\r\n vm.selectedRulesetId = vm.defaultRulesetId;\r\n vm.selectedRiskLevels = [];\r\n vm.selectedBusinessCycles = [];\r\n vm.riskCriteriaName = null;\r\n }\r\n\r\n function updateRiskInfo() {\r\n if (vm.riskCreationType === 'Risk') {\r\n vm.selectedRisk = null;\r\n vm.riskDropdown.value([]);\r\n vm.riskDropdownDataSource.read();\r\n } else {\r\n vm.riskLevelIds = vm.selectedRiskLevels.map(level => level.Id);\r\n vm.businessCycleIds = vm.selectedBusinessCycles.map(cycle => cycle.ID);\r\n if (vm.riskCriteriaGridDataSource) {\r\n vm.riskCriteriaGridDataSource.read();\r\n }\r\n }\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n let response = await ownershipGroupOwnerDataService.getAllOwners(ownershipGroup.Id);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.availableOwnersDataSource = response.data;\r\n vm.ownersDataSourceLoading = false;\r\n return vm.availableOwnersDataSource;\r\n }\r\n\r\n async function saveRisk() {\r\n vm.savePending = new createSpinner();\r\n let data,\r\n riskId;\r\n\r\n if (modalType === 'edit') {\r\n data = {\r\n ItemId: riskCriteriaItem.Id,\r\n RiskCriteriaName: vm.riskCriteriaName,\r\n RiskType: vm.selectedRiskType,\r\n RulesetId: vm.selectedRulesetId,\r\n RiskLevelIds: vm.riskLevelIds,\r\n BusinessCycleIds: vm.businessCycleIds\r\n };\r\n } else {\r\n data = {\r\n GroupId: ownershipGroup.Id,\r\n RiskCriteriaName: vm.riskCriteriaName,\r\n Owners: vm.selectedOwners,\r\n RiskIds: !vm.selectedRisk ? [] : [vm.selectedRisk],\r\n RiskType: vm.selectedRiskType,\r\n RulesetId: vm.selectedRulesetId,\r\n RiskLevelIds: vm.riskLevelIds,\r\n BusinessCycleIds: vm.businessCycleIds\r\n };\r\n }\r\n try {\r\n let response\r\n if (modalType === 'edit') {\r\n response = await ownershipGroupItemsDataService.updateRiskCriteria(ownershipGroup.Id, riskCriteriaItem.Id, data); \r\n } else {\r\n response = await ownershipGroupItemsDataService.addItemToGroup(data, ownershipGroup.Id, ownershipGroup.GroupType);\r\n }\r\n riskId = response.data;\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(riskId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n vm.filteredOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === vm.selectedOwnerType);\r\n }\r\n\r\n function close(bpId) {\r\n $uibModalInstance.close(bpId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import groupRoleModalController from \"../ownershipGroupItemsList/groupRoleModal/groupRoleModal.controller\";\r\nimport groupCompanyModalController from \"../ownershipGroupItemsList/groupCompanyModal/groupCompanyModal.controller\";\r\nimport groupProductModalController from \"../ownershipGroupItemsList/groupProductModal/groupProductModal.controller\";\r\nimport groupBusinessProcessModalController from \"../ownershipGroupItemsList/groupBusinessProcessModal/groupBusinessProcessModal.controller\";\r\nimport groupRiskModalController from \"./groupRiskModal/groupRiskModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (ownershipGroupItemsDataService, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedItem = changeSelectedItem;\r\n vm.openGroupItemModal = openGroupItemModal;\r\n vm.removeItemFromGroup = removeItemFromGroup;\r\n vm.changeGroupItemType = changeGroupItemType;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n vm.selectedItem = null;\r\n await getItems();\r\n vm.itemsRadioFilter = null;\r\n\r\n vm.selectedGroupItemType = 'item';\r\n }\r\n\r\n async function getItems() {\r\n vm.itemsLoading = true;\r\n const { data } = await ownershipGroupItemsDataService.getGroupItems(vm.selectedOwnershipGroup.Id, vm.selectedOwnershipGroup.GroupType);\r\n vm.items = data;\r\n vm.itemsLoading = false;\r\n return vm.items;\r\n }\r\n\r\n async function changeSelectedItem(item) {\r\n vm.selectedItem = item;\r\n vm.onSelectedItemChange({ item });\r\n }\r\n\r\n function openGroupItemModal(item, modalType) {\r\n switch (vm.selectedOwnershipGroup.GroupType) {\r\n case 'role':\r\n openGroupRoleModal();\r\n break;\r\n case 'company':\r\n openGroupCompanyModal();\r\n break;\r\n case 'product':\r\n openGroupProductModal();\r\n break;\r\n case 'businessprocess':\r\n openGroupBusinessProcessModal();\r\n break;\r\n case 'risk':\r\n openGroupRiskModal(item, modalType);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function removeItemFromGroup(item) {\r\n try {\r\n await ownershipGroupItemsDataService.removeItemFromOwnershipGroup(vm.selectedOwnershipGroup.Id, vm.selectedOwnershipGroup.GroupType, item.Id);\r\n if (item.Id === vm.selectedItem.Id) {\r\n vm.selectedItem = null;\r\n changeSelectedItem(null);\r\n }\r\n getItems();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function changeGroupItemType() {\r\n let groupItemType = vm.selectedGroupItemType;\r\n vm.onGroupItemTypeChange({ groupItemType });\r\n }\r\n\r\n // Group Item Modals\r\n async function openGroupRoleModal() {\r\n let roleModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupItemsList/groupRoleModal/groupRoleModal.tmpl.html',\r\n controller: groupRoleModalController,\r\n controllerAs: 'grmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingRoles: () => vm.items\r\n }\r\n });\r\n\r\n try {\r\n let roleId = await roleModal.result;\r\n await getItems();\r\n if (roleId) {\r\n changeSelectedItem(vm.roles.find(r => r.Id === roleId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function openGroupCompanyModal() {\r\n let companyModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupItemsList/groupCompanyModal/groupCompanyModal.tmpl.html',\r\n controller: groupCompanyModalController,\r\n controllerAs: 'gcmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingCompanies: () => vm.items\r\n }\r\n });\r\n\r\n try {\r\n let companyId = await companyModal.result;\r\n await getItems();\r\n if (companyId) {\r\n changeSelectedItem(vm.items.find(item => item.Id === companyId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function openGroupProductModal() {\r\n let productModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupItemsList/groupProductModal/groupProductModal.tmpl.html',\r\n controller: groupProductModalController,\r\n controllerAs: 'gpmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingProducts: () => vm.items\r\n }\r\n });\r\n\r\n try {\r\n let productId = await productModal.result;\r\n await getItems();\r\n if (productId) {\r\n changeSelectedItem(vm.items.find(p => p.Id === productId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function openGroupBusinessProcessModal() {\r\n let businessProcessModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupItemsList/groupBusinessProcessModal/groupBusinessProcessModal.tmpl.html',\r\n controller: groupBusinessProcessModalController,\r\n controllerAs: 'gbpmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingBusinessProcesses: () => vm.items\r\n }\r\n });\r\n\r\n try {\r\n let bpId = await businessProcessModal.result;\r\n await getItems();\r\n if (bpId) {\r\n changeSelectedItem(vm.items.find(bp => bp.Id === bpId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function openGroupRiskModal(item, modalType) {\r\n let riskModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupItemsList/groupRiskModal/groupRiskModal.tmpl.html',\r\n controller: groupRiskModalController,\r\n controllerAs: 'grmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n existingRisks: () => vm.items,\r\n riskCriteriaItem: () => item,\r\n modalType: () => modalType,\r\n }\r\n });\r\n\r\n try {\r\n let riskId = await riskModal.result;\r\n await getItems();\r\n if (riskId) {\r\n changeSelectedItem(vm.items.find(risk => risk.Id === riskId));\r\n }\r\n } catch { return; }\r\n }\r\n}","/* groupItemsList.component.js */\r\n\r\nimport groupItemsListController from \"./groupItemsList.controller\";\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of ownership group items\r\n * @example \r\n */\r\n\r\nconst groupItemsList = {\r\n bindings: {\r\n selectedOwnershipGroup: '<',\r\n selectedGroupItemType: '<',\r\n onGroupItemTypeChange: '&',\r\n onSelectedItemChange: '&'\r\n },\r\n controller: groupItemsListController,\r\n controllerAs: 'gilvm',\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroupItemsList/groupItemsList.tmpl.html'\r\n};\r\n\r\nexport default groupItemsList;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getGroupItems,\r\n getEmergencyAccessGroupRoles,\r\n getAvailableItems,\r\n getAvailableBusinessProcesses,\r\n getAvailableOwnerBusinessProcesses,\r\n getAllBusinessProcesses,\r\n getAvailableOwnerItems,\r\n getAllItems,\r\n getAvailableRisks,\r\n getAvailableRisksByOwner,\r\n getAllRisksForOwner,\r\n getRisksByRiskCriteria,\r\n updateRiskCriteria,\r\n getGroupOwnerItems,\r\n addItemToGroup,\r\n removeItemFromOwnershipGroup,\r\n removeOwnerFromOwnershipGroupItem,\r\n removeItemFromOwnershipGroupOwner\r\n };\r\n\r\n return factory;\r\n\r\n async function getGroupItems(groupId, type) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/items`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getEmergencyAccessGroupRoles(groupId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/role/emergencyaccess`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableItems(ownershipGroup) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/availableitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableBusinessProcesses(groupId, rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/businessprocess/ruleset/${rulesetId}/availableitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableOwnerBusinessProcesses(groupId, ownerId, rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/businessprocess/owners/${ownerId}/ruleset/${rulesetId}/availableitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAllBusinessProcesses(groupId, rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/businessprocess/ruleset/${rulesetId}/allitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableOwnerItems(ownershipGroup, ownerId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/owners/${ownerId}/availableitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAllItems(ownershipGroup) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/allitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableRisks(groupId, rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/risk/ruleset/${rulesetId}/availableitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAvailableRisksByOwner(groupId, ownerId, rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/risk/owners/${ownerId}/ruleset/${rulesetId}/availableitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getAllRisksForOwner(groupId, rulesetId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/risk/ruleset/${rulesetId}/allitems`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRisksByRiskCriteria(groupId, data, page, pageSize) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: `${apiUrl}api/universal/ownershipgroups/${groupId}/type/risk/risks`,\r\n data: data,\r\n params: { 'pagesize': pageSize, 'page': page }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateRiskCriteria(groupId, itemId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/risk/item/${itemId}`, putData);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getGroupOwnerItems(ownershipGroup, groupOwner) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/owners/${groupOwner.Id}/items`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addItemToGroup(data, groupId, type) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/item`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeItemFromOwnershipGroup(groupId, type, itemId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/ownershipgroups/${groupId}/type/${type}/items/${itemId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeOwnerFromOwnershipGroupItem(ownershipGroup, groupItem, putBody) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/items/${groupItem.Id}/deleteowners`, putBody);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeItemFromOwnershipGroupOwner(ownershipGroup, groupOwner, putBody) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/ownershipgroups/${ownershipGroup.Id}/type/${ownershipGroup.GroupType}/owners/${groupOwner.Id}/deleteitems`, putBody);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, ownershipGroup, groupItem, helperService, ownershipGroupsDataService, ownershipGroupOwnerDataService) {\r\n const vm = this;\r\n\r\n vm.saveOwner = saveOwner;\r\n vm.selectedOwnerTypeChanged = selectedOwnerTypeChanged;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n vm.groupItem = groupItem;\r\n\r\n activate();\r\n\r\n function activate() {\r\n vm.selectedOwnerType = 'Users';\r\n getOwners();\r\n }\r\n\r\n function selectedOwnerTypeChanged() {\r\n vm.selectedOwners = null;\r\n getOwners();\r\n }\r\n\r\n async function getOwners() {\r\n vm.ownersDataSourceLoading = true;\r\n const { data } = await ownershipGroupOwnerDataService.getAvailableOwnersForItem(ownershipGroup.Id, groupItem.Id, ownershipGroup.GroupType);\r\n vm.availableOwnersDataSource = data;\r\n vm.availableOwnersDataSource = vm.availableOwnersDataSource.filter(owner => owner.TypeName === (vm.selectedOwnerType === 'Users' ? 'User' : 'Approval Group'));\r\n vm.ownersDataSourceLoading = false;\r\n return vm.availableOwnersDataSource;\r\n }\r\n\r\n async function saveOwner() {\r\n vm.savePending = new createSpinner();\r\n\r\n let data = {\r\n Owners: vm.selectedOwners\r\n }\r\n\r\n try {\r\n await ownershipGroupsDataService.addOwnersToGroupObject(ownershipGroup.Id, ownershipGroup.GroupType, groupItem.Id, data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import groupItemOwnerModalController from \"./groupItemOwnerModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (ownershipGroupOwnerDataService, ownershipGroupItemsDataService, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.openGroupItemOwnerModal = openGroupItemOwnerModal;\r\n vm.removeOwnerFromGroupItem = removeOwnerFromGroupItem;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n await setOwners();\r\n vm.ownersRadioFilter = null;\r\n }\r\n\r\n async function setOwners() {\r\n vm.ownersLoading = true;\r\n const { data } = await ownershipGroupOwnerDataService.getGroupItemOwners(vm.selectedOwnershipGroup, vm.selectedGroupItem);\r\n vm.owners = data;\r\n vm.ownersLoading = false;\r\n }\r\n\r\n async function openGroupItemOwnerModal() {\r\n let ownerModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/groupItemOwnersList/groupItemOwnerModal.tmpl.html',\r\n controller: groupItemOwnerModalController,\r\n controllerAs: 'giomvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n groupItem: () => vm.selectedGroupItem\r\n }\r\n });\r\n\r\n try {\r\n await ownerModal.result;\r\n setOwners();\r\n } catch { return; }\r\n }\r\n\r\n async function removeOwnerFromGroupItem(owner) {\r\n\r\n let putData = {\r\n Owners: [owner]\r\n }\r\n\r\n try {\r\n await ownershipGroupItemsDataService.removeOwnerFromOwnershipGroupItem(vm.selectedOwnershipGroup, vm.selectedGroupItem, putData);\r\n setOwners();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","/* groupItemOwnersList.component.js */\r\n\r\nimport groupItemOwnersListController from \"./groupItemOwnersList.controller\";\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of ownership group item users or approval groups\r\n * @example \r\n */\r\n\r\nconst groupItemOwnersList = {\r\n bindings: {\r\n selectedOwnershipGroup: '<',\r\n selectedGroupItem: '<'\r\n },\r\n controller: groupItemOwnersListController,\r\n controllerAs: 'giolvm',\r\n templateUrl: '/App/Components/OwnershipGroups/groupItemOwnersList/groupItemOwnersList.tmpl.html'\r\n};\r\n\r\nexport default groupItemOwnersList;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, ownershipGroup, groupOwner, helperService, riskRulesetService, risksDataService, ownershipGroupsDataService, ownershipGroupItemsDataService) {\r\n const vm = this;\r\n\r\n vm.selectedRoleTypeChanged = selectedRoleTypeChanged;\r\n vm.selectedCompanyTypeChanged = selectedCompanyTypeChanged;\r\n vm.updateDropdowns = updateDropdowns;\r\n vm.saveItem = saveItem;\r\n vm.cancel = cancel;\r\n\r\n vm.ownershipGroup = { ...ownershipGroup };\r\n vm.groupOwner = groupOwner;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await setupModal();\r\n }\r\n\r\n async function setupModal() {\r\n switch (vm.ownershipGroup.GroupType) {\r\n case 'role':\r\n vm.selectedRoleType = 'Role';\r\n setupRoleDropdown();\r\n break;\r\n case 'company':\r\n vm.selectedCompanyType = 'Company';\r\n setupCompanyDropdown();\r\n break;\r\n case 'product':\r\n setProducts();\r\n break;\r\n case 'businessprocess':\r\n await setRulesets();\r\n setupBusinessProcessDropdown();\r\n break;\r\n case 'risk':\r\n vm.selectedRiskType = null;\r\n await setRulesets();\r\n getRiskTypes();\r\n setupRiskDropdown();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function setRulesets() {\r\n let { data } = await riskRulesetService.getRiskRulesetList();\r\n vm.rulesets = data;\r\n\r\n vm.selectedRulesetId = vm.rulesets.find(ruleset => ruleset.IsDefault).RulesetId;\r\n\r\n }\r\n\r\n // Role\r\n function setupRoleDropdown() {\r\n\r\n vm.rolesDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.rolesDataSource, 'Identifier'));\r\n }\r\n },\r\n height: 325,\r\n placeholder: `-- Select Roles --`\r\n };\r\n\r\n vm.rolesDropdownDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n vm.rolesDropdownLoading = true;\r\n let { data } = await ownershipGroupItemsDataService.getAvailableOwnerItems(ownershipGroup, groupOwner.Id);\r\n data = data.filter(role => role.Type === vm.selectedRoleType);\r\n vm.rolesDataSource = data;\r\n options.success(data);\r\n vm.rolesDropdownLoading = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function selectedRoleTypeChanged() {\r\n vm.rolesDropdown.value([]);\r\n vm.rolesDropdown.setOptions({ placeholder: `-- Select ${$filter('insertSpaceBetweenCapitalWords')(vm.selectedRoleType)}s --` });\r\n vm.rolesDropdownDataSource.read();\r\n }\r\n\r\n // Company\r\n function setupCompanyDropdown() {\r\n\r\n vm.companiesDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.companiesDataSource, 'Id'));\r\n }\r\n },\r\n height: 325,\r\n placeholder: `-- Select Companies --`\r\n };\r\n\r\n vm.companiesDropdownDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n vm.companiesDropdownLoading = true;\r\n let { data } = await ownershipGroupItemsDataService.getAvailableOwnerItems(ownershipGroup, groupOwner.Id);\r\n data = data.filter(company => company.Type === vm.selectedCompanyType);\r\n vm.companiesDataSource = data;\r\n options.success(data);\r\n vm.companiesDropdownLoading = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function selectedCompanyTypeChanged() {\r\n vm.companiesDropdown.value([]);\r\n vm.companiesDropdown.setOptions({ placeholder: `-- Select one or more ${$filter('insertSpaceBetweenCapitalWords')(vm.selectedCompanyType)}s --` });\r\n vm.companiesDropdownDataSource.read();\r\n }\r\n\r\n // Business Process\r\n async function setupBusinessProcessDropdown() {\r\n\r\n vm.businessProcessDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.businessProcessDataSource, 'BusinessProcessId'));\r\n }\r\n },\r\n height: 325\r\n };\r\n\r\n vm.businessProcessDropdownDataSource = new kendo.data.DataSource({\r\n\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n const { data } = await ownershipGroupItemsDataService.getAvailableOwnerBusinessProcesses(ownershipGroup.Id, groupOwner.Id, vm.selectedRulesetId);\r\n vm.businessProcessDropdown.setOptions({ placeholder: `-- Select Business Processes --` });\r\n vm.businessProcessDataSource = data;\r\n options.success(data);\r\n }\r\n }\r\n });\r\n\r\n return vm.businessProcessDropdownDataSource;\r\n }\r\n\r\n // Product\r\n async function setProducts() {\r\n let { data } = await ownershipGroupItemsDataService.getAvailableOwnerItems(ownershipGroup, groupOwner.Id);\r\n vm.productsDataSource = data;\r\n }\r\n\r\n // Risk\r\n async function updateDropdowns(type) {\r\n vm.selectedItems = null;\r\n if (type === 'businessprocess') {\r\n vm.businessProcessDropdownDataSource.read();\r\n } else {\r\n vm.kendoRiskDropdownDataSource.read();\r\n }\r\n }\r\n\r\n async function getRiskTypes() {\r\n let { data } = await risksDataService.getRiskTypes();\r\n vm.riskTypes = data;\r\n }\r\n\r\n function setupRiskDropdown() {\r\n vm.riskDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: function (options) {\r\n options.success(helperService.multiValueMapperFunction(options, vm.riskDataSource, 'RiskId'));\r\n }\r\n },\r\n height: 325\r\n };\r\n\r\n vm.kendoRiskDropdownDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n const { data } = await ownershipGroupItemsDataService.getAvailableRisksByOwner(ownershipGroup.Id, groupOwner.Id, vm.selectedRulesetId);\r\n vm.riskDropdown.setOptions({ placeholder: `-- Select Risks --` });\r\n\r\n if (vm.selectedRiskType && vm.selectedRiskType === 'Segregation Of Duties') {\r\n vm.riskDataSource = data.filter(risk => risk.RiskType === 'SOD');\r\n } else if (vm.selectedRiskType && vm.selectedRiskType === 'Sensitive Access') {\r\n vm.riskDataSource = data.filter(risk => risk.RiskType === 'SA');\r\n } else {\r\n vm.riskDataSource = data;\r\n }\r\n\r\n options.success(vm.riskDataSource);\r\n }\r\n }\r\n });\r\n }\r\n //\r\n\r\n function definePutData() {\r\n switch (vm.ownershipGroup.GroupType) {\r\n case 'role':\r\n return { Items: vm.selectedItems };\r\n case 'company':\r\n return { Items: vm.selectedItems };\r\n case 'product':\r\n let productIds = vm.selectedItems.map(item => item.ProductId);\r\n return { ProductIds: productIds };\r\n case 'businessprocess':\r\n return { BusinessProcessIds: vm.selectedItems }\r\n case 'risk':\r\n return {\r\n RulesetId: vm.selectedRulesetId,\r\n RiskIds: vm.selectedItems\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function saveItem() {\r\n vm.savePending = new createSpinner();\r\n const data = await definePutData();\r\n\r\n try {\r\n let itemId = await ownershipGroupsDataService.addItemsToGroupObject(ownershipGroup, groupOwner, data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(itemId);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(itemId) {\r\n $uibModalInstance.close(itemId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import groupOwnerItemsModalController from \"./groupOwnerItemsModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (ownershipGroupItemsDataService, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.openGroupOwnerItemModal = openGroupOwnerItemModal;\r\n vm.removeOwnerItemFromGroupOwner = removeOwnerItemFromGroupOwner;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n setOwnerItems();\r\n vm.itemsRadioFilter = null;\r\n }\r\n\r\n async function setOwnerItems() {\r\n vm.ownerItemsLoading = true;\r\n\r\n const { data } = await ownershipGroupItemsDataService.getGroupOwnerItems(vm.selectedOwnershipGroup, vm.selectedGroupOwner);\r\n vm.ownerItems = data;\r\n vm.ownerItemsLoading = false;\r\n }\r\n\r\n async function openGroupOwnerItemModal() {\r\n let ownerItemModal = $uibModal.open({\r\n templateUrl: '/App/Components/OwnershipGroups/groupOwnerItemsList/groupOwnerItemsModal.tmpl.html',\r\n controller: groupOwnerItemsModalController,\r\n controllerAs: 'goimvm',\r\n backdrop: 'static',\r\n resolve: {\r\n ownershipGroup: () => vm.selectedOwnershipGroup,\r\n groupOwner: () => vm.selectedGroupOwner\r\n }\r\n });\r\n\r\n try {\r\n await ownerItemModal.result;\r\n await setOwnerItems();\r\n } catch { return; }\r\n }\r\n\r\n async function removeOwnerItemFromGroupOwner(ownerItem) {\r\n const putBody = {\r\n ItemIds: [ownerItem.Id]\r\n };\r\n\r\n try {\r\n await ownershipGroupItemsDataService.removeItemFromOwnershipGroupOwner(vm.selectedOwnershipGroup, vm.selectedGroupOwner, putBody);\r\n await setOwnerItems();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","/* groupOwnerItemsList.component.js */\r\n\r\nimport groupOwnerItemsListController from \"./groupOwnerItemsList.controller\";\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of ownership group owner items\r\n * @example \r\n */\r\n\r\nconst groupOwnerItemsList = {\r\n bindings: {\r\n selectedOwnershipGroup: '<',\r\n selectedGroupOwner: '<',\r\n },\r\n controller: groupOwnerItemsListController,\r\n controllerAs: 'goilvm',\r\n templateUrl: '/App/Components/OwnershipGroups/groupOwnerItemsList/groupOwnerItemsList.tmpl.html'\r\n};\r\n\r\nexport default groupOwnerItemsList;","import angular from 'angular';\r\nimport ownershipGroups from '../Components/OwnershipGroups/ownershipGroups.component';\r\nimport ownershipGroupsList from '../Components/OwnershipGroups/ownershipGroupsList/ownershipGroupsList.component';\r\nimport ownershipGroupsDataServiceFactory from '../Components/OwnershipGroups/ownershipGroupsDataService.factory';\r\nimport ownershipGroupOwnerDataServiceFactory from '../Components/OwnershipGroups/ownershipGroupOwnersList/ownershipGroupOwnerDataService.factory';\r\nimport groupOwnersList from '../Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnersList.component';\r\nimport groupItemsList from '../Components/OwnershipGroups/ownershipGroupItemsList/groupItemsList.component';\r\nimport ownershipGroupItemsDataServiceFactory from '../Components/OwnershipGroups/ownershipGroupItemsList/ownershipGroupItemsDataService.factory';\r\nimport groupItemOwnersList from '../Components/OwnershipGroups/groupItemOwnersList/groupItemOwnersList.component';\r\nimport groupOwnerItemsList from '../Components/OwnershipGroups/groupOwnerItemsList/groupOwnerItemsList.component';\r\n\r\nexport default angular\r\n .module('app.systemConfiguration.ownershipGroups', [])\r\n .component('ownershipGroups', ownershipGroups)\r\n .component('ownershipGroupsList', ownershipGroupsList)\r\n .factory('ownershipGroupsDataService', ownershipGroupsDataServiceFactory)\r\n .component('ownershipGroupItemsList', groupItemsList)\r\n .factory('ownershipGroupItemsDataService', ownershipGroupItemsDataServiceFactory)\r\n .factory('ownershipGroupOwnerDataService', ownershipGroupOwnerDataServiceFactory)\r\n .component('ownershipGroupOwnersList', groupOwnersList)\r\n .component('ownershipGroupItemsOwnersList', groupItemOwnersList)\r\n .component('ownershipGroupOwnerItemsList', groupOwnerItemsList)\r\n .name;","import ownershipGroupsController from \"./ownershipGroups.controller\";\r\n\r\n/* ownershipGroups.component.js */\r\n\r\n/**\r\n * @desc component for displaying and managing ownership groups\r\n * @example \r\n */\r\n\r\nconst ownershipGroups = {\r\n controller: ownershipGroupsController,\r\n controllerAs: 'ogvm',\r\n templateUrl: '/App/Components/OwnershipGroups/ownershipGroups.tmpl.html'\r\n};\r\n\r\nexport default ownershipGroups;","export default /*@ngInject*/ function () {\r\n const vm = this;\r\n\r\n vm.changeSelectedOwnershipGroup = changeSelectedOwnershipGroup; \r\n vm.changeSelectedItem = changeSelectedItem;\r\n vm.changeSelectedOwner = changeSelectedOwner;\r\n vm.changeOwnershipGroupObjectType = changeOwnershipGroupObjectType;\r\n\r\n vm.selectedGroupItemType = \"item\";\r\n\r\n function changeSelectedOwnershipGroup(ownershipGroup) {\r\n vm.selectedItem = null;\r\n vm.selectedOwner = null;\r\n vm.selectedOwnershipGroup = ownershipGroup;\r\n }\r\n\r\n function changeSelectedItem(item) {\r\n vm.selectedItem = item;\r\n }\r\n\r\n function changeSelectedOwner(owner) {\r\n vm.selectedOwner = owner;\r\n }\r\n\r\n function changeOwnershipGroupObjectType(groupItemType) {\r\n vm.selectedGroupItemType = groupItemType;\r\n switch (groupItemType) {\r\n case 'item':\r\n vm.selectedOwner = null;\r\n break;\r\n case 'owner':\r\n vm.selectedItem = null;\r\n break;\r\n default:\r\n vm.selectedOwner = null;\r\n vm.selectedItem = null;\r\n }\r\n }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, requesterGroup, helperService, requesterGroupsDataService) {\r\n const vm = this;\r\n\r\n vm.saveRequesterGroup = saveRequesterGroup;\r\n vm.cancel = cancel;\r\n\r\n vm.requesterGroup = { ...requesterGroup };\r\n\r\n async function saveRequesterGroup() {\r\n vm.savePending = new createSpinner();\r\n createOrUpdateGroup();\r\n }\r\n\r\n async function createOrUpdateGroup() {\r\n try {\r\n let response = vm.requesterGroup.Id ? await requesterGroupsDataService.updateGroup(vm.requesterGroup) : await requesterGroupsDataService.createGroup(vm.requesterGroup);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close(response.data);\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close(roleId) {\r\n $uibModalInstance.close(roleId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, requesterGroupsDataService) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.dismiss = dismiss;\r\n vm.disableButton = false;\r\n vm.importRequesterGroups = importRequesterGroups;\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n function dismiss() { $uibModalInstance.dismiss(); }\r\n\r\n // Import Requester Groups\r\n async function importRequesterGroups(file) {\r\n vm.importPending = new createSpinner();\r\n vm.disableButton = true;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n try {\r\n await requesterGroupsDataService.importRequesterGroups(fd);\r\n await helperService.successfulSaveButton(vm.importPending);\r\n cancel();\r\n } catch {\r\n vm.importPending.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport requesterGroupModalController from \"./requesterGroupModal.controller\";\r\nimport importRequesterGroupsController from \"../importRequesterGroups.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, requesterGroupsDataService, helperService, $uibModal, $filter, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n $scope.$on('ImportRequesterGroups', _ => activate());\r\n\r\n vm.changeSelectedRequesterGroup = changeSelectedRequesterGroup;\r\n vm.deleteRequesterGroup = deleteRequesterGroup;\r\n vm.openRequesterGroupModal = openRequesterGroupModal;\r\n vm.exportRequesterGroups = exportRequesterGroups;\r\n vm.openImportModal = openImportModal;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openRequesterGroupModal(item.requesterGroup);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteRequesterGroup(item.requesterGroup);\r\n }\r\n }\r\n ];\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n getRequesterGroups();\r\n }\r\n\r\n async function getRequesterGroups() {\r\n vm.requesterGroupsLoading = true;\r\n let response = await requesterGroupsDataService.getRequesterGroups();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.requesterGroups = response.data;\r\n vm.requesterGroupsLoading = false;\r\n }\r\n\r\n function changeSelectedRequesterGroup(requesterGroup) {\r\n vm.onSelectedRequesterGroupChanged({ requesterGroup });\r\n }\r\n\r\n async function openRequesterGroupModal(requesterGroup) {\r\n let requesterGroupModal = $uibModal.open({\r\n templateUrl: '/App/Components/RequesterGroups/requesterGroupsList/requesterGroupModal.tmpl.html',\r\n controller: requesterGroupModalController,\r\n controllerAs: 'rgmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n requesterGroup: () => requesterGroup || null\r\n }\r\n });\r\n\r\n try {\r\n let newRequesterGroupId = await requesterGroupModal.result;\r\n await getRequesterGroups();\r\n if (newRequesterGroupId && newRequesterGroupId !== \"\") {\r\n // We know a new requester group was created so we need to select it\r\n changeSelectedRequesterGroup(vm.requesterGroups.find(group => group.Id === newRequesterGroupId));\r\n }\r\n } catch { return; }\r\n }\r\n\r\n async function deleteRequesterGroup(requesterGroup) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Delete Requester Group`, `Are you sure you want to delete Requester Group ${requesterGroup.Name}?`, `Yes`, 'No'))\r\n await requesterGroupsDataService.deleteGroup(requesterGroup.Id);\r\n if (requesterGroup.Id === vm.selectedRequesterGroup?.Id) {\r\n changeSelectedRequesterGroup(null);\r\n }\r\n getRequesterGroups();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function exportRequesterGroups() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n let response = await requesterGroupsDataService.exportRequesterGroups();\r\n helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(response.data, 'RequesterGroups.xlsx');\r\n vm.exportUpdatePending.loadingValue = false;\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function openImportModal() {\r\n let importModal = $uibModal.open({\r\n templateUrl: '/App/Components/RequesterGroups/importRequesterGroups.html',\r\n controller: importRequesterGroupsController,\r\n controllerAs: 'irgvm',\r\n backdrop: 'static',\r\n });\r\n try {\r\n await importModal.result;\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","import requesterGroupsListController from \"./requesterGroupsList.controller\";\r\n\r\n/* requesterGroupsList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of requester groups\r\n * @example \r\n */\r\n\r\nconst requesterGroupsList = {\r\n bindings: {\r\n selectedRequesterGroup: '<',\r\n onSelectedRequesterGroupChanged: '&',\r\n },\r\n controller: requesterGroupsListController,\r\n controllerAs: 'rglvm',\r\n templateUrl: '/App/Components/RequesterGroups/requesterGroupsList/requesterGroupsList.tmpl.html'\r\n};\r\n\r\nexport default requesterGroupsList;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const factory = {\r\n getRequesterGroups,\r\n getRequesterGroupUsers,\r\n createGroup,\r\n addUserToGroup,\r\n updateGroup,\r\n deleteGroup,\r\n removeUserFromGroup,\r\n exportRequesterGroups,\r\n importRequesterGroups\r\n };\r\n\r\n return factory;\r\n\r\n async function getRequesterGroups() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/requestergroups`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRequesterGroupUsers(groupId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/requestergroups/group/${groupId}/users`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createGroup(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/requestergroups`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addUserToGroup(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/requestergroups/group/${data.RequesterGroupId}/users`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateGroup(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/requestergroups/${data.Id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteGroup(groupId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/requestergroups/${groupId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeUserFromGroup(groupId, groupUserId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/requestergroups/group/${groupId}/users/${groupUserId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportRequesterGroups() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/requestergroups/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importRequesterGroups(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/requestergroups/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, selectedUsers, requesterGroup, helperService, requesterGroupsDataService, dataService) {\r\n const vm = this;\r\n\r\n vm.addUser = addUser;\r\n vm.close = close;\r\n\r\n selectedUsers = [...selectedUsers];\r\n\r\n activate();\r\n\r\n function activate() {\r\n setupAvailableUsersGrid();\r\n }\r\n\r\n function setupAvailableUsersGrid() {\r\n let availableUsersGridColumns = [\r\n { title: \"Name\", field: \"UserLogonName\", filterable: customAutoCompleteFilter },\r\n { title: \"Email\", field: \"Email\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.availableUsersGridOptions = helperService.setMainGridOptions(availableUsersGridColumns, null);\r\n\r\n vm.availableUsersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await dataService.getUsers();\r\n response.data = response.data.filter(availableUser => {\r\n return !selectedUsers.some(user => user.UserId === availableUser.UserID);\r\n });\r\n response.data = $filter('orderBy')(response.data, \"UserLogonName\");\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function addUser(user) {\r\n vm.addUserProcessing = true;\r\n kendo.ui.progress(vm.availableUsersGrid.element, true);\r\n let data = {\r\n RequesterGroupId: requesterGroup.Id,\r\n UserId: user.UserID\r\n }\r\n try {\r\n await requesterGroupsDataService.addUserToGroup(data);\r\n let processedUser = JSON.parse(JSON.stringify(user));\r\n processedUser.UserId = processedUser.UserID;\r\n delete processedUser.UserID;\r\n selectedUsers.push(processedUser);\r\n kendo.ui.progress(vm.availableUsersGrid.element, false);\r\n vm.availableUsersGridDataSource.read();\r\n vm.addUserProcessing = false;\r\n } catch {\r\n vm.addUserProcessing = false;\r\n kendo.ui.progress(vm.availableUsersGrid.element, false);\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport requesterGroupUserModalController from \"./requesterGroupUserModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (requesterGroupsDataService, helperService, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.removeUserFromRequesterGroup = removeUserFromRequesterGroup;\r\n vm.openUserModal = openUserModal;\r\n\r\n vm.$onChanges = activate;\r\n\r\n async function activate() {\r\n getUsers()\r\n }\r\n\r\n async function getUsers() {\r\n vm.usersLoading = true;\r\n const response = await requesterGroupsDataService.getRequesterGroupUsers(vm.requesterGroup.Id);\r\n vm.users = response.data;\r\n vm.usersLoading = false;\r\n }\r\n\r\n async function openUserModal() {\r\n let requesterGroupModal = $uibModal.open({\r\n templateUrl: '/App/Components/RequesterGroups/requesterGroupUsersList/requesterGroupUserModal.tmpl.html',\r\n controller: requesterGroupUserModalController,\r\n controllerAs: 'rgumvm',\r\n backdrop: 'static',\r\n resolve: {\r\n selectedUsers: () => vm.users,\r\n requesterGroup: () => vm.requesterGroup\r\n }\r\n });\r\n\r\n try {\r\n await requesterGroupModal.result;\r\n await getUsers();\r\n } catch { return; }\r\n }\r\n\r\n async function removeUserFromRequesterGroup(user) {\r\n try {\r\n await swal(helperService.areYouSureParams(`Remove User`, `Are you sure you want to remove User ${user.UserName} from Requester Group ${vm.requesterGroup.Name}?`, `Yes`, 'No'))\r\n await requesterGroupsDataService.removeUserFromGroup(vm.requesterGroup.Id, user.Id);\r\n getUsers();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}","import requesterGroupUsersListController from \"./requesterGroupUsersList.controller\";\r\n\r\n/* requesterGroupUsersList.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining list of requester group users\r\n * @example \r\n */\r\n\r\nconst requesterGroupUsersList = {\r\n bindings: {\r\n requesterGroup: '<'\r\n },\r\n controller: requesterGroupUsersListController,\r\n controllerAs: 'rgulvm',\r\n templateUrl: '/App/Components/RequesterGroups/requesterGroupUsersList/requesterGroupUsersList.tmpl.html'\r\n};\r\n\r\nexport default requesterGroupUsersList;","import angular from 'angular';\r\nimport requesterGroups from '../Components/RequesterGroups/requesterGroups.component';\r\nimport requesterGroupsList from '../Components/RequesterGroups/requesterGroupsList/requesterGroupsList.component';\r\nimport requesterGroupsDataServiceFactory from '../Components/RequesterGroups/requesterGroupsDataService.factory';\r\nimport requesterGroupUsersList from '../Components/RequesterGroups/requesterGroupUsersList/requesterGroupUsersList.component';\r\n\r\nexport default angular\r\n .module('app.systemConfiguration.requesterGroups', [])\r\n .component('requesterGroups', requesterGroups)\r\n .component('requesterGroupsList', requesterGroupsList)\r\n .factory('requesterGroupsDataService', requesterGroupsDataServiceFactory)\r\n .component('requesterGroupUsersList', requesterGroupUsersList)\r\n .name;","import requesterGroupsController from \"./requesterGroups.controller\";\r\n\r\n/* requesterGroups.component.js */\r\n\r\n/**\r\n * @desc component for displaying and managing requester groups\r\n * @example \r\n */\r\n\r\nconst requesterGroups = {\r\n controller: requesterGroupsController,\r\n controllerAs: 'rgvm',\r\n templateUrl: '/App/Components/RequesterGroups/requesterGroups.tmpl.html'\r\n};\r\n\r\nexport default requesterGroups;","export default /*@ngInject*/ function () {\r\n const vm = this;\r\n\r\n vm.changeSelectedRequesterGroup = changeSelectedRequesterGroup;\r\n\r\n function changeSelectedRequesterGroup(requesterGroup) {\r\n vm.selectedRequesterGroup = requesterGroup;\r\n }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, dataService, supervisorAssignmentsDataService, helperService, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.createSupervisorAssignments = createSupervisorAssignments;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n getUsers();\r\n getSupervisors();\r\n }\r\n\r\n async function getUsers() {\r\n vm.usersDropdownLoading = true;\r\n try {\r\n let response = await dataService.getUserMaster();\r\n vm.userDataSource = response.data;\r\n\r\n vm.userDataSource = $filter('orderBy')(vm.userDataSource, 'Name');\r\n vm.usersDropdownLoading = false;\r\n } catch {\r\n vm.usersDropdownLoading = false;\r\n }\r\n }\r\n\r\n async function getSupervisors() {\r\n vm.supervisorsDropdownLoading = true;\r\n try {\r\n let response = await dataService.getUsers();\r\n vm.supervisorsDataSource = response.data;\r\n vm.supervisorsDataSource = vm.supervisorsDataSource.filter(u => u.Active);\r\n vm.supervisorsDataSource = $filter('orderBy')(vm.supervisorsDataSource, 'UserLogonName');\r\n vm.supervisorsDropdownLoading = false;\r\n } catch {\r\n vm.supervisorsDropdownLoading = false;\r\n }\r\n }\r\n\r\n async function createSupervisorAssignments() {\r\n\r\n vm.createAssignmentPending = new createSpinner();\r\n let data = {\r\n 'UserMasterId': vm.selectedUser.ID,\r\n 'SupervisorId': vm.selectedSupervisor.UserID\r\n };\r\n\r\n try {\r\n await supervisorAssignmentsDataService.createSupervisorAssignment(data);\r\n await helperService.successfulSaveButton(vm.createAssignmentPending);\r\n close();\r\n } catch {\r\n vm.createAssignmentPending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close(true);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ImportSupervisorModalController($uibModalInstance, supervisorAssignmentsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.importSupervisorAssignments = importSupervisorAssignments;\r\n vm.cancel = cancel;\r\n\r\n async function importSupervisorAssignments(files) {\r\n\r\n let fd = new FormData();\r\n files.forEach(file => {\r\n fd.append(file.file.name, file.file);\r\n });\r\n\r\n if (files.length > 0) {\r\n vm.disableButton = true;\r\n vm.importUpdatePending = new createSpinner();\r\n\r\n try {\r\n await supervisorAssignmentsDataService.importSupervisorAssignments(fd);\r\n await helperService.successfulSaveButton(vm.importUpdatePending);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.disableButton = false;\r\n vm.importUpdatePending.loadingValue = false;\r\n }\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport createSupervisorModalController from \"./Create/createSupervisorModal.controller\";\r\nimport ImportSupervisorModalController from \"./Import/importSupervisorModal.controller\";\r\nimport swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $filter, helperService, supervisorAssignmentsDataService, $http) {\r\n\r\n const vm = this;\r\n\r\n vm.config = {};\r\n vm.origConfig = {};\r\n\r\n vm.activate = activate;\r\n vm.openImportSupervisorsModal = openImportSupervisorsModal;\r\n vm.openCreateSupervisorsModal = openCreateSupervisorsModal;\r\n vm.exportSupervisorReviews = exportSupervisorReviews;\r\n vm.deleteSupervisorAssignment = deleteSupervisorAssignment;\r\n\r\n vm.$onInit = activate;\r\n\r\n $scope.$on('AutoGenerateSupervisorAssignments', function (event, args) {\r\n vm.supervisorAssignmentsGridDataSource.read();\r\n });\r\n\r\n function activate() {\r\n checkIfHcmExists();\r\n createGrid();\r\n }\r\n\r\n async function checkIfHcmExists() {\r\n let response = await $http.get(`${apiUrl}/api/core/plugins`);\r\n vm.hcmExists = response.data.some(plugin => plugin.IsHcm);\r\n }\r\n\r\n function createGrid() {\r\n const supervisorAssignmentsGridColumns =\r\n [\r\n { field: \"UserMasterName\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"UserMasterEmail\", title: \"User Email\", filterable: customAutoCompleteFilter },\r\n { field: \"SupervisorName\", title: \"Supervisor\", filterable: customAutoCompleteFilter },\r\n { field: \"SupervisorEmail\", title: \"Supervisor Email\", filterable: customAutoCompleteFilter },\r\n { template: \"\", width: 70 }\r\n ];\r\n\r\n vm.supervisorAssignmentsGridOptions = helperService.setMainGridOptions(supervisorAssignmentsGridColumns, 400);\r\n vm.supervisorAssignmentsGridOptions.selectable = false;\r\n\r\n vm.supervisorAssignmentsGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n let response = await supervisorAssignmentsDataService.getSupervisorAssignments();\r\n response.data = $filter('orderBy')(response.data, 'ManagerName');\r\n vm.existingUserAssignments = response.data.map(user => user.UserMasterId);\r\n options.success(response.data);\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n //Update successful inline saver\r\n $scope.$on('ImportSupervisorAssignments', function (event, args) {\r\n vm.supervisorAssignmentsGridDataSource.read();\r\n });\r\n\r\n function openImportSupervisorsModal() {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/SupervisorAssignments/Import/importSupervisorAssignmentModal.html',\r\n controller: ImportSupervisorModalController,\r\n controllerAs: 'isvm',\r\n backdrop: 'static'\r\n });\r\n }\r\n\r\n async function openCreateSupervisorsModal() {\r\n let createModal = $uibModal.open({\r\n templateUrl: '/App/Components/SupervisorAssignments/Create/createSupervisorAssignmentModal.html',\r\n controller: createSupervisorModalController,\r\n controllerAs: 'csvm',\r\n backdrop: 'static',\r\n resolve: {\r\n existingUserAssignments: () => vm.existingUserAssignments\r\n }\r\n });\r\n\r\n try {\r\n await createModal.result;\r\n vm.supervisorAssignmentsGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function exportSupervisorReviews() {\r\n let response = await supervisorAssignmentsDataService.exportSupervisorAssignments();\r\n response.data = { ExportId: response.data };\r\n }\r\n\r\n async function deleteSupervisorAssignment(dataItem) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Assignment', 'Are you sure you want to this assignment?', 'Delete'));\r\n kendo.ui.progress(vm.supervisorAssignmentsGrid.element, true);\r\n await supervisorAssignmentsDataService.deleteSupervisorAssignment(dataItem.UserMasterId, dataItem.SupervisorId);\r\n kendo.ui.progress(vm.supervisorAssignmentsGrid.element, false);\r\n vm.supervisorAssignmentsGridDataSource.read();\r\n } catch (dismiss) {\r\n return;\r\n }\r\n }\r\n\r\n}","import supervisorAssignmentsController from \"./supervisorAssignments.controller\";\r\n\r\n/* supervisorAssignments.component.js */\r\n\r\n/**\r\n * @desc component for viewing supervisor assignments\r\n * @example \r\n */\r\n\r\nconst supervisorAssignments = {\r\n controller: supervisorAssignmentsController,\r\n controllerAs: 'savm',\r\n templateUrl: '/App/Components/SupervisorAssignments/supervisorAssignments.html'\r\n};\r\n\r\nexport default supervisorAssignments;","export default /*@ngInject*/ function($http, errorsDataService) {\r\n const service = {\r\n getSupervisorAssignments,\r\n getSupervisorAssignmentMappings,\r\n getProductMappingFields,\r\n getMappingFields,\r\n getPluginMappingFields,\r\n getInternalMappingFields,\r\n getUniversalMappingFields,\r\n createSupervisorAssignment,\r\n exportSupervisorAssignments,\r\n createAutoSupervisorAssignmentMapping,\r\n autoGenerateMappingsSupervisorAssignments,\r\n importSupervisorAssignments,\r\n updateAutoSupervisorAssignmentMapping,\r\n deleteSupervisorAssignment,\r\n deleteAutoSupervisorAssignmentMapping\r\n };\r\n\r\n return service;\r\n\r\n //GET Requests\r\n async function getSupervisorAssignments() {\r\n try {\r\n return await $http.get(apiUrl + 'api/universal/supervisorassignments');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSupervisorAssignmentMappings() {\r\n try {\r\n return await $http.get(apiUrl + 'api/universal/supervisorassignments/mappings');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getMappingFields() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/systemmappings/mappingfields`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getPluginMappingFields(pluginId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/pluginmapping/${pluginId}/mappingfields`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getProductMappingFields(productType) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/systemmappings/mappingfields/${productType}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getInternalMappingFields() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/systemmappings/mappingfields/internal`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getUniversalMappingFields() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/systemmappings/mappingfields/universal`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n //POST Requests\r\n async function createSupervisorAssignment(data) {\r\n try {\r\n return await $http.post(apiUrl + 'api/universal/supervisorassignments', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportSupervisorAssignments() {\r\n try {\r\n return await $http.post(apiUrl + 'api/universal/supervisorassignments/export');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createAutoSupervisorAssignmentMapping(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/supervisorassignments/mappings`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function autoGenerateMappingsSupervisorAssignments() {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/supervisorassignments/mappings/autogenerate`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n //PUT Requests\r\n async function importSupervisorAssignments(formData) {\r\n try {\r\n return await $http.put(apiUrl + 'api/universal/supervisorassignments/import', formData, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateAutoSupervisorAssignmentMapping(mappingId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/supervisorassignments/mappings/${mappingId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n //DELETE Requests\r\n async function deleteSupervisorAssignment(userId, supervisorId) {\r\n try {\r\n return await $http.delete(apiUrl + 'api/universal/supervisorassignments/userMasterId/' + userId + '/supervisorid/' + supervisorId);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteAutoSupervisorAssignmentMapping(mappingId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/supervisorassignments/mappings/${mappingId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}\r\n","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $http, supervisorAssignmentsDataService, mapping, availableProducts, allProducts, mappingType, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.productsDataSource = [...availableProducts];\r\n vm.mapping = { ...mapping };\r\n vm.mappingType = mappingType;\r\n\r\n vm.selectedProductChanged = selectedProductChanged;\r\n vm.saveAssignmentMapping = saveAssignmentMapping;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (vm.mapping.Id && vm.mapping.ProductId !== null) {\r\n addCurrentProductToAvailableProducts();\r\n }\r\n getHcmMappingFields();\r\n setupSystemMappingField();\r\n }\r\n\r\n function addCurrentProductToAvailableProducts() {\r\n const productToAdd = allProducts.find(product => product.ID === vm.mapping.ProductId);\r\n vm.productsDataSource.unshift(productToAdd);\r\n vm.mapping.Product = vm.productsDataSource[0];\r\n }\r\n\r\n async function getHcmMappingFields() {\r\n vm.pluginMappingFieldDropdownLoading = true;\r\n await findHCMPlugin();\r\n try {\r\n let response = await supervisorAssignmentsDataService.getPluginMappingFields(vm.hcmPlugin.Id);\r\n vm.hcmMappingFieldsDataSource = response.data;\r\n vm.pluginMappingFieldDropdownLoading = false;\r\n } catch (_) {\r\n vm.pluginMappingFieldDropdownLoading = false;\r\n }\r\n }\r\n\r\n function setupSystemMappingField() {\r\n if (vm.mapping.ProductId === null || mappingType === 'Fastpath Supervisor') {\r\n getSystemMappingFields();\r\n } else {\r\n getProductMappingFields();\r\n }\r\n }\r\n\r\n async function findHCMPlugin() {\r\n let response = await $http.get(`${apiUrl}/api/core/plugins`);\r\n vm.hcmPlugin = response.data.find(plugin => plugin.HcmPlugin);\r\n }\r\n\r\n function selectedProductChanged() {\r\n if (vm.systemMappingFieldsDataSource) {\r\n vm.systemMappingFieldsDataSource = null;\r\n }\r\n getProductMappingFields();\r\n }\r\n\r\n async function getProductMappingFields() {\r\n vm.systemMappingFieldDropdownLoading = true;\r\n try {\r\n let productResponse = await supervisorAssignmentsDataService.getProductMappingFields(vm.mapping.Product.Type.toLowerCase());\r\n vm.systemMappingFieldsDataSource = productResponse.data;\r\n let universalReponse = await supervisorAssignmentsDataService.getUniversalMappingFields();\r\n vm.systemMappingFieldsDataSource = [...vm.systemMappingFieldsDataSource, ...universalReponse.data];\r\n vm.systemMappingFieldDropdownLoading = false;\r\n } catch (_) {\r\n vm.systemMappingFieldDropdownLoading = false;\r\n }\r\n }\r\n\r\n async function getSystemMappingFields() {\r\n vm.systemMappingFieldDropdownLoading = true;\r\n try {\r\n let response = await supervisorAssignmentsDataService.getInternalMappingFields();\r\n vm.systemMappingFieldsDataSource = response.data;\r\n vm.systemMappingFieldDropdownLoading = false;\r\n } catch (_) {\r\n vm.systemMappingFieldDropdownLoading = false;\r\n }\r\n }\r\n\r\n async function saveAssignmentMapping() {\r\n vm.saveMappingPending = new createSpinner();\r\n\r\n const data = {\r\n Id: vm.mapping.Id,\r\n PluginMappingFieldId: vm.mapping.PluginMappingField.Id,\r\n SystemMappingFieldId: vm.mapping.SystemMappingField.Id,\r\n ProductId: vm.mapping.Product ? vm.mapping.Product.ID : null\r\n };\r\n\r\n try {\r\n if (vm.mapping.Id) {\r\n await supervisorAssignmentsDataService.updateAutoSupervisorAssignmentMapping(vm.mapping.Id, data);\r\n } else {\r\n await supervisorAssignmentsDataService.createAutoSupervisorAssignmentMapping(data);\r\n }\r\n await helperService.successfulSaveButton(vm.saveMappingPending);\r\n close();\r\n } catch (error) {\r\n vm.saveMappingPending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import autoMappingAssignmentModalController from \"./autoMappingAssignmentModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, dataService, supervisorAssignmentsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.openAutoMappingModal = openAutoMappingModal;\r\n vm.deleteMapping = deleteMapping;\r\n vm.generateAssignments = generateAssignments;\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n await getCurrentMappings();\r\n }\r\n\r\n vm.mappingMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n let mappingType;\r\n if (item.ProductId === null) {\r\n mappingType = 'Fastpath Supervisor';\r\n } else {\r\n mappingType = 'System User';\r\n }\r\n vm.openAutoMappingModal(item, mappingType);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n var item = modelValue;\r\n vm.deleteMapping(item);\r\n }\r\n }\r\n ];\r\n\r\n async function getCurrentMappings() {\r\n let response = await supervisorAssignmentsDataService.getSupervisorAssignmentMappings();\r\n vm.supervisorMappings = response.data.filter(mapping => mapping.ProductId === null);\r\n vm.userMappings = response.data.filter(mapping => mapping.ProductId !== null);\r\n if (!vm.allProducts) {\r\n await getProducts();\r\n }\r\n vm.availableProducts = vm.allProducts.filter(product => !vm.userMappings.some(mapping => mapping.ProductId === product.ID));\r\n }\r\n\r\n async function getProducts() {\r\n let response = await dataService.getProducts();\r\n vm.allProducts = response.data;\r\n }\r\n\r\n async function openAutoMappingModal(mapping, mappingType) {\r\n const autoMappingModal = $uibModal.open({\r\n templateUrl: '/App/Components/SupervisorAssignments/AutoMappingAssignments/autoMappingAssignmentModal.html',\r\n controller: autoMappingAssignmentModalController,\r\n controllerAs: 'amamvm',\r\n backdrop: 'static',\r\n resolve: {\r\n mapping: () => mapping || null,\r\n availableProducts: () => vm.availableProducts || null,\r\n mappingType: () => mappingType || null,\r\n allProducts: () => vm.allProducts || null\r\n }\r\n });\r\n\r\n try {\r\n await autoMappingModal.result;\r\n getCurrentMappings();\r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n\r\n async function deleteMapping(mapping) {\r\n await supervisorAssignmentsDataService.deleteAutoSupervisorAssignmentMapping(mapping.Id);\r\n getCurrentMappings();\r\n }\r\n\r\n async function generateAssignments() {\r\n vm.generatingAssignments = true; \r\n try {\r\n await supervisorAssignmentsDataService.autoGenerateMappingsSupervisorAssignments();\r\n vm.generatingAssignments = false; \r\n } catch {\r\n vm.generatingAssignments = false;\r\n return;\r\n }\r\n }\r\n}","import autoMappingAssignmentsController from \"./autoMappingAssignments.controller\";\r\n\r\n/* autoMappingAssignments.component.js */\r\n\r\n/**\r\n * @desc component for viewing, creating, editing, and removing mappings for auto generation of supervisor assignments\r\n * @example \r\n */\r\n\r\nconst autoMappingAssignments = {\r\n controller: autoMappingAssignmentsController,\r\n controllerAs: 'amavm',\r\n templateUrl: '/App/Components/SupervisorAssignments/AutoMappingAssignments/autoMappingAssignments.tmpl.html'\r\n};\r\n\r\nexport default autoMappingAssignments;","import angular from 'angular';\r\nimport supervisorAssignments from '../Components/SupervisorAssignments/supervisorAssignments.component';\r\nimport supervisorAssignmentsDataServiceFactory from '../Components/SupervisorAssignments/supervisorAssignmentsDataService.factory';\r\nimport autoMappingAssignments from '../Components/SupervisorAssignments/AutoMappingAssignments/autoMappingAssignments.component';\r\n\r\nexport default angular\r\n .module('app.integrations.supervisorAssignments', [])\r\n .component('supervisorAssignments', supervisorAssignments)\r\n .factory('supervisorAssignmentsDataService', supervisorAssignmentsDataServiceFactory)\r\n .component('autoMappingAssignments', autoMappingAssignments)\r\n .name;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getCompanyStatistics,\r\n getCompanyMapping,\r\n getCompanyAutoMap,\r\n createAutoMap,\r\n createMapping,\r\n createBulkMapping,\r\n deleteCompanyMaster,\r\n deleteProductMapping\r\n };\r\n\r\n return service;\r\n\r\n async function getCompanyStatistics() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/companymapping/statistics/`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getCompanyMapping() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/companymaster/companymapping`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getCompanyAutoMap() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/automap/company`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createAutoMap(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/automap/company`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createMapping(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/companymapping/`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createBulkMapping(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/automap/company/bulkmap`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteCompanyMaster(companyId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/companymaster/${companyId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteProductMapping(companyMapping, companyId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/companymapping/companymaster/${companyMapping.CompanyMasterID}/product/${companyMapping.ProductID}/company/${companyId}/`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getCompanyTemplates,\r\n createCompanyTemplate,\r\n renameCompanyTemplate,\r\n deleteCompanyTemplate,\r\n addCompany,\r\n deleteCompany\r\n };\r\n\r\n return service;\r\n\r\n async function getCompanyTemplates() {\r\n try {\r\n return await $http.get(`${apiUrl}/api/universal/companytemplates`);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function createCompanyTemplate(postData) {\r\n try {\r\n return await $http.post(`${apiUrl}/api/universal/companytemplates`, postData);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function renameCompanyTemplate(templateId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}/api/universal/companytemplates/${templateId}`, putData);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function deleteCompanyTemplate(templateId) {\r\n try {\r\n return await $http.delete(`${apiUrl}/api/universal/companytemplates/${templateId}`);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n async function addCompany(templateId, postData) {\r\n try {\r\n return await $http.post(`${apiUrl}/api/universal/companytemplates/${templateId}/companies`, postData);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function deleteCompany(templateId, companyMasterId) {\r\n try {\r\n return await $http.delete(`${apiUrl}/api/universal/companytemplates/${templateId}/companies/${companyMasterId}`);\r\n } catch (error) {\r\n showError(error);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getProducts,\r\n getUserId,\r\n updateGrid,\r\n generateCrossPlatformAutoMapping,\r\n deleteUserMaster,\r\n exportAutoMapping,\r\n importUserMapping,\r\n updateManualMapGrid,\r\n submitUserMapping\r\n };\r\n\r\n return service;\r\n\r\n\r\n async function getProducts() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/products`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getUserId(userId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/usermaster/${userId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function generateCrossPlatformAutoMapping() {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/usermaster/crossplatform/users/automap`);\r\n } catch {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateGrid(pageSize, page, data) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/universal/usermaster/crossplatform/users',\r\n data: data,\r\n params: { 'pagesize': pageSize, 'page': page }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateManualMapGrid(postData, pageSize, page) {\r\n try {\r\n return await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/universal/usermaster/crossplatform/users/available',\r\n data: postData,\r\n params: { 'pagesize': pageSize, 'page': page }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function submitUserMapping(postData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/usermaster/crossplatform`, postData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteUserMaster(postData) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/usermaster/crossplatform`, postData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportAutoMapping() {\r\n try {\r\n return await $http.post(`${apiUrl}/api/universal/usermaster/export`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importUserMapping(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/usermaster/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var factory = {\r\n getAllRoles,\r\n exportExcludedRoles,\r\n importExcludedRoles,\r\n updateExcludedRole\r\n };\r\n\r\n return factory;\r\n\r\n async function getAllRoles() {\r\n try {\r\n return await $http.get(`${apiUrl}/api/universal/securityroles`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportExcludedRoles() {\r\n try {\r\n return await $http.get(`${apiUrl}/api/universal/securityroles/exclude/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importExcludedRoles(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}/api/universal/securityroles/exclude/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateExcludedRole(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/securityroles/${data.SecurityRoleIdentifier}/exclude`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n var factory = {\r\n exportExcludedUsers,\r\n importExcludedUsers,\r\n updateExcludedUser\r\n };\r\n\r\n return factory;\r\n\r\n async function exportExcludedUsers() {\r\n try {\r\n return await $http.get(`${apiUrl}/api/universal/usermaster/exclude/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importExcludedUsers(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}/api/universal/usermaster/exclude/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateExcludedUser(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/usermaster/exclude`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getSystemRoles,\r\n getSystemRolesNonPaged,\r\n exportSystemRoles,\r\n getEmergencyAccessApproversByRole,\r\n addUserAsApprover,\r\n addEmergencyAccessSystemRole,\r\n updateSystemRole,\r\n addEmergencyAccessApprover,\r\n importSystemRoles,\r\n removeEmergencyAccessApprover\r\n };\r\n\r\n return service;\r\n\r\n // GET REQUESTS\r\n async function getEmergencyAccessApproversByRole(roleIdentifier) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/emergencyaccessapprovers/role/${roleIdentifier}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSystemRolesNonPaged() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/securityroles`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function exportSystemRoles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/securityroles/properties/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n //POST REQUESTS\r\n async function getSystemRoles(data, params) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/securityroles`, data, { params: params });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addUserAsApprover(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/emergencyaccessapprovers`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addEmergencyAccessSystemRole(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/securityroles/emergencyaccess`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // PUT REQUESTS\r\n async function updateSystemRole(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/securityroles/properties`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addEmergencyAccessApprover(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/emergencyaccessapprovers`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importSystemRoles(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/securityroles/properties/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // DELETE REQUESTS\r\n async function removeEmergencyAccessApprover(emergencyAccessApproverId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/emergencyaccessapprovers/${emergencyAccessApproverId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(error) {\r\n errorsDataService.catch(error);\r\n }\r\n\r\n function sendError(error) {\r\n throw error;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getMasterUsers,\r\n exportSystemUsers,\r\n updateUserIdentity,\r\n importSystemUsers,\r\n createUserMap,\r\n generateAssignments,\r\n deleteUserMap\r\n }\r\n\r\n return service;\r\n\r\n //GET\r\n async function getMasterUsers() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/usermaster`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function exportSystemUsers() {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/usermaster/identity/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n //PUT\r\n async function updateUserIdentity(userMasterId, putData) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/usermaster/${userMasterId}`, putData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importSystemUsers(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/universal/usermaster/identity/import`, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // POST\r\n async function createUserMap(mapObject) {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/fastpathusermappings`, mapObject);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function generateAssignments() {\r\n try {\r\n return await $http.post(`${apiUrl}api/universal/usermaster/identity/automap`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // DELETE\r\n async function deleteUserMap(userId, userMasterId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/fastpathusermappings/fpuser/${userId}/usermaster/${userMasterId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getNotificationTypes,\r\n getSubscriptions,\r\n getUsers,\r\n createSubscription,\r\n removeSubscription,\r\n updateTypeDescription\r\n };\r\n\r\n return service;\r\n\r\n async function getNotificationTypes() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/notificationtypes`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getSubscriptions() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/notificationsubscriptions`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getUsers() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/users`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createSubscription(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/notificationsubscriptions`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeSubscription(id) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/notificationsubscriptions/${id}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateTypeDescription(id, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/core/notificationtypes/${id}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getRoleTemplates,\r\n createRoleTemplate,\r\n renameRoleTemplate,\r\n deleteRoleTemplate,\r\n getRolesForProduct,\r\n addRole,\r\n deleteRole,\r\n exportRoleTemplates,\r\n importRoleTemplates,\r\n };\r\n\r\n return service;\r\n\r\n async function getRoleTemplates() {\r\n try {\r\n return await $http.get(apiUrl + 'api/universal/roletemplates');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function createRoleTemplate(postData) {\r\n try {\r\n return await $http.post(apiUrl + 'api/universal/roletemplates', postData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function renameRoleTemplate(templateId, putData) {\r\n try {\r\n return await $http.put(apiUrl + 'api/universal/roletemplates/' + templateId, putData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteRoleTemplate(templateId) {\r\n try {\r\n return await $http.delete(apiUrl + 'api/universal/roletemplates/' + templateId);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getRolesForProduct(productId) {\r\n try {\r\n return await $http.get(apiUrl + '/api/universal/securityroles/product/' + productId);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addRole(templateId, postData) {\r\n try {\r\n return await $http.post(apiUrl + 'api/universal/roletemplates/' + templateId + '/associate', postData);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function deleteRole(templateId, securityRoleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/universal/roletemplates/${templateId}/securityrole/${securityRoleId}/disassociate`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function exportRoleTemplates() {\r\n try {\r\n return await $http.get(`${apiUrl}/api/universal/roletemplates/export`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importRoleTemplates(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}/api/universal/roletemplates/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","import angular from 'angular';\r\nimport companyMappingDataServiceFactory from '../Components/CompanyMapping/companyMappingDataService.factory';\r\nimport companyTemplatesFactory from '../Components/CompanyTemplates/companyTemplates.factory';\r\nimport crossPlatformUsersDataServiceFactory from '../Components/CrossPlatformUsers/crossPlatformUsersDataService.factory';\r\nimport excludedRolesDataServiceFactory from '../Components/ExcludedRoles/excludedRolesDataService.factory';\r\nimport excludedUsersDataServiceFactory from '../Components/ExcludedUsers/excludedUsersDataService.factory';\r\nimport maintainSystemRolesDataServiceFactory from '../Components/maintainSystemRoles/maintainSystemRolesDataService.factory';\r\nimport maintainSystemUsersDataServiceFactory from '../Components/maintainSystemUsers/maintainSystemUsersDataService.factory';\r\nimport notificationsDataServiceFactory from '../Components/Notifications/notificationsDataService.factory';\r\nimport roleTemplatesFactory from '../Components/RoleTemplates/roleTemplates.factory';\r\n\r\n\r\nexport default angular\r\n .module('app.systemConfiguration.factories', [])\r\n .factory('companyTemplatesData', companyTemplatesFactory)\r\n .factory('notificationsDataService', notificationsDataServiceFactory)\r\n .factory('maintainSystemRolesDataService', maintainSystemRolesDataServiceFactory)\r\n .factory('roleTemplatesData', roleTemplatesFactory)\r\n .factory('companyMappingDataService', companyMappingDataServiceFactory)\r\n .factory('crossPlatformUsersDataService', crossPlatformUsersDataServiceFactory)\r\n .factory('excludedUsersDataService', excludedUsersDataServiceFactory)\r\n .factory('excludedRolesDataService', excludedRolesDataServiceFactory)\r\n .factory('maintainSystemUsersDataService', maintainSystemUsersDataServiceFactory)\r\n .name;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, excludedRolesDataService) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.dismiss = dismiss;\r\n vm.disableButton = false;\r\n vm.importExcludedRoles = importExcludedRoles;\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n function dismiss() { $uibModalInstance.dismiss(); }\r\n\r\n // Import Excluded Users\r\n async function importExcludedRoles(file) {\r\n vm.importPending = new createSpinner();\r\n vm.disableButton = true;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n try {\r\n await excludedRolesDataService.importExcludedRoles(fd);\r\n await helperService.successfulSaveButton(vm.importPending);\r\n cancel();\r\n } catch {\r\n vm.importPending.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, customBooleanYesNoFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\nimport importExcludedRolesController from \"./importExcludedRoles.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, reportsService, helperService, $uibModal, FileSaver, dataService, excludedRolesDataService, maintainSystemRolesDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.exportExcludedRoles = exportExcludedRoles;\r\n vm.openImportModal = openImportModal;\r\n vm.excludeRole = excludeRole;\r\n vm.customProductNames = new Array;\r\n\r\n activate();\r\n\r\n function activate() {\r\n createExcludedRolesGrid();\r\n }\r\n\r\n $scope.$on('ImportExcludedRoles', (event, args) => vm.excludedRolesGridDataSource.read());\r\n\r\n async function createExcludedRolesGrid() {\r\n const excludedRolesColumns = [\r\n { title: \"Excluded\", field: \"IsExcluded\", template: \"\", width: 130, filterable: customBooleanYesNoFilter },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n ];\r\n\r\n const products = await dataService.getProducts();\r\n // if there are multiple products we need to show the products column\r\n if (products.data.length > 1) {\r\n excludedRolesColumns.push(\r\n { field: \"ProductName\", title: \"Product\", filterable: customAutoCompleteFilter }\r\n );\r\n // set up the list of custom products to filter those roles in the grid data source\r\n vm.customProductNames = products.data.reduce((newArray, product) => {\r\n if (product.IsCustom) {\r\n newArray.push(product.Name);\r\n }\r\n return newArray;\r\n }, []);\r\n\r\n }\r\n\r\n vm.excludedRolesGridOptions = helperService.setMainGridOptions(excludedRolesColumns, 600);\r\n vm.excludedRolesGridOptions.autoBind = true;\r\n\r\n vm.excludedRolesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n IsExcluded: { type: \"boolean\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let query = helperService.prepareSortsAndFilters(options);\r\n // the api uses different field names for filtering and sorting security roles\r\n query = reportsService.fixFieldNamesForApi(query, \"SecurityRole\");\r\n // we don't currently support excluding custom product roles so we'll filter them\r\n vm.customProductNames.forEach(customProduct => query.Filters.push({\r\n FieldName: \"ProductName\",\r\n Operator: \"NotEquals\",\r\n Value: customProduct\r\n }));\r\n let params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n try {\r\n let response = await maintainSystemRolesDataService.getSystemRoles(query, params);\r\n options.success(response.data);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function excludeRole(dataItem) {\r\n const data = { SecurityRoleIdentifier: dataItem.Identifier, ShouldExclude: dataItem.IsExcluded };\r\n kendo.ui.progress(vm.excludedRolesGrid.element, true);\r\n try {\r\n await excludedRolesDataService.updateExcludedRole(data);\r\n kendo.ui.progress(vm.excludedRolesGrid.element, false);\r\n } catch {\r\n dataItem.Exclude = !dataItem.Exclude;\r\n kendo.ui.progress(vm.excludedRolesGrid.element, false);\r\n }\r\n }\r\n\r\n async function exportExcludedRoles() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n let response = await excludedRolesDataService.exportExcludedRoles();\r\n helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(response.data, 'ExcludedRoles.xlsx');\r\n vm.exportUpdatePending.loadingValue = false;\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function openImportModal() {\r\n let importModal = $uibModal.open({\r\n templateUrl: '/App/Components/ExcludedRoles/importExcludedRoles.html',\r\n controller: importExcludedRolesController,\r\n controllerAs: 'iervm',\r\n backdrop: 'static',\r\n });\r\n try {\r\n await importModal.result;\r\n return;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","/* excludedRoles.component.js */\r\n\r\nimport excludedRolesController from \"./excludedRoles.controller\";\r\n\r\n/**\r\n * @desc component to display view and Excluded Roles\r\n * @example \r\n */\r\n\r\nconst excludedRoles = {\r\n controller: excludedRolesController,\r\n controllerAs: 'ervm',\r\n templateUrl: '/App/Components/ExcludedRoles/excludedRoles.html'\r\n};\r\n\r\nexport default excludedRoles;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, excludedUsersDataService) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.dismiss = dismiss;\r\n vm.disableButton = false;\r\n vm.importExcludedUsers = importExcludedUsers;\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n function dismiss() { $uibModalInstance.dismiss(); }\r\n\r\n // Import Excluded Users\r\n async function importExcludedUsers(file) {\r\n vm.importPending = new createSpinner();\r\n vm.disableButton = true;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n try {\r\n await excludedUsersDataService.importExcludedUsers(fd);\r\n await helperService.successfulSaveButton(vm.importPending);\r\n cancel();\r\n } catch {\r\n vm.importPending.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n}","import { customAutoCompleteFilter, customBooleanYesNoFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport importExcludedUsersController from \"./importExcludedUsers.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, helperService, $uibModal, FileSaver, excludedUsersDataService, maintainSystemUsersDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.exportExcludedUsers = exportExcludedUsers;\r\n vm.openImportModal = openImportModal;\r\n vm.excludeUser = excludeUser;\r\n\r\n activate();\r\n\r\n function activate() {\r\n createExcludedUsersGrid();\r\n }\r\n\r\n $scope.$on('ImportExcludedUsers', (event, args) => vm.gridDataSource.read());\r\n\r\n function createExcludedUsersGrid() {\r\n let columnsFromVM = [\r\n { title: \"Excluded\", field: \"Exclude\", template: \"\", width: 130, filterable: customBooleanYesNoFilter },\r\n { field: \"Name\", title: \"User Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(columnsFromVM, 600);\r\n vm.mainGridOptions.autoBind = true;\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n Exclude: { type: \"boolean\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n let { data } = await maintainSystemUsersDataService.getMasterUsers();\r\n data = $filter('orderBy')(data, 'Name');\r\n options.success(data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function excludeUser(dataItem) {\r\n let userId = dataItem.ID;\r\n let exclude = dataItem.Exclude;\r\n let data = { UserMasterID: userId, ShouldExclude: exclude };\r\n vm.pleaseWait = new createSpinner();\r\n try {\r\n await excludedUsersDataService.updateExcludedUser(data);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n } catch {\r\n dataItem.Exclude = !dataItem.Exclude;\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n }\r\n\r\n async function exportExcludedUsers() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n let { data } = await excludedUsersDataService.exportExcludedUsers();\r\n await helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(data, 'ExcludedUsers.xlsx');\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function openImportModal() {\r\n let importModal = $uibModal.open({\r\n templateUrl: '/App/Components/ExcludedUsers/importExcludedUsers.html',\r\n controller: importExcludedUsersController,\r\n controllerAs: 'ieuvm',\r\n backdrop: 'static',\r\n });\r\n try {\r\n await importModal.result\r\n vm.gridDatasource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","/* excludedUsers.component.js */\r\n\r\nimport excludedUsersController from \"./excludedUsers.controller\";\r\n\r\n/**\r\n * @desc component to display view and Excluded Users\r\n * @example \r\n */\r\n\r\nconst excludedUsers = {\r\n controller: excludedUsersController,\r\n controllerAs: 'euvm',\r\n templateUrl: '/App/Components/ExcludedUsers/excludedUsers.html'\r\n};\r\n\r\nexport default excludedUsers;","import angular from 'angular';\r\nimport excludedRoles from '../Components/ExcludedRoles/excludedRoles.component';\r\nimport excludedUsers from '../Components/ExcludedUsers/excludedUsers.component';\r\n\r\n\r\nexport default angular\r\n .module('app.systemConfiguration.setup', [])\r\n .component(\"excludedUsers\", excludedUsers)\r\n .component(\"excludedRoles\", excludedRoles)\r\n .name;","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, userRestrictionsDataService, fastpathUser, $filter) {\r\n\r\n const vm = this;\r\n\r\n var inheritedCompanies = [];\r\n\r\n vm.fastpathUser = fastpathUser;\r\n vm.toggleCompany = toggleCompany;\r\n vm.handleCompanyMap = handleCompanyMap;\r\n vm.selectedCompanies = [];\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n // Add already mapped companies to selected companies array\r\n if (fastpathUser.ManualCompanyMappings.length > 0) vm.selectedCompanies = fastpathUser.ManualCompanyMappings.map(m => m.ID);\r\n if (fastpathUser.CompanyRestrictionType !== 'None') vm.enabled = true;\r\n\r\n // Auto-select user options and set up relevant grids\r\n if (fastpathUser.CompanyRestrictionType === 'UserMasterMapping') {\r\n vm.option = 0;\r\n setupInheritedCompaniesGrid();\r\n setupManualCompaniesGrid();\r\n }\r\n else if (fastpathUser.SystemUserMapping && fastpathUser.CompanyRestrictionType === 'ManualMapping') {\r\n vm.option = 1;\r\n setupInheritedCompaniesGrid();\r\n setupManualCompaniesGrid();\r\n }\r\n else if (fastpathUser.SystemUserMapping && fastpathUser.CompanyRestrictionType === 'None') {\r\n vm.option = 0;\r\n setupInheritedCompaniesGrid();\r\n setupManualCompaniesGrid();\r\n }\r\n else if (!fastpathUser.SystemUserMapping && fastpathUser.CompanyRestrictionType === 'ManualMapping') {\r\n vm.option = 1;\r\n setupManualCompaniesGrid();\r\n }\r\n else if (!fastpathUser.SystemUserMapping && fastpathUser.CompanyRestrictionType === 'None') {\r\n setupManualCompaniesGrid();\r\n }\r\n\r\n }\r\n\r\n function setupInheritedCompaniesGrid() {\r\n var inheritedCompanyGridColumns = [{ field: \"Name\", title: \"Name\" }];\r\n\r\n vm.inheritedCompanyGridOptions = helperService.setMainGridOptions(inheritedCompanyGridColumns, 300);\r\n\r\n vm.inheritedCompanyGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n userRestrictionsDataService.getUserCompanyMappings(vm.fastpathUser.SystemUserMapping.ID)\r\n .then(res => {\r\n res.data = $filter('orderBy')(res.data, 'Name');\r\n options.success(res.data);\r\n inheritedCompanies = res.data.map(c => { return c.ID; });\r\n }).catch(_ => {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n function setupManualCompaniesGrid() {\r\n var manualCompanyGridColumns = [\r\n {\r\n title: \"Access\",\r\n template: ``,\r\n width: 65, filterable: false\r\n },\r\n { field: \"Name\", title: \"Name\" }\r\n ];\r\n\r\n vm.manualCompanyGridOptions = helperService.setMainGridOptions(manualCompanyGridColumns, 300);\r\n\r\n vm.manualCompanyGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n userRestrictionsDataService.getUserCompanies()\r\n .then(res => {\r\n\r\n if (fastpathUser.ManualCompanyMappings.length > 0) {\r\n fastpathUser.ManualCompanyMappings.forEach(m => {\r\n let match = res.data.find(c => c.ID === m.ID);\r\n match.companyAccess = true;\r\n });\r\n }\r\n res.data = $filter('orderBy')(res.data, 'Name');\r\n options.success(res.data);\r\n }).catch(_ => {\r\n options.error();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n function toggleCompany(dataItem) {\r\n\r\n switch (dataItem.companyAccess) {\r\n\r\n case true:\r\n vm.selectedCompanies.push(dataItem.ID);\r\n break;\r\n case false:\r\n vm.selectedCompanies.remove(dataItem.ID);\r\n break;\r\n }\r\n }\r\n\r\n function handleCompanyMap() {\r\n\r\n let map = {};\r\n map.FpUserId = fastpathUser.UserID;\r\n\r\n if (!vm.enabled) {\r\n disableCompanyRestrictions(map.FpUserId);\r\n }\r\n else if (vm.enabled && vm.option === 0) {\r\n map.CompanyMasterIds = inheritedCompanies;\r\n map.CompanyRestrictionType = 2;\r\n createCompanyMap(map);\r\n }\r\n else if (vm.enabled && vm.option === 1) {\r\n map.CompanyMasterIds = vm.selectedCompanies;\r\n map.CompanyRestrictionType = 1;\r\n createCompanyMap(map);\r\n }\r\n }\r\n\r\n async function createCompanyMap(map) {\r\n\r\n vm.save = new createSpinner();\r\n\r\n try {\r\n await userRestrictionsDataService.createCompanyMap(map);\r\n await helperService.successfulSaveButton(vm.save);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.save = null;\r\n }\r\n }\r\n\r\n async function disableCompanyRestrictions(userId) {\r\n\r\n vm.save = new createSpinner();\r\n\r\n try {\r\n await userRestrictionsDataService.disableCompanyRestrictions(userId);\r\n await helperService.successfulSaveButton(vm.save);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.save = null;\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n}","import { standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, userRestrictionsDataService, dataService, fastpathUser, $filter) {\r\n\r\n const vm = this;\r\n\r\n let inheritedProducts = [];\r\n\r\n vm.fastpathUser = fastpathUser;\r\n vm.toggleProduct = toggleProduct;\r\n vm.handleProductMap = handleProductMap;\r\n vm.selectedProducts = [];\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n // Add already mapped products to selected products array\r\n if (fastpathUser.ManualProductMappings.length > 0) vm.selectedProducts = fastpathUser.ManualProductMappings.map(m => m.ID);\r\n if (fastpathUser.ProductRestrictionType !== 'None') vm.enabled = true;\r\n\r\n // Auto-select user options and set up relevant grids\r\n if (fastpathUser.ProductRestrictionType === 'UserMasterMapping') {\r\n vm.option = 0;\r\n setupInheritedProductsGrid();\r\n setupManualProductsGrid();\r\n }\r\n else if (fastpathUser.SystemUserMapping && fastpathUser.ProductRestrictionType === 'ManualMapping') {\r\n vm.option = 1;\r\n setupInheritedProductsGrid();\r\n setupManualProductsGrid();\r\n }\r\n else if (fastpathUser.SystemUserMapping && fastpathUser.ProductRestrictionType === 'None') {\r\n vm.option = 0;\r\n setupInheritedProductsGrid();\r\n setupManualProductsGrid();\r\n }\r\n else if (!fastpathUser.SystemUserMapping && fastpathUser.ProductRestrictionType === 'ManualMapping') {\r\n vm.option = 1;\r\n setupManualProductsGrid();\r\n }\r\n else if (!fastpathUser.SystemUserMapping && fastpathUser.ProductRestrictionType === 'None') {\r\n setupManualProductsGrid();\r\n }\r\n\r\n }\r\n\r\n function setupInheritedProductsGrid() {\r\n const inheritedProductGridColumns = [{ field: \"ProductName\", title: \"Product Name\" }];\r\n\r\n vm.inheritedProductGridOptions = helperService.setMainGridOptions(inheritedProductGridColumns, 300);\r\n\r\n vm.inheritedProductGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await userRestrictionsDataService.getUserMappings(vm.fastpathUser.SystemUserMapping.ID)\r\n response.data = $filter('orderBy')(response.data, 'ProductName');\r\n options.success(response.data);\r\n inheritedProducts = response.data.map(p => { return p.ProductID; });\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function setupManualProductsGrid() {\r\n const manualProductGridColumns = [\r\n {\r\n title: \"Access\",\r\n template: ``,\r\n width: 65, filterable: false\r\n },\r\n { field: \"Name\", title: \"Product Name\" }\r\n ];\r\n\r\n vm.manualProductGridOptions = helperService.setMainGridOptions(manualProductGridColumns, 300);\r\n\r\n vm.manualProductGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let res = await dataService.getProducts();\r\n\r\n if (fastpathUser.ManualProductMappings.length > 0) {\r\n fastpathUser.ManualProductMappings.forEach(m => {\r\n let match = res.data.find(p => p.ID === m.ID);\r\n match.productAccess = true;\r\n });\r\n }\r\n res.data = $filter('orderBy')(res.data, 'Name');\r\n options.success(res.data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function toggleProduct(dataItem) {\r\n\r\n switch (dataItem.productAccess) {\r\n\r\n case true:\r\n vm.selectedProducts.push(dataItem.ID);\r\n break;\r\n case false:\r\n vm.selectedProducts.remove(dataItem.ID);\r\n break;\r\n }\r\n }\r\n\r\n function handleProductMap() {\r\n\r\n let map = {};\r\n map.FpUserId = fastpathUser.UserID;\r\n\r\n if (!vm.enabled) {\r\n disableProductRestrictions(map.FpUserId);\r\n }\r\n else if (vm.enabled && vm.option === 0) {\r\n map.ProductIds = inheritedProducts;\r\n map.ProductRestrictionType = 2;\r\n createProductMap(map);\r\n }\r\n else if (vm.enabled && vm.option === 1) {\r\n map.ProductIds = vm.selectedProducts;\r\n map.ProductRestrictionType = 1;\r\n createProductMap(map);\r\n }\r\n }\r\n\r\n async function createProductMap(map) {\r\n\r\n vm.save = new createSpinner();\r\n\r\n try {\r\n await userRestrictionsDataService.createProductMap(map);\r\n await helperService.successfulSaveButton(vm.save);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.save = null;\r\n }\r\n }\r\n\r\n async function disableProductRestrictions(userId) {\r\n\r\n vm.save = new createSpinner();\r\n\r\n try {\r\n await userRestrictionsDataService.disableProductRestrictions(userId)\r\n await helperService.successfulSaveButton(vm.save)\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.save = null;\r\n }\r\n }\r\n\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n}","import companyRestrictionsModalController from \"../CompanyRestrictionsModal/companyRestrictionsModal.controller\";\r\nimport productRestrictionsModalController from \"../ProductRestrictionsModal/productRestrictionsModal.controller\";\r\n\r\n\r\nexport default /*@ngInject*/ function FastpathUserListController($scope, $filter, $uibModal, userRestrictionsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedUser = changeSelectedUser;\r\n vm.availableProducts = $scope.$parent.availableProductsForUser;\r\n\r\n activate();\r\n\r\n function activate() {\r\n\r\n getFastpathUsers();\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Company Restrictions',\r\n click: item => {\r\n openCompanyRestrictionsModal(item.user);\r\n }\r\n },\r\n {\r\n text: 'Product Restrictions',\r\n click: item => {\r\n openProductRestrictionsModal(item.user);\r\n }, \r\n displayed: item => {\r\n return vm.availableProducts.length > 1;\r\n }\r\n }\r\n ];\r\n }\r\n\r\n async function getFastpathUsers() {\r\n try {\r\n let { data } = await userRestrictionsDataService.getFastpathUsers();\r\n if (data.length > 0) {\r\n data = data.filter(user => user.Active === true);\r\n data = $filter('orderBy')(data, 'UserLogonName');\r\n }\r\n vm.users = data;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function changeSelectedUser(user) {\r\n vm.user = user;\r\n }\r\n\r\n async function openCompanyRestrictionsModal(user) {\r\n\r\n let companyModal = $uibModal.open({\r\n templateUrl: '/App/Components/userRestrictions/companyRestrictionsModal/companyRestrictionsModal.html',\r\n controller: companyRestrictionsModalController,\r\n controllerAs: 'crmvm',\r\n backdrop: 'static',\r\n resolve: { fastpathUser: () => user }\r\n });\r\n\r\n try {\r\n await companyModal.result;\r\n getFastpathUsers();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openProductRestrictionsModal(user) {\r\n\r\n let productModal = $uibModal.open({\r\n templateUrl: '/App/Components/userRestrictions/productRestrictionsModal/productRestrictionsModal.html',\r\n controller: productRestrictionsModalController,\r\n controllerAs: 'prmvm',\r\n backdrop: 'static',\r\n resolve: { fastpathUser: () => user }\r\n });\r\n\r\n try {\r\n await productModal.result;\r\n getFastpathUsers();\r\n } catch {\r\n return;\r\n }\r\n }\r\n}\r\n","import FastpathUserListController from \"./fastpathUserList.controller\"; \r\n\r\n/* fastpathUserList.component.js */\r\n\r\n/**\r\n * @desc component for displaying and selecting fastpath users in a list\r\n * @example \r\n */\r\n\r\nvar fastpathUserList = {\r\n controller: FastpathUserListController,\r\n controllerAs: 'fulvm',\r\n templateUrl: '/App/Components/userRestrictions/fastpathUserList/fastpathUserList.tmpl.html'\r\n};\r\n\r\nexport default fastpathUserList;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getFastpathUsers,\r\n getUserCompanies,\r\n getUserCompanyMappings,\r\n getUserMappings,\r\n createCompanyMap,\r\n createProductMap,\r\n disableCompanyRestrictions,\r\n disableProductRestrictions\r\n };\r\n\r\n return service;\r\n\r\n // GET Calls\r\n async function getFastpathUsers() {\r\n try {\r\n return await $http.get(apiUrl + 'api/core/users');\r\n } catch(err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getUserCompanies() {\r\n try {\r\n return await $http.get(apiUrl + 'api/universal/companymaster');\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getUserCompanyMappings(userId) {\r\n try {\r\n return await $http.get(apiUrl + `api/universal/companymaster/usermaster/${userId}`);\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function getUserMappings(userId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/universal/usermapping/usermaster/${userId}`);\r\n } catch {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // POST calls\r\n async function createCompanyMap(mapObject) {\r\n try {\r\n return await $http.post(apiUrl + 'api/universal/fastpathusercompanymappings', mapObject);\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createProductMap(mapObject) {\r\n try {\r\n return await $http.post(apiUrl + 'api/universal/fastpathuserproductmappings', mapObject);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n // PUT calls\r\n async function disableCompanyRestrictions(userId) {\r\n try {\r\n return await $http.put(apiUrl + `api/universal/fastpathusercompanymappings/${userId}/disable`);\r\n } catch(err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function disableProductRestrictions(userId) {\r\n try {\r\n return await $http.put(apiUrl + `api/universal/fastpathuserproductmappings/${userId}/disable`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) { errorsDataService.catch(err); }\r\n function sendError(err) { throw err; }\r\n\r\n}","import angular from 'angular';\r\nimport fastpathUserList from '../Components/userRestrictions/fastpathUserList/fastpathUserList.component';\r\nimport userRestrictionsFactory from '../Components/userRestrictions/userRestrictions.factory';\r\n\r\nexport default angular\r\n .module('app.systemConfiguration.userRestrictions', [])\r\n .component('fastpathUserList', fastpathUserList)\r\n .factory('userRestrictionsDataService', userRestrictionsFactory)\r\n .name;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, approvalGroupsDataService, group) {\r\n\r\n const vm = this;\r\n vm.group = Object.assign({}, group);\r\n vm.dismiss = dismiss;\r\n vm.groupFormSubmit = groupFormSubmit;\r\n vm.shouldBeOpen = true;\r\n vm.updateInProgress = false;\r\n\r\n function cancel(newGroupId) {\r\n $uibModalInstance.close(newGroupId);\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function groupFormSubmit() {\r\n vm.updateInProgress = new createSpinner();\r\n const data = vm.group;\r\n if (group) {\r\n updateGroup(data);\r\n } else {\r\n addNewGroup(data);\r\n }\r\n }\r\n\r\n async function addNewGroup(data) {\r\n try {\r\n let response = await approvalGroupsDataService.addApprovalGroup(data);\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n cancel(response.data);\r\n } catch (err) {\r\n vm.updateInProgress.loadingValue = false;\r\n return;\r\n }\r\n }\r\n\r\n async function updateGroup(data) {\r\n try {\r\n await approvalGroupsDataService.updateGroup(vm.group.Id, data);\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n cancel();\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, approvalGroupsDataService, dataService, $filter, group, level, selectedApprovers, showWarning, fromEdit) {\r\n\r\n const vm = this;\r\n vm.level = Object.assign({}, level);\r\n vm.group = Object.assign({}, group);\r\n vm.showWarning = showWarning;\r\n vm.fromEdit = fromEdit;\r\n vm.dismiss = dismiss;\r\n vm.levelFormSubmit = levelFormSubmit;\r\n vm.allApproversRequiredChanged = allApproversRequiredChanged;\r\n vm.approversSelectionChanged = approversSelectionChanged;\r\n vm.shouldBeOpen = true;\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (!vm.level.Id) {\r\n vm.level.RequiresAllApprovers = false;\r\n configureApproversGrid();\r\n }\r\n }\r\n\r\n function cancel(newLevelId) {\r\n $uibModalInstance.close(newLevelId);\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function levelFormSubmit() {\r\n vm.updateInProgress = new createSpinner();\r\n const data = vm.level;\r\n vm.level.ApprovalGroupId = vm.group.Id;\r\n if (vm.level.Id) {\r\n updateLevel(data);\r\n } else {\r\n addNewLevel(data);\r\n }\r\n }\r\n\r\n async function addNewLevel(data) {\r\n try {\r\n let response = await approvalGroupsDataService.addApprovalGroupLevel(vm.group.Id, data);\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n cancel(response.data);\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateLevel(data) {\r\n try {\r\n await approvalGroupsDataService.updateGroupLevel(vm.group.Id, vm.level.Id, data);\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n cancel();\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function allApproversRequiredChanged() {\r\n if (vm.level.RequiresAllApprovers) {\r\n if (vm.level.ApprovalsRequired) vm.level.ApprovalsRequired = null;\r\n }\r\n }\r\n\r\n function approversSelectionChanged() {\r\n vm.level.ApproverIds = vm.approversGrid.selectedKeyNames();\r\n }\r\n\r\n function configureApproversGrid() {\r\n const approversGridColumns = [\r\n { selectable: true, width: 50 },\r\n { title: \"Name\", field: \"UserLogonName\", filterable: customAutoCompleteFilter },\r\n { title: \"Email\", field: \"Email\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.approversGridOptions = helperService.setMainGridOptions(approversGridColumns, null);\r\n vm.approversGridOptions.selectable = false;\r\n vm.approversGridOptions.persistSelection = true;\r\n vm.approversGridOptions.noRecords = {\r\n template: \"All Approvers Are Currently Assigned
\"\r\n };\r\n\r\n vm.approversGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n id: \"UserID\"\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await dataService.getUsers();\r\n response.data = $filter('orderBy')(response.data, 'UserLogonName');\r\n response.data = response.data.filter(obj => obj.Active && !selectedApprovers.some(o => o.UserId === obj.UserID));\r\n options.success(response.data);\r\n } catch (error) {\r\n options.error(error);\r\n }\r\n\r\n }\r\n }\r\n });\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, approvalGroupsDataService, dataService, $filter, group, level, selectedApprovers) {\r\n\r\n const vm = this;\r\n vm.level = Object.assign({}, level);\r\n vm.group = Object.assign({}, group);\r\n vm.selectedApprovers = selectedApprovers;\r\n vm.addApproverToLevel = addApproverToLevel;\r\n vm.close = close;\r\n\r\n activate();\r\n\r\n function activate() {\r\n configureApproversGrid();\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n async function addApproverToLevel(approver) {\r\n const data = {\r\n Id: vm.level.Id,\r\n ApprovalGroupId: vm.group.Id,\r\n UserId: approver.UserID\r\n };\r\n await approvalGroupsDataService.addApproverToApprovalGroupLevel(vm.group.Id, vm.level.Id, data);\r\n const formattedApprover = {\r\n Name: approver.UserLogonName,\r\n UserId: approver.UserID\r\n };\r\n vm.selectedApprovers.push(formattedApprover);\r\n vm.approversGridDataSource.read();\r\n }\r\n\r\n function configureApproversGrid() {\r\n const approversGridColumns = [\r\n { title: \"Name\", field: \"UserLogonName\", filterable: customAutoCompleteFilter },\r\n { title: \"Email\", field: \"Email\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \" \", width: 20 }\r\n ];\r\n\r\n vm.approversGridOptions = helperService.setMainGridOptions(approversGridColumns, null);\r\n vm.approversGridOptions.selectable = false;\r\n vm.approversGridOptions.noRecords = {\r\n template: \"All Approvers Are Currently Assigned
\"\r\n };\r\n\r\n vm.approversGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n id: \"UserID\"\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await dataService.getUsers();\r\n response.data = $filter('orderBy')(response.data, 'UserLogonName');\r\n response.data = response.data.filter(obj => obj.Active && !vm.selectedApprovers.some(o => o.UserId === obj.UserID));\r\n options.success(response.data);\r\n } catch (error) {\r\n options.error(error);\r\n }\r\n }\r\n}\r\n });\r\n }\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, approvalGroupsDataService) {\r\n const vm = this;\r\n\r\n vm.importApprovalGroups = importApprovalGroups;\r\n vm.cancel = cancel;\r\n\r\n async function importApprovalGroups() {\r\n let fd = new FormData();\r\n\r\n vm.savePending = new createSpinner();\r\n fd.append(vm.files.files[0].name, vm.files.files[0].file);\r\n\r\n try {\r\n await approvalGroupsDataService.importApprovalGroups(fd);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport approvalGroupModalController from \"./ApprovalGroupModal/approvalGroupModal.controller\";\r\nimport levelModalController from \"./LevelModal/levelModal.controller\";\r\nimport approversModalController from \"./ApproversModal/approversModal.controller\";\r\nimport approvalGroupImportModalController from \"./approvalGroupImportModal.controller\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($uibModal, approvalGroupsDataService, $filter, helperService, FileSaver) {\r\n\r\n const vm = this;\r\n vm.selectedApprovers = [];\r\n vm.openGroupModal = openGroupModal;\r\n vm.openApproversModal = openApproversModal;\r\n vm.deleteGroup = deleteGroup;\r\n vm.deleteGroupLevel = deleteGroupLevel;\r\n vm.selectedGroupChanged = selectedGroupChanged;\r\n vm.selectedLevelChanged = selectedLevelChanged;\r\n vm.openLevelModal = openLevelModal;\r\n vm.removeApprover = removeApprover;\r\n vm.exportApprovalGroups = exportApprovalGroups;\r\n vm.openApprovalGroupImportModal = openApprovalGroupImportModal;\r\n\r\n vm.approvalGroupMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openGroupModal(item.group);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteGroup(item.group);\r\n }\r\n }\r\n ];\r\n\r\n vm.approvalGroupLevelMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n vm.openLevelModal(item.level, true);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n vm.deleteGroupLevel(item.level);\r\n },\r\n displayed: function (modelValue) {\r\n return vm.levelsDataSource.length === modelValue.level.Level && vm.levelsDataSource.length > 1;\r\n }\r\n }\r\n ];\r\n\r\n activate();\r\n\r\n function activate() {\r\n getGroups();\r\n }\r\n\r\n async function getGroups() {\r\n vm.gettingGroupsInProgress = true;\r\n if (vm.selectedLevel) vm.selectedLevel = null;\r\n if (vm.selectedGroup) vm.selectedGroup = null;\r\n\r\n let response = await approvalGroupsDataService.getApprovalGroups();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.groupsDataSource = response.data;\r\n vm.gettingGroupsInProgress = false;\r\n }\r\n\r\n async function getLevels() {\r\n vm.gettingLevelsInProgress = true;\r\n if (vm.selectedApprovers.length > 0) vm.selectedApprovers = [];\r\n\r\n let { data } = await approvalGroupsDataService.getApprovalGroupLevels(vm.selectedGroup.Id);\r\n vm.levelsDataSource = $filter('orderBy')(data, 'Level');\r\n // Need to track approvers that are already in a level\r\n data.forEach(level => {\r\n vm.selectedApprovers = vm.selectedApprovers.concat(level.Approvers);\r\n });\r\n vm.gettingLevelsInProgress = false;\r\n }\r\n\r\n function getApprovers(levelId) {\r\n vm.approversDataSource = vm.levelsDataSource.find(level => level.Id === levelId).Approvers;\r\n vm.approversDataSource = $filter('orderBy')(vm.approversDataSource, 'Name');\r\n }\r\n\r\n function sendNewGroupToTop(newGroupId) {\r\n vm.selectedGroup = vm.groupsDataSource.find(group => group.Id === newGroupId);\r\n vm.groupsDataSource = vm.groupsDataSource.filter(group => group.Id !== newGroupId);\r\n vm.groupsDataSource.unshift(vm.selectedGroup);\r\n }\r\n\r\n async function openGroupModal(group) {\r\n let groupModal = $uibModal.open({\r\n templateUrl: '/App/Components/ApprovalGroups/ApprovalGroupModal/approvalGroupModal.html',\r\n controller: approvalGroupModalController,\r\n controllerAs: 'agmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n group: () => group || null\r\n }\r\n });\r\n\r\n try {\r\n let newGroupId = await groupModal.result;\r\n await getGroups();\r\n if (newGroupId) {\r\n await selectedGroupChanged(newGroupId);\r\n await sendNewGroupToTop(newGroupId);\r\n } else if (vm.selectedGroup) {\r\n await selectedGroupChanged(vm.selectedGroup.Id);\r\n }\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function openLevelModal(level, fromEdit) {\r\n let levelsModal = $uibModal.open({\r\n templateUrl: '/App/Components/ApprovalGroups/LevelModal/levelModal.html',\r\n controller: levelModalController,\r\n controllerAs: 'lmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n level: () => level || null,\r\n group: () => vm.selectedGroup,\r\n selectedApprovers: () => vm.selectedApprovers || [],\r\n showWarning: () => vm.levelsDataSource.length,\r\n fromEdit: () => fromEdit\r\n }\r\n });\r\n\r\n try {\r\n let newLevelId = await levelsModal.result;\r\n await getLevels();\r\n if (newLevelId) {\r\n await selectedLevelChanged(newLevelId);\r\n } else if (vm.selectedLevel) {\r\n await selectedLevelChanged(vm.selectedLevel.Id);\r\n }\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function openApproversModal() {\r\n let approversModal = $uibModal.open({\r\n templateUrl: '/App/Components/ApprovalGroups/ApproversModal/approversModal.html',\r\n controller: approversModalController,\r\n controllerAs: 'amvm',\r\n backdrop: 'static',\r\n resolve: {\r\n level: () => vm.selectedLevel,\r\n group: () => vm.selectedGroup,\r\n selectedApprovers: () => vm.selectedApprovers || []\r\n }\r\n });\r\n\r\n try {\r\n await approversModal.result;\r\n const selectedLevelId = vm.selectedLevel.Id;\r\n clearLevels();\r\n await getLevels();\r\n await selectedLevelChanged(selectedLevelId);\r\n } catch (dismiss) { return; }\r\n }\r\n\r\n async function deleteGroup(group) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Group', 'Are you sure you want to delete group ' + group.Name + '?', 'Delete'));\r\n await approvalGroupsDataService.removeApprovalGroup(group.Id);\r\n getGroups();\r\n } catch (dismiss) {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteGroupLevel(level) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Level', 'Are you sure you want to delete Level ' + level.Level + '?', 'Delete'));\r\n await approvalGroupsDataService.removeApprovalGroupLevel(vm.selectedGroup.Id, level.Id);\r\n vm.selectedLevel = null;\r\n await getLevels();\r\n } catch (dismiss) {\r\n return;\r\n }\r\n }\r\n\r\n async function removeApprover(approver) {\r\n const selectedLevelId = vm.selectedLevel.Id;\r\n await approvalGroupsDataService.removeApproverFromApprovalGroupLevel(vm.selectedGroup.Id, vm.selectedLevel.Id, approver.UserId);\r\n clearLevels();\r\n await getLevels();\r\n await selectedLevelChanged(selectedLevelId);\r\n }\r\n\r\n async function openApprovalGroupImportModal() {\r\n let approvalGroupModal = $uibModal.open({\r\n templateUrl: '/App/Components/ApprovalGroups/approvalGroupImportModal.tmpl.html',\r\n controller: approvalGroupImportModalController,\r\n controllerAs: 'agmvm',\r\n backdrop: 'static'\r\n });\r\n\r\n try {\r\n await approvalGroupModal.result;\r\n activate();\r\n } catch { return; }\r\n }\r\n\r\n async function exportApprovalGroups() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n const response = await approvalGroupsDataService.exportApprovalGroups();\r\n await helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(response.data, 'ApprovalGroups.xlsx');\r\n } catch (err) {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function selectedGroupChanged(selectedGroupId) {\r\n if (vm.selectedGroup && vm.selectedGroup.Id === selectedGroupId) {\r\n return;\r\n } else {\r\n if (vm.selectedApprovers.length > 0) vm.selectedApprovers = [];\r\n clearLevels();\r\n vm.selectedGroup = vm.groupsDataSource.find(group => group.Id === selectedGroupId);\r\n getLevels();\r\n }\r\n }\r\n\r\n function selectedLevelChanged(selectedLevelId) {\r\n if (vm.selectedLevel && vm.selectedLevel.Id === selectedLevelId) {\r\n return;\r\n } else {\r\n vm.selectedLevel = vm.levelsDataSource.find(level => level.Id === selectedLevelId);\r\n getApprovers(selectedLevelId);\r\n }\r\n }\r\n\r\n function clearLevels() {\r\n vm.selectedLevel = null;\r\n vm.levelsDataSource = null;\r\n vm.approversDataSource = null;\r\n }\r\n}\r\n\r\n\r\n\r\n","import approvalGroupsController from \"./approvalGroups.controller\";\r\n\r\n/* approvalGroups.component.js */\r\n\r\n/**\r\n * @desc component for viewing and manage approval groups\r\n * @example \r\n */\r\n\r\nconst approvalGroups = {\r\n controller: approvalGroupsController,\r\n controllerAs: 'agvm',\r\n templateUrl: '/App/Components/ApprovalGroups/approvalGroups.tmpl.html'\r\n};\r\n\r\nexport default approvalGroups;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModalInstance, dataService, userRestrictionsDataService, helperService, companyMappingDataService, availableProducts) {\r\n\r\n const vm = this;\r\n\r\n vm.allCompaniesForAllProducts = [];\r\n vm.selectedMasterCompanies = [];\r\n\r\n vm.bulkMap = bulkMap;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n getAllCompanies();\r\n getMasterCompanies();\r\n }\r\n\r\n function getAllCompanies() {\r\n availableProducts.forEach(async product => {\r\n let { data } = await dataService.getCompaniesByProductId(product.ID);\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.allCompaniesForAllProducts = vm.allCompaniesForAllProducts.concat(data);\r\n vm.allCompaniesForAllProducts = $filter('orderBy')(vm.allCompaniesForAllProducts, 'ProductID');\r\n });\r\n\r\n }\r\n\r\n async function getMasterCompanies() {\r\n let { data } = await userRestrictionsDataService.getUserCompanies();\r\n data = $filter('orderBy')(data, 'Name');\r\n vm.masterCompanies = data;\r\n }\r\n\r\n async function bulkMap() {\r\n vm.pleaseWait = new createSpinner();\r\n\r\n let record = {\r\n \"ProductID\": vm.selectedProductCompany.ProductID,\r\n \"CompanyID\": vm.selectedProductCompany.ID,\r\n \"CompanyMasterIDs\": vm.selectedMasterCompanies.map(el => el.ID)\r\n };\r\n\r\n try {\r\n await companyMappingDataService.createBulkMapping(record);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModalInstance, selectedCompanyProduct, helperService, $http) {\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n function activate() {\r\n let columnsFromVM = [\r\n { field: \"CompanyName\", title: \"Company\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.manualMapGridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n vm.manualMapGridOptions.selectable = true;\r\n\r\n vm.manualMapDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: function (options) {\r\n $http.get(apiUrl + 'api/universal/companymapping/unmapped/product/' + selectedCompanyProduct.ProductID).then(function (response) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (availableProducts, $uibModalInstance, helperService, companyMappingDataService, $filter) {\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.acceptAutoMap = acceptAutoMap;\r\n vm.removeProductFromAutoMap = removeProductFromAutoMap;\r\n\r\n activate();\r\n\r\n function activate() {\r\n createGridOptions();\r\n createDataSource();\r\n }\r\n\r\n function createGridOptions() {\r\n let columnsFromVM = [\r\n { field: \"Name\", title: \"Company\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n let dynamicColumns = [];\r\n availableProducts.forEach(product => {\r\n let identifier = product.Identifier;\r\n let productId = product.ID;\r\n let productName = product.Name;\r\n\r\n let customTemplate =\r\n \"{{dataItem.\" + identifier + \"}}\" +\r\n \"\";\r\n\r\n let templateRow = { field: identifier, title: productName, template: customTemplate, filterable: customAutoCompleteFilter };\r\n dynamicColumns.push(templateRow);\r\n });\r\n\r\n dynamicColumns = dynamicColumns.unique();\r\n\r\n dynamicColumns = $filter('orderBy')(dynamicColumns, 'field');\r\n columnsFromVM = columnsFromVM.concat(dynamicColumns);\r\n\r\n vm.autoMapResultsGridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n }\r\n\r\n\r\n function addProductSpecificVariables(data) {\r\n data.forEach(row => {\r\n availableProducts.forEach(product => {\r\n row[product.Identifier] = null;\r\n });\r\n\r\n row.CompanyMappings.forEach(function (mapping) {\r\n var identifier = 'id' + mapping.ProductName.replace(/ /g, '');\r\n row[identifier] = mapping.CompanyName;\r\n });\r\n });\r\n return data;\r\n }\r\n\r\n function createDataSource() {\r\n vm.autoMapResultsDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await companyMappingDataService.getCompanyAutoMap();\r\n response.data = addProductSpecificVariables(response.data);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function removeProductFromAutoMap(dataItem, identifier, launchedFromProductId, launchedFromProductName) {\r\n dataItem[identifier] = null;\r\n\r\n for (var i = 0; i < dataItem.CompanyMappings.length; i++) {\r\n if (dataItem.CompanyMappings[i].ProductID === launchedFromProductId) {\r\n dataItem.CompanyMappings.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if (dataItem.CompanyMappings.length === 0) {\r\n vm.autoMapResultsDataSource.remove(dataItem);\r\n }\r\n };\r\n\r\n async function acceptAutoMap() {\r\n vm.pleaseWait = new createSpinner();\r\n\r\n let data = vm.autoMapResultsDataSource.data();\r\n let CompanyMasterRequests = [];\r\n\r\n data.forEach(row => {\r\n let record = {\r\n \"ID\": row.ID,\r\n \"Name\": row.Name,\r\n \"CompanyMappings\": row.CompanyMappings\r\n };\r\n CompanyMasterRequests.push(record);\r\n });\r\n\r\n let postBody = {\r\n \"CompanyMasterRequests\": CompanyMasterRequests\r\n };\r\n\r\n try {\r\n await companyMappingDataService.createAutoMap(postBody);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize, customAutoCompleteFilter } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $filter, $uibModalInstance, selectedCompanyForManualMapping, selectedCompanyProductClicked, helperService, dataService, companyMappingDataService, $http) {\r\n const vm = this;\r\n\r\n vm.updateMapping = updateMapping;\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.cancel = cancel;\r\n\r\n vm.selectedCompanyForManualMapping = selectedCompanyForManualMapping;\r\n vm.selectedCompanyProductClicked = selectedCompanyProductClicked;\r\n\r\n activate();\r\n\r\n function activate() {\r\n createGrid();\r\n }\r\n\r\n\r\n function createGrid() {\r\n let columnsFromVM = [\r\n { field: \"Name\", title: \"Company\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.manualMapGridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n vm.manualMapGridOptions.selectable = true;\r\n\r\n vm.manualMapDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await dataService.getCompaniesByProductId(selectedCompanyProductClicked.ProductID);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n async function updateMapping() {\r\n //Check to see if product exists in CompanyMappings\r\n let productAlreadyExists = selectedCompanyForManualMapping.CompanyMappings.some(e => e.ProductID === vm.selectedRow.ProductID);\r\n vm.pleaseWait = new createSpinner();\r\n if (productAlreadyExists) {\r\n await deleteMapping();\r\n postMapping(true);\r\n } else {\r\n postMapping();\r\n }\r\n }\r\n\r\n async function postMapping(callRemove) {\r\n let postBody = {\r\n \"CompanyMasterID\": selectedCompanyForManualMapping.ID,\r\n \"ProductID\": vm.selectedRow.ProductID,\r\n \"CompanyID\": vm.selectedRow.ID\r\n };\r\n try { \r\n await companyMappingDataService.createMapping(postBody);\r\n await helperService.successfulSaveButton(vm.pleaseWait);\r\n $uibModalInstance.close(callRemove);\r\n } catch {\r\n vm.pleaseWait.loadingValue = false;\r\n }\r\n \r\n }\r\n\r\n async function deleteMapping() {\r\n let dataItem = selectedCompanyForManualMapping;\r\n let launchedFromProductID = vm.selectedRow.ProductID;\r\n\r\n let companyMapping = selectedCompanyForManualMapping.CompanyMappings.find(e => e.ProductID === launchedFromProductID);\r\n\r\n let companyId = encodeURIComponent(companyMapping.CompanyID);\r\n\r\n try {\r\n await companyMappingDataService.deleteMapping(companyMapping, companyId);\r\n\r\n } catch {\r\n return;\r\n }\r\n\r\n $http.delete(apiUrl + 'api/universal/companymapping/companymaster/' + companyMapping.CompanyMasterID + '/product/' + companyMapping.ProductID + '/company/' + CompanyID + '/').then(function (response) {\r\n $scope.removeMappingFromDataSource(dataItem, launchedFromProductID);\r\n }, function errorCallback(response) {\r\n helperService.showErrorMessage(response.data);\r\n });\r\n }\r\n\r\n function changeRowSelected(dataItem) {\r\n vm.selectedRow = dataItem;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import { standardGridPageSize, customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport swal from \"sweetalert2\";\r\nimport BulkMapCompaniesModalController from \"./bulkMapCompanies/bulkMapCompaniesModal.controller\";\r\nimport UnmappedCompaniesForProductModalController from \"./unmappedCompaniesForProduct/unmappedCompaniesForProductModal.controller\";\r\nimport autoMapCompaniesModalController from \"./autoMapCompanies/autoMapCompaniesModal.controller\";\r\nimport manualMapCompaniesModalController from \"./manualMapCompanies/manualMapCompaniesModal.controller\";\r\nimport unmappedCompaniesForProductModalController from \"./unmappedCompaniesForProduct/unmappedCompaniesForProductModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, $filter, helperService, companyMappingDataService, dataService) {\r\n\r\n const vm = this;\r\n\r\n vm.removeProductMapping = removeProductMapping;\r\n vm.deleteCompanyMaster = deleteCompanyMaster;\r\n vm.openAutoMapCompaniesModal = openAutoMapCompaniesModal;\r\n vm.openManualMapCompanyModal = openManualMapCompanyModal;\r\n vm.openBulkMapCompaniesModal = openBulkMapCompaniesModal;\r\n vm.openUnmappedCompaniesForProductModal = openUnmappedCompaniesForProductModal;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await setupProducts();\r\n createGridOptions();\r\n getAllCompanyStatistics();\r\n createGridDataSource();\r\n }\r\n\r\n async function setupProducts() {\r\n vm.availableProducts = [];\r\n let response = await dataService.getProducts();\r\n response.data.forEach(function (row) {\r\n vm.availableProducts.push({\r\n 'ID': row.ID,\r\n 'Name': row.Name,\r\n 'Identifier': 'id' + row.Name.replace(/ /g, '')\r\n });\r\n });\r\n\r\n }\r\n\r\n async function getAllCompanyStatistics() {\r\n let response = await companyMappingDataService.getCompanyStatistics()\r\n vm.companyByProductStatistics = response.data;\r\n\r\n vm.totalUnmappedCompaniesCount = response.data.sum(function (row) {\r\n return row.UnMappedCompanyCount;\r\n });\r\n }\r\n\r\n\r\n function createGridDataSource() {\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n let response = await companyMappingDataService.getCompanyMapping();\r\n\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n\r\n response.data.forEach(function (row) {\r\n row.CompanyMappings.forEach(function (mapping) {\r\n var identifier = 'id' + mapping.ProductName.replace(/ /g, '');\r\n row[identifier] = mapping.CompanyName;\r\n });\r\n });\r\n options.success(response.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function deleteCompanyMaster(dataItem) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Company', 'All data associated with this company will be lost. Are you sure you want to remove this company?', 'Delete'));\r\n kendo.ui.progress(vm.mainGrid.element, true);\r\n await companyMappingDataService.deleteCompanyMaster(encodeURIComponent(dataItem.ID));\r\n kendo.ui.progress(vm.mainGrid.element, false);\r\n vm.mainGrid.dataSource.read();\r\n getAllCompanyStatistics();\r\n } catch {\r\n return;\r\n }\r\n\r\n }\r\n\r\n function createGridOptions() {\r\n\r\n let columnsFromVM = [\r\n { field: \"Name\", title: \"Company\", template: \"{{dataItem.Name}} \", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n let productColumns = [];\r\n\r\n vm.availableProducts.forEach(function (product) {\r\n let identifier = product.Identifier;\r\n let productID = product.ID;\r\n let productName = product.Name;\r\n\r\n let customTemplate =\r\n \"{{dataItem.\" + identifier + \"}} \" +\r\n \"\";\r\n\r\n let templateRow = { field: identifier, title: productName, template: customTemplate, filterable: customAutoCompleteFilter };\r\n productColumns.push(templateRow);\r\n });\r\n productColumns = $filter('orderBy')(productColumns, 'field');\r\n productColumns = productColumns.unique();\r\n\r\n columnsFromVM = columnsFromVM.concat(productColumns);\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(columnsFromVM, 600);\r\n }\r\n\r\n async function removeProductMapping(dataItem, identifier, launchedFromProductId, launchedFromProductName) {\r\n try {\r\n await swal(helperService.areYouSureParams('Remove Mapping', 'Are you sure you want to remove this mapping to ' + launchedFromProductName + '?', 'Remove'));\r\n var companyMapping = dataItem.CompanyMappings.find(e => e.ProductID === launchedFromProductId);\r\n var companyId = encodeURIComponent(companyMapping.CompanyID);\r\n kendo.ui.progress(vm.mainGrid.element, true);\r\n await companyMappingDataService.deleteProductMapping(companyMapping, companyId);\r\n removeMappingFromDataSource(dataItem, identifier, launchedFromProductId);\r\n await getAllCompanyStatistics();\r\n kendo.ui.progress(vm.mainGrid.element, false);\r\n } catch {\r\n return;\r\n }\r\n\r\n };\r\n\r\n function removeMappingFromDataSource(dataItem, identifier, launchedFromProductId) {\r\n delete dataItem[identifier];\r\n\r\n for (var i = 0; i < dataItem.CompanyMappings.length; i++) {\r\n if (dataItem.CompanyMappings[i].ProductID === launchedFromProductId) {\r\n dataItem.CompanyMappings.splice(i, 1);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n async function openAutoMapCompaniesModal() {\r\n let autoMapCompaniesModal = $uibModal.open({\r\n templateUrl: '/App/Components/CompanyMapping/autoMapCompanies/autoMapCompanyModal.html',\r\n controller: autoMapCompaniesModalController,\r\n controllerAs: 'amcmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n availableProducts: () => vm.availableProducts\r\n }\r\n });\r\n\r\n try {\r\n await autoMapCompaniesModal.result;\r\n vm.gridDataSource.read();\r\n getAllCompanyStatistics();\r\n } catch {\r\n return;\r\n }\r\n };\r\n\r\n async function openManualMapCompanyModal(dataItem, launchedFromProductId, launchedFromProductName) {\r\n let selectedCompanyProductClicked = { \"ProductID\": launchedFromProductId, \"ProductName\": launchedFromProductName };\r\n\r\n let manualMapCompanyModal = $uibModal.open({\r\n templateUrl: '/App/Components/CompanyMapping/manualMapCompanies/manualMapCompanyModal.html',\r\n controller: manualMapCompaniesModalController,\r\n controllerAs: 'mmcmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n selectedCompanyForManualMapping: () => dataItem,\r\n selectedCompanyProductClicked: () => selectedCompanyProductClicked\r\n }\r\n });\r\n\r\n try {\r\n await manualMapCompanyModal.result;\r\n vm.gridDataSource.read();\r\n getAllCompanyStatistics();\r\n } catch {\r\n return;\r\n }\r\n };\r\n\r\n async function openBulkMapCompaniesModal() {\r\n let bulkMapCompaniesModal = $uibModal.open({\r\n templateUrl: '/App/Components/CompanyMapping/bulkMapCompanies/bulkMapCompanyModal.html',\r\n controller: BulkMapCompaniesModalController,\r\n controllerAs: 'bmcmvm',\r\n backdrop: 'static',\r\n size: 'md',\r\n resolve: {\r\n availableProducts: () => vm.availableProducts,\r\n }\r\n });\r\n\r\n try {\r\n await bulkMapCompaniesModal.result;\r\n vm.gridDataSource.read();\r\n getAllCompanyStatistics();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openUnmappedCompaniesForProductModal(launchedFromProductID, launchedFromProductName) {\r\n\r\n vm.selectedCompanyProductClicked = { \"ProductID\": launchedFromProductID, \"ProductName\": launchedFromProductName };\r\n\r\n $uibModal.open({\r\n templateUrl: '/App/Components/CompanyMapping/unmappedCompaniesForProduct/unmappedCompaniesForProductModal.html',\r\n controller: unmappedCompaniesForProductModalController,\r\n controllerAs: 'ucfpmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n selectedCompanyProduct: () => vm.selectedCompanyProductClicked\r\n }\r\n });\r\n };\r\n\r\n}","/* companyMapping.component.js */\r\n\r\nimport companyMappingController from \"./companyMapping.controller\";\r\n\r\n/**\r\n * @desc component to view and manage company mappings\r\n * @example \r\n */\r\n\r\nconst companyMapping = {\r\n controller: companyMappingController,\r\n controllerAs: 'cmvm',\r\n templateUrl: '/App/Components/CompanyMapping/companyMapping.html'\r\n};\r\n\r\nexport default companyMapping;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModalInstance, dataService, companyTemplatesData, helperService, errorsDataService, template) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = createAvailableCompaniesDataSource;\r\n\r\n vm.template = { ...template };\r\n\r\n vm.addCompany = addCompany;\r\n vm.close = close;\r\n\r\n const availableCompaniesGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Company ID\", field: \"CompanyIDs\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \"\", width: 20, filterable: false }\r\n ];\r\n\r\n vm.availableCompaniesGridOptions = helperService.setMainGridOptions(availableCompaniesGridColumns, null);\r\n vm.availableCompaniesGridOptions.selectable = false;\r\n\r\n\r\n function createAvailableCompaniesDataSource() {\r\n vm.availableCompaniesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await dataService.getCompanyMasters();\r\n response.data = response.data.filter(company => company.UserHasAccess);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n if (vm.template.Companies && vm.template.Companies.length > 0) {\r\n vm.template.Companies.forEach(tc => {\r\n response.data = response.data.filter(c => tc.CompanyMaster.ID !== c.ID);\r\n });\r\n }\r\n\r\n vm.availableCompanies = response.data.reduce((companiesAccumulator, currentCompany) => {\r\n const previousInformation = {\r\n ID: currentCompany.ID,\r\n Name: currentCompany.Name,\r\n UserHasAccess: currentCompany.UserHasAccess\r\n };\r\n\r\n if (currentCompany.Companies.length) {\r\n let usableCompanyInstance = [], companyIDsList = '';\r\n currentCompany.Companies.forEach(company => {\r\n companyIDsList += company.ID + ', ';\r\n })\r\n companyIDsList = companyIDsList.slice(0, -2);\r\n usableCompanyInstance.push({ ...previousInformation, CompanyIDs: companyIDsList });\r\n return companiesAccumulator.concat(usableCompanyInstance);\r\n } else {\r\n companiesAccumulator.push(previousInformation);\r\n return companiesAccumulator;\r\n }\r\n\r\n }, []);\r\n\r\n options.success(vm.availableCompanies);\r\n } catch (error) {\r\n options.error(error);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function addCompany(company) {\r\n vm.loading = true;\r\n let postData = {\r\n CompanyTemplateId: vm.template.Id,\r\n CompanyMasterId: company.ID\r\n };\r\n\r\n try {\r\n await companyTemplatesData.addCompany(vm.template.Id, postData);\r\n removeCompanyFromGrid(company);\r\n addCompanyToTemplate(company);\r\n } catch {\r\n return;\r\n }\r\n\r\n vm.loading = false;\r\n }\r\n\r\n function removeCompanyFromGrid(company) {\r\n let addedCompany = vm.availableCompaniesGridDataSource._data.find(r => r.ID === company.ID);\r\n vm.availableCompaniesGridDataSource._data.remove(addedCompany);\r\n }\r\n\r\n function addCompanyToTemplate(company) {\r\n const companyObject = {\r\n CompanyTemplateId: vm.template.Id,\r\n CompanyTemplateName: vm.template.Name,\r\n CompanyMaster: company.toJSON(),\r\n CompanyIds: company.CompanyIDs.split(',')\r\n };\r\n vm.template.Companies.push(companyObject);\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import companyModalController from \"../CompanyModal/companyModal.controller\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, $filter, companyTemplatesData) {\r\n\r\n const vm = this;\r\n\r\n vm.openCompanyModal = openCompanyModal;\r\n vm.deleteCompany = deleteCompany;\r\n\r\n async function getCompanyTemplates(preselectedId) {\r\n let { data } = await companyTemplatesData.getCompanyTemplates();\r\n if (data.length > 0) {\r\n data.forEach(template => {\r\n template.Companies = template.Companies.filter(company => company.CompanyMaster.UserHasAccess);\r\n template.Companies.forEach(templateCompany => templateCompany.CompanyIds = templateCompany.Companies.map(object => object.ID));\r\n });\r\n\r\n data = $filter('orderBy')(data, 'Name');\r\n if (preselectedId) {\r\n const companyTemplate = data.find(t => t.Id === preselectedId);\r\n data = data.filter(t => t.Id !== preselectedId);\r\n data.unshift(companyTemplate);\r\n changeSelectedCompanyTemplate(companyTemplate);\r\n }\r\n }\r\n vm.companyTemplates = data;\r\n }\r\n\r\n async function deleteCompany(company) {\r\n vm.deletePending = true;\r\n try {\r\n await companyTemplatesData.deleteCompany(vm.template.Id, company.ID);\r\n const companyIndex = vm.template.Companies.findIndex(c => c.CompanyMaster.ID === company.ID);\r\n vm.template.Companies.splice(companyIndex, 1);\r\n } catch {\r\n return;\r\n }\r\n vm.deletePending = false;\r\n }\r\n\r\n async function openCompanyModal() {\r\n const companyTemplateModal = $uibModal.open({\r\n templateUrl: '/App/Components/CompanyTemplates/CompanyModal/companyModal.html',\r\n controller: companyModalController,\r\n controllerAs: 'cmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n template: () => vm.template\r\n }\r\n });\r\n try {\r\n const newTemplateId = await companyTemplateModal.result;\r\n getCompanyTemplates(newTemplateId);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","import companyTemplateCompaniesListController from \"./companyTemplateCompaniesList.controller\";\r\n\r\nconst companyTemplateCompaniesList = {\r\n bindings: {\r\n template: '<',\r\n onUpdateCompanies: '&'\r\n },\r\n controller: companyTemplateCompaniesListController,\r\n controllerAs: 'ctclvm',\r\n templateUrl: '/App/Components/CompanyTemplates/AssociatedCompaniesList/companyTemplateCompaniesList.tmpl.html'\r\n};\r\n\r\nexport default companyTemplateCompaniesList;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, companyTemplatesData, helperService, actionString, companyTemplates, selectedTemplate) {\r\n\r\n const vm = this;\r\n\r\n vm.actionString = actionString;\r\n\r\n vm.cancel = cancel;\r\n\r\n if (selectedTemplate) {\r\n vm.selectedTemplate = selectedTemplate;\r\n vm.templateName = selectedTemplate.Name;\r\n }\r\n\r\n vm.templateNamesMatch = templateNamesMatch;\r\n vm.submitForm = submitForm;\r\n\r\n async function createCompanyTemplate() {\r\n vm.loading = new createSpinner();\r\n let postData = { Name: vm.templateName };\r\n try {\r\n let response = await companyTemplatesData.createCompanyTemplate(postData);\r\n let newTemplateId = response.data;\r\n vm.killModal = true;\r\n await helperService.successfulSaveButton(vm.loading);\r\n $uibModalInstance.close(newTemplateId);\r\n } catch {\r\n vm.loading.loadingValue = false;\r\n }\r\n }\r\n\r\n function templateNamesMatch() {\r\n let match = (t) => t.Name.toLowerCase() === vm.templateName.toLowerCase();\r\n return companyTemplates.some(match);\r\n }\r\n\r\n async function renameCompanyTemplate() {\r\n vm.loading = new createSpinner();\r\n\r\n let putData = {\r\n Name: vm.templateName,\r\n Id: vm.selectedTemplate.Id\r\n };\r\n\r\n try {\r\n await companyTemplatesData.renameCompanyTemplate(putData.Id, putData);\r\n vm.killModal = true;\r\n await helperService.successfulSaveButton(vm.loading);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.loading.loadingValue = false;\r\n }\r\n }\r\n\r\n function submitForm() {\r\n if (actionString === 'Create') {\r\n createCompanyTemplate();\r\n } else {\r\n renameCompanyTemplate();\r\n }\r\n }\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import swal from \"sweetalert2\";\r\nimport companyTemplateModalController from \"../CompanyTemplateModal/companyTemplateModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModal, companyTemplatesData, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = getCompanyTemplates;\r\n\r\n vm.openCompanyTemplateModal = openCompanyTemplateModal;\r\n vm.changeSelectedCompanyTemplate = changeSelectedCompanyTemplate;\r\n\r\n\r\n async function getCompanyTemplates(preselectedId) {\r\n let response = await companyTemplatesData.getCompanyTemplates();\r\n if (response.data.length > 0) {\r\n response.data.forEach(template => {\r\n template.Companies = template.Companies.filter(company => company.CompanyMaster.UserHasAccess);\r\n template.Companies.forEach(templateCompany => templateCompany.CompanyIds = templateCompany.Companies.map(object => object.ID));\r\n });\r\n\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n if (preselectedId) {\r\n const companyTemplate = response.data.find(t => t.Id === preselectedId);\r\n response.data = response.data.filter(t => t.Id !== preselectedId);\r\n response.data.unshift(companyTemplate);\r\n changeSelectedCompanyTemplate(companyTemplate);\r\n }\r\n }\r\n vm.companyTemplates = response.data;\r\n }\r\n\r\n function changeSelectedCompanyTemplate(template) {\r\n vm.template = template;\r\n vm.onSelectTemplate({ template });\r\n }\r\n\r\n async function deleteCompanyTemplate(template) {\r\n try {\r\n await swal(helperService.areYouSureParamsWithHTML('Delete Company Template',\r\n `Are you sure you want to delete\r\n
${template.Name}?
\r\n
`, 'Delete'));\r\n await companyTemplatesData.deleteCompanyTemplate(template.Id);\r\n if (vm.template && vm.template.Id === template.Id) {\r\n vm.onSelectTemplate(null);\r\n }\r\n getCompanyTemplates();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n openCompanyTemplateModal('Edit', vm.companyTemplates, item.template);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n deleteCompanyTemplate(item.template);\r\n }\r\n }\r\n ];\r\n\r\n async function openCompanyTemplateModal(actionString, companyTemplates, selectedTemplate) {\r\n const companyTemplateModal = $uibModal.open({\r\n templateUrl: '/App/Components/CompanyTemplates/CompanyTemplateModal/companyTemplateModal.html',\r\n controller: companyTemplateModalController,\r\n controllerAs: 'ctmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n actionString: () => actionString,\r\n companyTemplates: () => companyTemplates,\r\n selectedTemplate: () => selectedTemplate\r\n }\r\n });\r\n\r\n try {\r\n const newTemplateId = await companyTemplateModal.result;\r\n getCompanyTemplates(newTemplateId);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","import companyTemplatesListController from \"./companyTemplatesList.controller\";\r\n\r\nconst companyTemplatesList = {\r\n bindings: {\r\n template: '<',\r\n onSelectTemplate: '&'\r\n },\r\n controller: companyTemplatesListController,\r\n controllerAs: 'ctlvm',\r\n templateUrl: '/App/Components/CompanyTemplates/CompanyTemplatesList/companyTemplatesList.tmpl.html'\r\n};\r\n\r\nexport default companyTemplatesList;","const availableTimeZones = [\r\n \"Africa/Abidjan\",\r\n \"Africa/Accra\",\r\n \"Africa/Addis_Ababa\",\r\n \"Africa/Algiers\",\r\n \"Africa/Asmara\",\r\n \"Africa/Bamako\",\r\n \"Africa/Bangui\",\r\n \"Africa/Banjul\",\r\n \"Africa/Bissau\",\r\n \"Africa/Blantyre\",\r\n \"Africa/Brazzaville\",\r\n \"Africa/Bujumbura\",\r\n \"Africa/Cairo\",\r\n \"Africa/Casablanca\",\r\n \"Africa/Ceuta\",\r\n \"Africa/Conakry\",\r\n \"Africa/Dakar\",\r\n \"Africa/Dar_es_Salaam\",\r\n \"Africa/Djibouti\",\r\n \"Africa/Douala\",\r\n \"Africa/El_Aaiun\",\r\n \"Africa/Freetown\",\r\n \"Africa/Gaborone\",\r\n \"Africa/Harare\",\r\n \"Africa/Johannesburg\",\r\n \"Africa/Juba\",\r\n \"Africa/Kampala\",\r\n \"Africa/Khartoum\",\r\n \"Africa/Kigali\",\r\n \"Africa/Kinshasa\",\r\n \"Africa/Lagos\",\r\n \"Africa/Libreville\",\r\n \"Africa/Lome\",\r\n \"Africa/Luanda\",\r\n \"Africa/Lubumbashi\",\r\n \"Africa/Lusaka\",\r\n \"Africa/Malabo\",\r\n \"Africa/Maputo\",\r\n \"Africa/Maseru\",\r\n \"Africa/Mbabane\",\r\n \"Africa/Mogadishu\",\r\n \"Africa/Monrovia\",\r\n \"Africa/Nairobi\",\r\n \"Africa/Ndjamena\",\r\n \"Africa/Niamey\",\r\n \"Africa/Nouakchott\",\r\n \"Africa/Ouagadougou\",\r\n \"Africa/Porto-Novo\",\r\n \"Africa/Sao_Tome\",\r\n \"Africa/Timbuktu\",\r\n \"Africa/Tripoli\",\r\n \"Africa/Tunis\",\r\n \"Africa/Windhoek\",\r\n \"America/Adak\",\r\n \"America/Anchorage\",\r\n \"America/Anguilla\",\r\n \"America/Antigua\",\r\n \"America/Araguaina\",\r\n \"America/Argentina/Buenos_Aires\",\r\n \"America/Argentina/Catamarca\",\r\n \"America/Argentina/ComodRivadavia\",\r\n \"America/Argentina/Cordoba\",\r\n \"America/Argentina/Jujuy\",\r\n \"America/Argentina/La_Rioja\",\r\n \"America/Argentina/Mendoza\",\r\n \"America/Argentina/Rio_Gallegos\",\r\n \"America/Argentina/Salta\",\r\n \"America/Argentina/San_Juan\",\r\n \"America/Argentina/San_Luis\",\r\n \"America/Argentina/Tucuman\",\r\n \"America/Argentina/Ushuaia\",\r\n \"America/Aruba\",\r\n \"America/Asuncion\",\r\n \"America/Atikokan\",\r\n \"America/Atka\",\r\n \"America/Bahia\",\r\n \"America/Bahia_Banderas\",\r\n \"America/Barbados\",\r\n \"America/Belem\",\r\n \"America/Belize\",\r\n \"America/Blanc-Sablon\",\r\n \"America/Boa_Vista\",\r\n \"America/Bogota\",\r\n \"America/Boise\",\r\n \"America/Buenos_Aires\",\r\n \"America/Cambridge_Bay\",\r\n \"America/Campo_Grande\",\r\n \"America/Cancun\",\r\n \"America/Caracas\",\r\n \"America/Catamarca\",\r\n \"America/Cayenne\",\r\n \"America/Cayman\",\r\n \"America/Chicago\",\r\n \"America/Chihuahua\",\r\n \"America/Coral_Harbour\",\r\n \"America/Cordoba\",\r\n \"America/Costa_Rica\",\r\n \"America/Creston\",\r\n \"America/Cuiaba\",\r\n \"America/Curacao\",\r\n \"America/Danmarkshavn\",\r\n \"America/Dawson\",\r\n \"America/Dawson_Creek\",\r\n \"America/Denver\",\r\n \"America/Detroit\",\r\n \"America/Dominica\",\r\n \"America/Edmonton\",\r\n \"America/Eirunepe\",\r\n \"America/El_Salvador\",\r\n \"America/Ensenada\",\r\n \"America/Fort_Nelson\",\r\n \"America/Fort_Wayne\",\r\n \"America/Fortaleza\",\r\n \"America/Glace_Bay\",\r\n \"America/Godthab\",\r\n \"America/Goose_Bay\",\r\n \"America/Grand_Turk\",\r\n \"America/Grenada\",\r\n \"America/Guadeloupe\",\r\n \"America/Guatemala\",\r\n \"America/Guayaquil\",\r\n \"America/Guyana\",\r\n \"America/Halifax\",\r\n \"America/Havana\",\r\n \"America/Hermosillo\",\r\n \"America/Indiana/Indianapolis\",\r\n \"America/Indiana/Knox\",\r\n \"America/Indiana/Marengo\",\r\n \"America/Indiana/Petersburg\",\r\n \"America/Indiana/Tell_City\",\r\n \"America/Indiana/Vevay\",\r\n \"America/Indiana/Vincennes\",\r\n \"America/Indiana/Winamac\",\r\n \"America/Indianapolis\",\r\n \"America/Inuvik\",\r\n \"America/Iqaluit\",\r\n \"America/Jamaica\",\r\n \"America/Jujuy\",\r\n \"America/Juneau\",\r\n \"America/Kentucky/Louisville\",\r\n \"America/Kentucky/Monticello\",\r\n \"America/Knox_IN\",\r\n \"America/Kralendijk\",\r\n \"America/La_Paz\",\r\n \"America/Lima\",\r\n \"America/Los_Angeles\",\r\n \"America/Louisville\",\r\n \"America/Lower_Princes\",\r\n \"America/Maceio\",\r\n \"America/Managua\",\r\n \"America/Manaus\",\r\n \"America/Marigot\",\r\n \"America/Martinique\",\r\n \"America/Matamoros\",\r\n \"America/Mazatlan\",\r\n \"America/Mendoza\",\r\n \"America/Menominee\",\r\n \"America/Merida\",\r\n \"America/Metlakatla\",\r\n \"America/Mexico_City\",\r\n \"America/Miquelon\",\r\n \"America/Moncton\",\r\n \"America/Monterrey\",\r\n \"America/Montevideo\",\r\n \"America/Montreal\",\r\n \"America/Montserrat\",\r\n \"America/Nassau\",\r\n \"America/New_York\",\r\n \"America/Nipigon\",\r\n \"America/Nome\",\r\n \"America/Noronha\",\r\n \"America/North_Dakota/Beulah\",\r\n \"America/North_Dakota/Center\",\r\n \"America/North_Dakota/New_Salem\",\r\n \"America/Ojinaga\",\r\n \"America/Panama\",\r\n \"America/Pangnirtung\",\r\n \"America/Paramaribo\",\r\n \"America/Phoenix\",\r\n \"America/Port_of_Spain\",\r\n \"America/Port-au-Prince\",\r\n \"America/Porto_Acre\",\r\n \"America/Porto_Velho\",\r\n \"America/Puerto_Rico\",\r\n \"America/Punta_Arenas\",\r\n \"America/Rainy_River\",\r\n \"America/Rankin_Inlet\",\r\n \"America/Recife\",\r\n \"America/Regina\",\r\n \"America/Resolute\",\r\n \"America/Rio_Branco\",\r\n \"America/Rosario\",\r\n \"America/Santa_Isabel\",\r\n \"America/Santarem\",\r\n \"America/Santiago\",\r\n \"America/Santo_Domingo\",\r\n \"America/Sao_Paulo\",\r\n \"America/Scoresbysund\",\r\n \"America/Shiprock\",\r\n \"America/Sitka\",\r\n \"America/St_Barthelemy\",\r\n \"America/St_Johns\",\r\n \"America/St_Kitts\",\r\n \"America/St_Lucia\",\r\n \"America/St_Thomas\",\r\n \"America/St_Vincent\",\r\n \"America/Swift_Current\",\r\n \"America/Tegucigalpa\",\r\n \"America/Thule\",\r\n \"America/Thunder_Bay\",\r\n \"America/Tijuana\",\r\n \"America/Toronto\",\r\n \"America/Tortola\",\r\n \"America/Vancouver\",\r\n \"America/Virgin\",\r\n \"America/Whitehorse\",\r\n \"America/Winnipeg\",\r\n \"America/Yakutat\",\r\n \"America/Yellowknife\",\r\n \"Antarctica/Casey\",\r\n \"Antarctica/Davis\",\r\n \"Antarctica/DumontDUrville\",\r\n \"Antarctica/Macquarie\",\r\n \"Antarctica/Mawson\",\r\n \"Antarctica/McMurdo\",\r\n \"Antarctica/Palmer\",\r\n \"Antarctica/Rothera\",\r\n \"Antarctica/South_Pole\",\r\n \"Antarctica/Syowa\",\r\n \"Antarctica/Troll\",\r\n \"Antarctica/Vostok\",\r\n \"Arctic/Longyearbyen\",\r\n \"Asia/Aden\",\r\n \"Asia/Almaty\",\r\n \"Asia/Amman\",\r\n \"Asia/Anadyr\",\r\n \"Asia/Aqtau\",\r\n \"Asia/Aqtobe\",\r\n \"Asia/Ashgabat\",\r\n \"Asia/Ashkhabad\",\r\n \"Asia/Atyrau\",\r\n \"Asia/Baghdad\",\r\n \"Asia/Bahrain\",\r\n \"Asia/Baku\",\r\n \"Asia/Bangkok\",\r\n \"Asia/Barnaul\",\r\n \"Asia/Beirut\",\r\n \"Asia/Bishkek\",\r\n \"Asia/Brunei\",\r\n \"Asia/Calcutta\",\r\n \"Asia/Chita\",\r\n \"Asia/Choibalsan\",\r\n \"Asia/Chongqing\",\r\n \"Asia/Chungking\",\r\n \"Asia/Colombo\",\r\n \"Asia/Dacca\",\r\n \"Asia/Damascus\",\r\n \"Asia/Dhaka\",\r\n \"Asia/Dili\",\r\n \"Asia/Dubai\",\r\n \"Asia/Dushanbe\",\r\n \"Asia/Famagusta\",\r\n \"Asia/Gaza\",\r\n \"Asia/Harbin\",\r\n \"Asia/Hebron\",\r\n \"Asia/Ho_Chi_Minh\",\r\n \"Asia/Hong_Kong\",\r\n \"Asia/Hovd\",\r\n \"Asia/Irkutsk\",\r\n \"Asia/Istanbul\",\r\n \"Asia/Jakarta\",\r\n \"Asia/Jayapura\",\r\n \"Asia/Jerusalem\",\r\n \"Asia/Kabul\",\r\n \"Asia/Kamchatka\",\r\n \"Asia/Karachi\",\r\n \"Asia/Kashgar\",\r\n \"Asia/Kathmandu\",\r\n \"Asia/Katmandu\",\r\n \"Asia/Khandyga\",\r\n \"Asia/Kolkata\",\r\n \"Asia/Krasnoyarsk\",\r\n \"Asia/Kuala_Lumpur\",\r\n \"Asia/Kuching\",\r\n \"Asia/Kuwait\",\r\n \"Asia/Macao\",\r\n \"Asia/Macau\",\r\n \"Asia/Magadan\",\r\n \"Asia/Makassar\",\r\n \"Asia/Manila\",\r\n \"Asia/Muscat\",\r\n \"Asia/Novokuznetsk\",\r\n \"Asia/Novosibirsk\",\r\n \"Asia/Omsk\",\r\n \"Asia/Oral\",\r\n \"Asia/Phnom_Penh\",\r\n \"Asia/Pontianak\",\r\n \"Asia/Pyongyang\",\r\n \"Asia/Qatar\",\r\n \"Asia/Qyzylorda\",\r\n \"Asia/Rangoon\",\r\n \"Asia/Riyadh\",\r\n \"Asia/Saigon\",\r\n \"Asia/Sakhalin\",\r\n \"Asia/Samarkand\",\r\n \"Asia/Seoul\",\r\n \"Asia/Shanghai\",\r\n \"Asia/Singapore\",\r\n \"Asia/Srednekolymsk\",\r\n \"Asia/Taipei\",\r\n \"Asia/Tashkent\",\r\n \"Asia/Tbilisi\",\r\n \"Asia/Tehran\",\r\n \"Asia/Tel_Aviv\",\r\n \"Asia/Thimbu\",\r\n \"Asia/Thimphu\",\r\n \"Asia/Tokyo\",\r\n \"Asia/Tomsk\",\r\n \"Asia/Ujung_Pandang\",\r\n \"Asia/Ulaanbaatar\",\r\n \"Asia/Ulan_Bator\",\r\n \"Asia/Urumqi\",\r\n \"Asia/Ust-Nera\",\r\n \"Asia/Vientiane\",\r\n \"Asia/Vladivostok\",\r\n \"Asia/Yakutsk\",\r\n \"Asia/Yangon\",\r\n \"Asia/Yekaterinburg\",\r\n \"Asia/Yerevan\",\r\n \"Atlantic/Azores\",\r\n \"Atlantic/Bermuda\",\r\n \"Atlantic/Canary\",\r\n \"Atlantic/Cape_Verde\",\r\n \"Atlantic/Faeroe\",\r\n \"Atlantic/Faroe\",\r\n \"Atlantic/Jan_Mayen\",\r\n \"Atlantic/Madeira\",\r\n \"Atlantic/Reykjavik\",\r\n \"Atlantic/South_Georgia\",\r\n \"Atlantic/St_Helena\",\r\n \"Atlantic/Stanley\",\r\n \"Australia/ACT\",\r\n \"Australia/Adelaide\",\r\n \"Australia/Brisbane\",\r\n \"Australia/Broken_Hill\",\r\n \"Australia/Canberra\",\r\n \"Australia/Currie\",\r\n \"Australia/Darwin\",\r\n \"Australia/Eucla\",\r\n \"Australia/Hobart\",\r\n \"Australia/LHI\",\r\n \"Australia/Lindeman\",\r\n \"Australia/Lord_Howe\",\r\n \"Australia/Melbourne\",\r\n \"Australia/North\",\r\n \"Australia/NSW\",\r\n \"Australia/Perth\",\r\n \"Australia/Queensland\",\r\n \"Australia/South\",\r\n \"Australia/Sydney\",\r\n \"Australia/Tasmania\",\r\n \"Australia/Victoria\",\r\n \"Australia/West\",\r\n \"Australia/Yancowinna\",\r\n \"Brazil/Acre\",\r\n \"Brazil/DeNoronha\",\r\n \"Brazil/East\",\r\n \"Brazil/West\",\r\n \"Canada/Atlantic\",\r\n \"Canada/Central\",\r\n \"Canada/Eastern\",\r\n \"Canada/Mountain\",\r\n \"Canada/Newfoundland\",\r\n \"Canada/Pacific\",\r\n \"Canada/Saskatchewan\",\r\n \"Canada/Yukon\",\r\n \"CET\",\r\n \"Chile/Continental\",\r\n \"Chile/EasterIsland\",\r\n \"CST6CDT\",\r\n \"Cuba\",\r\n \"EET\",\r\n \"Egypt\",\r\n \"Eire\",\r\n \"EST\",\r\n \"EST5EDT\",\r\n \"Etc/GMT\",\r\n \"Etc/GMT+0\",\r\n \"Etc/GMT+1\",\r\n \"Etc/GMT+10\",\r\n \"Etc/GMT+11\",\r\n \"Etc/GMT+12\",\r\n \"Etc/GMT+2\",\r\n \"Etc/GMT+3\",\r\n \"Etc/GMT+4\",\r\n \"Etc/GMT+5\",\r\n \"Etc/GMT+6\",\r\n \"Etc/GMT+7\",\r\n \"Etc/GMT+8\",\r\n \"Etc/GMT+9\",\r\n \"Etc/GMT0\",\r\n \"Etc/GMT-0\",\r\n \"Etc/GMT-1\",\r\n \"Etc/GMT-10\",\r\n \"Etc/GMT-11\",\r\n \"Etc/GMT-12\",\r\n \"Etc/GMT-13\",\r\n \"Etc/GMT-14\",\r\n \"Etc/GMT-2\",\r\n \"Etc/GMT-3\",\r\n \"Etc/GMT-4\",\r\n \"Etc/GMT-5\",\r\n \"Etc/GMT-6\",\r\n \"Etc/GMT-7\",\r\n \"Etc/GMT-8\",\r\n \"Etc/GMT-9\",\r\n \"Etc/Greenwich\",\r\n \"Etc/UCT\",\r\n \"Etc/Universal\",\r\n \"Etc/UTC\",\r\n \"Etc/Zulu\",\r\n \"Europe/Amsterdam\",\r\n \"Europe/Andorra\",\r\n \"Europe/Astrakhan\",\r\n \"Europe/Athens\",\r\n \"Europe/Belfast\",\r\n \"Europe/Belgrade\",\r\n \"Europe/Berlin\",\r\n \"Europe/Bratislava\",\r\n \"Europe/Brussels\",\r\n \"Europe/Bucharest\",\r\n \"Europe/Budapest\",\r\n \"Europe/Busingen\",\r\n \"Europe/Chisinau\",\r\n \"Europe/Copenhagen\",\r\n \"Europe/Dublin\",\r\n \"Europe/Gibraltar\",\r\n \"Europe/Guernsey\",\r\n \"Europe/Helsinki\",\r\n \"Europe/Isle_of_Man\",\r\n \"Europe/Istanbul\",\r\n \"Europe/Jersey\",\r\n \"Europe/Kaliningrad\",\r\n \"Europe/Kiev\",\r\n \"Europe/Kirov\",\r\n \"Europe/Lisbon\",\r\n \"Europe/Ljubljana\",\r\n \"Europe/London\",\r\n \"Europe/Luxembourg\",\r\n \"Europe/Madrid\",\r\n \"Europe/Malta\",\r\n \"Europe/Mariehamn\",\r\n \"Europe/Minsk\",\r\n \"Europe/Monaco\",\r\n \"Europe/Moscow\",\r\n \"Asia/Nicosia\",\r\n \"Europe/Oslo\",\r\n \"Europe/Paris\",\r\n \"Europe/Podgorica\",\r\n \"Europe/Prague\",\r\n \"Europe/Riga\",\r\n \"Europe/Rome\",\r\n \"Europe/Samara\",\r\n \"Europe/San_Marino\",\r\n \"Europe/Sarajevo\",\r\n \"Europe/Saratov\",\r\n \"Europe/Simferopol\",\r\n \"Europe/Skopje\",\r\n \"Europe/Sofia\",\r\n \"Europe/Stockholm\",\r\n \"Europe/Tallinn\",\r\n \"Europe/Tirane\",\r\n \"Europe/Tiraspol\",\r\n \"Europe/Ulyanovsk\",\r\n \"Europe/Uzhgorod\",\r\n \"Europe/Vaduz\",\r\n \"Europe/Vatican\",\r\n \"Europe/Vienna\",\r\n \"Europe/Vilnius\",\r\n \"Europe/Volgograd\",\r\n \"Europe/Warsaw\",\r\n \"Europe/Zagreb\",\r\n \"Europe/Zaporozhye\",\r\n \"Europe/Zurich\",\r\n \"GB\",\r\n \"GB-Eire\",\r\n \"GMT\",\r\n \"GMT+0\",\r\n \"GMT0\",\r\n \"GMT−0\",\r\n \"Greenwich\",\r\n \"Hongkong\",\r\n \"HST\",\r\n \"Iceland\",\r\n \"Indian/Antananarivo\",\r\n \"Indian/Chagos\",\r\n \"Indian/Christmas\",\r\n \"Indian/Cocos\",\r\n \"Indian/Comoro\",\r\n \"Indian/Kerguelen\",\r\n \"Indian/Mahe\",\r\n \"Indian/Maldives\",\r\n \"Indian/Mauritius\",\r\n \"Indian/Mayotte\",\r\n \"Indian/Reunion\",\r\n \"Iran\",\r\n \"Israel\",\r\n \"Jamaica\",\r\n \"Japan\",\r\n \"Kwajalein\",\r\n \"Libya\",\r\n \"MET\",\r\n \"Mexico/BajaNorte\",\r\n \"Mexico/BajaSur\",\r\n \"Mexico/General\",\r\n \"MST\",\r\n \"MST7MDT\",\r\n \"Navajo\",\r\n \"NZ\",\r\n \"NZ-CHAT\",\r\n \"Pacific/Apia\",\r\n \"Pacific/Auckland\",\r\n \"Pacific/Bougainville\",\r\n \"Pacific/Chatham\",\r\n \"Pacific/Chuuk\",\r\n \"Pacific/Easter\",\r\n \"Pacific/Efate\",\r\n \"Pacific/Enderbury\",\r\n \"Pacific/Fakaofo\",\r\n \"Pacific/Fiji\",\r\n \"Pacific/Funafuti\",\r\n \"Pacific/Galapagos\",\r\n \"Pacific/Gambier\",\r\n \"Pacific/Guadalcanal\",\r\n \"Pacific/Guam\",\r\n \"Pacific/Honolulu\",\r\n \"Pacific/Johnston\",\r\n \"Pacific/Kiritimati\",\r\n \"Pacific/Kosrae\",\r\n \"Pacific/Kwajalein\",\r\n \"Pacific/Majuro\",\r\n \"Pacific/Marquesas\",\r\n \"Pacific/Midway\",\r\n \"Pacific/Nauru\",\r\n \"Pacific/Niue\",\r\n \"Pacific/Norfolk\",\r\n \"Pacific/Noumea\",\r\n \"Pacific/Pago_Pago\",\r\n \"Pacific/Palau\",\r\n \"Pacific/Pitcairn\",\r\n \"Pacific/Pohnpei\",\r\n \"Pacific/Ponape\",\r\n \"Pacific/Port_Moresby\",\r\n \"Pacific/Rarotonga\",\r\n \"Pacific/Saipan\",\r\n \"Pacific/Samoa\",\r\n \"Pacific/Tahiti\",\r\n \"Pacific/Tarawa\",\r\n \"Pacific/Tongatapu\",\r\n \"Pacific/Truk\",\r\n \"Pacific/Wake\",\r\n \"Pacific/Wallis\",\r\n \"Pacific/Yap\",\r\n \"Poland\",\r\n \"Portugal\",\r\n \"PRC\",\r\n \"PST8PDT\",\r\n \"ROC\",\r\n \"ROK\",\r\n \"Singapore\",\r\n \"Turkey\",\r\n \"UCT\",\r\n \"Universal\",\r\n \"US/Alaska\",\r\n \"US/Aleutian\",\r\n \"US/Arizona\",\r\n \"US/Central\",\r\n \"US/Eastern\",\r\n \"US/East-Indiana\",\r\n \"US/Hawaii\",\r\n \"US/Indiana-Starke\",\r\n \"US/Michigan\",\r\n \"US/Mountain\",\r\n \"US/Pacific\",\r\n \"US/Pacific-New\",\r\n \"US/Samoa\",\r\n \"UTC\",\r\n \"WET\",\r\n \"W-SU\",\r\n \"Zulu\"\r\n];\r\nexport default availableTimeZones;","export const configurationOptions = {\r\n productOptions: {\r\n default: [\r\n { Name: \"RiskManageType\", Encrypted: false },\r\n { Name: \"ARM_StandardMitigations\", Encrypted: false },\r\n { Name: \"ApplyDefaultMitigationsAfterImport\", Encrypted: false },\r\n { Name: \"ResetDefaultMitigationsBeforeApply\", Encrypted: false },\r\n { Name: \"DefaultMitigationsOverwriteCurrent\", Encrypted: false },\r\n { Name: \"ResetAutoMitigationsBeforeApply\", Encrypted: false },\r\n { Name: \"AutoExcludeDisabledUsersAfterImport\", Encrypted: false }\r\n ],\r\n PS: [{ Name: \"PS_ApplyAutoMitigationsAfterImport\", Encrypted: false }],\r\n ORFC: [{ Name: \"ORFC_ApplyAutoMitigationsAfterImport\", Encrypted: false }],\r\n OR: [\r\n { Name: \"OR_ApplyAutoMitigationsAfterImport\", Encrypted: false },\r\n { Name: \"OR_AutoMitigationsOverwrite\", Encrypted: false }\r\n ],\r\n SAP: []\r\n },\r\n systemConfigurations: [\r\n { Name: \"CreateFPUsersForAutoGenerateSupervisorAssignments\", Encrypted: false },\r\n { Name: \"AutoGenerateAllSupervisors\", Encrypted: false },\r\n { Name: \"IdentityProviderIdForAutoGenerateSupervisorAssignments\", Encrypted: false },\r\n { Name: \"AutoGenerateSupervisorAssignmentsAfterImport\", Encrypted: false },\r\n { Name: \"SAP_BuildRoleTemplatesForCompositeRoles\", Encrypted: false },\r\n { Name: \"HcmUserFieldForNewFastpathUserLoginEmail\", Encrypted: false },\r\n { Name: \"HcmUserFieldForNewFastpathUserEmail\", Encrypted: false },\r\n { Name: \"AutogeneratedUserRoles\", Encrypted: false },\r\n { Name: \"AutoMapCrossPlatformUsersAfterImport\", Encrypted: false },\r\n { Name: \"AutoMapFastpathToSystemUsers\", Encrypted: false }\r\n ],\r\n companyInfo: [\r\n { Name: \"CompanyName\", Encrypted: false },\r\n { Name: \"SystemTimeZone\", Encrypted: false },\r\n { Name: \"PrimarySystem\", Encrypted: false },\r\n { Name: \"EmailNewFpAdUsers\", Encrypted: false }\r\n ],\r\n configNames: [\r\n 'Cert_SnapshotTime',\r\n 'Cert_DaysToComplete',\r\n 'Cert_AllowSelectAll',\r\n 'Cert_IncludeDisabledUsers',\r\n 'Cert_BusinessProcessObjects',\r\n 'Cert_RequireNotesOnRejectedItems',\r\n 'Cert_ReviewAllRisks',\r\n 'Cert_SelfReview',\r\n 'Cert_UserDisplayField',\r\n 'Cert_EnableNewReviewReminderEmails',\r\n 'Cert_EnableBeforeDueDayReminderEmails',\r\n 'Cert_DaysBeforeDueDate',\r\n 'Cert_EnableDueDayReminderEmails',\r\n 'Cert_EnableOverdueReminderEmails',\r\n 'Cert_SendOverdueReminderEmailsEveryday',\r\n 'Cert_EnableEmailsForCompletedIndividualReviews',\r\n 'Cert_RoleContentBusinessProcess',\r\n 'Cert_RoleContentBusinessProcessObjects',\r\n 'Cert_RoleContentRisk',\r\n 'Cert_ReviewAllRoleContentRisks',\r\n 'Cert_RoleContentRoleAccess',\r\n 'Cert_ReviewRoleContentAccessTypesAndLevels'\r\n ],\r\n accessCertifications: [\r\n { Name: \"Cert_SnapshotTime\", Encrypted: false },\r\n { Name: \"Cert_DaysToComplete\", Encrypted: false },\r\n { Name: \"Cert_AllowSelectAll\", Encrypted: false },\r\n { Name: \"Cert_IncludeDisabledUsers\", Encrypted: false},\r\n { Name: \"Cert_BusinessProcessObjects\", Encrypted: false },\r\n { Name: \"Cert_RequireNotesOnRejectedItems\", Encrypted: false },\r\n { Name: \"Cert_ReviewAllRisks\", Encrypted: false },\r\n { Name: \"Cert_UserDisplayField\", Encrypted: false },\r\n { Name: \"Cert_SelfReview\", Encrypted: false },\r\n { Name: \"Cert_EnableNewReviewReminderEmails\", Encrypted: false },\r\n { Name: \"Cert_EnableBeforeDueDayReminderEmails\", Encrypted: false },\r\n { Name: \"Cert_DaysBeforeDueDate\", Encrypted: false },\r\n { Name: \"Cert_EnableOverdueReminderEmails\", Encrypted: false },\r\n { Name: \"Cert_EnableDueDayReminderEmails\", Encrypted: false },\r\n { Name: \"Cert_SendOverdueReminderEmailsEveryday\", Encrypted: false },\r\n { Name: \"Cert_EnableEmailsForCompletedIndividualReviews\", Encrypted: false },\r\n { Name: \"Cert_RoleContentBusinessProcess\", Encrypted: false },\r\n { Name: \"Cert_RoleContentBusinessProcessObjects\", Encrypted: false },\r\n { Name: \"Cert_RoleContentRisk\", Encrypted: false },\r\n { Name: \"Cert_ReviewAllRoleContentRisks\", Encrypted: false },\r\n { Name: \"Cert_RoleContentRoleAccess\", Encrypted: false },\r\n { Name: \"Cert_ReviewRoleContentAccessTypesAndLevels\", Encrypted: false },\r\n ]\r\n};","import availableTimeZones from \"../../Shared/GlobalVariables/timezones\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { configurationOptions } from \"./configOptions\";\r\n\r\nexport default /*@ngInject*/ function (dataService, configurationDataService, $filter, $rootScope, helperService) {\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.tabSelected = 'SystemSettings';\r\n vm.ssChildTabSelected = 'Company Information';\r\n vm.updatePending = false;\r\n vm.currentTenant = angular.fromJson(localStorage.getItem(\"selectedTenant\"));\r\n vm.putConfigurationSetting = putConfigurationSetting;\r\n vm.configValuesHaveChanged = configValuesHaveChanged;\r\n vm.submitAccessRiskMonitor = submitAccessRiskMonitor;\r\n vm.submitCompanyInfo = submitCompanyInfo;\r\n vm.submitSecurityDesigner = submitSecurityDesigner;\r\n vm.submitSystemConfiguration = submitSystemConfiguration;\r\n vm.submitAccessCertifications = submitAccessCertifications;\r\n vm.configNames = configurationOptions.configNames;\r\n vm.showPasswordCriteria = showPasswordCriteria;\r\n vm.deleteCompanyLogo = deleteCompanyLogo;\r\n vm.snapshotTimeHasChanged = snapshotTimeHasChanged;\r\n vm.reset = reset;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n getExistingCompanyLogo();\r\n await getProducts();\r\n await getConfigValues();\r\n vm.s4Enabled = vm.availableProducts.SAP ? await getS4Config() : false;\r\n await setupRolesDropdown();\r\n\r\n await getIdentityProviders();\r\n\r\n setAuditTrailTabVisibility();\r\n setupTimeZones();\r\n\r\n }\r\n\r\n async function getConfigValues() {\r\n let response = await configurationDataService.getConfigurationValues(),\r\n config = {};\r\n\r\n response.data.forEach(row => {\r\n config[row.Name] = row.Value;\r\n });\r\n\r\n // Need to set up these config values as numbers now so they don't enable save button\r\n if (vm.productsDataSource.some(product => product.Type === 'SAP')) {\r\n config.MaxFirefighterAccessPeriod = Number(config.MaxFirefighterAccessPeriod);\r\n }\r\n if (config.IM_ReminderThreshold) {\r\n config.IM_ReminderThreshold = Number(config.IM_ReminderThreshold);\r\n }\r\n if (config.IM_DaysBeforeExpirationReminder) {\r\n config.IM_DaysBeforeExpirationReminder = Number(config.IM_DaysBeforeExpirationReminder);\r\n }\r\n if (config.IM_AutomaticDelegationDaysThreshold) {\r\n config.IM_AutomaticDelegationDaysThreshold = Number(config.IM_AutomaticDelegationDaysThreshold);\r\n }\r\n\r\n if (config.IM_DefaultExpirationEnabled === '1' && config.IM_DefaultExpirationDays) {\r\n config.IM_DefaultExpirationDays = Number(config.IM_DefaultExpirationDays);\r\n }\r\n\r\n if (config.AutogeneratedUserRoles) {\r\n config.AutogeneratedUserRoles = config.AutogeneratedUserRoles.replaceAll(\";\", \",\");\r\n vm.selectedRoleIds = config.AutogeneratedUserRoles.split(\",\").map(role => Number(role));\r\n }\r\n\r\n vm.config = JSON.parse(JSON.stringify(config));\r\n vm.origConfig = JSON.parse(JSON.stringify(config));\r\n vm.configValuesDiffer = false;\r\n }\r\n\r\n async function getS4Config() {\r\n const { data } = await configurationDataService.getProductConfigurationValueByName('SAP', 'SAP_ErpType');\r\n return data.Value === \"S4\";\r\n }\r\n\r\n async function getProducts() {\r\n let { data } = await dataService.getProducts();\r\n\r\n vm.availableProducts = {};\r\n\r\n data.forEach(product => {\r\n vm.availableProducts[product.Type] = true;\r\n });\r\n\r\n vm.productsDataSource = data;\r\n }\r\n\r\n async function setupRolesDropdown() {\r\n vm.rolesDropdownOptions = {\r\n filter: \"contains\",\r\n autoClose: false,\r\n virtual: {\r\n itemHeight: 26,\r\n mapValueTo: 'dataItem',\r\n valueMapper: options => {\r\n options.success(helperService.multiValueMapperFunction(options, vm.rolesDataSource, 'ID'));\r\n }\r\n },\r\n height: 325,\r\n placeholder: `-- Select one or more Roles --`\r\n };\r\n\r\n vm.rolesDropdownDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async (options) => {\r\n vm.rolesDropdownLoading = true;\r\n let { data } = await dataService.getRoles();\r\n vm.rolesDataSource = $filter('orderBy')(data, 'Name');\r\n options.success(vm.rolesDataSource);\r\n vm.rolesDropdownLoading = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function getIdentityProviders() {\r\n try {\r\n let { data } = await configurationDataService.getIdentityProviders();\r\n vm.providersList = data;\r\n vm.providersList = $filter('orderBy')(vm.providersList, 'Name');\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function importCompanyLogo(file) {\r\n let fd = new FormData();\r\n\r\n vm.updatePending = new createSpinner();\r\n fd.append(\"ImageImport\", file[0].file);\r\n\r\n try {\r\n await configurationDataService.importCompanyLogo(fd);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n $rootScope.$broadcast('logoUpdated');\r\n vm.files.cancel();\r\n getExistingCompanyLogo();\r\n }\r\n catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function getExistingCompanyLogo() {\r\n vm.logoProcessing = true;\r\n try {\r\n const { data } = await configurationDataService.getCompanyLogo();\r\n vm.companyLogo = data;\r\n vm.logoProcessing = false;\r\n } catch {\r\n vm.companyLogo = null;\r\n vm.logoProcessing = false;\r\n }\r\n\r\n }\r\n\r\n async function deleteCompanyLogo() {\r\n vm.logoProcessing = true;\r\n await configurationDataService.deleteCompanyLogo();\r\n getExistingCompanyLogo();\r\n $rootScope.$broadcast('logoUpdated');\r\n vm.logoProcessing = false;\r\n }\r\n\r\n function setAuditTrailTabVisibility() {\r\n // Check if user has security for Audit Trail\r\n if (angular.fromJson(localStorage.getItem(\"NavigationObjects\")).some(object => object.ObjectID === 3000)) {\r\n // Check if user has one product and that one product is AX7\r\n if (vm.productsDataSource.length === 1 && vm.productsDataSource[0].ID === 'AX7') {\r\n // If AX7 only - do not show Audit Trail tab\r\n vm.showAuditTrailTab = false;\r\n } else {\r\n vm.showAuditTrailTab = true;\r\n }\r\n } else {\r\n vm.showAuditTrailTab = false;\r\n }\r\n }\r\n\r\n function setupTimeZones() {\r\n //Delivery System TimeZone\r\n vm.availableTimeZones = availableTimeZones;\r\n }\r\n\r\n async function putConfigurationSetting(list, value, origVal) {\r\n let putData = {\r\n \"Configurations\": []\r\n };\r\n\r\n list.forEach(item => {\r\n if (value[item.Name] !== origVal[item.Name]) {\r\n putData.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n });\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n try {\r\n await configurationDataService.updateConfigurationValues(putData);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n putData.Configurations.forEach(config => {\r\n origVal[config.Name] = config.Value;\r\n });\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function configValuesHaveChanged(configArray) {\r\n return helperService.returnTrueIfValuesDiffer(configArray, vm.origConfig, vm.config);\r\n }\r\n\r\n function submitCompanyInfo(files) {\r\n let { companyInfo } = configurationOptions;\r\n if (vm.configValuesHaveChanged(['CompanyName', 'PrimarySystem', 'SystemTimeZone', 'EmailNewFpAdUsers'])) {\r\n vm.putConfigurationSetting(companyInfo, vm.config, vm.origConfig);\r\n }\r\n if (files.length) {\r\n importCompanyLogo(files);\r\n }\r\n }\r\n\r\n function submitSystemConfiguration() {\r\n let { systemConfigurations } = configurationOptions;\r\n\r\n vm.config.AutogeneratedUserRoles = ([vm.selectedRoleIds].join(\", \")).replaceAll(',', ';');\r\n vm.putConfigurationSetting(systemConfigurations, vm.config, vm.origConfig); \r\n vm.userForm.$setPristine();\r\n }\r\n\r\n function submitAccessRiskMonitor() {\r\n let list = configurationOptions.productOptions.default,\r\n productOptions = configurationOptions.productOptions;\r\n\r\n if (vm.availableProducts.PS) {\r\n list = [...list, ...productOptions.PS];\r\n } else if (vm.availableProducts.ORFC) {\r\n list = [...list, ...productOptions.ORFC];\r\n } else if (vm.availableProducts.OR) {\r\n list = [...list, ...productOptions.OR];\r\n } else {\r\n list = [...list, ...productOptions.SAP];\r\n }\r\n\r\n vm.putConfigurationSetting(list, vm.config, vm.origConfig);\r\n }\r\n\r\n function submitAccessCertifications() {\r\n let { accessCertifications } = configurationOptions;\r\n\r\n if (vm.config.Cert_SnapshotTime && snapshotTimeHasChanged()) {\r\n let snapshotTimeSetting = new Date(vm.config.Cert_SnapshotTime);\r\n let currentUtcDateTime = new Date();\r\n snapshotTimeSetting.setDate(currentUtcDateTime.getUTCDate());\r\n snapshotTimeSetting.setMonth(currentUtcDateTime.getUTCMonth());\r\n snapshotTimeSetting.setYear(currentUtcDateTime.getUTCFullYear());\r\n\r\n vm.config.Cert_SnapshotTime = snapshotTimeSetting;\r\n }\r\n vm.putConfigurationSetting(accessCertifications, vm.config, vm.origConfig);\r\n }\r\n\r\n function snapshotTimeHasChanged() {\r\n return vm.origConfig[\"Cert_SnapshotTime\"] !== vm.config[\"Cert_SnapshotTime\"];\r\n }\r\n\r\n function submitSecurityDesigner() {\r\n vm.putConfigurationSetting([{ Name: \"SD_RequireAnalysisForSimulations\", Encrypted: false }], vm.config, vm.origConfig);\r\n }\r\n\r\n function showPasswordCriteria() {\r\n return vm.availableProducts?.SAP || vm.availableProducts?.AAD || vm.availableProducts?.PS;\r\n }\r\n\r\n function reset() {\r\n vm.imChildTabSelected,\r\n vm.scChildTabSelected, \r\n vm.ssChildTabSelected,\r\n vm.acChildTabSelected = null;\r\n }\r\n}","import controller from \"./configuration.controller\";\r\n\r\n/* configuration.component.js */\r\n\r\n/**\r\n * @desc component for system configuration\r\n * @example \r\n */\r\n\r\nconst configuration = {\r\n controller: controller,\r\n controllerAs: 'cvm',\r\n templateUrl: '/App/Components/configuration/configuration.tmpl.html'\r\n};\r\n\r\nexport default configuration;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.submitReportManagement = submitReportManagement;\r\n vm.configValuesHaveChanged = configValuesHaveChanged;\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate () {\r\n vm.config = vm.currentConfig;\r\n vm.origConfig = vm.originalConfig;\r\n }\r\n\r\n async function submitReportManagement () {\r\n vm.updateSettingsPending = new createSpinner();\r\n\r\n let list = [\r\n { Name: \"ArchiveSignedReports\", Encrypted: false },\r\n { Name: \"RM_EnableNewReportSignatureReminderEmails\", Encrypted: false },\r\n { Name: \"RM_EnableBeforeDueDayReportSignatureReminderEmails\", Encrypted: false },\r\n { Name: \"RM_DaysToSignReport\", Encrypted: false },\r\n { Name: \"RM_EnableDueDayReportSignatureReminderEmails\", Encrypted: false },\r\n { Name: \"RM_EnableOverdueReportSignatureReminderEmails\", Encrypted: false },\r\n { Name: \"RM_SendOverdueReportSignatureReminderEmailsEveryday\", Encrypted: false },\r\n { Name: \"RM_ReportSignatureDaysBeforeDueDate\", Encrypted: false }\r\n ];\r\n\r\n try {\r\n let value = vm.config;\r\n let origVal = vm.origConfig;\r\n await vm.updateConfiguration({ list, value, origVal });\r\n await helperService.successfulSaveButton(vm.updateSettingsPending);\r\n activate();\r\n } catch {\r\n vm.updateSettingsPending.loadingValue = false;\r\n }\r\n }\r\n\r\n function configValuesHaveChanged (configArray) {\r\n return helperService.returnTrueIfValuesDiffer(configArray, vm.origConfig, vm.config);\r\n }\r\n}","import reportManagementController from \"./reportManagement.controller\";\r\n\r\n\r\n/* reportManagement.component.js */\r\n\r\n/**\r\n * @desc component for configuring settings for Report management\r\n * @example \r\n */\r\n\r\nconst reportManagement = {\r\n bindings: {\r\n currentConfig: '<',\r\n originalConfig: '<',\r\n updateConfiguration: '&'\r\n },\r\n controller: reportManagementController,\r\n controllerAs: 'rmvm',\r\n templateUrl: '/App/Components/configuration/reportManagement/reportManagement.html'\r\n};\r\n\r\nexport default reportManagement;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, $http, errorsDataService) {\r\n const vm = this;\r\n\r\n vm.updateCuaConnectionValues = updateCuaConnectionValues;\r\n\r\n vm.$onInit = activate;\r\n \r\n function activate() {\r\n getSapCuaConnections();\r\n }\r\n\r\n async function getSapCuaConnections() {\r\n try {\r\n let response = await $http.get(apiUrl + 'api/universal/products/sap/connections/cua');\r\n vm.origValues = response.data;\r\n vm.product = response.data;\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n async function updateCuaConnectionValues() {\r\n vm.saving = new createSpinner();\r\n let cuaPostData = {\r\n \"AppServerHost\": vm.product.AppServerHost,\r\n \"Client\": vm.product.Client,\r\n \"CuaSystem\": vm.product.CuaSystem,\r\n \"IsCuaEnabled\": vm.product.IsCuaEnabled,\r\n \"Language\": vm.product.Language,\r\n \"Password\": vm.product.Password,\r\n \"PoolSize\": vm.product.PoolSize,\r\n \"SystemID\": vm.product.SystemID,\r\n \"SystemNumber\": vm.product.SystemNumber,\r\n \"User\": vm.product.User\r\n };\r\n\r\n try {\r\n await $http.put(`${apiUrl}api/universal/products/sap/connections/cua`, cuaPostData);\r\n helperService.successfulSaveButton(vm.saving);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n}","import cuaConnectionConfigurationController from \"./cuaConnectionConfiguration.controller\";\r\n\r\n/* cuaConnectionConfiguration.component.js */\r\n\r\n/**\r\n * @desc component for configuring SAP CUA Connection settings for Identity Manager\r\n * @example \r\n */\r\n\r\nconst identityManagerCuaConnectionConfiguration = {\r\n controller: cuaConnectionConfigurationController,\r\n controllerAs: 'cccvm',\r\n templateUrl: '/App/Components/configuration/identityManagerConfigTab/cuaConnectionConfiguration/cuaConnectionConfiguration.tmpl.html'\r\n};\r\n\r\nexport default identityManagerCuaConnectionConfiguration;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $http, helperService, errorsDataService) {\r\n\r\n const vm = this,\r\n defaultRoleTemplate = {\r\n Id: null,\r\n Name: \"-- Select A Template --\"\r\n },\r\n emailMappingADProducts = ['NS', 'ORFC', 'OR', 'SAP', 'PS', 'SF'],\r\n emailMappingAADProducts = ['AX7', 'NS', 'ORFC', 'OR', 'SAP', 'PS', 'SF'];\r\n\r\n vm.hasNS = null;\r\n vm.updateReminderSchedule = updateReminderSchedule;\r\n vm.updateIdentityManagerSettingsConfigValues = updateIdentityManagerSettingsConfigValues;\r\n vm.getReminderSchedule = getReminderSchedule;\r\n vm.equalityCheck = equalityCheck;\r\n vm.toggleAutomaticDelegations = toggleAutomaticDelegations;\r\n vm.configValuesHaveChanged = configValuesHaveChanged;\r\n vm.refreshConfig = refreshConfig;\r\n vm.configNames = [\r\n 'IM_AutoApproveRoleRevokes_AC',\r\n 'IM_AutoApproveRoleRevokes_IM',\r\n 'IM_AllowApproverEqualsRequesterOnAC',\r\n 'IM_ReminderThreshold',\r\n 'IM_DaysBeforeExpirationReminder',\r\n 'IM_DisableObjectLevelRiskAnalysis',\r\n 'IM_ExpirationReminderEnabled',\r\n 'IM_ApprovalReminderEnabled',\r\n 'IM_SODThresholdNewOnly',\r\n 'NS_ImRequireExistingEmployee',\r\n 'NS_ImTerminateOption',\r\n 'NS_ImTerminateSetReleaseDate',\r\n 'IM_AutomaticDelegationDaysThreshold',\r\n 'IM_AutoApproveAPIAppRequests',\r\n 'IM_ApplyApprovalRulesToRevokes',\r\n 'IM_RequireTicketAssociation',\r\n 'MaxFirefighterAccessPeriod',\r\n 'AX_ImDisableOnTerminate',\r\n 'AX7_ImDisableOnTerminate',\r\n 'GP_ImDisableOnTerminate',\r\n 'NAV_ImDisableOnTerminate',\r\n 'ORFC_ImDisableOnTerminate',\r\n 'SAP_ImDisableOnTerminate',\r\n 'AAD_ImDisableOnTerminate',\r\n 'IM_RequireEmergencyAccessPreApproval',\r\n 'IM_DefaultRoleTemplateForNewUserRequestsEnabled',\r\n 'IM_DefaultRoleTemplateForNewUserRequests',\r\n 'IM_DefaultExpirationEnabled',\r\n 'IM_DefaultExpirationDays',\r\n 'IM_PreventSelfReview',\r\n 'IM_RequireNoteOnCancelledRequests',\r\n 'IM_ProvisionRequestItemsOnApproval',\r\n 'IM_BypassRiskAnalysis',\r\n 'IM_RoleTemplatesOnlyEnabled',\r\n 'IM_NewRolesAssignableAfterImport',\r\n 'EmergencyAccessApproversGroup',\r\n 'IM_ADFieldForEmailMapping',\r\n 'IM_AADFieldForEmailMapping',\r\n 'IM_RestrictRoleRequestsEA',\r\n 'IM_SendRequestNotificationsToAffectedUsers',\r\n 'IM_SendRequestCreatedNotificationToRequester'\r\n ];\r\n vm.roleTemplatesDataSource = [];\r\n vm.defaultRoleTemplateInvalid = defaultRoleTemplateInvalid;\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n vm.productsDataSource = vm.products;\r\n vm.config = vm.currentConfig;\r\n vm.origConfig = vm.originalConfig;\r\n\r\n await checkForNS();\r\n await checkForSap();\r\n await getReminderSchedule();\r\n await getIMApplications();\r\n await getRoleTemplates();\r\n checkForSF();\r\n if (vm.config.IM_AutomaticDelegationDaysThreshold) {\r\n vm.automaticDelegations = true;\r\n }\r\n\r\n vm.config.IM_DefaultExpirationDays = Number(vm.config.IM_DefaultExpirationDays);\r\n vm.origConfig.IM_DefaultExpirationDays = Number(vm.origConfig.IM_DefaultExpirationDays);\r\n vm.showEmailMappingADFieldsConfiguration = () => vm.products.some(product => emailMappingADProducts.includes(product.ID)) && vm.currentConfig['AD_Active'] === \"1\";\r\n vm.showEmailMappingAADFieldsConfiguration = () => vm.products.some(product => emailMappingAADProducts.includes(product.ID)) && vm.currentConfig['AAD_Active'] === \"1\";\r\n }\r\n async function updateReminderSchedule() {\r\n vm.updateInProgress = new createSpinner();\r\n\r\n const postData = {\r\n \"StartTime\": vm.reminderStartTime.toUTCString(),\r\n \"TimeZone\": $rootScope.applicationTimeZone\r\n };\r\n\r\n if (vm.config.IM_ExpirationReminderEnabled === \"1\" || vm.config.IM_ApprovalReminderEnabled === \"1\") {\r\n try {\r\n await $http.post(`${apiUrl}api/identitymanager/notifications/schedule`, postData);\r\n await getReminderSchedule();\r\n helperService.successfulSaveButton(vm.updateInProgress);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n if (vm.config.IM_ExpirationReminderEnabled === \"0\" && vm.config.IM_ApprovalReminderEnabled === \"0\") {\r\n if (vm.reminderSchedule) {\r\n try {\r\n await $http.delete(`${apiUrl}api/identitymanager/notifications/schedule`);\r\n await getReminderSchedule();\r\n vm.updateInProgress.loadingValue = false;\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n //Check if NS exists for Terminate Request Processing IM section\r\n function checkForNS() {\r\n vm.hasNS = vm.productsDataSource.some(product => product.ID === 'NS');\r\n }\r\n\r\n //Check if SAP exists for Maximum Firefighter Access Period IM section\r\n function checkForSap() {\r\n vm.hasSap = vm.productsDataSource.some(product => product.Type === 'SAP');\r\n }\r\n\r\n // check for only SF as a product in order to hide Default Role Templates until it is ready for SF\r\n function checkForSF() {\r\n vm.salesforceOnly = vm.productsDataSource.every(product => product.Type === 'SF');\r\n }\r\n\r\n async function updateIdentityManagerSettingsConfigValues() {\r\n vm.updateSettingsPending = new createSpinner();\r\n\r\n let list = [\r\n { Name: \"IM_AutoApproveRoleRevokes_AC\", Encrypted: false },\r\n { Name: \"IM_AutoApproveRoleRevokes_IM\", Encrypted: false },\r\n { Name: \"IM_AllowApproverEqualsRequesterOnAC\", Encrypted: false },\r\n { Name: \"IM_ReminderThreshold\", Encrypted: false },\r\n { Name: \"IM_DaysBeforeExpirationReminder\", Encrypted: false },\r\n { Name: \"IM_ExpirationReminderEnabled\", Encrypted: false },\r\n { Name: \"IM_ApprovalReminderEnabled\", Encrypted: false },\r\n { Name: \"IM_PreventSelfReview\", Encrypted: false },\r\n { Name: \"IM_DefaultExpirationDays\", Encrypted: false },\r\n { Name: \"IM_DefaultExpirationEnabled\", Encrypted: false },\r\n { Name: \"IM_DisableObjectLevelRiskAnalysis\", Encrypted: false },\r\n { Name: \"IM_SODThresholdNewOnly\", Encrypted: false },\r\n { Name: \"IM_AutomaticDelegationDaysThreshold\", Encrypted: false },\r\n { Name: \"IM_AutoApproveAPIAppRequests\", Encrypted: false },\r\n { Name: \"IM_ApplyApprovalRulesToRevokes\", Encrypted: false },\r\n { Name: \"IM_DefaultRoleTemplateForNewUserRequestsEnabled\", Encrypted: false },\r\n { Name: \"IM_DefaultRoleTemplateForNewUserRequests\", Encrypted: false },\r\n { Name: \"IM_RequireTicketAssociation\", Encrypted: false },\r\n { Name: \"IM_RequireEmergencyAccessPreApproval\", Encrypted: false },\r\n { Name: \"IM_ProvisionRequestItemsOnApproval\", Encrypted: false },\r\n { Name: \"IM_RequireNoteOnCancelledRequests\", Encrypted: false },\r\n { Name: \"IM_RoleTemplatesOnlyEnabled\", Encrypted: false },\r\n { Name: \"NS_ImRequireExistingEmployee\", Encrypted: false },\r\n { Name: \"NS_ImTerminateOption\", Encrypted: false },\r\n { Name: \"NS_ImTerminateSetReleaseDate\", Encrypted: false },\r\n { Name: \"MaxFirefighterAccessPeriod\", Encrypted: false },\r\n { Name: \"AX_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"AX7_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"NAV_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"GP_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"ORFC_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"SAP_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"IM_NewRolesAssignableAfterImport\", Encrypted: false },\r\n { Name: \"IM_BypassRiskAnalysis\", Encrypted: false },\r\n { Name: \"IM_ADFieldForEmailMapping\", Encrypted: false },\r\n { Name: \"IM_AADFieldForEmailMapping\", Encrypted: false },\r\n { Name: \"IM_RestrictRoleRequestsEA\", Encrypted: false },\r\n { Name: \"IM_SendRequestNotificationsToAffectedUsers\", Encrypted: false },\r\n { Name: \"IM_SendRequestCreatedNotificationToRequester\", Encrypted: false }\r\n ];\r\n\r\n try {\r\n let value = vm.config;\r\n let origVal = vm.origConfig;\r\n await vm.updateConfiguration({ list, value, origVal });\r\n if (vm.config.IM_ExpirationReminderEnabled === \"0\" && vm.config.IM_ApprovalReminderEnabled === \"0\") {\r\n updateReminderSchedule();\r\n }\r\n await helperService.successfulSaveButton(vm.updateSettingsPending);\r\n activate();\r\n } catch {\r\n vm.updateSettingsPending.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n async function getReminderSchedule() {\r\n try {\r\n let { data } = await $http.get(apiUrl + 'api/identitymanager/notifications/schedule');\r\n vm.reminderSchedule = data;\r\n vm.savedReminderStartTime = new Date(data.StartTime);\r\n vm.reminderStartTime = vm.savedReminderStartTime;\r\n vm.equal = true;\r\n\r\n } catch (err) {\r\n vm.reminderSchedule = null;\r\n vm.reminderStartTime = new Date();\r\n\r\n }\r\n }\r\n\r\n async function getIMApplications() {\r\n let { data } = await $http.get(`${apiUrl}api/identitymanager/applications`);\r\n\r\n vm.imApplications = data;\r\n\r\n vm.universalOnly = vm.imApplications.every(product => product.Name === 'Universal');\r\n }\r\n\r\n async function getRoleTemplates() {\r\n let { data } = await $http.get(`${apiUrl}api/universal/roletemplates`);\r\n\r\n vm.roleTemplatesDataSource = [defaultRoleTemplate, ...data];\r\n }\r\n\r\n function equalityCheck() {\r\n vm.equal = vm.savedReminderStartTime && vm.reminderStartTime.getTime() === vm.savedReminderStartTime.getTime()\r\n }\r\n\r\n function toggleAutomaticDelegations() {\r\n if (!vm.automaticDelegations) {\r\n vm.origConfig.IM_AutomaticDelegationDaysThreshold = vm.config.IM_AutomaticDelegationDaysThreshold;\r\n vm.config.IM_AutomaticDelegationDaysThreshold = null;\r\n }\r\n }\r\n\r\n function configValuesHaveChanged(configArray) {\r\n return helperService.returnTrueIfValuesDiffer(configArray, vm.origConfig, vm.config);\r\n }\r\n\r\n function refreshConfig(updatedConfiguration) {\r\n vm.config = updatedConfiguration;\r\n }\r\n\r\n function defaultRoleTemplateInvalid() {\r\n return vm.config.IM_DefaultRoleTemplateForNewUserRequestsEnabled === \"1\" && !vm.config.IM_DefaultRoleTemplateForNewUserRequests;\r\n }\r\n}","import identityManagerConfigTabController from \"./identityManagerConfigTab.controller\";\r\n\r\n\r\n/* identityManagerConfigTab.component.js */\r\n\r\n/**\r\n * @desc component for configuring settings for Identity Manager\r\n * @example \r\n */\r\n\r\nconst identityManagerConfigTab = {\r\n bindings: {\r\n currentConfig: '<',\r\n originalConfig: '<',\r\n products: '<',\r\n tabSelected: '<',\r\n updateConfiguration: '&'\r\n },\r\n controller: identityManagerConfigTabController,\r\n controllerAs: 'imcvm',\r\n templateUrl: '/App/Components/configuration/identityManagerConfigTab/identityManagerConfigTab.tmpl.html'\r\n};\r\n\r\nexport default identityManagerConfigTab;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, helperService, manageDataDataService, configurationDataService, RequestManagementSAPService, ownershipGroupsDataService) {\r\n const vm = this,\r\n editRestrictedADProducts = ['NS', 'ORFC', 'OR', 'SAP', 'PS', 'SF'],\r\n editRestrictedAADProducts = ['AX7', 'NS', 'ORFC', 'OR', 'SAP', 'PS', 'SF'];\r\n\r\n vm.helperService = helperService;\r\n vm.configValueChanged = configValueChanged;\r\n vm.updateConfigValues = updateConfigValues;\r\n vm.updateSAPCollectionSchedule = updateSAPCollectionSchedule;\r\n\r\n vm.showProductSettings = false;\r\n\r\n vm.scheduleCollectionIsOn = null;\r\n vm.originalCollectionStatus = null;\r\n vm.configValuesDiffer = false;\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n vm.processingActionsDataSource = getProcessingActions();\r\n if (vm.configuration.IM_AutomaticDelegationDaysThreshold) {\r\n vm.automaticDelegations = true;\r\n }\r\n vm.configuration = { ...vm.configuration };\r\n vm.unchangedConfig = { ...vm.configuration };\r\n getProductConfiguration();\r\n if (vm.product.ProductType === 'SAP') {\r\n getSAPCollectionSchedule();\r\n vm.roleOwnershipGroupsDataSource = await getOwnershipGroups();\r\n }\r\n vm.showRestrictEditOfADFieldsConfiguration = () => editRestrictedADProducts.includes(vm.product.ProductType) && vm.configuration['AD_Active'] === \"1\";\r\n vm.showRestrictEditOfAADFieldsConfiguration = () => editRestrictedAADProducts.includes(vm.product.ProductType) && vm.configuration['AAD_Active'] === \"1\";\r\n }\r\n\r\n async function getProductConfiguration() {\r\n let { data } = await manageDataDataService.getConfigurationByProductId(vm.product.ProductID);\r\n vm.productConfiguration = data.reduce((acc, curr) => {\r\n acc[curr.Name] = curr.Value;\r\n return acc;\r\n }, {});\r\n\r\n vm.unchangedProductConfig = { ...vm.productConfiguration };\r\n\r\n if (vm.productConfiguration[vm.product.ProductType + '_ImDisableOnTerminate']) {\r\n vm.disableOnTerminateConfigName = vm.product.ProductType + '_ImDisableOnTerminate';\r\n } else {\r\n vm.disableOnTerminateConfigName = null;\r\n }\r\n if (vm.productConfiguration['IM_ShowRoleDescription']) {\r\n vm.showRoleDescriptionConfigName = 'IM_ShowRoleDescription';\r\n } else {\r\n vm.showRoleDescriptionConfigName = null;\r\n }\r\n if (vm.productConfiguration.IM_CollectUsage_DaysToCheck) {\r\n vm.product.SAP_IM_CollectUsage_DaysToCheck = parseInt(vm.productConfiguration.IM_CollectUsage_DaysToCheck);\r\n }\r\n\r\n setShowProductSettings();\r\n }\r\n\r\n async function getOwnershipGroups() {\r\n vm.roleOwnershipGroupsLoading = true;\r\n const { data } = await ownershipGroupsDataService.getOwnershipGroups();\r\n data.forEach(group => group.Id = group.Id.toString());\r\n vm.roleOwnershipGroupsLoading = false;\r\n return data;\r\n }\r\n\r\n function setShowProductSettings() {\r\n let hasProductType = [\"AX7\", \"SAP\", \"NS\"].some(type => type === vm.product.ProductType),\r\n showCreateRequests = vm.productConfiguration.IM_CreateRequestsFromCertReviews !== undefined,\r\n showImProvider = vm.productConfiguration.IM_Provider !== undefined,\r\n hasRestrictEdit = [\"SF\", \"PS\"].some(type => type === vm.product.ProductType) && (vm.configuration['AD_Active'] === \"1\" || vm.configuration['AAD_Active'] === \"1\");\r\n\r\n vm.showProductSettings = hasProductType || vm.disableOnTerminateConfigName || vm.showRoleDescriptionConfigName || showCreateRequests || showImProvider || hasRestrictEdit;\r\n }\r\n\r\n function getProcessingActions() {\r\n return [\r\n {\r\n Name: 'Set to Inactive',\r\n Id: '0'\r\n },\r\n {\r\n Name: 'Remove Access',\r\n Id: '1'\r\n },\r\n {\r\n Name: 'Set to Inactive & Remove Access',\r\n Id: '2'\r\n }\r\n ];\r\n }\r\n\r\n function configValueChanged() {\r\n vm.configValuesDiffer = JSON.stringify(vm.unchangedConfig) !== JSON.stringify(vm.configuration) || JSON.stringify(vm.unchangedProductConfig) !== JSON.stringify(vm.productConfiguration) || vm.scheduleCollectionIsOn !== vm.originalCollectionStatus || vm.scheduleCollectionIsOn && (JSON.stringify(vm.originalCollectionStartTime) !== JSON.stringify(vm.scheduleCollectionStartTime) || vm.product.SAP_IM_CollectUsage_DaysToCheck.toString() !== vm.productConfiguration.IM_CollectUsage_DaysToCheck);\r\n }\r\n\r\n async function updateConfigValues() {\r\n vm.updateProductConfigPending = new createSpinner();\r\n\r\n await makeUpdateCalls();\r\n vm.configValuesDiffer = false;\r\n await helperService.successfulSaveButton(vm.updateProductConfigPending);\r\n }\r\n\r\n function makeUpdateCalls() {\r\n // decide which call(s) to make\r\n if (vm.product.ProductType === 'SAP') {\r\n if (vm.originalCollectionStatus !== vm.scheduleCollectionIsOn || JSON.stringify(vm.originalCollectionStartTime) !== JSON.stringify(vm.scheduleCollectionStartTime)) {\r\n updateSAPCollectionSchedule();\r\n }\r\n if (vm.product.SAP_IM_CollectUsage_DaysToCheck.toString() !== vm.productConfiguration.IM_CollectUsage_DaysToCheck) {\r\n vm.productConfiguration.IM_CollectUsage_DaysToCheck = vm.product.SAP_IM_CollectUsage_DaysToCheck.toString();\r\n }\r\n }\r\n if (JSON.stringify(vm.unchangedConfig) !== JSON.stringify(vm.configuration)) {\r\n // we need to make the core config change call\r\n updateConfigurationSetting(vm.configuration, vm.unchangedConfig);\r\n }\r\n if (JSON.stringify(vm.unchangedProductConfig) !== JSON.stringify(vm.productConfiguration)) {\r\n // we need to make the product config change call\r\n updateProductConfiguration(vm.productConfiguration, vm.unchangedProductConfig)\r\n }\r\n }\r\n\r\n async function updateConfigurationSetting(value, origVal) {\r\n\r\n let putData = {\r\n \"Configurations\": []\r\n };\r\n\r\n let list = [\r\n { Name: \"NS_ImRequireExistingEmployee\", Encrypted: false },\r\n { Name: \"NS_ImTerminateOption\", Encrypted: false },\r\n { Name: \"NS_ImTerminateSetReleaseDate\", Encrypted: false },\r\n { Name: \"MaxFirefighterAccessPeriod\", Encrypted: false },\r\n { Name: \"EmergencyAccessApproversGroup\", Encrypted: false },\r\n { Name: \"IM_RestrictRoleRequestsEA\", Encrypted: false }\r\n ];\r\n\r\n list.forEach(item => {\r\n if (value[item.Name] !== origVal[item.Name]) {\r\n putData.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n });\r\n\r\n try {\r\n await configurationDataService.updateConfigurationValues(putData);\r\n vm.unchangedConfig = { ...vm.configuration };\r\n const updatedConfiguration = { ...vm.configuration };\r\n vm.refreshCoreConfig({ updatedConfiguration });\r\n } catch {\r\n vm.updateProductConfigPending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function updateProductConfiguration(value, origVal) {\r\n let putData = {\r\n \"Configurations\": [],\r\n \"ProductId\": vm.product.ProductID\r\n };\r\n\r\n let list = [\r\n { Name: \"AAD_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"AX_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"AX7_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"IM_RemoveRoleLastCompanyRemoved\", Encrypted: false },\r\n { Name: \"IM_ShowRoleDescription\", Encrypted: false },\r\n { Name: \"NAV_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"GP_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"ORFC_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"SAP_ImDisableOnTerminate\", Encrypted: false },\r\n { Name: \"IM_Provider\", Encrypted: false },\r\n { Name: \"IM_CreateRequestsFromCertReviews\", Encrypted: false },\r\n { Name: \"IM_CollectUsage_DaysToCheck\", Encrypted: false }, \r\n { Name: \"IM_EnableOrgHierarchies\", Encrypted: false },\r\n { Name: \"IM_EnableUserGroups\", Encrypted: false },\r\n { Name: \"IM_DisableAADUserFields\", Encrypted: false },\r\n { Name: \"IM_DisableADUserFields\", Encrypted: false }\r\n ];\r\n\r\n list.forEach(item => {\r\n if (value[item.Name] !== origVal[item.Name]) {\r\n putData.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n });\r\n\r\n try {\r\n await manageDataDataService.setProductConfiguration(vm.product.ProductID, putData);\r\n vm.unchangedProductConfig = { ...vm.productConfiguration };\r\n } catch {\r\n vm.updateProductConfigPending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function getSAPCollectionSchedule() {\r\n try {\r\n let response = await RequestManagementSAPService.getCollectionUsageSchedule(vm.product.ProductID)\r\n vm.collectionSchedule = response.data;\r\n vm.savedCollectionStartTime = new Date(response.data.StartTime);\r\n vm.scheduleCollectionStartTime = vm.savedCollectionStartTime;\r\n vm.originalCollectionStartTime = new Date(response.data.StartTime);\r\n vm.equal = true;\r\n vm.scheduleCollectionIsOn = true;\r\n vm.originalCollectionStatus = true;\r\n } catch (err) {\r\n vm.collectionSchedule = null;\r\n vm.scheduleCollectionStartTime = new Date();\r\n vm.scheduleCollectionIsOn = false;\r\n vm.originalCollectionStatus = false;\r\n }\r\n }\r\n\r\n async function updateSAPCollectionSchedule() {\r\n if (vm.scheduleCollectionIsOn) {\r\n vm.collectionScheduleUpdateInProgress = new createSpinner();\r\n const postData = {\r\n \"StartTime\": vm.scheduleCollectionStartTime.toUTCString(),\r\n \"TimeZone\": $rootScope.applicationTimeZone,\r\n \"ProductId\": vm.product.ProductID\r\n };\r\n\r\n try {\r\n await RequestManagementSAPService.setCollectionUsageSchedule(vm.product.ProductID, postData);\r\n await getSAPCollectionSchedule();\r\n helperService.successfulSaveButton(vm.collectionScheduleUpdateInProgress);\r\n } catch (err) {\r\n vm.collectionScheduleUpdateInProgress.loadingValue = false;\r\n }\r\n\r\n } else {\r\n if (vm.collectionSchedule) {\r\n try {\r\n await RequestManagementSAPService.deleteCollectionUsageSchedule(vm.product.ProductID);\r\n await getSAPCollectionSchedule();\r\n } catch (err) {\r\n vm.collectionScheduleUpdateInProgress.loadingValue = false;\r\n }\r\n }\r\n }\r\n }\r\n}","import productConfigurationController from \"./productConfiguration.controller\";\r\n\r\n/* productConfiguration.component.js */\r\n\r\n/**\r\n * @desc component for configuring product specific settings for Identity Manager\r\n * @example \r\n */\r\n\r\nconst identityManagerProductConfiguration = {\r\n bindings: {\r\n product: '<',\r\n configuration: '<',\r\n refreshCoreConfig: '&'\r\n },\r\n controller: productConfigurationController ,\r\n controllerAs: 'pcvm',\r\n templateUrl: '/App/Components/configuration/identityManagerConfigTab/productConfiguration/productConfiguration.tmpl.html'\r\n};\r\n\r\nexport default identityManagerProductConfiguration;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, manageDataDataService) {\r\n const vm = this;\r\n vm.helperService = helperService;\r\n vm.provisioningChanged = provisioningChanged;\r\n vm.updateProductProvisioning = updateProductProvisioning\r\n\r\n vm.valueChanged = false;\r\n vm.$onInit = activate;\r\n\r\n function activate() {\r\n getProductProvisioning();\r\n }\r\n\r\n async function getProductProvisioning() {\r\n const response = await manageDataDataService.getConfigurationByProductId(vm.product.ProductID);\r\n let provisioning = {\r\n 'IM_EnableProvisioning': response.data.find(prov => prov.Name === 'IM_EnableProvisioning').Value,\r\n 'IM_ProvisioningAdmins': response.data.find(prov => prov.Name === 'IM_ProvisioningAdmins').Value,\r\n }\r\n vm.originalProvisioning = JSON.stringify(provisioning);\r\n vm.provisioning = provisioning;\r\n }\r\n\r\n async function updateProductProvisioning() {\r\n vm.updateProvisioningPending = new createSpinner();\r\n let data = {\r\n \"Configurations\": [\r\n {\r\n \"Name\": \"IM_EnableProvisioning\",\r\n \"Value\": vm.provisioning.IM_EnableProvisioning\r\n },\r\n {\r\n \"Name\": \"IM_ProvisioningAdmins\",\r\n \"Value\": vm.provisioning.IM_ProvisioningAdmins\r\n }\r\n ],\r\n \"ProductId\": vm.product.ProductID\r\n };\r\n\r\n try {\r\n await manageDataDataService.setProductConfiguration(vm.product.ProductID, data);\r\n helperService.successfulSaveButton(vm.updateProvisioningPending);\r\n vm.originalProvisioning = JSON.stringify(vm.provisioning);\r\n vm.valueChanged = false;\r\n } catch {\r\n vm.updateProvisioningPending.loadingValue = false;\r\n }\r\n }\r\n\r\n function provisioningChanged() {\r\n if (vm.originalProvisioning === JSON.stringify(vm.provisioning)) {\r\n vm.valueChanged = false;\r\n } else {\r\n vm.valueChanged = true;\r\n }\r\n }\r\n}","/* productProvisioning.component.js */\r\n\r\nimport productProvisioningController from \"./productProvisioning.controller\";\r\n\r\n/**\r\n * @desc component for configuring product specific provisioning settings for Identity Manager\r\n * @example \r\n */\r\n\r\nconst identityManagerProductProvisioning = {\r\n bindings: {\r\n product: '<'\r\n },\r\n controller: productProvisioningController,\r\n controllerAs: 'ppvm',\r\n templateUrl: '/App/Components/configuration/identityManagerConfigTab/productProvisioning/productProvisioning.tmpl.html'\r\n};\r\n\r\nexport default identityManagerProductProvisioning;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, crossPlatformUsersDataService, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.importUserMapping = importUserMapping;\r\n vm.cancel = cancel;\r\n\r\n async function importUserMapping(files) {\r\n vm.disableButton = true;\r\n let fd = new FormData();\r\n files.forEach(function (file, i) {\r\n fd.append(files[i].file.name, files[i].file);\r\n });\r\n\r\n if (files.length > 0) {\r\n vm.disableButton = false;\r\n vm.importUpdatePending = new createSpinner();\r\n try {\r\n await crossPlatformUsersDataService.importUserMapping(fd);\r\n await helperService.successfulSaveButton(vm.importUpdatePending);\r\n cancel();\r\n } catch {\r\n vm.importUpdatePending.loadingValue = false;\r\n vm.disableButton = true;\r\n }\r\n cancel();\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../../Shared/kendo.module\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, lastSelectedUser, modalName, availableProducts, crossPlatformUsersDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.lastSelectedUser = lastSelectedUser;\r\n vm.modalName = modalName;\r\n vm.availableProducts = availableProducts;\r\n vm.submitUserMapping = submitUserMapping;\r\n vm.nullOutMapping = nullOutMapping;\r\n vm.checkUserMapping = checkUserMapping;\r\n vm.selectProduct = selectProduct;\r\n vm.cancel = cancel;\r\n\r\n vm.productsInModal = angular.copy(vm.availableProducts);\r\n\r\n vm.selectedProduct = null;\r\n\r\n async function activate() {\r\n if (vm.modalName === \"Edit\") {\r\n await getLastSelectedUserId();\r\n } else {\r\n vm.selectedUserModal = {\r\n \"ID\": null,\r\n \"Name\": \"\",\r\n \"Email\": \"\",\r\n \"UserMaps\": []\r\n };\r\n\r\n vm.productsInModal.forEach(function (product, i) {\r\n let mapModel = {\r\n \"UserID\": null,\r\n \"ProductID\": product.ID,\r\n \"ProductName\": product.Name,\r\n \"ProductType\": product.Type,\r\n \"UserName\": null,\r\n \"Email\": null\r\n };\r\n vm.selectedUserModal.UserMaps.push(mapModel);\r\n });\r\n }\r\n }\r\n\r\n activate();\r\n\r\n async function getLastSelectedUserId() {\r\n try {\r\n let response = await crossPlatformUsersDataService.getUserId(vm.lastSelectedUser.ID);\r\n vm.selectedUserModal = response.data;\r\n await populateData();\r\n } catch {\r\n return\r\n }\r\n }\r\n\r\n\r\n function populateData() {\r\n\r\n vm.selectedUserModal.UserMaps = [];\r\n\r\n\r\n vm.productsInModal.forEach(function (product, i) {\r\n var mapModel = {\r\n \"UserID\": null,\r\n \"ProductID\": product.ID,\r\n \"ProductName\": product.Name,\r\n \"ProductType\": product.Type,\r\n \"UserName\": null,\r\n \"Email\": null\r\n };\r\n\r\n vm.selectedUserModal.UserMaps.push(mapModel);\r\n\r\n });\r\n\r\n vm.selectedUserModal.UserMappings.forEach(function (mapping, i) {\r\n vm.selectedUserModal.UserMaps.forEach(function (userMap, i) {\r\n if (userMap.ProductID === mapping.ProductID) {\r\n userMap['UserID'] = mapping.UserID;\r\n userMap['UserName'] = mapping.UserName;\r\n userMap['Email'] = mapping.Email;\r\n }\r\n });\r\n });\r\n\r\n checkIfEnoughProductsAreSelected();\r\n\r\n }\r\n\r\n function nullOutMapping(dataItem) {\r\n\r\n let selectedMapping = vm.selectedUserModal.UserMaps.filter(e => e.ProductID === dataItem.ProductID)[0];\r\n selectedMapping['UserID'] = null;\r\n selectedMapping['UserName'] = null;\r\n selectedMapping['Email'] = null;\r\n\r\n //$scope.selectProduct(null);\r\n checkIfEnoughProductsAreSelected();\r\n }\r\n\r\n function checkIfEnoughProductsAreSelected() {\r\n let productsValid = 0;\r\n vm.selectedUserModal.UserMaps.forEach(function (dataItem, i) {\r\n if (dataItem.UserID) {\r\n productsValid = productsValid + 1;\r\n }\r\n });\r\n if (productsValid > 1) {\r\n vm.productsValid = true;\r\n } else {\r\n vm.productsValid = null;\r\n }\r\n }\r\n\r\n function checkUserMapping(dataItem) {\r\n\r\n if (vm.modalName === \"Create\") {\r\n vm.selectedUserModal.Name = dataItem.Name;\r\n vm.selectedUserModal.Email = dataItem.Email;\r\n }\r\n\r\n let selectedMapping = vm.selectedUserModal.UserMaps.filter(e => e.ProductID.toUpperCase() === dataItem.ProductID.toUpperCase())[0];\r\n selectedMapping['UserID'] = dataItem.UserID;\r\n selectedMapping['UserName'] = dataItem.Name;\r\n selectedMapping['Email'] = dataItem.Email;\r\n\r\n checkIfEnoughProductsAreSelected();\r\n vm.selectedProduct = null;\r\n }\r\n\r\n const columnsFromVM = [\r\n { title: \" \", template: \"\", width: 65, filterable: false },\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Email\", title: \"Email\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.manualMapGridOptions = helperService.setMainGridOptions(columnsFromVM, 400);\r\n vm.manualMapGridOptions.selectable = false;\r\n vm.manualMapGridOptions.pageable = {\r\n buttonCount: 3\r\n };\r\n vm.manualMapGridOptions.autoBind = false;\r\n\r\n vm.manualMapDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n\r\n let postData = {\r\n \"ProductId\": vm.selectedProduct,\r\n \"QueryInput\": helperService.prepareSortsAndFilters(options)\r\n };\r\n\r\n try {\r\n let response = await crossPlatformUsersDataService.updateManualMapGrid(postData, options.data.pageSize, options.data.page);\r\n options.success(response.data);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n\r\n function selectProduct(productId) {\r\n if (vm.selectedProduct) {\r\n vm.manualMapGrid.dataSource.read();\r\n }\r\n\r\n };\r\n\r\n async function submitUserMapping() {\r\n vm.submit = new createSpinner();\r\n\r\n let userMappings = [];\r\n\r\n vm.selectedUserModal.UserMaps.forEach(function (dataItem, i) {\r\n if (dataItem.UserID) {\r\n userMappings.push({\r\n \"ProductId\": dataItem.ProductID,\r\n \"ProductName\": dataItem.ProductName,\r\n \"UserId\": dataItem.UserID\r\n });\r\n }\r\n });\r\n\r\n\r\n let postData = {\r\n \"Input\": {\r\n \"ID\": vm.selectedUserModal.ID,\r\n \"Name\": vm.selectedUserModal.Name,\r\n \"Email\": vm.selectedUserModal.Email,\r\n \"UserMappings\": userMappings\r\n }\r\n };\r\n\r\n try {\r\n await crossPlatformUsersDataService.submitUserMapping(postData);\r\n let dataItem = vm.manualMapGrid.dataSource.data().find(function (row) {\r\n return row.ID === vm.selectedUserModal.ID;\r\n });\r\n\r\n if (dataItem) {\r\n var productsAsString = \"\";\r\n userMappings.forEach(function (row, i) {\r\n productsAsString = productsAsString + row.ProductName + \", \";\r\n });\r\n productsAsString = productsAsString.replace(/,\\s*$/, \"\");\r\n\r\n dataItem.Name = vm.selectedUserModal.Name;\r\n dataItem.Email = vm.selectedUserModal.Email;\r\n dataItem.Products = productsAsString;\r\n } else {\r\n vm.manualMapGrid.dataSource.read();\r\n }\r\n await helperService.successfulSaveButton(vm.submit);\r\n cancel();\r\n } catch {\r\n vm.submit.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\nimport swal from \"sweetalert2\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport importUserMappingModalController from \"./importUserMappingModal.controller\";\r\nimport newCrossPlatformUserModalController from \"./NewCrossPlatformUserModal/newCrossPlatformUserModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, crossPlatformUsersDataService, $q, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n\r\n vm.autoMapUpdatePending = {};\r\n vm.autoMapUpdatePending.loadingValue = false;\r\n\r\n vm.newEditCrossPlatformUserModal = newEditCrossPlatformUserModal;\r\n vm.openImportAutoMapModal = openImportAutoMapModal;\r\n vm.deleteUserMaster = deleteUserMaster;\r\n vm.exportAutoMapping = exportAutoMapping;\r\n\r\n //Update successful inline saver\r\n $scope.$on('ImportUserMappings', function (event, args) {\r\n vm.gridDataSource.read();\r\n });\r\n $scope.$on('ExportUserMappings', function (event, args) {\r\n helperService.successfulSaveButton(vm.exportUpdatePending);\r\n });\r\n\r\n //When the auto mapper web job completes update the statistics and main grid\r\n $scope.$on('ImportUserMappings', (event, args) => updateAutoMapperStatistics(event, args));\r\n\r\n function activate() {\r\n setColumns();\r\n createGridDataSource();\r\n }\r\n\r\n activate();\r\n\r\n async function newEditCrossPlatformUserModal(modalType, dataItem) {\r\n if (modalType === 'New') {\r\n vm.lastSelectedUser = null;\r\n } else {\r\n vm.lastSelectedUser = angular.copy(dataItem);\r\n }\r\n\r\n let newEditModal = $uibModal.open({\r\n templateUrl: '/App/Components/CrossPlatformUsers/NewCrossPlatformUserModal/newCrossPlatformUserModal.tmpl.html',\r\n controller: newCrossPlatformUserModalController,\r\n controllerAs: 'ncpumvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope,\r\n resolve: {\r\n lastSelectedUser: () => vm.lastSelectedUser,\r\n modalName: () => modalType,\r\n availableProducts: () => vm.availableProducts\r\n }\r\n });\r\n\r\n try {\r\n await newEditModal.result;\r\n await vm.gridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n vm.lockNewUserButton = true;\r\n\r\n async function setColumns() {\r\n let response = await crossPlatformUsersDataService.getProducts();\r\n vm.availableProducts = response.data;\r\n\r\n vm.lockNewUserButton = false;\r\n\r\n let actionsColumnTemplate = `\r\n \r\n \r\n
`;\r\n\r\n let columnsFromVM = [\r\n { field: \"Name\", title: \"User Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Email\", title: \"Email\", filterable: customAutoCompleteFilter },\r\n { field: \"Products\", title: \"Products\", filterable: customAutoCompleteFilter },\r\n { title: \"Actions\", width: 140, template: actionsColumnTemplate, filterable: false },\r\n { field: \"MappingStatus\", title: \"Mapping Status\", headerTemplate: '{{cpuvm.mappingStatusRowCount}}
', filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.mainGridOptions = helperService.setMainGridOptions(columnsFromVM, 600);\r\n vm.mainGridOptions.selectable = false;\r\n }\r\n\r\n function updateAutoMapperStatistics(event, args) {\r\n let promises = [];\r\n\r\n promises.push(vm.mainGrid.dataSource.read());\r\n //After the grid and statistics have been updated remove the loading icon in the 'Auto Map' section\r\n $q.all(promises).then(function () {\r\n vm.autoMapUpdatePending.loadingValue = false;\r\n });\r\n }\r\n\r\n function createGridDataSource() {\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: halSchemaKendoGrid,\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let data = {};\r\n data = helperService.prepareSortsAndFilters(options);\r\n\r\n try { \r\n let response = await crossPlatformUsersDataService.updateGrid(options.data.pageSize, options.data.page, data);\r\n options.success(response.data);\r\n\r\n vm.mappingStatusRowCount = response.data.TotalItems;\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function deleteUserMaster(dataItem) {\r\n await swal(helperService.areYouSureParams('Delete User', 'All data associated with this user will be lost. Are you sure you want to remove this user?', 'Delete'));\r\n\r\n let postData = {\r\n \"Input\": {\r\n \"ID\": dataItem.ID,\r\n \"Name\": dataItem.Name,\r\n \"Email\": dataItem.Email,\r\n \"UserMappings\": []\r\n }\r\n };\r\n\r\n try {\r\n await crossPlatformUsersDataService.deleteUserMaster(postData);\r\n await vm.mainGrid.dataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n function openImportAutoMapModal() {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/CrossPlatformUsers/importUserMappingModal.tmpl.html',\r\n controller: importUserMappingModalController,\r\n controllerAs: 'iammvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n scope: $scope\r\n });\r\n }\r\n\r\n async function exportAutoMapping() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n await crossPlatformUsersDataService.exportAutoMapping();\r\n } catch {\r\n return;\r\n } \r\n }\r\n\r\n}\r\n\r\n","import crossPlatformUsersController from \"./crossPlatformUsers.controller\";\r\n\r\n/* crossPlatformUsers.component.js */\r\n/**\r\n * @desc component for cross platform users\r\n * @example \r\n */\r\n\r\nconst crossPlatformUsers = {\r\n controller: crossPlatformUsersController,\r\n controllerAs: 'cpuvm',\r\n templateUrl: '/App/Components/CrossPlatformUsers/crossPlatformUsers.tmpl.html'\r\n};\r\n\r\nexport default crossPlatformUsers;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $filter, dataService, helperService, maintainSystemRolesDataService, ownershipGroupsDataService, ownershipGroupItemsDataService, role) {\r\n const vm = this;\r\n\r\n vm.editSystemRole = editSystemRole;\r\n vm.checkIfApproversNeeded = checkIfApproversNeeded;\r\n vm.approversSelectionChanged = approversSelectionChanged;\r\n vm.cancel = cancel;\r\n vm.role = { ...role };\r\n vm.approversNeeded = false;\r\n\r\n if (vm.role.Reviewed) {\r\n vm.role.previouslyReviewed = true;\r\n }\r\n\r\n activate();\r\n\r\n async function activate() {\r\n if (role.ProductType === 'SAP') {\r\n vm.eaDisabled = await canSetEmergencyAccess();\r\n if (vm.role.IsEmergencyAccess) {\r\n vm.approversExist = true;\r\n }\r\n }\r\n }\r\n\r\n async function canSetEmergencyAccess() {\r\n const { data: ownershipGroups } = await ownershipGroupsDataService.getOwnershipGroups(),\r\n defaultEAOGId = await helperService.getConfigurationValue('EmergencyAccessApproversGroup');\r\n if (!ownershipGroups.length || !defaultEAOGId) {\r\n return true;\r\n } else {\r\n vm.ownershipGroupsList = ownershipGroups;\r\n vm.defaultEAOwnershipGroupId = Number(defaultEAOGId);\r\n return false;\r\n }\r\n \r\n }\r\n\r\n async function checkIfApproversNeeded() {\r\n if (!vm.role.IsEmergencyAccess) {\r\n return;\r\n }\r\n vm.dataLoading = true;\r\n if (!vm.approversExist) {\r\n const { data: defaultEAOGRoles } = await ownershipGroupItemsDataService.getEmergencyAccessGroupRoles(vm.defaultEAOwnershipGroupId);\r\n if (!defaultEAOGRoles.some(role => role.Identifier === vm.role.Identifier)) {\r\n vm.approversNeeded = true;\r\n setupAvailableUsersGrid();\r\n } else {\r\n vm.dataLoading = false;\r\n }\r\n } else {\r\n vm.dataLoading = false;\r\n }\r\n }\r\n\r\n function setupAvailableUsersGrid() {\r\n const availableUsersGridColumns = [\r\n { selectable: true, width: 50 },\r\n { field: \"UserLogonName\", title: \"Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.availableUsersGridOptions = helperService.setMainGridOptions(availableUsersGridColumns, 300);\r\n vm.availableUsersGridOptions.selectable = false;\r\n vm.availableUsersGridOptions.persistSelection = true;\r\n\r\n vm.availableUsersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n id: \"UserID\"\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n let { data } = await dataService.getUsers();\r\n data = data.filter(user => user.Active);\r\n data = $filter('orderBy')(data, 'UserLogonName');\r\n options.success(data);\r\n vm.dataLoading = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function approversSelectionChanged() {\r\n vm.selectedApproverIds = vm.availableUsersGrid.selectedKeyNames();\r\n }\r\n\r\n async function editSystemRole() {\r\n vm.savePending = new createSpinner();\r\n const data = {\r\n SecurityRoleId: vm.role.ID,\r\n SecurityRoleTypeId: vm.role.TypeID,\r\n ProductId: vm.role.ProductID,\r\n IsAssignable: vm.role.IsAssignable,\r\n IsAutoApproved: vm.role.IsAutoApproved,\r\n IgnoreCertification: vm.role.IgnoreCertification,\r\n Reviewed: vm.role.Reviewed,\r\n IsEmergencyAccess: vm.role.IsEmergencyAccess,\r\n EmergencyAccessRequest: vm.role.IsEmergencyAccess ? { GroupId: vm.defaultEAOwnershipGroupId, SecurityRoleIdentifier: vm.role.Identifier, UserIds: vm.selectedApproverIds } : null\r\n }\r\n\r\n try {\r\n await maintainSystemRolesDataService.updateSystemRole(data);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n close();\r\n } catch {\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n\r\n function close() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, maintainSystemRolesDataService, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.removeFile = removeFile;\r\n vm.importSystemRoles = importSystemRoles;\r\n vm.cancel = cancel;\r\n\r\n\r\n async function removeFile(file) {\r\n vm.fileActionPending = true;\r\n\r\n try {\r\n await controlLibraryDataService.deleteAttachment(file.Identifier);\r\n\r\n const index = vm.existingFilesDataSource.findIndex(remainingFile => remainingFile.Identifier === file.Identifier);\r\n vm.existingFilesDataSource.splice(index, 1);\r\n vm.fileActionPending = false;\r\n } catch {\r\n vm.fileActionPending = false;\r\n }\r\n }\r\n\r\n async function importSystemRoles(file) {\r\n let fd = new FormData();\r\n vm.saving = new createSpinner();\r\n\r\n fd.append(file[0].name, file[0].file)\r\n\r\n await maintainSystemRolesDataService.importSystemRoles(fd);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n }\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, customBooleanFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport { halSchemaKendoGrid } from \"../../Shared/kendo.module\";\r\nimport editSystemRoleModalController from \"./editSystemRoleModal/editSystemRoleModal.controller\";\r\nimport importModalController from \"./importModal/importModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, maintainSystemRolesDataService, dataService, helperService, $uibModal, $scope, reportsService, ownershipGroupsDataService, FileSaver) {\r\n\r\n const vm = this;\r\n vm.openEditSystemRoleModal = openEditSystemRoleModal;\r\n vm.openImportModal = openImportModal;\r\n vm.exportSystemRoles = exportSystemRoles;\r\n\r\n $scope.$on('ImportSecurityRoleProperties', (event, args) => vm.systemRolesGridDataSource.read());\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.productsDataSource = await getProducts();\r\n vm.multipleProducts = checkForMultipleProducts();\r\n vm.hasSap = checkForSap();\r\n\r\n configureSystemRolesGrid();\r\n }\r\n\r\n async function getProducts() {\r\n const { data } = await dataService.getProducts();\r\n\r\n return $filter('orderBy')(data, 'Name');\r\n }\r\n\r\n function checkForMultipleProducts() {\r\n let hasMultiple = vm.productsDataSource.length > 1;\r\n\r\n if (hasMultiple) {\r\n vm.selectedProduct = vm.productsDataSource[0];\r\n }\r\n\r\n return hasMultiple;\r\n }\r\n\r\n async function getRoleOwnershipGroups() {\r\n const { data } = await ownershipGroupsDataService.getOwnershipGroups();\r\n\r\n vm.roleOwnershipGroupsLoading = true;\r\n vm.roleOwnershipGroupsDataSource = data;\r\n vm.eaApproversGroupId = Number(JSON.parse(localStorage.getItem(\"ConfigurationValues\")).EmergencyAccessApproversGroup);\r\n\r\n if (vm.eaApproversGroupId && vm.roleOwnershipGroupsDataSource.length > 0) {\r\n vm.selectedOwnershipGroup = vm.roleOwnershipGroupsDataSource.find(group => group.Id === vm.eaApproversGroupId).Id;\r\n }\r\n\r\n vm.roleOwnershipGroupsLoading = false;\r\n }\r\n\r\n function checkForSap() {\r\n return vm.productsDataSource.some(product => product.Type === 'SAP');\r\n }\r\n\r\n async function configureSystemRolesGrid() {\r\n const eaColumn = { field: \"IsEmergencyAccess\", title: \"Is Emergency Access\", headerTemplate: '{{msrvm.isEmergencyAccessRolesCount}}
', filterable: customBooleanFilter, width: 160 },\r\n systemRolesGridColumns = [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter, width: 120 },\r\n { field: \"ID\", title: \"Id\", filterable: customAutoCompleteFilter, width: 100 },\r\n { field: \"Description\", title: \"Description\", filterable: customAutoCompleteFilter },\r\n { field: \"IsAssignable\", title: \"Is Assignable\", headerTemplate: '{{msrvm.isAssignableRolesCount}}
', filterable: customBooleanFilter, width: 120 },\r\n { field: \"IsAutoApproved\", title: \"Is Auto Approved\", headerTemplate: '{{msrvm.isAutoApprovedRolesCount}}
', filterable: customBooleanFilter, width: 140 },\r\n { field: \"IgnoreCertification\", title: \"Ignore Certification\", headerTemplate: '{{msrvm.ignoreCertificationRolesCount}}
', filterable: customBooleanFilter, width: 160 },\r\n { field: \"Reviewed\", title: \"Is Reviewed\", headerTemplate: '{{msrvm.isReviewedRolesCount}}
', filterable: customBooleanFilter, width: 120 },\r\n { field: \"ProductName\", title: \"Product\", filterable: customAutoCompleteFilter, hidden: !vm.multipleProducts },\r\n { template: `{{dataItem.Reviewed ? 'Edit' : 'Review'}}`, \"title\": \"Status\", width: 100 },\r\n ];\r\n\r\n if (vm.hasSap) {\r\n systemRolesGridColumns.splice(7, 0, eaColumn);\r\n }\r\n\r\n vm.systemRolesGridOptions = helperService.setMainGridOptions(systemRolesGridColumns, 600);\r\n vm.systemRolesGridOptions.autoBind = false;\r\n\r\n vm.systemRolesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: angular.extend(halSchemaKendoGrid, {\r\n model: {\r\n fields: {\r\n IsAssignable: { type: \"boolean\" },\r\n IsAutoApproved: { type: \"boolean\" },\r\n IgnoreCertification: { type: \"boolean\" },\r\n IsEmergencyAccess: { type: \"boolean\" },\r\n Reviewed: { type: \"boolean\" }\r\n }\r\n }\r\n }),\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n transport: {\r\n read: async options => {\r\n let query = helperService.prepareSortsAndFilters(options);\r\n query = reportsService.fixFieldNamesForApi(query, \"SecurityRole\");\r\n let params = { 'pagesize': options.data.pageSize, 'page': options.data.page };\r\n try{\r\n const { data } = await maintainSystemRolesDataService.getSystemRoles(query, params);\r\n vm.isAssignableRolesCount = data._embedded.reportData.filter(role => role.IsAssignable).length;\r\n vm.isAutoApprovedRolesCount = data._embedded.reportData.filter(role => role.IsAutoApproved).length;\r\n vm.ignoreCertificationRolesCount = data._embedded.reportData.filter(role => role.IgnoreCertification).length\r\n vm.isEmergencyAccessRolesCount = data._embedded.reportData.filter(role => role.IsEmergencyAccess).length\r\n vm.isReviewedRolesCount = data._embedded.reportData.filter(role => role.Reviewed).length\r\n options.success(data);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n\r\n await vm.systemRolesGridDataSource.read();\r\n }\r\n async function openEditSystemRoleModal(role) {\r\n\r\n const editSystemRoleModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainSystemRoles/editSystemRoleModal/editSystemRoleModal.html',\r\n controller: editSystemRoleModalController,\r\n controllerAs: 'esrmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n role: () => role\r\n }\r\n });\r\n try {\r\n await editSystemRoleModal.result;\r\n vm.systemRolesGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openImportModal() {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/maintainSystemRoles/importModal/importModal.html',\r\n controller: importModalController,\r\n controllerAs: 'isrmvm',\r\n backdrop: 'static'\r\n });\r\n }\r\n\r\n async function exportSystemRoles() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n let { data } = await maintainSystemRolesDataService.exportSystemRoles();\r\n await helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(data, 'SystemRoles.xlsx');\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n}","import controller from \"./maintainSystemRoles.controller\";\r\n\r\n/* maintainSystemRoles.component.js */\r\n\r\n/**\r\n * @desc component for maintaining system roles\r\n * @example \r\n */\r\n\r\nconst maintainSystemRoles = {\r\n controller: controller,\r\n controllerAs: 'msrvm',\r\n template: `\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
System Roles
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
`\r\n};\r\n\r\nexport default maintainSystemRoles;","export default /*@ngInject*/ function (authenticationService, notificationsDataService, dataService, $filter) {\r\n\r\n const vm = this;\r\n\r\n vm.type = null;\r\n vm.notificationTypes = [];\r\n vm.allSubscriptions = [];\r\n vm.mySubscriptions = [];\r\n\r\n vm.getSubscriptions = getSubscriptions;\r\n vm.getNotificationTypes = getNotificationTypes;\r\n vm.setupToggleState = setupToggleState;\r\n\r\n vm.$onInit = activate();\r\n\r\n async function activate() {\r\n\r\n vm.loading = true;\r\n\r\n try {\r\n await getProducts();\r\n await getSubscriptions();\r\n await getNotificationTypes();\r\n setupToggleState();\r\n vm.loading = false;\r\n } catch (_) {\r\n vm.loading = false;\r\n }\r\n }\r\n\r\n // Pass to my notifications component\r\n async function getNotificationTypes() {\r\n const res = await notificationsDataService.getNotificationTypes();\r\n res.data = $filter('orderBy')(res.data, 'Name');\r\n vm.notificationTypes = res.data;\r\n }\r\n\r\n // Pass to modal controller and component\r\n async function getSubscriptions() {\r\n const currentUser = await authenticationService.getUser();\r\n const res = await notificationsDataService.getSubscriptions();\r\n vm.allSubscriptions = res.data.filter(s => s.UserId !== currentUser.userId);\r\n vm.mySubscriptions = res.data.filter(s => s.UserId === currentUser.userId);\r\n }\r\n\r\n async function getProducts() {\r\n const res = await dataService.getProducts();\r\n vm.products = res.data;\r\n }\r\n\r\n function setupToggleState() {\r\n vm.notificationTypes.forEach(type => {\r\n if (type.HasProductFilter) {\r\n vm.products.forEach(product => {\r\n type[product.ID] = { Notifications: null };\r\n if (vm.mySubscriptions.length > 0 && vm.mySubscriptions.some(subscription => subscription.ProductId === product.ID && subscription.NotificationTypeId === type.Id)) {\r\n type[product.ID].Notifications = true;\r\n } else {\r\n type[product.ID].Notifications = false;\r\n }\r\n });\r\n } else {\r\n type.Notifications = null;\r\n if (vm.mySubscriptions.length > 0 && vm.mySubscriptions.some(subscription => subscription.NotificationTypeId === type.Id)) {\r\n type.Notifications = true;\r\n } else {\r\n type.Notifications = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n}","import notificationsController from \"./notifications.controller\";\r\n\r\n/* notifications.component.js */\r\n\r\n/**\r\n * @desc component for displaying and subscribing to notifications\r\n * @example \r\n */\r\n\r\nconst notifications = {\r\n controller: notificationsController,\r\n controllerAs: 'nvm',\r\n templateUrl: '/App/Components/Notifications/notifications.tmpl.html'\r\n};\r\n\r\nexport default notifications;","export default /*@ngInject*/ function ($uibModalInstance, authenticationService, notificationsDataService, type, products) {\r\n\r\n const vm = this;\r\n\r\n vm.type = type;\r\n vm.products = products;\r\n vm.availableUsers = [];\r\n vm.subscribedUsers = [];\r\n\r\n vm.setupUsers = setupUsers;\r\n vm.createSubscription = createSubscription;\r\n vm.removeSubscription = removeSubscription;\r\n vm.cancel = cancel;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getUsers();\r\n await getSubscriptions();\r\n if (!vm.type.HasProductFilter) {\r\n setupUsers();\r\n }\r\n else if (vm.type.HasProductFilter && vm.products.length === 1) {\r\n vm.productId = vm.products[0].ID;\r\n setupUsers();\r\n }\r\n }\r\n\r\n async function getUsers() {\r\n vm.currentUser = await authenticationService.getUser();\r\n const res = await notificationsDataService.getUsers();\r\n res.data = res.data.filter(user => user.Active);\r\n vm.users = res.data.filter(u => u.UserID !== vm.currentUser.userId);\r\n }\r\n\r\n async function getSubscriptions() {\r\n const res = await notificationsDataService.getSubscriptions();\r\n vm.subscribed = res.data.filter(s => s.UserId !== vm.currentUser.userId);\r\n }\r\n\r\n function setupUsers() {\r\n\r\n let subscribed = [];\r\n\r\n subscribed = vm.subscribed.filter(su => su.NotificationTypeId === vm.type.Id);\r\n\r\n if (vm.type.HasProductFilter && subscribed.length > 0) {\r\n vm.subscribedUsers = subscribed.filter(su => su.ProductId === vm.productId);\r\n } else if (!vm.type.HasProductFilter && subscribed.length > 0) {\r\n vm.subscribedUsers = [...subscribed];\r\n }\r\n\r\n vm.availableUsers = [...vm.users];\r\n\r\n if (subscribed.length > 0) {\r\n vm.subscribedUsers.forEach(su => {\r\n let match = vm.availableUsers.find(au => au.UserID === su.UserId);\r\n if (match) vm.availableUsers.remove(match);\r\n });\r\n } else {\r\n vm.subscribedUsers = [];\r\n }\r\n }\r\n\r\n async function createSubscription(user) {\r\n\r\n vm.loading = true;\r\n\r\n const data = {\r\n NotificationTypeId: vm.type.Id,\r\n UserId: user.UserID,\r\n ProductId: vm.productId ? vm.productId : null\r\n };\r\n\r\n try {\r\n await notificationsDataService.createSubscription(data);\r\n await getSubscriptions();\r\n setupUsers();\r\n vm.loading = false;\r\n } catch (_) {\r\n vm.loading = false;\r\n }\r\n }\r\n\r\n async function removeSubscription(subscription) {\r\n\r\n vm.loading = true;\r\n\r\n try {\r\n await notificationsDataService.removeSubscription(subscription.Id);\r\n await getSubscriptions();\r\n setupUsers();\r\n vm.loading = false;\r\n } catch (_) {\r\n vm.loading = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}\r\n","import notificationManagerModalController from \"../NotificationManagerModal/notificationManagerModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (authenticationService, notificationsDataService, $rootScope, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.changeSelectedType = changeSelectedType;\r\n vm.toggleProductNotifications = toggleProductNotifications;\r\n vm.toggleTypeNotifications = toggleTypeNotifications;\r\n vm.updateTypeDescription = updateTypeDescription;\r\n\r\n vm.$onInit = activate();\r\n\r\n async function activate() {\r\n vm.currentUser = await authenticationService.getUser();\r\n setupMenuOptions();\r\n }\r\n\r\n function setupMenuOptions() {\r\n if ($rootScope.UserSecurityList['6301']) {\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit Description',\r\n click: item => {\r\n item.type.editedTypeDescription = item.type.Description;\r\n toggleDescriptionEditor(item.type);\r\n }\r\n },\r\n {\r\n text: 'Manage Others',\r\n click: item => {\r\n openNotificationManagerModal(item.type);\r\n }\r\n }\r\n ];\r\n }\r\n }\r\n\r\n function changeSelectedType(type) {\r\n vm.type = type;\r\n }\r\n\r\n function openNotificationManagerModal(type) {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/Notifications/NotificationManagerModal/notificationManagerModal.html',\r\n controller: notificationManagerModalController,\r\n controllerAs: 'nmmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n type: () => type,\r\n products: () => vm.products\r\n },\r\n size: 'lg'\r\n });\r\n }\r\n\r\n async function createSubscription(type, product) {\r\n\r\n \r\n const data = {\r\n NotificationTypeId: type.Id,\r\n UserId: vm.currentUser.userId,\r\n ProductId: product ? product.ID : null\r\n };\r\n\r\n return await notificationsDataService.createSubscription(data);\r\n }\r\n\r\n async function removeProductSubscription() {\r\n const subscriptionId = vm.mySubscriptions.find(sub => sub.UserId === vm.currentUser.userId && sub.NotificationTypeId === vm.type.Id && vm.type[sub.ProductId].Notifications === false).Id;\r\n\r\n return await notificationsDataService.removeSubscription(subscriptionId);\r\n }\r\n\r\n async function removeTypeSubscription() {\r\n const subscriptionId = vm.mySubscriptions.find(sub => sub.UserId === vm.currentUser.userId && sub.NotificationTypeId === vm.type.Id && vm.type.Notifications === false).Id;\r\n\r\n return await notificationsDataService.removeSubscription(subscriptionId);\r\n }\r\n\r\n async function toggleProductNotifications(type, product) {\r\n\r\n vm.toggling = true;\r\n\r\n try {\r\n if (type[product.ID].Notifications) {\r\n await createSubscription(type, product);\r\n } else {\r\n await removeProductSubscription();\r\n }\r\n vm.getSubscriptions();\r\n vm.toggling = false;\r\n } catch (_) {\r\n vm.toggling = false;\r\n }\r\n }\r\n\r\n async function updateTypeDescription(type) {\r\n\r\n const data = {\r\n Id: type.Id,\r\n Description: type.editedTypeDescription\r\n };\r\n\r\n try {\r\n await notificationsDataService.updateTypeDescription(type.Id, data);\r\n vm.getNotificationTypes();\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function toggleTypeNotifications(type) {\r\n\r\n vm.toggling = true;\r\n\r\n try {\r\n if (type.Notifications) {\r\n await createSubscription(type);\r\n } else {\r\n await removeTypeSubscription();\r\n }\r\n vm.getSubscriptions();\r\n vm.toggling = false;\r\n } catch (_) {\r\n vm.toggling = false;\r\n }\r\n }\r\n\r\n function toggleDescriptionEditor(type) {\r\n if (!type.editDescription) type.editDescription = true;\r\n else type.editDescription = false;\r\n }\r\n\r\n\r\n\r\n}","import NotificationTypesListController from \"./notificationTypesList.controller\";\r\n\r\n/* notificationTypesList.component.js */\r\n\r\n/**\r\n * @desc component for displaying and selecting notification types\r\n * @example \r\n */\r\n\r\nconst notificationTypesList = {\r\n bindings: {\r\n getSubscriptions: '<',\r\n getNotificationTypes: '<',\r\n allSubscriptions: '<',\r\n mySubscriptions: '<',\r\n notificationTypes: '<',\r\n setupToggleState: '<',\r\n products: '<',\r\n loading: '<'\r\n },\r\n controller: NotificationTypesListController,\r\n controllerAs: 'ntlvm',\r\n templateUrl: '/App/Components/Notifications/notificationTypesList/notificationTypesList.tmpl.html'\r\n};\r\n\r\nexport default notificationTypesList;","import { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModalInstance, dataService, roleTemplatesData, maintainSystemRolesDataService, helperService, errorsDataService, template) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = getProducts;\r\n\r\n vm.addRole = addRole;\r\n vm.productDropdownChanged = productDropdownChanged;\r\n vm.cancel = cancel;\r\n\r\n const availableRolesGridColumns = [\r\n { title: \"Name\", field: \"Name\", filterable: customAutoCompleteFilter },\r\n { title: \"Id\", field: \"ID\", filterable: customAutoCompleteFilter },\r\n { title: \"Description\", field: \"Description\", filterable: customAutoCompleteFilter },\r\n { template: \"\", title: \"\", width: 20, filterable: false }\r\n ];\r\n\r\n vm.availableRolesGridOptions = helperService.setMainGridOptions(availableRolesGridColumns, null);\r\n vm.availableRolesGridOptions.selectable = false;\r\n\r\n async function getProducts() {\r\n try {\r\n let response = await dataService.getProducts();\r\n vm.availableProducts = response.data;\r\n if (response.data.length === 1) autoSelectSingleProduct();\r\n } catch (error) {\r\n errorsDataService.catch(error);\r\n }\r\n }\r\n\r\n function autoSelectSingleProduct() {\r\n vm.selectedProduct = vm.availableProducts[0];\r\n productDropdownChanged();\r\n }\r\n\r\n function createAvailableRolesDataSource() {\r\n vm.availableRolesGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await maintainSystemRolesDataService.getSystemRolesNonPaged();\r\n response.data = response.data.filter(role => role.ProductID === vm.selectedProduct.ID);\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n if (template.Roles && template.Roles.length > 0) {\r\n template.Roles.forEach(tr => {\r\n response.data.forEach(r => {\r\n if (tr.Identifier === r.Identifier && tr.ProductName === r.ProductName && tr.TypeId === r.TypeID) {\r\n response.data.remove(r);\r\n }\r\n });\r\n });\r\n }\r\n vm.availableRoles = response.data;\r\n options.success(vm.availableRoles);\r\n } catch (error) {\r\n options.error(error);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function productDropdownChanged() {\r\n if (vm.availableRolesGridDataSource) {\r\n vm.availableRolesGridDataSource.read();\r\n } else {\r\n createAvailableRolesDataSource();\r\n }\r\n }\r\n\r\n async function addRole(role) {\r\n vm.addingRole = true;\r\n\r\n let postData = {\r\n RoleTemplateId: template.Id,\r\n SecurityRoleIdentifier: role.Identifier,\r\n };\r\n\r\n try {\r\n await roleTemplatesData.addRole(template.Id, postData);\r\n let addedRole = {\r\n Identifier: role.Identifier,\r\n Name: role.Name,\r\n ProductName: role.ProductName,\r\n TypeId: role.TypeID\r\n };\r\n template.Roles.push(addedRole);\r\n template.Roles = $filter('orderBy')(template.Roles, 'Name');\r\n await removeRoleFromGrid(role);\r\n vm.addingRole = false;\r\n } catch (error) {\r\n vm.addingRole = false;\r\n return;\r\n }\r\n\r\n }\r\n\r\n function removeRoleFromGrid(role) {\r\n let addedRole = vm.availableRolesGridDataSource._data.find(r => r.ID === role.ID && r.ProductID === role.ProductID && r.TypeID === role.TypeID);\r\n vm.availableRolesGridDataSource._data.remove(addedRole);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n}","import roleModalController from \"../RoleModal/roleModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, roleTemplatesData) {\r\n\r\n const vm = this;\r\n\r\n vm.openRoleModal = openRoleModal;\r\n vm.deleteRole = deleteRole;\r\n\r\n async function deleteRole(role) {\r\n vm.deleteProcessing = true;\r\n try {\r\n await roleTemplatesData.deleteRole(vm.template.Id, role.Identifier);\r\n const removedRole = vm.template.Roles.findIndex(r => r.Identifier === role.Identifier);\r\n await vm.template.Roles.splice(removedRole, 1);\r\n vm.deleteProcessing = false;\r\n } catch {\r\n vm.deleteProcessing = false;\r\n }\r\n }\r\n\r\n async function openRoleModal() {\r\n $uibModal.open({\r\n templateUrl: '/App/Components/RoleTemplates/RoleModal/roleModal.html',\r\n controller: roleModalController,\r\n controllerAs: 'rmvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n template: () => vm.template\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import roleTemplateRolesListController from \"./roleTemplateRolesList.controller\";\r\n\r\n/* roleTemplateRolesList.component.js */\r\n\r\n/**\r\n * @desc component for displaying and selecting roles associated with a role template\r\n * @example \r\n */\r\n\r\nconst roleTemplateRolesList = {\r\n bindings: {\r\n template: '<'\r\n },\r\n controller: roleTemplateRolesListController,\r\n controllerAs: 'rtrlvm',\r\n templateUrl: '/App/Components/RoleTemplates/AssociatedRolesList/roleTemplateRolesList.tmpl.html'\r\n};\r\n\r\nexport default roleTemplateRolesList;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, roleTemplatesData) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.dismiss = dismiss;\r\n vm.disableButton = false;\r\n vm.importRoleTemplates = importRoleTemplates;\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n function dismiss() { $uibModalInstance.dismiss(); }\r\n\r\n // Import Role Templates\r\n async function importRoleTemplates(file) {\r\n vm.importPending = new createSpinner();\r\n vm.disableButton = true;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n try {\r\n await roleTemplatesData.importRoleTemplates(fd);\r\n await helperService.successfulSaveButton(vm.importPending);\r\n cancel();\r\n } catch {\r\n vm.importPending.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, roleTemplatesData, helperService, roleTemplates, selectedTemplate) {\r\n\r\n const vm = this;\r\n\r\n vm.selectedTemplate = selectedTemplate;\r\n vm.cancel = cancel;\r\n vm.templateNamesMatch = templateNamesMatch;\r\n vm.submitForm = submitForm;\r\n\r\n if (selectedTemplate) {\r\n vm.selectedTemplate = selectedTemplate;\r\n vm.templateName = selectedTemplate.Name;\r\n }\r\n\r\n async function createRoleTemplate() {\r\n vm.loading = new createSpinner();\r\n let postData = { Name: vm.templateName };\r\n\r\n try {\r\n let response = await roleTemplatesData.createRoleTemplate(postData);\r\n let newTemplateId = response.data;\r\n await helperService.successfulSaveButton(vm.loading);\r\n vm.loading.loadingValue = false;\r\n $uibModalInstance.close(newTemplateId);\r\n } catch {\r\n vm.loading.loadingValue = false;\r\n }\r\n }\r\n\r\n function templateNamesMatch() {\r\n let match = roleTemplates.some(template => template.Name.toLowerCase() === vm.templateName.toLowerCase());\r\n if (match) {\r\n vm.roleTemplateForm.templateName.$setValidity('templateNameMatch', false);\r\n } else {\r\n vm.roleTemplateForm.templateName.$setValidity('templateNameMatch', true);\r\n }\r\n }\r\n\r\n async function renameRoleTemplate() {\r\n vm.loading = new createSpinner();\r\n\r\n let putData = {\r\n Name: vm.templateName,\r\n Id: vm.selectedTemplate.Id\r\n };\r\n\r\n try {\r\n await roleTemplatesData.renameRoleTemplate(putData.Id, putData);\r\n await helperService.successfulSaveButton(vm.loading);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.loading.loadingValue = false;\r\n }\r\n }\r\n\r\n function submitForm() {\r\n if (selectedTemplate) {\r\n renameRoleTemplate();\r\n\r\n } else {\r\n createRoleTemplate();\r\n }\r\n }\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport importRoleTemplatesController from \"../importRoleTemplates.controller\";\r\nimport roleTemplateModalController from \"../RoleTemplateModal/roleTemplateModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($filter, $uibModal, $scope, roleTemplatesData, helperService, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = () => getRoleTemplates();\r\n $scope.$on('ImportRoleTemplates', _ => getRoleTemplates());\r\n\r\n vm.openRoleTemplateModal = openRoleTemplateModal;\r\n vm.changeSelectedRoleTemplate = changeSelectedRoleTemplate;\r\n vm.openImportModal = openImportModal;\r\n vm.exportRoleTemplates = exportRoleTemplates;\r\n\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit',\r\n click: item => {\r\n openRoleTemplateModal(vm.roleTemplates, item.template);\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: item => {\r\n deleteRoleTemplate(item.template);\r\n }\r\n }\r\n ];\r\n\r\n async function getRoleTemplates(preselectedId) {\r\n // get role templates on initialization, set vm.roleTemplates to response\r\n // move newly created template to the top of the list and select\r\n vm.roleTemplatesLoading = true;\r\n let response = await roleTemplatesData.getRoleTemplates();\r\n if (response.data.length > 0) {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n if (preselectedId) {\r\n let roleTemplate = response.data.find(t => t.Id === preselectedId);\r\n response.data = response.data.filter(t => t.Id !== preselectedId);\r\n response.data.unshift(roleTemplate);\r\n changeSelectedRoleTemplate(roleTemplate);\r\n }\r\n }\r\n vm.roleTemplates = response.data;\r\n vm.roleTemplatesLoading = false;\r\n }\r\n\r\n function changeSelectedRoleTemplate(template) {\r\n vm.template = template;\r\n }\r\n\r\n async function deleteRoleTemplate(template) {\r\n vm.deletePending = true;\r\n try {\r\n await swal(helperService.areYouSureParamsWithHTML('Delete Role Template',\r\n `Are you sure you want to delete\r\n
${template.Name}?
\r\n
`, 'Yes', 'No'));\r\n await roleTemplatesData.deleteRoleTemplate(template.Id);\r\n if (vm.template && vm.template.Id === template.Id) {\r\n vm.template = null;\r\n }\r\n getRoleTemplates();\r\n vm.deletePending = false;\r\n } catch {\r\n vm.deletePending = false;\r\n }\r\n }\r\n\r\n async function openRoleTemplateModal(roleTemplates, selectedTemplate) {\r\n let roleTemplateModal = $uibModal.open({\r\n templateUrl: '/App/Components/RoleTemplates/RoleTemplateModal/roleTemplateModal.html',\r\n controller: roleTemplateModalController,\r\n controllerAs: 'rtmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n roleTemplates: () => roleTemplates,\r\n selectedTemplate: () => selectedTemplate\r\n }\r\n });\r\n\r\n try {\r\n let newTemplateId = await roleTemplateModal.result;\r\n getRoleTemplates(newTemplateId);\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function exportRoleTemplates() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n let response = await roleTemplatesData.exportRoleTemplates();\r\n helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(response.data, 'RoleTemplates.xlsx');\r\n vm.exportUpdatePending.loadingValue = false;\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function openImportModal() {\r\n let importModal = $uibModal.open({\r\n templateUrl: '/App/Components/RoleTemplates/importRoleTemplates.html',\r\n controller: importRoleTemplatesController,\r\n controllerAs: 'irtvm',\r\n backdrop: 'static',\r\n });\r\n try {\r\n await importModal.result;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","import roleTemplatesListController from \"./roleTemplatesList.controller\";\r\n\r\n/* roleTemplatesList.component.js */\r\n\r\n/**\r\n * @desc component for displaying and selecting role templates in a list\r\n * @example \r\n */\r\n\r\nconst roleTemplatesList = {\r\n bindings: {\r\n template: '='\r\n },\r\n controller: roleTemplatesListController,\r\n controllerAs: 'rtlvm',\r\n templateUrl: '/App/Components/RoleTemplates/RoleTemplatesList/roleTemplatesList.tmpl.html'\r\n};\r\n\r\nexport default roleTemplatesList;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\n\r\nexport default /*@ngInject*/ function (helperService, manageDataDataService, configurationDataService) {\r\n const vm = this;\r\n vm.helperService = helperService;\r\n vm.riskEligibleToggleChange = riskEligibleToggleChange;\r\n vm.submitIndirectAccessRiskEligible = submitIndirectAccessRiskEligible;\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n getConfiguration();\r\n }\r\n\r\n async function getConfiguration() {\r\n let { data } = await manageDataDataService.getConfigurationByProductId(vm.product.ID);\r\n\r\n vm.isEligible = data.find(config => config.Name === 'IndirectAccessRiskEligible').Value\r\n\r\n vm.riskEligible = vm.isEligible;\r\n }\r\n\r\n function riskEligibleToggleChange() {\r\n vm.disableSave = vm.isEligible === vm.riskEligible;\r\n }\r\n\r\n async function submitIndirectAccessRiskEligible() {\r\n let riskEligible = vm.riskEligible === '1';\r\n\r\n vm.updateRiskEligiblePending = new createSpinner();\r\n\r\n try {\r\n await configurationDataService.updateProductRiskEligibility(vm.product.Type, riskEligible);\r\n helperService.successfulSaveButton(vm.updateRiskEligiblePending);\r\n vm.disableSave = true;\r\n vm.isEligible = vm.riskEligible;\r\n }\r\n catch {\r\n vm.updateRiskEligiblePending.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n}","import riskEligibilityController from \"./riskEligibility.controller\";\r\n\r\n/* riskEligibility.component.js */\r\n\r\n/**\r\n * @desc component for configuring product risk eligibility in Identity Manager\r\n * @example \r\n */\r\n\r\nconst armProductRiskEligibility = {\r\n bindings: {\r\n product: '<'\r\n },\r\n controller: riskEligibilityController,\r\n controllerAs: 'revm',\r\n templateUrl: '/App/Components/Configuration/riskEligibility/riskEligibility.tmpl.html'\r\n};\r\n\r\nexport default armProductRiskEligibility;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, manageDataDataService) {\r\n const vm = this;\r\n\r\n vm.updateProductConfiguration = updateProductConfiguration;\r\n vm.configValueChange = configValueChange;\r\n vm.productConfig = {};\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n vm.productImageClass = helperService.setProductImageClass(vm.product.Type);\r\n await setProductConfiguration();\r\n vm.configValuesUnchanged = true;\r\n }\r\n\r\n async function setProductConfiguration() {\r\n let { data } = await manageDataDataService.getConfigurationByProductId(vm.product.ID);\r\n\r\n data.forEach(item => {\r\n vm.productConfig[item.Name] = item.Value;\r\n });\r\n\r\n vm.unchangedProductConfig = { ...vm.productConfig };\r\n }\r\n\r\n function configValueChange() {\r\n vm.configValuesUnchanged = angular.equals(vm.unchangedProductConfig, vm.productConfig);\r\n }\r\n\r\n async function updateProductConfiguration() {\r\n let putData = {\r\n \"Configurations\": [],\r\n \"ProductId\": vm.product.ID\r\n },\r\n configList = [{\r\n Name: \"SAP_S4CatalogValidation\",\r\n Encrypted: false\r\n }];\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n configList.forEach(item => {\r\n if (vm.productConfig[item.Name] !== vm.unchangedProductConfig[item.Name]) {\r\n putData.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": vm.productConfig[item.Name]\r\n });\r\n }\r\n });\r\n\r\n try {\r\n await manageDataDataService.setProductConfiguration(vm.product.ID, putData);\r\n vm.unchangedProductConfig = { ...vm.productConfig };\r\n configValueChange();\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n } catch {\r\n vm.updatePending.loadingValue = false\r\n }\r\n }\r\n}","/* armProductConfiguration.component.js */\r\n\r\nimport armProductConfigurationController from \"./armProductConfiguration.controller\";\r\n\r\n/**\r\n * @desc component for configuring product specific settings for Access Control\r\n * @example \r\n */\r\n\r\nconst armProductConfiguration = {\r\n bindings: {\r\n product: '<',\r\n },\r\n controller: armProductConfigurationController,\r\n controllerAs: 'apcvm',\r\n templateUrl: '/App/Components/Configuration/armProductConfiguration/armProductConfiguration.tmpl.html'\r\n};\r\n\r\nexport default armProductConfiguration;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, maintainSystemUsersDataService, helperService, user, modalType) {\r\n\r\n const vm = this;\r\n\r\n vm.dismiss = $uibModalInstance.dismiss;\r\n vm.saveUser = saveUser;\r\n vm.modalType = modalType;\r\n vm.importUsers = importUsers;\r\n vm.user = { ...user };\r\n\r\n //Save User\r\n async function saveUser() {\r\n vm.saving = new createSpinner();\r\n const putData = {\r\n \"Department\": vm.user.Department,\r\n \"BusinessUnit\": vm.user.BusinessUnit,\r\n \"Location\": vm.user.Location,\r\n \"JobTitle\": vm.user.JobTitle\r\n }\r\n\r\n try {\r\n await maintainSystemUsersDataService.updateUserIdentity(vm.user.ID, putData);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n\r\n // Import User\r\n async function importUsers(file) {\r\n vm.saving = new createSpinner();\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n try {\r\n await maintainSystemUsersDataService.importSystemUsers(fd);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close();\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n }\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, userRestrictionsDataService, maintainSystemUsersDataService, $filter, user) {\r\n\r\n const vm = this;\r\n\r\n vm.user = user;\r\n vm.selectUser = selectUser;\r\n vm.createUserMap = createUserMap;\r\n vm.deleteUserMap = deleteUserMap;\r\n vm.dismiss = $uibModalInstance.close;\r\n\r\n configureGrid();\r\n\r\n function configureGrid() {\r\n\r\n let gridColumns = [\r\n { field: \"UserLogonName\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Email\", title: \"Email\", filterable: customAutoCompleteFilter },\r\n { template: ``, title: \"\", width: 25, filterable: false }\r\n ];\r\n\r\n vm.gridOptions = helperService.setMainGridOptions(gridColumns, 300);\r\n\r\n vm.gridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let { data } = await userRestrictionsDataService.getFastpathUsers();\r\n if (!user.FpUserName) {\r\n vm.suggestion = data.find(u => u.Email === user.Email);\r\n }\r\n data = $filter('orderBy')(data, 'UserLogonName');\r\n options.success(data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function selectUser(user) { vm.selectedUser = user; }\r\n\r\n async function createUserMap(dataItem) {\r\n kendo.ui.progress(vm.systemUsersGrid.element, true);\r\n vm.fastpathUser = dataItem;\r\n let map = {};\r\n\r\n map.FpUserId = vm.fastpathUser.UserID;\r\n map.UserMasterId = user.ID;\r\n\r\n try {\r\n await maintainSystemUsersDataService.createUserMap(map);\r\n kendo.ui.progress(vm.systemUsersGrid.element, false);\r\n // Bind to parent list item immediately to reflect modal change\r\n user.FpUserName = vm.fastpathUser.UserLogonName;\r\n user.FpUserId = vm.fastpathUser.UserID;\r\n } catch {\r\n kendo.ui.progress(vm.systemUsersGrid.element, false);\r\n }\r\n\r\n }\r\n\r\n async function deleteUserMap() {\r\n vm.deleting = new createSpinner();\r\n try {\r\n await maintainSystemUsersDataService.deleteUserMap(vm.user.FpUserId, vm.user.ID);\r\n vm.deleting.loadingValue = false;\r\n // Bind to parent list item immediately to reflect modal change\r\n user.FpUserName = null;\r\n user.FpUserId = null;\r\n } catch {\r\n vm.deleting.loadingValue = false;\r\n }\r\n\r\n }\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport editImportUserModalController from \"./editImportUsersModal/editImportUserModal.controller\";\r\nimport systemUserMappingModalController from \"./systemUserMappingModal/systemUserMappingModal.controller\";\r\n\r\nexport default /*@ngInject*/ function (maintainSystemUsersDataService, helperService, $uibModal, $filter, $scope, FileSaver) {\r\n\r\n const vm = this;\r\n\r\n vm.openEditImportModal = openEditImportModal;\r\n vm.openSystemUserMappingModal = openSystemUserMappingModal;\r\n vm.exportSystemUsers = exportSystemUsers;\r\n vm.generateAssignments = generateAssignments;\r\n\r\n $scope.$on('AutoMapFastpathToSystemUsers', (event, args) => vm.systemUsersGridDataSource.read());\r\n\r\n configureSystemUsersGrid();\r\n\r\n async function configureSystemUsersGrid() {\r\n const systemUsersGridColumns = [\r\n { field: \"Name\", title: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Email\", title: \"Email\", filterable: customAutoCompleteFilter },\r\n { field: \"Department\", title: \"Department\", filterable: customAutoCompleteFilter },\r\n { field: \"JobTitle\", title: \"Job Title\", filterable: customAutoCompleteFilter },\r\n { field: \"Location\", title: \"Location\", filterable: customAutoCompleteFilter },\r\n { field: \"BusinessUnit\", title: \"Business Unit\", filterable: customAutoCompleteFilter },\r\n { field: \"PrimarySystemUserId\", title: \"Primary System User ID\", filterable: customAutoCompleteFilter },\r\n { field: \"PrimarySystemProduct\", title: \"Primary System Product\", filterable: customAutoCompleteFilter },\r\n { template: `Edit`, \"title\": \"Edit\", width: 90 },\r\n { field: \"FpUserMappingStatus\", title: \"Mapping Status\", filterable: customAutoCompleteFilter },\r\n { field: \"FpUserName\", title: \"Mapped to\", filterable: customAutoCompleteFilter },\r\n { template: `System User Mapping`, \"title\": \"System User Mapping\", width: 150 }\r\n ];\r\n\r\n vm.systemUsersGridOptions = helperService.setMainGridOptions(systemUsersGridColumns, 600);\r\n vm.systemUsersGridOptions.autoBind = false;\r\n\r\n vm.systemUsersGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n transport: {\r\n read: async options => {\r\n try {\r\n let { data } = await maintainSystemUsersDataService.getMasterUsers();\r\n data = $filter('orderBy')(data, 'Name');\r\n options.success(data);\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n\r\n await vm.systemUsersGridDataSource.read();\r\n }\r\n\r\n async function openEditImportModal(user, modalType) {\r\n\r\n const editImportModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainSystemUsers/editImportUsersModal/editImportUsersModal.tmpl.html',\r\n controller: editImportUserModalController,\r\n controllerAs: 'eiumvm',\r\n backdrop: 'static',\r\n resolve: {\r\n user: () => user,\r\n modalType: () => modalType\r\n }\r\n });\r\n try {\r\n await editImportModal.result;\r\n vm.systemUsersGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function openSystemUserMappingModal(user) {\r\n\r\n const mappingModal = $uibModal.open({\r\n templateUrl: '/App/Components/maintainSystemUsers/systemUserMappingModal/systemUserMappingModal.html',\r\n controller: systemUserMappingModalController,\r\n controllerAs: 'summvm',\r\n backdrop: 'static',\r\n size: 'lg',\r\n resolve: {\r\n user: () => user\r\n }\r\n });\r\n try {\r\n await mappingModal.result;\r\n vm.systemUsersGridDataSource.read();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function exportSystemUsers() {\r\n vm.exportUpdatePending = new createSpinner();\r\n try {\r\n let { data } = await maintainSystemUsersDataService.exportSystemUsers();\r\n await helperService.successfulSaveButton(vm.exportUpdatePending);\r\n FileSaver.saveAs(data, 'UserIdentities.xlsx');\r\n } catch {\r\n vm.exportUpdatePending.loadingValue = false;\r\n }\r\n }\r\n\r\n async function generateAssignments() {\r\n vm.generatingAssignments = true;\r\n await maintainSystemUsersDataService.generateAssignments();\r\n vm.generatingAssignments = false;\r\n }\r\n}","/* maintainSystemUsersGrid.component.js */\r\n\r\nimport maintainSystemUsersGridController from \"./maintainSystemUsersGrid.controller\";\r\n\r\n/**\r\n * @desc component to display grid to view, import and export System Users\r\n * @example \r\n */\r\n\r\nconst maintainSystemUsersGrid = {\r\n controller: maintainSystemUsersGridController,\r\n controllerAs: 'msugvm',\r\n template: `\r\n
\r\n
\r\n
\r\n
\r\n
System Users
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
`\r\n};\r\n\r\nexport default maintainSystemUsersGrid;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\nimport { configurationOptions } from \"../configOptions\";\r\n\r\nexport default /*@ngInject*/ function (helperService, $filter, manageDataDataService, supervisorAssignmentsDataService) {\r\n const vm = this;\r\n\r\n vm.updateProductConfiguration = updateProductConfiguration;\r\n vm.productConfigValueChange = productConfigValueChange;\r\n vm.updatedProducts = [];\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n vm.unChangedAutoMapConfig = { ...vm.autoMapConfig };\r\n vm.products = await getNewProductProps(vm.products);\r\n vm.propsLoading = false;\r\n }\r\n\r\n function getNewProductProps(products) {\r\n vm.propsLoading = true;\r\n const promises = products.map(async product => {\r\n return {\r\n ...product,\r\n systemFields: await getSystemFields(product),\r\n logo: helperService.setProductImageClass(product.Type),\r\n configuration: await getProductConfiguration(product),\r\n unChangedConfiguration: await getProductConfiguration(product),\r\n configValuesUnchanged: true\r\n }\r\n });\r\n return Promise.all(promises);\r\n }\r\n\r\n async function getSystemFields(product) {\r\n const { data: universalFields } = await supervisorAssignmentsDataService.getUniversalMappingFields(),\r\n { data: productSpecificFields } = await supervisorAssignmentsDataService.getProductMappingFields(product.Type);\r\n\r\n return $filter('orderBy')(universalFields.concat(productSpecificFields), 'DisplayName');\r\n }\r\n\r\n async function getProductConfiguration(product) {\r\n const configuration = {},\r\n { data } = await manageDataDataService.getConfigurationByProductId(product.ID);\r\n\r\n data.forEach(item => {\r\n configuration[item.Name] = item.Value;\r\n });\r\n\r\n return configuration;\r\n }\r\n\r\n function productConfigValueChange(product) {\r\n product.configValuesUnchanged = angular.equals(product.unChangedConfiguration, product.configuration);\r\n vm.updatedProducts = vm.products.filter(app => !app.configValuesUnchanged);\r\n }\r\n\r\n async function updateProductConfiguration() {\r\n vm.updatePending = new createSpinner();\r\n\r\n if (vm.unChangedAutoMapConfig[0] !== vm.autoMapConfig) {\r\n await helperService.setConfigurationValue('AutoMapCrossPlatformUsersAfterImport', vm.autoMapConfig);\r\n }\r\n\r\n vm.updatedProducts.forEach(async product => {\r\n let putData = {\r\n \"Configurations\": [],\r\n \"ProductId\": product.ID\r\n };\r\n\r\n if (product.configuration.AutoMappingSystemFieldId !== product.unChangedConfiguration.AutoMappingSystemFieldId) {\r\n putData.Configurations.push({\r\n \"Name\": 'AutoMappingSystemFieldId',\r\n \"Value\": product.configuration.AutoMappingSystemFieldId\r\n });\r\n }\r\n await manageDataDataService.setProductConfiguration(product.ID, putData);\r\n product.unChangedConfiguration = { ...product.configuration };\r\n productConfigValueChange(product);\r\n });\r\n\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n vm.xplatConfigForm.$setPristine();\r\n }\r\n}","/* systemConfigProductConfiguration.component.js */\r\n\r\nimport systemConfigProductConfigurationController from \"./systemConfigProductConfiguration.controller\";\r\n\r\n/**\r\n * @desc component for configuring product specific settings for System Configuration\r\n * @example \r\n */\r\n\r\nconst systemConfigProductConfiguration = {\r\n bindings: {\r\n products: '<',\r\n autoMapConfig: '<'\r\n },\r\n controller: systemConfigProductConfigurationController,\r\n controllerAs: 'scpcvm',\r\n templateUrl: '/App/Components/Configuration/systemConfigProductConfiguration/systemConfigProductConfiguration.tmpl.html'\r\n};\r\n\r\nexport default systemConfigProductConfiguration;","/* userFieldMappings.component.js */\r\n\r\n/**\r\n * @desc component for viewing, creating, editing, and removing mappings for auto generation of Cross Platform Users\r\n * @example \r\n */\r\n\r\nconst userFieldMappings = {\r\n controller: userFieldMappingsController,\r\n controllerAs: 'ufmvm',\r\n template: `\r\n
\r\n
\r\n
\r\n User Field Mappings\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
Fastpath Primary System
\r\n
\r\n
\r\n
\r\n
{{ufmvm.primarySystemProductName}}
\r\n
\r\n
\r\n
\r\n
\r\n
System User Mappings
\r\n
\r\n
\r\n
\r\n
\r\n Enable Auto Map Cross Platform Users After Import to view and edit Product System User Mapping fields\r\n
\r\n
\r\n
\r\n
`\r\n};\r\n\r\n/*@ngInject*/ function userFieldMappingsController(crossPlatformUsersDataService, helperService, dataService) {\r\n\r\n const vm = this;\r\n\r\n vm.generateAssignments = generateAssignments;\r\n vm.helperService = helperService;\r\n\r\n vm.$onInit = activate;\r\n\r\n async function activate() {\r\n vm.primarySystem = await helperService.getConfigurationValue('PrimarySystem');\r\n vm.autoMapXplatEnabled = await helperService.getConfigurationValue('AutoMapCrossPlatformUsersAfterImport');\r\n getProducts();\r\n }\r\n\r\n async function generateAssignments() {\r\n vm.generatingAssignments = true;\r\n await crossPlatformUsersDataService.generateCrossPlatformAutoMapping();\r\n vm.generatingAssignments = false;\r\n }\r\n\r\n async function getProducts() {\r\n let { data } = await dataService.getProducts();\r\n vm.productsDataSource = data;\r\n vm.primarySystemProductName = vm.productsDataSource.find(product => product.Type === vm.primarySystem).Name;\r\n }\r\n}\r\n\r\nexport default userFieldMappings;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (manageDataDataService, helperService, $uibModalInstance, systemFields, product, selectedFieldId) {\r\n\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.configValueChange = configValueChange;\r\n vm.updateProductConfiguration = updateProductConfiguration;\r\n\r\n vm.systemFields = systemFields;\r\n vm.selectedFieldId = selectedFieldId;\r\n vm.originalFieldId = selectedFieldId;\r\n vm.product = product;\r\n\r\n function configValueChange() {\r\n vm.valueChanged = vm.originalFieldId !== vm.selectedFieldId;\r\n }\r\n\r\n async function updateProductConfiguration() {\r\n let putData = {\r\n Configurations: [{\r\n Name: 'AutoMappingSystemFieldId',\r\n Value: vm.selectedFieldId\r\n }],\r\n ProductId: vm.product.ID\r\n }\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n try {\r\n await manageDataDataService.setProductConfiguration(vm.product.ID, putData);\r\n configValueChange();\r\n await helperService.successfulSaveButton(vm.updatePending);\r\n close(vm.selectedFieldId);\r\n } catch {\r\n vm.updatePending.loadingValue = false\r\n }\r\n }\r\n\r\n function close(fieldId) {\r\n $uibModalInstance.close(fieldId);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","/* systemUserProductMappings.component.js */\r\n\r\nimport editSystemUserMappingModalController from \"./editSystemUserMappingModal.controller\";\r\n\r\n/**\r\n * @desc component for viewing, creating, editing, and removing mappings for auto generation of Cross Platform Users\r\n * @example \r\n */\r\n\r\nconst systemUserProductMappings = {\r\n controller: systemUserProductMappingsController,\r\n controllerAs: 'supmvm',\r\n bindings: {\r\n product: '<'\r\n },\r\n template: `\r\n
\r\n \r\n
\r\n
\r\n
{{ supmvm.product.Name }}
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
System User Mapping Field:
\r\n
{{supmvm.selectedField ? supmvm.selectedField.DisplayName : 'No System Mapping Field'}}
\r\n
\r\n
\r\n \r\n
`\r\n};\r\n\r\n/*@ngInject*/ function systemUserProductMappingsController(supervisorAssignmentsDataService, manageDataDataService, helperService, $filter, $uibModal) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = activate;\r\n\r\n vm.openEditMappingModal = openEditMappingModal;\r\n\r\n async function activate() {\r\n vm.selectedFieldId = await getSelectedFieldId('AutoMappingSystemFieldId');\r\n await setSystemFields();\r\n vm.productImageClass = helperService.setProductImageClass(vm.product.Type);\r\n }\r\n\r\n async function getSelectedFieldId(name) {\r\n let { data } = await manageDataDataService.getConfigurationByProductId(vm.product.ID);\r\n return data.find(item => item.Name === name)?.Value;\r\n }\r\n\r\n async function setSystemFields() {\r\n const { data: universalFields } = await supervisorAssignmentsDataService.getUniversalMappingFields(),\r\n { data: productSpecificFields } = await supervisorAssignmentsDataService.getProductMappingFields(vm.product.Type);\r\n\r\n vm.systemFields = universalFields.concat(productSpecificFields);\r\n vm.systemFields = $filter('orderBy')(vm.systemFields, 'DisplayName');\r\n\r\n vm.selectedField = vm.systemFields.find(fieldId => fieldId.Id === vm.selectedFieldId);\r\n }\r\n\r\n async function openEditMappingModal() {\r\n let mappingModal = $uibModal.open({\r\n templateUrl: '/App/Components/CrossPlatformUsers/userFieldMappings/editSystemUserMappingModal.tmpl.html',\r\n controller: editSystemUserMappingModalController,\r\n controllerAs: 'esummvm',\r\n backdrop: 'static',\r\n resolve: {\r\n product: () => vm.product,\r\n systemFields: () => vm.systemFields,\r\n selectedFieldId: () => vm.selectedFieldId\r\n }\r\n });\r\n\r\n try {\r\n vm.selectedFieldId = await mappingModal.result;\r\n vm.selectedField = vm.systemFields.find(fieldId => fieldId.Id === vm.selectedFieldId);\r\n } catch {}\r\n }\r\n\r\n}\r\n\r\nexport default systemUserProductMappings;","import angular from 'angular';\r\n\r\n// module imports\r\nimport ownershipGroupsModule from './ownershipGroups.module';\r\nimport requesterGroupsModule from './requesterGroups.module';\r\nimport supervisorAssignmentsModule from './supervisorAssignments.module';\r\nimport systemConfigurationFactoriesModule from './systemConfiguration.factories.module';\r\nimport systemConfigurationSetupModule from './systemConfiguration.setup.module';\r\nimport userRestrictionsModule from './userRestrictions.module';\r\n\r\n// controller / component imports\r\nimport approvalGroups from '../Components/ApprovalGroups/approvalGroups.component';\r\nimport companyMapping from '../Components/CompanyMapping/companyMapping.component';\r\nimport companyTemplateCompaniesList from '../Components/CompanyTemplates/AssociatedCompaniesList/companyTemplateCompaniesList.component';\r\nimport companyTemplates from '../Components/CompanyTemplates/companyTemplates.component';\r\nimport companyTemplatesList from '../Components/CompanyTemplates/CompanyTemplatesList/companyTemplatesList.component';\r\nimport configuration from '../Components/configuration/configuration.component';\r\nimport reportManagement from '../Components/configuration/reportManagement/reportManagement.component';\r\nimport identityManagerCuaConnectionConfiguration from '../Components/configuration/identityManagerConfigTab/CuaConnectionConfiguration/cuaConnectionConfiguration.component';\r\nimport identityManagerConfigTab from '../Components/Configuration/identityManagerConfigTab/identityManagerConfigTab.component';\r\nimport identityManagerProductConfiguration from '../Components/configuration/identityManagerConfigTab/productConfiguration/productConfiguration.component';\r\nimport identityManagerProductProvisioning from '../Components/configuration/identityManagerConfigTab/ProductProvisioning/productProvisioning.component';\r\nimport crossPlatformUsers from '../Components/CrossPlatformUsers/crossPlatformUsers.component';\r\nimport maintainSystemRoles from '../Components/maintainSystemRoles/maintainSystemRoles.component';\r\nimport notifications from '../Components/Notifications/notifications.component';\r\nimport notificationTypesList from '../Components/Notifications/NotificationTypesList/notificationTypesList.component';\r\nimport roleTemplateRolesList from '../Components/RoleTemplates/AssociatedRolesList/roleTemplateRolesList.component';\r\nimport roleTemplates from '../Components/RoleTemplates/roleTemplates.component';\r\nimport roleTemplatesList from '../Components/RoleTemplates/RoleTemplatesList/roleTemplatesList.component';\r\nimport armProductRiskEligibility from '../Components/Configuration/riskEligibility/riskEligibility.component';\r\nimport armProductConfiguration from '../Components/Configuration/armProductConfiguration/armProductConfiguration.component';\r\nimport maintainSystemUsers from '../Components/maintainSystemUsers/maintainSystemUsers.component';\r\nimport maintainSystemUsersGrid from '../Components/maintainSystemUsers/maintainSystemUsersGrid.component';\r\nimport systemConfigProductConfiguration from '../Components/configuration/systemConfigProductConfiguration/systemConfigProductConfiguration.component';\r\nimport userFieldMappings from '../Components/CrossPlatformUsers/userFieldMappings/userFieldMappings.component';\r\nimport systemUserProductMappings from '../Components/CrossPlatformUsers/userFieldMappings/systemUserProductMappings.component';\r\n\r\n\r\nexport default angular\r\n .module('app.systemConfiguration', [ownershipGroupsModule, requesterGroupsModule, supervisorAssignmentsModule, userRestrictionsModule, systemConfigurationFactoriesModule, systemConfigurationSetupModule])\r\n .component('approvalGroups', approvalGroups)\r\n .component('companyTemplates', companyTemplates)\r\n .component('companyTemplatesList', companyTemplatesList)\r\n .component('companyTemplateCompaniesList', companyTemplateCompaniesList)\r\n .component('companyMapping', companyMapping) /*NEEDS RENAMED*/\r\n .component(\"crossPlatformUsers\", crossPlatformUsers)\r\n .component(\"maintainSystemRoles\", maintainSystemRoles)\r\n .component('notifications', notifications)\r\n .component('notificationTypesList', notificationTypesList)\r\n .component('roleTemplates', roleTemplates)\r\n .component('roleTemplatesList', roleTemplatesList)\r\n .component('roleTemplateRolesList', roleTemplateRolesList)\r\n .component(\"configuration\", configuration)\r\n .component('reportManagement', reportManagement)\r\n .component('identityManagerConfigTab', identityManagerConfigTab)\r\n .component('identityManagerProductConfiguration', identityManagerProductConfiguration)\r\n .component('identityManagerProductProvisioning', identityManagerProductProvisioning)\r\n .component('identityManagerCuaConnectionConfiguration', identityManagerCuaConnectionConfiguration)\r\n .component('armProductRiskEligibility', armProductRiskEligibility)\r\n .component('armProductConfiguration', armProductConfiguration)\r\n .component('maintainSystemUsers', maintainSystemUsers)\r\n .component('maintainSystemUsersGrid', maintainSystemUsersGrid)\r\n .component('systemConfigProductConfiguration', systemConfigProductConfiguration)\r\n .component('userFieldMappings', userFieldMappings)\r\n .component('systemUserProductMappings', systemUserProductMappings)\r\n .name;","import companyTemplatesController from \"./companyTemplates.controller\";\r\n\r\nvar companyTemplates = {\r\n bindings: {\r\n template: '<'\r\n },\r\n controller: companyTemplatesController,\r\n controllerAs: 'ctvm',\r\n templateUrl: '/App/Components/CompanyTemplates/companyTemplates.tmpl.html'\r\n};\r\n\r\nexport default companyTemplates;","export default function () {\r\n const vm = this;\r\n vm.selectedTemplateChanged = selectedTemplateChanged;\r\n\r\n function selectedTemplateChanged(template) {\r\n vm.template = template;\r\n }\r\n}","import roleTemplatesController from \"./roleTemplates.controller\";\r\n\r\n/* roleTemplates.component.js */\r\n\r\n/**\r\n * @desc component for displaying role template associated components and modals\r\n * @example \r\n */\r\n\r\nvar roleTemplates = {\r\n bindings: {\r\n template: '='\r\n },\r\n controller: roleTemplatesController,\r\n controllerAs: 'rtvm',\r\n templateUrl: '/App/Components/RoleTemplates/roleTemplates.tmpl.html'\r\n};\r\n\r\nexport default roleTemplates;","export default /*@ngInject*/ function () {\r\n const vm = this;\r\n vm.template;\r\n}","/* maintainSystemUsers.component.js */\r\n\r\n/**\r\n * @desc component to display Maintain System Users place\r\n * @example \r\n */\r\n\r\nconst maintainSystemUsers = {\r\n template: `\r\n `\r\n};\r\n\r\nexport default maintainSystemUsers;","export default /*@ngInject*/ function ($http, helperService, configurationDataService, connectionsDataService) {\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.supportedPlugins = [];\r\n vm.disabledPlugins = [];\r\n vm.config = {};\r\n vm.origConfig = {};\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await setPlugins();\r\n await setConfig();\r\n await setHybridConnections;\r\n }\r\n\r\n async function setPlugins() {\r\n const { data } = await $http.get(apiUrl + 'api/core/plugins');\r\n\r\n data.forEach(row => {\r\n vm.supportedPlugins.push(row);\r\n });\r\n\r\n vm.disabledPlugins = data.filter(plugin => !plugin.Active);\r\n }\r\n\r\n async function setConfig() {\r\n const { data } = await configurationDataService.getConfigurationValues();\r\n var config = {};\r\n\r\n data.forEach(function (row) {\r\n config[row.Name] = row.Value;\r\n });\r\n\r\n //Hard-code encrypted\r\n config['JIRA_Password'] = 'password';\r\n config['ZDK_Token'] = 'password';\r\n config['AAD_ClientSecret'] = 'password';\r\n config['SNOW_Password'] = 'password';\r\n config['WORKIVA_ClientSecret'] = 'password';\r\n config['FRESHSERVICE_Password'] = 'password';\r\n config['AUDITBOARD_Password'] = 'password';\r\n config['ALA_ClientSecret'] = 'password';\r\n vm.config = JSON.parse(JSON.stringify(config));\r\n vm.origConfig = JSON.parse(JSON.stringify(config));\r\n }\r\n\r\n async function setHybridConnections() {\r\n const { data } = await connectionsDataService.getHybridConnections();\r\n\r\n vm.hybridConnectionsArray = data;\r\n }\r\n}","import controller from \"./plugins.controller\";\r\n\r\n/* plugins.component.js */\r\n\r\n/**\r\n * @desc component for plugins\r\n * @example \r\n */\r\n\r\nconst plugins = {\r\n controller: controller,\r\n controllerAs: 'pvm',\r\n templateUrl: '/App/Components/Plugins/plugins.tmpl.html'\r\n};\r\n\r\nexport default plugins;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, helperService, configurationDataService) {\r\n var vm = this;\r\n\r\n vm.submit = submit;\r\n vm.configValuesHaveChanged = configValuesHaveChanged;\r\n vm.updateConfigurationSetting = updateConfigurationSetting;\r\n\r\n vm.$onInit = activate;\r\n\r\n function activate() {\r\n vm.plugin = Object.merge(vm.plugin, getPlugin(vm.plugin.Name));\r\n }\r\n\r\n function submit() {\r\n updateConfigurationSetting(vm.plugin.configOptions, vm.config, vm.origConfig);\r\n };\r\n\r\n function configValuesHaveChanged() {\r\n return helperService.returnTrueIfValuesDiffer(vm.plugin.configOptions.map(item => item.Name), vm.origConfig, vm.config);\r\n };\r\n\r\n async function updateConfigurationSetting(configOptions, value, origVal) {\r\n let putData = {\r\n \"Configurations\": []\r\n };\r\n\r\n configOptions.forEach(item => {\r\n if (item.Encrypted === true) {\r\n if (value[item.Name] != \"password\") {\r\n putData.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n } else {\r\n if (value[item.Name] != origVal[item.Name]) {\r\n putData.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n }\r\n });\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n try {\r\n await configurationDataService.updateConfigurationValues(putData);\r\n\r\n putData.Configurations.forEach(function (config) {\r\n origVal[config.Name] = config.Value;\r\n });\r\n\r\n helperService.successfulSaveButton(vm.updatePending);\r\n\r\n $rootScope.reloadConfigurationValues();\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n };\r\n}\r\n\r\nfunction getPlugin(name) {\r\n const plugins = [{\r\n name: \"Active Directory\",\r\n key: \"AD\",\r\n logoClass: \"active-directory-avatar-logo\",\r\n configOptions: [\r\n { Name: \"AD_HostName\", Encrypted: false },\r\n { Name: \"AD_Active\", Encrypted: false },\r\n { Name: \"AD_Port\", Encrypted: false }\r\n ]\r\n }, {\r\n name: \"AuditBoard\",\r\n key: \"AUDITBOARD\",\r\n logoClass: \"auditboard-avatar-logo\",\r\n configOptions: [\r\n { Name: \"AUDITBOARD_Url\", Encrypted: false },\r\n { Name: \"AUDITBOARD_Password\", Encrypted: false },\r\n { Name: \"AUDITBOARD_Active\", Encrypted: false }\r\n ]\r\n }, {\r\n name: \"Entra ID\",\r\n key: \"AAD\",\r\n logoClass: \"azure-active-directory-avatar-logo\",\r\n configOptions: [\r\n { Name: \"AAD_ClientId\", Encrypted: false },\r\n { Name: \"AAD_ClientSecret\", Encrypted: true },\r\n { Name: \"AAD_TenantId\", Encrypted: false },\r\n { Name: \"AAD_Active\", Encrypted: false }\r\n ]\r\n }, {\r\n name: \"Azure Log Analytics\",\r\n key: \"ALA\",\r\n logoClass: \"ala-avatar-logo\",\r\n configOptions: [\r\n { Name: \"ALA_ClientId\", Encrypted: false },\r\n { Name: \"ALA_ClientSecret\", Encrypted: true },\r\n { Name: \"ALA_TenantId\", Encrypted: false },\r\n { Name: \"ALA_Active\", Encrypted: false }\r\n ]\r\n }, {\r\n name: \"Freshservice\",\r\n key: \"FRESHSERVICE\",\r\n logoClass: \"freshservice-avatar-logo\",\r\n configOptions: [\r\n { Name: \"FRESHSERVICE_Email\", Encrypted: false },\r\n { Name: \"FRESHSERVICE_Url\", Encrypted: false },\r\n { Name: \"FRESHSERVICE_Active\", Encrypted: false },\r\n { Name: \"FRESHSERVICE_Password\", Encrypted: true }\r\n ]\r\n }, {\r\n name: \"Jira\",\r\n key: \"JIRA\",\r\n logoClass: \"jira-avatar-logo\",\r\n configOptions: [\r\n { Name: \"JIRA_Email\", Encrypted: false },\r\n { Name: \"JIRA_Url\", Encrypted: false },\r\n { Name: \"JIRA_Active\", Encrypted: false },\r\n { Name: \"JIRA_Password\", Encrypted: true }\r\n ]\r\n }, {\r\n name: \"ServiceNow\",\r\n key: \"SNOW\",\r\n logoClass: \"service-now-avatar-logo\",\r\n configOptions: [\r\n { Name: \"SNOW_User\", Encrypted: false },\r\n { Name: \"SNOW_Url\", Encrypted: false },\r\n { Name: \"SNOW_Active\", Encrypted: false },\r\n { Name: \"SNOW_Password\", Encrypted: true }\r\n ]\r\n }, {\r\n name: \"Workiva\",\r\n logoClass: \"workiva-avatar-logo\",\r\n key: \"WORKIVA\",\r\n configOptions: [\r\n { Name: \"WORKIVA_AccountId\", Encrypted: false },\r\n { Name: \"WORKIVA_Active\", Encrypted: false },\r\n { Name: \"WORKIVA_ClientId\", Encrypted: false },\r\n { Name: \"WORKIVA_ClientSecret\", Encrypted: false },\r\n { Name: \"WORKIVA_ControlsReportId\", Encrypted: false },\r\n { Name: \"WORKIVA_BaseUrl\", Encrypted: false }\r\n ]\r\n }, {\r\n name: \"Zendesk\",\r\n key: \"ZDK\",\r\n logoClass: \"zendesk-avatar-logo\",\r\n configOptions: [\r\n { Name: \"ZDK_Email\", Encrypted: false },\r\n { Name: \"ZDK_Url\", Encrypted: false },\r\n { Name: \"ZDK_Active\", Encrypted: false },\r\n { Name: \"ZDK_Token\", Encrypted: true }\r\n ]\r\n }];\r\n\r\n return plugins.find(item => item.name === name);\r\n}\r\n","import controller from \"./plugin.controller\";\r\n\r\n/* plugin.component.js */\r\n\r\n/**\r\n * @desc component for a plugin\r\n * @example \r\n */\r\n\r\nconst plugin = {\r\n bindings: {\r\n plugin: '<',\r\n config: '<',\r\n origConfig: '<',\r\n radioSelected: '<',\r\n updatePending: '<'\r\n },\r\n controller: controller,\r\n controllerAs: 'pvm',\r\n templateUrl: '/App/Components/Plugins/plugin/plugin.tmpl.html'\r\n};\r\n\r\nexport default plugin;","import angular from 'angular';\r\nimport plugins from '../Components/Plugins/plugins.component';\r\nimport plugin from '../Components/Plugins/plugin/plugin.component';\r\n\r\nexport default angular\r\n .module('app.integrations.plugins', [])\r\n .component(\"plugins\", plugins)\r\n .component(\"plugin\", plugin)\r\n .name;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($http, $uibModalInstance, apiClient, apiClientDataService, helperService, dataService) {\r\n const vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n vm.availableRolesDataSource = [];\r\n vm.createApiClient = createApiClient;\r\n vm.cancel = cancel;\r\n vm.savingApiClient = false;\r\n vm.apiClientFormSubmit = apiClientFormSubmit;\r\n\r\n vm.apiClient = Object.assign({}, apiClient);\r\n vm.apiClient.Active = vm.apiClient.Active !== undefined ? vm.apiClient.Active : true;\r\n\r\n async function init() {\r\n\r\n let response;\r\n vm.rolesDropdownLoading = true;\r\n\r\n try {\r\n response = await dataService.getRoles();\r\n vm.availableRolesDataSource = response.data;\r\n\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n vm.rolesDropdownLoading = false;\r\n }\r\n\r\n function apiClientFormSubmit() {\r\n vm.disableSubmit = true;\r\n if (vm.apiClient.AdmUserId) {\r\n updateApiClient();\r\n } else {\r\n createApiClient();\r\n }\r\n }\r\n\r\n async function createApiClient() {\r\n vm.savingApiClient = new createSpinner();\r\n\r\n try {\r\n const roleIds = [];\r\n if (vm.apiClient.Roles && vm.apiClient.Roles.length > 0) {\r\n for (var i = 0; i < vm.apiClient.Roles.length; i++) {\r\n roleIds.push(vm.apiClient.Roles[i].ID);\r\n }\r\n }\r\n\r\n const payload = {\r\n \"Name\": vm.apiClient.Name,\r\n \"ActivateUponCreation\": vm.apiClient.Active,\r\n \"RoleIds\": roleIds\r\n };\r\n\r\n let response = await apiClientDataService.createApiClient(payload);\r\n\r\n await helperService.successfulSaveButton(vm.savingApiClient);\r\n vm.disableSubmit = false;\r\n close(response.data);\r\n } catch (_) {\r\n vm.savingApiClient.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n async function updateApiClient() {\r\n vm.savingApiClient = new createSpinner();\r\n\r\n try {\r\n const roleIds = [];\r\n for (var i = 0; i < vm.apiClient.Roles.length; i++) {\r\n roleIds.push(vm.apiClient.Roles[i].ID);\r\n }\r\n\r\n const payload = {\r\n \"Name\": vm.apiClient.Name,\r\n \"Active\": vm.apiClient.Active,\r\n \"RoleIds\": roleIds\r\n };\r\n\r\n await apiClientDataService.updateApiClient(vm.apiClient.AdmUserId, payload);\r\n await helperService.successfulSaveButton(vm.savingApiClient);\r\n close();\r\n vm.disableSubmit = false;\r\n } catch (_) {\r\n vm.savingApiClient.loadingValue = false;\r\n vm.disableSubmit = false;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n function close(updatedOrCreatedId) {\r\n $uibModalInstance.close(updatedOrCreatedId);\r\n }\r\n}","import newApiClientController from \"./newApiClientModal.controller\";\r\nimport swal from \"sweetalert2\";\r\n\r\nexport default /*@ngInject*/ function ($http, $uibModal, $scope, dataService, apiClientDataService, helperService) {\r\n const vm = this;\r\n\r\n vm.openApiClientModal = openApiClientModal;\r\n\r\n vm.apiClients = [];\r\n vm.loadRoles = loadRoles;\r\n vm.changeApiClientRowSelected = changeApiClientRowSelected;\r\n vm.generateSecret = generateSecret;\r\n vm.changeInputType = changeInputType;\r\n vm.listApiClients = listApiClients;\r\n vm.deleteApiClient = deleteApiClient;\r\n vm.updateSecretStatus = updateSecretStatus;\r\n vm.deleteSecret = deleteSecret;\r\n vm.copyTextToClipboard = copyTextToClipboard;\r\n vm.currentTenantId = angular.fromJson(localStorage.getItem(\"selectedTenant\")).ID;\r\n vm.currentTenantApiRoute = \"https://\" + angular.fromJson(localStorage.getItem(\"selectedTenant\")).ApiRoute + \".fastpathassure.com\";\r\n\r\n vm.apiClientMenuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n const apiClient = modelValue;\r\n vm.openApiClientModal(apiClient, false);\r\n },\r\n displayed: function (modelValue) {\r\n return true;\r\n }\r\n },\r\n {\r\n text: 'Delete',\r\n click: function ($itemScope, $event, modelValue) {\r\n const apiClient = modelValue;\r\n vm.deleteApiClient(apiClient);\r\n },\r\n displayed: function (modelValue) {\r\n return true;\r\n }\r\n }\r\n ];\r\n\r\n activate();\r\n\r\n async function activate() {\r\n loadRoles();\r\n await listApiClients();\r\n }\r\n\r\n async function getApiClient() {\r\n vm.loadingApiClient = true;\r\n let response = await apiClientDataService.getApiClient(vm.selectedApiClient.AdmUserId);\r\n\r\n vm.selectedApiClient = response.data;\r\n vm.selectedApiClient.SelectedRoles = response.data.Roles;\r\n\r\n for (var i = 0; i < vm.selectedApiClient.Secrets.length; i++) {\r\n const dateString = Date.now().toString(36);\r\n const randomNumber = Math.random().toString(36).substr(2);\r\n const inputTag = \"inp\" + dateString + randomNumber;\r\n vm.selectedApiClient.Secrets[i].InputTag = inputTag;\r\n }\r\n\r\n vm.originalClientStatusIsActive = response.data.Active;\r\n\r\n vm.loadingApiClient = false;\r\n }\r\n\r\n async function deleteApiClient(apiClient) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete API Client', 'Are you sure you want to delete ' + apiClient.Name + '?', 'Delete'));\r\n let response = await apiClientDataService.deleteApiClient(apiClient.AdmUserId);\r\n vm.selectedApiClient = null;\r\n listApiClients();\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n }\r\n\r\n function changeInputType(dataItem) {\r\n let inputControl = document.getElementById(dataItem.InputTag);\r\n let imageControl = document.getElementById(\"img\" + dataItem.InputTag);\r\n if (inputControl.type === \"text\") {\r\n inputControl.setAttribute(\"type\", \"password\");\r\n imageControl.className = \"fa fa-eye\"\r\n }\r\n\r\n else {\r\n inputControl.setAttribute(\"type\", \"text\");\r\n imageControl.className = \"fa fa-eye-slash\"\r\n }\r\n }\r\n\r\n async function listApiClients(mostRecentApiClientId) {\r\n if (vm.apiClients) { vm.apiClients = null; }\r\n vm.loadingApiClients = true;\r\n try {\r\n let response = await apiClientDataService.listApiClients();\r\n if (mostRecentApiClientId) {\r\n let mostRecentApiClient = response.data.find(r => r.AdmUserId === mostRecentApiClientId);\r\n response.data = response.data.filter(i => i.AdmUserId !== mostRecentApiClient.AdmUserId);\r\n response.data.unshift(mostRecentApiClient);\r\n vm.changeApiClientRowSelected(mostRecentApiClient);\r\n }\r\n vm.apiClients = response.data;\r\n vm.loadingApiClients = false;\r\n } catch (_) {\r\n vm.loadingApiClients = false;\r\n }\r\n }\r\n\r\n async function loadRoles() {\r\n let response;\r\n\r\n try {\r\n response = await dataService.getRoles();\r\n vm.availableRoles = response.data;\r\n\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n }\r\n async function updateSecretStatus(apiClientId, secretId, activate) {\r\n try {\r\n vm.loadingApiClient = true;\r\n await apiClientDataService.updateSecretStatus(apiClientId, secretId, activate);\r\n await getApiClient();\r\n vm.clientSecretsGridDataSource.read();\r\n vm.loadingApiClient = false;\r\n }\r\n catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n }\r\n\r\n async function generateSecret() {\r\n try {\r\n vm.loadingApiClient = true;\r\n await apiClientDataService.generateSecret(vm.selectedApiClient.AdmUserId);\r\n await getApiClient();\r\n vm.clientSecretsGridDataSource.read();\r\n vm.loadingApiClient = false;\r\n }\r\n catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n }\r\n\r\n async function deleteSecret(apiClientId, secretId) {\r\n try {\r\n vm.loadingApiClient = true;\r\n await apiClientDataService.deleteSecret(apiClientId, secretId);\r\n await getApiClient();\r\n vm.clientSecretsGridDataSource.read();\r\n vm.loadingApiClient = false;\r\n }\r\n catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n }\r\n\r\n\r\n function changeApiClientRowSelected(apiClient) {\r\n if (!vm.selectedApiClient || vm.selectedApiClient.AdmUserId !== apiClient.AdmUserId) {\r\n vm.selectedApiClient = apiClient;\r\n changeApiClientSelected(apiClient);\r\n }\r\n }\r\n\r\n async function changeApiClientSelected() {\r\n await getApiClient();\r\n loadSecretsGrid();\r\n }\r\n\r\n function copyTextToClipboard(dataItem) {\r\n let inputControl = document.getElementById(dataItem.InputTag);\r\n try {\r\n const el = document.createElement('input');\r\n el.value = inputControl.value;\r\n el.setAttribute('readOnly', '');\r\n el.style.position = 'absolute';\r\n el.style.left = '-9999px';\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n }\r\n catch (ex) {\r\n swal({ title: 'Error copying to clipboard', type: 'warning', showCancelButton: false });\r\n }\r\n }\r\n\r\n async function openApiClientModal(apiClient) {\r\n let apiClientModal = $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/NewApiClientModal.html',\r\n controller: newApiClientController,\r\n controllerAs: 'apicvm',\r\n backdrop: 'static',\r\n resolve: {\r\n apiClient: () => apiClient || null,\r\n }\r\n });\r\n\r\n try {\r\n let result = await apiClientModal.result;\r\n listApiClients(result);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function loadSecretsGrid() {\r\n var clientSecretsColumns = [\r\n { field: \"CreatedDate\", title: \"Created Date\", template: \"{{ dataItem.CreatedDate | date:'short'}}\", width: 125 },\r\n { field: \"ClientSecret\", title: \"Secret\", template: ``, width: 300 },\r\n { title: \"Active\", template: ``, width: 90 },\r\n { template: ``, width: 50 },\r\n { template: ``, width: 50 },\r\n { template: `Delete`, width: 70 }\r\n ];\r\n\r\n vm.clientSecretsGridOptions = helperService.setNonPageableGridOptions(clientSecretsColumns);\r\n vm.clientSecretsGridOptions.autoBind = true;\r\n vm.clientSecretsGridOptions.noRecords = {\r\n template: \"No items to display
\"\r\n };\r\n\r\n vm.clientSecretsGridDataSource = new kendo.data.DataSource({\r\n schema: {\r\n model: {\r\n fields: {\r\n CreatedDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async options => {\r\n try {\r\n for (var i = 0; i < vm.selectedApiClient.Secrets.length; i++) {\r\n const dateString = Date.now().toString(36);\r\n const randomNumber = Math.random().toString(36).substr(2);\r\n const inputTag = \"inp\" + dateString + randomNumber;\r\n vm.selectedApiClient.Secrets[i].InputTag = inputTag;\r\n }\r\n options.success(vm.selectedApiClient.Secrets);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n}","import controller from \"./apiClients.controller\";\r\n\r\n/* apiClients.component.js */\r\n\r\n/**\r\n * @desc component for API Clients\r\n * @example \r\n */\r\n\r\nconst apiClients = {\r\n controller: controller,\r\n controllerAs: 'apicvm',\r\n templateUrl: '/App/Components/ApiClients/apiClients.html'\r\n};\r\n\r\nexport default apiClients;","import angular from 'angular';\r\nimport apiClients from '../Components/ApiClients/apiClients.component';\r\n\r\nexport default angular\r\n .module('app.integrations.apiClients', [])\r\n .component(\"apiClients\", apiClients)\r\n .name;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getProducts,\r\n getLatestProductImports,\r\n getHybridConnections,\r\n getPlugins,\r\n getConnectionSql,\r\n getLogAnalyticConnections,\r\n getProductSchedule,\r\n getProductSql,\r\n getSapProduct,\r\n getImportRoles,\r\n getOracleEpmServiceTypes,\r\n getSfPermissionConfig,\r\n getSfPermissionConfigByObject,\r\n importSecurity,\r\n importFromFileUpload,\r\n createNewProduct,\r\n updateProductName,\r\n updateProductSchedule,\r\n disableProductSchedule,\r\n updateConfig,\r\n updateSqlConfig,\r\n createSqlConfig,\r\n createLogAnalyticsConfig,\r\n updateLogAnalyticsConfig,\r\n validateNsConfig,\r\n updateSapProduct,\r\n createSapProduct,\r\n createSfFieldPermissionConfig,\r\n removeSfFieldPermissionConfig\r\n };\r\n\r\n return service;\r\n\r\n //GET Requests\r\n async function getProducts() {\r\n try {\r\n return $http.get(apiUrl + 'api/universal/products');\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getLatestProductImports() {\r\n return $http.get(apiUrl + 'api/universal/imports/products/latest');\r\n }\r\n\r\n async function getHybridConnections() {\r\n return $http.get(apiUrl + 'api/core/hybridconnections');\r\n }\r\n\r\n async function getPlugins() {\r\n return $http.get(`${apiUrl}api/core/plugins`);\r\n }\r\n\r\n async function getConnectionSql(productId) {\r\n return $http.get(apiUrl + 'api/universal/products/' + productId + '/connections/sql');\r\n }\r\n\r\n async function getLogAnalyticConnections(productId) {\r\n return $http.get(`${apiUrl}api/assure/log-analytics/connection/${productId}`);\r\n }\r\n\r\n\r\n async function getProductSchedule(productId) {\r\n return $http.get(apiUrl + 'api/universal/imports/schedule/products/' + productId);\r\n }\r\n\r\n async function getProductSql(productId) {\r\n return $http.get(apiUrl + 'api/universal/products/' + productId + '/connections/sql');\r\n }\r\n\r\n async function getSapProduct(productId) {\r\n return $http.get(apiUrl + 'api/universal/products/' + productId + '/connections/saprfc');\r\n }\r\n\r\n async function getImportRoles(productId) {\r\n let response;\r\n\r\n try {\r\n response = await $http.get(apiUrl + 'api/universal/' + productId + '/import/api/role');\r\n } catch (err) {\r\n showError({\r\n data: \"Unable to get import roles.\"\r\n });\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function getOracleEpmServiceTypes() {\r\n let response;\r\n\r\n try {\r\n response = await await $http.get(apiUrl + 'api/assure/orepm/services');\r\n } catch (err) {\r\n showError({\r\n data: \"Unable to get service types\"\r\n });\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function getSfPermissionConfig() {\r\n return $http.get(apiUrl + 'api/universal/sf/import/fieldpermissionconfig');\r\n }\r\n\r\n async function getSfPermissionConfigByObject(name) {\r\n return $http.get(apiUrl + 'api/universal/sf/import/fieldpermissionconfig/' + name + '/fields');\r\n }\r\n\r\n async function importSecurity(url, data) {\r\n try {\r\n await $http.put(url, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importFromFileUpload(url, data) {\r\n try {\r\n await $http.put(url, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createNewProduct(data) {\r\n let response;\r\n\r\n try {\r\n response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/universal/products',\r\n data: data\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function updateProductName(product) {\r\n let response;\r\n\r\n try {\r\n response = await $http({\r\n method: 'PUT',\r\n url: apiUrl + 'api/universal/products/' + product.ID,\r\n data: {\r\n ProductId: product.ID,\r\n Name: product.Name\r\n }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function updateProductSchedule(productId, data) {\r\n let response;\r\n\r\n try {\r\n response = await $http.put(apiUrl + 'api/universal/imports/schedule/products/' + productId, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function createSapProduct(productId, data) {\r\n try {\r\n await $http.post(apiUrl + 'api/universal/products/' + productId + '/connections/saprfc', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function validateNsConfig(data) {\r\n try {\r\n await $http.put(apiUrl + 'api/core/ns/configuration/validate', data)\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateSapProduct(productId, data) {\r\n try {\r\n await $http.put(apiUrl + 'api/universal/products/' + productId + '/connections/saprfc', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function disableProductSchedule(productId, data) {\r\n let response;\r\n\r\n try {\r\n response = await $http.put(apiUrl + 'api/universal/imports/schedule/products/' + productId + \"/disable\", data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function updateConfig(data) {\r\n let response;\r\n try {\r\n response = $http.put(apiUrl + 'api/core/configuration', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function updateSqlConfig(productId, data) {\r\n let response;\r\n\r\n try {\r\n response = await $http.put(apiUrl + 'api/universal/products/' + productId + '/connections/sql', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function createSqlConfig(productId, data) {\r\n let response;\r\n\r\n try {\r\n response = await $http.post(apiUrl + 'api/universal/products/' + productId + '/connections/sql', data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function createLogAnalyticsConfig(productId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/assure/log-analytics/connection/${productId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function updateLogAnalyticsConfig(productId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/assure/log-analytics/connection/${productId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function createSfFieldPermissionConfig(data) {\r\n let response;\r\n\r\n try {\r\n response = await $http.post(apiUrl + 'api/universal/sf/import/fieldpermissionconfig', data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function removeSfFieldPermissionConfig(fieldId) {\r\n try {\r\n await $http.delete(apiUrl + 'api/universal/sf/import/fieldpermissionconfig/' + fieldId);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, dataService, connectionsDataService, modules) {\r\n const vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n vm.productTypesDataSource = [];\r\n vm.createNewProduct = createNewProduct;\r\n vm.cancel = cancel;\r\n vm.updateInProgress = false;\r\n\r\n async function init() {\r\n const customProductType = {\r\n Type: 'Custom',\r\n Name: 'Custom',\r\n ModuleId: 10000\r\n },\r\n atProductType = {\r\n Type: 'AuditTrail',\r\n Name: 'Change Tracking',\r\n ModuleId: 3000\r\n };\r\n let response;\r\n\r\n try {\r\n response = await dataService.getProductTypes();\r\n\r\n vm.productTypesDataSource.unshift(customProductType);\r\n\r\n if (response.data.some(prod => prod.Type === 'SAP')) {\r\n const obj = response.data.find(prod => prod.Type === 'SAP');\r\n obj.ModuleId = 10000;\r\n vm.productTypesDataSource.push(obj);\r\n }\r\n\r\n if (modules.some(item => item.ObjectID === atProductType.ModuleId)) {\r\n vm.productTypesDataSource.unshift(atProductType);\r\n }\r\n\r\n vm.selectedProductType = customProductType;\r\n\r\n } catch (response) {\r\n helperService.showErrorMessage(response.data);\r\n }\r\n }\r\n\r\n async function createNewProduct() {\r\n const newProduct = {\r\n Name: vm.newProduct.Name,\r\n ID: '',\r\n Type: vm.selectedProductType.Type,\r\n ModuleId: vm.selectedProductType.ModuleId\r\n };\r\n\r\n vm.updateInProgress = new createSpinner();\r\n\r\n try {\r\n const { data: newId } = await connectionsDataService.createNewProduct(newProduct);\r\n\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n vm.cancel(newId);\r\n } catch (response) {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n function cancel(newProduct) {\r\n $uibModalInstance.close(newProduct);\r\n }\r\n}","import allSupportedProducts from \"../../Shared/GlobalVariables/ProductLookUp\";\r\nimport newProductController from \"./newProductModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, $rootScope, helperService, configurationDataService, connectionsDataService, rolesDataService) {\r\n const vm = this,\r\n sortedProducts = allSupportedProducts.sort(sortByName);\r\n\r\n vm.$onInit = init;\r\n\r\n vm.getConnections = getConnections;\r\n vm.getProductImageClass = getProductImageClass;\r\n vm.helperService = helperService;\r\n vm.userSecurityList = $rootScope.UserSecurityList;\r\n vm.setRadioSelected = setRadioSelected;\r\n vm.openNewProductModal = openNewProductModal;\r\n\r\n async function init() {\r\n vm.radioSelected = '';\r\n vm.customProducts = [];\r\n vm.ProductImportTiles = {};\r\n vm.ProductImportTilesArray = [];\r\n vm.latestImportArray = [];\r\n vm.config = {};\r\n vm.origConfig = {};\r\n vm.checkImportFocus = checkImportFocus;\r\n\r\n await getProductConfigurations(); \r\n\r\n function checkImportFocus (productId) {\r\n const radios = [productId + \"_Import\", productId + \"_Settings\", productId + \"_Schedule\"];\r\n let focused = true;\r\n\r\n if (productId != null) {\r\n if (!vm.radioSelected || radios.includes(vm.radioSelected)) {\r\n focused = false;\r\n }\r\n }\r\n\r\n return focused;\r\n };\r\n\r\n sortedProducts.forEach(setImportTiles);\r\n\r\n let response = await rolesDataService.getModules();\r\n vm.modules = response.data;\r\n\r\n await vm.getConnections();\r\n\r\n determineProductVisibility();\r\n\r\n await callLatest();\r\n\r\n $scope.$on('ProductImport', () => callLatest());\r\n $scope.$on('productImportInProgress', (event, data) => triggerProductImportInProgressStatus(data));\r\n \r\n await setConfigValues();\r\n await getHybridConnections();\r\n } \r\n\r\n function getProductImageClass(productType) {\r\n return helperService.setProductImageClass(productType);\r\n }\r\n \r\n function setImportTiles(product) {\r\n vm.ProductImportTiles[product.ID] = 'hide';\r\n vm.ProductImportTilesArray.push({ ProductName: product.Name, ProductID: product.ID, ProductType: product.Type, Visibility: 'hide', ...product });\r\n }\r\n\r\n async function getProductConfigurations() {\r\n const { data } = await configurationDataService.getProductConfigurationListByName('UV_FPAuditDatabase');\r\n\r\n vm.allFpAuditConfigs = data;\r\n }\r\n\r\n async function setConfigValues() {\r\n let response = await configurationDataService.getConfigurationValues(),\r\n config = {};\r\n\r\n response.data.forEach(row => {\r\n config[row.Name] = row.Value;\r\n });\r\n\r\n //Hard-code encrypted\r\n config['SAP_Password'] = 'password';\r\n config['OR_Password'] = 'password';\r\n config['AX7_AppSecret'] = 'password';\r\n config['D365S_Password'] = 'password';\r\n config['D365S_ClientSecret'] = 'password';\r\n config['D365Bc_ClientSecret'] = 'password';\r\n config['D365Bc_Key'] = 'password';\r\n config['D365Bc_Password'] = 'password';\r\n config['NS_TokenKey'] = 'password';\r\n config['NS_TokenSecret'] = 'password';\r\n config['INT_Password'] = 'password';\r\n config['INT_ConsolePassword'] = 'password';\r\n config['INT_GatewayPassword'] = 'password';\r\n config['GP_Password'] = 'password';\r\n config['NAV_Password'] = 'password';\r\n config['NAV_WSPassword'] = 'password';\r\n config['AX_SqlPassword'] = 'password';\r\n config['SF_SecurityToken'] = 'password';\r\n config['SF_Password'] = 'password';\r\n config['SF_ClientSecret'] = 'password';\r\n config['AC_Password'] = 'password';\r\n config['PS_Password'] = 'password';\r\n config['PS_IM_Password'] = 'password';\r\n config['ORFC_Password'] = 'password';\r\n config['AC_SqlPassword'] = 'password';\r\n config['JDE_Password'] = 'password';\r\n config['WD_Password'] = 'password';\r\n config['AAD_ClientSecret'] = 'password';\r\n config['CPA_ApiKey'] = 'apikey';\r\n config['CPA_ClientSecret'] = 'password';\r\n config['SapGrc_Password'] = 'password';\r\n config['Zuo_ClientSecret'] = 'password';\r\n config['AZ_ClientSecret'] = 'password';\r\n config['ARB_ApiKey'] = 'password';\r\n config['ARB_Base64ClientSecret'] = 'password';\r\n config['CNC_ClientSecret'] = 'password';\r\n config['CNC_CompanyPassword'] = 'password';\r\n config['ADO_PersonalAccessToken'] = 'password';\r\n config['WD_ClientSecret'] = 'password';\r\n\r\n vm.config = JSON.parse(JSON.stringify(config));\r\n vm.origConfig = JSON.parse(JSON.stringify(config));\r\n }\r\n\r\n async function getHybridConnections() {\r\n const response = await connectionsDataService.getHybridConnections();\r\n\r\n vm.hybridConnectionsArray = response.data;\r\n }\r\n\r\n function setRadioSelected(event, radio) {\r\n if (event && event.currentTarget.classList.contains(\"active\")) {\r\n vm.radioSelected = radio;\r\n } else {\r\n vm.radioSelected = '';\r\n }\r\n }\r\n\r\n async function callLatest() {\r\n const response = await connectionsDataService.getLatestProductImports();\r\n\r\n vm.latestImportArray = response.data || [];\r\n }\r\n\r\n function triggerProductImportInProgressStatus(importingProduct) {\r\n if (vm.latestImportArray.length > 0) {\r\n let productIndex = vm.latestImportArray.findIndex(product => product.ProductType === importingProduct.ProductType && product.ProductId === importingProduct.ProductId);\r\n\r\n vm.latestImportArray[productIndex].Status = 'InProgress';\r\n vm.latestImportArray[productIndex].StartDate = new Date();\r\n }\r\n }\r\n\r\n async function getConnections() {\r\n let response = await connectionsDataService.getProducts(),\r\n data = response.data;\r\n\r\n vm.availableProducts = data;\r\n vm.customProducts = [];\r\n vm.sapProducts = [];\r\n\r\n for (let product of vm.availableProducts) {\r\n const supportedProduct = sortedProducts.find(supportedProduct => supportedProduct.ID === product.ID || (supportedProduct.Type === \"SAP\" && product.Type === \"SAP\")),\r\n isCustomProduct = !sortedProducts.find(supportedProduct => supportedProduct.ID === product.ID),\r\n isSap = product.Type === \"SAP\",\r\n isSql = product.Type === \"AX5\" || product.Type === \"SL\";\r\n\r\n if (isCustomProduct && !isSap) {\r\n product.isCustom = true;\r\n await getCustomProduct(product);\r\n }\r\n\r\n if (isSql) {\r\n await getSqlProduct(product);\r\n }\r\n\r\n if (isSap) {\r\n product.isSap = true;\r\n await getSapProduct(Object.assign({}, supportedProduct, product));\r\n }\r\n };\r\n }\r\n\r\n async function getCustomProduct(product) {\r\n let response;\r\n \r\n try {\r\n response = await connectionsDataService.getConnectionSql(product.ID);\r\n\r\n product.CustomProduct_User = response.data.UserName;\r\n product.CustomProduct_DatabaseName = response.data.DatabaseName;\r\n product.CustomProduct_Instance = response.data.Instance;\r\n product.CustomProduct_HostName = response.data.HostName;\r\n product.CustomProduct_Port = response.data.Port;\r\n product.CustomProduct_Password = 'fastpath';\r\n product.ConnectionExists = true;\r\n\r\n vm.customProducts.push(product);\r\n } catch {\r\n product.ConnectionExists = false;\r\n vm.customProducts.push(product);\r\n }\r\n\r\n await getProductSchedule(product);\r\n }\r\n\r\n async function getSqlProduct(product) {\r\n let response;\r\n\r\n try {\r\n response = await connectionsDataService.getProductSql(product.ID);\r\n\r\n product.SQL_User = response.data.UserName;\r\n product.SQL_DatabaseName = response.data.DatabaseName;\r\n product.SQL_Instance = response.data.Instance;\r\n product.SQL_HostName = response.data.HostName;\r\n product.SQL_Port = response.data.Port;\r\n product.SQL_Password = \"password\";\r\n product.ConnectionExists = true;\r\n } catch {\r\n product.ConnectionExists = false;\r\n }\r\n\r\n await getProductSchedule(product);\r\n }\r\n\r\n async function getProductSchedule(product) {\r\n let response;\r\n\r\n try {\r\n response = await connectionsDataService.getProductSchedule(product.ID);\r\n product.importSchedule = response.data;\r\n product.selectedFreqForScheduleImport = response.data.Frequency;\r\n product.selectedDayOfWeekForScheduleImport = response.data.DayOfWeek;\r\n product.selectedDayOfMonthForScheduleImport = { Value: response.data.DayOfMonth };\r\n product.startTimeForScheduleImport = new Date(response.data.StartTime);\r\n product.ScheduleImportIsOn = true;\r\n } catch {\r\n product.importSchedule = null;\r\n product.ScheduleImportIsOn = false;\r\n }\r\n }\r\n\r\n async function getSapProduct(product) {\r\n let response,\r\n sapProduct;\r\n\r\n try {\r\n response = await connectionsDataService.getSapProduct(product.ID);\r\n\r\n sapProduct = Object.assign({}, product, response.data);\r\n\r\n sapProduct.ConnectionExists = true;\r\n sapProduct.originalConfig = response.data;\r\n } catch {\r\n sapProduct = product;\r\n sapProduct.originalConfig = {};\r\n sapProduct.ConnectionExists = false;\r\n }\r\n\r\n vm.sapProducts.push(sapProduct);\r\n }\r\n\r\n function determineProductVisibility() {\r\n vm.availableProducts.forEach(availableProduct => {\r\n vm.ProductImportTiles[availableProduct.ID] = 'show';\r\n let selectedProduct = vm.ProductImportTilesArray.filter(product => product.ProductID == availableProduct.ID).first();\r\n\r\n if (selectedProduct) {\r\n selectedProduct.Visibility = 'show';\r\n }\r\n\r\n selectedProduct = Object.assign(selectedProduct || {}, availableProduct);\r\n });\r\n }\r\n\r\n async function openNewProductModal() {\r\n const productModal = $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/NewProductModal.html',\r\n controller: newProductController,\r\n controllerAs: 'npcvm',\r\n backdrop: 'static',\r\n resolve: {\r\n newProduct: () => { },\r\n modules: () => vm.modules\r\n }\r\n });\r\n\r\n try {\r\n const newId = await productModal.result;\r\n\r\n if (newId) {\r\n vm.getConnections();\r\n }\r\n } catch { }\r\n }\r\n}\r\n\r\nfunction sortByName(a, b) {\r\n return a.Name.localeCompare(b.Name)\r\n}","import connectionsController from \"./connections.controller\";\r\n\r\n/* connections.component.js */\r\n\r\n/**\r\n * @desc component for product connections\r\n * @example \r\n */\r\n\r\nconst connections = {\r\n controller: connectionsController,\r\n controllerAs: 'cvm',\r\n templateUrl: '/App/Components/Connections/connections.tmpl.html'\r\n};\r\n\r\nexport default connections;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, connectionsDataService, helperService, product) {\r\n const vm = this;\r\n\r\n vm.product = Object.assign({}, product);\r\n vm.updateProductName = updateProductName;\r\n vm.cancel = cancel;\r\n vm.dismiss = dismiss;\r\n vm.updateInProgress = false;\r\n\r\n function cancel() {\r\n $uibModalInstance.close();\r\n }\r\n\r\n function dismiss() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n async function updateProductName() {\r\n vm.updateInProgress = new createSpinner();\r\n\r\n try {\r\n await connectionsDataService.updateProductName(vm.product);\r\n\r\n await helperService.successfulSaveButton(vm.updateInProgress);\r\n product.Name = vm.product.Name;\r\n dismiss();\r\n } catch (response) {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n}\r\n","import editProductNameModalController from \"../editProductNameModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, ViewProductImportPageService) {\r\n const vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n vm.ViewProductImportPageService = ViewProductImportPageService;\r\n vm.updateNSRoleDropdown = updateNSRoleDropdown;\r\n vm.getImportStatusClass = getImportStatusClass;\r\n vm.openEditProductName = openEditProductName;\r\n\r\n function init() {\r\n vm.uploadOnlyProducts = [\"OREPM\", \"SAPB1\", \"Zuo\", \"CNC\"];\r\n }\r\n\r\n function updateNSRoleDropdown(configChanged) {\r\n vm.nsRolesChanged = configChanged;\r\n }\r\n\r\n function getImportStatusClass(status) {\r\n const classes = {\r\n \"Completed\": \"toast-success\",\r\n \"InProgress\": \"toast-loading\",\r\n \"Error\": \"toast-error\"\r\n }\r\n\r\n return classes[status];\r\n }\r\n\r\n function openEditProductName() {\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/EditProductNameModal.html',\r\n controller: editProductNameModalController,\r\n controllerAs: 'epnmcvm',\r\n backdrop: 'static',\r\n resolve: {\r\n product: () => vm.product\r\n }\r\n });\r\n }\r\n}","import controller from \"./connection.controller\";\r\n\r\n/* connection.component.js */\r\n\r\n/**\r\n * @desc component for product connections\r\n * @example \r\n */\r\n\r\nconst connection = {\r\n bindings: {\r\n product: '<',\r\n setRadioSelected: '<',\r\n radioSelected: '<',\r\n latestImportArray: '<',\r\n productImportTiles: '<',\r\n productTiles: '<',\r\n currentConfig: '<',\r\n originalConfig: '<',\r\n userSecurityList: '<',\r\n hybridConnectionsArray: '<',\r\n nsRolesChanged: '<',\r\n modules: '<'\r\n },\r\n controller: controller,\r\n controllerAs: 'cvm',\r\n templateUrl: '/App/Components/Connections/Connection/connection.tmpl.html'\r\n};\r\n\r\nexport default connection;","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $filter, helperService, connectionsDataService) {\r\n const vm = this,\r\n navObjects = JSON.parse(localStorage.getItem(\"NavigationObjects\"));\r\n let baseUrl = \"api/universal/\";\r\n\r\n vm.$onInit = init;\r\n vm.$onChanges = onChanges;\r\n\r\n vm.importProduct = importProduct;\r\n vm.importOracle = importOracle;\r\n vm.importType = \"Metadata\";\r\n vm.showSapImportType = navObjects.some(navObject => navObject.ModuleID === 14000);\r\n vm.sapImportType = \"SecurityOnly\";\r\n vm.getNsRoles = getNsRoles;\r\n vm.nsImportAllRoles = true;\r\n\r\n function init() {\r\n setProductSpecificDropdowns(vm.product.ID);\r\n }\r\n\r\n function onChanges(changes) {\r\n if (changes['nsRolesNeedsUpdate']?.currentValue && !nsImportAllRoles) {\r\n getNsRoles();\r\n const configChanged = false;\r\n vm.onNsRolesUpdate({ configChanged });\r\n }\r\n }\r\n\r\n async function setProductSpecificDropdowns(productId) {\r\n let response;\r\n\r\n if (productId === \"OREPM\") {\r\n try {\r\n response = await connectionsDataService.getOracleEpmServiceTypes();\r\n vm.serviceTypeDropdownDataSource = $filter(\"orderBy\")(response.data, \"displayName\");\r\n vm.serviceTypeDropdownDataSource.unshift({ \"_displayName\": \"-- Select a Service Type --\", \"_value\": -1 });\r\n vm.selectedServiceType = vm.serviceTypeDropdownDataSource[0];\r\n } catch {\r\n // Error handled in data service.\r\n }\r\n }\r\n }\r\n\r\n async function getNsRoles() {\r\n const productId = vm.product.ID;\r\n let response;\r\n\r\n if ($rootScope.UserSecurityList[\"16300\"]) {\r\n try {\r\n vm.rolesDropdownIsLoading = true;\r\n response = await connectionsDataService.getImportRoles(productId);\r\n vm.nsRoleDataSource = response.data;\r\n vm.nsSelectedItems = [];\r\n vm.rolesDropdownIsLoading = false;\r\n } catch {\r\n vm.rolesDropdownIsLoading = false;\r\n }\r\n }\r\n }\r\n\r\n async function importProduct(importType, files) {\r\n const securityImportTypes = [\"api\", \"sql\", \"permission\", \"security\"],\r\n isFileImport = checkFileImport(importType, files),\r\n isSecurityImport = securityImportTypes.includes(importType);\r\n\r\n try {\r\n var message = 'Are you sure you want to proceed? This will replace all currently imported security data in Fastpath Assure.';\r\n\r\n if (vm.product.ID === 'CPA') {\r\n message = 'Are you sure you want to proceed? This will replace all currently imported user-role security data in Fastpath Assure, but it will not affect permissions data.';\r\n }\r\n\r\n await swal(helperService.areYouSureParams(\r\n `Import ${vm.product.Name} Security`,\r\n `${message}`,\r\n `Import`\r\n ));\r\n\r\n if (isSecurityImport) {\r\n await importSecurity(importType);\r\n } else if (isFileImport) {\r\n vm.importType = importType;\r\n await importFromFileUpload(getFormData(files));\r\n }\r\n } catch {\r\n // Error handled in data service.\r\n }\r\n }\r\n\r\n async function importOracle(transactionMonitoring) {\r\n let url = apiUrl,\r\n type = \"Security\";\r\n\r\n if (transactionMonitoring) {\r\n type = \"Transaction Monitoring\";\r\n url = url + \"api/transactionmonitoring/or/import\";\r\n } else {\r\n url = url + \"api/universal/or/import/sql\";\r\n }\r\n\r\n try {\r\n await swal(helperService.areYouSureParams(\r\n `Import ${vm.product.Name} ${type}`,\r\n `Are you sure you want to proceed? This will replace all currently imported security data in Fastpath Assure.`,\r\n `Import`\r\n ));\r\n\r\n vm.showLoading = new createSpinner();\r\n\r\n await connectionsDataService.importSecurity(url, {});\r\n vm.showLoading.loadingValue = false;\r\n\r\n vm.setRadioSelected();\r\n vm.importFlow.cancel();\r\n } catch (err) {\r\n vm.showLoading.loadingValue = false;\r\n }\r\n }\r\n\r\n async function importSecurity(type) {\r\n let body = getRequestBodyByProductId(vm.product.ID, type),\r\n url = apiUrl + baseUrl + vm.product.ID + \"/import/\";\r\n\r\n vm.showLoading = new createSpinner();\r\n if (vm.product.ID === \"NS\") {\r\n url = url + (vm.nsImportAllRoles ? type : \"/api/role\");\r\n\r\n body = vm.nsImportAllRoles ? {} : { RoleIds: vm.nsSelectedItems.map(item => item.ID) };\r\n } else if (vm.product.Type === \"SAP\") {\r\n url = apiUrl + baseUrl + vm.product.Type + \"/import/\" + type;\r\n } else {\r\n url = url + type;\r\n }\r\n\r\n try {\r\n await connectionsDataService.importSecurity(url, body);\r\n vm.showLoading.loadingValue = false;\r\n\r\n vm.setRadioSelected();\r\n vm.importFlow.cancel();\r\n\r\n if (vm.product.ID === \"NS\") {\r\n vm.permissionsFlow.cancel();\r\n } else if (vm.product.Type === \"SAP\") {\r\n vm.rawFlow.cancel();\r\n }\r\n } catch (err) {\r\n vm.showLoading.loadingValue = false;\r\n }\r\n }\r\n\r\n async function importFromFileUpload(formData) {\r\n let urlId = vm.product.ID;\r\n\r\n vm.showLoading = new createSpinner();\r\n\r\n if (vm.product.Type === \"SAP\") {\r\n urlId = vm.product.Type;\r\n formData.append(\"ProductId\", vm.product.ID);\r\n }\r\n\r\n try {\r\n await connectionsDataService.importFromFileUpload(apiUrl + baseUrl + urlId + \"/import/\" + vm.importType, formData);\r\n vm.showLoading.loadingValue = false;\r\n\r\n vm.setRadioSelected();\r\n vm.importFlow.cancel();\r\n\r\n if (vm.product.ID === \"NS\") {\r\n vm.permissionsFlow.cancel();\r\n } else if (vm.product.Type === \"SAP\") {\r\n vm.rawFlow.cancel();\r\n }\r\n } catch (err) {\r\n vm.showLoading.loadingValue = false;\r\n }\r\n }\r\n\r\n function getRequestBodyByProductId(productId, type) {\r\n let data = {};\r\n\r\n if (vm.product.ID === \"AX7\" || vm.product.ID === \"D365S\") {\r\n data = {\r\n \"ImportType\": vm.importType,\r\n \"RoleList\": []\r\n };\r\n } else if (vm.product.Type === \"SAP\") {\r\n data = {\r\n ProductId: vm.product.ID,\r\n SdImportType: vm.sapImportType\r\n }\r\n }\r\n else if (type === \"api\" && vm.product.Type === \"WD\") {\r\n data = {\r\n ApiImportType: vm.originalConfig.WD_ApiImportType === '1' ? 'WQL' : 'RaaS'\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n function getFormData(files) {\r\n let formData = new FormData(),\r\n file = files.first().file,\r\n oracleServiceTypeId;\r\n\r\n if (vm.product.ID === \"OREPM\") {\r\n oracleServiceTypeId = vm.selectedServiceType._value;\r\n formData.append(\"OrEpmServiceId\", oracleServiceTypeId);\r\n } else if (vm.product.isCustom) {\r\n formData.append(\"ProductId\", vm.product.ID);\r\n }\r\n\r\n if (vm.product.isCustom && file.type === \"application/x-zip-compressed\") {\r\n vm.importType = \"csv\"\r\n formData.append(\"File\", file);\r\n } else if (vm.product.isCustom) {\r\n vm.importType = \"excel\"\r\n formData.append(\"ExcelImport\", file);\r\n } else {\r\n formData.append(file.name, file);\r\n }\r\n\r\n return formData;\r\n }\r\n}\r\n\r\nfunction checkFileImport(importType, files) {\r\n const types = [\"\", \"file\", \"files\", \"raw-files\", \"metadata\", \"permissionusage\"];\r\n\r\n return types.includes(importType) && files && files.length;\r\n}","import Controller from \"./connectionImport.controller\";\r\n\r\n/* connectionImport.component.js */\r\n\r\n/**\r\n * @desc component for importing product connection data.\r\n * @example \r\n */\r\n\r\nconst ConnectionImport = {\r\n bindings: {\r\n product: '<',\r\n originalConfig: \"=\",\r\n setRadioSelected: \"<\",\r\n nsRolesNeedsUpdate: '<',\r\n onNsRolesUpdate: '&'\r\n },\r\n controller: Controller,\r\n controllerAs: 'civm',\r\n templateUrl: 'App/Components/Connections/Connection/Import/connectionImport.tmpl.html'\r\n};\r\n\r\nexport default ConnectionImport;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nconst frequencies = ['Daily', 'Weekly', 'Monthly'],\r\n daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport default /*@ngInject*/ function ($rootScope, helperService, errorsDataService, dateFormatterFactory, connectionsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n function init() {\r\n getImportSchedule();\r\n }\r\n\r\n vm.frequencies = frequencies;\r\n vm.daysInWeek = daysInWeek;\r\n vm.daysInMonth = helperService.getDayOfMonthDropdownOptions();\r\n vm.startTimeForScheduleImport = new Date();\r\n\r\n vm.scheduleImportStatusChanged = scheduleImportStatusChanged;\r\n vm.updateScheduleImport = updateScheduleImport;\r\n vm.createNewSchedule = createNewSchedule;\r\n vm.disableSchedule = disableSchedule;\r\n vm.scheduleChanged = scheduleChanged;\r\n vm.formatDate = formatDate;\r\n vm.formatDay = formatDay;\r\n vm.updateInProgress = false;\r\n\r\n async function getImportSchedule() {\r\n let response;\r\n\r\n try {\r\n response = await connectionsDataService.getProductSchedule(vm.product.ID);\r\n\r\n vm.importSchedule = Object.assign({}, response.data);\r\n vm.DayOfMonth = { Value: response.data.DayOfMonth };\r\n vm.StartTime = new Date(response.data.NextExecutionTime);\r\n vm.updatedSchedule = Object.assign({}, response.data);\r\n vm.scheduleImportIsOn = true;\r\n } catch {\r\n vm.importSchedule = null;\r\n vm.scheduleImportIsOn = false;\r\n }\r\n }\r\n\r\n function formatDate(dateObject) {\r\n vm.updatedSchedule.StartTime = dateFormatterFactory.formatDate(dateObject);\r\n }\r\n\r\n function formatDay(dayObject) {\r\n vm.updatedSchedule.DayOfMonth = dayObject.Value;\r\n }\r\n\r\n function scheduleChanged() {\r\n let initial = vm.importSchedule || {},\r\n updated = vm.updatedSchedule || {},\r\n changed = true;\r\n\r\n if (vm.importSchedule && angular.equals(initial, updated)) {\r\n changed = false;\r\n }\r\n\r\n return changed;\r\n }\r\n\r\n function scheduleImportStatusChanged() {\r\n if (vm.scheduleImportIsOn === false && vm.importSchedule) {\r\n updateScheduleImport(false, vm.product);\r\n }\r\n }\r\n\r\n function updateScheduleImport(isOn) {\r\n updateSchedule(isOn);\r\n }\r\n\r\n async function updateSchedule(scheduleIsOn) {\r\n vm.updateInProgress = new createSpinner();\r\n\r\n if (scheduleIsOn) {\r\n await createNewSchedule();\r\n await getImportSchedule();\r\n } else {\r\n await disableSchedule();\r\n }\r\n }\r\n\r\n async function createNewSchedule() {\r\n const frequency = vm.updatedSchedule.Frequency,\r\n dayOfWeek = vm.updatedSchedule.DayOfWeek;\r\n let data = {},\r\n adjustedTime = new Date(),\r\n enteredHours = vm.StartTime.getHours(),\r\n enteredMinutes = vm.StartTime.getMinutes(),\r\n dayOfMonthRequest,\r\n dayOfWeekRequest;\r\n\r\n vm.updateInProgress = new createSpinner();\r\n\r\n if (frequency === 'Daily') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [];\r\n } if (frequency === 'Weekly') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [dayOfWeek];\r\n } if (frequency === 'Monthly') {\r\n dayOfMonthRequest = [vm.DayOfMonth.Value];\r\n dayOfWeekRequest = [];\r\n }\r\n\r\n // Adjusting for DST\r\n adjustedTime.setHours(enteredHours);\r\n adjustedTime.setMinutes(enteredMinutes);\r\n\r\n try {\r\n data = {\r\n \"ProductId\": vm.product.ID,\r\n \"Schedule\": {\r\n \"DayOfMonth\": dayOfMonthRequest[0],\r\n \"DayOfWeek\": dayOfWeekRequest[0],\r\n \"Frequency\": frequency,\r\n \"StartTime\": adjustedTime.toUTCString(),\r\n \"TimeZone\": $rootScope.applicationTimeZone\r\n }\r\n };\r\n\r\n await connectionsDataService.updateProductSchedule(vm.product.ID, data);\r\n helperService.successfulSaveButton(vm.updateInProgress);\r\n vm.updateInProgress.loadingValue = false;\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n\r\n async function disableSchedule() {\r\n const data = { \"ProductId\": vm.product.ID };\r\n try {\r\n await connectionsDataService.disableProductSchedule(vm.product.ID, data);\r\n await getImportSchedule();\r\n vm.updateInProgress.loadingValue = false;\r\n } catch {\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n}","import Controller from \"./connectionSchedule.controller\";\r\n\r\n/* connectionSchedule.component.js */\r\n\r\n/**\r\n * @desc component for managing product connection schedules\r\n * @example \r\n */\r\n\r\nconst connectionSchedule = {\r\n bindings: {\r\n product: '<',\r\n },\r\n controller: Controller,\r\n controllerAs: 'csvm',\r\n templateUrl: '/App/Components/Connections/Connection/Schedule/connectionSchedule.tmpl.html'\r\n};\r\n\r\nexport default connectionSchedule;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\nimport { customAutoCompleteFilter } from \"../../../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, helperService, connectionsDataService, configurationDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n vm.objectsDropdownChange = objectsDropdownChange;\r\n vm.updateField = updateField;\r\n vm.update = update;\r\n vm.getConfigNames = getConfigNames;\r\n vm.configValuesHaveChanged = configValuesHaveChanged;\r\n vm.productValuesHaveChanged = productValuesHaveChanged;\r\n vm.logAnalyticConfigsHaveChanged = logAnalyticConfigsHaveChanged;\r\n vm.ax7ImportDisabledUsersChange = ax7ImportDisabledUsersChange;\r\n vm.ax7ImportDisabledUserAccessChange = ax7ImportDisabledUserAccessChange;\r\n vm.sfImportTypeChange = sfImportTypeChange;\r\n\r\n async function init() {\r\n let config = vm.product.Config;\r\n\r\n // For now, only gather ALA if plugin is active & product is D365FSC\r\n if (vm.product.ID === 'AX7') {\r\n await aLAPluginActive();\r\n }\r\n\r\n vm.hasChangeTracking = vm.modules.some(item => item.ObjectID === 3000);\r\n vm.versionOptions = vm.product.VersionOptions;\r\n vm.updateConfig = updateConfig;\r\n vm.originalProduct = Object.assign({}, vm.product);\r\n\r\n if (config && config.length) {\r\n vm.configNames = vm.product.Config.map((configItem) => configItem.Name);\r\n } else {\r\n vm.configNames = [];\r\n }\r\n\r\n if (vm.product.ID === \"SF\") {\r\n await setSalesForceObjects();\r\n }\r\n }\r\n\r\n async function aLAPluginActive() {\r\n const { data: configData } = await configurationDataService.getConfigurationValueByName('ALA_Active');\r\n vm.aLAPluginActive = configData;\r\n\r\n if (vm.aLAPluginActive) {\r\n try {\r\n const { data: connectionData } = await connectionsDataService.getLogAnalyticConnections(vm.product.ID);\r\n vm.originalLogAnalyticConfigs = {...connectionData};\r\n vm.logAnalyticConfigs = connectionData;\r\n vm.logAnalyticConfigs.ConnectionExists = true;\r\n } catch {\r\n vm.originalLogAnalyticConfigs = { \"WorkspaceId\" : null, \"Instance\" : null, \"DaysToImport\" : null };\r\n vm.logAnalyticConfigs = { \"WorkspaceId\": null, \"Instance\": null, \"DaysToImport\": null };\r\n vm.logAnalyticConfigs.ConnectionExists = false;\r\n }\r\n }\r\n }\r\n\r\n function getConfigNames() {\r\n return vm.configNames;\r\n }\r\n\r\n function configValuesHaveChanged (configArray = []) {\r\n return helperService.returnTrueIfValuesDiffer(configArray, vm.originalConfig, vm.currentConfig);\r\n };\r\n\r\n function productValuesHaveChanged(product) {\r\n return !angular.equals(vm.originalProduct, product);\r\n }\r\n\r\n function logAnalyticConfigsHaveChanged() {\r\n const logAnalyticConfigArray = ['WorkspaceId', 'Instance', 'DaysToImport'];\r\n\r\n return helperService.returnTrueIfValuesDiffer(logAnalyticConfigArray, vm.originalLogAnalyticConfigs, vm.logAnalyticConfigs);\r\n }\r\n\r\n async function update() {\r\n vm.updatePending = new createSpinner();\r\n\r\n if (vm.product.ID === 'AX5') {\r\n updateSqlConnection(vm.product);\r\n vm.updateConfig(vm.product.Config, vm.currentConfig, vm.originalConfig);\r\n } else if (vm.product.ID === 'AX7' && vm.aLAPluginActive) {\r\n if (logAnalyticConfigsHaveChanged()) {\r\n updateLogAnalyticsConfig(vm.logAnalyticConfigs);\r\n }\r\n if (configValuesHaveChanged(getConfigNames())) {\r\n vm.updateConfig(vm.product.Config, vm.currentConfig, vm.originalConfig);\r\n }\r\n } else if (vm.product.ID === 'SL') {\r\n updateSqlConnection(vm.product);\r\n vm.updateConfig(vm.product.Config, vm.currentConfig, vm.originalConfig);\r\n } else {\r\n vm.updateConfig(vm.product.Config, vm.currentConfig, vm.originalConfig);\r\n }\r\n }\r\n\r\n async function updateConfig(list, value, origVal) {\r\n let updateNsRoles = false,\r\n data = {\r\n \"Configurations\": []\r\n };\r\n\r\n list.forEach(item => {\r\n if (item.Name === 'NS_InactiveRoles') {\r\n updateNsRoles = true;\r\n }\r\n if (item.Encrypted === true) {\r\n if (value[item.Name] !== \"password\" && value[item.Name] !== \"apikey\") {\r\n data.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n } else {\r\n if (value[item.Name] != origVal[item.Name]) {\r\n data.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n }\r\n });\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n if (vm.product.ID === \"NS\") {\r\n try {\r\n await connectionsDataService.validateNsConfig(getNsValidationData(vm.currentConfig));\r\n await connectionsDataService.updateConfig(data);\r\n\r\n data.Configurations.forEach(config => {\r\n origVal[config.Name] = config.Value;\r\n });\r\n helperService.successfulSaveButton(vm.updatePending);\r\n $rootScope.reloadConfigurationValues();\r\n\r\n if (updateNsRoles) {\r\n const configChanged = true;\r\n vm.onUpdateNsRoleDropdown({ configChanged });\r\n }\r\n } catch {\r\n vm.updatePending.loadingValue = false\r\n }\r\n } else {\r\n try {\r\n await connectionsDataService.updateConfig(data);\r\n\r\n data.Configurations.forEach(config => {\r\n origVal[config.Name] = config.Value;\r\n });\r\n helperService.successfulSaveButton(vm.updatePending);\r\n $rootScope.reloadConfigurationValues();\r\n } catch {\r\n vm.updatePending.loadingValue = false\r\n }\r\n }\r\n };\r\n\r\n async function updateLogAnalyticsConfig(configs) {\r\n var postData = {\r\n \"ProductId\": vm.product.ID,\r\n \"WorkspaceId\": configs.WorkspaceId,\r\n \"Instance\": configs.Instance,\r\n \"DaysToImport\": configs.DaysToImport,\r\n };\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n //Update Connection\r\n if (vm.logAnalyticConfigs.ConnectionExists === true) {\r\n try {\r\n await connectionsDataService.updateLogAnalyticsConfig(vm.product.ID, postData);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n else {\r\n try {\r\n await connectionsDataService.createLogAnalyticsConfig(vm.product.ID, postData);\r\n vm.logAnalyticConfigs.ConnectionExists = true;\r\n helperService.successfulSaveButton(vm.updatePending);\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n };\r\n\r\n async function updateSqlConnection(product) {\r\n var postData = {\r\n \"ProductId\": product.ID,\r\n \"DatabaseName\": product.SQL_DatabaseName,\r\n \"HostName\": product.SQL_HostName,\r\n \"Instance\": product.SQL_Instance,\r\n \"Port\": product.SQL_Port,\r\n \"Password\": product.SQL_Password,\r\n \"UserName\": product.SQL_User\r\n };\r\n\r\n if (vm.originalConfig.SQL_Password === product.SQL_Password) {\r\n delete postData.Password;\r\n }\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n //Update Connection\r\n if (product.ConnectionExists === true) {\r\n try {\r\n await connectionsDataService.updateSqlConfig(product.ID, postData);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n else {\r\n try {\r\n await connectionsDataService.createSqlConfig(product.ID, postData);\r\n product.ConnectionExists = true;\r\n helperService.successfulSaveButton(vm.updatePending);\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n };\r\n\r\n async function setSalesForceObjects() {\r\n var fieldPermissionConfigurationGridColumns = [\r\n { template: \"\", width: 55, filterable: false },\r\n { field: \"displayLabel\", title: \"Name\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n await getObjects();\r\n\r\n vm.fieldPermissionConfigurationGridOptions = helperService.setNonPageableGridOptions(fieldPermissionConfigurationGridColumns, 300);\r\n vm.fieldPermissionConfigurationGridOptions.autoBind = false;\r\n vm.fieldPermissionConfigurationGridOptions.noRecords = {\r\n template: \"No items to display
\"\r\n };\r\n\r\n vm.fieldPermissionConfigurationGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: async options => {\r\n try {\r\n let response = await connectionsDataService.getSfPermissionConfigByObject(vm.selectedObject.name);\r\n options.success(response.data);\r\n } catch {\r\n options.error();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function ax7ImportDisabledUsersChange() {\r\n if (vm.currentConfig.AX7_AS_ShowDisabledUsers === \"0\") {\r\n vm.currentConfig.AX7_AS_ImportDisabledUserAccess = \"0\";\r\n }\r\n }\r\n\r\n function ax7ImportDisabledUserAccessChange() {\r\n if (vm.currentConfig.AX7_AS_ImportDisabledUserAccess === \"1\") {\r\n vm.currentConfig.AX7_AS_ShowDisabledUsers = \"1\";\r\n }\r\n }\r\n\r\n async function getObjects() {\r\n let response;\r\n\r\n vm.objectsDropdownLoading = true;\r\n\r\n try {\r\n response = await connectionsDataService.getSfPermissionConfig();\r\n\r\n if (typeof response.data === \"string\") {\r\n vm.invalidOrMissingCredentials = response.data;\r\n } else {\r\n vm.invalidOrMissingCredentials = null;\r\n vm.objectsDropdownDataSource = response.data;\r\n vm.selectedObject = vm.objectsDropdownDataSource[0];\r\n vm.objectsDropdownLoading = false;\r\n vm.fieldPermissionConfigurationGridDataSource.page(1);\r\n vm.objectsDropdownLoading = false;\r\n }\r\n } catch {\r\n vm.objectsDropdownLoading = false;\r\n }\r\n }\r\n\r\n function objectsDropdownChange() {\r\n vm.fieldPermissionConfigurationGridDataSource.read();\r\n }\r\n\r\n async function updateField(field) {\r\n if (field.enabled) {\r\n let data = {\r\n \"Field\": field.name,\r\n \"FieldLabel\": field.label,\r\n \"SobjectType\": vm.selectedObject.name,\r\n \"ObjectLabel\": vm.selectedObject.label\r\n },\r\n response;\r\n\r\n response = await connectionsDataService.createSfFieldPermissionConfig(data);\r\n field.Id = response.data;\r\n } else {\r\n await connectionsDataService.removeSfFieldPermissionConfig(field.Id);\r\n }\r\n }\r\n\r\n function getNsValidationData(config) {\r\n return {\r\n Account: config.NS_Account,\r\n TokenKey: config.NS_TokenKey,\r\n TokenSecret: config.NS_TokenSecret\r\n }\r\n }\r\n\r\n function sfImportTypeChange() {\r\n if (vm.currentConfig.SF_ImportType === '1') {\r\n vm.currentConfig.SF_UserName = null;\r\n vm.currentConfig.SF_Password = null;\r\n vm.currentConfig.SF_SecurityToken = null;\r\n } else {\r\n vm.currentConfig.SF_Url = null;\r\n vm.currentConfig.SF_ClientId = null;\r\n vm.currentConfig.SF_ClientSecret = null;\r\n }\r\n }\r\n}\r\n","import controller from \"./connectionSettings.controller\";\r\n\r\n/* connectionSettings.component.js */\r\n\r\n/**\r\n * @desc component for configuring product connection settings.\r\n * @example \r\n */\r\n\r\nconst connectionSettings = {\r\n bindings: {\r\n product: '<',\r\n currentConfig: '=',\r\n originalConfig: '<',\r\n configUpdate: '<',\r\n updateConfig: '<',\r\n hybridConnectionsArray: '<',\r\n configNames: '<',\r\n onUpdateNsRoleDropdown: '&',\r\n modules: '<'\r\n },\r\n controller: controller,\r\n controllerAs: 'csvm',\r\n templateUrl: '/App/Components/Connections/Connection/Settings/connectionSettings.tmpl.html'\r\n};\r\n\r\nexport default connectionSettings;","import editProductNameModalController from \"../editProductNameModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, ViewProductImportPageService) {\r\n var vm = this;\r\n\r\n vm.ViewProductImportPageService = ViewProductImportPageService;\r\n vm.getImportStatusClass = getImportStatusClass;\r\n vm.openEditProductName = openEditProductName;\r\n\r\n function getImportStatusClass(status) {\r\n const classes = {\r\n \"Completed\": \"toast-success\",\r\n \"InProgress\": \"toast-loading\",\r\n \"Error\": \"toast-error\"\r\n }\r\n\r\n return classes[status];\r\n }\r\n\r\n function openEditProductName() {\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/EditProductNameModal.html',\r\n controller: editProductNameModalController,\r\n controllerAs: 'epnmcvm',\r\n backdrop: 'static',\r\n resolve: {\r\n product: () => vm.product\r\n }\r\n });\r\n };\r\n}\r\n","import controller from \"./sapConnection.controller\";\r\n\r\n/* sapConnection.component.js */\r\n\r\n/**\r\n * @desc component for sap product connections\r\n * @example \r\n */\r\n\r\nconst sapConnection = {\r\n bindings: {\r\n product: '<',\r\n latestImportArray: '<',\r\n radioSelected: '<',\r\n setRadioSelected: '<',\r\n currentConfig: '<',\r\n originalConfig: '<',\r\n configUpdate: '<',\r\n updateConfig: '<',\r\n userSecurityList: '<'\r\n },\r\n controller: controller,\r\n controllerAs: 'scvm',\r\n templateUrl: '/App/Components/Connections/SapConnection/sapConnection.tmpl.html'\r\n};\r\n\r\nexport default sapConnection;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, connectionsDataService, manageDataDataService, sapSdSimulationDataService) {\r\n var vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n vm.updateSAPSdConnectionSettings = updateSAPSdConnectionSettings;\r\n vm.updateConfig = updateConfig;\r\n vm.configValuesHaveChanged = configValuesHaveChanged;\r\n vm.productValuesHaveChanged = productValuesHaveChanged;\r\n vm.sdConfigValuesHaveChanged = sdConfigValuesHaveChanged;\r\n vm.submitProduct = submitProduct;\r\n vm.updateSapProduct = updateSapProduct;\r\n\r\n async function init() {\r\n const navigationList = JSON.parse(localStorage.getItem(\"NavigationObjects\"));\r\n\r\n vm.showSAPSdConnectionSettings = false;\r\n vm.originalProduct = Object.assign({}, vm.product);\r\n vm.configNames = vm.product.Config.map(item => item.Name);\r\n\r\n await getConfigByProductValues();\r\n\r\n if (navigationList.some(navItem => navItem.ObjectID === 14000)) {\r\n vm.showSAPSdConnectionSettings = true;\r\n await getSAPSdConnectionSettings(vm.product.ID);\r\n }\r\n }\r\n\r\n async function submitProduct() {\r\n vm.updatePending = new createSpinner();\r\n\r\n await vm.updateSapProduct(vm.product);\r\n await updateConfig(vm.product.Config, vm.currentConfig, vm.originalConfig);\r\n };\r\n\r\n async function updateSapProduct(product) {\r\n var data = {\r\n \"AppServerHost\": product.AppServerHost,\r\n \"SystemNumber\": product.SystemNumber,\r\n \"SystemID\": product.SystemID,\r\n \"User\": product.User,\r\n \"Password\": product.Password,\r\n \"Client\": product.Client,\r\n \"Language\": product.Language,\r\n \"PoolSize\": product.PoolSize,\r\n \"ProductId\": product.ID\r\n };\r\n\r\n vm.updatePending = new createSpinner();\r\n\r\n //Update Connection\r\n if (product.ConnectionExists === true) {\r\n try {\r\n await connectionsDataService.updateSapProduct(product.ID, data)\r\n helperService.successfulSaveButton(vm.updatePending);\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n else {\r\n try {\r\n await connectionsDataService.createSapProduct(product.ID, data);\r\n product.ConnectionExists = true;\r\n helperService.successfulSaveButton(vm.updatePending);\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n };\r\n\r\n async function getConfigByProductValues() {\r\n let response = await manageDataDataService.getConfigurationByProductId(vm.product.ID),\r\n config = {};\r\n response.data.forEach(row => {\r\n config[row.Name] = row.Value;\r\n });\r\n\r\n vm.currentConfig = JSON.parse(JSON.stringify(config));\r\n vm.originalConfig = JSON.parse(JSON.stringify(config));\r\n }\r\n\r\n async function getSAPSdConnectionSettings(productId) {\r\n let response;\r\n \r\n try {\r\n response = await sapSdSimulationDataService.getIntegrationSettings(productId);\r\n vm.sapSDConfig = response.data;\r\n vm.origSapSDConfig = Object.assign({}, response.data);\r\n } catch {\r\n vm.sapSDConfig = {};\r\n vm.origSapSDConfig = {};\r\n }\r\n }\r\n\r\n async function updateSAPSdConnectionSettings() {\r\n vm.updateSdPending = new createSpinner();\r\n let data = { ...vm.sapSDConfig };\r\n\r\n data.SystemId = data.SystemID;\r\n data.ProductId = vm.product.ID;\r\n\r\n delete data.SystemID;\r\n\r\n try {\r\n await sapSdSimulationDataService.updateIntegrationSettings(vm.product.ID, data);\r\n helperService.successfulSaveButton(vm.updateSdPending);\r\n } catch {\r\n vm.updateSdPending.loadingValue = false;\r\n }\r\n }\r\n\r\n // update Configuration\r\n async function updateConfig(list, value, origVal) {\r\n let productPutData = {\r\n \"Configurations\": [],\r\n \"ProductId\": vm.product.ID\r\n };\r\n\r\n if (JSON.stringify(value) !== JSON.stringify(origVal)) {\r\n list.forEach(item => {\r\n if (!origVal || value[item.Name] !== origVal[item.Name]) {\r\n productPutData.Configurations.push({\r\n \"Name\": item.Name,\r\n \"Value\": value[item.Name]\r\n });\r\n }\r\n });\r\n vm.updatePending = new createSpinner();\r\n try {\r\n await manageDataDataService.setProductConfiguration(vm.product.ID, productPutData);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n await getConfigByProductValues();\r\n } catch {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n }\r\n\r\n function configValuesHaveChanged() {\r\n return helperService.returnTrueIfValuesDiffer(vm.configNames, vm.originalConfig, vm.currentConfig);\r\n }\r\n\r\n function productValuesHaveChanged() {\r\n return !angular.equals(vm.originalProduct, vm.product);\r\n }\r\n\r\n function sdConfigValuesHaveChanged() {\r\n return !angular.equals(vm.sapSDConfig, vm.origSapSDConfig);\r\n }\r\n}\r\n\r\n","import controller from \"./sapConnectionSettings.controller\";\r\n\r\n/* sapConnectionSettings.component.js */\r\n\r\n/**\r\n * @desc component for configuring sap product connection settings.\r\n * @example \r\n */\r\n\r\nconst sapConnectionSettings = {\r\n bindings: {\r\n product: '<',\r\n currentConfig: '=',\r\n originalConfig: '<',\r\n configUpdate: '<'\r\n },\r\n controller: controller,\r\n controllerAs: 'scsvm',\r\n templateUrl: '/App/Components/Connections/SapConnection/Settings/sapConnectionSettings.tmpl.html'\r\n};\r\n\r\nexport default sapConnectionSettings;","import editProductNameModalController from \"../editProductNameModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($uibModal, ViewProductImportPageService) {\r\n var vm = this;\r\n\r\n vm.ViewProductImportPageService = ViewProductImportPageService;\r\n vm.getImportStatusClass = getImportStatusClass;\r\n vm.openEditProductName = openEditProductName;\r\n\r\n function getImportStatusClass(status) {\r\n const classes = {\r\n \"Completed\": \"toast-success\",\r\n \"InProgress\": \"toast-loading\",\r\n \"Error\": \"toast-error\"\r\n }\r\n\r\n return classes[status];\r\n }\r\n\r\n function openEditProductName() {\r\n $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/EditProductNameModal.html',\r\n controller: editProductNameModalController,\r\n controllerAs: 'epnmcvm',\r\n backdrop: 'static',\r\n resolve: {\r\n product: () => vm.product\r\n }\r\n });\r\n };\r\n}\r\n","import controller from \"./customProductConnection.controller\";\r\n\r\n/* connection.component.js */\r\n\r\n/**\r\n * @desc component for custom product connections\r\n * @example \r\n */\r\n\r\nconst customProductConnection = {\r\n bindings: {\r\n product: '<',\r\n radioSelected: '<',\r\n setRadioSelected: '<',\r\n latestImportArray: '<',\r\n currentConfig: '<',\r\n originalConfig: '<',\r\n allFpAuditConfigs: '<'\r\n },\r\n controller: controller,\r\n controllerAs: 'cpcvm',\r\n templateUrl: '/App/Components/Connections/CustomProductConnection/customProductConnection.tmpl.html'\r\n};\r\n\r\nexport default customProductConnection;","import createSpinner from \"../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (helperService, connectionsDataService, manageDataDataService) {\r\n const vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n vm.updateCustomProduct = updateCustomProduct;\r\n\r\n function init() {\r\n vm.product.updatePassword = false;\r\n\r\n if (vm.product.HasAuditTrailModule) { \r\n getProductConfiguration();\r\n }\r\n }\r\n\r\n function getProductConfiguration() {\r\n const fpAuditConfig = vm.allFpAuditConfigs.find(config => config.ProductId === vm.product.ID);\r\n\r\n vm.currentProductConfig = { ...fpAuditConfig };\r\n vm.originalProductConfig = { ...fpAuditConfig };\r\n vm.configName = fpAuditConfig.Name;\r\n }\r\n\r\n async function updateCustomProduct() {\r\n const product = vm.product;\r\n let sqlData = {\r\n ProductId: product.ID,\r\n DatabaseName: product.CustomProduct_DatabaseName,\r\n HostName: product.CustomProduct_HostName,\r\n Instance: product.CustomProduct_Instance,\r\n Port: product.CustomProduct_Port,\r\n Password: product.CustomProduct_Password,\r\n UserName: product.CustomProduct_User\r\n },\r\n productConfigData = {\r\n Configurations: [],\r\n ProductId: vm.product.ID\r\n };\r\n\r\n if (vm.product.HasAuditTrailModule) {\r\n if (vm.currentProductConfig.Value != vm.originalProductConfig.Value) {\r\n productConfigData.Configurations.push({\r\n \"Name\": vm.configName,\r\n \"Value\": vm.currentProductConfig.Value\r\n });\r\n }\r\n }\r\n\r\n vm.updatePending = true;\r\n vm.updatePending = new createSpinner();\r\n\r\n if (product.ConnectionExists === true) {\r\n if (!product.updatePassword) {\r\n sqlData[\"Password\"] = null;\r\n }\r\n\r\n try {\r\n if (vm.product.HasAuditTrailModule) {\r\n await manageDataDataService.setProductConfiguration(vm.product.ID, productConfigData);\r\n\r\n productConfigData.Configurations.forEach(config => {\r\n vm.originalProductConfig[config.Name] = config.Value;\r\n });\r\n }\r\n\r\n await connectionsDataService.updateSqlConfig(product.ID, sqlData);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n } catch (response) {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n } else {\r\n try {\r\n await connectionsDataService.createSqlConfig(product.ID, sqlData);\r\n helperService.successfulSaveButton(vm.updatePending);\r\n product.ConnectionExists = true;\r\n } catch (response) {\r\n vm.updatePending.loadingValue = false;\r\n }\r\n }\r\n }\r\n}\r\n \r\n","import controller from \"./customProductConnectionSettings.controller\";\r\n\r\n/* customProductConnectionSettings.component.js */\r\n\r\n/**\r\n * @desc component for configuring custom product connection settings.\r\n * @example \r\n */\r\n\r\nconst customProductConnectionSettings = {\r\n bindings: {\r\n product: '<',\r\n currentConfig: '=',\r\n originalConfig: '<',\r\n configUpdate: '<',\r\n allFpAuditConfigs: '<'\r\n },\r\n controller: controller,\r\n controllerAs: 'cpcsvm',\r\n templateUrl: '/App/Components/Connections/CustomProductConnection/Settings/customProductConnectionSettings.tmpl.html'\r\n};\r\n\r\nexport default customProductConnectionSettings;","import createSpinner from \"../../../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $rootScope, helperService, $http) {\r\n\r\n const vm = this;\r\n\r\n vm.scheduleTMImportStatusChanged = scheduleTMImportStatusChanged;\r\n vm.updateTMScheduleImport = updateTMScheduleImport;\r\n vm.updateProductScheduleStatus = updateProductScheduleStatus;\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.frequencies = ['Daily', 'Weekly', 'Monthly'];\r\n vm.daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n vm.daysInMonth = helperService.getDayOfMonthDropdownOptions();\r\n vm.startTimeForScheduleTMImport = new Date();\r\n\r\n try {\r\n await getTMImportSchedule();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function getTMImportSchedule() {\r\n try {\r\n let response = await $http.get(apiUrl + 'api/transactionmonitoring/or/import/schedule');\r\n vm.importSchedule = response.data;\r\n vm.selectedFreqForScheduleTMImport = response.data.Frequency;\r\n vm.selectedDayOfWeekForScheduleTMImport = response.data.DayOfWeek;\r\n vm.selectedDayOfMonthForScheduleTMImport = response.data.DayOfMonth ? { Value: response.data.DayOfMonth } : null;\r\n vm.startTimeForScheduleTMImport = new Date(response.data.NextExecutionTime);\r\n vm.ScheduleTMImportIsOn = true;\r\n $scope.productImportScheduled = true;\r\n } catch {\r\n vm.importSchedule = null;\r\n vm.ScheduleTMImportIsOn = false;\r\n $scope.productImportScheduled = false;\r\n }\r\n }\r\n\r\n function scheduleTMImportStatusChanged(product) {\r\n if (vm.ScheduleTMImportIsOn == false && vm.importSchedule) {\r\n updateTMScheduleImport(false, product);\r\n }\r\n }\r\n\r\n function updateTMScheduleImport(isOn, product) {\r\n updateTMSchedule(isOn, vm.selectedFreqForScheduleTMImport, vm.selectedDayOfWeekForScheduleTMImport, vm.selectedDayOfMonthForScheduleTMImport, vm.startTimeForScheduleTMImport, apiUrl + 'api/transactionmonitoring/or/import/schedule', apiUrl + 'api/transactionmonitoring/or/import/schedule/disable', vm.importSchedule);\r\n $scope.productImportScheduled = isOn;\r\n }\r\n\r\n function updateProductScheduleStatus() {\r\n $scope.productImportScheduled = false;\r\n }\r\n\r\n async function updateTMSchedule(scheduleIsOn, frequency, dayOfWeek, dayOfMonth, startTime, scheduleUrl, disableUrl, downloadedSchedule) {\r\n vm.updateInProgress = new createSpinner();\r\n\r\n if (scheduleIsOn) {\r\n\r\n var dayOfMonthRequest;\r\n var dayOfWeekRequest;\r\n\r\n if (frequency === 'Daily') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [];\r\n } if (frequency === 'Weekly') {\r\n dayOfMonthRequest = [];\r\n dayOfWeekRequest = [dayOfWeek];\r\n } if (frequency === 'Monthly') {\r\n dayOfMonthRequest = [dayOfMonth.Value];\r\n dayOfWeekRequest = [];\r\n }\r\n\r\n let adjustedStartTime = new Date();\r\n adjustedStartTime.setHours(startTime.getHours());\r\n adjustedStartTime.setMinutes(startTime.getMinutes());\r\n adjustedStartTime = new Date(adjustedStartTime.toUTCString());\r\n adjustedStartTime = adjustedStartTime.toISOString();\r\n\r\n const putData = {\r\n \"Schedule\": {\r\n \"DayOfMonth\": dayOfMonthRequest[0],\r\n \"DayOfWeek\": dayOfWeekRequest[0],\r\n \"Frequency\": frequency,\r\n \"StartTime\": adjustedStartTime,\r\n \"TimeZone\": $rootScope.applicationTimeZone\r\n }\r\n };\r\n\r\n try {\r\n await $http.put(scheduleUrl, putData);\r\n getTMImportSchedule();\r\n helperService.successfulSaveButton(vm.updateInProgress);\r\n vm.updateInProgress.loadingValue = false;\r\n\r\n } catch (err) {\r\n helperService.showErrorMessage(err.data);\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n } if (scheduleIsOn == false) {\r\n if (downloadedSchedule) {\r\n try {\r\n await $http.put(disableUrl);\r\n getTMImportSchedule();\r\n vm.updateInProgress.loadingValue = false;\r\n } catch (err) {\r\n helperService.showErrorMessage(err.data);\r\n vm.updateInProgress.loadingValue = false;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/* transactionMonitoringSchedule.component.js */\r\n\r\nimport transactionMonitoringScheduleController from \"./transactionMonitoringSchedule.controller\";\r\n\r\n/**\r\n * @desc component to schedule Transaction Monitoring import\r\n * @example \r\n */\r\n\r\nconst transactionMonitoringSchedule = {\r\n controller: transactionMonitoringScheduleController,\r\n controllerAs: 'tmsvm',\r\n templateUrl: '/App/Components/Connections/Connection/Schedule/TransactionMonitoringSchedule/transactionMonitoringSchedule.tmpl.html'\r\n};\r\n\r\nexport default transactionMonitoringSchedule;","export default /*@ngInject*/ function ($rootScope) {\r\n const vm = this;\r\n\r\n vm.$onInit = init;\r\n\r\n async function init() {\r\n vm.hybridConnectionsArray = vm.hybridConnectionsArray;\r\n vm.helpObject = $rootScope.helpObject;\r\n }\r\n}","import hybridController from \"./partialHybridConnectionsInformation.controller\";\r\n\r\n/* partialHybridConnectionsInformation.component.js */\r\n\r\n/**\r\n * @desc component for displaying partial hybrid connection information\r\n * @example \r\n */\r\n\r\nconst partialHybridConnectionsInformation = {\r\n bindings: {\r\n hybridConnectionsArray: '<'\r\n },\r\n controller: hybridController,\r\n controllerAs: 'phcivm',\r\n templateUrl: '/App/Components/Connections/PartialHybridInformation/partialHybridConnectionsInformation.tmpl.html'\r\n};\r\n\r\nexport default partialHybridConnectionsInformation;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, $http, helperService, domain) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.saveDomain = saveDomain;\r\n\r\n vm.domain = { ...domain };\r\n\r\n // Common functions\r\n function cancel() { $uibModalInstance.dismiss(); }\r\n\r\n async function saveDomain() {\r\n vm.savePending = new createSpinner();\r\n if (vm.domain.Id) {\r\n try {\r\n await $http.put(`${apiUrl}/api/plugins/activedirectory/domains/${vm.domain.Id}`, vm.domain);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n $uibModalInstance.close();\r\n } catch (error) {\r\n helperService.showErrorMessage(error.data);\r\n vm.savePending.loadingValue = false;\r\n }\r\n } else {\r\n try {\r\n await $http.post(`${apiUrl}/api/plugins/activedirectory/domains`, vm.domain);\r\n await helperService.successfulSaveButton(vm.savePending);\r\n $uibModalInstance.close();\r\n } catch (error) {\r\n helperService.showErrorMessage(error.data);\r\n vm.savePending.loadingValue = false;\r\n }\r\n }\r\n }\r\n\r\n}","import domainModalController from \"./domainModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($http, $uibModal, helperService) {\r\n\r\n const vm = this;\r\n\r\n vm.$onInit = activate;\r\n\r\n vm.openDomainModal = openDomainModal;\r\n vm.deleteDomain = deleteDomain;\r\n\r\n function activate() {\r\n getDomains();\r\n }\r\n\r\n async function getDomains() {\r\n let response = await $http.get(`${apiUrl}/api/plugins/activedirectory/domains`);\r\n vm.domainsDataSource = response.data;\r\n }\r\n\r\n async function openDomainModal(domain) {\r\n const domainModal = $uibModal.open({\r\n templateUrl: '/App/Components/Connections/activeDirectoryDomains/domainModal.html',\r\n controller: domainModalController,\r\n controllerAs: 'dmvm',\r\n backdrop: 'static',\r\n resolve: {\r\n domain: () => domain || {}\r\n }\r\n });\r\n\r\n try {\r\n await domainModal.result;\r\n getDomains();\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n async function deleteDomain(domainId) {\r\n try {\r\n await $http.delete(`${apiUrl}/api/plugins/activedirectory/domains/${domainId}`);\r\n getDomains();\r\n } catch (error) {\r\n helperService.showErrorMessage(error.data);\r\n }\r\n }\r\n\r\n}","import activeDirectoryDomainsController from \"./activeDirectoryDomains.controller\";\r\n\r\n/* activeDirectoryDomains.component.js */\r\n\r\n/**\r\n * @desc component for displaying, adding, editing, and deleting active directory domains\r\n * @example \r\n */\r\n\r\nconst activeDirectoryDomains = {\r\n controller: activeDirectoryDomainsController,\r\n controllerAs: 'addvm',\r\n templateUrl: '/App/Components/Connections/activeDirectoryDomains/activeDirectoryDomains.tmpl.html'\r\n};\r\n\r\nexport default activeDirectoryDomains;","import angular from 'angular';\r\nimport connectionsDataService from '../Components/Connections/connectionsDataService.factory';\r\nimport connections from '../Components/Connections/connections.component';\r\nimport connection from '../Components/Connections/Connection/connection.component';\r\nimport connectionImport from '../Components/Connections/Connection/Import/connectionImport.component';\r\nimport connectionSchedule from '../Components/Connections/Connection/Schedule/connectionSchedule.component';\r\nimport connectionSettings from '../Components/Connections/Connection/Settings/connectionSettings.component';\r\nimport sapConnection from '../Components/Connections/SapConnection/sapConnection.component';\r\nimport sapConnectionSettings from '../Components/Connections/SapConnection/Settings/sapConnectionSettings.component';\r\nimport customProductConnection from '../Components/Connections/CustomProductConnection/customProductConnection.component';\r\nimport customProductConnectionSettings from '../Components/Connections/CustomProductConnection/Settings/customProductConnectionSettings.component';\r\nimport transactionMonitoringSchedule from '../Components/Connections/Connection/Schedule/TransactionMonitoringSchedule/transactionMonitoringSchedule.component';\r\nimport editProductNameModalController from '../Components/Connections/editProductNameModal.controller';\r\nimport partialHybridConnectionsInformation from '../Components/Connections/PartialHybridInformation/partialHybridConnectionsInformation.component';\r\nimport activeDirectoryDomains from '../Components/Connections/activeDirectoryDomains/activeDirectoryDomains.component';\r\n\r\nexport default angular\r\n .module('app.integrations.productConnections', [])\r\n .factory('connectionsDataService', connectionsDataService)\r\n .component(\"connections\", connections)\r\n .component(\"connection\", connection)\r\n .component(\"connectionImport\", connectionImport)\r\n .component(\"connectionSchedule\", connectionSchedule)\r\n .component(\"connectionSettings\", connectionSettings)\r\n .component(\"sapConnection\", sapConnection)\r\n .component(\"sapConnectionSettings\", sapConnectionSettings)\r\n .component(\"customProductConnection\", customProductConnection)\r\n .component(\"customProductConnectionSettings\", customProductConnectionSettings)\r\n .controller(\"editProductNameModalController\", editProductNameModalController)\r\n .component('transactionMonitoringSchedule', transactionMonitoringSchedule)\r\n .component('partialHybridConnectionsInformation', partialHybridConnectionsInformation)\r\n .component('activeDirectoryDomains', activeDirectoryDomains)\r\n .name;","export default /*@ngInject*/ function ($http, $injector, errorsDataService) {\r\n const factory = {\r\n createApiClient,\r\n updateApiClient,\r\n getApiClient,\r\n deleteApiClient,\r\n listApiClients,\r\n updateSecretStatus,\r\n generateSecret,\r\n deleteSecret\r\n };\r\n\r\n return factory;\r\n\r\n async function listApiClients() {\r\n return await $http.get(apiUrl + 'api/core/api-clients')\r\n .then(workComplete)\r\n .catch(workFailed); \r\n }\r\n\r\n async function getApiClient(apiClientId) {\r\n\r\n return await $http.get(apiUrl + 'api/core/api-clients/' + apiClientId)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n \r\n }\r\n\r\n async function createApiClient(apiClient) {\r\n\r\n return await $http.post(`${apiUrl}api/core/api-clients`, apiClient)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n \r\n }\r\n\r\n async function updateApiClient(id, apiClient) {\r\n return await $http.put(`${apiUrl}api/core/api-clients/` + id, apiClient)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n \r\n }\r\n async function deleteApiClient(id) {\r\n return await $http.delete(apiUrl + 'api/core/api-clients/' + id)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n \r\n }\r\n\r\n async function updateSecretStatus(apiClientId, secretId, active) {\r\n let routeStatus = active ? 'activate' : 'deactivate';\r\n return await $http.put(`${apiUrl}api/core/api-clients/${apiClientId}/secrets/${secretId}/${routeStatus}`)\r\n .then(workComplete)\r\n .catch(workFailed); \r\n }\r\n\r\n async function generateSecret(apiClientId) {\r\n let payload = {};\r\n let response = await $http.post(apiUrl + 'api/core/api-clients/' + apiClientId + '/secrets', payload)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n }\r\n\r\n async function deleteSecret(apiClientId, secretId) {\r\n let payload = {};\r\n let response = await $http.delete(apiUrl + 'api/core/api-clients/' + apiClientId + '/secrets/' + secretId, payload)\r\n .then(workComplete)\r\n .catch(workFailed);\r\n }\r\n\r\n function workComplete(response) {\r\n return response;\r\n }\r\n\r\n function workFailed(response) {\r\n $injector.get('errorsDataService').catch(response);\r\n }\r\n}","import angular from 'angular';\r\nimport apiClientDataServiceFactory from '../Components/ApiClients/apiClientDataService.factory';\r\n\r\nexport default angular\r\n .module('app.integrations.factories', [])\r\n .factory('apiClientDataService', apiClientDataServiceFactory)\r\n .name;","import angular from 'angular';\r\n\r\n// module imports\r\nimport pluginsModule from './plugins.module';\r\nimport apiClientsModule from './apiClients.module';\r\nimport productConnectionsModule from './productConnections.module';\r\nimport integrationsFactoriesModule from './integrations.factories.module';\r\n\r\nexport default angular\r\n .module('app.integrations', [integrationsFactoriesModule, pluginsModule, apiClientsModule, productConnectionsModule])\r\n .name;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getRoles,\r\n getModules,\r\n getModulesByObjectId,\r\n getSecurableObjects,\r\n removeRole,\r\n removeRoleAccess,\r\n addRole,\r\n addRoleAccess\r\n };\r\n\r\n return service;\r\n\r\n // GET Calls\r\n async function getRoles() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/Role`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getModules() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/modules`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getModulesByObjectId(objectId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/objects/module/${objectId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getSecurableObjects(roleId, objectId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/roleaccesses/role/${roleId}/module/${objectId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n // DELETE calls\r\n async function removeRole(roleId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/Role/${roleId}`);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function removeRoleAccess(data) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/roleaccesses`, { data: data, headers: { 'Content-Type': 'application/json;charset=utf-8' } });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n // POST calls\r\n async function addRoleAccess(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/roleaccesses`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function addRole(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/Role`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n const service = {\r\n getRoleById,\r\n addAssignments,\r\n removeAssignments\r\n };\r\n\r\n return service;\r\n\r\n async function getRoleById(roleId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/users/role/${roleId}`);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addAssignments(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/userroles`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeAssignments(data) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/userroles`, { data: data, headers: { 'Content-Type': 'application/json;charset=utf-8' } });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n}","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getRolesByUserId,\r\n getUser,\r\n createUser,\r\n addSubstitute,\r\n setUserRole,\r\n changeSubstitute,\r\n updateUser,\r\n removeSubstitute,\r\n deleteUserRole,\r\n addOOFHours,\r\n removeOOFHours,\r\n importUsers,\r\n downloadUsersTemplate\r\n };\r\n\r\n return service;\r\n\r\n async function getRolesByUserId(userId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/role/user/${userId}`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function getUser(userId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/users/${userId}`)\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function downloadUsersTemplate() {\r\n try {\r\n return await $http.get(`${apiUrl}api/core/users/export/usertemplate`, { responseType: \"blob\" });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n\r\n async function createUser(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/users`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addSubstitute(userId, data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/users/${userId}/substitutereviewer`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function setUserRole(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/core/userroles`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function changeSubstitute(userId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/core/users/${userId}/substitutereviewer`, data);\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function updateUser(userId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/core/users/${userId}`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function addOOFHours(userId, data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/core/users/${userId}/outofoffice`, data);\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function importUsers(fd) {\r\n try {\r\n return await $http.put(`${apiUrl}/api/core/users/import`, fd, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined }\r\n });\r\n } catch (err) {\r\n showError(err);\r\n sendError(err);\r\n }\r\n }\r\n\r\n async function removeSubstitute(userId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/users/${userId}/substitutereviewer`);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n async function deleteUserRole(data) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/userroles`, { data: data, headers: { 'Content-Type': 'application/json;charset=utf-8' } });\r\n } catch (err) {\r\n showError(err);\r\n }\r\n }\r\n\r\n async function removeOOFHours(userId) {\r\n try {\r\n return await $http.delete(`${apiUrl}api/core/users/${userId}/outofoffice`);\r\n } catch (err) {\r\n errorsDataService.catch(err);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (passwordCriteriaDataService, helperService) {\r\n const vm = this;\r\n\r\n vm.helperService = helperService;\r\n vm.saveOrUpdatePasswordCriteria = saveOrUpdatePasswordCriteria;\r\n vm.criteriaValuesHaveChanged = criteriaValuesHaveChanged;\r\n vm.requireSpecialCharChanged = requireSpecialCharChanged;\r\n\r\n vm.$onInit = getCriteria;\r\n\r\n async function getCriteria() {\r\n vm.gettingCriteriaInProgress = true;\r\n\r\n try {\r\n const { data } = await passwordCriteriaDataService.getPasswordCriteria(vm.product.ID);\r\n\r\n vm.originalPasswordCriteria = data;\r\n vm.passwordCriteria = { ...vm.originalPasswordCriteria };\r\n\r\n if (data.SpecialChars) {\r\n vm.requireSpecialChar = true;\r\n }\r\n\r\n } catch (response) {\r\n if (response.status === 404) {\r\n vm.originalPasswordCriteria = {};\r\n vm.passwordCriteria = {};\r\n }\r\n }\r\n vm.gettingCriteriaInProgress = false;\r\n }\r\n\r\n async function saveOrUpdatePasswordCriteria() {\r\n vm.updatePasswordCriteriaPending = new createSpinner();\r\n\r\n let data = {\r\n ProductId: vm.product.ID,\r\n MinLength: vm.passwordCriteria.MinLength,\r\n MaxLength: vm.passwordCriteria.MaxLength,\r\n RequireCapitalLetter: vm.passwordCriteria.RequireCapitalLetter,\r\n RequireNumber: vm.passwordCriteria.RequireNumber,\r\n SpecialChars: vm.passwordCriteria.SpecialChars\r\n };\r\n\r\n if (Object.keys(vm.originalPasswordCriteria).length > 0) {\r\n try {\r\n await passwordCriteriaDataService.updatePasswordCriteria(data);\r\n vm.originalPasswordCriteria = { ...vm.passwordCriteria };\r\n await helperService.successfulSaveButton(vm.updatePasswordCriteriaPending);\r\n } catch {\r\n vm.updatePasswordCriteriaPending.loadingValue = false;\r\n }\r\n } else {\r\n try {\r\n await passwordCriteriaDataService.addPasswordCriteria(data);\r\n vm.originalPasswordCriteria = { ...vm.passwordCriteria };\r\n await helperService.successfulSaveButton(vm.updatePasswordCriteriaPending);\r\n } catch {\r\n vm.updatePasswordCriteriaPending.loadingValue = false;\r\n }\r\n }\r\n }\r\n\r\n function criteriaValuesHaveChanged(criteriaArray) {\r\n return helperService.returnTrueIfValuesDiffer(criteriaArray, vm.originalPasswordCriteria, vm.passwordCriteria);\r\n }\r\n\r\n function requireSpecialCharChanged() {\r\n if (vm.requireSpecialChar === false) {\r\n vm.passwordCriteria.SpecialChars = undefined;\r\n }\r\n }\r\n}","import passwordCriteriaController from \"./passwordCriteria.controller\";\r\n\r\n/* passwordCriteria.component.js */\r\n\r\n/**\r\n * @desc component for configuring password criteria\r\n * @example \r\n */\r\n\r\nconst passwordCriteria = {\r\n bindings: {\r\n product: '<'\r\n },\r\n controller: passwordCriteriaController,\r\n controllerAs: 'pcvm',\r\n templateUrl: '/App/Components/configuration/passwordCriteria/passwordCriteria.tmpl.html'\r\n};\r\n\r\nexport default passwordCriteria;","export default /*@ngInject*/ function ($http, errorsDataService) {\r\n\r\n const service = {\r\n getPasswordCriteria,\r\n addPasswordCriteria,\r\n updatePasswordCriteria\r\n };\r\n\r\n return service;\r\n\r\n async function getPasswordCriteria(productId) {\r\n try {\r\n return await $http.get(`${apiUrl}api/identitymanager/products/${productId}/passwordcriteria`);\r\n } catch (error) {\r\n if (error.status !== 404) {\r\n showError(error);\r\n }\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function addPasswordCriteria(data) {\r\n try {\r\n return await $http.post(`${apiUrl}api/identitymanager/products/${data.ProductId}/passwordcriteria`, data);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n async function updatePasswordCriteria(data) {\r\n try {\r\n return await $http.put(`${apiUrl}api/identitymanager/products/${data.ProductId}/passwordcriteria`, data);\r\n } catch (error) {\r\n showError(error);\r\n sendError(error);\r\n }\r\n }\r\n\r\n function sendError(err) {\r\n throw err;\r\n }\r\n\r\n function showError(err) {\r\n errorsDataService.catch(err);\r\n }\r\n}","import { customAutoCompleteFilter, customDatePickerFilter, standardGridPageSize } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $scope, $filter, SavedReportSelectorService, objectIdDataService, CustomReportServices, $http, $timeout, helperService, reportsService, reportsDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.reportDetailsModel = [];\r\n\r\n vm.onApplyFilter = onApplyFilter;\r\n vm.onReadGrid = onReadGrid;\r\n vm.onClearFilters = onClearFilters;\r\n vm.populateCriteriaModel = populateCriteriaModel;\r\n vm.generateGridWithDynamicValues = generateGridWithDynamicValues;\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n vm.filterCriteria = {};\r\n vm.filterCriteria.query = [];\r\n vm.filterCriteria.dateQuery = [];\r\n // ---\r\n\r\n vm.hideExportOptionsFromSubmit = false;\r\n\r\n vm.filterManagerGridOptions = CustomReportServices.setfilterManagerGridOptions();\r\n vm.filterDropdownOptions = helperService.getFilterDropdownOptions();\r\n\r\n $scope.$on('kendoWidgetCreated', function () {\r\n if (vm.grid) {\r\n vm.gridReady = true;\r\n runSavedReport();\r\n }\r\n });\r\n\r\n activate();\r\n\r\n async function activate() {\r\n await getObjectId();\r\n\r\n // --- Grid Initialization ---\r\n await setGridLayout();\r\n // ---\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n await getReportMetadata();\r\n vm.filterCriteria.fields = reportsService.getFields(vm.reportMetadata.Columns);\r\n\r\n if ($rootScope.loadedSavedReport) {\r\n runSavedReport();\r\n }\r\n // ---\r\n\r\n // -- AUTO RUN REPORT ---\r\n if ($rootScope.UserPreferences.AutoRunDashboardReports === '1') {\r\n await generateGridWithDynamicValues();\r\n }\r\n // ---\r\n }\r\n\r\n async function getObjectId() {\r\n let objectId = await objectIdDataService.getObjectID();\r\n let securityObject = helperService.getSecurityObjectDetailsFromObjectId(objectId);\r\n\r\n vm.ObjectId = objectId;\r\n vm.reportName = securityObject.Name;\r\n vm.reportId = securityObject.ReportID;\r\n\r\n vm.filtersDataSource = CustomReportServices.setfiltersDataSource(vm.ObjectId);\r\n }\r\n\r\n async function setGridLayout() {\r\n const rowSettingsTemplate = ``;\r\n\r\n const ticketTemplate = `{{ dataItem.TicketProvider }} {{dataItem.TicketId}}\r\n {{ dataItem.TicketProvider }} {{dataItem.TicketId}}`;\r\n\r\n try {\r\n let savedLayoutColumns = await CustomReportServices.loadSavedDynamicGridLayout(vm)\r\n\r\n vm.auditLogGridOptions = helperService.setMainGridOptions(savedLayoutColumns, 600);\r\n vm.auditLogGridOptions.autoBind = false;\r\n await createGridDataSource();\r\n } catch {\r\n const auditLogGridColumns = [\r\n { title: \"\", template: rowSettingsTemplate, attributes: { \"class\": \"no-padding overflow-visible\" }, minResizableWidth: 22, width: 22 },\r\n { field: \"TicketDisplayName\", title: \"Ticket\", template: ticketTemplate, filterable: false, sortable: false },\r\n { field: \"ObjectName\", title: \"Report Name\", filterable: customAutoCompleteFilter },\r\n { field: \"ChangeType\", title: \"Change Type\", filterable: customAutoCompleteFilter },\r\n { field: \"ChangeDate\", title: \"Change Date\", template: \"{{ dataItem.ChangeDate | date:'short'}}\", filterable: customDatePickerFilter },\r\n { field: \"BeforeObject\", title: \"Before\", encoded: false, filterable: customAutoCompleteFilter },\r\n { field: \"AfterObject\", title: \"After\", encoded: false, filterable: customAutoCompleteFilter },\r\n { field: \"UserName\", title: \"User\", filterable: customAutoCompleteFilter },\r\n { field: \"TicketId\", title: \"Ticket Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"AuditId\", title: \"Audit Id\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TicketUrl\", title: \"Ticket Url\", hidden: true, filterable: customAutoCompleteFilter },\r\n { field: \"TicketProvider\", title: \"Ticket Provider\", hidden: true, filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.auditLogGridOptions = helperService.setMainGridOptions(auditLogGridColumns, 600);\r\n vm.auditLogGridOptions.selectable = false;\r\n vm.auditLogGridOptions.autoBind = false;\r\n await createGridDataSource();\r\n }\r\n }\r\n\r\n function createGridDataSource() {\r\n vm.auditLogGridDataSource = new kendo.data.DataSource({\r\n pageSize: standardGridPageSize,\r\n schema: {\r\n model: {\r\n fields: {\r\n ChangeDate: { type: \"date\" }\r\n }\r\n }\r\n },\r\n transport: {\r\n read: async function (options) {\r\n delete $rootScope.loadedSavedReport;\r\n\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n let data = {};\r\n\r\n data = helperService.prepareSortsAndFilters(options);\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n if (vm.filterCriteria.query) {\r\n data.Filters = data.Filters.concat(vm.filterCriteria.query);\r\n data.DateFilters = vm.filterCriteria.dateQuery;\r\n }\r\n // ---\r\n\r\n try {\r\n let response = await $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/core/auditlogs',\r\n data: data,\r\n params: {\r\n startDate: vm.startDate,\r\n endDate: vm.endDate\r\n }\r\n });\r\n options.success(response.data);\r\n vm.enableGrid = true;\r\n } catch (err) {\r\n options.error(err);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n function generateGridWithDynamicValues() {\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.dataSource._filter = null;\r\n vm.grid.dataSource._sort = null;\r\n }\r\n\r\n vm.hideExportOptionsFromSubmit = true;\r\n\r\n // Add back the sorting and filtering options if we are running the report for the first time\r\n if (!$rootScope.loadedSavedReport) {\r\n vm.grid.setOptions({\r\n filterable: {\r\n mode: \"row\"\r\n },\r\n sortable: true\r\n });\r\n }\r\n\r\n vm.auditLogGridDataSource.read();\r\n\r\n $timeout(async _ => {\r\n await SavedReportSelectorService.queryAuditLogsGridWithOptions($rootScope.loadedSavedReport, vm.grid, true);\r\n }, 500);\r\n }\r\n\r\n async function runSavedReport() {\r\n if (vm.gridReady && $rootScope.loadedSavedReport && vm.filterCriteria.fields) {\r\n vm.filterCriteria.query = reportsService.getSavedReportFilters();\r\n vm.filterCriteria.needsUpdate = true;\r\n await generateGridWithSelectedValues();\r\n } else if (vm.gridReady && !$rootScope.loadedSavedReport && vm.filterCriteria.fields) {\r\n populateCriteriaModel();\r\n }\r\n }\r\n\r\n function populateCriteriaModel() {\r\n // if tabs are on, save report info for the tab\r\n if ($rootScope.tabs.length > 0) {\r\n reportsService.saveTabReportInfo(vm);\r\n }\r\n\r\n vm.reportDetailsModel = [];\r\n }\r\n\r\n function onApplyFilter(selectedFilter) {\r\n const currentOptions = vm.grid.getOptions();\r\n\r\n if (selectedFilter && selectedFilter.Filters && selectedFilter.Filters.length > 0) {\r\n currentOptions.dataSource.filter = helperService.convertFiltersForGrid({}, selectedFilter.Filters);\r\n try {\r\n vm.grid.dataSource._filter = currentOptions.dataSource.filter;\r\n vm.grid.dataSource.read();\r\n }\r\n catch (err) {\r\n vm.auditLogGridDataSource.filter({});\r\n }\r\n }\r\n }\r\n\r\n function onReadGrid() {\r\n vm.auditLogGridDataSource.read();\r\n }\r\n\r\n function onClearFilters() {\r\n vm.auditLogGridDataSource.filter({});\r\n }\r\n\r\n // --- FOR ADVANCED FILTERING ---\r\n async function getReportMetadata() {\r\n let response = await reportsDataService.getReportMetadata(vm.reportId);\r\n\r\n vm.reportMetadata = response.data._embedded.reportData;\r\n vm.reportMetadata.Columns = $filter('orderBy')(vm.reportMetadata.Columns, 'DisplayName');\r\n\r\n return vm.reportMetadata;\r\n }\r\n\r\n}\r\n","import auditLogsController from \"./auditLogs.controller\";\r\n\r\n/* auditLogs.component.js */\r\n\r\n/**\r\n * @desc component for viewing audit logs\r\n * @example \r\n */\r\n\r\nconst auditLogs = {\r\n controller: auditLogsController,\r\n controllerAs: 'alvm',\r\n templateUrl: '/App/Components/AuditLogs/auditLogs.tmpl.html'\r\n};\r\n\r\nexport default auditLogs;","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (user, usersDataService, helperService, $uibModalInstance) {\r\n const vm = this;\r\n vm.user = { ...user };\r\n vm.cancel = cancel;\r\n vm.saveUser = saveUser;\r\n\r\n\r\n async function saveUser() {\r\n vm.savingUser = createSpinner();\r\n const data = {\r\n UserId: vm.user.UserID,\r\n Name: vm.user.UserLogonName,\r\n Active: vm.user.Active,\r\n Email: vm.user.Email\r\n }\r\n try {\r\n await usersDataService.updateUser(vm.user.UserID, data);\r\n await helperService.successfulSaveButton(vm.savingUser);\r\n $uibModalInstance.close();\r\n } catch (err) {\r\n vm.savingUser.loadingValue = false;\r\n return;\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n}","import createSpinner from \"../../../Shared/Functions/createSpinner\";\r\n\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, FileSaver, usersDataService) {\r\n\r\n const vm = this;\r\n vm.cancel = cancel;\r\n vm.dismiss = dismiss;\r\n vm.disableButton = false;\r\n vm.importUsers = importUsers;\r\n vm.downloadUsersTemplate = downloadUsersTemplate;\r\n\r\n function cancel() { $uibModalInstance.close(); }\r\n function dismiss() { $uibModalInstance.dismiss(); }\r\n\r\n // Import Users\r\n async function importUsers(file) {\r\n vm.importPending = new createSpinner;\r\n vm.disableButton = true;\r\n let fd = new FormData();\r\n fd.append(file[0].name, file[0].file);\r\n try {\r\n await usersDataService.importUsers(fd);\r\n await helperService.successfulSaveButton(vm.importPending);\r\n cancel();\r\n } catch {\r\n vm.importPending.loadingValue = false;\r\n vm.disableButton = false;\r\n }\r\n }\r\n\r\n // Export Users\r\n async function downloadUsersTemplate() {\r\n vm.downloadPending = new createSpinner();\r\n try {\r\n let response = await usersDataService.downloadUsersTemplate();\r\n await helperService.successfulSaveButton(vm.downloadPending);\r\n FileSaver.saveAs(response.data, 'UsersTemplate.xlsx');\r\n vm.downloadPending.loadingValue = false;\r\n } catch {\r\n vm.downloadPending.loadingValue = false;\r\n }\r\n }\r\n\r\n}\r\n\r\n","import swal from \"sweetalert2\";\r\nimport createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function (allowLocalAccounts, $filter, $uibModalInstance, $http, helperService, configurationDataService, usersDataService, errorsDataService) {\r\n const vm = this;\r\n\r\n vm.user = {};\r\n vm.helperService = helperService;\r\n\r\n vm.cancel = cancel;\r\n vm.addNewUser = addNewUser;\r\n\r\n activate();\r\n\r\n function activate() {\r\n vm.needsProvider = null;\r\n getIdentityProviders();\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n async function getIdentityProviders() {\r\n let response = await configurationDataService.getIdentityProviders();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n if (allowLocalAccounts !== \"1\") {\r\n response.data = response.data.filter(provider => provider.Protocol !== 'Local');\r\n }\r\n vm.providersList = response.data;\r\n }\r\n\r\n async function addNewUser() {\r\n vm.disableButton = new createSpinner();\r\n\r\n if (vm.needsProvider === null) {\r\n // we need to check the email for a matching existing account\r\n try {\r\n const accountExists = await checkEmail(vm.user.loginEmail);\r\n if (accountExists.data === true) {\r\n const existingUser = await getAccount(vm.user.loginEmail);\r\n vm.user.email = existingUser.data.EmailAddress;\r\n const existingProvider = vm.providersList.find(provider => provider.Name === existingUser.data.IdentityProvider)\r\n if (existingProvider) {\r\n vm.user.type = existingProvider.Id;\r\n } else {\r\n showInvalidIdpMessage(existingUser.data.IdentityProvider);\r\n vm.needsProvider = null;\r\n vm.disableButton.loadingValue = false;\r\n return;\r\n }\r\n vm.needsProvider = false;\r\n }\r\n else {\r\n vm.needsProvider = true;\r\n vm.user.email = vm.user.loginEmail;\r\n vm.disableButton.loadingValue = false;\r\n return;\r\n }\r\n\r\n } catch (error) {\r\n errorsDataService.catch(error);\r\n vm.disableButton.loadingValue = false;\r\n return;\r\n } \r\n }\r\n\r\n const data = {\r\n FirstName: vm.user.firstName,\r\n LastName: vm.user.lastName,\r\n Email: vm.user.email,\r\n IdentityProviderId: vm.user.type,\r\n IdentityUserId: vm.user.loginEmail\r\n };\r\n\r\n try {\r\n const response = await usersDataService.createUser(data);\r\n await helperService.successfulSaveButton(vm.disableButton);\r\n $uibModalInstance.close(response.data);\r\n } catch (error) {\r\n if (error.status === 400 && error.data.includes('already exists')) {\r\n vm.needsProvider = null;\r\n }\r\n vm.disableButton.loadingValue = false;\r\n }\r\n };\r\n\r\n async function showInvalidIdpMessage(identityProvider) {\r\n await swal({\r\n title: \"Identity Provider Not Found\",\r\n text: `The Identity Provider ${identityProvider} has not been associated with this tenant. Please contact support to add the ${identityProvider} Identity Provider to this tenant.`,\r\n type: \"warning\",\r\n showCancelButton: false,\r\n confirmButtonText: \"Close\",\r\n reverseButtons: false,\r\n showCloseButton: true\r\n });\r\n }\r\n\r\n async function checkEmail(email) {\r\n return await $http.get(`${apiUrl}api/auth/accounts/search`, { params: { 'email': email } });\r\n }\r\n\r\n async function getAccount(email) {\r\n return await $http.get(`${apiUrl}api/auth/accounts`, { params: { 'email': email } });\r\n }\r\n\r\n}","import swal from \"sweetalert2\";\r\nimport { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\nimport editUserModalController from \"./EditModal/editUserModal.controller\";\r\nimport importUsersModalController from \"./ImportModal/importUsersModal.controller\";\r\nimport newUsersModalController from \"./newUsersModal.controller\";\r\nimport substituteModalController from \"./SubstituteModal/substituteModal.controller\";\r\n\r\nexport default /*@ngInject*/ function ($scope, $uibModal, dataService, $filter, $rootScope, helperService, usersDataService) {\r\n const vm = this;\r\n\r\n vm.shouldBeOpen = true;\r\n vm.preselectUserId = null;\r\n vm.listOfUsers = null;\r\n vm.menuOptions = [\r\n {\r\n text: 'Edit',\r\n click: function ($itemScope, $event, modelValue) {\r\n const user = modelValue;\r\n vm.editUser(user);\r\n }\r\n },\r\n {\r\n text: 'Out of Office Manager',\r\n click: function ($itemScope, $event, modelValue) {\r\n const user = modelValue;\r\n vm.openSubstituteModal(user);\r\n },\r\n displayed: function (modelValue) {\r\n return $rootScope.UserSecurityList['2108'];\r\n }\r\n }\r\n ];\r\n\r\n vm.removeSubstitute = removeSubstitute;\r\n vm.removeOOFHours = removeOOFHours;\r\n vm.openSubstituteModal = openSubstituteModal;\r\n vm.changeRowSelected = changeRowSelected;\r\n vm.toggleUsersActiveState = toggleUsersActiveState;\r\n vm.toggleRoleState = toggleRoleState;\r\n vm.openNewModal = openNewModal;\r\n vm.editUser = editUser;\r\n vm.saveNameChange = saveNameChange;\r\n vm.openUserImportModal = openUserImportModal;\r\n\r\n $scope.$on('ImportUsers', function (event, data) {\r\n getUsers();\r\n });\r\n\r\n activate();\r\n\r\n function activate() {\r\n checkLocalAccounts();\r\n getUsers();\r\n setupAssignRolesGrid();\r\n }\r\n\r\n async function checkLocalAccounts() {\r\n let data = await helperService.getConfigurationValue('AllowLocalAccounts');\r\n vm.AllowLocalAccounts = data;\r\n }\r\n\r\n //Load List of users\r\n async function getUsers() {\r\n let response = await dataService.getUsers();\r\n vm.listOfUsers = $filter('orderBy')(response.data, 'UserLogonName');\r\n findSubstituteNames(vm.listOfUsers);\r\n if (vm.preselectUserId) {\r\n let user = response.data.find(e => vm.preselectUserId == e.UserID);\r\n vm.changeRowSelected(user);\r\n }\r\n }\r\n\r\n function changeRowSelected(dataItem) {\r\n\r\n let previousSelectedUser = { ...vm.selectedUser };\r\n vm.selectedUser = dataItem;\r\n\r\n if (previousSelectedUser && dataItem) {\r\n if (previousSelectedUser.UserID !== dataItem.UserID) {\r\n vm.assignRolesGridDataSource.read();\r\n }\r\n } else if (dataItem) {\r\n vm.assignRolesGridDataSource.read();\r\n }\r\n };\r\n\r\n function setupAssignRolesGrid() {\r\n vm.assignRolesGridOptions = {\r\n sortable: true,\r\n autoBind: false,\r\n height: 315,\r\n\r\n pageable: {\r\n numeric: false,\r\n previousNext: false,\r\n messages: {\r\n display: \"Total: {2}\"\r\n }\r\n },\r\n columns: [{\r\n title: \" \",\r\n template: \"\",\r\n width: 55,\r\n filterable: false\r\n },\r\n {\r\n field: \"Name\",\r\n filterable: customAutoCompleteFilter\r\n }\r\n\r\n ]\r\n };\r\n\r\n vm.assignRolesGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: async options => {\r\n\r\n let objectModel = function (ID, Name, ObjectID, SelectedRoleCheckbox) {\r\n this.ID = ID,\r\n this.Name = Name,\r\n this.ObjectID = ObjectID,\r\n this.SelectedRoleCheckbox = SelectedRoleCheckbox;\r\n };\r\n\r\n let allRoles = await dataService.getRoles();\r\n allRoles.data = $filter('orderBy')(allRoles.data, 'Name');\r\n let roles = [];\r\n allRoles.data.forEach(function (item) {\r\n roles.push(new objectModel(item.ID, item.Name, item.ObjectID, false));\r\n });\r\n\r\n let userRoles = await usersDataService.getRolesByUserId(vm.selectedUser.UserID);\r\n userRoles.data.forEach(item => {\r\n for (let j = 0; j < roles.length; j++) {\r\n if (roles[j].ID === item.ID) {\r\n roles[j].SelectedRoleCheckbox = true;\r\n break;\r\n }\r\n }\r\n });\r\n\r\n options.success(roles);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function toggleUsersActiveState(dataItem) {\r\n let response = await usersDataService.getUser(dataItem.UserID);\r\n let data = {\r\n UserId: response.data.UserID,\r\n Name: response.data.UserLogonName,\r\n Email: response.data.Email,\r\n Active: dataItem.Active\r\n };\r\n try {\r\n await usersDataService.updateUser(dataItem.UserID, data);\r\n } catch {\r\n dataItem.Active = !dataItem.Active;\r\n }\r\n }\r\n\r\n async function toggleRoleState(dataItem) {\r\n let data = {\r\n UserRoles: [{\r\n roleId: dataItem.ID,\r\n userId: vm.selectedUser.UserID\r\n }]\r\n };\r\n\r\n if (dataItem.SelectedRoleCheckbox === true) {\r\n // set the role for the user\r\n await usersDataService.setUserRole(data);\r\n } else {\r\n // delete the role for the user\r\n await usersDataService.deleteUserRole(data);\r\n }\r\n };\r\n\r\n async function openNewModal() {\r\n let newUserModal = $uibModal.open({\r\n templateUrl: '/App/Shared/Partials/newUserModal.html',\r\n controller: newUsersModalController,\r\n controllerAs: 'numvm',\r\n backdrop: 'static',\r\n resolve: {\r\n allowLocalAccounts: () => vm.AllowLocalAccounts\r\n }\r\n });\r\n\r\n try {\r\n vm.preselectUserId = await newUserModal.result;\r\n getUsers();\r\n } catch {\r\n return;\r\n }\r\n };\r\n\r\n\r\n async function editUser(user) {\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/Users/EditModal/editUserModal.html',\r\n controller: editUserModalController,\r\n controllerAs: 'eumvm',\r\n backdrop: 'static',\r\n resolve: {\r\n user: () => user\r\n }\r\n });\r\n\r\n try {\r\n await modal.result;\r\n getUsers();\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n //Save the new name\r\n async function saveNameChange(item) {\r\n let postItem = {\r\n 'UserId': item.UserID,\r\n 'Name': item.changeNameTo,\r\n 'Active': item.Active\r\n };\r\n await usersDataService.updateUser(item.UserID, postItem);\r\n item.editModeOn = false;\r\n item.UserLogonName = item.changeNameTo;\r\n };\r\n\r\n function findSubstituteNames(users) {\r\n users.forEach(user => {\r\n if (user.SubstituteReviewer) {\r\n user.SubstituteReviewer.UserLogonName = users.find(u => u.UserID === user.SubstituteReviewer.SubstituteUserId).UserLogonName;\r\n }\r\n });\r\n }\r\n\r\n async function openSubstituteModal(user) {\r\n let modal = $uibModal.open({\r\n templateUrl: '/App/Components/Users/SubstituteModal/substituteModal.html',\r\n controller: substituteModalController,\r\n controllerAs: 'smvm',\r\n backdrop: 'static',\r\n resolve: {\r\n user: () => user,\r\n source: () => 'usersPage'\r\n }\r\n });\r\n\r\n try {\r\n await modal.result;\r\n getUsers();\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function removeSubstitute(user) {\r\n\r\n const substituteName = user.SubstituteReviewer.UserLogonName;\r\n\r\n try {\r\n if (user.OutOfOfficeHours) {\r\n await swal(helperService.areYouSureParamsWithHTML('Remove Substitute', `Are you sure you want to remove ${substituteName} as a substitute reviewer?
This will also remove associated out of office hours.
`, 'Remove'));\r\n }\r\n await usersDataService.removeSubstitute(user.UserID);\r\n getUsers();\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function removeOOFHours(user) {\r\n await usersDataService.removeOOFHours(user.UserID);\r\n getUsers();\r\n }\r\n\r\n\r\n async function openUserImportModal() {\r\n $uibModal.open({\r\n templateUrl: 'App/Components/Users/ImportModal/importUsersModal.html',\r\n controller: importUsersModalController,\r\n controllerAs: 'iumvm',\r\n backdrop: 'static',\r\n });\r\n\r\n };\r\n\r\n}\r\n\r\n","import usersController from \"./users.controller\";\r\n\r\n/* users.component.js */\r\n\r\n/**\r\n * @desc component for displaying and managing tenant users\r\n * @example \r\n */\r\n\r\nvar users = {\r\n controller: usersController,\r\n controllerAs: 'uvm',\r\n templateUrl: '/App/Components/Users/users.html'\r\n};\r\n\r\nexport default users;","import createSpinner from \"../../Shared/Functions/createSpinner\";\r\n\r\nexport default /*@ngInject*/ function ($uibModalInstance, helperService, rolesDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.createRole = createRole;\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss();\r\n }\r\n\r\n async function createRole() {\r\n vm.saving = new createSpinner();\r\n let data = {\r\n \"Name\": vm.newRoleName\r\n };\r\n\r\n try {\r\n let response = await rolesDataService.addRole(data);\r\n await helperService.successfulSaveButton(vm.saving);\r\n $uibModalInstance.close(response.data);\r\n } catch {\r\n vm.saving.loadingValue = false;\r\n }\r\n\r\n }\r\n\r\n}","import newRoleModalController from \"./newRoleModal.controller\";\r\nimport swal from \"sweetalert2\";\r\nimport { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, $uibModal, $filter, helperService, rolesDataService) {\r\n\r\n const vm = this;\r\n\r\n vm.openNewRoleModal = openNewRoleModal;\r\n vm.deleteRole = deleteRole;\r\n vm.selectedRoleChanged = selectedRoleChanged;\r\n vm.selectedModuleChanged = selectedModuleChanged;\r\n vm.search;\r\n vm.searchChanged = searchChanged;\r\n vm.changeFilter = changeFilter;\r\n vm.selectRoles = selectRoles;\r\n vm.selectAllRoles = selectAllRoles;\r\n vm.selectedType = {};\r\n vm.dropdownFilters = [\r\n { name: \"All Types\", id: null },\r\n { name: \"Place\", id: 2 },\r\n { name: \"Report\", id: 3 },\r\n { name: \"Dialog\", id: 4 },\r\n { name: \"Action\", id: 5 },\r\n { name: \"Data\", id: 6 }\r\n ]\r\n\r\n activate();\r\n\r\n async function activate() {\r\n vm.selectedType = {};\r\n vm.selectedRole = null;\r\n\r\n let response = await rolesDataService.getModules();\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.modulesDataSource = response.data;\r\n getRoles(null);\r\n }\r\n\r\n async function openNewRoleModal() {\r\n let newRoleModal = $uibModal.open({\r\n templateUrl: '/App/Components/Roles/newRoleModal.html',\r\n controller: newRoleModalController,\r\n controllerAs: 'nrmvm',\r\n backdrop: 'static'\r\n });\r\n\r\n try {\r\n let newRoleId = await newRoleModal.result;\r\n getRoles(newRoleId);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n async function getRoles(preselect) {\r\n vm.selectedModule = null;\r\n\r\n let response = await rolesDataService.getRoles();\r\n if (preselect) {\r\n let mostRecentRole = response.data.find(r => r.ID === preselect);\r\n response.data = response.data.filter(i => i.ID !== preselect);\r\n response.data.unshift(mostRecentRole);\r\n vm.rolesDataSource = response.data;\r\n selectedRoleChanged(mostRecentRole);\r\n } else {\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n vm.selectedRole = null;\r\n vm.rolesDataSource = response.data;\r\n }\r\n }\r\n\r\n async function deleteRole(role) {\r\n try {\r\n await swal(helperService.areYouSureParams('Delete Role', 'Are you sure you want to delete role ' + role.Name + '?', 'Delete'));\r\n await rolesDataService.removeRole(role.ID);\r\n getRoles(null);\r\n } catch (_) {\r\n return;\r\n }\r\n }\r\n\r\n function selectedRoleChanged(event, selectedRole) {\r\n var isRemoval = event.target.classList.contains(\"fa-trash-o\");\r\n\r\n if (selectedRole !== vm.selectedRole && !isRemoval) {\r\n vm.selectedRole = selectedRole;\r\n vm.selectedModule = null;\r\n vm.selectedType = {};\r\n }\r\n }\r\n\r\n function selectedModuleChanged(selectedModule) {\r\n vm.selectedModule = selectedModule;\r\n if (!vm.homeRolesGridDataSource) {\r\n createHomeRolesGrid();\r\n } else {\r\n vm.homeRolesGridDataSource.read();\r\n vm.selectedType = {};\r\n changeFilter(null);\r\n }\r\n }\r\n\r\n async function selectRoles(roles) {\r\n vm.selectionProcessing = true;\r\n //The Value of the checkbox determines which event to fire\r\n let selectedCheckboxValue = roles[0]?.SelectedCheckbox;\r\n let data = {\r\n \"RoleAccesses\": []\r\n };\r\n roles.forEach(role => {\r\n data.RoleAccesses.push({\r\n \"RoleId\": vm.selectedRole.ID,\r\n \"ObjectId\": role.ObjectID\r\n });\r\n });\r\n if (selectedCheckboxValue === true) {\r\n await rolesDataService.addRoleAccess(data);\r\n } else {\r\n await rolesDataService.removeRoleAccess(data);\r\n }\r\n setColumnHeaderToggle(vm.homeRolesGridDataSource.view());\r\n vm.selectionProcessing = false;\r\n vm.allSelectionProcessing = false;\r\n $rootScope.$broadcast('navigation-or-security-change');\r\n }\r\n\r\n function changeFilter(dropdownFilter) {\r\n let dynamicFilter = {};\r\n\r\n if (!dropdownFilter?.id) {\r\n dynamicFilter = {};\r\n } else {\r\n dynamicFilter = { \"filters\": [{ \"operator\": \"eq\", \"value\": dropdownFilter.id, \"field\": \"TypeID\" }], \"logic\": \"and\" };\r\n }\r\n\r\n vm.homeRolesGridDataSource.filter(angular.fromJson(dynamicFilter));\r\n setColumnHeaderToggle(vm.homeRolesGridDataSource._data);\r\n searchChanged();\r\n }\r\n\r\n function createHomeRolesGrid() {\r\n function createObjectModel(TypeID, TypeName, Name, ObjectID, SelectedCheckbox) {\r\n let objectModel = {\r\n \"TypeName\": TypeName,\r\n \"TypeID\": TypeID,\r\n \"Name\": Name,\r\n \"ObjectID\": ObjectID,\r\n \"SelectedCheckbox\": SelectedCheckbox\r\n };\r\n\r\n return objectModel;\r\n }\r\n\r\n const homeRolesGridColumns = [\r\n { title: \" \", headerTemplate: ``, template: ``, width: 55, filterable: false },\r\n { field: \"Name\", filterable: customAutoCompleteFilter },\r\n { field: \"TypeName\", title: \"Type\", filterable: customAutoCompleteFilter }\r\n ];\r\n\r\n vm.homeRolesGridOptions = helperService.setNonPageableGridOptions(homeRolesGridColumns);\r\n\r\n vm.homeRolesGridOptions.noRecords = {\r\n template: \"No Securable Objects
\"\r\n }\r\n\r\n vm.homeRolesGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: async options => {\r\n\r\n let modules = await rolesDataService.getModulesByObjectId(vm.selectedModule.ObjectID);\r\n\r\n //removes modules from grid\r\n modules.data.forEach(function (row, i) {\r\n if (row.TypeID === 1) {\r\n modules.data.splice(i, 1);\r\n }\r\n });\r\n\r\n modules.data = $filter('orderBy')(modules.data, 'Name');\r\n\r\n let objects = [];\r\n for (let i = 0; i < modules.data.length; i++) {\r\n let item = modules.data[i];\r\n objects.push(createObjectModel(item.TypeID, item.TypeName, item.Name, item.ObjectID, false));\r\n }\r\n\r\n let securableobjects = await rolesDataService.getSecurableObjects(vm.selectedRole.ID, vm.selectedModule.ObjectID);\r\n\r\n for (let i = 0; i < securableobjects.data.length; i++) {\r\n let item = securableobjects.data[i];\r\n\r\n for (let j = 0; j < objects.length; j++) {\r\n if (objects[j].ObjectID === item.ObjectID) {\r\n objects[j].SelectedCheckbox = true;\r\n break;\r\n }\r\n }\r\n\r\n }\r\n setColumnHeaderToggle(objects);\r\n options.success(objects);\r\n }\r\n }\r\n });\r\n }\r\n\r\n async function selectAllRoles() {\r\n vm.allSelectionProcessing = true;\r\n kendo.ui.progress(vm.homeRolesGrid.element, true);\r\n let roles = vm.homeRolesGridDataSource._data.filter(role => role.SelectedCheckbox !== vm.allSelectedCheckbox);\r\n if (vm.selectedType.id) {\r\n roles = roles.filter(role => role.TypeID === vm.selectedType.id);\r\n roles.forEach(async role => {\r\n role.SelectedCheckbox = vm.allSelectedCheckbox;\r\n });\r\n } else {\r\n roles.forEach(async role => {\r\n if (role.SelectedCheckbox !== vm.allSelectedCheckbox) {\r\n role.SelectedCheckbox = vm.allSelectedCheckbox;\r\n }\r\n });\r\n }\r\n\r\n roles = roles.filter(role => !vm.search || role.Name.toLowerCase().includes(vm.search));\r\n\r\n if (roles.length) {\r\n await selectRoles(roles);\r\n } else {\r\n vm.allSelectedCheckbox = false;\r\n }\r\n\r\n vm.allSelectionProcessing = false;\r\n kendo.ui.progress(vm.homeRolesGrid.element, false);\r\n }\r\n\r\n function setColumnHeaderToggle(objects) {\r\n if (vm.selectedType.id) {\r\n objects = objects.filter(object => object.TypeID === vm.selectedType.id);\r\n }\r\n\r\n vm.allSelectedCheckbox = objects.length && objects.every(object => object.SelectedCheckbox);\r\n }\r\n\r\n function searchChanged() {\r\n let currentFilter = vm.homeRolesGridDataSource.filter(),\r\n dropdownFilter = currentFilter?.filters.length && currentFilter.filters.find(filter => filter.field === \"TypeID\") || {},\r\n filter = {\r\n filters: [\r\n { field: \"Name\", operator: \"contains\", value: `${vm.search}` }\r\n ]\r\n };\r\n\r\n if (dropdownFilter.field && vm.search) {\r\n filter.logic = \"and\";\r\n filter.filters.push(dropdownFilter);\r\n } else if (!dropdownFilter.field && !vm.search) {\r\n filter = {};\r\n } else if (dropdownFilter.field && !vm.search) {\r\n filter.filters = [dropdownFilter];\r\n }\r\n\r\n if (filter?.filters?.length) {\r\n vm.homeRolesGridDataSource.filter(filter);\r\n }\r\n\r\n setColumnHeaderToggle(vm.homeRolesGridDataSource.view());\r\n }\r\n}","import rolesController from \"./roles.controller\";\r\n\r\n/* roles.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining system roles\r\n * @example \r\n */\r\n\r\nconst roles = {\r\n controller: rolesController,\r\n controllerAs: 'rvm',\r\n templateUrl: '/App/Components/Roles/roles.html'\r\n};\r\n\r\nexport default roles;","import { customAutoCompleteFilter } from \"../../Shared/GlobalVariables/filterVariables\";\r\n\r\nexport default /*@ngInject*/ function ($rootScope, dataService, $filter, helperService, securityAssignmentDataService) {\r\n const vm = this;\r\n\r\n vm.createUserDataSource = createUserDataSource;\r\n vm.helperService = helperService;\r\n vm.selectedRole = null;\r\n vm.roleChanged = roleChanged;\r\n vm.search;\r\n vm.searchChanged = searchChanged;\r\n vm.selectUsers = selectUsers;\r\n vm.selectAllUsers = selectAllUsers;\r\n vm.allSelectedCheckbox = false;\r\n\r\n function roleChanged(selectedRole) {\r\n if (selectedRole !== vm.selectedRole) {\r\n vm.selectedRole = selectedRole;\r\n vm.selectedModule = null;\r\n }\r\n\r\n vm.securityAssignmentUsersGridDataSource.read();\r\n };\r\n\r\n activate();\r\n\r\n async function activate () {\r\n let response = await dataService.getRoles();\r\n\r\n vm.search = \"\";\r\n\r\n response.data = $filter('orderBy')(response.data, 'Name');\r\n\r\n vm.rolesDataSource = response.data;\r\n vm.createUserDataSource();\r\n }\r\n\r\n var objectModelAssignUsersToRole = function (UserID, UserLogonName, Domain, Email, Active, SelectedUserCheckbox) {\r\n this.UserID = UserID,\r\n this.UserLogonName = UserLogonName,\r\n this.Domain = Domain;\r\n this.Email = Email,\r\n this.Active = Active,\r\n this.SelectedUserCheckbox = SelectedUserCheckbox;\r\n };\r\n\r\n function createUserDataSource () {\r\n vm.securityAssignmentUsersGridDataSource = new kendo.data.DataSource({\r\n transport: {\r\n read: async function (options) {\r\n let response = await dataService.getUsers();\r\n response.data = $filter('orderBy')(response.data, 'UserLogonName');\r\n response.data = $filter('filter')(response.data, { Active: true });\r\n\r\n var users = response.data.map(item => {\r\n return new objectModelAssignUsersToRole(\r\n item.UserID,\r\n item.UserLogonName,\r\n item.Domain,\r\n item.Email,\r\n item.Active,\r\n false\r\n );\r\n });\r\n\r\n response = await securityAssignmentDataService.getRoleById(vm.selectedRole.ID);\r\n\r\n response.data.forEach(userRole => {\r\n let foundUser = users.find(user => userRole.UserID === user.UserID);\r\n\r\n if (foundUser) {\r\n foundUser.SelectedUserCheckbox = true;\r\n }\r\n });\r\n\r\n vm.allSelectedCheckbox = users.every(user => user.SelectedUserCheckbox);\r\n\r\n options.success(users);\r\n }\r\n }\r\n });\r\n\r\n };\r\n\r\n vm.securityAssignmentShowUsersGridOptions = helperService.setNonPageableGridOptions([\r\n { headerTemplate: ``, template: \"\", width: 55, filterable: false },\r\n { field: \"UserLogonName\", title: \"User Name\", filterable: customAutoCompleteFilter },\r\n { field: \"Email\", filterable: customAutoCompleteFilter }\r\n ]);\r\n\r\n\r\n async function selectAllUsers() {\r\n let users = vm.securityAssignmentUsersGridDataSource._data.filter(user => user.SelectedUserCheckbox !== vm.allSelectedCheckbox);\r\n\r\n kendo.ui.progress(vm.assignmentsGrid.element, true);\r\n\r\n users = users.filter(user => !vm.search || user.UserLogonName.toLowerCase().includes(vm.search) || user.Email.toLowerCase().includes(vm.search));\r\n\r\n users.forEach(user => {\r\n if (user.SelectedUserCheckbox !== vm.allSelectedCheckbox) {\r\n user.SelectedUserCheckbox = vm.allSelectedCheckbox;\r\n }\r\n });\r\n\r\n await selectUsers(users);\r\n }\r\n\r\n async function selectUsers (users) {\r\n let checked = users?.[0]?.SelectedUserCheckbox,\r\n data = {\r\n UserRoles: []\r\n };\r\n\r\n vm.selectionProcessing = true;\r\n\r\n users.forEach(user => {\r\n data.UserRoles.push({\r\n roleId: vm.selectedRole.ID,\r\n userId: user.UserID\r\n });\r\n });\r\n\r\n if (users.length) {\r\n try {\r\n\r\n if (checked && users.length) {\r\n await securityAssignmentDataService.addAssignments(data);\r\n } else if (users.length) {\r\n await securityAssignmentDataService.removeAssignments(data);\r\n }\r\n\r\n $rootScope.$broadcast('navigation-or-security-change');\r\n } catch (err) {\r\n activate();\r\n }\r\n }\r\n\r\n checkAllSelected();\r\n kendo.ui.progress(vm.assignmentsGrid.element, false);\r\n vm.selectionProcessing = false;\r\n }\r\n\r\n function searchChanged() {\r\n let filter = {\r\n logic: \"or\",\r\n filters: [\r\n { field: \"UserLogonName\", operator: \"contains\", value: `${vm.search}` },\r\n { field: \"Email\", operator: \"contains\", value: `${vm.search}` }\r\n ]\r\n };\r\n\r\n if (vm.search) {\r\n vm.securityAssignmentUsersGridDataSource.filter(filter);\r\n } else {\r\n vm.securityAssignmentUsersGridDataSource.filter({});\r\n }\r\n\r\n checkAllSelected();\r\n }\r\n\r\n function checkAllSelected() {\r\n let view = vm.securityAssignmentUsersGridDataSource.view();\r\n\r\n vm.allSelectedCheckbox = view.length && view.every(user => user.SelectedUserCheckbox);\r\n }\r\n}","import controller from \"./securityAssignment.controller\";\r\n\r\n/* securityAssignment.component.js */\r\n\r\n/**\r\n * @desc component for viewing and maintaining system roles\r\n * @example \r\n */\r\n\r\nconst securityAssignment = {\r\n controller: controller,\r\n controllerAs: 'savm',\r\n templateUrl: '/App/Components/securityAssignment/securityAssignment.tmpl.html'\r\n};\r\n\r\nexport default securityAssignment;","import angular from 'angular';\r\nimport rolesDataServiceFactory from '../Components/Roles/rolesDataService.factory';\r\nimport securityAssignmentDataServiceFactory from '../Components/securityAssignment/securityAssignmentDataService.factory';\r\nimport usersDataServiceFactory from '../Components/Users/usersDataService.factory';\r\nimport passwordCriteria from '../Components/Configuration/PasswordCriteria/passwordCriteria.component';\r\nimport passwordCriteriaDataServiceFactory from '../Components/Configuration/PasswordCriteria/passwordCriteriaDataService.factory';\r\nimport auditLogs from '../Components/AuditLogs/auditLogs.component';\r\nimport users from '../Components/Users/users.component';\r\nimport roles from '../Components/Roles/roles.component';\r\nimport securityAssignment from '../Components/securityAssignment/securityAssignment.component';\r\n\r\nexport default angular\r\n .module('app.securitySetup', [])\r\n .component('roles', roles)\r\n .factory('rolesDataService', rolesDataServiceFactory)\r\n .component('securityAssignment', securityAssignment)\r\n .factory('securityAssignmentDataService', securityAssignmentDataServiceFactory)\r\n .component('users', users)\r\n .factory('usersDataService', usersDataServiceFactory)\r\n .component('passwordCriteria', passwordCriteria)\r\n .factory('passwordCriteriaDataService', passwordCriteriaDataServiceFactory)\r\n .component('auditLogs', auditLogs)\r\n .name;","import angular from 'angular';\r\nimport appSharedModule from './Shared/shared.module';\r\nimport accessRiskMonitorModule from './AccessRiskMonitor/accessRiskMonitor.module';\r\nimport accessCertificationsModule from './AccessCertifications/accessCertifications.module';\r\nimport auditTrailModule from './AuditTrail/auditTrail.module';\r\nimport securityDesignerModule from './SecurityDesigner/securityDesigner.module';\r\nimport identityManagerModule from './IdentityManager/identityManager.module';\r\nimport reportManagementModule from './ReportManagement/reportManagement.module';\r\nimport transactionMonitoringModule from './TransactionMonitoring/transactionMonitoring.module';\r\nimport systemConfigurationModule from './SystemConfiguration/systemConfiguration.module';\r\nimport integrationsModule from './Integrations/integrations.module';\r\nimport securitySetupModule from './SecuritySetup/securitySetup.module';\r\n\r\nexport default angular\r\n .module('app', [\r\n appSharedModule,\r\n accessRiskMonitorModule,\r\n accessCertificationsModule,\r\n auditTrailModule,\r\n securityDesignerModule,\r\n identityManagerModule,\r\n reportManagementModule,\r\n transactionMonitoringModule,\r\n systemConfigurationModule,\r\n integrationsModule,\r\n securitySetupModule\r\n ])\r\n // constants\r\n .constant('config', {\r\n appName: 'Fastpath Stratus',\r\n appVersion: 1.0\r\n });","/**\r\n * INSPINIA - Responsive Admin Theme\r\n * 2.6.2\r\n *\r\n * Custom scripts\r\n */\r\n\r\n$(document).ready(function () {\r\n\r\n // Full height of sidebar\r\n function fix_height() {\r\n var heightWithoutNavbar = $(\"body > #wrapper\").height() - 61;\r\n $(\".sidebard-panel\").css(\"min-height\", heightWithoutNavbar + \"px\");\r\n\r\n var navbarHeigh = $('nav.navbar-default').height();\r\n var wrapperHeigh = $('#page-wrapper').height();\r\n\r\n if (navbarHeigh > wrapperHeigh) {\r\n $('#page-wrapper').css(\"min-height\", navbarHeigh + \"px\");\r\n }\r\n\r\n if (navbarHeigh < wrapperHeigh) {\r\n $('#page-wrapper').css(\"min-height\", $(window).height() + \"px\");\r\n }\r\n\r\n if ($('body').hasClass('fixed-nav')) {\r\n if (navbarHeigh > wrapperHeigh) {\r\n $('#page-wrapper').css(\"min-height\", navbarHeigh + \"px\");\r\n } else {\r\n $('#page-wrapper').css(\"min-height\", $(window).height() - 60 + \"px\");\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n $(window).bind(\"load resize scroll\", function () {\r\n if (!$(\"body\").hasClass('body-small')) {\r\n fix_height();\r\n }\r\n });\r\n\r\n // Move right sidebar top after scroll\r\n $(window).scroll(function () {\r\n if ($(window).scrollTop() > 0 && !$('body').hasClass('fixed-nav')) {\r\n $('#right-sidebar').addClass('sidebar-top');\r\n } else {\r\n $('#right-sidebar').removeClass('sidebar-top');\r\n }\r\n });\r\n\r\n // Move right sidebar notifications top after scroll\r\n $(window).scroll(function () {\r\n if ($(window).scrollTop() > 0 && !$('body').hasClass('fixed-nav')) {\r\n $('#right-sidebar-notifications').addClass('sidebar-top');\r\n } else {\r\n $('#right-sidebar-notifications').removeClass('sidebar-top');\r\n }\r\n });\r\n\r\n\r\n setTimeout(function () {\r\n fix_height();\r\n })\r\n});\r\n\r\n// Minimalize menu when screen is less than 768px\r\n$(function () {\r\n $(window).bind(\"load resize\", function () {\r\n if ($(document).width() < 769) {\r\n $('body').addClass('body-small')\r\n } else {\r\n $('body').removeClass('body-small')\r\n }\r\n })\r\n})\r\n","!function (a, b, c, d, e, f, g, h) {\r\n a.RaygunObject = e, a[e] = a[e] || function () {\r\n (a[e].o = a[e].o || []).push(arguments)\r\n }, f = b.createElement(c), g = b.getElementsByTagName(c)[0],\r\n f.async = 1, f.src = d, g.parentNode.insertBefore(f, g), h = a.onerror, a.onerror = function (b, c, d, f, g) {\r\n h && h(b, c, d, f, g), g || (g = new Error(b)), a[e].q = a[e].q || [], a[e].q.push({\r\n e: g\r\n })\r\n }\r\n}(window, document, \"script\", \"//cdn.raygun.io/raygun4js/raygun.min.js\", \"rg4js\");","/**\r\n * # angular-elastic-builder\r\n * ## Angular Module for building an Elasticsearch Query\r\n *\r\n * @version v1.5.1\r\n * @link https://github.com/dncrews/angular-elastic-builder.git\r\n * @license MIT\r\n * @author Dan Crews \r\n */\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/module.js\r\n *\r\n * Angular Module for building an Elasticsearch query\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('angular-elastic-builder', [\r\n 'RecursionHelper',\r\n 'ui.bootstrap',\r\n ]);\r\n\r\n})(window.angular);\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/directives/BuilderDirective.js\r\n *\r\n * Angular Directive for injecting a query builder form.\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('angular-elastic-builder')\r\n .directive('elasticBuilder', [\r\n 'elasticQueryService',\r\n\r\n function EB(elasticQueryService) {\r\n\r\n return {\r\n scope: {\r\n data: '=elasticBuilder',\r\n },\r\n\r\n templateUrl: 'angular-elastic-builder/BuilderDirective.html',\r\n\r\n link: function (scope) {\r\n var data = scope.data;\r\n\r\n scope.filters = [];\r\n\r\n /**\r\n * Removes either Group or Rule\r\n */\r\n scope.removeChild = function (idx) {\r\n scope.filters.splice(idx, 1);\r\n };\r\n\r\n /**\r\n * Adds a Single Rule\r\n */\r\n scope.addRule = function () {\r\n scope.filters.push({});\r\n };\r\n\r\n /**\r\n * Adds a Group of Rules\r\n */\r\n scope.addGroup = function () {\r\n scope.filters.push({\r\n type: 'group',\r\n subType: 'and',\r\n rules: [],\r\n });\r\n };\r\n\r\n /**\r\n * Any time \"outside forces\" change the query, they should tell us so via\r\n * `data.needsUpdate`\r\n */\r\n scope.$watch('data.needsUpdate', function (curr) {\r\n if (!curr) return;\r\n\r\n scope.filters = elasticQueryService.toFilters(data.query, scope.data.fields);\r\n if (data.dateQuery) {\r\n scope.filters = scope.filters.concat(elasticQueryService.toFilters(data.dateQuery, scope.data.fields));\r\n }\r\n scope.data.needsUpdate = false;\r\n });\r\n\r\n /**\r\n * Changes on the page update the Query\r\n */\r\n scope.$watch('filters', function (curr) {\r\n if (!curr) return;\r\n\r\n data.query = elasticQueryService.toQuery(scope.filters, scope.data.fields);\r\n data.dateQuery = elasticQueryService.toDateQuery(scope.filters, scope.data.fields);\r\n }, true);\r\n },\r\n };\r\n },\r\n\r\n ]);\r\n\r\n})(window.angular);\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/directives/Chooser.js\r\n *\r\n * This file is to help recursively, to decide whether to show a group or rule\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n var app = angular.module('angular-elastic-builder');\r\n\r\n app.directive('elasticBuilderChooser', [\r\n 'RecursionHelper',\r\n 'groupClassHelper',\r\n\r\n function elasticBuilderChooser(RH, groupClassHelper) {\r\n\r\n return {\r\n scope: {\r\n elasticFields: '=',\r\n item: '=elasticBuilderChooser',\r\n onRemove: '&',\r\n },\r\n\r\n templateUrl: 'angular-elastic-builder/ChooserDirective.html',\r\n\r\n compile: function (element) {\r\n return RH.compile(element, function (scope, el, attrs) {\r\n var depth = scope.depth = (+attrs.depth)\r\n , item = scope.item;\r\n\r\n scope.getGroupClassName = function () {\r\n var level = depth;\r\n if (item.type === 'group') level++;\r\n\r\n return groupClassHelper(level);\r\n };\r\n });\r\n },\r\n };\r\n },\r\n\r\n ]);\r\n\r\n})(window.angular);\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/directives/Group.js\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n var app = angular.module('angular-elastic-builder');\r\n\r\n app.directive('elasticBuilderGroup', [\r\n 'RecursionHelper',\r\n 'groupClassHelper',\r\n\r\n function elasticBuilderGroup(RH, groupClassHelper) {\r\n\r\n return {\r\n scope: {\r\n elasticFields: '=',\r\n group: '=elasticBuilderGroup',\r\n onRemove: '&',\r\n },\r\n\r\n templateUrl: 'angular-elastic-builder/GroupDirective.html',\r\n\r\n compile: function (element) {\r\n return RH.compile(element, function (scope, el, attrs) {\r\n var depth = scope.depth = (+attrs.depth);\r\n var group = scope.group;\r\n\r\n scope.addRule = function () {\r\n group.rules.push({});\r\n };\r\n scope.addGroup = function () {\r\n group.rules.push({\r\n type: 'group',\r\n subType: 'and',\r\n rules: [],\r\n });\r\n };\r\n\r\n scope.removeChild = function (idx) {\r\n group.rules.splice(idx, 1);\r\n };\r\n\r\n scope.getGroupClassName = function () {\r\n return groupClassHelper(depth + 1);\r\n };\r\n });\r\n },\r\n };\r\n },\r\n\r\n ]);\r\n\r\n})(window.angular);\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/directives/Rule.js\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n var app = angular.module('angular-elastic-builder');\r\n\r\n app.directive('elasticBuilderRule', [\r\n\r\n function elasticBuilderRule() {\r\n return {\r\n scope: {\r\n elasticFields: '=',\r\n rule: '=elasticBuilderRule',\r\n onRemove: '&',\r\n },\r\n\r\n templateUrl: 'angular-elastic-builder/RuleDirective.html',\r\n\r\n link: function (scope) {\r\n scope.getType = function () {\r\n var fields = scope.elasticFields;\r\n\r\n if (scope.rule.field) {\r\n var field = fields.findIndex(function (item) {\r\n return item.displayName === scope.rule.field.displayName;\r\n });\r\n scope.rule.field.fieldIndex = field;\r\n }\r\n\r\n if (!fields || field === undefined) return;\r\n\r\n return fields[field].type;\r\n };\r\n scope.clearValues = function () {\r\n scope.rule.subType = null;\r\n scope.rule.values = null;\r\n scope.rule.value = null;\r\n };\r\n },\r\n };\r\n },\r\n\r\n ]);\r\n\r\n})(window.angular);\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/directives/RuleTypes.js\r\n *\r\n * Determines which Rule type should be displayed\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n var app = angular.module('angular-elastic-builder');\r\n\r\n app.directive('elasticType', ['$http', '$rootScope', elasticType]);\r\n\r\n function elasticType($http, $rootScope) {\r\n return {\r\n scope: {\r\n type: '=elasticType',\r\n rule: '=',\r\n guide: '='\r\n },\r\n\r\n template: '',\r\n\r\n link: function (scope) {\r\n scope.getTemplateUrl = function () {\r\n var type = scope.type;\r\n if (!type) return;\r\n if (typeof type !== 'string') return;\r\n type = type.charAt(0).toUpperCase() + type.slice(1);\r\n\r\n return 'angular-elastic-builder/types/' + type + '.html';\r\n };\r\n\r\n // This is a weird hack to make sure these are numbers\r\n scope.booleans = ['False', 'True'];\r\n scope.booleansOrder = ['True', 'False'];\r\n\r\n scope.datesNeeded = function () {\r\n var needs = [\r\n 'Range'\r\n ];\r\n\r\n return ~needs.indexOf(scope.rule.subType);\r\n };\r\n\r\n scope.timeNeeded = function () {\r\n var needs = [\r\n 'Equals',\r\n 'LessThan',\r\n 'GreaterThan'\r\n ];\r\n\r\n return ~needs.indexOf(scope.rule.subType);\r\n };\r\n\r\n scope.inputNeeded = function () {\r\n var needs = [\r\n 'LastNumberOf',\r\n 'Equals',\r\n 'NotEquals',\r\n 'GreaterThan',\r\n 'GreaterThanOrEqual',\r\n 'LessThan',\r\n 'LessThanOrEqual',\r\n 'Contains',\r\n 'DoesNotContain',\r\n 'StartsWith',\r\n 'EndsWith'\r\n ];\r\n\r\n return ~needs.indexOf(scope.rule.subType);\r\n };\r\n\r\n scope.multiNeeded = function () {\r\n var needs = [\r\n 'Equals',\r\n 'NotEquals'\r\n ];\r\n\r\n return ~needs.indexOf(scope.rule.subType);\r\n };\r\n\r\n scope.periodNeeded = function () {\r\n var needs = [\r\n 'Previous',\r\n 'ToDate'\r\n ];\r\n\r\n return ~needs.indexOf(scope.rule.subType);\r\n };\r\n\r\n scope.pluralPeriodNeeded = function () {\r\n var needs = [\r\n 'LastNumberOf'\r\n ];\r\n\r\n return ~needs.indexOf(scope.rule.subType);\r\n };\r\n\r\n scope.today = function () {\r\n scope.rule.date = new Date();\r\n };\r\n scope.today();\r\n\r\n scope.clear = function () {\r\n scope.rule.date = null;\r\n };\r\n\r\n scope.startDateOptions = {\r\n dateDisabled: scope.disabled,\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n startingDay: 1,\r\n showWeeks: false\r\n };\r\n\r\n scope.endDateOptions = {\r\n formatYear: 'yy',\r\n maxDate: new Date(),\r\n startingDay: 1,\r\n showWeeks: false\r\n };\r\n\r\n scope.disabled = function (data) {\r\n var date = data.date,\r\n mode = data.mode;\r\n return mode === 'day' && date > scope.rule.endDate;\r\n };\r\n\r\n scope.open1 = function () {\r\n scope.popup1.opened = true;\r\n };\r\n\r\n scope.open2 = function () {\r\n scope.popup2.opened = true;\r\n };\r\n\r\n scope.setDate = function (year, month, day) {\r\n scope.rule.date = new Date(year, month - 1, day);\r\n };\r\n\r\n scope.popup1 = { opened: false };\r\n scope.popup2 = { opened: false };\r\n\r\n if (!scope.rule.startTime && !scope.rule.endTime) {\r\n scope.rule.startTime = new Date;\r\n scope.rule.startTime.setHours(0, 0, 0, 0);\r\n scope.rule.endTime = new Date;\r\n scope.rule.endTime.setHours(0, 0, 0, 0);\r\n }\r\n\r\n scope.getChoices = function (criteria) {\r\n if (scope.rule.values && scope.rule.values.length > 0) {\r\n var defaultValues = angular.copy(scope.rule.values);\r\n }\r\n $http.get(apiUrl + criteria.link).then(function (response) {\r\n if (response.data.length === 0) { return; }\r\n if (response.data.some(function (choice) { return choice.UserHasAccess === false; })) {\r\n response.data = response.data.filter(function (choice) { return choice.UserHasAccess; });\r\n }\r\n var choices = angular.copy(response.data);\r\n var parentVm = scope.$parent.$parent.$parent.$parent.$parent.$parent.vm;\r\n if (choices.length > 0 && choices[0].RulesetId) {\r\n choices = choices.filter(function (row) {\r\n return row.RulesetId === parentVm.selectedRuleset.RulesetId;\r\n });\r\n }\r\n if (choices[0].ProductType && parentVm.selectedProducts && parentVm.selectedProducts.length === 1) {\r\n choices = choices.filter(function (row) {\r\n return row.ProductType === parentVm.selectedProducts[0].Type;\r\n });\r\n }\r\n if (choices[0].ProductType && parentVm.selectedProduct) {\r\n choices = choices.filter(function (row) {\r\n return row.ProductType === parentVm.selectedProduct.Type;\r\n });\r\n }\r\n var mappedData = choices.map(function (item) {\r\n return {\r\n 'Name': item[criteria.label],\r\n 'Id': item[criteria.identifier]\r\n };\r\n });\r\n scope.guide.choices = mappedData;\r\n if (defaultValues) {\r\n scope.rule.values = [];\r\n for (var i = 0; i < defaultValues.length; i++) {\r\n var defaultValue = defaultValues[i];\r\n var valueToAdd = mappedData.find(function (row) {\r\n return row.Id === defaultValue.Id;\r\n });\r\n if (!valueToAdd) {\r\n valueToAdd = mappedData.find(function (row) {\r\n return row.Name === defaultValue.Id;\r\n });\r\n }\r\n scope.rule.values.push(valueToAdd);\r\n scope.rule.values = scope.rule.values.filter(function (value) {\r\n return value.Name;\r\n });\r\n }\r\n }\r\n });\r\n };\r\n\r\n scope.clearValues = function (route) {\r\n scope.rule.values = null;\r\n scope.rule.value = null;\r\n };\r\n }\r\n\r\n };\r\n }\r\n\r\n})(window.angular);\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/services/GroupClassHelper.js\r\n *\r\n * This keeps all of the groups colored correctly\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('angular-elastic-builder')\r\n .factory('groupClassHelper', function groupClassHelper() {\r\n\r\n return function (level) {\r\n var levels = [\r\n '',\r\n 'list-group-item-info',\r\n 'list-group-item-success',\r\n 'list-group-item-warning',\r\n 'list-group-item-danger',\r\n ];\r\n\r\n return levels[level % levels.length];\r\n };\r\n });\r\n\r\n})(window.angular);\r\n\r\n/**\r\n * angular-elastic-builder\r\n *\r\n * /src/services/QueryService.js\r\n *\r\n * This file is used to convert filters into queries, and vice versa\r\n */\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('angular-elastic-builder')\r\n .factory('elasticQueryService', [\r\n '$filter',\r\n\r\n function ($filter) {\r\n\r\n return {\r\n toFilters: toFilters,\r\n toQuery: function (userFilters, fields) {\r\n return toQuery(userFilters, fields, $filter);\r\n },\r\n toDateQuery: function (userFilters, fields) {\r\n return toDateQuery(userFilters, fields, $filter);\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n function toFilters(query, fields) {\r\n var filters = parseQueryGroup(query, fields);\r\n\r\n return filters;\r\n }\r\n\r\n function toQuery(userFilters, fields, $filter) {\r\n var query = parseFilterGroup(userFilters, fields, $filter);\r\n return query;\r\n }\r\n\r\n function toDateQuery(userFilters, fields, $filter) {\r\n var dateQuery = parseDateFilterGroup(userFilters, fields);\r\n return dateQuery;\r\n }\r\n\r\n function parseQueryGroup(query, fields) {\r\n if (!fields || !query) return;\r\n\r\n var filtersArray = [];\r\n\r\n for (var i = 0; i < query.length; i++) {\r\n var filterObject = {};\r\n var queryObject = query[i];\r\n var matchingField = fields.find(function (field) {\r\n if (queryObject.DisplayName) {\r\n return field.displayName.toLowerCase() === queryObject.DisplayName.toLowerCase() && field.fieldName.toLowerCase() === queryObject.FieldName.toLowerCase();\r\n } else {\r\n return field.fieldName.toLowerCase() === queryObject.FieldName.toLowerCase();\r\n }\r\n });\r\n\r\n if (!matchingField) {\r\n // need to look for textField\r\n for (var key in fields) {\r\n if (fields[key].textField === queryObject.FieldName) {\r\n matchingField = fields[key];\r\n }\r\n }\r\n }\r\n // Operator needs to be capitalized\r\n var operator = queryObject.Operator;\r\n if (operator) {\r\n operator = operator.charAt(0).toUpperCase() + operator.substr(1);\r\n }\r\n\r\n filterObject.field = matchingField;\r\n\r\n if (matchingField.type === \"Multi\" && (operator === \"Equals\" || operator === \"NotEquals\")) {\r\n filterObject.subType = operator;\r\n filterObject.value = null;\r\n // First check if there's already an object for this Filter\r\n var existingFilterIndex = filtersArray.findIndex(function (f) { return f.field.fieldName === queryObject.FieldName; });\r\n if (existingFilterIndex >= 0) {\r\n // Take the value from this Filter and add it to the existing one\r\n var filterValueObject = {};\r\n filterValueObject.Name = queryObject.ValueName;\r\n filterValueObject.Id = queryObject.Value;\r\n filtersArray[existingFilterIndex].values.push(filterValueObject);\r\n } else {\r\n // We need to set up an array of values for the multi select\r\n filterObject.value = null;\r\n filterObject.values = [];\r\n var filterValueObject = {};\r\n filterValueObject.Name = queryObject.ValueName;\r\n filterValueObject.Id = queryObject.Value;\r\n filterObject.values.push(filterValueObject);\r\n filtersArray.push(filterObject);\r\n }\r\n } else if ((matchingField.type.toUpperCase() === \"DATE\" || matchingField.type.toUpperCase() === \"DATETIME\") && (queryObject.DateType || queryObject.Operator.includes('ThanOrEqual'))) {\r\n var date = new Date(queryObject.Value);\r\n if (queryObject.Operator === \"GreaterThanOrEqual\" || queryObject.Operator === \"LessThanOrEqual\") {\r\n var existingDateFilterIndex = filtersArray.findIndex(function (filter) { return filter.field.fieldName === queryObject.FieldName; });\r\n if (existingDateFilterIndex > -1) {\r\n if (matchingField.type === \"DateTime\") {\r\n filtersArray[existingDateFilterIndex].endTime = date;\r\n }\r\n filtersArray[existingDateFilterIndex].endDate = date;\r\n } else {\r\n filterObject.subType = 'Range';\r\n filterObject.startDate = date;\r\n filterObject.startTime = date;\r\n filtersArray.push(filterObject);\r\n }\r\n } else {\r\n // Handle non date range filters here\r\n filterObject.subType = queryObject.DateType;\r\n filterObject.periodType = queryObject.Period;\r\n filterObject.value = queryObject.Value;\r\n filtersArray.push(filterObject);\r\n }\r\n } else {\r\n filterObject.subType = operator;\r\n filterObject.value = query[i].Value;\r\n if (filterObject.value === true) { filterObject.value = 1; }\r\n if (filterObject.value === false) { filterObject.value = 0; }\r\n filterObject.values = null;\r\n filtersArray.push(filterObject);\r\n }\r\n }\r\n return filtersArray;\r\n\r\n }\r\n\r\n\r\n function parseFilterGroup(userFilters, fields, $filter) {\r\n if (!fields || !userFilters) return;\r\n\r\n var queryArray = [];\r\n\r\n for (var i = 0; i < userFilters.length; i++) {\r\n var filterObject = {};\r\n if (userFilters[i].field) {\r\n var fieldName = userFilters[i].field.fieldName;\r\n var fieldIndex = fields.findIndex(function (item) { return item.displayName === userFilters[i].field.displayName; });\r\n } else {\r\n continue;\r\n }\r\n\r\n var fieldData = fields[fieldIndex];\r\n\r\n if (fieldIndex < 0) continue;\r\n\r\n switch (fieldData.type.toUpperCase()) {\r\n case 'STRING':\r\n if (!userFilters[i].subType) continue;\r\n\r\n filterObject.FieldName = fieldName;\r\n filterObject.Value = userFilters[i].value;\r\n filterObject.Operator = userFilters[i].subType;\r\n break;\r\n case 'BOOLEAN':\r\n filterObject.FieldName = fieldName;\r\n filterObject.Value = userFilters[i].value;\r\n filterObject.Operator = 'Equals';\r\n break;\r\n case 'NUMBER':\r\n if (!userFilters[i].subType) continue;\r\n filterObject.FieldName = fieldName;\r\n filterObject.Value = userFilters[i].value;\r\n filterObject.Operator = userFilters[i].subType;\r\n break;\r\n case 'DATE':\r\n case 'DATETIME':\r\n if (fieldData.type.toUpperCase() === 'DATETIME' && (!userFilters[i].startTime || !userFilters[i].endTime)) continue;\r\n if (userFilters[i].subType === 'IsEmpty' || userFilters[i].subType === 'IsNotEmpty') {\r\n filterObject.FieldName = fieldName;\r\n filterObject.Value = userFilters[i].value;\r\n filterObject.Operator = userFilters[i].subType;\r\n queryArray.push(filterObject);\r\n continue;\r\n }\r\n\r\n if (userFilters[i].subType !== 'Range') continue;\r\n if (!userFilters[i].startDate || !userFilters[i].endDate) continue;\r\n var startDate = {};\r\n var endDate = {};\r\n startDate.FieldName = fieldName;\r\n startDate.Operator = 'GreaterThanOrEqual';\r\n startDate.Value = userFilters[i].startDate;\r\n endDate.FieldName = fieldName;\r\n endDate.Operator = 'LessThanOrEqual';\r\n endDate.Value = userFilters[i].endDate;\r\n\r\n if (fieldData.type.toUpperCase() === 'DATETIME') {\r\n if (!userFilters[i].startTime || !userFilters[i].endTime) continue;\r\n\r\n var startTimeHours = userFilters[i].startTime.getHours();\r\n var startTimeMinutes = userFilters[i].startTime.getMinutes();\r\n startDate.Value.setHours(startTimeHours);\r\n startDate.Value.setMinutes(startTimeMinutes);\r\n\r\n var endTimeHours = userFilters[i].endTime.getHours();\r\n var endTimeMinutes = userFilters[i].endTime.getMinutes();\r\n endDate.Value.setHours(endTimeHours);\r\n endDate.Value.setMinutes(endTimeMinutes);\r\n }\r\n\r\n if (startDate.Value && endDate.Value) {\r\n queryArray.push(startDate);\r\n queryArray.push(endDate);\r\n }\r\n break;\r\n case 'MULTI':\r\n if (!userFilters[i].subType) continue;\r\n switch (userFilters[i].subType) {\r\n case 'Contains':\r\n case 'DoesNotContain':\r\n case 'StartsWith':\r\n case 'EndsWith':\r\n case 'IsEmpty':\r\n case 'IsNotEmpty':\r\n if (!userFilters[i].value && userFilters[i].subType !== 'IsEmpty' && userFilters[i].subType !== 'IsNotEmpty') continue;\r\n filterObject.FieldName = userFilters[i].field.textField;\r\n filterObject.Operator = userFilters[i].subType;\r\n filterObject.Value = userFilters[i].value;\r\n break;\r\n case 'Equals':\r\n case 'NotEquals':\r\n if (!userFilters[i].values) continue;\r\n for (var a = 0; a < userFilters[i].values.length; a++) {\r\n var multiFilter = {};\r\n if (userFilters[i].values[a].Name) {\r\n multiFilter.FieldName = fieldName;\r\n } else {\r\n multiFilter.FieldName = userFilters[i].field.textField;\r\n }\r\n multiFilter.Operator = userFilters[i].subType;\r\n multiFilter.Value = userFilters[i].values[a].Id;\r\n multiFilter.CriteriaValue = userFilters[i].values[a].Name;\r\n multiFilter.CriteriaDisplayName = userFilters[i].field.displayName;\r\n queryArray.push(multiFilter);\r\n }\r\n }\r\n break;\r\n case 'TIME':\r\n if (!userFilters.subType) continue;\r\n\r\n filterObject.Value = formatDate($filter, userFilters[i].time, 'shortTime');\r\n filterObject.FieldName = fieldName;\r\n filterObject.Operator = userFilters[i].subType;\r\n break;\r\n default:\r\n break;\r\n }\r\n if (filterObject.Value !== undefined && fieldData.type !== 'Boolean') {\r\n queryArray.push(filterObject);\r\n } else if (fieldData.type === 'Boolean') {\r\n queryArray.push(filterObject);\r\n }\r\n }\r\n return queryArray;\r\n }\r\n\r\n function parseDateFilterGroup(userFilters, fields) {\r\n if (!fields || !userFilters) return;\r\n\r\n var dateQueryArray = [];\r\n\r\n for (var i = 0; i < userFilters.length; i++) {\r\n var filterObject = {};\r\n if (userFilters[i].field) {\r\n var fieldName = userFilters[i].field.fieldName;\r\n var fieldData = fields.find(function (f) {\r\n return f.fieldName === fieldName;\r\n });\r\n }\r\n if (!fieldData || !userFilters[i].subType || userFilters[i].subType === 'Range') continue;\r\n\r\n if (fieldData.type.toUpperCase() === 'DATE' || fieldData.type.toUpperCase() === 'DATETIME') {\r\n if (userFilters[i].subType === 'IsEmpty' || userFilters[i].subType === 'IsNotEmpty') continue;\r\n\r\n filterObject.DateType = userFilters[i].subType;\r\n filterObject.FieldName = fieldName;\r\n filterObject.Period = userFilters[i].periodType;\r\n filterObject.Value = userFilters[i].value;\r\n\r\n dateQueryArray.push(filterObject);\r\n }\r\n }\r\n\r\n return dateQueryArray;\r\n }\r\n\r\n function getFilterTemplate(type) {\r\n var templates = {\r\n group: {\r\n type: 'group',\r\n subType: '',\r\n rules: []\r\n },\r\n item: {\r\n field: '',\r\n subType: '',\r\n value: ''\r\n },\r\n number: {\r\n field: '',\r\n subType: '',\r\n value: null\r\n }\r\n };\r\n\r\n return angular.copy(templates[type]);\r\n }\r\n\r\n function formatDate($filter, date, dateFormat) {\r\n if (!angular.isDate(date)) return false;\r\n var fDate = $filter('date')(date, dateFormat);\r\n return fDate;\r\n }\r\n\r\n})(window.angular);\r\n\r\n(function(angular) {\"use strict\"; angular.module(\"angular-elastic-builder\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"angular-elastic-builder/BuilderDirective.html\",\"\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/ChooserDirective.html\",\"\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/GroupDirective.html\",\"\\r\\n
\\r\\n If\\r\\n \\r\\n of these conditions are met\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/RuleDirective.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/types/Boolean.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/types/Date.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/types/DateTime.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/types/Multi.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/types/Number.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/types/String.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\");\r\n$templateCache.put(\"angular-elastic-builder/types/Time.html\",\"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\");}]);})(window.angular);","angular.module('oi.select', []);\r\nangular.module('oi.select')\r\n\r\n .provider('oiSelect', function () {\r\n return {\r\n options: {\r\n debounce: 500,\r\n searchFilter: 'oiSelectCloseIcon',\r\n dropdownFilter: 'oiSelectHighlight',\r\n listFilter: 'oiSelectAscSort',\r\n groupFilter: 'oiSelectGroup',\r\n editItem: false,\r\n newItem: false,\r\n closeList: true,\r\n saveTrigger: 'enter tab blur',\r\n minlength: 0\r\n },\r\n version: {\r\n full: '0.2.21',\r\n major: 0,\r\n minor: 2,\r\n dot: 21\r\n },\r\n $get: function () {\r\n return {\r\n options: this.options,\r\n version: this.version\r\n };\r\n }\r\n };\r\n })\r\n\r\n .factory('oiSelectEscape', function () {\r\n var rEscapableCharacters = /[-/\\\\^$*+?.()|[\\]{}<>]/g; // cache escape + match String\r\n var sEscapeMatch = '\\\\$&';\r\n\r\n return function (string) {\r\n return String(string).replace(rEscapableCharacters, sEscapeMatch);\r\n };\r\n })\r\n\r\n .factory('oiSelectEditItem', function () {\r\n return function (removedItem, lastQuery, getLabel, itemIsCorrected) {\r\n return itemIsCorrected ? '' : getLabel(removedItem);\r\n };\r\n })\r\n\r\n .factory('oiUtils', ['$document', '$timeout', function ($document, $timeout) {\r\n /**\r\n * Check to see if a DOM element is a descendant of another DOM element.\r\n *\r\n * @param {DOM element} container\r\n * @param {DOM element} contained\r\n * @param {string} class name of element in container\r\n * @returns {boolean}\r\n */\r\n function contains(container, contained, className) {\r\n var current = contained;\r\n\r\n while (current && current.ownerDocument && current.nodeType !== 11) {\r\n if (className) {\r\n if (current === container) {\r\n return false;\r\n }\r\n if (current.className.indexOf(className) >= 0) { //current.classList.contains(className) doesn't work in IE9\r\n return true;\r\n }\r\n } else {\r\n if (current === container) {\r\n return true;\r\n }\r\n }\r\n current = current.parentNode;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Simulate focus/blur events of the inner input element to the outer element\r\n *\r\n * @param {element} outer element\r\n * @param {element} inner input element\r\n * @returns {function} deregistration function for listeners.\r\n */\r\n function bindFocusBlur(element, inputElement) {\r\n var isFocused, isMousedown, isBlur;\r\n\r\n $document[0].addEventListener('click', clickHandler, true);\r\n element[0].addEventListener('mousedown', mousedownHandler, true);\r\n element[0].addEventListener('blur', blurHandler, true);\r\n inputElement.on('focus', focusHandler);\r\n\r\n function blurHandler(event) {\r\n if (event && event.target.nodeName !== 'INPUT') return; //for IE\r\n\r\n isBlur = false;\r\n\r\n if (isMousedown) {\r\n isBlur = true;\r\n return;\r\n }\r\n\r\n $timeout(function () {\r\n element.triggerHandler('blur'); //conflict with current live cycle (case: multiple=none + tab)\r\n });\r\n }\r\n\r\n function focusHandler() {\r\n if (!isFocused) {\r\n isFocused = true;\r\n\r\n $timeout(function () {\r\n element.triggerHandler('focus'); //conflict with current live cycle (case: multiple=none + tab)\r\n });\r\n }\r\n }\r\n\r\n function mousedownHandler() {\r\n isMousedown = true;\r\n }\r\n\r\n function clickHandler(event) {\r\n isMousedown = false;\r\n\r\n\r\n var activeElement = event.target;\r\n var isSelectElement = contains(element[0], activeElement);\r\n\r\n if (isBlur && !isSelectElement) {\r\n blurHandler();\r\n }\r\n\r\n if (isSelectElement && activeElement.nodeName !== 'INPUT') {\r\n $timeout(function () {\r\n inputElement[0].focus();\r\n });\r\n }\r\n\r\n if (!isSelectElement && isFocused) {\r\n isFocused = false;\r\n }\r\n }\r\n\r\n return function () {\r\n $document[0].removeEventListener('click', clickHandler, true);\r\n element[0].removeEventListener('mousedown', mousedownHandler, true);\r\n element[0].removeEventListener('blur', blurHandler, true);\r\n inputElement.off('focus', focusHandler);\r\n };\r\n }\r\n\r\n /**\r\n * Sets the selected item in the dropdown menu\r\n * of available options.\r\n *\r\n * @param {object} list\r\n * @param {object} item\r\n */\r\n function scrollActiveOption(list, item) {\r\n var y, height_menu, height_item, scroll, scroll_top, scroll_bottom;\r\n\r\n if (item) {\r\n height_menu = list.offsetHeight;\r\n height_item = getWidthOrHeight(item, 'height', 'margin'); //outerHeight(true);\r\n scroll = list.scrollTop || 0;\r\n y = getOffset(item).top - getOffset(list).top + scroll;\r\n scroll_top = y;\r\n scroll_bottom = y - height_menu + height_item;\r\n\r\n //TODO Make animation\r\n if (y + height_item > height_menu + scroll) {\r\n list.scrollTop = scroll_bottom;\r\n } else if (y < scroll) {\r\n list.scrollTop = scroll_top;\r\n }\r\n }\r\n }\r\n\r\n // Used for matching numbers\r\n var core_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\r\n var rnumnonpx = new RegExp(\"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\");\r\n\r\n function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {\r\n var i = extra === (isBorderBox ? 'border' : 'content') ?\r\n // If we already have the right measurement, avoid augmentation\r\n 4 :\r\n // Otherwise initialize for horizontal or vertical properties\r\n name === 'width' ? 1 : 0,\r\n\r\n val = 0,\r\n cssExpand = ['Top', 'Right', 'Bottom', 'Left'];\r\n\r\n //TODO Use angular.element.css instead of getStyleValue after https://github.com/caitp/angular.js/commit/92bbb5e225253ebddd38ef5735d66ffef76b6a14 will be applied\r\n function getStyleValue(name) {\r\n return parseFloat(styles[name]);\r\n }\r\n\r\n for (; i < 4; i += 2) {\r\n // both box models exclude margin, so add it if we want it\r\n if (extra === 'margin') {\r\n val += getStyleValue(extra + cssExpand[i]);\r\n }\r\n\r\n if (isBorderBox) {\r\n // border-box includes padding, so remove it if we want content\r\n if (extra === 'content') {\r\n val -= getStyleValue('padding' + cssExpand[i]);\r\n }\r\n\r\n // at this point, extra isn't border nor margin, so remove border\r\n if (extra !== 'margin') {\r\n val -= getStyleValue('border' + cssExpand[i] + 'Width');\r\n }\r\n } else {\r\n val += getStyleValue('padding' + cssExpand[i]);\r\n\r\n // at this point, extra isn't content nor padding, so add border\r\n if (extra !== 'padding') {\r\n val += getStyleValue('border' + cssExpand[i] + 'Width');\r\n }\r\n }\r\n }\r\n\r\n return val;\r\n }\r\n\r\n function getOffset(elem) {\r\n var docElem, win,\r\n box = elem.getBoundingClientRect(),\r\n doc = elem && elem.ownerDocument;\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n docElem = doc.documentElement;\r\n win = getWindow(doc);\r\n\r\n return {\r\n top: box.top + win.pageYOffset - docElem.clientTop,\r\n left: box.left + win.pageXOffset - docElem.clientLeft\r\n };\r\n }\r\n\r\n function getWindow(elem) {\r\n return elem != null && elem === elem.window ? elem : elem.nodeType === 9 && elem.defaultView;\r\n }\r\n\r\n function getWidthOrHeight(elem, name, extra) {\r\n\r\n // Start with offset property, which is equivalent to the border-box value\r\n var valueIsBorderBox = true,\r\n val = name === 'width' ? elem.offsetWidth : elem.offsetHeight,\r\n styles = window.getComputedStyle(elem, null),\r\n\r\n //TODO Make isBorderBox after https://github.com/caitp/angular.js/commit/92bbb5e225253ebddd38ef5735d66ffef76b6a14 will be applied\r\n isBorderBox = false; //jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\r\n\r\n // some non-html elements return undefined for offsetWidth, so check for null/undefined\r\n // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\r\n // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\r\n if (val <= 0 || val == null) {\r\n // Fall back to computed then uncomputed css if necessary\r\n val = styles[name];\r\n\r\n if (val < 0 || val == null) {\r\n val = elem.style[name];\r\n }\r\n\r\n // Computed unit is not pixels. Stop here and return.\r\n if (rnumnonpx.test(val)) {\r\n return val;\r\n }\r\n\r\n // we need the check for style in case a browser which returns unreliable values\r\n // for getComputedStyle silently falls back to the reliable elem.style\r\n //valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\r\n\r\n // Normalize \"\", auto, and prepare for extra\r\n val = parseFloat(val) || 0;\r\n }\r\n\r\n // use the active box-sizing model to add/subtract irrelevant styles\r\n return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? \"border\" : \"content\"), valueIsBorderBox, styles);\r\n }\r\n\r\n function groupsIsEmpty(groups) {\r\n for (var k in groups) {\r\n if (groups.hasOwnProperty(k) && groups[k].length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n //lodash _.intersection + filter + invert\r\n function intersection(xArr, yArr, xFilter, yFilter, invert) {\r\n var i, j, n, filteredX, filteredY, out = invert ? [].concat(xArr) : [];\r\n\r\n for (i = 0, n = xArr.length; i < xArr.length; i++) {\r\n filteredX = xFilter ? xFilter(xArr[i]) : xArr[i];\r\n\r\n for (j = 0; j < yArr.length; j++) {\r\n filteredY = yFilter ? yFilter(yArr[j]) : yArr[j];\r\n\r\n if (angular.equals(filteredX, filteredY, xArr, yArr, i, j)) {\r\n invert ? out.splice(i + out.length - n, 1) : out.push(yArr[j]);\r\n break;\r\n }\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n function getValue(valueName, item, scope, getter) {\r\n var locals = {};\r\n\r\n //'name.subname' -> {name: {subname: item}} -> locals'\r\n valueName.split('.').reduce(function (previousValue, currentItem, index, arr) {\r\n return previousValue[currentItem] = index < arr.length - 1 ? {} : item;\r\n }, locals);\r\n\r\n return getter(scope, locals);\r\n }\r\n\r\n return {\r\n contains: contains,\r\n bindFocusBlur: bindFocusBlur,\r\n scrollActiveOption: scrollActiveOption,\r\n groupsIsEmpty: groupsIsEmpty,\r\n getValue: getValue,\r\n intersection: intersection\r\n };\r\n }]);\r\n\r\nangular.module('oi.select')\r\n\r\n .directive('oiSelect', ['$document', '$q', '$timeout', '$parse', '$interpolate', '$injector', '$filter', '$animate', 'oiUtils', 'oiSelect', function ($document, $q, $timeout, $parse, $interpolate, $injector, $filter, $animate, oiUtils, oiSelect) {\r\n var NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/;\r\n var VALUES_REGEXP = /([^\\(\\)\\s\\|\\s]*)\\s*(\\(.*\\))?\\s*(\\|?\\s*.+)?/;\r\n\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'src/template.html',\r\n require: 'ngModel',\r\n scope: {},\r\n compile: function (element, attrs) {\r\n var optionsExp = attrs.oiOptions,\r\n match = optionsExp ? optionsExp.match(NG_OPTIONS_REGEXP) : ['', 'i', '', '', '', 'i', '', '', ''];\r\n\r\n if (!match) {\r\n throw new Error(\"Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\");\r\n }\r\n\r\n var selectAsName = / as /.test(match[0]) && match[1], //item.modelValue\r\n displayName = match[2] || match[1], //item.label\r\n valueName = match[5] || match[7], //item (value)\r\n keyName = match[6], //(key)\r\n groupByName = match[3] || '', //item.groupName\r\n disableWhenName = match[4] || '', //item.disableWhenName\r\n trackByName = match[9] || displayName, //item.id\r\n valueMatches = match[8].match(VALUES_REGEXP), //collection\r\n valueTitle = valueName,\r\n keyTitle = keyName;\r\n\r\n if (keyName) { //convert object data sources format to array data sources format\r\n valueName = 'i';\r\n selectAsName = valueName + '.' + (selectAsName || valueTitle);\r\n trackByName = valueName + '.' + keyName;\r\n displayName = valueName + '.' + displayName;\r\n keyName = valueName + '.' + keyName;\r\n groupByName = groupByName ? valueName + '.' + groupByName : undefined;\r\n disableWhenName = disableWhenName ? valueName + '.' + disableWhenName : undefined;\r\n }\r\n\r\n var valuesName = valueMatches[1], //collection\r\n filteredValuesName = valuesName + (valueMatches[3] || ''), //collection | filter\r\n valuesFnName = valuesName + (valueMatches[2] || ''); //collection()\r\n\r\n var selectAsFn = selectAsName && $parse(selectAsName),\r\n displayFn = $parse(displayName),\r\n groupByFn = $parse(groupByName),\r\n disableWhenFn = $parse(disableWhenName),\r\n filteredValuesFn = $parse(filteredValuesName),\r\n valuesFn = $parse(valuesFnName),\r\n trackByFn = $parse(trackByName);\r\n\r\n var multiplePlaceholderFn = $interpolate(attrs.multiplePlaceholder || ''),\r\n listPlaceholderFn = $interpolate(attrs.listPlaceholder || ''),\r\n placeholderFn = $interpolate(attrs.placeholder || ''),\r\n optionsFn = $parse(attrs.oiSelectOptions),\r\n isOldAngular = angular.version.major <= 1 && angular.version.minor <= 3;\r\n\r\n var keyUpDownWerePressed,\r\n matchesWereReset,\r\n timeoutPromise,\r\n lastQuery,\r\n removedItem,\r\n multiple,\r\n multipleLimit,\r\n newItemFn;\r\n\r\n return function (scope, element, attrs, ctrl) {\r\n // Override the standard $isEmpty because an empty array means the input is empty.\r\n ctrl.$isEmpty = function (value) { return !exists(value); };\r\n\r\n var inputElement = element.find('input'),\r\n listElement = angular.element(element[0].querySelector('.select-dropdown')),\r\n placeholder = placeholderFn(scope),\r\n multiplePlaceholder = multiplePlaceholderFn(scope),\r\n listPlaceholder = listPlaceholderFn(scope),\r\n elementOptions = optionsFn(scope.$parent) || {},\r\n options = angular.extend({ cleanModel: elementOptions.newItem === 'prompt' }, oiSelect.options, elementOptions),\r\n editItem = options.editItem,\r\n editItemIsCorrected = editItem === 'correct',\r\n waitTime = 0;\r\n\r\n if (editItem === true || editItem === 'correct') {\r\n editItem = 'oiSelectEditItem';\r\n }\r\n var editItemFn = editItem ? $injector.get(editItem) : angular.noop,\r\n removeItemFn = $parse(options.removeItemFn);\r\n\r\n match = options.searchFilter.split(':');\r\n var searchFilter = $filter(match[0]),\r\n searchFilterOptionsFn = $parse(match[1]);\r\n\r\n match = options.dropdownFilter.split(':');\r\n var dropdownFilter = $filter(match[0]),\r\n dropdownFilterOptionsFn = $parse(match[1]);\r\n\r\n match = options.listFilter.split(':');\r\n var listFilter = $filter(match[0]),\r\n listFilterOptionsFn = $parse(match[1]);\r\n\r\n match = options.groupFilter.split(':');\r\n var groupFilter = $filter(match[0]),\r\n groupFilterOptionsFn = $parse(match[1]);\r\n\r\n if (options.newItemFn) {\r\n newItemFn = $parse(options.newItemFn);\r\n\r\n } else {\r\n newItemFn = function (scope, locals) {\r\n return (optionsFn(locals) || {}).newItemModel || locals.$query;\r\n };\r\n }\r\n\r\n if (options.cleanModel && (!editItem || editItemIsCorrected)) {\r\n element.addClass('cleanMode');\r\n }\r\n\r\n var unbindFocusBlur = oiUtils.bindFocusBlur(element, inputElement);\r\n\r\n if (angular.isDefined(attrs.autofocus)) {\r\n $timeout(function () {\r\n inputElement[0].focus();\r\n });\r\n }\r\n\r\n if (angular.isDefined(attrs.readonly)) {\r\n inputElement.attr('readonly', true);\r\n }\r\n\r\n if (angular.isDefined(attrs.tabindex)) {\r\n inputElement.attr('tabindex', attrs.tabindex);\r\n element[0].removeAttribute('tabindex');\r\n }\r\n\r\n if (options.maxlength) {\r\n inputElement.attr('maxlength', options.maxlength);\r\n }\r\n\r\n attrs.$observe('disabled', function (value) {\r\n inputElement.prop('disabled', value);\r\n\r\n //hide empty string with input\r\n if (multiple && ctrl.$modelValue && ctrl.$modelValue.length) {\r\n scope.inputHide = value;\r\n }\r\n });\r\n\r\n scope.$on('$destroy', unbindFocusBlur);\r\n\r\n scope.$parent.$watch(attrs.multipleLimit, function (value) {\r\n multipleLimit = Number(value) || Infinity;\r\n });\r\n\r\n scope.$parent.$watch(attrs.multiple, function (multipleValue) {\r\n multiple = multipleValue === undefined ? angular.isDefined(attrs.multiple) : multipleValue;\r\n\r\n element[multiple ? 'addClass' : 'removeClass']('multiple');\r\n });\r\n\r\n function valueChangedManually() { //case: clean model; prompt + editItem: 'correct'; initial value = defined/undefined\r\n if (editItemIsCorrected) {\r\n element.removeClass('cleanMode');\r\n }\r\n editItemIsCorrected = false;\r\n }\r\n\r\n scope.$parent.$watch(attrs.ngModel, function (value, oldValue) {\r\n var output = compact(value),\r\n promise = $q.when(output);\r\n\r\n modifyPlaceholder();\r\n\r\n if (exists(oldValue) && value !== oldValue) {\r\n valueChangedManually();\r\n }\r\n\r\n if (!multiple) {\r\n restoreInput();\r\n }\r\n\r\n if (selectAsFn && exists(value)) {\r\n promise = getMatches(null, value)\r\n .then(function (collection) {\r\n return oiUtils.intersection(output, collection, null, selectAs);\r\n });\r\n timeoutPromise = null; //`resetMatches` should not cancel the `promise`\r\n }\r\n\r\n if (multiple && attrs.disabled && !exists(value)) { //case: multiple, disabled=true + remove all items\r\n scope.inputHide = false;\r\n }\r\n\r\n promise.then(function (collection) {\r\n scope.output = collection;\r\n\r\n if (collection.length !== output.length) {\r\n scope.removeItem(collection.length); //if newItem was not created\r\n }\r\n });\r\n });\r\n\r\n scope.$watch('query', function (inputValue, oldValue) {\r\n //terminated symbol\r\n if (saveOn(inputValue.slice(0, -1), inputValue.slice(-1))) return;\r\n\r\n //length less then minlength\r\n if (String(inputValue).length < options.minlength) return;\r\n\r\n //We don't get matches if nothing added into matches list\r\n if (inputValue !== oldValue && (!scope.oldQuery || inputValue) && !matchesWereReset) {\r\n listElement[0].scrollTop = 0;\r\n\r\n if (inputValue) {\r\n getMatches(inputValue);\r\n scope.oldQuery = null;\r\n } else if (multiple) {\r\n resetMatches();\r\n matchesWereReset = true;\r\n }\r\n }\r\n matchesWereReset = false;\r\n });\r\n\r\n scope.$watch('groups', function (groups) {\r\n if (oiUtils.groupsIsEmpty(groups)) {\r\n scope.isOpen = false;\r\n\r\n } else if (!scope.isOpen && !attrs.disabled) {\r\n scope.isOpen = true;\r\n scope.isFocused = true;\r\n }\r\n });\r\n\r\n scope.$watch('isFocused', function (isFocused) {\r\n $animate[isFocused ? 'addClass' : 'removeClass'](element, 'focused', !isOldAngular && {\r\n tempClasses: 'focused-animate'\r\n });\r\n });\r\n\r\n scope.$watch('isOpen', function (isOpen) {\r\n $animate[isOpen ? 'addClass' : 'removeClass'](element, 'open', !isOldAngular && {\r\n tempClasses: 'open-animate'\r\n });\r\n });\r\n\r\n scope.$watch('isEmptyList', function (isEmptyList) {\r\n $animate[isEmptyList ? 'addClass' : 'removeClass'](element, 'emptyList', !isOldAngular && {\r\n tempClasses: 'emptyList-animate'\r\n });\r\n });\r\n\r\n scope.$watch('showLoader', function (isLoading) {\r\n $animate[isLoading ? 'addClass' : 'removeClass'](element, 'loading', !isOldAngular && {\r\n tempClasses: 'loading-animate'\r\n });\r\n });\r\n\r\n scope.addItem = function addItem(option) {\r\n lastQuery = scope.query;\r\n\r\n //duplicate\r\n if (multiple && oiUtils.intersection(scope.output, [option], trackBy, trackBy).length) return;\r\n\r\n //limit is reached\r\n if (scope.output.length >= multipleLimit) {\r\n blinkClass('limited');\r\n\r\n return;\r\n }\r\n\r\n var optionGroup = scope.groups[getGroupName(option)] = scope.groups[getGroupName(option)] || [];\r\n var modelOption = selectAsFn ? selectAs(option) : option;\r\n\r\n optionGroup.splice(optionGroup.indexOf(option), 1);\r\n\r\n if (multiple) {\r\n ctrl.$setViewValue(angular.isArray(ctrl.$modelValue) ? ctrl.$modelValue.concat(modelOption) : [modelOption]);\r\n\r\n } else {\r\n ctrl.$setViewValue(modelOption);\r\n restoreInput();\r\n }\r\n\r\n if (oiUtils.groupsIsEmpty(scope.groups)) {\r\n scope.groups = {}; //it is necessary for groups watcher\r\n }\r\n\r\n if (!multiple && !options.closeList) {\r\n resetMatches({ query: true });\r\n }\r\n\r\n valueChangedManually();\r\n\r\n scope.oldQuery = scope.oldQuery || scope.query;\r\n if (multiple && !options.closeList) {\r\n\r\n } else {\r\n scope.query = '';\r\n }\r\n scope.backspaceFocus = false;\r\n };\r\n\r\n scope.removeItem = function removeItem(position) {\r\n if (attrs.disabled || multiple && position < 0) return;\r\n\r\n removedItem = multiple ? ctrl.$modelValue[position] : ctrl.$modelValue;\r\n\r\n $q.when(removeItemFn(scope.$parent, { $item: removedItem }))\r\n .then(function () {\r\n if (!multiple && !scope.inputHide) return;\r\n\r\n if (multiple) {\r\n ctrl.$modelValue.splice(position, 1);\r\n ctrl.$setViewValue([].concat(ctrl.$modelValue));\r\n\r\n } else {\r\n cleanInput();\r\n\r\n if (options.cleanModel) {\r\n ctrl.$setViewValue(undefined);\r\n }\r\n }\r\n\r\n if (multiple || !scope.backspaceFocus) {\r\n scope.query = editItemFn(removedItem, lastQuery, getLabel, editItemIsCorrected, element) || '';\r\n }\r\n\r\n if (multiple && options.closeList) {\r\n resetMatches({ query: true });\r\n }\r\n });\r\n };\r\n\r\n scope.setSelection = function (index) {\r\n if (!keyUpDownWerePressed && scope.selectorPosition !== index) {\r\n setOption(listElement, index);\r\n } else {\r\n keyUpDownWerePressed = false;\r\n }\r\n };\r\n\r\n scope.keyUp = function keyUp(event) { //scope.query is actual\r\n switch (event.keyCode) {\r\n case 8: /* backspace */\r\n if (!scope.query.length && (!multiple || !scope.output.length)) {\r\n resetMatches();\r\n }\r\n }\r\n };\r\n\r\n scope.keyDown = function keyDown(event) {\r\n var top = 0,\r\n bottom = scope.order.length - 1;\r\n\r\n switch (event.keyCode) {\r\n case 38: /* up */\r\n scope.selectorPosition = angular.isNumber(scope.selectorPosition) ? scope.selectorPosition : top;\r\n setOption(listElement, scope.selectorPosition === top ? bottom : scope.selectorPosition - 1);\r\n keyUpDownWerePressed = true;\r\n break;\r\n\r\n case 40: /* down */\r\n scope.selectorPosition = angular.isNumber(scope.selectorPosition) ? scope.selectorPosition : top - 1;\r\n setOption(listElement, scope.selectorPosition === bottom ? top : scope.selectorPosition + 1);\r\n keyUpDownWerePressed = true;\r\n if (!scope.query.length && !scope.isOpen) {\r\n getMatches();\r\n }\r\n if (scope.inputHide) {\r\n cleanInput();\r\n }\r\n\r\n break;\r\n\r\n case 37: /* left */\r\n case 39: /* right */\r\n break;\r\n\r\n case 9: /* tab */\r\n saveOn('tab');\r\n break;\r\n\r\n case 13: /* enter */\r\n saveOn('enter');\r\n event.preventDefault(); // Prevent the event from bubbling up as it might otherwise cause a form submission\r\n break;\r\n\r\n case 32: /* space */\r\n saveOn('space');\r\n break;\r\n\r\n case 27: /* esc */\r\n if (!multiple) {\r\n restoreInput();\r\n\r\n if (options.cleanModel) {\r\n ctrl.$setViewValue(removedItem);\r\n }\r\n }\r\n resetMatches();\r\n break;\r\n\r\n case 8: /* backspace */\r\n if (!scope.query.length) {\r\n if (!multiple || editItem) {\r\n scope.backspaceFocus = true;\r\n }\r\n if (scope.backspaceFocus && scope.output && (!multiple || scope.output.length)) { //prevent restoring last deleted option\r\n scope.removeItem(scope.output.length - 1);\r\n\r\n if (editItem) {\r\n event.preventDefault();\r\n }\r\n break;\r\n }\r\n scope.backspaceFocus = !scope.backspaceFocus;\r\n break;\r\n }\r\n default: /* any key */\r\n if (scope.inputHide) {\r\n cleanInput();\r\n }\r\n scope.backspaceFocus = false;\r\n return false; //preventDefaults\r\n }\r\n };\r\n\r\n scope.getSearchLabel = function (item) {\r\n var label = getLabel(item);\r\n\r\n label = label.replace(/<[^>]+>/g, ''); // strips tags\r\n label = label.replace(/\\{|\\}/gi, ''); // strips curly brackets\r\n return searchFilter(label, scope.oldQuery || scope.query, item, searchFilterOptionsFn(scope.$parent), element);\r\n };\r\n\r\n scope.getDropdownLabel = function (item) {\r\n var label = getLabel(item);\r\n\r\n return dropdownFilter(label, scope.oldQuery || scope.query, item, dropdownFilterOptionsFn(scope.$parent), element);\r\n };\r\n\r\n scope.getGroupLabel = function (group, items) {\r\n return groupFilter(group, scope.oldQuery || scope.query, items, groupFilterOptionsFn(scope.$parent), element);\r\n };\r\n\r\n scope.getDisableWhen = getDisableWhen;\r\n\r\n\r\n resetMatches();\r\n\r\n element[0].addEventListener('click', click, true); //triggered before add or delete item event\r\n scope.$on('$destroy', function () {\r\n element[0].removeEventListener('click', click, true);\r\n });\r\n element.on('focus', focus);\r\n element.on('blur', blur);\r\n\r\n function blinkClass(name, delay) {\r\n delay = delay || 150;\r\n\r\n element.addClass(name);\r\n\r\n $timeout(function () {\r\n element.removeClass(name);\r\n }, delay);\r\n }\r\n\r\n function cleanInput() {\r\n scope.listItemHide = true;\r\n scope.inputHide = false;\r\n }\r\n\r\n function restoreInput() {\r\n var modelExists = exists(ctrl.$modelValue);\r\n scope.listItemHide = !modelExists;\r\n scope.inputHide = modelExists;\r\n }\r\n\r\n function click(event) {\r\n //query length less then minlength\r\n if (scope.query.length < options.minlength) return;\r\n\r\n //option is disabled\r\n if (oiUtils.contains(element[0], event.target, 'disabled')) return;\r\n\r\n //limit is reached\r\n if (scope.output.length >= multipleLimit && oiUtils.contains(element[0], event.target, 'select-dropdown')) return;\r\n\r\n if (scope.inputHide) {\r\n scope.removeItem(0); //because click on border (not on chosen item) doesn't remove chosen element\r\n }\r\n\r\n if (scope.isOpen && options.closeList && (event.target.nodeName !== 'INPUT' || !scope.query.length)) { //do not reset if you are editing the query\r\n resetMatches({ query: options.editItem && !editItemIsCorrected });\r\n scope.$evalAsync();\r\n } else {\r\n getMatches(scope.query);\r\n }\r\n }\r\n\r\n function focus(event) {\r\n if (scope.isFocused) return;\r\n\r\n scope.isFocused = true;\r\n\r\n if (attrs.disabled) return;\r\n\r\n scope.backspaceFocus = false;\r\n }\r\n\r\n\r\n function blur(event) {\r\n scope.isFocused = false;\r\n\r\n if (!multiple) {\r\n restoreInput();\r\n }\r\n\r\n if (!saveOn('blur')) {\r\n resetMatches();\r\n }\r\n scope.$evalAsync();\r\n }\r\n\r\n function saveOn(query, triggerName) {\r\n if (!triggerName) {\r\n triggerName = query;\r\n query = scope.query;\r\n }\r\n\r\n var isTriggered = options.saveTrigger.split(' ').indexOf(triggerName) + 1,\r\n isNewItem = options.newItem && query,\r\n selectedOrder = triggerName !== 'blur' ? scope.order[scope.selectorPosition] : null, //do not save selected element in dropdown list on blur\r\n itemPromise;\r\n\r\n if (isTriggered && (isNewItem || selectedOrder && !getDisableWhen(selectedOrder))) {\r\n scope.showLoader = true;\r\n itemPromise = $q.when(selectedOrder || newItemFn(scope.$parent, { $query: query }));\r\n\r\n itemPromise\r\n .then(function (data) {\r\n if (data === undefined) {\r\n return $q.reject();\r\n }\r\n\r\n scope.addItem(data);\r\n\r\n var bottom = scope.order.length - 1;\r\n\r\n if (scope.selectorPosition === bottom) {\r\n setOption(listElement, 0); //TODO optimise when list will be closed\r\n }\r\n options.newItemFn && !selectedOrder || $timeout(angular.noop); //TODO $applyAsync work since Angular 1.3\r\n resetMatches();\r\n })\r\n .catch(function () {\r\n blinkClass('invalid-item');\r\n scope.showLoader = false;\r\n });\r\n\r\n return true;\r\n }\r\n }\r\n\r\n function modifyPlaceholder() {\r\n var currentPlaceholder = multiple && exists(ctrl.$modelValue) ? multiplePlaceholder : placeholder;\r\n inputElement.attr('placeholder', currentPlaceholder);\r\n }\r\n\r\n function trackBy(item) {\r\n return oiUtils.getValue(valueName, item, scope.$parent, trackByFn);\r\n }\r\n\r\n function selectAs(item) {\r\n return oiUtils.getValue(valueName, item, scope.$parent, selectAsFn);\r\n }\r\n\r\n function getLabel(item) {\r\n return oiUtils.getValue(valueName, item, scope.$parent, displayFn);\r\n }\r\n\r\n function getDisableWhen(item) {\r\n return scope.isEmptyList || oiUtils.getValue(valueName, item, scope.$parent, disableWhenFn);\r\n }\r\n\r\n function getGroupName(option) {\r\n return oiUtils.getValue(valueName, option, scope.$parent, groupByFn) || '';\r\n }\r\n\r\n function filter(list) {\r\n return oiUtils.getValue(valuesName, list, scope.$parent, filteredValuesFn);\r\n }\r\n\r\n function compact(value) {\r\n value = value instanceof Array ? value : value ? [value] : [];\r\n\r\n return value.filter(function (item) {\r\n return item !== undefined && (item instanceof Array && item.length || selectAsFn || getLabel(item));\r\n });\r\n }\r\n\r\n function exists(value) {\r\n return !!compact(value).length;\r\n }\r\n\r\n function getMatches(query, selectedAs) {\r\n scope.isEmptyList = false;\r\n\r\n if (timeoutPromise && waitTime) {\r\n $timeout.cancel(timeoutPromise); //cancel previous timeout\r\n }\r\n\r\n timeoutPromise = $timeout(function () {\r\n var values = valuesFn(scope.$parent, { $query: query, $selectedAs: selectedAs }) || '';\r\n\r\n scope.selectorPosition = options.newItem === 'prompt' ? false : 0;\r\n\r\n if (!query && !selectedAs) {\r\n scope.oldQuery = null;\r\n }\r\n\r\n if (values.$promise && !values.$resolved || angular.isFunction(values.then)) {\r\n waitTime = options.debounce;\r\n }\r\n\r\n scope.showLoader = true;\r\n\r\n return $q.when(values.$promise || values)\r\n .then(function (values) {\r\n\r\n scope.groups = {};\r\n\r\n if (values && keyName) {\r\n //convert object data sources format to array data sources format\r\n var arr = [];\r\n\r\n angular.forEach(values, function (value, key) {\r\n if (key.toString().charAt(0) !== '$') {\r\n var item = {};\r\n\r\n item[keyTitle] = key;\r\n item[valueTitle] = value;\r\n arr.push(item);\r\n }\r\n });\r\n\r\n values = arr;\r\n }\r\n\r\n if (values && !selectedAs) {\r\n var outputValues = multiple ? scope.output : [];\r\n var filteredList = listFilter(values, query, getLabel, listFilterOptionsFn(scope.$parent), element);\r\n var withoutIntersection = oiUtils.intersection(filteredList, outputValues, trackBy, trackBy, true);\r\n var filteredOutput = filter(withoutIntersection);\r\n\r\n //add element with placeholder to empty list\r\n if (!filteredOutput.length) {\r\n scope.isEmptyList = true;\r\n\r\n if (listPlaceholder) {\r\n var context = {};\r\n\r\n displayFn.assign(context, listPlaceholder);\r\n filteredOutput = [context[valueName]];\r\n }\r\n }\r\n\r\n scope.groups = group(filteredOutput);\r\n }\r\n updateGroupPos();\r\n\r\n return values;\r\n })\r\n .finally(function () {\r\n scope.showLoader = false;\r\n\r\n if (options.closeList && !options.cleanModel) { //case: prompt\r\n $timeout(function () {\r\n setOption(listElement, 0);\r\n });\r\n }\r\n });\r\n }, waitTime);\r\n\r\n return timeoutPromise;\r\n }\r\n\r\n function updateGroupPos() {\r\n var i, key, value, collectionKeys = [], groupCount = 0;\r\n\r\n scope.order = [];\r\n scope.groupPos = {};\r\n\r\n for (key in scope.groups) {\r\n if (scope.groups.hasOwnProperty(key) && key.charAt(0) != '$') {\r\n collectionKeys.push(key);\r\n }\r\n }\r\n\r\n if (isOldAngular) {\r\n collectionKeys.sort(); //TODO: Think of a way which does not depend on the order in which Angular displays objects by ngRepeat\r\n }\r\n\r\n for (i = 0; i < collectionKeys.length; i++) {\r\n key = collectionKeys[i];\r\n value = scope.groups[key];\r\n\r\n scope.order = scope.order.concat(value);\r\n scope.groupPos[key] = groupCount;\r\n groupCount += value.length;\r\n }\r\n }\r\n\r\n function resetMatches(options) {\r\n options = options || {};\r\n\r\n scope.oldQuery = null;\r\n scope.backspaceFocus = false; // clears focus on any chosen item for del\r\n scope.groups = {};\r\n scope.order = [];\r\n scope.showLoader = false;\r\n scope.isOpen = false;\r\n waitTime = 0;\r\n\r\n if (!options.query) {\r\n scope.query = '';\r\n }\r\n\r\n if (timeoutPromise) {\r\n $timeout.cancel(timeoutPromise);//cancel previous timeout\r\n }\r\n }\r\n\r\n function setOption(listElement, position) {\r\n scope.selectorPosition = position;\r\n oiUtils.scrollActiveOption(listElement[0], listElement.find('li')[position]);\r\n }\r\n\r\n function group(input) {\r\n var optionGroups = { '': [] },\r\n optionGroupName,\r\n optionGroup;\r\n\r\n for (var i = 0; i < input.length; i++) {\r\n optionGroupName = getGroupName(input[i]);\r\n\r\n if (!(optionGroup = optionGroups[optionGroupName])) {\r\n optionGroup = optionGroups[optionGroupName] = [];\r\n }\r\n optionGroup.push(input[i]);\r\n }\r\n\r\n return optionGroups;\r\n }\r\n };\r\n }\r\n };\r\n }]);\r\n\r\nangular.module('oi.select')\r\n\r\n .filter('oiSelectGroup', ['$sce', function ($sce) {\r\n return function (label) {\r\n return $sce.trustAsHtml(label);\r\n };\r\n }])\r\n\r\n .filter('oiSelectCloseIcon', ['$sce', function ($sce) {\r\n return function (label) {\r\n var closeIcon = '';\r\n\r\n return $sce.trustAsHtml(label + closeIcon);\r\n };\r\n }])\r\n\r\n .filter('oiSelectHighlight', ['$sce', 'oiSelectEscape', function ($sce, oiSelectEscape) {\r\n return function (label, query) {\r\n var html;\r\n\r\n if (query.length > 0 || angular.isNumber(query)) {\r\n label = label.toString();\r\n query = oiSelectEscape(query);\r\n html = label.replace(new RegExp(query, 'gi'), '$&');\r\n } else if (query.length === 0) {\r\n label = label.toString();\r\n html = label.replace(new RegExp(query, 'gi'), '$&');\r\n } else {\r\n html = label;\r\n }\r\n\r\n return $sce.trustAsHtml(html);\r\n };\r\n }])\r\n\r\n .filter('oiSelectAscSort', ['oiSelectEscape', function (oiSelectEscape) {\r\n function ascSort(input, query, getLabel, options) {\r\n var i, j, isFound, output, output1 = [], output2 = [], output3 = [], output4 = [];\r\n\r\n if (query) {\r\n query = oiSelectEscape(query).toLocaleLowerCase();\r\n\r\n for (i = 0, isFound = false; i < input.length; i++) {\r\n isFound = getLabel(input[i]).toLocaleLowerCase().match(new RegExp(query));\r\n\r\n if (!isFound && options && (options.length || options.fields)) {\r\n for (j = 0; j < options.length; j++) {\r\n if (isFound) break;\r\n\r\n isFound = String(input[i][options[j]]).toLocaleLowerCase().match(new RegExp(query));\r\n }\r\n }\r\n\r\n if (isFound) {\r\n output1.push(input[i]);\r\n }\r\n }\r\n for (i = 0; i < output1.length; i++) {\r\n if (getLabel(output1[i]).toLocaleLowerCase().match(new RegExp('^' + query))) {\r\n output2.push(output1[i]);\r\n } else {\r\n output3.push(output1[i]);\r\n }\r\n }\r\n output = output2.concat(output3);\r\n\r\n if (options && (options === true || options.all)) {\r\n inputLabel: for (i = 0; i < input.length; i++) {\r\n for (j = 0; j < output.length; j++) {\r\n if (input[i] === output[j]) {\r\n continue inputLabel;\r\n }\r\n }\r\n output4.push(input[i]);\r\n }\r\n output = output.concat(output4);\r\n }\r\n } else {\r\n output = [].concat(input);\r\n }\r\n\r\n return output;\r\n }\r\n\r\n return ascSort;\r\n }])\r\n\r\n .filter('none', function () {\r\n return function (input) {\r\n return input;\r\n };\r\n });\r\nangular.module(\"oi.select\").run([\"$templateCache\", function ($templateCache) { $templateCache.put(\"src/template.html\", \"\"); }]);","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ax-security-designer .ax-security-designer-default-row {\\r\\n border: 1px solid #e7e7e7;\\r\\n}\\r\\n\\r\\n.ax-security-designer .inline {\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.ax-security-designer .no-security-models-bold-text {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.ax-security-designer .no-security-models-opacity {\\r\\n opacity: 0.35;\\r\\n}\\r\\n\\r\\n.ax-security-designer .roles-loading-spinner {\\r\\n position: relative; \\r\\n height: 375px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .progress-bar-style {\\r\\n margin-bottom: 20px; \\r\\n height: 6px; \\r\\n width: 90%\\r\\n}\\r\\n\\r\\n.ax-security-designer .security-model-info-toggle {\\r\\n display: inline-block; \\r\\n margin:0 0 0px 4px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .security-model-info-toggle-text-styles {\\r\\n display: inline-block; \\r\\n text-align: center; \\r\\n padding: 6px 0px; \\r\\n color: #8592A6; \\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.ax-security-designer .security-model-name-size {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .rounded-error-banner {\\r\\n border-radius: 8px 8px 0px 0px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .loading-affected-objects-block {\\r\\n height: auto;\\r\\n}\\r\\n\\r\\n\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/AXSecurityDesigner/AXSecurityDesigner.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,yBAAyB;AAC7B;;AAEA;IACI,qBAAqB;AACzB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,kBAAkB;IAClB,aAAa;AACjB;;AAEA;IACI,mBAAmB;IACnB,WAAW;IACX;AACJ;;AAEA;IACI,qBAAqB;IACrB,kBAAkB;AACtB;;AAEA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,cAAc;IACd,gBAAgB;AACpB;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,YAAY;AAChB\",\"sourcesContent\":[\".ax-security-designer .ax-security-designer-default-row {\\r\\n border: 1px solid #e7e7e7;\\r\\n}\\r\\n\\r\\n.ax-security-designer .inline {\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.ax-security-designer .no-security-models-bold-text {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.ax-security-designer .no-security-models-opacity {\\r\\n opacity: 0.35;\\r\\n}\\r\\n\\r\\n.ax-security-designer .roles-loading-spinner {\\r\\n position: relative; \\r\\n height: 375px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .progress-bar-style {\\r\\n margin-bottom: 20px; \\r\\n height: 6px; \\r\\n width: 90%\\r\\n}\\r\\n\\r\\n.ax-security-designer .security-model-info-toggle {\\r\\n display: inline-block; \\r\\n margin:0 0 0px 4px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .security-model-info-toggle-text-styles {\\r\\n display: inline-block; \\r\\n text-align: center; \\r\\n padding: 6px 0px; \\r\\n color: #8592A6; \\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.ax-security-designer .security-model-name-size {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .rounded-error-banner {\\r\\n border-radius: 8px 8px 0px 0px;\\r\\n}\\r\\n\\r\\n.ax-security-designer .loading-affected-objects-block {\\r\\n height: auto;\\r\\n}\\r\\n\\r\\n\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".approval-rules .dropdown-menu {\\r\\n min-width: 225px;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/ApprovalRules/approvalRules.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,gBAAgB;AACpB\",\"sourcesContent\":[\".approval-rules .dropdown-menu {\\r\\n min-width: 225px;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".oracle-cloud-data-changes .number-block {\\r\\n width: 91px;\\r\\n}\\r\\n\\r\\n.oracle-cloud-data-changes .number-input {\\r\\n width: 90px;\\r\\n background: white;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/DataChangesOracleCloud/oracleCloudDataChanges.css\"],\"names\":[],\"mappings\":\"AAAA;GACG,WAAW;AACd;;AAEA;GACG,WAAW;GACX,iBAAiB;AACpB\",\"sourcesContent\":[\".oracle-cloud-data-changes .number-block {\\r\\n width: 91px;\\r\\n}\\r\\n\\r\\n.oracle-cloud-data-changes .number-input {\\r\\n width: 90px;\\r\\n background: white;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".service-now-ticket-modal .k-grid-content {\\r\\n min-height: 330px;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/DataChanges/ServiceNow/ServiceNowTicketModal.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,iBAAiB;AACrB\",\"sourcesContent\":[\".service-now-ticket-modal .k-grid-content {\\r\\n min-height: 330px;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".netsuite-arm-quantification-selection p.description {\\r\\n height: 6rem;\\r\\n}\\r\\n\\r\\n.netsuite-arm-quantification-selection .tooltip-inner {\\r\\n word-break: normal;\\r\\n}\\r\\n\\r\\n.netsuite-arm-quantification-view-details-modal .k-grid-content {\\r\\n min-height: 290px;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/NetSuiteArmQuantification/NetSuiteArmQuantification.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,YAAY;AAChB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;AACrB\",\"sourcesContent\":[\".netsuite-arm-quantification-selection p.description {\\r\\n height: 6rem;\\r\\n}\\r\\n\\r\\n.netsuite-arm-quantification-selection .tooltip-inner {\\r\\n word-break: normal;\\r\\n}\\r\\n\\r\\n.netsuite-arm-quantification-view-details-modal .k-grid-content {\\r\\n min-height: 290px;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".notifications .product {\\r\\n background-color: #F5F5F5;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/Notifications/notifications.css\"],\"names\":[],\"mappings\":\"AAAA;GACG,yBAAyB;AAC5B\",\"sourcesContent\":[\".notifications .product {\\r\\n background-color: #F5F5F5;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ax7-person-search-modal .k-grid-content {\\r\\n min-height: 240px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/RequestManagement/AX7Person/ax7PersonSearch.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,iBAAiB;AACrB\",\"sourcesContent\":[\".ax7-person-search-modal .k-grid-content {\\r\\n min-height: 240px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".access-effective-dates-panel {\\r\\n padding: 4px;\\r\\n border: 1px #ddd solid;\\r\\n background: #F9F9FA;\\r\\n height: 80px;\\r\\n border-radius: 4px;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/RequestManagement/WizardSteps/Universal/effectiveDates.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,YAAY;IACZ,sBAAsB;IACtB,mBAAmB;IACnB,YAAY;IACZ,kBAAkB;IAClB,eAAe;AACnB\",\"sourcesContent\":[\".access-effective-dates-panel {\\r\\n padding: 4px;\\r\\n border: 1px #ddd solid;\\r\\n background: #F9F9FA;\\r\\n height: 80px;\\r\\n border-radius: 4px;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".im-request-service-now-ticket-modal .k-grid-content {\\r\\n min-height: 330px;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/RequestManagement/WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,iBAAiB;AACrB\",\"sourcesContent\":[\".im-request-service-now-ticket-modal .k-grid-content {\\r\\n min-height: 330px;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".im-request-summary .dropdown.dropdown-over-footer ul.dropdown-menu {\\r\\n z-index: 1001;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/RequestManagement/WizardSteps/Universal/summary.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,aAAa;AACjB\",\"sourcesContent\":[\".im-request-summary .dropdown.dropdown-over-footer ul.dropdown-menu {\\r\\n z-index: 1001;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".users-view .user-toggle {\\r\\n margin-right: 20px;\\r\\n padding-bottom: 60px;\\r\\n}\\r\\n\\r\\n.users-view .change-name-to {\\r\\n width: 200px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Components/Users/usersView.css\"],\"names\":[],\"mappings\":\"AAAA;GACG,kBAAkB;GAClB,oBAAoB;AACvB;;AAEA;GACG,YAAY;AACf\",\"sourcesContent\":[\".users-view .user-toggle {\\r\\n margin-right: 20px;\\r\\n padding-bottom: 60px;\\r\\n}\\r\\n\\r\\n.users-view .change-name-to {\\r\\n width: 200px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nimport ___CSS_LOADER_URL_IMPORT_0___ from \"../../../../Content/Images/SVG/icons8-Sort Down.svg\";\nimport ___CSS_LOADER_URL_IMPORT_1___ from \"../../../../Content/Images/SVG/x-circle-12.svg\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".role-multiselect-dropdown .criteria-container > .k-multiselect > .k-multiselect-wrap {\\r\\n background-attachment: scroll;\\r\\n background-clip: border-box;\\r\\n background-color: rgb(255, 255, 255);\\r\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \");\\r\\n background-origin: padding-box;\\r\\n background-position: 99% 50%;\\r\\n background-position-x: 99%;\\r\\n background-position-y: 50%;\\r\\n background-repeat: no-repeat;\\r\\n background-size: auto;\\r\\n border-bottom-color: #C2C4CC;\\r\\n border-bottom-left-radius: 2px;\\r\\n border-bottom-right-radius: 2px;\\r\\n border-bottom-style: solid;\\r\\n border-bottom-width: 1px;\\r\\n border-image-outset: 0;\\r\\n border-image-repeat: stretch;\\r\\n border-image-slice: 100%;\\r\\n border-image-source: none;\\r\\n border-image-width: 1;\\r\\n border-left-color: #C2C4CC;\\r\\n border-left-style: solid;\\r\\n border-left-width: 1px;\\r\\n border-right-color: #C2C4CC;\\r\\n border-right-style: solid;\\r\\n border-right-width: 1px;\\r\\n border-top-color: #C2C4CC;\\r\\n border-top-left-radius: 2px;\\r\\n border-top-right-radius: 2px;\\r\\n border-top-style: solid;\\r\\n border-top-width: 1px;\\r\\n box-shadow: none;\\r\\n box-sizing: border-box;\\r\\n color: rgb(103, 106, 108);\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n font-family: \\\"Manrope\\\", \\\"Manrope\\\", Helvetica, Arial, sans-serif;\\r\\n font-feature-settings: normal;\\r\\n font-kerning: auto;\\r\\n font-language-override: normal;\\r\\n font-optical-sizing: auto;\\r\\n font-size: 12px;\\r\\n font-size-adjust: none;\\r\\n font-stretch: 100%;\\r\\n font-style: normal;\\r\\n font-variant: normal;\\r\\n font-variant-alternates: normal;\\r\\n font-variant-caps: normal;\\r\\n font-variant-east-asian: normal;\\r\\n font-variant-ligatures: normal;\\r\\n font-variant-numeric: normal;\\r\\n font-variant-position: normal;\\r\\n font-variation-settings: normal;\\r\\n font-weight: 400;\\r\\n line-height: 17.15px;\\r\\n margin: 0px;\\r\\n max-height: 150px;\\r\\n min-height: 40px;\\r\\n overflow-y: auto;\\r\\n padding-bottom: 2px;\\r\\n padding-left: 2px;\\r\\n padding-right: 3px;\\r\\n padding-top: 2px;\\r\\n text-transform: none;\\r\\n vertical-align: middle;\\r\\n width: 280px;\\r\\n -moz-appearance: none;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .criteria-container > .k-multiselect > .k-multiselect-wrap, .k-floatwrap {\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button {\\r\\n color: #121321;\\r\\n border-color: #C2C4CC;\\r\\n background-color: #EEEFF2;\\r\\n background-attachment: scroll;\\r\\n background-clip: border-box;\\r\\n background-image: none;\\r\\n background-origin: padding-box;\\r\\n background-position: 0% 0%;\\r\\n background-position-x: 0%;\\r\\n background-position-y: 0%;\\r\\n background-repeat: repeat;\\r\\n background-size: auto;\\r\\n border-bottom-color: #C2C4CC;\\r\\n border-bottom-left-radius: 8px;\\r\\n border-bottom-right-radius: 8px;\\r\\n border-bottom-style: solid;\\r\\n border-bottom-width: 1px;\\r\\n border-image-outset: 0;\\r\\n border-image-repeat: stretch;\\r\\n border-image-slice: 100%;\\r\\n border-image-source: none;\\r\\n border-image-width: 1;\\r\\n border-left-color: #C2C4CC;\\r\\n border-left-style: solid;\\r\\n border-left-width: 1px;\\r\\n border-right-color: #C2C4CC;\\r\\n border-right-style: solid;\\r\\n border-right-width: 1px;\\r\\n border-top-color: #C2C4CC;\\r\\n border-top-left-radius: 8px;\\r\\n border-top-right-radius: 8px;\\r\\n border-top-style: solid;\\r\\n border-top-width: 1px;\\r\\n box-sizing: border-box;\\r\\n color: #121321;\\r\\n cursor: pointer;\\r\\n display: block;\\r\\n font-family: \\\"Manrope\\\", \\\"Manrope\\\", Helvetica, Arial, sans-serif;\\r\\n font-size: 12px;\\r\\n font-weight: 400;\\r\\n line-height: 18px;\\r\\n list-style-image: none;\\r\\n list-style-position: outside;\\r\\n list-style-type: none;\\r\\n margin: 2px;\\r\\n padding-bottom: 6px;\\r\\n padding-left: 6px;\\r\\n padding-right: 20px;\\r\\n padding-top: 6px;\\r\\n text-align: left;\\r\\n touch-action: manipulation;\\r\\n user-select: none;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button:hover {\\r\\n background-color: #f5f5f7;\\r\\n border-color: #e2e2e2;\\r\\n color: #121321;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button:active {\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect-wrap .k-select {\\r\\n top: 3px;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select {\\r\\n box-sizing: border-box;\\r\\n color: #121321;\\r\\n cursor: pointer;\\r\\n display: block;\\r\\n font-family: \\\"Manrope\\\", \\\"Manrope\\\", Helvetica, Arial, sans-serif;\\r\\n font-size: 18px;\\r\\n font-weight: 400;\\r\\n line-height: 18px;\\r\\n list-style-image: none;\\r\\n list-style-position: outside;\\r\\n list-style-type: none;\\r\\n opacity: 0.2;\\r\\n text-align: left;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select:hover {\\r\\n opacity: 0.5;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-icon {\\r\\n font-size: 15px;\\r\\n background-repeat: no-repeat;\\r\\n background-size: contain;\\r\\n font-family: WebComponentsIcons;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select .k-icon, .k-i-close {\\r\\n font-size: 15px;\\r\\n font-family: none;\\r\\n margin-left: 4px;\\r\\n background-repeat: no-repeat;\\r\\n background-size: contain;\\r\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \");\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select .k-icon, .k-i-close::before {\\r\\n content: none;\\r\\n} \\r\\n\\r\\n/* placeholder styles */\\r\\n.role-multiselect-dropdown .criteria-container > .k-multiselect > .k-multiselect-wrap > .k-input {\\r\\npadding-top: 5px;\\r\\npadding-left: 0px;\\r\\nflex: 1;\\r\\ncolor: #121321;\\r\\nopacity: 1;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Shared/Components/roleMultiselectDropdown/roleMultiselectDropdown.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,6BAA6B;IAC7B,2BAA2B;IAC3B,oCAAoC;IACpC,yDAA4E;IAC5E,8BAA8B;IAC9B,4BAA4B;IAC5B,0BAA0B;IAC1B,0BAA0B;IAC1B,4BAA4B;IAC5B,qBAAqB;IACrB,4BAA4B;IAC5B,8BAA8B;IAC9B,+BAA+B;IAC/B,0BAA0B;IAC1B,wBAAwB;IACxB,sBAAsB;IACtB,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;IACzB,qBAAqB;IACrB,0BAA0B;IAC1B,wBAAwB;IACxB,sBAAsB;IACtB,2BAA2B;IAC3B,yBAAyB;IACzB,uBAAuB;IACvB,yBAAyB;IACzB,2BAA2B;IAC3B,4BAA4B;IAC5B,uBAAuB;IACvB,qBAAqB;IACrB,gBAAgB;IAChB,sBAAsB;IACtB,yBAAyB;IACzB,aAAa;IACb,eAAe;IACf,+DAA+D;IAC/D,6BAA6B;IAC7B,kBAAkB;IAClB,8BAA8B;IAC9B,yBAAyB;IACzB,eAAe;IACf,sBAAsB;IACtB,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,+BAA+B;IAC/B,yBAAyB;IACzB,+BAA+B;IAC/B,8BAA8B;IAC9B,4BAA4B;IAC5B,6BAA6B;IAC7B,+BAA+B;IAC/B,gBAAgB;IAChB,oBAAoB;IACpB,WAAW;IACX,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,YAAY;IACZ,qBAAqB;AACzB;;AAEA;IACI,yBAAyB;AAC7B;;AAEA;IACI,cAAc;IACd,qBAAqB;IACrB,yBAAyB;IACzB,6BAA6B;IAC7B,2BAA2B;IAC3B,sBAAsB;IACtB,8BAA8B;IAC9B,0BAA0B;IAC1B,yBAAyB;IACzB,yBAAyB;IACzB,yBAAyB;IACzB,qBAAqB;IACrB,4BAA4B;IAC5B,8BAA8B;IAC9B,+BAA+B;IAC/B,0BAA0B;IAC1B,wBAAwB;IACxB,sBAAsB;IACtB,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;IACzB,qBAAqB;IACrB,0BAA0B;IAC1B,wBAAwB;IACxB,sBAAsB;IACtB,2BAA2B;IAC3B,yBAAyB;IACzB,uBAAuB;IACvB,yBAAyB;IACzB,2BAA2B;IAC3B,4BAA4B;IAC5B,uBAAuB;IACvB,qBAAqB;IACrB,sBAAsB;IACtB,cAAc;IACd,eAAe;IACf,cAAc;IACd,+DAA+D;IAC/D,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,sBAAsB;IACtB,4BAA4B;IAC5B,qBAAqB;IACrB,WAAW;IACX,mBAAmB;IACnB,iBAAiB;IACjB,mBAAmB;IACnB,gBAAgB;IAChB,gBAAgB;IAChB,0BAA0B;IAC1B,iBAAiB;IACjB,mBAAmB;AACvB;;AAEA;IACI,yBAAyB;IACzB,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,QAAQ;AACZ;;AAEA;IACI,sBAAsB;IACtB,cAAc;IACd,eAAe;IACf,cAAc;IACd,+DAA+D;IAC/D,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,sBAAsB;IACtB,4BAA4B;IAC5B,qBAAqB;IACrB,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;AACvB;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,eAAe;IACf,4BAA4B;IAC5B,wBAAwB;IACxB,+BAA+B;AACnC;;AAEA;IACI,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,4BAA4B;IAC5B,wBAAwB;IACxB,yDAA0D;AAC9D;;AAEA;IACI,aAAa;AACjB;;AAEA,uBAAuB;AACvB;AACA,gBAAgB;AAChB,iBAAiB;AACjB,OAAO;AACP,cAAc;AACd,UAAU;AACV\",\"sourcesContent\":[\".role-multiselect-dropdown .criteria-container > .k-multiselect > .k-multiselect-wrap {\\r\\n background-attachment: scroll;\\r\\n background-clip: border-box;\\r\\n background-color: rgb(255, 255, 255);\\r\\n background-image: url(\\\"../../../../Content/Images/SVG/icons8-Sort Down.svg\\\");\\r\\n background-origin: padding-box;\\r\\n background-position: 99% 50%;\\r\\n background-position-x: 99%;\\r\\n background-position-y: 50%;\\r\\n background-repeat: no-repeat;\\r\\n background-size: auto;\\r\\n border-bottom-color: #C2C4CC;\\r\\n border-bottom-left-radius: 2px;\\r\\n border-bottom-right-radius: 2px;\\r\\n border-bottom-style: solid;\\r\\n border-bottom-width: 1px;\\r\\n border-image-outset: 0;\\r\\n border-image-repeat: stretch;\\r\\n border-image-slice: 100%;\\r\\n border-image-source: none;\\r\\n border-image-width: 1;\\r\\n border-left-color: #C2C4CC;\\r\\n border-left-style: solid;\\r\\n border-left-width: 1px;\\r\\n border-right-color: #C2C4CC;\\r\\n border-right-style: solid;\\r\\n border-right-width: 1px;\\r\\n border-top-color: #C2C4CC;\\r\\n border-top-left-radius: 2px;\\r\\n border-top-right-radius: 2px;\\r\\n border-top-style: solid;\\r\\n border-top-width: 1px;\\r\\n box-shadow: none;\\r\\n box-sizing: border-box;\\r\\n color: rgb(103, 106, 108);\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n font-family: \\\"Manrope\\\", \\\"Manrope\\\", Helvetica, Arial, sans-serif;\\r\\n font-feature-settings: normal;\\r\\n font-kerning: auto;\\r\\n font-language-override: normal;\\r\\n font-optical-sizing: auto;\\r\\n font-size: 12px;\\r\\n font-size-adjust: none;\\r\\n font-stretch: 100%;\\r\\n font-style: normal;\\r\\n font-variant: normal;\\r\\n font-variant-alternates: normal;\\r\\n font-variant-caps: normal;\\r\\n font-variant-east-asian: normal;\\r\\n font-variant-ligatures: normal;\\r\\n font-variant-numeric: normal;\\r\\n font-variant-position: normal;\\r\\n font-variation-settings: normal;\\r\\n font-weight: 400;\\r\\n line-height: 17.15px;\\r\\n margin: 0px;\\r\\n max-height: 150px;\\r\\n min-height: 40px;\\r\\n overflow-y: auto;\\r\\n padding-bottom: 2px;\\r\\n padding-left: 2px;\\r\\n padding-right: 3px;\\r\\n padding-top: 2px;\\r\\n text-transform: none;\\r\\n vertical-align: middle;\\r\\n width: 280px;\\r\\n -moz-appearance: none;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .criteria-container > .k-multiselect > .k-multiselect-wrap, .k-floatwrap {\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button {\\r\\n color: #121321;\\r\\n border-color: #C2C4CC;\\r\\n background-color: #EEEFF2;\\r\\n background-attachment: scroll;\\r\\n background-clip: border-box;\\r\\n background-image: none;\\r\\n background-origin: padding-box;\\r\\n background-position: 0% 0%;\\r\\n background-position-x: 0%;\\r\\n background-position-y: 0%;\\r\\n background-repeat: repeat;\\r\\n background-size: auto;\\r\\n border-bottom-color: #C2C4CC;\\r\\n border-bottom-left-radius: 8px;\\r\\n border-bottom-right-radius: 8px;\\r\\n border-bottom-style: solid;\\r\\n border-bottom-width: 1px;\\r\\n border-image-outset: 0;\\r\\n border-image-repeat: stretch;\\r\\n border-image-slice: 100%;\\r\\n border-image-source: none;\\r\\n border-image-width: 1;\\r\\n border-left-color: #C2C4CC;\\r\\n border-left-style: solid;\\r\\n border-left-width: 1px;\\r\\n border-right-color: #C2C4CC;\\r\\n border-right-style: solid;\\r\\n border-right-width: 1px;\\r\\n border-top-color: #C2C4CC;\\r\\n border-top-left-radius: 8px;\\r\\n border-top-right-radius: 8px;\\r\\n border-top-style: solid;\\r\\n border-top-width: 1px;\\r\\n box-sizing: border-box;\\r\\n color: #121321;\\r\\n cursor: pointer;\\r\\n display: block;\\r\\n font-family: \\\"Manrope\\\", \\\"Manrope\\\", Helvetica, Arial, sans-serif;\\r\\n font-size: 12px;\\r\\n font-weight: 400;\\r\\n line-height: 18px;\\r\\n list-style-image: none;\\r\\n list-style-position: outside;\\r\\n list-style-type: none;\\r\\n margin: 2px;\\r\\n padding-bottom: 6px;\\r\\n padding-left: 6px;\\r\\n padding-right: 20px;\\r\\n padding-top: 6px;\\r\\n text-align: left;\\r\\n touch-action: manipulation;\\r\\n user-select: none;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button:hover {\\r\\n background-color: #f5f5f7;\\r\\n border-color: #e2e2e2;\\r\\n color: #121321;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button:active {\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect-wrap .k-select {\\r\\n top: 3px;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select {\\r\\n box-sizing: border-box;\\r\\n color: #121321;\\r\\n cursor: pointer;\\r\\n display: block;\\r\\n font-family: \\\"Manrope\\\", \\\"Manrope\\\", Helvetica, Arial, sans-serif;\\r\\n font-size: 18px;\\r\\n font-weight: 400;\\r\\n line-height: 18px;\\r\\n list-style-image: none;\\r\\n list-style-position: outside;\\r\\n list-style-type: none;\\r\\n opacity: 0.2;\\r\\n text-align: left;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select:hover {\\r\\n opacity: 0.5;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-icon {\\r\\n font-size: 15px;\\r\\n background-repeat: no-repeat;\\r\\n background-size: contain;\\r\\n font-family: WebComponentsIcons;\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select .k-icon, .k-i-close {\\r\\n font-size: 15px;\\r\\n font-family: none;\\r\\n margin-left: 4px;\\r\\n background-repeat: no-repeat;\\r\\n background-size: contain;\\r\\n background-image: url(/Content/Images/SVG/x-circle-12.svg);\\r\\n}\\r\\n\\r\\n.role-multiselect-dropdown .k-multiselect .k-button .k-select .k-icon, .k-i-close::before {\\r\\n content: none;\\r\\n} \\r\\n\\r\\n/* placeholder styles */\\r\\n.role-multiselect-dropdown .criteria-container > .k-multiselect > .k-multiselect-wrap > .k-input {\\r\\npadding-top: 5px;\\r\\npadding-left: 0px;\\r\\nflex: 1;\\r\\ncolor: #121321;\\r\\nopacity: 1;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".list-view-body {\\r\\n height: 650px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.list-view-body-below-input {\\r\\n height: 575px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\ndiv[list-view] {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n div[list-view] .disabled {\\r\\n opacity: .6;\\r\\n pointer-events: none;\\r\\n }\\r\\n\\r\\n.list-item-top-right-link {\\r\\n position: absolute;\\r\\n top: 5px;\\r\\n right: 5px;\\r\\n}\\r\\n\\r\\n.list-item-right-settings-button {\\r\\n padding-right: 40px;\\r\\n}\\r\\n\\r\\nlist-item {\\r\\n display: inherit;\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n padding: 20px;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.vc-list-item {\\r\\n margin-left: 15px;\\r\\n display: inherit;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.list-item {\\r\\n display: inherit;\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n padding: 20px;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\nlist-item.clickable {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n\\r\\nlist-item.clickable {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n\\r\\n.list-item.selected {\\r\\n background-color: #e0e0e0;\\r\\n}\\r\\n\\r\\nlist-item:hover {\\r\\n background-color: #e0e0e0;\\r\\n}\\r\\n\\r\\n\\r\\nlist-item.selected {\\r\\n background-color: #e0e0e0;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/angular-list-view.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,aAAa;IACb,cAAc;IACd,kBAAkB;IAClB,uBAAuB;AAC3B;;AAEA;IACI,aAAa;IACb,cAAc;IACd,kBAAkB;IAClB,uBAAuB;AAC3B;;AAEA;IACI,uBAAuB;AAC3B;;IAEI;QACI,WAAW;QACX,oBAAoB;IACxB;;AAEJ;IACI,kBAAkB;IAClB,QAAQ;IACR,UAAU;AACd;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,gBAAgB;IAChB,gCAAgC;IAChC,aAAa;IACb,uBAAuB;IACvB,kBAAkB;IAClB,qBAAqB;AACzB;;AAEA;IACI,iBAAiB;IACjB,gBAAgB;IAChB,uBAAuB;IACvB,kBAAkB;IAClB,qBAAqB;AACzB;;AAEA;IACI,gBAAgB;IAChB,gCAAgC;IAChC,aAAa;IACb,uBAAuB;IACvB,kBAAkB;IAClB,qBAAqB;AACzB;;AAEA;IACI,eAAe;AACnB;;;AAGA;IACI,eAAe;AACnB;;;AAGA;IACI,yBAAyB;AAC7B;;AAEA;IACI,yBAAyB;AAC7B;;;AAGA;IACI,yBAAyB;AAC7B\",\"sourcesContent\":[\".list-view-body {\\r\\n height: 650px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.list-view-body-below-input {\\r\\n height: 575px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\ndiv[list-view] {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n div[list-view] .disabled {\\r\\n opacity: .6;\\r\\n pointer-events: none;\\r\\n }\\r\\n\\r\\n.list-item-top-right-link {\\r\\n position: absolute;\\r\\n top: 5px;\\r\\n right: 5px;\\r\\n}\\r\\n\\r\\n.list-item-right-settings-button {\\r\\n padding-right: 40px;\\r\\n}\\r\\n\\r\\nlist-item {\\r\\n display: inherit;\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n padding: 20px;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.vc-list-item {\\r\\n margin-left: 15px;\\r\\n display: inherit;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.list-item {\\r\\n display: inherit;\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n padding: 20px;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\nlist-item.clickable {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n\\r\\nlist-item.clickable {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n\\r\\n.list-item.selected {\\r\\n background-color: #e0e0e0;\\r\\n}\\r\\n\\r\\nlist-item:hover {\\r\\n background-color: #e0e0e0;\\r\\n}\\r\\n\\r\\n\\r\\nlist-item.selected {\\r\\n background-color: #e0e0e0;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".steps-indicator li a:before,.steps-indicator:before{background-color:#e6e6e6;content:''}.steps-indicator li.current,.steps-indicator li.default,.steps-indicator li.editing{pointer-events:none}.steps-indicator{right:0;bottom:0;left:0;margin:0;padding:20px 0 0;height:30px;list-style:none}.steps-indicator:before{position:absolute;height:1px}.steps-indicator.steps-2:before{left:calc(100% / 2 / 2);right:calc(100% / 2 / 2)}.steps-indicator.steps-3:before{left:calc(100% / 3 / 2);right:calc(100% / 3 / 2)}.steps-indicator.steps-4:before{left:calc(100% / 4 / 2);right:calc(100% / 4 / 2)}.steps-indicator.steps-5:before{left:calc(100% / 5 / 2);right:calc(100% / 5 / 2)}.steps-indicator.steps-6:before{left:calc(100% / 6 / 2);right:calc(100% / 6 / 2)}.steps-indicator.steps-7:before{left:calc(100% / 7 / 2);right:calc(100% / 7 / 2)}.steps-indicator.steps-8:before{left:calc(100% / 8 / 2);right:calc(100% / 8 / 2)}.steps-indicator.steps-9:before{left:calc(100% / 9 / 2);right:calc(100% / 9 / 2)}.steps-indicator.steps-10:before{left:calc(100% / 10 / 2);right:calc(100% / 10 / 2)}.steps-indicator *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.steps-indicator li{position:relative;float:left;margin:0;padding:0;padding-top:10px;text-align:center;line-height:15px}.steps-indicator li a{color:grey;text-decoration:none;text-transform:uppercase;font-weight:700;transition:.25s;cursor:pointer}.steps-indicator li a:before{position:absolute;top:-7px;left:calc(50% - 7px);width:14px;height:14px;border-radius:100%;transition:.25s}.steps-indicator li a:hover{color:#4d4d4d}.steps-indicator.steps-2 li{width:calc(100% / 2)}.steps-indicator.steps-3 li{width:calc(100% / 3)}.steps-indicator.steps-4 li{width:calc(100% / 4)}.steps-indicator.steps-5 li{width:calc(100% / 5)}.steps-indicator.steps-6 li{width:calc(100% / 6)}.steps-indicator.steps-7 li{width:calc(100% / 7)}.steps-indicator.steps-8 li{width:calc(100% / 8)}.steps-indicator.steps-9 li{width:calc(100% / 9)}.steps-indicator.steps-10 li{width:calc(100% / 10)}.steps-indicator.steps-11 li{width:calc(100% / 11)}.steps-indicator li.default a:hover{color:grey}.steps-indicator li.current a:before{background-color:grey}.steps-indicator li.done a:before{background-color:#393}.steps-indicator li.editing a:before{background-color:red}\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/angular-wizard.min.css\"],\"names\":[],\"mappings\":\"AAAA,qDAAqD,wBAAwB,CAAC,UAAU,CAAC,oFAAoF,mBAAmB,CAAC,iBAAiB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,wBAAwB,iBAAiB,CAAC,UAAU,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,gCAAgC,uBAAuB,CAAC,wBAAwB,CAAC,iCAAiC,wBAAwB,CAAC,yBAAyB,CAAC,mBAAmB,6BAA6B,CAAC,0BAA0B,CAAC,qBAAqB,CAAC,oBAAoB,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,sBAAsB,UAAU,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,CAAC,6BAA6B,iBAAiB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,eAAe,CAAC,4BAA4B,aAAa,CAAC,4BAA4B,oBAAoB,CAAC,4BAA4B,oBAAoB,CAAC,4BAA4B,oBAAoB,CAAC,4BAA4B,oBAAoB,CAAC,4BAA4B,oBAAoB,CAAC,4BAA4B,oBAAoB,CAAC,4BAA4B,oBAAoB,CAAC,4BAA4B,oBAAoB,CAAC,6BAA6B,qBAAqB,CAAC,6BAA6B,qBAAqB,CAAC,oCAAoC,UAAU,CAAC,qCAAqC,qBAAqB,CAAC,kCAAkC,qBAAqB,CAAC,qCAAqC,oBAAoB\",\"sourcesContent\":[\".steps-indicator li a:before,.steps-indicator:before{background-color:#e6e6e6;content:''}.steps-indicator li.current,.steps-indicator li.default,.steps-indicator li.editing{pointer-events:none}.steps-indicator{right:0;bottom:0;left:0;margin:0;padding:20px 0 0;height:30px;list-style:none}.steps-indicator:before{position:absolute;height:1px}.steps-indicator.steps-2:before{left:calc(100% / 2 / 2);right:calc(100% / 2 / 2)}.steps-indicator.steps-3:before{left:calc(100% / 3 / 2);right:calc(100% / 3 / 2)}.steps-indicator.steps-4:before{left:calc(100% / 4 / 2);right:calc(100% / 4 / 2)}.steps-indicator.steps-5:before{left:calc(100% / 5 / 2);right:calc(100% / 5 / 2)}.steps-indicator.steps-6:before{left:calc(100% / 6 / 2);right:calc(100% / 6 / 2)}.steps-indicator.steps-7:before{left:calc(100% / 7 / 2);right:calc(100% / 7 / 2)}.steps-indicator.steps-8:before{left:calc(100% / 8 / 2);right:calc(100% / 8 / 2)}.steps-indicator.steps-9:before{left:calc(100% / 9 / 2);right:calc(100% / 9 / 2)}.steps-indicator.steps-10:before{left:calc(100% / 10 / 2);right:calc(100% / 10 / 2)}.steps-indicator *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.steps-indicator li{position:relative;float:left;margin:0;padding:0;padding-top:10px;text-align:center;line-height:15px}.steps-indicator li a{color:grey;text-decoration:none;text-transform:uppercase;font-weight:700;transition:.25s;cursor:pointer}.steps-indicator li a:before{position:absolute;top:-7px;left:calc(50% - 7px);width:14px;height:14px;border-radius:100%;transition:.25s}.steps-indicator li a:hover{color:#4d4d4d}.steps-indicator.steps-2 li{width:calc(100% / 2)}.steps-indicator.steps-3 li{width:calc(100% / 3)}.steps-indicator.steps-4 li{width:calc(100% / 4)}.steps-indicator.steps-5 li{width:calc(100% / 5)}.steps-indicator.steps-6 li{width:calc(100% / 6)}.steps-indicator.steps-7 li{width:calc(100% / 7)}.steps-indicator.steps-8 li{width:calc(100% / 8)}.steps-indicator.steps-9 li{width:calc(100% / 9)}.steps-indicator.steps-10 li{width:calc(100% / 10)}.steps-indicator.steps-11 li{width:calc(100% / 11)}.steps-indicator li.default a:hover{color:grey}.steps-indicator li.current a:before{background-color:grey}.steps-indicator li.done a:before{background-color:#393}.steps-indicator li.editing a:before{background-color:red}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";\\r\\n\\r\\n/*!\\r\\nAnimate.css - http://daneden.me/animate\\r\\nLicensed under the MIT license\\r\\n\\r\\nCopyright (c) 2013 Daniel Eden\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \\\"Software\\\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\\r\\n\\r\\nThe above copyright notice and this permission notice shall be \\r\\n \\r\\n d in all copies or substantial portions of the Software.\\r\\n\\r\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\\r\\n*/\\r\\n\\r\\n.animated {\\r\\n -webkit-animation-duration: 1s;\\r\\n animation-duration: 1s;\\r\\n -webkit-animation-fill-mode: both;\\r\\n animation-fill-mode: both;\\r\\n z-index: 100;\\r\\n}\\r\\n\\r\\n.animated.infinite {\\r\\n -webkit-animation-iteration-count: infinite;\\r\\n animation-iteration-count: infinite;\\r\\n}\\r\\n\\r\\n.animated.hinge {\\r\\n -webkit-animation-duration: 2s;\\r\\n animation-duration: 2s;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounce {\\r\\n 0%, 20%, 50%, 80%, 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateY(-15px);\\r\\n transform: translateY(-15px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounce {\\r\\n 0%, 20%, 50%, 80%, 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: translateY(-30px);\\r\\n -ms-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateY(-15px);\\r\\n -ms-transform: translateY(-15px);\\r\\n transform: translateY(-15px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounce {\\r\\n -webkit-animation-name: bounce;\\r\\n animation-name: bounce;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flash {\\r\\n 0%, 50%, 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 25%, 75% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flash {\\r\\n 0%, 50%, 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 25%, 75% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.flash {\\r\\n -webkit-animation-name: flash;\\r\\n animation-name: flash;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes pulse {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes pulse {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1.1);\\r\\n -ms-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n.pulse {\\r\\n -webkit-animation-name: pulse;\\r\\n animation-name: pulse;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rubberBand {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: scaleX(1.25) scaleY(0.75);\\r\\n transform: scaleX(1.25) scaleY(0.75);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scaleX(0.75) scaleY(1.25);\\r\\n transform: scaleX(0.75) scaleY(1.25);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: scaleX(1.15) scaleY(0.85);\\r\\n transform: scaleX(1.15) scaleY(0.85);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rubberBand {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: scaleX(1.25) scaleY(0.75);\\r\\n -ms-transform: scaleX(1.25) scaleY(0.75);\\r\\n transform: scaleX(1.25) scaleY(0.75);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scaleX(0.75) scaleY(1.25);\\r\\n -ms-transform: scaleX(0.75) scaleY(1.25);\\r\\n transform: scaleX(0.75) scaleY(1.25);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: scaleX(1.15) scaleY(0.85);\\r\\n -ms-transform: scaleX(1.15) scaleY(0.85);\\r\\n transform: scaleX(1.15) scaleY(0.85);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n.rubberBand {\\r\\n -webkit-animation-name: rubberBand;\\r\\n animation-name: rubberBand;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes shake {\\r\\n 0%, 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 10%, 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 20%, 40%, 60%, 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes shake {\\r\\n 0%, 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 10%, 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n -ms-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 20%, 40%, 60%, 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n -ms-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n}\\r\\n\\r\\n.shake {\\r\\n -webkit-animation-name: shake;\\r\\n animation-name: shake;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes swing {\\r\\n 20% {\\r\\n -webkit-transform: rotate(15deg);\\r\\n transform: rotate(15deg);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(-10deg);\\r\\n transform: rotate(-10deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: rotate(5deg);\\r\\n transform: rotate(5deg);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(-5deg);\\r\\n transform: rotate(-5deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(0deg);\\r\\n transform: rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes swing {\\r\\n 20% {\\r\\n -webkit-transform: rotate(15deg);\\r\\n -ms-transform: rotate(15deg);\\r\\n transform: rotate(15deg);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(-10deg);\\r\\n -ms-transform: rotate(-10deg);\\r\\n transform: rotate(-10deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: rotate(5deg);\\r\\n -ms-transform: rotate(5deg);\\r\\n transform: rotate(5deg);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(-5deg);\\r\\n -ms-transform: rotate(-5deg);\\r\\n transform: rotate(-5deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(0deg);\\r\\n -ms-transform: rotate(0deg);\\r\\n transform: rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n.swing {\\r\\n -webkit-transform-origin: top center;\\r\\n -ms-transform-origin: top center;\\r\\n transform-origin: top center;\\r\\n -webkit-animation-name: swing;\\r\\n animation-name: swing;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes tada {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 10%, 20% {\\r\\n -webkit-transform: scale(0.9) rotate(-3deg);\\r\\n transform: scale(0.9) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: scale(1.1) rotate(3deg);\\r\\n transform: scale(1.1) rotate(3deg);\\r\\n }\\r\\n\\r\\n 40%, 60%, 80% {\\r\\n -webkit-transform: scale(1.1) rotate(-3deg);\\r\\n transform: scale(1.1) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1) rotate(0);\\r\\n transform: scale(1) rotate(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes tada {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 10%, 20% {\\r\\n -webkit-transform: scale(0.9) rotate(-3deg);\\r\\n -ms-transform: scale(0.9) rotate(-3deg);\\r\\n transform: scale(0.9) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: scale(1.1) rotate(3deg);\\r\\n -ms-transform: scale(1.1) rotate(3deg);\\r\\n transform: scale(1.1) rotate(3deg);\\r\\n }\\r\\n\\r\\n 40%, 60%, 80% {\\r\\n -webkit-transform: scale(1.1) rotate(-3deg);\\r\\n -ms-transform: scale(1.1) rotate(-3deg);\\r\\n transform: scale(1.1) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1) rotate(0);\\r\\n -ms-transform: scale(1) rotate(0);\\r\\n transform: scale(1) rotate(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.tada {\\r\\n -webkit-animation-name: tada;\\r\\n animation-name: tada;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes wobble {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n\\r\\n 15% {\\r\\n -webkit-transform: translateX(-25%) rotate(-5deg);\\r\\n transform: translateX(-25%) rotate(-5deg);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: translateX(20%) rotate(3deg);\\r\\n transform: translateX(20%) rotate(3deg);\\r\\n }\\r\\n\\r\\n 45% {\\r\\n -webkit-transform: translateX(-15%) rotate(-3deg);\\r\\n transform: translateX(-15%) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(10%) rotate(2deg);\\r\\n transform: translateX(10%) rotate(2deg);\\r\\n }\\r\\n\\r\\n 75% {\\r\\n -webkit-transform: translateX(-5%) rotate(-1deg);\\r\\n transform: translateX(-5%) rotate(-1deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes wobble {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%);\\r\\n -ms-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n\\r\\n 15% {\\r\\n -webkit-transform: translateX(-25%) rotate(-5deg);\\r\\n -ms-transform: translateX(-25%) rotate(-5deg);\\r\\n transform: translateX(-25%) rotate(-5deg);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: translateX(20%) rotate(3deg);\\r\\n -ms-transform: translateX(20%) rotate(3deg);\\r\\n transform: translateX(20%) rotate(3deg);\\r\\n }\\r\\n\\r\\n 45% {\\r\\n -webkit-transform: translateX(-15%) rotate(-3deg);\\r\\n -ms-transform: translateX(-15%) rotate(-3deg);\\r\\n transform: translateX(-15%) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(10%) rotate(2deg);\\r\\n -ms-transform: translateX(10%) rotate(2deg);\\r\\n transform: translateX(10%) rotate(2deg);\\r\\n }\\r\\n\\r\\n 75% {\\r\\n -webkit-transform: translateX(-5%) rotate(-1deg);\\r\\n -ms-transform: translateX(-5%) rotate(-1deg);\\r\\n transform: translateX(-5%) rotate(-1deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%);\\r\\n -ms-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n}\\r\\n\\r\\n.wobble {\\r\\n -webkit-animation-name: wobble;\\r\\n animation-name: wobble;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.05);\\r\\n transform: scale(1.05);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: scale(.9);\\r\\n transform: scale(.9);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n -ms-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.05);\\r\\n -ms-transform: scale(1.05);\\r\\n transform: scale(1.05);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: scale(.9);\\r\\n -ms-transform: scale(.9);\\r\\n transform: scale(.9);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceIn {\\r\\n -webkit-animation-name: bounceIn;\\r\\n animation-name: bounceIn;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(30px);\\r\\n transform: translateY(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(-10px);\\r\\n transform: translateY(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(30px);\\r\\n -ms-transform: translateY(30px);\\r\\n transform: translateY(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(-10px);\\r\\n -ms-transform: translateY(-10px);\\r\\n transform: translateY(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInDown {\\r\\n -webkit-animation-name: bounceInDown;\\r\\n animation-name: bounceInDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(30px);\\r\\n transform: translateX(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(30px);\\r\\n -ms-transform: translateX(30px);\\r\\n transform: translateX(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n -ms-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInLeft {\\r\\n -webkit-animation-name: bounceInLeft;\\r\\n animation-name: bounceInLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-30px);\\r\\n transform: translateX(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-30px);\\r\\n -ms-transform: translateX(-30px);\\r\\n transform: translateX(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n -ms-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInRight {\\r\\n -webkit-animation-name: bounceInRight;\\r\\n animation-name: bounceInRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(10px);\\r\\n transform: translateY(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-30px);\\r\\n -ms-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(10px);\\r\\n -ms-transform: translateY(10px);\\r\\n transform: translateY(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInUp {\\r\\n -webkit-animation-name: bounceInUp;\\r\\n animation-name: bounceInUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOut {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 25% {\\r\\n -webkit-transform: scale(.95);\\r\\n transform: scale(.95);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOut {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 25% {\\r\\n -webkit-transform: scale(.95);\\r\\n -ms-transform: scale(.95);\\r\\n transform: scale(.95);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.1);\\r\\n -ms-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n -ms-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOut {\\r\\n -webkit-animation-name: bounceOut;\\r\\n animation-name: bounceOut;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-20px);\\r\\n -ms-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutDown {\\r\\n -webkit-animation-name: bounceOutDown;\\r\\n animation-name: bounceOutDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(20px);\\r\\n -ms-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutLeft {\\r\\n -webkit-animation-name: bounceOutLeft;\\r\\n animation-name: bounceOutLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-20px);\\r\\n -ms-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutRight {\\r\\n -webkit-animation-name: bounceOutRight;\\r\\n animation-name: bounceOutRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(20px);\\r\\n -ms-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutUp {\\r\\n -webkit-animation-name: bounceOutUp;\\r\\n animation-name: bounceOutUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeIn {\\r\\n -webkit-animation-name: fadeIn;\\r\\n animation-name: fadeIn;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n -ms-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInDown {\\r\\n -webkit-animation-name: fadeInDown;\\r\\n animation-name: fadeInDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInDownBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInDownBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInDownBig {\\r\\n -webkit-animation-name: fadeInDownBig;\\r\\n animation-name: fadeInDownBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n -ms-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInLeft {\\r\\n -webkit-animation-name: fadeInLeft;\\r\\n animation-name: fadeInLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInLeftBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInLeftBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInLeftBig {\\r\\n -webkit-animation-name: fadeInLeftBig;\\r\\n animation-name: fadeInLeftBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(40px);\\r\\n -ms-transform: translateX(40px);\\r\\n transform: translateX(40px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInRight {\\r\\n -webkit-animation-name: fadeInRight;\\r\\n animation-name: fadeInRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInRightBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInRightBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInRightBig {\\r\\n -webkit-animation-name: fadeInRightBig;\\r\\n animation-name: fadeInRightBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n -ms-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInUp {\\r\\n -webkit-animation-name: fadeInUp;\\r\\n animation-name: fadeInUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInUpBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInUpBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInUpBig {\\r\\n -webkit-animation-name: fadeInUpBig;\\r\\n animation-name: fadeInUpBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOut {\\r\\n -webkit-animation-name: fadeOut;\\r\\n animation-name: fadeOut;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutDown {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutDown {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n -ms-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutDown {\\r\\n -webkit-animation-name: fadeOutDown;\\r\\n animation-name: fadeOutDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutDownBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutDownBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutDownBig {\\r\\n -webkit-animation-name: fadeOutDownBig;\\r\\n animation-name: fadeOutDownBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutLeft {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutLeft {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n -ms-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutLeft {\\r\\n -webkit-animation-name: fadeOutLeft;\\r\\n animation-name: fadeOutLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutLeftBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutLeftBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutLeftBig {\\r\\n -webkit-animation-name: fadeOutLeftBig;\\r\\n animation-name: fadeOutLeftBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutRight {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutRight {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(20px);\\r\\n -ms-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutRight {\\r\\n -webkit-animation-name: fadeOutRight;\\r\\n animation-name: fadeOutRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutRightBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutRightBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutRightBig {\\r\\n -webkit-animation-name: fadeOutRightBig;\\r\\n animation-name: fadeOutRightBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutUp {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutUp {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n -ms-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutUp {\\r\\n -webkit-animation-name: fadeOutUp;\\r\\n animation-name: fadeOutUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutUpBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutUpBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutUpBig {\\r\\n -webkit-animation-name: fadeOutUpBig;\\r\\n animation-name: fadeOutUpBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flip {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flip {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n}\\r\\n\\r\\n.animated.flip {\\r\\n -webkit-backface-visibility: visible;\\r\\n -ms-backface-visibility: visible;\\r\\n backface-visibility: visible;\\r\\n -webkit-animation-name: flip;\\r\\n animation-name: flip;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipInX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateX(-10deg);\\r\\n transform: perspective(400px) rotateX(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateX(10deg);\\r\\n transform: perspective(400px) rotateX(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipInX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n -ms-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateX(-10deg);\\r\\n -ms-transform: perspective(400px) rotateX(-10deg);\\r\\n transform: perspective(400px) rotateX(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateX(10deg);\\r\\n -ms-transform: perspective(400px) rotateX(10deg);\\r\\n transform: perspective(400px) rotateX(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n -ms-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipInX {\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n -webkit-animation-name: flipInX;\\r\\n animation-name: flipInX;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipInY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateY(-10deg);\\r\\n transform: perspective(400px) rotateY(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateY(10deg);\\r\\n transform: perspective(400px) rotateY(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipInY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n -ms-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateY(-10deg);\\r\\n -ms-transform: perspective(400px) rotateY(-10deg);\\r\\n transform: perspective(400px) rotateY(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateY(10deg);\\r\\n -ms-transform: perspective(400px) rotateY(10deg);\\r\\n transform: perspective(400px) rotateY(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n -ms-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipInY {\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n -webkit-animation-name: flipInY;\\r\\n animation-name: flipInY;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipOutX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipOutX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n -ms-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n -ms-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipOutX {\\r\\n -webkit-animation-name: flipOutX;\\r\\n animation-name: flipOutX;\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipOutY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipOutY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n -ms-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n -ms-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipOutY {\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n -webkit-animation-name: flipOutY;\\r\\n animation-name: flipOutY;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes lightSpeedIn {\\r\\n 0% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(-20%) skewX(30deg);\\r\\n transform: translateX(-20%) skewX(30deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(0%) skewX(-15deg);\\r\\n transform: translateX(0%) skewX(-15deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes lightSpeedIn {\\r\\n 0% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n -ms-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(-20%) skewX(30deg);\\r\\n -ms-transform: translateX(-20%) skewX(30deg);\\r\\n transform: translateX(-20%) skewX(30deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(0%) skewX(-15deg);\\r\\n -ms-transform: translateX(0%) skewX(-15deg);\\r\\n transform: translateX(0%) skewX(-15deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n -ms-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.lightSpeedIn {\\r\\n -webkit-animation-name: lightSpeedIn;\\r\\n animation-name: lightSpeedIn;\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes lightSpeedOut {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes lightSpeedOut {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n -ms-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n -ms-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.lightSpeedOut {\\r\\n -webkit-animation-name: lightSpeedOut;\\r\\n animation-name: lightSpeedOut;\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateIn {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(-200deg);\\r\\n transform: rotate(-200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateIn {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(-200deg);\\r\\n -ms-transform: rotate(-200deg);\\r\\n transform: rotate(-200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateIn {\\r\\n -webkit-animation-name: rotateIn;\\r\\n animation-name: rotateIn;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInDownLeft {\\r\\n -webkit-animation-name: rotateInDownLeft;\\r\\n animation-name: rotateInDownLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInDownRight {\\r\\n -webkit-animation-name: rotateInDownRight;\\r\\n animation-name: rotateInDownRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInUpLeft {\\r\\n -webkit-animation-name: rotateInUpLeft;\\r\\n animation-name: rotateInUpLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInUpRight {\\r\\n -webkit-animation-name: rotateInUpRight;\\r\\n animation-name: rotateInUpRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOut {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(200deg);\\r\\n transform: rotate(200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOut {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(200deg);\\r\\n -ms-transform: rotate(200deg);\\r\\n transform: rotate(200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOut {\\r\\n -webkit-animation-name: rotateOut;\\r\\n animation-name: rotateOut;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutDownLeft {\\r\\n -webkit-animation-name: rotateOutDownLeft;\\r\\n animation-name: rotateOutDownLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutDownRight {\\r\\n -webkit-animation-name: rotateOutDownRight;\\r\\n animation-name: rotateOutDownRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutUpLeft {\\r\\n -webkit-animation-name: rotateOutUpLeft;\\r\\n animation-name: rotateOutUpLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutUpRight {\\r\\n -webkit-animation-name: rotateOutUpRight;\\r\\n animation-name: rotateOutUpRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideInDown {\\r\\n -webkit-animation-name: slideInDown;\\r\\n animation-name: slideInDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideInLeft {\\r\\n -webkit-animation-name: slideInLeft;\\r\\n animation-name: slideInLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideInRight {\\r\\n -webkit-animation-name: slideInRight;\\r\\n animation-name: slideInRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutLeft {\\r\\n -webkit-animation-name: slideOutLeft;\\r\\n animation-name: slideOutLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutRight {\\r\\n -webkit-animation-name: slideOutRight;\\r\\n animation-name: slideOutRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutUp {\\r\\n -webkit-animation-name: slideOutUp;\\r\\n animation-name: slideOutUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutDown {\\r\\n -webkit-animation-name: slideOutDown;\\r\\n animation-name: slideOutDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes hinge {\\r\\n 0% {\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 20%, 60% {\\r\\n -webkit-transform: rotate(80deg);\\r\\n transform: rotate(80deg);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(60deg);\\r\\n transform: rotate(60deg);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(60deg) translateY(0);\\r\\n transform: rotate(60deg) translateY(0);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(700px);\\r\\n transform: translateY(700px);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes hinge {\\r\\n 0% {\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 20%, 60% {\\r\\n -webkit-transform: rotate(80deg);\\r\\n -ms-transform: rotate(80deg);\\r\\n transform: rotate(80deg);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(60deg);\\r\\n -ms-transform: rotate(60deg);\\r\\n transform: rotate(60deg);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(60deg) translateY(0);\\r\\n -ms-transform: rotate(60deg) translateY(0);\\r\\n transform: rotate(60deg) translateY(0);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(700px);\\r\\n -ms-transform: translateY(700px);\\r\\n transform: translateY(700px);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.hinge {\\r\\n -webkit-animation-name: hinge;\\r\\n animation-name: hinge;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes rollIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-100%) rotate(-120deg);\\r\\n transform: translateX(-100%) rotate(-120deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rollIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-100%) rotate(-120deg);\\r\\n -ms-transform: translateX(-100%) rotate(-120deg);\\r\\n transform: translateX(-100%) rotate(-120deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n -ms-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n.rollIn {\\r\\n -webkit-animation-name: rollIn;\\r\\n animation-name: rollIn;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes rollOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(100%) rotate(120deg);\\r\\n transform: translateX(100%) rotate(120deg);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rollOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n -ms-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(100%) rotate(120deg);\\r\\n -ms-transform: translateX(100%) rotate(120deg);\\r\\n transform: translateX(100%) rotate(120deg);\\r\\n }\\r\\n}\\r\\n\\r\\n.rollOut {\\r\\n -webkit-animation-name: rollOut;\\r\\n animation-name: rollOut;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/animate.css\"],\"names\":[],\"mappings\":\"AAAA,gBAAgB;;AAEhB;;;;;;;;;;;;;CAaC;;AAED;IACI,8BAA8B;IAC9B,sBAAsB;IACtB,iCAAiC;IACjC,yBAAyB;IACzB,YAAY;AAChB;;AAEA;IACI,2CAA2C;IAC3C,mCAAmC;AACvC;;AAEA;IACI,8BAA8B;IAC9B,sBAAsB;AAC1B;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,oCAAoC;QACpC,4BAA4B;IAChC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;AACJ;;AAEA;IACI,8BAA8B;IAC9B,sBAAsB;AAC1B;;AAEA;IACI;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;AACJ;;AAEA;IACI;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;AACJ;;AAEA;IACI,6BAA6B;IAC7B,qBAAqB;AACzB;;AAEA,6EAA6E;;AAE7E;IACI;QACI,2BAA2B;QAC3B,mBAAmB;IACvB;;IAEA;QACI,6BAA6B;QAC7B,qBAAqB;IACzB;;IAEA;QACI,2BAA2B;QAC3B,mBAAmB;IACvB;AACJ;;AAEA;IACI;QACI,2BAA2B;QAC3B,uBAAuB;QACvB,mBAAmB;IACvB;;IAEA;QACI,6BAA6B;QAC7B,yBAAyB;QACzB,qBAAqB;IACzB;;IAEA;QACI,2BAA2B;QAC3B,uBAAuB;QACvB,mBAAmB;IACvB;AACJ;;AAEA;IACI,6BAA6B;IAC7B,qBAAqB;AACzB;;AAEA;IACI;QACI,2BAA2B;QAC3B,mBAAmB;IACvB;;IAEA;QACI,4CAA4C;QAC5C,oCAAoC;IACxC;;IAEA;QACI,4CAA4C;QAC5C,oCAAoC;IACxC;;IAEA;QACI,4CAA4C;QAC5C,oCAAoC;IACxC;;IAEA;QACI,2BAA2B;QAC3B,mBAAmB;IACvB;AACJ;;AAEA;IACI;QACI,2BAA2B;QAC3B,uBAAuB;QACvB,mBAAmB;IACvB;;IAEA;QACI,4CAA4C;QAC5C,wCAAwC;QACxC,oCAAoC;IACxC;;IAEA;QACI,4CAA4C;QAC5C,wCAAwC;QACxC,oCAAoC;IACxC;;IAEA;QACI,4CAA4C;QAC5C,wCAAwC;QACxC,oCAAoC;IACxC;;IAEA;QACI,2BAA2B;QAC3B,uBAAuB;QACvB,mBAAmB;IACvB;AACJ;;AAEA;IACI,kCAAkC;IAClC,0BAA0B;AAC9B;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,mCAAmC;QACnC,2BAA2B;IAC/B;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;AACJ;;AAEA;IACI,6BAA6B;IAC7B,qBAAqB;AACzB;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,iCAAiC;QACjC,yBAAyB;IAC7B;;IAEA;QACI,+BAA+B;QAC/B,uBAAuB;IAC3B;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,+BAA+B;QAC/B,uBAAuB;IAC3B;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;IAC7B;;IAEA;QACI,+BAA+B;QAC/B,2BAA2B;QAC3B,uBAAuB;IAC3B;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,+BAA+B;QAC/B,2BAA2B;QAC3B,uBAAuB;IAC3B;AACJ;;AAEA;IACI,oCAAoC;IACpC,gCAAgC;IAChC,4BAA4B;IAC5B,6BAA6B;IAC7B,qBAAqB;AACzB;;AAEA;IACI;QACI,2BAA2B;QAC3B,mBAAmB;IACvB;;IAEA;QACI,2CAA2C;QAC3C,mCAAmC;IACvC;;IAEA;QACI,0CAA0C;QAC1C,kCAAkC;IACtC;;IAEA;QACI,2CAA2C;QAC3C,mCAAmC;IACvC;;IAEA;QACI,qCAAqC;QACrC,6BAA6B;IACjC;AACJ;;AAEA;IACI;QACI,2BAA2B;QAC3B,uBAAuB;QACvB,mBAAmB;IACvB;;IAEA;QACI,2CAA2C;QAC3C,uCAAuC;QACvC,mCAAmC;IACvC;;IAEA;QACI,0CAA0C;QAC1C,sCAAsC;QACtC,kCAAkC;IACtC;;IAEA;QACI,2CAA2C;QAC3C,uCAAuC;QACvC,mCAAmC;IACvC;;IAEA;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;AACJ;;AAEA;IACI,4BAA4B;IAC5B,oBAAoB;AACxB;;AAEA,6EAA6E;;AAE7E;IACI;QACI,iCAAiC;QACjC,yBAAyB;IAC7B;;IAEA;QACI,iDAAiD;QACjD,yCAAyC;IAC7C;;IAEA;QACI,+CAA+C;QAC/C,uCAAuC;IAC3C;;IAEA;QACI,iDAAiD;QACjD,yCAAyC;IAC7C;;IAEA;QACI,+CAA+C;QAC/C,uCAAuC;IAC3C;;IAEA;QACI,gDAAgD;QAChD,wCAAwC;IAC5C;;IAEA;QACI,iCAAiC;QACjC,yBAAyB;IAC7B;AACJ;;AAEA;IACI;QACI,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;IAC7B;;IAEA;QACI,iDAAiD;QACjD,6CAA6C;QAC7C,yCAAyC;IAC7C;;IAEA;QACI,+CAA+C;QAC/C,2CAA2C;QAC3C,uCAAuC;IAC3C;;IAEA;QACI,iDAAiD;QACjD,6CAA6C;QAC7C,yCAAyC;IAC7C;;IAEA;QACI,+CAA+C;QAC/C,2CAA2C;QAC3C,uCAAuC;IAC3C;;IAEA;QACI,gDAAgD;QAChD,4CAA4C;QAC5C,wCAAwC;IAC5C;;IAEA;QACI,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;IAC7B;AACJ;;AAEA;IACI,8BAA8B;IAC9B,sBAAsB;AAC1B;;AAEA;IACI;QACI,UAAU;QACV,4BAA4B;QAC5B,oBAAoB;IACxB;;IAEA;QACI,UAAU;QACV,8BAA8B;QAC9B,sBAAsB;IAC1B;;IAEA;QACI,4BAA4B;QAC5B,oBAAoB;IACxB;;IAEA;QACI,UAAU;QACV,2BAA2B;QAC3B,mBAAmB;IACvB;AACJ;;AAEA;IACI;QACI,UAAU;QACV,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;IACxB;;IAEA;QACI,UAAU;QACV,8BAA8B;QAC9B,0BAA0B;QAC1B,sBAAsB;IAC1B;;IAEA;QACI,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;IACxB;;IAEA;QACI,UAAU;QACV,2BAA2B;QAC3B,uBAAuB;QACvB,mBAAmB;IACvB;AACJ;;AAEA;IACI,gCAAgC;IAChC,wBAAwB;AAC5B;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;AAChC;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;AAChC;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,qCAAqC;IACrC,6BAA6B;AACjC;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,kCAAkC;IAClC,0BAA0B;AAC9B;;AAEA;IACI;QACI,2BAA2B;QAC3B,mBAAmB;IACvB;;IAEA;QACI,6BAA6B;QAC7B,qBAAqB;IACzB;;IAEA;QACI,UAAU;QACV,6BAA6B;QAC7B,qBAAqB;IACzB;;IAEA;QACI,UAAU;QACV,4BAA4B;QAC5B,oBAAoB;IACxB;AACJ;;AAEA;IACI;QACI,2BAA2B;QAC3B,uBAAuB;QACvB,mBAAmB;IACvB;;IAEA;QACI,6BAA6B;QAC7B,yBAAyB;QACzB,qBAAqB;IACzB;;IAEA;QACI,UAAU;QACV,6BAA6B;QAC7B,yBAAyB;QACzB,qBAAqB;IACzB;;IAEA;QACI,UAAU;QACV,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;IACxB;AACJ;;AAEA;IACI,iCAAiC;IACjC,yBAAyB;AAC7B;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;AACJ;;AAEA;IACI,qCAAqC;IACrC,6BAA6B;AACjC;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;AACJ;;AAEA;IACI,qCAAqC;IACrC,6BAA6B;AACjC;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;AACJ;;AAEA;IACI,sCAAsC;IACtC,8BAA8B;AAClC;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;AACJ;;AAEA;IACI,mCAAmC;IACnC,2BAA2B;AAC/B;;AAEA;IACI;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;AACJ;;AAEA;IACI;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;AACJ;;AAEA;IACI,8BAA8B;IAC9B,sBAAsB;AAC1B;;AAEA;IACI;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,kCAAkC;IAClC,0BAA0B;AAC9B;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,qCAAqC;IACrC,6BAA6B;AACjC;;AAEA;IACI;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,kCAAkC;IAClC,0BAA0B;AAC9B;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,qCAAqC;IACrC,6BAA6B;AACjC;;AAEA;IACI;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,mCAAmC;IACnC,2BAA2B;AAC/B;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,sCAAsC;IACtC,8BAA8B;AAClC;;AAEA;IACI;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,gCAAgC;IAChC,wBAAwB;AAC5B;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;;IAEA;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,mCAAmC;IACnC,2BAA2B;AAC/B;;AAEA;IACI;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;AACJ;;AAEA;IACI;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;AACJ;;AAEA;IACI,+BAA+B;IAC/B,uBAAuB;AAC3B;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;AACJ;;AAEA;IACI,mCAAmC;IACnC,2BAA2B;AAC/B;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;AACJ;;AAEA;IACI,sCAAsC;IACtC,8BAA8B;AAClC;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;AACJ;;AAEA;IACI,mCAAmC;IACnC,2BAA2B;AAC/B;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;AACJ;;AAEA;IACI,sCAAsC;IACtC,8BAA8B;AAClC;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,2BAA2B;IAC/B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,mCAAmC;QACnC,+BAA+B;QAC/B,2BAA2B;IAC/B;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;AAChC;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;AACJ;;AAEA;IACI,uCAAuC;IACvC,+BAA+B;AACnC;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,4BAA4B;IAChC;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;IAChC;AACJ;;AAEA;IACI,iCAAiC;IACjC,yBAAyB;AAC7B;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;AACJ;;AAEA;IACI;QACI,UAAU;QACV,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;AAChC;;AAEA;IACI;QACI,uEAAuE;QACvE,+DAA+D;QAC/D,2CAA2C;QAC3C,mCAAmC;IACvC;;IAEA;QACI,gFAAgF;QAChF,wEAAwE;QACxE,2CAA2C;QAC3C,mCAAmC;IACvC;;IAEA;QACI,gFAAgF;QAChF,wEAAwE;QACxE,0CAA0C;QAC1C,kCAAkC;IACtC;;IAEA;QACI,8EAA8E;QAC9E,sEAAsE;QACtE,0CAA0C;QAC1C,kCAAkC;IACtC;;IAEA;QACI,4EAA4E;QAC5E,oEAAoE;QACpE,0CAA0C;QAC1C,kCAAkC;IACtC;AACJ;;AAEA;IACI;QACI,uEAAuE;QACvE,mEAAmE;QACnE,+DAA+D;QAC/D,2CAA2C;QAC3C,mCAAmC;IACvC;;IAEA;QACI,gFAAgF;QAChF,4EAA4E;QAC5E,wEAAwE;QACxE,2CAA2C;QAC3C,mCAAmC;IACvC;;IAEA;QACI,gFAAgF;QAChF,4EAA4E;QAC5E,wEAAwE;QACxE,0CAA0C;QAC1C,kCAAkC;IACtC;;IAEA;QACI,8EAA8E;QAC9E,0EAA0E;QAC1E,sEAAsE;QACtE,0CAA0C;QAC1C,kCAAkC;IACtC;;IAEA;QACI,4EAA4E;QAC5E,wEAAwE;QACxE,oEAAoE;QACpE,0CAA0C;QAC1C,kCAAkC;IACtC;AACJ;;AAEA;IACI,oCAAoC;IACpC,gCAAgC;IAChC,4BAA4B;IAC5B,4BAA4B;IAC5B,oBAAoB;AACxB;;AAEA;IACI;QACI,oDAAoD;QACpD,4CAA4C;QAC5C,UAAU;IACd;;IAEA;QACI,qDAAqD;QACrD,6CAA6C;IACjD;;IAEA;QACI,oDAAoD;QACpD,4CAA4C;IAChD;;IAEA;QACI,mDAAmD;QACnD,2CAA2C;QAC3C,UAAU;IACd;AACJ;;AAEA;IACI;QACI,oDAAoD;QACpD,gDAAgD;QAChD,4CAA4C;QAC5C,UAAU;IACd;;IAEA;QACI,qDAAqD;QACrD,iDAAiD;QACjD,6CAA6C;IACjD;;IAEA;QACI,oDAAoD;QACpD,gDAAgD;QAChD,4CAA4C;IAChD;;IAEA;QACI,mDAAmD;QACnD,+CAA+C;QAC/C,2CAA2C;QAC3C,UAAU;IACd;AACJ;;AAEA;IACI,+CAA+C;IAC/C,2CAA2C;IAC3C,uCAAuC;IACvC,+BAA+B;IAC/B,uBAAuB;AAC3B;;AAEA;IACI;QACI,oDAAoD;QACpD,4CAA4C;QAC5C,UAAU;IACd;;IAEA;QACI,qDAAqD;QACrD,6CAA6C;IACjD;;IAEA;QACI,oDAAoD;QACpD,4CAA4C;IAChD;;IAEA;QACI,mDAAmD;QACnD,2CAA2C;QAC3C,UAAU;IACd;AACJ;;AAEA;IACI;QACI,oDAAoD;QACpD,gDAAgD;QAChD,4CAA4C;QAC5C,UAAU;IACd;;IAEA;QACI,qDAAqD;QACrD,iDAAiD;QACjD,6CAA6C;IACjD;;IAEA;QACI,oDAAoD;QACpD,gDAAgD;QAChD,4CAA4C;IAChD;;IAEA;QACI,mDAAmD;QACnD,+CAA+C;QAC/C,2CAA2C;QAC3C,UAAU;IACd;AACJ;;AAEA;IACI,+CAA+C;IAC/C,2CAA2C;IAC3C,uCAAuC;IACvC,+BAA+B;IAC/B,uBAAuB;AAC3B;;AAEA;IACI;QACI,mDAAmD;QACnD,2CAA2C;QAC3C,UAAU;IACd;;IAEA;QACI,oDAAoD;QACpD,4CAA4C;QAC5C,UAAU;IACd;AACJ;;AAEA;IACI;QACI,mDAAmD;QACnD,+CAA+C;QAC/C,2CAA2C;QAC3C,UAAU;IACd;;IAEA;QACI,oDAAoD;QACpD,gDAAgD;QAChD,4CAA4C;QAC5C,UAAU;IACd;AACJ;;AAEA;IACI,gCAAgC;IAChC,wBAAwB;IACxB,+CAA+C;IAC/C,2CAA2C;IAC3C,uCAAuC;AAC3C;;AAEA;IACI;QACI,mDAAmD;QACnD,2CAA2C;QAC3C,UAAU;IACd;;IAEA;QACI,oDAAoD;QACpD,4CAA4C;QAC5C,UAAU;IACd;AACJ;;AAEA;IACI;QACI,mDAAmD;QACnD,+CAA+C;QAC/C,2CAA2C;QAC3C,UAAU;IACd;;IAEA;QACI,oDAAoD;QACpD,gDAAgD;QAChD,4CAA4C;QAC5C,UAAU;IACd;AACJ;;AAEA;IACI,+CAA+C;IAC/C,2CAA2C;IAC3C,uCAAuC;IACvC,gCAAgC;IAChC,wBAAwB;AAC5B;;AAEA;IACI;QACI,iDAAiD;QACjD,yCAAyC;QACzC,UAAU;IACd;;IAEA;QACI,gDAAgD;QAChD,wCAAwC;QACxC,UAAU;IACd;;IAEA;QACI,+CAA+C;QAC/C,uCAAuC;QACvC,UAAU;IACd;;IAEA;QACI,6CAA6C;QAC7C,qCAAqC;QACrC,UAAU;IACd;AACJ;;AAEA;IACI;QACI,iDAAiD;QACjD,6CAA6C;QAC7C,yCAAyC;QACzC,UAAU;IACd;;IAEA;QACI,gDAAgD;QAChD,4CAA4C;QAC5C,wCAAwC;QACxC,UAAU;IACd;;IAEA;QACI,+CAA+C;QAC/C,2CAA2C;QAC3C,uCAAuC;QACvC,UAAU;IACd;;IAEA;QACI,6CAA6C;QAC7C,yCAAyC;QACzC,qCAAqC;QACrC,UAAU;IACd;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;IAC5B,2CAA2C;IAC3C,mCAAmC;AACvC;;AAEA;IACI;QACI,6CAA6C;QAC7C,qCAAqC;QACrC,UAAU;IACd;;IAEA;QACI,iDAAiD;QACjD,yCAAyC;QACzC,UAAU;IACd;AACJ;;AAEA;IACI;QACI,6CAA6C;QAC7C,yCAAyC;QACzC,qCAAqC;QACrC,UAAU;IACd;;IAEA;QACI,iDAAiD;QACjD,6CAA6C;QAC7C,yCAAyC;QACzC,UAAU;IACd;AACJ;;AAEA;IACI,qCAAqC;IACrC,6BAA6B;IAC7B,0CAA0C;IAC1C,kCAAkC;AACtC;;AAEA;IACI;QACI,uCAAuC;QACvC,+BAA+B;QAC/B,kCAAkC;QAClC,0BAA0B;QAC1B,UAAU;IACd;;IAEA;QACI,uCAAuC;QACvC,+BAA+B;QAC/B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,uCAAuC;QACvC,mCAAmC;QACnC,+BAA+B;QAC/B,kCAAkC;QAClC,8BAA8B;QAC9B,0BAA0B;QAC1B,UAAU;IACd;;IAEA;QACI,uCAAuC;QACvC,mCAAmC;QACnC,+BAA+B;QAC/B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI,gCAAgC;IAChC,wBAAwB;AAC5B;;AAEA;IACI;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,iCAAiC;QACjC,yBAAyB;QACzB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;QACzB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI,wCAAwC;IACxC,gCAAgC;AACpC;;AAEA;IACI;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,gCAAgC;QAChC,wBAAwB;QACxB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;QACxB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI,yCAAyC;IACzC,iCAAiC;AACrC;;AAEA;IACI;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,gCAAgC;QAChC,wBAAwB;QACxB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;QACxB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI,sCAAsC;IACtC,8BAA8B;AAClC;;AAEA;IACI;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,iCAAiC;QACjC,yBAAyB;QACzB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;QACzB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;AACJ;;AAEA;IACI,uCAAuC;IACvC,+BAA+B;AACnC;;AAEA;IACI;QACI,uCAAuC;QACvC,+BAA+B;QAC/B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,uCAAuC;QACvC,+BAA+B;QAC/B,iCAAiC;QACjC,yBAAyB;QACzB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,uCAAuC;QACvC,mCAAmC;QACnC,+BAA+B;QAC/B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,uCAAuC;QACvC,mCAAmC;QACnC,+BAA+B;QAC/B,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;QACzB,UAAU;IACd;AACJ;;AAEA;IACI,iCAAiC;IACjC,yBAAyB;AAC7B;;AAEA;IACI;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,gCAAgC;QAChC,wBAAwB;QACxB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;QACxB,UAAU;IACd;AACJ;;AAEA;IACI,yCAAyC;IACzC,iCAAiC;AACrC;;AAEA;IACI;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,iCAAiC;QACjC,yBAAyB;QACzB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;QACzB,UAAU;IACd;AACJ;;AAEA;IACI,0CAA0C;IAC1C,kCAAkC;AACtC;;AAEA;IACI;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,6BAA6B;QAC7B,iCAAiC;QACjC,yBAAyB;QACzB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;QAC7B,iCAAiC;QACjC,6BAA6B;QAC7B,yBAAyB;QACzB,UAAU;IACd;AACJ;;AAEA;IACI,uCAAuC;IACvC,+BAA+B;AACnC;;AAEA;IACI;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,4BAA4B;QAC5B,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,8BAA8B;QAC9B,gCAAgC;QAChC,wBAAwB;QACxB,UAAU;IACd;AACJ;;AAEA;IACI;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,UAAU;IACd;;IAEA;QACI,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;QACxB,UAAU;IACd;AACJ;;AAEA;IACI,wCAAwC;IACxC,gCAAgC;AACpC;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,mCAAmC;IACnC,2BAA2B;AAC/B;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,mCAAmC;IACnC,2BAA2B;AAC/B;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;AACJ;;AAEA;IACI;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;AAChC;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;AAChC;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;AACJ;;AAEA;IACI,qCAAqC;IACrC,6BAA6B;AACjC;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,8BAA8B;IAClC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;IAClC;AACJ;;AAEA;IACI,kCAAkC;IAClC,0BAA0B;AAC9B;;AAEA;IACI;QACI,gCAAgC;QAChC,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,6BAA6B;IACjC;AACJ;;AAEA;IACI;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;IAC5B;;IAEA;QACI,UAAU;QACV,qCAAqC;QACrC,iCAAiC;QACjC,6BAA6B;IACjC;AACJ;;AAEA;IACI,oCAAoC;IACpC,4BAA4B;AAChC;;AAEA;IACI;QACI,4BAA4B;QAC5B,oBAAoB;QACpB,kCAAkC;QAClC,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;IAC1C;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;QACxB,kCAAkC;QAClC,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;IAC1C;;IAEA;QACI,gCAAgC;QAChC,wBAAwB;QACxB,kCAAkC;QAClC,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;IAC1C;;IAEA;QACI,8CAA8C;QAC9C,sCAAsC;QACtC,kCAAkC;QAClC,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;QACtC,UAAU;IACd;;IAEA;QACI,oCAAoC;QACpC,4BAA4B;QAC5B,UAAU;IACd;AACJ;;AAEA;IACI;QACI,4BAA4B;QAC5B,wBAAwB;QACxB,oBAAoB;QACpB,kCAAkC;QAClC,8BAA8B;QAC9B,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;IAC1C;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;QACxB,kCAAkC;QAClC,8BAA8B;QAC9B,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;IAC1C;;IAEA;QACI,gCAAgC;QAChC,4BAA4B;QAC5B,wBAAwB;QACxB,kCAAkC;QAClC,8BAA8B;QAC9B,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;IAC1C;;IAEA;QACI,8CAA8C;QAC9C,0CAA0C;QAC1C,sCAAsC;QACtC,kCAAkC;QAClC,8BAA8B;QAC9B,0BAA0B;QAC1B,8CAA8C;QAC9C,sCAAsC;QACtC,UAAU;IACd;;IAEA;QACI,oCAAoC;QACpC,gCAAgC;QAChC,4BAA4B;QAC5B,UAAU;IACd;AACJ;;AAEA;IACI,6BAA6B;IAC7B,qBAAqB;AACzB;;AAEA,6EAA6E;;AAE7E;IACI;QACI,UAAU;QACV,oDAAoD;QACpD,4CAA4C;IAChD;;IAEA;QACI,UAAU;QACV,+CAA+C;QAC/C,uCAAuC;IAC3C;AACJ;;AAEA;IACI;QACI,UAAU;QACV,oDAAoD;QACpD,gDAAgD;QAChD,4CAA4C;IAChD;;IAEA;QACI,UAAU;QACV,+CAA+C;QAC/C,2CAA2C;QAC3C,uCAAuC;IAC3C;AACJ;;AAEA;IACI,8BAA8B;IAC9B,sBAAsB;AAC1B;;AAEA,6EAA6E;;AAE7E;IACI;QACI,UAAU;QACV,+CAA+C;QAC/C,uCAAuC;IAC3C;;IAEA;QACI,UAAU;QACV,kDAAkD;QAClD,0CAA0C;IAC9C;AACJ;;AAEA;IACI;QACI,UAAU;QACV,+CAA+C;QAC/C,2CAA2C;QAC3C,uCAAuC;IAC3C;;IAEA;QACI,UAAU;QACV,kDAAkD;QAClD,8CAA8C;QAC9C,0CAA0C;IAC9C;AACJ;;AAEA;IACI,+BAA+B;IAC/B,uBAAuB;AAC3B\",\"sourcesContent\":[\"@charset \\\"UTF-8\\\";\\r\\n\\r\\n/*!\\r\\nAnimate.css - http://daneden.me/animate\\r\\nLicensed under the MIT license\\r\\n\\r\\nCopyright (c) 2013 Daniel Eden\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \\\"Software\\\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\\r\\n\\r\\nThe above copyright notice and this permission notice shall be \\r\\n \\r\\n d in all copies or substantial portions of the Software.\\r\\n\\r\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\\r\\n*/\\r\\n\\r\\n.animated {\\r\\n -webkit-animation-duration: 1s;\\r\\n animation-duration: 1s;\\r\\n -webkit-animation-fill-mode: both;\\r\\n animation-fill-mode: both;\\r\\n z-index: 100;\\r\\n}\\r\\n\\r\\n.animated.infinite {\\r\\n -webkit-animation-iteration-count: infinite;\\r\\n animation-iteration-count: infinite;\\r\\n}\\r\\n\\r\\n.animated.hinge {\\r\\n -webkit-animation-duration: 2s;\\r\\n animation-duration: 2s;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounce {\\r\\n 0%, 20%, 50%, 80%, 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateY(-15px);\\r\\n transform: translateY(-15px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounce {\\r\\n 0%, 20%, 50%, 80%, 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: translateY(-30px);\\r\\n -ms-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateY(-15px);\\r\\n -ms-transform: translateY(-15px);\\r\\n transform: translateY(-15px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounce {\\r\\n -webkit-animation-name: bounce;\\r\\n animation-name: bounce;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flash {\\r\\n 0%, 50%, 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 25%, 75% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flash {\\r\\n 0%, 50%, 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 25%, 75% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.flash {\\r\\n -webkit-animation-name: flash;\\r\\n animation-name: flash;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes pulse {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes pulse {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1.1);\\r\\n -ms-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n.pulse {\\r\\n -webkit-animation-name: pulse;\\r\\n animation-name: pulse;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rubberBand {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: scaleX(1.25) scaleY(0.75);\\r\\n transform: scaleX(1.25) scaleY(0.75);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scaleX(0.75) scaleY(1.25);\\r\\n transform: scaleX(0.75) scaleY(1.25);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: scaleX(1.15) scaleY(0.85);\\r\\n transform: scaleX(1.15) scaleY(0.85);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rubberBand {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: scaleX(1.25) scaleY(0.75);\\r\\n -ms-transform: scaleX(1.25) scaleY(0.75);\\r\\n transform: scaleX(1.25) scaleY(0.75);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scaleX(0.75) scaleY(1.25);\\r\\n -ms-transform: scaleX(0.75) scaleY(1.25);\\r\\n transform: scaleX(0.75) scaleY(1.25);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: scaleX(1.15) scaleY(0.85);\\r\\n -ms-transform: scaleX(1.15) scaleY(0.85);\\r\\n transform: scaleX(1.15) scaleY(0.85);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n.rubberBand {\\r\\n -webkit-animation-name: rubberBand;\\r\\n animation-name: rubberBand;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes shake {\\r\\n 0%, 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 10%, 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 20%, 40%, 60%, 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes shake {\\r\\n 0%, 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 10%, 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n -ms-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 20%, 40%, 60%, 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n -ms-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n}\\r\\n\\r\\n.shake {\\r\\n -webkit-animation-name: shake;\\r\\n animation-name: shake;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes swing {\\r\\n 20% {\\r\\n -webkit-transform: rotate(15deg);\\r\\n transform: rotate(15deg);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(-10deg);\\r\\n transform: rotate(-10deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: rotate(5deg);\\r\\n transform: rotate(5deg);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(-5deg);\\r\\n transform: rotate(-5deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(0deg);\\r\\n transform: rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes swing {\\r\\n 20% {\\r\\n -webkit-transform: rotate(15deg);\\r\\n -ms-transform: rotate(15deg);\\r\\n transform: rotate(15deg);\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(-10deg);\\r\\n -ms-transform: rotate(-10deg);\\r\\n transform: rotate(-10deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: rotate(5deg);\\r\\n -ms-transform: rotate(5deg);\\r\\n transform: rotate(5deg);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(-5deg);\\r\\n -ms-transform: rotate(-5deg);\\r\\n transform: rotate(-5deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(0deg);\\r\\n -ms-transform: rotate(0deg);\\r\\n transform: rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n.swing {\\r\\n -webkit-transform-origin: top center;\\r\\n -ms-transform-origin: top center;\\r\\n transform-origin: top center;\\r\\n -webkit-animation-name: swing;\\r\\n animation-name: swing;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes tada {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 10%, 20% {\\r\\n -webkit-transform: scale(0.9) rotate(-3deg);\\r\\n transform: scale(0.9) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: scale(1.1) rotate(3deg);\\r\\n transform: scale(1.1) rotate(3deg);\\r\\n }\\r\\n\\r\\n 40%, 60%, 80% {\\r\\n -webkit-transform: scale(1.1) rotate(-3deg);\\r\\n transform: scale(1.1) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1) rotate(0);\\r\\n transform: scale(1) rotate(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes tada {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 10%, 20% {\\r\\n -webkit-transform: scale(0.9) rotate(-3deg);\\r\\n -ms-transform: scale(0.9) rotate(-3deg);\\r\\n transform: scale(0.9) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 30%, 50%, 70%, 90% {\\r\\n -webkit-transform: scale(1.1) rotate(3deg);\\r\\n -ms-transform: scale(1.1) rotate(3deg);\\r\\n transform: scale(1.1) rotate(3deg);\\r\\n }\\r\\n\\r\\n 40%, 60%, 80% {\\r\\n -webkit-transform: scale(1.1) rotate(-3deg);\\r\\n -ms-transform: scale(1.1) rotate(-3deg);\\r\\n transform: scale(1.1) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1) rotate(0);\\r\\n -ms-transform: scale(1) rotate(0);\\r\\n transform: scale(1) rotate(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.tada {\\r\\n -webkit-animation-name: tada;\\r\\n animation-name: tada;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes wobble {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n\\r\\n 15% {\\r\\n -webkit-transform: translateX(-25%) rotate(-5deg);\\r\\n transform: translateX(-25%) rotate(-5deg);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: translateX(20%) rotate(3deg);\\r\\n transform: translateX(20%) rotate(3deg);\\r\\n }\\r\\n\\r\\n 45% {\\r\\n -webkit-transform: translateX(-15%) rotate(-3deg);\\r\\n transform: translateX(-15%) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(10%) rotate(2deg);\\r\\n transform: translateX(10%) rotate(2deg);\\r\\n }\\r\\n\\r\\n 75% {\\r\\n -webkit-transform: translateX(-5%) rotate(-1deg);\\r\\n transform: translateX(-5%) rotate(-1deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes wobble {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%);\\r\\n -ms-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n\\r\\n 15% {\\r\\n -webkit-transform: translateX(-25%) rotate(-5deg);\\r\\n -ms-transform: translateX(-25%) rotate(-5deg);\\r\\n transform: translateX(-25%) rotate(-5deg);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n -webkit-transform: translateX(20%) rotate(3deg);\\r\\n -ms-transform: translateX(20%) rotate(3deg);\\r\\n transform: translateX(20%) rotate(3deg);\\r\\n }\\r\\n\\r\\n 45% {\\r\\n -webkit-transform: translateX(-15%) rotate(-3deg);\\r\\n -ms-transform: translateX(-15%) rotate(-3deg);\\r\\n transform: translateX(-15%) rotate(-3deg);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(10%) rotate(2deg);\\r\\n -ms-transform: translateX(10%) rotate(2deg);\\r\\n transform: translateX(10%) rotate(2deg);\\r\\n }\\r\\n\\r\\n 75% {\\r\\n -webkit-transform: translateX(-5%) rotate(-1deg);\\r\\n -ms-transform: translateX(-5%) rotate(-1deg);\\r\\n transform: translateX(-5%) rotate(-1deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%);\\r\\n -ms-transform: translateX(0%);\\r\\n transform: translateX(0%);\\r\\n }\\r\\n}\\r\\n\\r\\n.wobble {\\r\\n -webkit-animation-name: wobble;\\r\\n animation-name: wobble;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.05);\\r\\n transform: scale(1.05);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: scale(.9);\\r\\n transform: scale(.9);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n -ms-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.05);\\r\\n -ms-transform: scale(1.05);\\r\\n transform: scale(1.05);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: scale(.9);\\r\\n -ms-transform: scale(.9);\\r\\n transform: scale(.9);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceIn {\\r\\n -webkit-animation-name: bounceIn;\\r\\n animation-name: bounceIn;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(30px);\\r\\n transform: translateY(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(-10px);\\r\\n transform: translateY(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(30px);\\r\\n -ms-transform: translateY(30px);\\r\\n transform: translateY(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(-10px);\\r\\n -ms-transform: translateY(-10px);\\r\\n transform: translateY(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInDown {\\r\\n -webkit-animation-name: bounceInDown;\\r\\n animation-name: bounceInDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(30px);\\r\\n transform: translateX(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(30px);\\r\\n -ms-transform: translateX(30px);\\r\\n transform: translateX(30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(-10px);\\r\\n -ms-transform: translateX(-10px);\\r\\n transform: translateX(-10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInLeft {\\r\\n -webkit-animation-name: bounceInLeft;\\r\\n animation-name: bounceInLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-30px);\\r\\n transform: translateX(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-30px);\\r\\n -ms-transform: translateX(-30px);\\r\\n transform: translateX(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(10px);\\r\\n -ms-transform: translateX(10px);\\r\\n transform: translateX(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInRight {\\r\\n -webkit-animation-name: bounceInRight;\\r\\n animation-name: bounceInRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(10px);\\r\\n transform: translateY(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 60% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-30px);\\r\\n -ms-transform: translateY(-30px);\\r\\n transform: translateY(-30px);\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateY(10px);\\r\\n -ms-transform: translateY(10px);\\r\\n transform: translateY(10px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceInUp {\\r\\n -webkit-animation-name: bounceInUp;\\r\\n animation-name: bounceInUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOut {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 25% {\\r\\n -webkit-transform: scale(.95);\\r\\n transform: scale(.95);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOut {\\r\\n 0% {\\r\\n -webkit-transform: scale(1);\\r\\n -ms-transform: scale(1);\\r\\n transform: scale(1);\\r\\n }\\r\\n\\r\\n 25% {\\r\\n -webkit-transform: scale(.95);\\r\\n -ms-transform: scale(.95);\\r\\n transform: scale(.95);\\r\\n }\\r\\n\\r\\n 50% {\\r\\n opacity: 1;\\r\\n -webkit-transform: scale(1.1);\\r\\n -ms-transform: scale(1.1);\\r\\n transform: scale(1.1);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: scale(.3);\\r\\n -ms-transform: scale(.3);\\r\\n transform: scale(.3);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOut {\\r\\n -webkit-animation-name: bounceOut;\\r\\n animation-name: bounceOut;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(-20px);\\r\\n -ms-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutDown {\\r\\n -webkit-animation-name: bounceOutDown;\\r\\n animation-name: bounceOutDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(20px);\\r\\n -ms-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutLeft {\\r\\n -webkit-animation-name: bounceOutLeft;\\r\\n animation-name: bounceOutLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(-20px);\\r\\n -ms-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutRight {\\r\\n -webkit-animation-name: bounceOutRight;\\r\\n animation-name: bounceOutRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes bounceOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes bounceOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 20% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(20px);\\r\\n -ms-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.bounceOutUp {\\r\\n -webkit-animation-name: bounceOutUp;\\r\\n animation-name: bounceOutUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeIn {\\r\\n -webkit-animation-name: fadeIn;\\r\\n animation-name: fadeIn;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n -ms-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInDown {\\r\\n -webkit-animation-name: fadeInDown;\\r\\n animation-name: fadeInDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInDownBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInDownBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInDownBig {\\r\\n -webkit-animation-name: fadeInDownBig;\\r\\n animation-name: fadeInDownBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n -ms-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInLeft {\\r\\n -webkit-animation-name: fadeInLeft;\\r\\n animation-name: fadeInLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInLeftBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInLeftBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInLeftBig {\\r\\n -webkit-animation-name: fadeInLeftBig;\\r\\n animation-name: fadeInLeftBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(40px);\\r\\n -ms-transform: translateX(40px);\\r\\n transform: translateX(40px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInRight {\\r\\n -webkit-animation-name: fadeInRight;\\r\\n animation-name: fadeInRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInRightBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInRightBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInRightBig {\\r\\n -webkit-animation-name: fadeInRightBig;\\r\\n animation-name: fadeInRightBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInUp {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n -ms-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInUp {\\r\\n -webkit-animation-name: fadeInUp;\\r\\n animation-name: fadeInUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeInUpBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeInUpBig {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeInUpBig {\\r\\n -webkit-animation-name: fadeInUpBig;\\r\\n animation-name: fadeInUpBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOut {\\r\\n -webkit-animation-name: fadeOut;\\r\\n animation-name: fadeOut;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutDown {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutDown {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(20px);\\r\\n -ms-transform: translateY(20px);\\r\\n transform: translateY(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutDown {\\r\\n -webkit-animation-name: fadeOutDown;\\r\\n animation-name: fadeOutDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutDownBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutDownBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutDownBig {\\r\\n -webkit-animation-name: fadeOutDownBig;\\r\\n animation-name: fadeOutDownBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutLeft {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutLeft {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-20px);\\r\\n -ms-transform: translateX(-20px);\\r\\n transform: translateX(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutLeft {\\r\\n -webkit-animation-name: fadeOutLeft;\\r\\n animation-name: fadeOutLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutLeftBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutLeftBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutLeftBig {\\r\\n -webkit-animation-name: fadeOutLeftBig;\\r\\n animation-name: fadeOutLeftBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutRight {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutRight {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(20px);\\r\\n -ms-transform: translateX(20px);\\r\\n transform: translateX(20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutRight {\\r\\n -webkit-animation-name: fadeOutRight;\\r\\n animation-name: fadeOutRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutRightBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutRightBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutRightBig {\\r\\n -webkit-animation-name: fadeOutRightBig;\\r\\n animation-name: fadeOutRightBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutUp {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutUp {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-20px);\\r\\n -ms-transform: translateY(-20px);\\r\\n transform: translateY(-20px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutUp {\\r\\n -webkit-animation-name: fadeOutUp;\\r\\n animation-name: fadeOutUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes fadeOutUpBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes fadeOutUpBig {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.fadeOutUpBig {\\r\\n -webkit-animation-name: fadeOutUpBig;\\r\\n animation-name: fadeOutUpBig;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flip {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flip {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(0) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n }\\r\\n}\\r\\n\\r\\n.animated.flip {\\r\\n -webkit-backface-visibility: visible;\\r\\n -ms-backface-visibility: visible;\\r\\n backface-visibility: visible;\\r\\n -webkit-animation-name: flip;\\r\\n animation-name: flip;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipInX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateX(-10deg);\\r\\n transform: perspective(400px) rotateX(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateX(10deg);\\r\\n transform: perspective(400px) rotateX(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipInX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n -ms-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateX(-10deg);\\r\\n -ms-transform: perspective(400px) rotateX(-10deg);\\r\\n transform: perspective(400px) rotateX(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateX(10deg);\\r\\n -ms-transform: perspective(400px) rotateX(10deg);\\r\\n transform: perspective(400px) rotateX(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n -ms-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipInX {\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n -webkit-animation-name: flipInX;\\r\\n animation-name: flipInX;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipInY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateY(-10deg);\\r\\n transform: perspective(400px) rotateY(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateY(10deg);\\r\\n transform: perspective(400px) rotateY(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipInY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n -ms-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: perspective(400px) rotateY(-10deg);\\r\\n -ms-transform: perspective(400px) rotateY(-10deg);\\r\\n transform: perspective(400px) rotateY(-10deg);\\r\\n }\\r\\n\\r\\n 70% {\\r\\n -webkit-transform: perspective(400px) rotateY(10deg);\\r\\n -ms-transform: perspective(400px) rotateY(10deg);\\r\\n transform: perspective(400px) rotateY(10deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n -ms-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipInY {\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n -webkit-animation-name: flipInY;\\r\\n animation-name: flipInY;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipOutX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipOutX {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateX(0deg);\\r\\n -ms-transform: perspective(400px) rotateX(0deg);\\r\\n transform: perspective(400px) rotateX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateX(90deg);\\r\\n -ms-transform: perspective(400px) rotateX(90deg);\\r\\n transform: perspective(400px) rotateX(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipOutX {\\r\\n -webkit-animation-name: flipOutX;\\r\\n animation-name: flipOutX;\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes flipOutY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes flipOutY {\\r\\n 0% {\\r\\n -webkit-transform: perspective(400px) rotateY(0deg);\\r\\n -ms-transform: perspective(400px) rotateY(0deg);\\r\\n transform: perspective(400px) rotateY(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(400px) rotateY(90deg);\\r\\n -ms-transform: perspective(400px) rotateY(90deg);\\r\\n transform: perspective(400px) rotateY(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.flipOutY {\\r\\n -webkit-backface-visibility: visible !important;\\r\\n -ms-backface-visibility: visible !important;\\r\\n backface-visibility: visible !important;\\r\\n -webkit-animation-name: flipOutY;\\r\\n animation-name: flipOutY;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes lightSpeedIn {\\r\\n 0% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(-20%) skewX(30deg);\\r\\n transform: translateX(-20%) skewX(30deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(0%) skewX(-15deg);\\r\\n transform: translateX(0%) skewX(-15deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes lightSpeedIn {\\r\\n 0% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n -ms-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 60% {\\r\\n -webkit-transform: translateX(-20%) skewX(30deg);\\r\\n -ms-transform: translateX(-20%) skewX(30deg);\\r\\n transform: translateX(-20%) skewX(30deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: translateX(0%) skewX(-15deg);\\r\\n -ms-transform: translateX(0%) skewX(-15deg);\\r\\n transform: translateX(0%) skewX(-15deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n -ms-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.lightSpeedIn {\\r\\n -webkit-animation-name: lightSpeedIn;\\r\\n animation-name: lightSpeedIn;\\r\\n -webkit-animation-timing-function: ease-out;\\r\\n animation-timing-function: ease-out;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes lightSpeedOut {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes lightSpeedOut {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0%) skewX(0deg);\\r\\n -ms-transform: translateX(0%) skewX(0deg);\\r\\n transform: translateX(0%) skewX(0deg);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(100%) skewX(-30deg);\\r\\n -ms-transform: translateX(100%) skewX(-30deg);\\r\\n transform: translateX(100%) skewX(-30deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.lightSpeedOut {\\r\\n -webkit-animation-name: lightSpeedOut;\\r\\n animation-name: lightSpeedOut;\\r\\n -webkit-animation-timing-function: ease-in;\\r\\n animation-timing-function: ease-in;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateIn {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(-200deg);\\r\\n transform: rotate(-200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateIn {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(-200deg);\\r\\n -ms-transform: rotate(-200deg);\\r\\n transform: rotate(-200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateIn {\\r\\n -webkit-animation-name: rotateIn;\\r\\n animation-name: rotateIn;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInDownLeft {\\r\\n -webkit-animation-name: rotateInDownLeft;\\r\\n animation-name: rotateInDownLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInDownRight {\\r\\n -webkit-animation-name: rotateInDownRight;\\r\\n animation-name: rotateInDownRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInUpLeft {\\r\\n -webkit-animation-name: rotateInUpLeft;\\r\\n animation-name: rotateInUpLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateInUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateInUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateInUpRight {\\r\\n -webkit-animation-name: rotateInUpRight;\\r\\n animation-name: rotateInUpRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOut {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(200deg);\\r\\n transform: rotate(200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOut {\\r\\n 0% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: center center;\\r\\n -ms-transform-origin: center center;\\r\\n transform-origin: center center;\\r\\n -webkit-transform: rotate(200deg);\\r\\n -ms-transform: rotate(200deg);\\r\\n transform: rotate(200deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOut {\\r\\n -webkit-animation-name: rotateOut;\\r\\n animation-name: rotateOut;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutDownLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutDownLeft {\\r\\n -webkit-animation-name: rotateOutDownLeft;\\r\\n animation-name: rotateOutDownLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutDownRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutDownRight {\\r\\n -webkit-animation-name: rotateOutDownRight;\\r\\n animation-name: rotateOutDownRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutUpLeft {\\r\\n 0% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: left bottom;\\r\\n -ms-transform-origin: left bottom;\\r\\n transform-origin: left bottom;\\r\\n -webkit-transform: rotate(-90deg);\\r\\n -ms-transform: rotate(-90deg);\\r\\n transform: rotate(-90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutUpLeft {\\r\\n -webkit-animation-name: rotateOutUpLeft;\\r\\n animation-name: rotateOutUpLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes rotateOutUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rotateOutUpRight {\\r\\n 0% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform-origin: right bottom;\\r\\n -ms-transform-origin: right bottom;\\r\\n transform-origin: right bottom;\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.rotateOutUpRight {\\r\\n -webkit-animation-name: rotateOutUpRight;\\r\\n animation-name: rotateOutUpRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideInDown {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideInDown {\\r\\n -webkit-animation-name: slideInDown;\\r\\n animation-name: slideInDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideInLeft {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideInLeft {\\r\\n -webkit-animation-name: slideInLeft;\\r\\n animation-name: slideInLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideInRight {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideInRight {\\r\\n -webkit-animation-name: slideInRight;\\r\\n animation-name: slideInRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutLeft {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-2000px);\\r\\n -ms-transform: translateX(-2000px);\\r\\n transform: translateX(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutLeft {\\r\\n -webkit-animation-name: slideOutLeft;\\r\\n animation-name: slideOutLeft;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutRight {\\r\\n 0% {\\r\\n -webkit-transform: translateX(0);\\r\\n -ms-transform: translateX(0);\\r\\n transform: translateX(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(2000px);\\r\\n -ms-transform: translateX(2000px);\\r\\n transform: translateX(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutRight {\\r\\n -webkit-animation-name: slideOutRight;\\r\\n animation-name: slideOutRight;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutUp {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(-2000px);\\r\\n -ms-transform: translateY(-2000px);\\r\\n transform: translateY(-2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutUp {\\r\\n -webkit-animation-name: slideOutUp;\\r\\n animation-name: slideOutUp;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes slideOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes slideOutDown {\\r\\n 0% {\\r\\n -webkit-transform: translateY(0);\\r\\n -ms-transform: translateY(0);\\r\\n transform: translateY(0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateY(2000px);\\r\\n -ms-transform: translateY(2000px);\\r\\n transform: translateY(2000px);\\r\\n }\\r\\n}\\r\\n\\r\\n.slideOutDown {\\r\\n -webkit-animation-name: slideOutDown;\\r\\n animation-name: slideOutDown;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes hinge {\\r\\n 0% {\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 20%, 60% {\\r\\n -webkit-transform: rotate(80deg);\\r\\n transform: rotate(80deg);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(60deg);\\r\\n transform: rotate(60deg);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(60deg) translateY(0);\\r\\n transform: rotate(60deg) translateY(0);\\r\\n -webkit-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(700px);\\r\\n transform: translateY(700px);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes hinge {\\r\\n 0% {\\r\\n -webkit-transform: rotate(0);\\r\\n -ms-transform: rotate(0);\\r\\n transform: rotate(0);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 20%, 60% {\\r\\n -webkit-transform: rotate(80deg);\\r\\n -ms-transform: rotate(80deg);\\r\\n transform: rotate(80deg);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: rotate(60deg);\\r\\n -ms-transform: rotate(60deg);\\r\\n transform: rotate(60deg);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n }\\r\\n\\r\\n 80% {\\r\\n -webkit-transform: rotate(60deg) translateY(0);\\r\\n -ms-transform: rotate(60deg) translateY(0);\\r\\n transform: rotate(60deg) translateY(0);\\r\\n -webkit-transform-origin: top left;\\r\\n -ms-transform-origin: top left;\\r\\n transform-origin: top left;\\r\\n -webkit-animation-timing-function: ease-in-out;\\r\\n animation-timing-function: ease-in-out;\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: translateY(700px);\\r\\n -ms-transform: translateY(700px);\\r\\n transform: translateY(700px);\\r\\n opacity: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.hinge {\\r\\n -webkit-animation-name: hinge;\\r\\n animation-name: hinge;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes rollIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-100%) rotate(-120deg);\\r\\n transform: translateX(-100%) rotate(-120deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rollIn {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(-100%) rotate(-120deg);\\r\\n -ms-transform: translateX(-100%) rotate(-120deg);\\r\\n transform: translateX(-100%) rotate(-120deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n -ms-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n}\\r\\n\\r\\n.rollIn {\\r\\n -webkit-animation-name: rollIn;\\r\\n animation-name: rollIn;\\r\\n}\\r\\n\\r\\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\\r\\n\\r\\n@-webkit-keyframes rollOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(100%) rotate(120deg);\\r\\n transform: translateX(100%) rotate(120deg);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes rollOut {\\r\\n 0% {\\r\\n opacity: 1;\\r\\n -webkit-transform: translateX(0px) rotate(0deg);\\r\\n -ms-transform: translateX(0px) rotate(0deg);\\r\\n transform: translateX(0px) rotate(0deg);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 0;\\r\\n -webkit-transform: translateX(100%) rotate(120deg);\\r\\n -ms-transform: translateX(100%) rotate(120deg);\\r\\n transform: translateX(100%) rotate(120deg);\\r\\n }\\r\\n}\\r\\n\\r\\n.rollOut {\\r\\n -webkit-animation-name: rollOut;\\r\\n animation-name: rollOut;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".navigation-sub-heading {\\r\\n font-size: 10px;\\r\\n color: white;\\r\\n font-weight: 700;\\r\\n text-transform: uppercase;\\r\\n border-bottom: 1px solid white;\\r\\n display: inline-flex;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\nselect::-ms-expand {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.nav > li > span > a {\\r\\n color: white;\\r\\n background-color: #242633;\\r\\n font-weight: 600;\\r\\n padding: 14px 20px 14px 25px;\\r\\n}\\r\\n\\r\\n.nav > li > span > a {\\r\\n position: relative;\\r\\n display: block;\\r\\n padding-top: 5px;\\r\\n padding-right: 5px;\\r\\n padding-bottom: 5px;\\r\\n padding-left: 15px;\\r\\n}\\r\\n\\r\\n.nav > li.active > span > a {\\r\\n color: white;\\r\\n background-color: white;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.navbar-default .nav > li > span > a:hover, .navbar-default .nav > li > span > a:focus, .navbar-default .nav > li > span > a.active {\\r\\n background-color: #341F7F;\\r\\n color: #00FF5A;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.nav-second-level li span a {\\r\\n padding-left: 52px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\n.mini-navbar .nav-second-level .navigation-sub-heading {\\r\\n margin-left: 0px;\\r\\n}\\r\\n\\r\\n.nav-second-level .navigation-sub-heading {\\r\\n margin-left: 52px;\\r\\n}\\r\\n\\r\\n.nav-third-level li span a {\\r\\n padding-left: 62px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\n.mini-navbar .nav-third-level .navigation-sub-heading {\\r\\n margin-left: 0px;\\r\\n}\\r\\n\\r\\n.nav-third-level .navigation-sub-heading {\\r\\n margin-left: 62px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\n.hasSubHeading > span > a {\\r\\n margin-left: 6px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/customSubHeadingNavigation.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,yBAAyB;IACzB,8BAA8B;IAC9B,oBAAoB;IACpB,yBAAyB;AAC7B;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,YAAY;IACZ,yBAAyB;IACzB,gBAAgB;IAChB,4BAA4B;AAChC;;AAEA;IACI,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;AACtB;;AAEA;IACI,YAAY;IACZ,uBAAuB;IACvB,yBAAyB;AAC7B;;AAEA;IACI,yBAAyB;IACzB,cAAc;IACd,yBAAyB;AAC7B;;AAEA;IACI,kBAAkB;IAClB,yBAAyB;AAC7B;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,kBAAkB;IAClB,yBAAyB;AAC7B;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,iBAAiB;IACjB,yBAAyB;AAC7B;;AAEA;IACI,gBAAgB;IAChB,yBAAyB;AAC7B\",\"sourcesContent\":[\".navigation-sub-heading {\\r\\n font-size: 10px;\\r\\n color: white;\\r\\n font-weight: 700;\\r\\n text-transform: uppercase;\\r\\n border-bottom: 1px solid white;\\r\\n display: inline-flex;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\nselect::-ms-expand {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.nav > li > span > a {\\r\\n color: white;\\r\\n background-color: #242633;\\r\\n font-weight: 600;\\r\\n padding: 14px 20px 14px 25px;\\r\\n}\\r\\n\\r\\n.nav > li > span > a {\\r\\n position: relative;\\r\\n display: block;\\r\\n padding-top: 5px;\\r\\n padding-right: 5px;\\r\\n padding-bottom: 5px;\\r\\n padding-left: 15px;\\r\\n}\\r\\n\\r\\n.nav > li.active > span > a {\\r\\n color: white;\\r\\n background-color: white;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.navbar-default .nav > li > span > a:hover, .navbar-default .nav > li > span > a:focus, .navbar-default .nav > li > span > a.active {\\r\\n background-color: #341F7F;\\r\\n color: #00FF5A;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.nav-second-level li span a {\\r\\n padding-left: 52px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\n.mini-navbar .nav-second-level .navigation-sub-heading {\\r\\n margin-left: 0px;\\r\\n}\\r\\n\\r\\n.nav-second-level .navigation-sub-heading {\\r\\n margin-left: 52px;\\r\\n}\\r\\n\\r\\n.nav-third-level li span a {\\r\\n padding-left: 62px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\n.mini-navbar .nav-third-level .navigation-sub-heading {\\r\\n margin-left: 0px;\\r\\n}\\r\\n\\r\\n.nav-third-level .navigation-sub-heading {\\r\\n margin-left: 62px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\n.hasSubHeading > span > a {\\r\\n margin-left: 6px;\\r\\n background-color: #242633;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\r\\n.tab-container ul.nav-tabs {\\r\\n margin: 0;\\r\\n list-style-type: none;\\r\\n line-height: 40px;\\r\\n max-height: 40px;\\r\\n overflow: hidden;\\r\\n display: inline-block;\\r\\n display: -webkit-flex;\\r\\n display: flex;\\r\\n padding-right: 1px;\\r\\n border-bottom: 0;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li {\\r\\n margin: 0 -2px 0 0;\\r\\n padding: 0 28px 3px 5px;\\r\\n /*height: 170px;*/\\r\\n background: white;\\r\\n position: relative;\\r\\n border-radius: 4px;\\r\\n -moz-box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5);\\r\\n -webkit-box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5);\\r\\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5);\\r\\n width: auto;\\r\\n max-width: 400px;\\r\\n min-width: 20px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li:hover {\\r\\n background-color: #F5F5F5;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li:first-child {\\r\\n margin-left: 0;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li:last-of-type {\\r\\n margin-right: 0;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li > a {\\r\\n display: block;\\r\\n max-width: 100%;\\r\\n font-weight: 400;\\r\\n text-decoration: none;\\r\\n color: #121321;\\r\\n padding: 3px 7px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a span {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n display: block;\\r\\n margin-top: 4px;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li > a:focus, .tab-container ul.nav-tabs > li > a:hover {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n color: #121321;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li.active {\\r\\n z-index: 2;\\r\\n background-color:#e0e0e0;\\r\\n border-top: 4px solid #291972;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li.active > a {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n border-bottom-color: transparent;\\r\\n color: #121321;\\r\\n font-weight: 600;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li.active > a:focus, .tab-container ul.nav-tabs > li.active > a:hover {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n border-bottom-color: transparent;\\r\\n}\\r\\n.tab-container ul.nav-tabs .btn.btn-default {\\r\\n background: #c3d5e6;\\r\\n}\\r\\n.tab-container ul.nav-tabs .btn.btn-default:hover {\\r\\n background: white;\\r\\n}\\r\\n.tab-container ul.nav-tabs .btn.btn-default:active {\\r\\n background: #9cb5cc;\\r\\n}\\r\\n.tab-container .tab-pane {\\r\\n padding: 0px 0px;\\r\\n text-align: left;\\r\\n}\\r\\n.tabsDarkHeader {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-thumb-tack {\\r\\n color: #121321;\\r\\n display: inline-block;\\r\\n padding: 3px 5px;\\r\\n font-size: 10px;\\r\\n position: absolute;\\r\\n z-index: 10;\\r\\n top: 7px;\\r\\n right: -15px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-thumb-tack:hover {\\r\\n color: #291972;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-times {\\r\\n color: #121321;\\r\\n display: inline-block;\\r\\n padding: 3px;\\r\\n font-size: 10px;\\r\\n position: absolute;\\r\\n z-index: 10;\\r\\n top: 7px;\\r\\n right: -30px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-times:hover {\\r\\n color: #BA0003;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/dynamicTabsDark.css\"],\"names\":[],\"mappings\":\";AACA;EACE,SAAS;EACT,qBAAqB;EACrB,iBAAiB;EACjB,gBAAgB;EAChB,gBAAgB;EAChB,qBAAqB;EACrB,qBAAqB;EACrB,aAAa;EACb,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,kBAAkB;EAClB,uBAAuB;EACvB,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB;EAClB,kBAAkB;EAClB,6CAA6C;EAC7C,gDAAgD;EAChD,wCAAwC;EACxC,WAAW;EACX,gBAAgB;EAChB,eAAe;AACjB;;AAEA;IACI,yBAAyB;AAC7B;;AAEA;EACE,cAAc;AAChB;AACA;EACE,eAAe;AACjB;AACA;EACE,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;EACnB,cAAc;EACd,eAAe;AACjB;AACA;EACE,6BAA6B;EAC7B,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,UAAU;EACV,wBAAwB;EACxB,6BAA6B;AAC/B;AACA;EACE,6BAA6B;EAC7B,yBAAyB;EACzB,gCAAgC;EAChC,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,6BAA6B;EAC7B,yBAAyB;EACzB,gCAAgC;AAClC;AACA;EACE,mBAAmB;AACrB;AACA;EACE,iBAAiB;AACnB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;AACA;IACI,uBAAuB;AAC3B;;AAEA;EACE,cAAc;EACd,qBAAqB;EACrB,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,WAAW;EACX,QAAQ;EACR,YAAY;AACd;;AAEA;IACI,cAAc;IACd,eAAe;AACnB;;AAEA;EACE,cAAc;EACd,qBAAqB;EACrB,YAAY;EACZ,eAAe;EACf,kBAAkB;EAClB,WAAW;EACX,QAAQ;EACR,YAAY;AACd;;AAEA;IACI,cAAc;IACd,eAAe;AACnB\",\"sourcesContent\":[\"\\r\\n.tab-container ul.nav-tabs {\\r\\n margin: 0;\\r\\n list-style-type: none;\\r\\n line-height: 40px;\\r\\n max-height: 40px;\\r\\n overflow: hidden;\\r\\n display: inline-block;\\r\\n display: -webkit-flex;\\r\\n display: flex;\\r\\n padding-right: 1px;\\r\\n border-bottom: 0;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li {\\r\\n margin: 0 -2px 0 0;\\r\\n padding: 0 28px 3px 5px;\\r\\n /*height: 170px;*/\\r\\n background: white;\\r\\n position: relative;\\r\\n border-radius: 4px;\\r\\n -moz-box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5);\\r\\n -webkit-box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5);\\r\\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5);\\r\\n width: auto;\\r\\n max-width: 400px;\\r\\n min-width: 20px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li:hover {\\r\\n background-color: #F5F5F5;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li:first-child {\\r\\n margin-left: 0;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li:last-of-type {\\r\\n margin-right: 0;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li > a {\\r\\n display: block;\\r\\n max-width: 100%;\\r\\n font-weight: 400;\\r\\n text-decoration: none;\\r\\n color: #121321;\\r\\n padding: 3px 7px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a span {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n display: block;\\r\\n margin-top: 4px;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li > a:focus, .tab-container ul.nav-tabs > li > a:hover {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n color: #121321;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li.active {\\r\\n z-index: 2;\\r\\n background-color:#e0e0e0;\\r\\n border-top: 4px solid #291972;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li.active > a {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n border-bottom-color: transparent;\\r\\n color: #121321;\\r\\n font-weight: 600;\\r\\n}\\r\\n.tab-container ul.nav-tabs > li.active > a:focus, .tab-container ul.nav-tabs > li.active > a:hover {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n border-bottom-color: transparent;\\r\\n}\\r\\n.tab-container ul.nav-tabs .btn.btn-default {\\r\\n background: #c3d5e6;\\r\\n}\\r\\n.tab-container ul.nav-tabs .btn.btn-default:hover {\\r\\n background: white;\\r\\n}\\r\\n.tab-container ul.nav-tabs .btn.btn-default:active {\\r\\n background: #9cb5cc;\\r\\n}\\r\\n.tab-container .tab-pane {\\r\\n padding: 0px 0px;\\r\\n text-align: left;\\r\\n}\\r\\n.tabsDarkHeader {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-thumb-tack {\\r\\n color: #121321;\\r\\n display: inline-block;\\r\\n padding: 3px 5px;\\r\\n font-size: 10px;\\r\\n position: absolute;\\r\\n z-index: 10;\\r\\n top: 7px;\\r\\n right: -15px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-thumb-tack:hover {\\r\\n color: #291972;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-times {\\r\\n color: #121321;\\r\\n display: inline-block;\\r\\n padding: 3px;\\r\\n font-size: 10px;\\r\\n position: absolute;\\r\\n z-index: 10;\\r\\n top: 7px;\\r\\n right: -30px;\\r\\n}\\r\\n\\r\\n.tab-container ul.nav-tabs > li > a .fa-times:hover {\\r\\n color: #BA0003;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nimport ___CSS_LOADER_URL_IMPORT_0___ from \"../fonts/Collection 1-b8f80e9f63.eot\";\nimport ___CSS_LOADER_URL_IMPORT_1___ from \"../fonts/Collection 1-b8f80e9f63.woff2\";\nimport ___CSS_LOADER_URL_IMPORT_2___ from \"../fonts/Collection 1-b8f80e9f63.woff\";\nimport ___CSS_LOADER_URL_IMPORT_3___ from \"../fonts/Collection 1-b8f80e9f63.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_4___ from \"../fonts/Collection 1-b8f80e9f63.svg\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___, { hash: \"?#iefix\" });\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\nvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\nvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___, { hash: \"#font\" });\nvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___, { hash: \"#Collection 1-b8f80e9f63\" });\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/*!\\r\\n * Icon Font Collection 1-b8f80e9f63\\r\\n * Made with love by Icons8 [ https://icons8.com/ ] using webfont [ https://github.com/itgalaxy/webfont ]\\r\\n *\\r\\n * Contacts:\\r\\n * [ https://icons8.com/contact ]\\r\\n *\\r\\n * Follow Icon8 on\\r\\n * Twitter [ https://twitter.com/icons_8 ]\\r\\n * Facebook [ https://www.facebook.com/Icons8 ]\\r\\n * Google+ [ https://plus.google.com/+Icons8 ]\\r\\n * GitHub [ https://github.com/icons8 ]\\r\\n */\\r\\n@font-face{font-family:\\\"Collection 1-b8f80e9f63\\\";src:url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \");src:url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \")format(\\\"embedded-opentype\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \")format(\\\"woff2\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \")format(\\\"woff\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \")format(\\\"truetype\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \")format(\\\"svg\\\");font-weight:normal;font-style:normal;}@media screen and(-webkit-min-device-pixel-ratio:0){@font-face{font-family:\\\"Collection 1-b8f80e9f63\\\";src:url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \")format(\\\"svg\\\");}}[data-icons8]:before{content:attr(data-icons8);}.icons8-delete-filled:before,.icons8-refresh-shield:before,.icons8-restart:before,.icons8-downloading-updates:before,.icons8-template:before,.icons8-home:before,.icons8-play:before,.icons8-christmas-star:before,.icons8-xml-filled:before,.icons8-rules:before,.icons8-parse-from-clipboard-filled:before,.icons8-help:before,.icons8-info:before,.icons8-sort:before,.icons8-multiply-filled:before,.icons8-filled-circle:before,.icons8-menu-filled:before,.icons8-clock:before,.icons8-calendar:before,.icons8-trash:before,.icons8-search:before,.icons8-pin:before,.icons8-attention:before,.icons8-checkmark-filled:before,.icons8-refresh:before,.icons8-circle:before,.icons8-sort-up-filled:before,.icons8-sort-down-filled:before,.icons8-sort-left-filled:before,.icons8-sort-right-filled:before,.icons8-plus:before,.icons8-minus:before,.icons8-forward:before,.icons8-double-right:before,.icons8-double-left:before,.icons8-double-up:before,.icons8-double-down:before,.icons8-checked:before,.icons8-filled-filter:before,.icons8-lock:before,.icons8-undo:before,.icons8-redo:before,.icons8-open:before,.icons8-microsoft-excel:before,.icons8-open-book:before,.icons8-save:before,.icons8-menu:before,.icons8-columns:before,.icons8-toggle-on:before,.icons8-toggle-off:before,.icons8-settings:before,.icons8-gears:before,.icons8-notification:before,.icons8-exit:before,.icons8-undo-2:before,.icons8-redo-2:before,.icons8-copy:before,.icons8-user-menu-male:before,.icons8-business-building:before,.icons8-leave:before,.icons8-combo-chart:before,.icons8-doughnut-chart:before,.icons8-geography:before,.icons8-play-2:before,.icons8-star:before,.icons8-conflict:before,.icons8-briefcase:before,.icons8-user-avatar:before,.icons8-globe:before,.icons8-warning-shield:before,.icons8-new-window:before,.icons8-submit-progress:before,.icons8-pencil-tip:before,.icons8-download:before,.icons8-checked-2:before,.icons8-approval:before,.icons8-plus-2:before,.icons8-upload:before,.icons8-expand-arrow:before,.icons8-collapse-arrow:before,.icons8-back:before,.icons8-playlist:before,.icons8,[data-icons8]:before{display:inline-block;font-family:\\\"Collection 1-b8f80e9f63\\\";font-style:normal;font-weight:normal;font-variant:normal;line-height:1;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;}.icons8-delete-filled:before{content:\\\"\\\\f100\\\";}.icons8-refresh-shield:before{content:\\\"\\\\f101\\\";}.icons8-restart:before{content:\\\"\\\\f102\\\";}.icons8-downloading-updates:before{content:\\\"\\\\f103\\\";}.icons8-template:before{content:\\\"\\\\f104\\\";}.icons8-home:before{content:\\\"\\\\f105\\\";}.icons8-play:before{content:\\\"\\\\f106\\\";}.icons8-christmas-star:before{content:\\\"\\\\f107\\\";}.icons8-xml-filled:before{content:\\\"\\\\f108\\\";}.icons8-rules:before{content:\\\"\\\\f109\\\";}.icons8-parse-from-clipboard-filled:before{content:\\\"\\\\f10a\\\";}.icons8-help:before{content:\\\"\\\\f10b\\\";}.icons8-info:before{content:\\\"\\\\f10c\\\";}.icons8-sort:before{content:\\\"\\\\f10d\\\";}.icons8-multiply-filled:before{content:\\\"\\\\f10e\\\";}.icons8-filled-circle:before{content:\\\"\\\\f10f\\\";}.icons8-menu-filled:before{content:\\\"\\\\f110\\\";}.icons8-clock:before{content:\\\"\\\\f111\\\";}.icons8-calendar:before{content:\\\"\\\\f112\\\";}.icons8-trash:before{content:\\\"\\\\f113\\\";}.icons8-search:before{content:\\\"\\\\f114\\\";}.icons8-pin:before{content:\\\"\\\\f115\\\";}.icons8-attention:before{content:\\\"\\\\f116\\\";}.icons8-checkmark-filled:before{content:\\\"\\\\f117\\\";}.icons8-refresh:before{content:\\\"\\\\f118\\\";}.icons8-circle:before{content:\\\"\\\\f119\\\";}.icons8-sort-up-filled:before{content:\\\"\\\\f11a\\\";}.icons8-sort-down-filled:before{content:\\\"\\\\f11b\\\";}.icons8-sort-left-filled:before{content:\\\"\\\\f11c\\\";}.icons8-sort-right-filled:before{content:\\\"\\\\f11d\\\";}.icons8-plus:before{content:\\\"\\\\f11e\\\";}.icons8-minus:before{content:\\\"\\\\f11f\\\";}.icons8-forward:before{content:\\\"\\\\f120\\\";}.icons8-double-right:before{content:\\\"\\\\f121\\\";}.icons8-double-left:before{content:\\\"\\\\f122\\\";}.icons8-double-up:before{content:\\\"\\\\f123\\\";}.icons8-double-down:before{content:\\\"\\\\f124\\\";}.icons8-checked:before{content:\\\"\\\\f125\\\";}.icons8-filled-filter:before{content:\\\"\\\\f126\\\";}.icons8-lock:before{content:\\\"\\\\f127\\\";}.icons8-undo:before{content:\\\"\\\\f128\\\";}.icons8-redo:before{content:\\\"\\\\f129\\\";}.icons8-open:before{content:\\\"\\\\f12a\\\";}.icons8-microsoft-excel:before{content:\\\"\\\\f12b\\\";}.icons8-open-book:before{content:\\\"\\\\f12c\\\";}.icons8-save:before{content:\\\"\\\\f12d\\\";}.icons8-menu:before{content:\\\"\\\\f12e\\\";}.icons8-columns:before{content:\\\"\\\\f12f\\\";}.icons8-toggle-on:before{content:\\\"\\\\f130\\\";}.icons8-toggle-off:before{content:\\\"\\\\f131\\\";}.icons8-settings:before{content:\\\"\\\\f132\\\";}.icons8-gears:before{content:\\\"\\\\f133\\\";}.icons8-notification:before{content:\\\"\\\\f134\\\";}.icons8-exit:before{content:\\\"\\\\f135\\\";}.icons8-undo-2:before{content:\\\"\\\\f136\\\";}.icons8-redo-2:before{content:\\\"\\\\f137\\\";}.icons8-copy:before{content:\\\"\\\\f138\\\";}.icons8-user-menu-male:before{content:\\\"\\\\f139\\\";}.icons8-business-building:before{content:\\\"\\\\f13a\\\";}.icons8-leave:before{content:\\\"\\\\f13b\\\";}.icons8-combo-chart:before{content:\\\"\\\\f13c\\\";}.icons8-doughnut-chart:before{content:\\\"\\\\f13d\\\";}.icons8-geography:before{content:\\\"\\\\f13e\\\";}.icons8-play-2:before{content:\\\"\\\\f13f\\\";}.icons8-star:before{content:\\\"\\\\f140\\\";}.icons8-conflict:before{content:\\\"\\\\f141\\\";}.icons8-briefcase:before{content:\\\"\\\\f142\\\";}.icons8-user-avatar:before{content:\\\"\\\\f143\\\";}.icons8-globe:before{content:\\\"\\\\f144\\\";}.icons8-warning-shield:before{content:\\\"\\\\f145\\\";}.icons8-new-window:before{content:\\\"\\\\f146\\\";}.icons8-submit-progress:before{content:\\\"\\\\f147\\\";}.icons8-pencil-tip:before{content:\\\"\\\\f148\\\";}.icons8-download:before{content:\\\"\\\\f149\\\";}.icons8-checked-2:before{content:\\\"\\\\f14a\\\";}.icons8-approval:before{content:\\\"\\\\f14b\\\";}.icons8-plus-2:before{content:\\\"\\\\f14c\\\";}.icons8-upload:before{content:\\\"\\\\f14d\\\";}.icons8-expand-arrow:before{content:\\\"\\\\f14e\\\";}.icons8-collapse-arrow:before{content:\\\"\\\\f14f\\\";}.icons8-back:before{content:\\\"\\\\f150\\\";}.icons8-playlist:before{content:\\\"\\\\f151\\\";}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/icons8/css/styles.min.css\"],\"names\":[],\"mappings\":\"AAAA;;;;;;;;;;;;EAYE;AACF,WAAW,qCAAqC,CAAC,2CAA+C,CAAC,kSAAqU,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,oDAAoD,WAAW,qCAAqC,CAAC,wDAAoF,CAAC,CAAC,CAAC,qBAAqB,yBAAyB,CAAC,CAAC,giEAAgiE,oBAAoB,CAAC,qCAAqC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,aAAa,CAAC,uBAAuB,CAAC,iCAAiC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,kCAAkC,CAAC,0BAA0B,CAAC,CAAC,6BAA6B,eAAe,CAAC,CAAC,8BAA8B,eAAe,CAAC,CAAC,uBAAuB,eAAe,CAAC,CAAC,mCAAmC,eAAe,CAAC,CAAC,wBAAwB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,8BAA8B,eAAe,CAAC,CAAC,0BAA0B,eAAe,CAAC,CAAC,qBAAqB,eAAe,CAAC,CAAC,2CAA2C,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,+BAA+B,eAAe,CAAC,CAAC,6BAA6B,eAAe,CAAC,CAAC,2BAA2B,eAAe,CAAC,CAAC,qBAAqB,eAAe,CAAC,CAAC,wBAAwB,eAAe,CAAC,CAAC,qBAAqB,eAAe,CAAC,CAAC,sBAAsB,eAAe,CAAC,CAAC,mBAAmB,eAAe,CAAC,CAAC,yBAAyB,eAAe,CAAC,CAAC,gCAAgC,eAAe,CAAC,CAAC,uBAAuB,eAAe,CAAC,CAAC,sBAAsB,eAAe,CAAC,CAAC,8BAA8B,eAAe,CAAC,CAAC,gCAAgC,eAAe,CAAC,CAAC,gCAAgC,eAAe,CAAC,CAAC,iCAAiC,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,qBAAqB,eAAe,CAAC,CAAC,uBAAuB,eAAe,CAAC,CAAC,4BAA4B,eAAe,CAAC,CAAC,2BAA2B,eAAe,CAAC,CAAC,yBAAyB,eAAe,CAAC,CAAC,2BAA2B,eAAe,CAAC,CAAC,uBAAuB,eAAe,CAAC,CAAC,6BAA6B,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,+BAA+B,eAAe,CAAC,CAAC,yBAAyB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,uBAAuB,eAAe,CAAC,CAAC,yBAAyB,eAAe,CAAC,CAAC,0BAA0B,eAAe,CAAC,CAAC,wBAAwB,eAAe,CAAC,CAAC,qBAAqB,eAAe,CAAC,CAAC,4BAA4B,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,sBAAsB,eAAe,CAAC,CAAC,sBAAsB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,8BAA8B,eAAe,CAAC,CAAC,iCAAiC,eAAe,CAAC,CAAC,qBAAqB,eAAe,CAAC,CAAC,2BAA2B,eAAe,CAAC,CAAC,8BAA8B,eAAe,CAAC,CAAC,yBAAyB,eAAe,CAAC,CAAC,sBAAsB,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,wBAAwB,eAAe,CAAC,CAAC,yBAAyB,eAAe,CAAC,CAAC,2BAA2B,eAAe,CAAC,CAAC,qBAAqB,eAAe,CAAC,CAAC,8BAA8B,eAAe,CAAC,CAAC,0BAA0B,eAAe,CAAC,CAAC,+BAA+B,eAAe,CAAC,CAAC,0BAA0B,eAAe,CAAC,CAAC,wBAAwB,eAAe,CAAC,CAAC,yBAAyB,eAAe,CAAC,CAAC,wBAAwB,eAAe,CAAC,CAAC,sBAAsB,eAAe,CAAC,CAAC,sBAAsB,eAAe,CAAC,CAAC,4BAA4B,eAAe,CAAC,CAAC,8BAA8B,eAAe,CAAC,CAAC,oBAAoB,eAAe,CAAC,CAAC,wBAAwB,eAAe,CAAC\",\"sourcesContent\":[\"/*!\\r\\n * Icon Font Collection 1-b8f80e9f63\\r\\n * Made with love by Icons8 [ https://icons8.com/ ] using webfont [ https://github.com/itgalaxy/webfont ]\\r\\n *\\r\\n * Contacts:\\r\\n * [ https://icons8.com/contact ]\\r\\n *\\r\\n * Follow Icon8 on\\r\\n * Twitter [ https://twitter.com/icons_8 ]\\r\\n * Facebook [ https://www.facebook.com/Icons8 ]\\r\\n * Google+ [ https://plus.google.com/+Icons8 ]\\r\\n * GitHub [ https://github.com/icons8 ]\\r\\n */\\r\\n@font-face{font-family:\\\"Collection 1-b8f80e9f63\\\";src:url(\\\"../fonts/Collection 1-b8f80e9f63.eot\\\");src:url(\\\"../fonts/Collection 1-b8f80e9f63.eot?#iefix\\\")format(\\\"embedded-opentype\\\"),url(\\\"../fonts/Collection 1-b8f80e9f63.woff2\\\")format(\\\"woff2\\\"),url(\\\"../fonts/Collection 1-b8f80e9f63.woff\\\")format(\\\"woff\\\"),url(\\\"../fonts/Collection 1-b8f80e9f63.ttf\\\")format(\\\"truetype\\\"),url(\\\"../fonts/Collection 1-b8f80e9f63.svg#font\\\")format(\\\"svg\\\");font-weight:normal;font-style:normal;}@media screen and(-webkit-min-device-pixel-ratio:0){@font-face{font-family:\\\"Collection 1-b8f80e9f63\\\";src:url(\\\"../fonts/Collection 1-b8f80e9f63.svg#Collection 1-b8f80e9f63\\\")format(\\\"svg\\\");}}[data-icons8]:before{content:attr(data-icons8);}.icons8-delete-filled:before,.icons8-refresh-shield:before,.icons8-restart:before,.icons8-downloading-updates:before,.icons8-template:before,.icons8-home:before,.icons8-play:before,.icons8-christmas-star:before,.icons8-xml-filled:before,.icons8-rules:before,.icons8-parse-from-clipboard-filled:before,.icons8-help:before,.icons8-info:before,.icons8-sort:before,.icons8-multiply-filled:before,.icons8-filled-circle:before,.icons8-menu-filled:before,.icons8-clock:before,.icons8-calendar:before,.icons8-trash:before,.icons8-search:before,.icons8-pin:before,.icons8-attention:before,.icons8-checkmark-filled:before,.icons8-refresh:before,.icons8-circle:before,.icons8-sort-up-filled:before,.icons8-sort-down-filled:before,.icons8-sort-left-filled:before,.icons8-sort-right-filled:before,.icons8-plus:before,.icons8-minus:before,.icons8-forward:before,.icons8-double-right:before,.icons8-double-left:before,.icons8-double-up:before,.icons8-double-down:before,.icons8-checked:before,.icons8-filled-filter:before,.icons8-lock:before,.icons8-undo:before,.icons8-redo:before,.icons8-open:before,.icons8-microsoft-excel:before,.icons8-open-book:before,.icons8-save:before,.icons8-menu:before,.icons8-columns:before,.icons8-toggle-on:before,.icons8-toggle-off:before,.icons8-settings:before,.icons8-gears:before,.icons8-notification:before,.icons8-exit:before,.icons8-undo-2:before,.icons8-redo-2:before,.icons8-copy:before,.icons8-user-menu-male:before,.icons8-business-building:before,.icons8-leave:before,.icons8-combo-chart:before,.icons8-doughnut-chart:before,.icons8-geography:before,.icons8-play-2:before,.icons8-star:before,.icons8-conflict:before,.icons8-briefcase:before,.icons8-user-avatar:before,.icons8-globe:before,.icons8-warning-shield:before,.icons8-new-window:before,.icons8-submit-progress:before,.icons8-pencil-tip:before,.icons8-download:before,.icons8-checked-2:before,.icons8-approval:before,.icons8-plus-2:before,.icons8-upload:before,.icons8-expand-arrow:before,.icons8-collapse-arrow:before,.icons8-back:before,.icons8-playlist:before,.icons8,[data-icons8]:before{display:inline-block;font-family:\\\"Collection 1-b8f80e9f63\\\";font-style:normal;font-weight:normal;font-variant:normal;line-height:1;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;}.icons8-delete-filled:before{content:\\\"\\\\f100\\\";}.icons8-refresh-shield:before{content:\\\"\\\\f101\\\";}.icons8-restart:before{content:\\\"\\\\f102\\\";}.icons8-downloading-updates:before{content:\\\"\\\\f103\\\";}.icons8-template:before{content:\\\"\\\\f104\\\";}.icons8-home:before{content:\\\"\\\\f105\\\";}.icons8-play:before{content:\\\"\\\\f106\\\";}.icons8-christmas-star:before{content:\\\"\\\\f107\\\";}.icons8-xml-filled:before{content:\\\"\\\\f108\\\";}.icons8-rules:before{content:\\\"\\\\f109\\\";}.icons8-parse-from-clipboard-filled:before{content:\\\"\\\\f10a\\\";}.icons8-help:before{content:\\\"\\\\f10b\\\";}.icons8-info:before{content:\\\"\\\\f10c\\\";}.icons8-sort:before{content:\\\"\\\\f10d\\\";}.icons8-multiply-filled:before{content:\\\"\\\\f10e\\\";}.icons8-filled-circle:before{content:\\\"\\\\f10f\\\";}.icons8-menu-filled:before{content:\\\"\\\\f110\\\";}.icons8-clock:before{content:\\\"\\\\f111\\\";}.icons8-calendar:before{content:\\\"\\\\f112\\\";}.icons8-trash:before{content:\\\"\\\\f113\\\";}.icons8-search:before{content:\\\"\\\\f114\\\";}.icons8-pin:before{content:\\\"\\\\f115\\\";}.icons8-attention:before{content:\\\"\\\\f116\\\";}.icons8-checkmark-filled:before{content:\\\"\\\\f117\\\";}.icons8-refresh:before{content:\\\"\\\\f118\\\";}.icons8-circle:before{content:\\\"\\\\f119\\\";}.icons8-sort-up-filled:before{content:\\\"\\\\f11a\\\";}.icons8-sort-down-filled:before{content:\\\"\\\\f11b\\\";}.icons8-sort-left-filled:before{content:\\\"\\\\f11c\\\";}.icons8-sort-right-filled:before{content:\\\"\\\\f11d\\\";}.icons8-plus:before{content:\\\"\\\\f11e\\\";}.icons8-minus:before{content:\\\"\\\\f11f\\\";}.icons8-forward:before{content:\\\"\\\\f120\\\";}.icons8-double-right:before{content:\\\"\\\\f121\\\";}.icons8-double-left:before{content:\\\"\\\\f122\\\";}.icons8-double-up:before{content:\\\"\\\\f123\\\";}.icons8-double-down:before{content:\\\"\\\\f124\\\";}.icons8-checked:before{content:\\\"\\\\f125\\\";}.icons8-filled-filter:before{content:\\\"\\\\f126\\\";}.icons8-lock:before{content:\\\"\\\\f127\\\";}.icons8-undo:before{content:\\\"\\\\f128\\\";}.icons8-redo:before{content:\\\"\\\\f129\\\";}.icons8-open:before{content:\\\"\\\\f12a\\\";}.icons8-microsoft-excel:before{content:\\\"\\\\f12b\\\";}.icons8-open-book:before{content:\\\"\\\\f12c\\\";}.icons8-save:before{content:\\\"\\\\f12d\\\";}.icons8-menu:before{content:\\\"\\\\f12e\\\";}.icons8-columns:before{content:\\\"\\\\f12f\\\";}.icons8-toggle-on:before{content:\\\"\\\\f130\\\";}.icons8-toggle-off:before{content:\\\"\\\\f131\\\";}.icons8-settings:before{content:\\\"\\\\f132\\\";}.icons8-gears:before{content:\\\"\\\\f133\\\";}.icons8-notification:before{content:\\\"\\\\f134\\\";}.icons8-exit:before{content:\\\"\\\\f135\\\";}.icons8-undo-2:before{content:\\\"\\\\f136\\\";}.icons8-redo-2:before{content:\\\"\\\\f137\\\";}.icons8-copy:before{content:\\\"\\\\f138\\\";}.icons8-user-menu-male:before{content:\\\"\\\\f139\\\";}.icons8-business-building:before{content:\\\"\\\\f13a\\\";}.icons8-leave:before{content:\\\"\\\\f13b\\\";}.icons8-combo-chart:before{content:\\\"\\\\f13c\\\";}.icons8-doughnut-chart:before{content:\\\"\\\\f13d\\\";}.icons8-geography:before{content:\\\"\\\\f13e\\\";}.icons8-play-2:before{content:\\\"\\\\f13f\\\";}.icons8-star:before{content:\\\"\\\\f140\\\";}.icons8-conflict:before{content:\\\"\\\\f141\\\";}.icons8-briefcase:before{content:\\\"\\\\f142\\\";}.icons8-user-avatar:before{content:\\\"\\\\f143\\\";}.icons8-globe:before{content:\\\"\\\\f144\\\";}.icons8-warning-shield:before{content:\\\"\\\\f145\\\";}.icons8-new-window:before{content:\\\"\\\\f146\\\";}.icons8-submit-progress:before{content:\\\"\\\\f147\\\";}.icons8-pencil-tip:before{content:\\\"\\\\f148\\\";}.icons8-download:before{content:\\\"\\\\f149\\\";}.icons8-checked-2:before{content:\\\"\\\\f14a\\\";}.icons8-approval:before{content:\\\"\\\\f14b\\\";}.icons8-plus-2:before{content:\\\"\\\\f14c\\\";}.icons8-upload:before{content:\\\"\\\\f14d\\\";}.icons8-expand-arrow:before{content:\\\"\\\\f14e\\\";}.icons8-collapse-arrow:before{content:\\\"\\\\f14f\\\";}.icons8-back:before{content:\\\"\\\\f150\\\";}.icons8-playlist:before{content:\\\"\\\\f151\\\";}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"oi-select {\\r\\n color: #121321 !important;\\r\\n}\\r\\n\\r\\noi-select .btn {\\r\\n color: #121321 !important;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\noi-select .select-dropdown {\\r\\n font-size: 12px;\\r\\n max-height: 300px;\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\noi-select .select-search {\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\noi-select .select-dropdown-optgroup-option {\\r\\n padding: 3px;\\r\\n}\\r\\n\\r\\noi-select .select-dropdown-optgroup-option.active:not(.disabled) {\\r\\n background-color: #f5f5f5;\\r\\n color: #121321;\\r\\n cursor: default;\\r\\n}\\r\\n\\r\\noi-select .select-search-list {\\r\\n max-height: 150px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item_selection {\\r\\n padding-top: 5px;\\r\\n cursor: pointer;\\r\\n border-radius: 8px;\\r\\n background: #EEEFF2;\\r\\n border-width: 1px;\\r\\n border-color: #C2C4CC;\\r\\n gap: 4px;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item_selection:active {\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item_selection.focused {\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\noi-select.open .select-search {\\r\\n border-radius: 0;\\r\\n}\\r\\n\\r\\noi-select.focused .select-search {\\r\\n border-color: #66afe9 !important;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.select-search-list-item_input {\\r\\n line-height: 25px;\\r\\n}\\r\\n\\r\\n.close.select-search-list-item_selection-remove {\\r\\n font-size: 18px;\\r\\n stroke: #121321;\\r\\n}\\r\\n/* removes large input when something is selected */\\r\\noi-select.ng-not-empty .select-search-list-item_input input {\\r\\n max-width: 30px;\\r\\n}\\r\\n/* transparent dropdown */\\r\\noi-select.transparent-oi-select:not(.multiple) .select-search-list-item_selection {\\r\\n font-size: 16px;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select .select-search {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select:hover .select-search {\\r\\n background-color: white;\\r\\n border-color: white;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select .select-dropdown-optgroup-option {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select .select-search-list-item_input input {\\r\\n max-width: 30px;\\r\\n background-color: transparent;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/oi-select-custom-changes.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,yBAAyB;AAC7B;;AAEA;IACI,yBAAyB;AAC7B;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,eAAe;IACf,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,yBAAyB;IACzB,kBAAkB;AACtB;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,yBAAyB;IACzB,cAAc;IACd,eAAe;AACnB;;AAEA;IACI,iBAAiB;IACjB,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,qBAAqB;IACrB,QAAQ;IACR,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gCAAgC;IAChC,gBAAgB;AACpB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,eAAe;IACf,eAAe;AACnB;AACA,mDAAmD;AACnD;IACI,eAAe;AACnB;AACA,yBAAyB;AACzB;IACI,eAAe;IACf,yBAAyB;AAC7B;;AAEA;IACI,6BAA6B;IAC7B,yBAAyB;AAC7B;;AAEA;IACI,uBAAuB;IACvB,mBAAmB;AACvB;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,eAAe;IACf,6BAA6B;AACjC\",\"sourcesContent\":[\"oi-select {\\r\\n color: #121321 !important;\\r\\n}\\r\\n\\r\\noi-select .btn {\\r\\n color: #121321 !important;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\noi-select .select-dropdown {\\r\\n font-size: 12px;\\r\\n max-height: 300px;\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\noi-select .select-search {\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\noi-select .select-dropdown-optgroup-option {\\r\\n padding: 3px;\\r\\n}\\r\\n\\r\\noi-select .select-dropdown-optgroup-option.active:not(.disabled) {\\r\\n background-color: #f5f5f5;\\r\\n color: #121321;\\r\\n cursor: default;\\r\\n}\\r\\n\\r\\noi-select .select-search-list {\\r\\n max-height: 150px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item_selection {\\r\\n padding-top: 5px;\\r\\n cursor: pointer;\\r\\n border-radius: 8px;\\r\\n background: #EEEFF2;\\r\\n border-width: 1px;\\r\\n border-color: #C2C4CC;\\r\\n gap: 4px;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item_selection:active {\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\noi-select .select-search-list-item_selection.focused {\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\noi-select.open .select-search {\\r\\n border-radius: 0;\\r\\n}\\r\\n\\r\\noi-select.focused .select-search {\\r\\n border-color: #66afe9 !important;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.select-search-list-item_input {\\r\\n line-height: 25px;\\r\\n}\\r\\n\\r\\n.close.select-search-list-item_selection-remove {\\r\\n font-size: 18px;\\r\\n stroke: #121321;\\r\\n}\\r\\n/* removes large input when something is selected */\\r\\noi-select.ng-not-empty .select-search-list-item_input input {\\r\\n max-width: 30px;\\r\\n}\\r\\n/* transparent dropdown */\\r\\noi-select.transparent-oi-select:not(.multiple) .select-search-list-item_selection {\\r\\n font-size: 16px;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select .select-search {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select:hover .select-search {\\r\\n background-color: white;\\r\\n border-color: white;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select .select-dropdown-optgroup-option {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\noi-select.transparent-oi-select .select-search-list-item_input input {\\r\\n max-width: 30px;\\r\\n background-color: transparent;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\r\\n/*Slider CSS*/\\r\\n.contentrow {\\r\\n min-height: 50px;\\r\\n -webkit-box-flex: 1;\\r\\n -webkit-flex: 1;\\r\\n -ms-flex: 1;\\r\\n flex: 1;\\r\\n display: -webkit-box;\\r\\n display: -webkit-flex;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-flex-flow: row nowrap;\\r\\n -ms-flex-flow: row nowrap;\\r\\n flex-flow: row nowrap;\\r\\n -webkit-justify-content: space-around;\\r\\n -ms-flex-pack: distribute;\\r\\n justify-content: space-around;\\r\\n -webkit-align-content: space-around;\\r\\n -ms-flex-line-pack: distribute;\\r\\n align-content: space-around;\\r\\n}\\r\\n\\r\\n.row.resizable {\\r\\n -webkit-box-flex: 0;\\r\\n -webkit-flex: 0 0 300px;\\r\\n -ms-flex: 0 0 300px;\\r\\n flex: 0 0 300px;\\r\\n}\\r\\n\\r\\nsection {\\r\\n box-sizing: border-box;\\r\\n border-radius: 0px;\\r\\n padding: .0em .0em;\\r\\n -webkit-box-flex: 1;\\r\\n -webkit-flex: 1;\\r\\n -ms-flex: 1;\\r\\n flex: 1;\\r\\n min-width: 30px;\\r\\n}\\r\\n\\r\\n section.resizable {\\r\\n border-left: 15px solid #fff;\\r\\n -webkit-box-flex: 0;\\r\\n -webkit-flex: 0 0 20%;\\r\\n -ms-flex: 0 0 20%;\\r\\n flex: 0 0 20%;\\r\\n }\\r\\n\\r\\n.resizable {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n .resizable.no-transition {\\r\\n -webkit-transition: none !important;\\r\\n transition: none !important;\\r\\n }\\r\\n\\r\\n.rg-right, .rg-left, .rg-top, .rg-bottom {\\r\\n display: block;\\r\\n width: 14px;\\r\\n height: 14px;\\r\\n line-height: 14px;\\r\\n position: absolute;\\r\\n z-index: 1;\\r\\n -moz-user-select: -moz-none;\\r\\n -ms-user-select: none;\\r\\n -webkit-user-select: none;\\r\\n user-select: none;\\r\\n}\\r\\n\\r\\n .rg-right span, .rg-left span, .rg-top span, .rg-bottom span {\\r\\n position: absolute;\\r\\n box-sizing: border-box;\\r\\n display: block;\\r\\n border: 1px solid #ccc;\\r\\n }\\r\\n\\r\\n .rg-right span, .rg-left span {\\r\\n border-width: 0 1px;\\r\\n top: 50%;\\r\\n margin-top: -10px;\\r\\n margin: -10px 0 0 3.5px;\\r\\n height: 20px;\\r\\n width: 7px;\\r\\n }\\r\\n\\r\\n .rg-top span, .rg-bottom span {\\r\\n border-width: 1px 0;\\r\\n left: 50%;\\r\\n margin: 2px 0 0 -10px;\\r\\n width: 20px;\\r\\n height: 7px;\\r\\n }\\r\\n\\r\\n.rg-top {\\r\\n cursor: row-resize;\\r\\n width: 100%;\\r\\n top: 0;\\r\\n left: 0;\\r\\n margin-top: -7px;\\r\\n}\\r\\n\\r\\n.rg-right {\\r\\n cursor: col-resize;\\r\\n height: 100%;\\r\\n right: 0;\\r\\n top: 0;\\r\\n margin-right: -14px;\\r\\n}\\r\\n\\r\\n.rg-bottom {\\r\\n cursor: row-resize;\\r\\n width: 100%;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n margin-bottom: -7px;\\r\\n}\\r\\n\\r\\n.rg-left {\\r\\n cursor: col-resize;\\r\\n height: 100%;\\r\\n left: 0;\\r\\n top: 0;\\r\\n margin-left: -14px;\\r\\n border-left: 1px solid #dadada;\\r\\n border-right: 1px solid #dadada;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/resizable.css\"],\"names\":[],\"mappings\":\";AACA,aAAa;AACb;IACI,gBAAgB;IAChB,mBAAmB;IACnB,eAAe;IACf,WAAW;IACX,OAAO;IACP,oBAAoB;IACpB,qBAAqB;IACrB,oBAAoB;IACpB,aAAa;IACb,6BAA6B;IAC7B,yBAAyB;IACzB,qBAAqB;IACrB,qCAAqC;IACrC,yBAAyB;IACzB,6BAA6B;IAC7B,mCAAmC;IACnC,8BAA8B;IAC9B,2BAA2B;AAC/B;;AAEA;IACI,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,eAAe;AACnB;;AAEA;IACI,sBAAsB;IACtB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,eAAe;IACf,WAAW;IACX,OAAO;IACP,eAAe;AACnB;;IAEI;QACI,4BAA4B;QAC5B,mBAAmB;QACnB,qBAAqB;QACrB,iBAAiB;QACjB,aAAa;IACjB;;AAEJ;IACI,kBAAkB;AACtB;;IAEI;QACI,mCAAmC;QACnC,2BAA2B;IAC/B;;AAEJ;IACI,cAAc;IACd,WAAW;IACX,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,UAAU;IACV,2BAA2B;IAC3B,qBAAqB;IACrB,yBAAyB;IACzB,iBAAiB;AACrB;;IAEI;QACI,kBAAkB;QAClB,sBAAsB;QACtB,cAAc;QACd,sBAAsB;IAC1B;;IAEA;QACI,mBAAmB;QACnB,QAAQ;QACR,iBAAiB;QACjB,uBAAuB;QACvB,YAAY;QACZ,UAAU;IACd;;IAEA;QACI,mBAAmB;QACnB,SAAS;QACT,qBAAqB;QACrB,WAAW;QACX,WAAW;IACf;;AAEJ;IACI,kBAAkB;IAClB,WAAW;IACX,MAAM;IACN,OAAO;IACP,gBAAgB;AACpB;;AAEA;IACI,kBAAkB;IAClB,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,mBAAmB;AACvB;;AAEA;IACI,kBAAkB;IAClB,WAAW;IACX,SAAS;IACT,OAAO;IACP,mBAAmB;AACvB;;AAEA;IACI,kBAAkB;IAClB,YAAY;IACZ,OAAO;IACP,MAAM;IACN,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;AACnC\",\"sourcesContent\":[\"\\r\\n/*Slider CSS*/\\r\\n.contentrow {\\r\\n min-height: 50px;\\r\\n -webkit-box-flex: 1;\\r\\n -webkit-flex: 1;\\r\\n -ms-flex: 1;\\r\\n flex: 1;\\r\\n display: -webkit-box;\\r\\n display: -webkit-flex;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-flex-flow: row nowrap;\\r\\n -ms-flex-flow: row nowrap;\\r\\n flex-flow: row nowrap;\\r\\n -webkit-justify-content: space-around;\\r\\n -ms-flex-pack: distribute;\\r\\n justify-content: space-around;\\r\\n -webkit-align-content: space-around;\\r\\n -ms-flex-line-pack: distribute;\\r\\n align-content: space-around;\\r\\n}\\r\\n\\r\\n.row.resizable {\\r\\n -webkit-box-flex: 0;\\r\\n -webkit-flex: 0 0 300px;\\r\\n -ms-flex: 0 0 300px;\\r\\n flex: 0 0 300px;\\r\\n}\\r\\n\\r\\nsection {\\r\\n box-sizing: border-box;\\r\\n border-radius: 0px;\\r\\n padding: .0em .0em;\\r\\n -webkit-box-flex: 1;\\r\\n -webkit-flex: 1;\\r\\n -ms-flex: 1;\\r\\n flex: 1;\\r\\n min-width: 30px;\\r\\n}\\r\\n\\r\\n section.resizable {\\r\\n border-left: 15px solid #fff;\\r\\n -webkit-box-flex: 0;\\r\\n -webkit-flex: 0 0 20%;\\r\\n -ms-flex: 0 0 20%;\\r\\n flex: 0 0 20%;\\r\\n }\\r\\n\\r\\n.resizable {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n .resizable.no-transition {\\r\\n -webkit-transition: none !important;\\r\\n transition: none !important;\\r\\n }\\r\\n\\r\\n.rg-right, .rg-left, .rg-top, .rg-bottom {\\r\\n display: block;\\r\\n width: 14px;\\r\\n height: 14px;\\r\\n line-height: 14px;\\r\\n position: absolute;\\r\\n z-index: 1;\\r\\n -moz-user-select: -moz-none;\\r\\n -ms-user-select: none;\\r\\n -webkit-user-select: none;\\r\\n user-select: none;\\r\\n}\\r\\n\\r\\n .rg-right span, .rg-left span, .rg-top span, .rg-bottom span {\\r\\n position: absolute;\\r\\n box-sizing: border-box;\\r\\n display: block;\\r\\n border: 1px solid #ccc;\\r\\n }\\r\\n\\r\\n .rg-right span, .rg-left span {\\r\\n border-width: 0 1px;\\r\\n top: 50%;\\r\\n margin-top: -10px;\\r\\n margin: -10px 0 0 3.5px;\\r\\n height: 20px;\\r\\n width: 7px;\\r\\n }\\r\\n\\r\\n .rg-top span, .rg-bottom span {\\r\\n border-width: 1px 0;\\r\\n left: 50%;\\r\\n margin: 2px 0 0 -10px;\\r\\n width: 20px;\\r\\n height: 7px;\\r\\n }\\r\\n\\r\\n.rg-top {\\r\\n cursor: row-resize;\\r\\n width: 100%;\\r\\n top: 0;\\r\\n left: 0;\\r\\n margin-top: -7px;\\r\\n}\\r\\n\\r\\n.rg-right {\\r\\n cursor: col-resize;\\r\\n height: 100%;\\r\\n right: 0;\\r\\n top: 0;\\r\\n margin-right: -14px;\\r\\n}\\r\\n\\r\\n.rg-bottom {\\r\\n cursor: row-resize;\\r\\n width: 100%;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n margin-bottom: -7px;\\r\\n}\\r\\n\\r\\n.rg-left {\\r\\n cursor: col-resize;\\r\\n height: 100%;\\r\\n left: 0;\\r\\n top: 0;\\r\\n margin-left: -14px;\\r\\n border-left: 1px solid #dadada;\\r\\n border-right: 1px solid #dadada;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".switch input {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.switch i {\\r\\n display: inline-block;\\r\\n cursor: pointer;\\r\\n padding-right: 20px;\\r\\n transition: all ease 0.2s;\\r\\n -webkit-transition: all ease 0.2s;\\r\\n border-radius: 20px;\\r\\n box-shadow: inset 0 0 1px rgba(0,0,1,.5);\\r\\n background: #F1F1F1;\\r\\n}\\r\\n\\r\\n.switch i:before {\\r\\n display: block;\\r\\n content: '';\\r\\n width: 20px;\\r\\n height: 20px;\\r\\n border-radius: 20px;\\r\\n background: white;\\r\\n box-shadow: 0 1px 2px rgba(0,0,0,.5);\\r\\n}\\r\\n\\r\\n.switch :checked + i {\\r\\n padding-right: 0;\\r\\n padding-left: 20px;\\r\\n box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #291972;\\r\\n -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #291972;\\r\\n}\\r\\n\\r\\n.switch :disabled + i {\\r\\n opacity: .4;\\r\\n cursor:not-allowed;\\r\\n}\\r\\n\\r\\n.switch.redSwitch :checked + i {\\r\\n box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px red;\\r\\n -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px red;\\r\\n}\\r\\n\\r\\n.switch.yellowSwitch :checked + i {\\r\\n box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #ffd800;\\r\\n -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #ffd800;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/switchery.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,aAAa;AACjB;;AAEA;IACI,qBAAqB;IACrB,eAAe;IACf,mBAAmB;IACnB,yBAAyB;IACzB,iCAAiC;IACjC,mBAAmB;IACnB,wCAAwC;IACxC,mBAAmB;AACvB;;AAEA;IACI,cAAc;IACd,WAAW;IACX,WAAW;IACX,YAAY;IACZ,mBAAmB;IACnB,iBAAiB;IACjB,oCAAoC;AACxC;;AAEA;IACI,gBAAgB;IAChB,kBAAkB;IAClB,gEAAgE;IAChE,wEAAwE;AAC5E;;AAEA;IACI,WAAW;IACX,kBAAkB;AACtB;;AAEA;IACI,4DAA4D;IAC5D,oEAAoE;AACxE;;AAEA;IACI,gEAAgE;IAChE,wEAAwE;AAC5E\",\"sourcesContent\":[\".switch input {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.switch i {\\r\\n display: inline-block;\\r\\n cursor: pointer;\\r\\n padding-right: 20px;\\r\\n transition: all ease 0.2s;\\r\\n -webkit-transition: all ease 0.2s;\\r\\n border-radius: 20px;\\r\\n box-shadow: inset 0 0 1px rgba(0,0,1,.5);\\r\\n background: #F1F1F1;\\r\\n}\\r\\n\\r\\n.switch i:before {\\r\\n display: block;\\r\\n content: '';\\r\\n width: 20px;\\r\\n height: 20px;\\r\\n border-radius: 20px;\\r\\n background: white;\\r\\n box-shadow: 0 1px 2px rgba(0,0,0,.5);\\r\\n}\\r\\n\\r\\n.switch :checked + i {\\r\\n padding-right: 0;\\r\\n padding-left: 20px;\\r\\n box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #291972;\\r\\n -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #291972;\\r\\n}\\r\\n\\r\\n.switch :disabled + i {\\r\\n opacity: .4;\\r\\n cursor:not-allowed;\\r\\n}\\r\\n\\r\\n.switch.redSwitch :checked + i {\\r\\n box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px red;\\r\\n -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px red;\\r\\n}\\r\\n\\r\\n.switch.yellowSwitch :checked + i {\\r\\n box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #ffd800;\\r\\n -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,.5), inset 0 0 40px #ffd800;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".toggle_radio {\\r\\n position: relative;\\r\\n background: rgba(255,255,255,.1);\\r\\n overflow: hidden;\\r\\n padding: 0 !important;\\r\\n -webkit-border-radius: 50px;\\r\\n -moz-border-radius: 50px;\\r\\n border-radius: 50px;\\r\\n position: relative;\\r\\n height: 26px;\\r\\n width: 212px;\\r\\n}\\r\\n\\r\\n .toggle_radio > * {\\r\\n float: left;\\r\\n }\\r\\n\\r\\n .toggle_radio input[type=radio] {\\r\\n display: none;\\r\\n /*position: fixed;*/\\r\\n }\\r\\n\\r\\n .toggle_radio label {\\r\\n color: rgba(255,255,255,.9);\\r\\n z-index: 0;\\r\\n font-weight: 600;\\r\\n display: block;\\r\\n width: 100px;\\r\\n height: 20px;\\r\\n margin: 4px 3px;\\r\\n -webkit-border-radius: 50px;\\r\\n -moz-border-radius: 50px;\\r\\n border-radius: 50px;\\r\\n cursor: pointer;\\r\\n z-index: 1;\\r\\n text-align: center;\\r\\n }\\r\\n\\r\\n.toggle_option_slider {\\r\\n\\r\\n width: 100px;\\r\\n height: 20px;\\r\\n position: absolute;\\r\\n top: 3px;\\r\\n -webkit-border-radius: 50px;\\r\\n -moz-border-radius: 50px;\\r\\n border-radius: 50px;\\r\\n -webkit-transition: all .4s ease;\\r\\n -moz-transition: all .4s ease;\\r\\n -o-transition: all .4s ease;\\r\\n -ms-transition: all .4s ease;\\r\\n transition: all .4s ease;\\r\\n}\\r\\n\\r\\n#first_toggle:checked ~ .toggle_option_slider {\\r\\n background: rgba(255,255,255,.3);\\r\\n left: 3px;\\r\\n}\\r\\n\\r\\n#second_toggle:checked ~ .toggle_option_slider {\\r\\n background: rgba(255,255,255,.3);\\r\\n left: 109px;\\r\\n}\\r\\n\\r\\n#third_toggle:checked ~ .toggle_option_slider {\\r\\n background: rgba(255,255,255,.3);\\r\\n left: 215px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./css/toggle-radio.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,kBAAkB;IAClB,gCAAgC;IAChC,gBAAgB;IAChB,qBAAqB;IACrB,2BAA2B;IAC3B,wBAAwB;IACxB,mBAAmB;IACnB,kBAAkB;IAClB,YAAY;IACZ,YAAY;AAChB;;IAEI;QACI,WAAW;IACf;;IAEA;QACI,aAAa;QACb,mBAAmB;IACvB;;IAEA;QACI,2BAA2B;QAC3B,UAAU;QACV,gBAAgB;QAChB,cAAc;QACd,YAAY;QACZ,YAAY;QACZ,eAAe;QACf,2BAA2B;QAC3B,wBAAwB;QACxB,mBAAmB;QACnB,eAAe;QACf,UAAU;QACV,kBAAkB;IACtB;;AAEJ;;IAEI,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,QAAQ;IACR,2BAA2B;IAC3B,wBAAwB;IACxB,mBAAmB;IACnB,gCAAgC;IAChC,6BAA6B;IAC7B,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;AAC5B;;AAEA;IACI,gCAAgC;IAChC,SAAS;AACb;;AAEA;IACI,gCAAgC;IAChC,WAAW;AACf;;AAEA;IACI,gCAAgC;IAChC,WAAW;AACf\",\"sourcesContent\":[\".toggle_radio {\\r\\n position: relative;\\r\\n background: rgba(255,255,255,.1);\\r\\n overflow: hidden;\\r\\n padding: 0 !important;\\r\\n -webkit-border-radius: 50px;\\r\\n -moz-border-radius: 50px;\\r\\n border-radius: 50px;\\r\\n position: relative;\\r\\n height: 26px;\\r\\n width: 212px;\\r\\n}\\r\\n\\r\\n .toggle_radio > * {\\r\\n float: left;\\r\\n }\\r\\n\\r\\n .toggle_radio input[type=radio] {\\r\\n display: none;\\r\\n /*position: fixed;*/\\r\\n }\\r\\n\\r\\n .toggle_radio label {\\r\\n color: rgba(255,255,255,.9);\\r\\n z-index: 0;\\r\\n font-weight: 600;\\r\\n display: block;\\r\\n width: 100px;\\r\\n height: 20px;\\r\\n margin: 4px 3px;\\r\\n -webkit-border-radius: 50px;\\r\\n -moz-border-radius: 50px;\\r\\n border-radius: 50px;\\r\\n cursor: pointer;\\r\\n z-index: 1;\\r\\n text-align: center;\\r\\n }\\r\\n\\r\\n.toggle_option_slider {\\r\\n\\r\\n width: 100px;\\r\\n height: 20px;\\r\\n position: absolute;\\r\\n top: 3px;\\r\\n -webkit-border-radius: 50px;\\r\\n -moz-border-radius: 50px;\\r\\n border-radius: 50px;\\r\\n -webkit-transition: all .4s ease;\\r\\n -moz-transition: all .4s ease;\\r\\n -o-transition: all .4s ease;\\r\\n -ms-transition: all .4s ease;\\r\\n transition: all .4s ease;\\r\\n}\\r\\n\\r\\n#first_toggle:checked ~ .toggle_option_slider {\\r\\n background: rgba(255,255,255,.3);\\r\\n left: 3px;\\r\\n}\\r\\n\\r\\n#second_toggle:checked ~ .toggle_option_slider {\\r\\n background: rgba(255,255,255,.3);\\r\\n left: 109px;\\r\\n}\\r\\n\\r\\n#third_toggle:checked ~ .toggle_option_slider {\\r\\n background: rgba(255,255,255,.3);\\r\\n left: 215px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../node_modules/css-loader/dist/cjs.js!./animate.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_1___ from \"-!../node_modules/css-loader/dist/cjs.js!../node_modules/@progress/kendo-ui/css/web/kendo.common-bootstrap.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_2___ from \"-!../node_modules/css-loader/dist/cjs.js!../node_modules/@progress/kendo-ui/css/web/kendo.bootstrap.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_3___ from \"-!../node_modules/css-loader/dist/cjs.js!../node_modules/bootstrap/dist/css/bootstrap.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_4___ from \"-!../node_modules/css-loader/dist/cjs.js!../node_modules/oi.select/dist/select.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_5___ from \"-!../node_modules/css-loader/dist/cjs.js!./oi-select-custom-changes.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_6___ from \"-!../node_modules/css-loader/dist/cjs.js!../node_modules/sweetalert2/dist/sweetalert2.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_7___ from \"-!../node_modules/css-loader/dist/cjs.js!./switchery.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_8___ from \"-!../node_modules/css-loader/dist/cjs.js!../node_modules/v-accordion/dist/v-accordion.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_9___ from \"-!../node_modules/css-loader/dist/cjs.js!./angular-list-view.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_10___ from \"-!../node_modules/css-loader/dist/cjs.js!./customSubHeadingNavigation.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_11___ from \"-!../node_modules/css-loader/dist/cjs.js!./resizable.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_12___ from \"-!../node_modules/css-loader/dist/cjs.js!./dynamicTabsDark.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_13___ from \"-!../node_modules/css-loader/dist/cjs.js!./toggle-radio.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_14___ from \"-!../node_modules/css-loader/dist/cjs.js!./angular-wizard.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_15___ from \"-!../node_modules/css-loader/dist/cjs.js!./icons8/css/styles.min.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_16___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Shared/Components/roleMultiselectDropdown/roleMultiselectDropdown.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_17___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/Notifications/notifications.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_18___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/Users/usersView.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_19___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/DataChanges/ServiceNow/ServiceNowTicketModal.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_20___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/AXSecurityDesigner/AXSecurityDesigner.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_21___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/ApprovalRules/approvalRules.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_22___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/RequestManagement/WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_23___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/NetSuiteArmQuantification/NetSuiteArmQuantification.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_24___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/DataChangesOracleCloud/oracleCloudDataChanges.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_25___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/RequestManagement/AX7Person/ax7PersonSearch.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_26___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/RequestManagement/WizardSteps/Universal/summary.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_27___ from \"-!../node_modules/css-loader/dist/cjs.js!../App/Components/RequestManagement/WizardSteps/Universal/effectiveDates.css\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../node_modules/css-loader/dist/runtime/getUrl.js\";\nimport ___CSS_LOADER_URL_IMPORT_0___ from \"./patterns/header-profile.png\";\nimport ___CSS_LOADER_URL_IMPORT_1___ from \"./patterns/shattered.png\";\nimport ___CSS_LOADER_URL_IMPORT_2___ from \"./patterns/header-profile-skin-1.png\";\nimport ___CSS_LOADER_URL_IMPORT_3___ from \"./patterns/header-profile-skin-3.png\";\nimport ___CSS_LOADER_URL_IMPORT_4___ from \"./patterns/header-profile-skin-2.png\";\nimport ___CSS_LOADER_URL_IMPORT_5___ from \"../Content/Images/SVG/icons8-Info Squared.svg\";\nimport ___CSS_LOADER_URL_IMPORT_6___ from \"../Content/Images/SVG/icons8-WarningRed.svg\";\nimport ___CSS_LOADER_URL_IMPORT_7___ from \"../Content/Images/SVG/icons8-Ok.svg\";\nimport ___CSS_LOADER_URL_IMPORT_8___ from \"../Content/Images/SVG/icons8-Warning.svg\";\nimport ___CSS_LOADER_URL_IMPORT_9___ from \"../node_modules/font-awesome/fonts/fontawesome-webfont.eot?v=4.7.0\";\nimport ___CSS_LOADER_URL_IMPORT_10___ from \"../node_modules/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0\";\nimport ___CSS_LOADER_URL_IMPORT_11___ from \"../node_modules/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0\";\nimport ___CSS_LOADER_URL_IMPORT_12___ from \"../node_modules/font-awesome/fonts/fontawesome-webfont.woff?v=4.7.0\";\nimport ___CSS_LOADER_URL_IMPORT_13___ from \"../node_modules/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0\";\nimport ___CSS_LOADER_URL_IMPORT_14___ from \"../node_modules/font-awesome/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular\";\nimport ___CSS_LOADER_URL_IMPORT_15___ from \"../Content/Images/SVG/16Spinner.svg\";\nimport ___CSS_LOADER_URL_IMPORT_16___ from \"./plugins/kendo/Bootstrap/loading-image-spinner.gif\";\nimport ___CSS_LOADER_URL_IMPORT_17___ from \"../Content/Images/SVG/SecurityDesignerCircleOnlyIcon.svg\";\nimport ___CSS_LOADER_URL_IMPORT_18___ from \"../Content/Images/SVG/SecurityDesignerRiskAnalysisResults.svg\";\nimport ___CSS_LOADER_URL_IMPORT_19___ from \"../Content/Images/SVG/icons8-Submit Progress.svg\";\nimport ___CSS_LOADER_URL_IMPORT_20___ from \"../Content/Images/SVG/DefaultMit.svg\";\nimport ___CSS_LOADER_URL_IMPORT_21___ from \"../Content/Images/SVG/ConnectionsWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_22___ from \"../Content/Images/SVG/ConnectionsPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_23___ from \"../Content/Images/SVG/Change ThemeWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_24___ from \"../Content/Images/SVG/Change ThemePurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_25___ from \"../Content/Images/SVG/AccessRiskMonitorWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_26___ from \"../Content/Images/SVG/AccessRiskMonitorPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_27___ from \"../Content/Images/SVG/certificationsWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_28___ from \"../Content/Images/SVG/certificationsPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_29___ from \"../Content/Images/SVG/SettingsWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_30___ from \"../Content/Images/SVG/SettingsPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_31___ from \"../Content/Images/SVG/SecuritySetupWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_32___ from \"../Content/Images/SVG/SecuritySetupPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_33___ from \"../Content/Images/SVG/CalendarWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_34___ from \"../Content/Images/SVG/CalendarPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_35___ from \"../Content/Images/SVG/DataTransferPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_36___ from \"../Content/Images/SVG/SecurityDesignerIconWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_37___ from \"../Content/Images/SVG/SecurityDesignerIconPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_38___ from \"../Content/Images/SVG/Electronic Identity CardWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_39___ from \"../Content/Images/SVG/Electronic Identity CardPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_40___ from \"../Content/Images/SVG/icons8-surveyWhite.svg\";\nimport ___CSS_LOADER_URL_IMPORT_41___ from \"../Content/Images/SVG/icons8-surveyPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_42___ from \"../Content/Images/SVG/x-circle-12.svg\";\nimport ___CSS_LOADER_URL_IMPORT_43___ from \"../Content/Images/SVG/UploadPurple.svg\";\nimport ___CSS_LOADER_URL_IMPORT_44___ from \"../Content/Images/SVG/PurgeDataChanges.svg\";\nimport ___CSS_LOADER_URL_IMPORT_45___ from \"../Content/Images/SVG/CollectDataChanges.svg\";\nimport ___CSS_LOADER_URL_IMPORT_46___ from \"../Content/Images/SVG/ArchiveDataCanges.svg\";\nimport ___CSS_LOADER_URL_IMPORT_47___ from \"../Content/Images/SVG/RestoreDataChanges.svg\";\nimport ___CSS_LOADER_URL_IMPORT_48___ from \"../Content/Images/SVG/CollectSnapshot.svg\";\nimport ___CSS_LOADER_URL_IMPORT_49___ from \"../Content/Images/SVG/Application Shield.svg\";\nimport ___CSS_LOADER_URL_IMPORT_50___ from \"../Content/Images/SVG/XML.svg\";\nimport ___CSS_LOADER_URL_IMPORT_51___ from \"../Content/Images/SVG/securityDesigner/icons8-info.svg\";\nimport ___CSS_LOADER_URL_IMPORT_52___ from \"../Content/Images/SVG/securityDesigner/icons8-info-fade.svg\";\nimport ___CSS_LOADER_URL_IMPORT_53___ from \"../Content/Images/ApplicationLogos/IMTiles/NetSuiteIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_54___ from \"../Content/Images/ApplicationLogos/IMTiles/Dynamics365IMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_55___ from \"../Content/Images/ApplicationLogos/IMTiles/SAPIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_56___ from \"../Content/Images/ApplicationLogos/IMTiles/OracleIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_57___ from \"../Content/Images/ApplicationLogos/IMTiles/DynamicsGPIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_58___ from \"../Content/Images/ApplicationLogos/IMTiles/DynamicsAXIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_59___ from \"../Content/Images/ApplicationLogos/IMTiles/DynamicsNAVIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_60___ from \"../Content/Images/ApplicationLogos/IMTiles/Dynamics365CustomerEngagementIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_61___ from \"../Content/Images/ApplicationLogos/IMTiles/OracleCloudIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_62___ from \"../Content/Images/ApplicationLogos/AzureActiveDirectory.svg\";\nimport ___CSS_LOADER_URL_IMPORT_63___ from \"../Content/Images/ApplicationLogos/IMTiles/UniversalProduct.svg\";\nimport ___CSS_LOADER_URL_IMPORT_64___ from \"../Content/Images/ApplicationLogos/IMTiles/PeopleSoftIMTile.svg\";\nimport ___CSS_LOADER_URL_IMPORT_65___ from \"../Content/Images/ApplicationLogos/SalesforceLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_66___ from \"../Content/Images/ApplicationLogos/IntacctLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_67___ from \"../Content/Images/SVG/fp-circle-success.svg\";\nimport ___CSS_LOADER_URL_IMPORT_68___ from \"../Content/Images/SVG/fp-circle-inactive.svg\";\nimport ___CSS_LOADER_URL_IMPORT_69___ from \"../Content/Images/FileTypeIcons/xlsx_64.png\";\nimport ___CSS_LOADER_URL_IMPORT_70___ from \"../Content/Images/FileTypeIcons/pdf_64.png\";\nimport ___CSS_LOADER_URL_IMPORT_71___ from \"../Content/Images/FileTypeIcons/docx_64.png\";\nimport ___CSS_LOADER_URL_IMPORT_72___ from \"../Content/Images/FileTypeIcons/xlsx_16.png\";\nimport ___CSS_LOADER_URL_IMPORT_73___ from \"../Content/Images/FileTypeIcons/pdf_16.png\";\nimport ___CSS_LOADER_URL_IMPORT_74___ from \"../Content/Images/FileTypeIcons/csv-16.png\";\nimport ___CSS_LOADER_URL_IMPORT_75___ from \"../Content/Images/FileTypeIcons/default-16.png\";\nimport ___CSS_LOADER_URL_IMPORT_76___ from \"../Content/Images/FileTypeIcons/default-64.png\";\nimport ___CSS_LOADER_URL_IMPORT_77___ from \"../Content/Images/FileTypeIcons/docx_16.png\";\nimport ___CSS_LOADER_URL_IMPORT_78___ from \"../Content/Images/FileTypeIcons/xlsx_32.png\";\nimport ___CSS_LOADER_URL_IMPORT_79___ from \"../Content/Images/FileTypeIcons/pdf_32.png\";\nimport ___CSS_LOADER_URL_IMPORT_80___ from \"../Content/Images/FileTypeIcons/csv-64.png\";\nimport ___CSS_LOADER_URL_IMPORT_81___ from \"../Content/Images/FileTypeIcons/docx_32.png\";\nimport ___CSS_LOADER_URL_IMPORT_82___ from \"../Content/Images/ApplicationLogos/AcumaticaSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_83___ from \"../Content/Images/ApplicationLogos/OracleLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_84___ from \"../Content/Images/ApplicationLogos/OracleJDEdwardsSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_85___ from \"../Content/Images/ApplicationLogos/OracleCloudFinLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_86___ from \"../Content/Images/ApplicationLogos/PeopleSoftSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_87___ from \"../Content/Images/ApplicationLogos/CoupaSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_88___ from \"../Content/Images/ApplicationLogos/Dynamics365SVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_89___ from \"../Content/Images/ApplicationLogos/Dynamics365SalesSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_90___ from \"../Content/Images/ApplicationLogos/DynamicsNav2019BusinessCentral.svg\";\nimport ___CSS_LOADER_URL_IMPORT_91___ from \"../Content/Images/ApplicationLogos/DynamicsGPSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_92___ from \"../Content/Images/ApplicationLogos/DynamicsAXSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_93___ from \"../Content/Images/ApplicationLogos/DynamicsSLSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_94___ from \"../Content/Images/ApplicationLogos/netsuite-oracle.svg\";\nimport ___CSS_LOADER_URL_IMPORT_95___ from \"../Content/Images/ApplicationLogos/SAPB1LogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_96___ from \"../Content/Images/ApplicationLogos/SAPLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_97___ from \"../Content/Images/ApplicationLogos/DynamicsNAVSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_98___ from \"../Content/Images/ApplicationLogos/ZendeskLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_99___ from \"../Content/Images/ApplicationLogos/JiraLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_100___ from \"../Content/Images/ApplicationLogos/WorkdaySVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_101___ from \"../Content/Images/ApplicationLogos/WorkivaLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_102___ from \"../Content/Images/ApplicationLogos/AzureSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_103___ from \"../Content/Images/ApplicationLogos/microsoftActiveDirectory.svg\";\nimport ___CSS_LOADER_URL_IMPORT_104___ from \"../Content/Images/ApplicationLogos/service-now.svg\";\nimport ___CSS_LOADER_URL_IMPORT_105___ from \"../Content/Images/ApplicationLogos/ZuoraLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_106___ from \"../Content/Images/ApplicationLogos/ALA_Logo.svg\";\nimport ___CSS_LOADER_URL_IMPORT_107___ from \"../Content/Images/ApplicationLogos/AribaLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_108___ from \"../Content/Images/ApplicationLogos/FreshserviceLogo.svg\";\nimport ___CSS_LOADER_URL_IMPORT_109___ from \"../Content/Images/ApplicationLogos/AuditBoardLogo.svg\";\nimport ___CSS_LOADER_URL_IMPORT_110___ from \"../Content/Images/ApplicationLogos/AzureDevOpsLogoSVG.svg\";\nimport ___CSS_LOADER_URL_IMPORT_111___ from \"../Content/Images/ApplicationLogos/SAPConcurLogo.svg\";\nimport ___CSS_LOADER_URL_IMPORT_112___ from \"../Content/Images/SVG/LinkClippedWithDrop.svg\";\nimport ___CSS_LOADER_URL_IMPORT_113___ from \"../Content/Images/SVG/icons8-Sort Down.svg\";\nimport ___CSS_LOADER_URL_IMPORT_114___ from \"../Content/Images/ApplicationLogos/Microsoft_logo.png\";\nimport ___CSS_LOADER_URL_IMPORT_115___ from \"../Content/Images/SVG/fastpath-white-mono.svg\";\nimport ___CSS_LOADER_URL_IMPORT_116___ from \"../Content/Images/ApplicationLogos/SAML-logo.svg\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_1___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_2___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_3___);\n___CSS_LOADER_EXPORT___.push([module.id, \"@import url(https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap);\"]);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_4___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_5___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_6___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_7___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_8___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_9___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_10___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_11___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_12___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_13___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_14___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_15___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_16___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_17___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_18___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_19___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_20___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_21___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_22___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_23___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_24___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_25___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_26___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_27___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\nvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\nvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\nvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_6___);\nvar ___CSS_LOADER_URL_REPLACEMENT_7___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_7___);\nvar ___CSS_LOADER_URL_REPLACEMENT_8___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_8___);\nvar ___CSS_LOADER_URL_REPLACEMENT_9___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_9___);\nvar ___CSS_LOADER_URL_REPLACEMENT_10___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_10___, { hash: \"?#iefix&v=4.7.0\" });\nvar ___CSS_LOADER_URL_REPLACEMENT_11___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_11___);\nvar ___CSS_LOADER_URL_REPLACEMENT_12___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_12___);\nvar ___CSS_LOADER_URL_REPLACEMENT_13___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_13___);\nvar ___CSS_LOADER_URL_REPLACEMENT_14___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_14___, { hash: \"#fontawesomeregular\" });\nvar ___CSS_LOADER_URL_REPLACEMENT_15___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_15___);\nvar ___CSS_LOADER_URL_REPLACEMENT_16___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_16___);\nvar ___CSS_LOADER_URL_REPLACEMENT_17___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_17___);\nvar ___CSS_LOADER_URL_REPLACEMENT_18___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_18___);\nvar ___CSS_LOADER_URL_REPLACEMENT_19___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_19___);\nvar ___CSS_LOADER_URL_REPLACEMENT_20___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_20___);\nvar ___CSS_LOADER_URL_REPLACEMENT_21___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_21___);\nvar ___CSS_LOADER_URL_REPLACEMENT_22___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_22___);\nvar ___CSS_LOADER_URL_REPLACEMENT_23___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_23___);\nvar ___CSS_LOADER_URL_REPLACEMENT_24___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_24___);\nvar ___CSS_LOADER_URL_REPLACEMENT_25___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_25___);\nvar ___CSS_LOADER_URL_REPLACEMENT_26___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_26___);\nvar ___CSS_LOADER_URL_REPLACEMENT_27___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_27___);\nvar ___CSS_LOADER_URL_REPLACEMENT_28___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_28___);\nvar ___CSS_LOADER_URL_REPLACEMENT_29___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_29___);\nvar ___CSS_LOADER_URL_REPLACEMENT_30___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_30___);\nvar ___CSS_LOADER_URL_REPLACEMENT_31___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_31___);\nvar ___CSS_LOADER_URL_REPLACEMENT_32___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_32___);\nvar ___CSS_LOADER_URL_REPLACEMENT_33___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_33___);\nvar ___CSS_LOADER_URL_REPLACEMENT_34___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_34___);\nvar ___CSS_LOADER_URL_REPLACEMENT_35___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_35___);\nvar ___CSS_LOADER_URL_REPLACEMENT_36___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_36___);\nvar ___CSS_LOADER_URL_REPLACEMENT_37___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_37___);\nvar ___CSS_LOADER_URL_REPLACEMENT_38___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_38___);\nvar ___CSS_LOADER_URL_REPLACEMENT_39___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_39___);\nvar ___CSS_LOADER_URL_REPLACEMENT_40___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_40___);\nvar ___CSS_LOADER_URL_REPLACEMENT_41___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_41___);\nvar ___CSS_LOADER_URL_REPLACEMENT_42___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_42___);\nvar ___CSS_LOADER_URL_REPLACEMENT_43___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_43___);\nvar ___CSS_LOADER_URL_REPLACEMENT_44___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_44___);\nvar ___CSS_LOADER_URL_REPLACEMENT_45___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_45___);\nvar ___CSS_LOADER_URL_REPLACEMENT_46___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_46___);\nvar ___CSS_LOADER_URL_REPLACEMENT_47___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_47___);\nvar ___CSS_LOADER_URL_REPLACEMENT_48___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_48___);\nvar ___CSS_LOADER_URL_REPLACEMENT_49___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_49___);\nvar ___CSS_LOADER_URL_REPLACEMENT_50___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_50___);\nvar ___CSS_LOADER_URL_REPLACEMENT_51___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_51___);\nvar ___CSS_LOADER_URL_REPLACEMENT_52___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_52___);\nvar ___CSS_LOADER_URL_REPLACEMENT_53___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_53___);\nvar ___CSS_LOADER_URL_REPLACEMENT_54___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_54___);\nvar ___CSS_LOADER_URL_REPLACEMENT_55___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_55___);\nvar ___CSS_LOADER_URL_REPLACEMENT_56___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_56___);\nvar ___CSS_LOADER_URL_REPLACEMENT_57___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_57___);\nvar ___CSS_LOADER_URL_REPLACEMENT_58___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_58___);\nvar ___CSS_LOADER_URL_REPLACEMENT_59___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_59___);\nvar ___CSS_LOADER_URL_REPLACEMENT_60___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_60___);\nvar ___CSS_LOADER_URL_REPLACEMENT_61___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_61___);\nvar ___CSS_LOADER_URL_REPLACEMENT_62___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_62___);\nvar ___CSS_LOADER_URL_REPLACEMENT_63___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_63___);\nvar ___CSS_LOADER_URL_REPLACEMENT_64___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_64___);\nvar ___CSS_LOADER_URL_REPLACEMENT_65___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_65___);\nvar ___CSS_LOADER_URL_REPLACEMENT_66___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_66___);\nvar ___CSS_LOADER_URL_REPLACEMENT_67___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_67___);\nvar ___CSS_LOADER_URL_REPLACEMENT_68___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_68___);\nvar ___CSS_LOADER_URL_REPLACEMENT_69___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_69___);\nvar ___CSS_LOADER_URL_REPLACEMENT_70___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_70___);\nvar ___CSS_LOADER_URL_REPLACEMENT_71___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_71___);\nvar ___CSS_LOADER_URL_REPLACEMENT_72___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_72___);\nvar ___CSS_LOADER_URL_REPLACEMENT_73___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_73___);\nvar ___CSS_LOADER_URL_REPLACEMENT_74___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_74___);\nvar ___CSS_LOADER_URL_REPLACEMENT_75___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_75___);\nvar ___CSS_LOADER_URL_REPLACEMENT_76___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_76___);\nvar ___CSS_LOADER_URL_REPLACEMENT_77___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_77___);\nvar ___CSS_LOADER_URL_REPLACEMENT_78___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_78___);\nvar ___CSS_LOADER_URL_REPLACEMENT_79___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_79___);\nvar ___CSS_LOADER_URL_REPLACEMENT_80___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_80___);\nvar ___CSS_LOADER_URL_REPLACEMENT_81___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_81___);\nvar ___CSS_LOADER_URL_REPLACEMENT_82___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_82___);\nvar ___CSS_LOADER_URL_REPLACEMENT_83___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_83___);\nvar ___CSS_LOADER_URL_REPLACEMENT_84___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_84___);\nvar ___CSS_LOADER_URL_REPLACEMENT_85___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_85___);\nvar ___CSS_LOADER_URL_REPLACEMENT_86___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_86___);\nvar ___CSS_LOADER_URL_REPLACEMENT_87___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_87___);\nvar ___CSS_LOADER_URL_REPLACEMENT_88___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_88___);\nvar ___CSS_LOADER_URL_REPLACEMENT_89___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_89___);\nvar ___CSS_LOADER_URL_REPLACEMENT_90___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_90___);\nvar ___CSS_LOADER_URL_REPLACEMENT_91___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_91___);\nvar ___CSS_LOADER_URL_REPLACEMENT_92___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_92___);\nvar ___CSS_LOADER_URL_REPLACEMENT_93___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_93___);\nvar ___CSS_LOADER_URL_REPLACEMENT_94___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_94___);\nvar ___CSS_LOADER_URL_REPLACEMENT_95___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_95___);\nvar ___CSS_LOADER_URL_REPLACEMENT_96___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_96___);\nvar ___CSS_LOADER_URL_REPLACEMENT_97___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_97___);\nvar ___CSS_LOADER_URL_REPLACEMENT_98___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_98___);\nvar ___CSS_LOADER_URL_REPLACEMENT_99___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_99___);\nvar ___CSS_LOADER_URL_REPLACEMENT_100___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_100___);\nvar ___CSS_LOADER_URL_REPLACEMENT_101___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_101___);\nvar ___CSS_LOADER_URL_REPLACEMENT_102___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_102___);\nvar ___CSS_LOADER_URL_REPLACEMENT_103___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_103___);\nvar ___CSS_LOADER_URL_REPLACEMENT_104___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_104___);\nvar ___CSS_LOADER_URL_REPLACEMENT_105___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_105___);\nvar ___CSS_LOADER_URL_REPLACEMENT_106___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_106___);\nvar ___CSS_LOADER_URL_REPLACEMENT_107___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_107___);\nvar ___CSS_LOADER_URL_REPLACEMENT_108___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_108___);\nvar ___CSS_LOADER_URL_REPLACEMENT_109___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_109___);\nvar ___CSS_LOADER_URL_REPLACEMENT_110___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_110___);\nvar ___CSS_LOADER_URL_REPLACEMENT_111___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_111___);\nvar ___CSS_LOADER_URL_REPLACEMENT_112___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_112___);\nvar ___CSS_LOADER_URL_REPLACEMENT_113___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_113___);\nvar ___CSS_LOADER_URL_REPLACEMENT_114___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_114___);\nvar ___CSS_LOADER_URL_REPLACEMENT_115___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_115___);\nvar ___CSS_LOADER_URL_REPLACEMENT_116___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_116___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"h1,h2,h3,h4,h5,h6{font-weight:100}h1{font-size:30px}h2{font-size:27px}h3{font-size:16px}h4{font-size:14px}h5{font-size:12px}h6{font-size:10px}h3,h4,h5{margin-top:5px;font-weight:600}.nav>li>a{color:#fff;font-weight:600;padding:14px 20px 14px 25px}.nav.navbar-right>li>a{color:#291972;background:#fff}.nav>li.active>a{background-color:rgb(51.6822429907,31.0093457944,126.9906542056);color:#00ff5a;border-color:rgba(0,0,0,0)}.navbar-default .nav>li>a:hover,.navbar-default .nav>li>a:focus{background-color:rgb(51.6822429907,31.0093457944,126.9906542056);color:#00ff5a;border-color:rgba(0,0,0,0)}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background:#fff;background-color:rgba(0,0,0,0)}.nav.navbar-top-links>li>a:hover,.nav.navbar-top-links>li>a:focus{background-color:rgba(0,0,0,0)}.nav>li>a i{margin-right:6px}.navbar{border:0}.navbar-default{background-color:rgba(0,0,0,0);border-color:#c1c1c1}.navbar-top-links li{display:inline-block}.navbar-top-links li:last-child{margin-right:40px}.navbar-top-links li a{padding:14px 3px;min-height:50px}.dropdown-menu{border:medium none;border-radius:3px;box-shadow:0 0 3px rgba(86,96,117,.7);display:none;float:left;font-size:12px;left:0;list-style:none outside none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:1000}.dropdown-menu>li>a{border-radius:3px;color:inherit;line-height:25px;margin:4px;text-align:left;font-weight:normal}.dropdown-menu>li>a.font-bold{font-weight:600}.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{width:500px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.dropdown-messages,.dropdown-alerts{padding:10px 10px 10px 10px}.dropdown-messages li a,.dropdown-alerts li a{font-size:12px}.dropdown-messages li em,.dropdown-alerts li em{font-size:10px}.nav.navbar-top-links .dropdown-alerts a{font-size:12px}.nav-header{padding:5px 25px 33px 25px;background:image-url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") no-repeat}.nav-header .dropdown-menu{height:500px;overflow-y:scroll}.pace-done .nav-header{transition-duration:.5s}.nav>li.active{background:#242633;border-left:4px solid #00ff5a;color:#fff}.nav.nav-second-level>li.active{border:none;background:#242633;color:#fff}.nav.nav-second-level.collapse[style]{height:auto !important;color:#fff;background-color:#242633}.nav-header a{color:#dfe4ed}.nav-header .text-muted{color:#8095a8}.minimalize-styl-2{padding:4px 12px;margin:14px 5px 5px 20px;font-size:14px;float:left}.navbar-form-custom{float:left;height:50px;padding:0;width:200px;display:inline-table}.navbar-form-custom .form-group{margin-bottom:0}.nav.navbar-top-links a{font-size:14px}.navbar-form-custom .form-control{background:none repeat scroll 0 0 rgba(0,0,0,0);border:medium none;font-size:14px;height:60px;margin:0;z-index:1000;color:#121321}.count-info .label{line-height:12px;padding:2px 5px;position:absolute;right:6px;top:12px}.arrow{float:right}.mini-navbar .nav-second-level li>a>.arrow{display:inline-block !important}.fa.arrow:before{content:\\\"\\\"}.active>a>.fa.arrow:before{content:\\\"\\\"}.nav-third-level{overflow-y:scroll;max-height:185px}.nav-scroll{scrollbar-width:thin;scrollbar-color:#c2c4cc}.nav-scroll::-webkit-scrollbar{width:12px;border:1px solid #c2c4cc}.nav-scroll::-webkit-scrollbar-track{background:#c2c4cc}.nav-scroll::-webkit-scrollbar-thumb{background-color:#c2c4cc;border-radius:5px;border:1px solid #c2c4cc}.nav-second-level li,.nav-third-level li{border-bottom:none !important}.nav-second-level li a{color:#fff;background-color:#242633;padding:7px 10px 7px 10px;padding-left:52px;border-radius:4px}.nav-third-level li a{padding-left:62px}.nav-second-level li:last-child{margin-bottom:10px}.nav-third-level{overflow-y:scroll;max-height:165px}.nav-scroll{scrollbar-width:thin;scrollbar-color:#c2c4cc}.nav-scroll::-webkit-scrollbar{width:12px;border:1px solid #fff}.nav-scroll::-webkit-scrollbar-track{background:#c2c4cc}.nav-scroll::-webkit-scrollbar-thumb{background-color:#fff;border-radius:5px;border:3px solid #c2c4cc}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover>.nav-second-level,.mini-navbar .nav li:focus>.nav-second-level{display:block;border-radius:0 2px 2px 0;min-width:140px;height:auto}body.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:13px;border-radius:3px}.fixed-nav .slimScrollDiv #side-menu{padding-bottom:60px}.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.mini-navbar .nav-second-level{position:absolute;left:70px;top:0px;background-color:#242633;padding:10px 10px 10px 10px;font-size:13px}.canvas-menu.mini-navbar .nav-second-level{background:#242633}.mini-navbar li.active .nav-second-level{left:65px}.navbar-default .special_link a{background:#291972;color:#fff}.navbar-default .special_link a:hover{background:#17987e !important;color:#fff}.navbar-default .special_link a span.label{background:#fff;color:#291972}.navbar-default .landing_link a{background:rgb(45.5129496403,27.7517985612,126.5482014388);color:#fff}.navbar-default .landing_link a:hover{background:#291972 !important;color:#fff}.navbar-default .landing_link a span.label{background:#fff;color:rgb(45.5129496403,27.7517985612,126.5482014388)}.logo-element{text-align:center;font-size:18px;font-weight:600;color:#fff;display:none;padding:18px 0}.pace-done .navbar-static-side,.pace-done .nav-header,.pace-done li.active,.pace-done #page-wrapper,.pace-done .footer{-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s}.navbar-fixed-top{background:#fff;transition-duration:.5s;border-bottom:1px solid #c2c4cc !important;z-index:1030}.navbar-fixed-top,.navbar-static-top{background:#f3f3f4}.fixed-nav #wrapper{margin-top:0}body.fixed-nav #wrapper .navbar-static-side,body.fixed-nav #wrapper #page-wrapper{margin-top:60px}.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.body-small .navbar-fixed-top{margin-left:0px}body.mini-navbar .navbar-static-side{width:70px}body.mini-navbar .profile-element,body.mini-navbar .nav-label,body.mini-navbar .navbar-default .nav li a span{display:none}body.canvas-menu .profile-element{display:block}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level{display:none}body.mini-navbar .navbar-default .nav>li>a{font-size:16px}body.mini-navbar .logo-element{display:block}body.canvas-menu .logo-element{display:none}body.mini-navbar .nav-header{padding:0;background-color:#291972}body.canvas-menu .nav-header{padding:33px 25px}body.mini-navbar #page-wrapper{margin:0 0 0 70px}body.fixed-sidebar.mini-navbar .footer,body.canvas-menu.mini-navbar .footer{margin:0 0 0 0 !important}body.canvas-menu.mini-navbar #page-wrapper,body.canvas-menu.mini-navbar .footer{margin:0 0 0 0}body.fixed-sidebar .navbar-static-side,body.canvas-menu .navbar-static-side{position:fixed;width:220px;z-index:1001;height:100%}body.fixed-sidebar.mini-navbar .navbar-static-side{width:0px}body.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 0px}body.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 220px}body.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:220px}.fixed-sidebar.mini-navbar .nav li:focus>.nav-second-level,.canvas-menu.mini-navbar .nav li:focus>.nav-second-level{display:block;height:auto}body.canvas-menu.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:13px;border-radius:3px}.fixed-sidebar.mini-navbar .nav-second-level li a,.canvas-menu.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.fixed-sidebar.mini-navbar .nav-second-level,.canvas-menu.mini-navbar .nav-second-level{position:relative;padding:0;font-size:13px}.fixed-sidebar.mini-navbar li.active .nav-second-level,.canvas-menu.mini-navbar li.active .nav-second-level{left:0px}body.fixed-sidebar.mini-navbar .navbar-default .nav>li>a,body.canvas-menu.mini-navbar .navbar-default .nav>li>a{font-size:13px}body.fixed-sidebar.mini-navbar .nav-label,body.fixed-sidebar.mini-navbar .navbar-default .nav li a span,body.canvas-menu.mini-navbar .nav-label,body.canvas-menu.mini-navbar .navbar-default .nav li a span{display:inline}body.canvas-menu.mini-navbar .navbar-default .nav li .profile-element a span{display:block}.canvas-menu.mini-navbar .nav-second-level li a,.fixed-sidebar.mini-navbar .nav-second-level li a{padding:7px 10px 7px 52px}.fixed-sidebar.mini-navbar .nav-second-level,.canvas-menu.mini-navbar .nav-second-level{left:0px}body.canvas-menu nav.navbar-static-side{z-index:1001;background:#231556;height:100%;position:fixed;display:none}body.canvas-menu.mini-navbar nav.navbar-static-side{display:block;width:220px}.top-navigation #page-wrapper{margin-left:0}.top-navigation .navbar-nav .dropdown-menu>.active>a{background:#fff;color:#291972;font-weight:bold}.white-bg .navbar-fixed-top,.white-bg .navbar-static-top{background:#fff}.top-navigation .navbar{margin-bottom:0}.top-navigation .nav>li>a{padding:15px 20px;color:#676a6c}.top-navigation .nav>li a:hover,.top-navigation .nav>li a:focus{background:#fff;color:#291972}.top-navigation .nav>li.active{background:#fff;border:none}.top-navigation .nav>li.active>a{color:#291972}.top-navigation .navbar-right{margin-right:10px}.top-navigation .navbar-nav .dropdown-menu{box-shadow:none;border:1px solid #c2c4cc}.top-navigation .dropdown-menu>li>a{margin:0;padding:7px 20px}.navbar .dropdown-menu{margin-top:0px}.top-navigation .navbar-brand{background:#291972;color:#fff;padding:15px 25px}.top-navigation .navbar-top-links li:last-child{margin-right:0}.top-navigation.mini-navbar #page-wrapper,.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,.mini-navbar .top-navigation #page-wrapper,.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,.canvas-menu #page-wrapper{margin:0}.top-navigation.fixed-nav #wrapper,.fixed-nav #wrapper.top-navigation{margin-top:50px}.top-navigation .footer.fixed{margin-left:0 !important}.top-navigation .wrapper.wrapper-content{padding:40px}.top-navigation.body-small .wrapper.wrapper-content,.body-small .top-navigation .wrapper.wrapper-content{padding:40px 0px 40px 0px}.navbar-toggle{background-color:#291972;color:#fff;padding:6px 12px;font-size:14px}.top-navigation .navbar-nav .open .dropdown-menu>li>a,.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header{padding:10px 15px 10px 20px}@media(max-width: 768px){.top-navigation .navbar-header{display:block;float:none}}.menu-visible-lg,.menu-visible-md{display:none !important}@media(min-width: 1200px){.menu-visible-lg{display:block !important}}@media(min-width: 992px){.menu-visible-md{display:block !important}}@media(max-width: 767px){.menu-visible-md{display:block !important}.menu-visible-lg{display:block !important}}.btn{border-radius:20px}.float-e-margins .btn{margin-bottom:5px}.btn-w-m{min-width:120px}.btn-primary.btn-outline{color:#291972}.btn-success.btn-outline{color:#007138}.btn-info.btn-outline{color:#291972}.btn-warning.btn-outline{color:#ff8120}.btn-danger.btn-outline{color:#ba0003}.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-info.btn-outline:hover,.btn-warning.btn-outline:hover,.btn-danger.btn-outline:hover{color:#fff}.btn-primary{background-color:#291972;border-color:#291972;color:#fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary:active:focus,.btn-primary.active,.btn-primary.active:focus,.open .dropdown-toggle.btn-primary{background-color:#261769;border-color:#261769;color:#00ff5a}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary.active[disabled],fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{opacity:60%}.btn-success{background-color:#007138;border-color:#007138;color:#fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-color:rgb(0,97.7,48.417699115);border-color:rgb(0,97.7,48.417699115);color:#fff}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled]:active,.btn-success.active[disabled],fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:rgb(0,133.4,66.1097345133);border-color:rgb(0,133.4,66.1097345133)}.btn-info{background-color:#291972;border-color:#291972;color:#fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-color:rgb(36.4870503597,22.2482014388,101.4517985612);border-color:rgb(36.4870503597,22.2482014388,101.4517985612);color:#fff}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info.active[disabled],fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:rgb(255,221.1015873016,86.4);border-color:rgb(255,221.1015873016,86.4)}.btn-default{background-color:#291972;border-color:rgba(0,0,0,0);color:#fff}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:rgb(34.9827338129,21.3309352518,97.2690647482);color:#00ff5a}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default.active[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:rgb(47.0172661871,28.6690647482,130.7309352518)}.btn-warning{background-color:#ff8120;border-color:#ff8120;color:#fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-color:rgb(255,120.3551569507,16.7);border-color:rgb(255,120.3551569507,16.7);color:#fff}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning.active[disabled],fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:rgb(255,140.5264573991,52.4);border-color:rgb(255,140.5264573991,52.4)}.btn-danger{background-color:#ba0003;border-color:rgba(0,0,0,0);color:#fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:rgb(165.6,0,2.6709677419);color:#ffd5d6}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger.active[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:rgb(206.4,0,3.3290322581);border-color:rgb(206.4,0,3.3290322581)}.btn-link{color:inherit}.btn-link:hover,.btn-link:focus,.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{color:#121321;text-decoration:none}.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{background-image:none}.btn-link.disabled,.btn-link.disabled:hover,.btn-link.disabled:focus,.btn-link.disabled:active,.btn-link.disabled.active,.btn-link[disabled],.btn-link[disabled]:hover,.btn-link[disabled]:focus,.btn-link[disabled]:active,.btn-link.active[disabled],fieldset[disabled] .btn-link,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:active,fieldset[disabled] .btn-link.active{color:#cacaca}.btn-white{color:inherit;background:#fff;border:1px solid #c2c4cc}.btn-white:hover,.btn-white:focus,.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{color:inherit;border:1px solid #d2d2d2}.btn-white:active,.btn-white.active{box-shadow:0 2px 5px rgba(0,0,0,.15) inset}.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{background-image:none}.btn-white.disabled,.btn-white.disabled:hover,.btn-white.disabled:focus,.btn-white.disabled:active,.btn-white.disabled.active,.btn-white[disabled],.btn-white[disabled]:hover,.btn-white[disabled]:focus,.btn-white[disabled]:active,.btn-white.active[disabled],fieldset[disabled] .btn-white,fieldset[disabled] .btn-white:hover,fieldset[disabled] .btn-white:focus,fieldset[disabled] .btn-white:active,fieldset[disabled] .btn-white.active{color:#cacaca}.form-control,.form-control:focus,.has-error .form-control:focus,.has-success .form-control:focus,.has-warning .form-control:focus,.navbar-collapse,.navbar-form,.navbar-form-custom .form-control:focus,.navbar-form-custom .form-control:hover,.open .btn.dropdown-toggle,.panel,.popover,.progress,.progress-bar{box-shadow:none}.btn-outline{color:inherit;background-color:rgba(0,0,0,0);transition:all .5s}.btn-rounded{border-radius:50px}.btn-large-dim{width:90px;height:90px;font-size:42px}button.dim{display:inline-block;color:#fff;text-decoration:none;text-transform:uppercase;text-align:center;padding-top:6px;margin-right:10px;position:relative;cursor:pointer;border-radius:5px;font-weight:600;margin-bottom:20px !important}button.dim:active{top:3px}button.btn-primary.dim{box-shadow:inset 0px 0px 0px rgb(31.9741007194,19.4964028777,88.9035971223),0px 5px 0px 0px rgb(31.9741007194,19.4964028777,88.9035971223),0px 10px 5px #999}button.btn-primary.dim:active{box-shadow:inset 0px 0px 0px rgb(31.9741007194,19.4964028777,88.9035971223),0px 2px 0px 0px rgb(31.9741007194,19.4964028777,88.9035971223),0px 5px 3px #999}button.btn-default.dim{box-shadow:inset 0px 0px 0px rgb(178.7,178.7,178.7),0px 5px 0px 0px rgb(178.7,178.7,178.7),0px 10px 5px #999}button.btn-default.dim:active{box-shadow:inset 0px 0px 0px rgb(178.7,178.7,178.7),0px 2px 0px 0px rgb(178.7,178.7,178.7),0px 5px 3px #999}button.btn-warning.dim{box-shadow:inset 0px 0px 0px rgb(255,111.7103139013,1.4),0px 5px 0px 0px rgb(255,111.7103139013,1.4),0px 10px 5px #999}button.btn-warning.dim:active{box-shadow:inset 0px 0px 0px rgb(255,111.7103139013,1.4),0px 2px 0px 0px rgb(255,111.7103139013,1.4),0px 5px 3px #999}button.btn-info.dim{box-shadow:inset 0px 0px 0px rgb(255,210.8476190476,35.4),0px 5px 0px 0px rgb(255,210.8476190476,35.4),0px 10px 5px #999}button.btn-info.dim:active{box-shadow:inset 0px 0px 0px rgb(255,210.8476190476,35.4),0px 2px 0px 0px rgb(255,210.8476190476,35.4),0px 5px 3px #999}button.btn-success.dim{box-shadow:inset 0px 0px 0px rgb(0,82.4,40.8353982301),0px 5px 0px 0px rgb(0,82.4,40.8353982301),0px 10px 5px #999}button.btn-success.dim:active{box-shadow:inset 0px 0px 0px rgb(0,82.4,40.8353982301),0px 2px 0px 0px rgb(0,82.4,40.8353982301),0px 5px 3px #999}button.btn-danger.dim{box-shadow:inset 0px 0px 0px rgb(155.4,0,2.5064516129),0px 5px 0px 0px rgb(155.4,0,2.5064516129),0px 10px 5px #999}button.btn-danger.dim:active{box-shadow:inset 0px 0px 0px rgb(155.4,0,2.5064516129),0px 2px 0px 0px rgb(155.4,0,2.5064516129),0px 5px 3px #999}button.dim:before{font-size:50px;line-height:1em;font-weight:normal;color:#fff;display:block;padding-top:10px}button.dim:active:before{top:7px;font-size:50px}.label{background-color:#eeeff2;color:#121321;border:1px solid #121321;font-family:\\\"Manrope\\\";font-size:10px;padding:4px 10px;border-radius:8px;text-shadow:none}.badge{background-color:#eeeff2;color:#121321;border:1px solid #121321;font-family:\\\"Manrope\\\";font-size:11px;font-weight:600;padding-bottom:4px;padding-left:6px;padding-right:6px;text-shadow:none}.label-primary,.badge-primary{background-color:#291972;color:#fff;border:1px solid #231556}.label-success,.badge-success{background-color:#bafcd4;color:#007138;border:1px solid #007138}.label-warning,.badge-warning{background-color:#ffd7b8;color:#820;border:1px solid #ff8120}.label-warning-light,.badge-warning-light{background-color:#ffd7b8;color:#820;border:1px solid #ff8120}.label-danger,.badge-danger{background-color:#ffd5d6;color:#ba0003;border:1px solid #f91d21}.label-info,.badge-info{background-color:#fff0be;color:#664b00;border:1px solid #ffd942}.label-inverse,.badge-inverse{background-color:#262626;color:#fff}.label-white,.badge-white{background-color:#fff;color:#5e5e5e}.label-white,.badge-disable{background-color:#2a2e36;color:#8b91a0}.onoffswitch{position:relative;width:64px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #291972;border-radius:2px}.onoffswitch-inner{width:200%;margin-left:-100%;-moz-transition:margin .3s ease-in 0s;-webkit-transition:margin .3s ease-in 0s;-o-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:20px;padding:0;line-height:20px;font-size:12px;color:#fff;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.onoffswitch-inner:before{content:\\\"ON\\\";padding-left:10px;background-color:#291972;color:#fff}.onoffswitch-inner:after{content:\\\"OFF\\\";padding-right:10px;background-color:#fff;color:#999;text-align:right}.onoffswitch-switch{width:20px;margin:0px;background:#fff;border:2px solid #291972;border-radius:2px;position:absolute;top:0;bottom:0;right:44px;-moz-transition:all .3s ease-in 0s;-webkit-transition:all .3s ease-in 0s;-o-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0px}.chosen-container-single .chosen-single{background:#fff;box-shadow:none;-moz-box-sizing:border-box;background-color:#fff;border:1px solid #cbd5dd;border-radius:2px;cursor:text;height:auto !important;margin:0;min-height:30px;overflow:hidden;padding:4px 12px;position:relative;width:100%}.chosen-container-multi .chosen-choices li.search-choice{background:#f1f1f1;border:1px solid #ededed;border-radius:2px;box-shadow:none;color:#333;cursor:default;line-height:13px;margin:3px 0 3px 5px;padding:3px 20px 3px 5px;position:relative}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{color:#fff;background-color:#291972;border-color:#291972;cursor:default;z-index:2}.pagination>li>a,.pagination>li>span{background-color:#fff;border:1px solid #ddd;color:inherit;float:left;line-height:1.42857;margin-left:-1px;padding:4px 10px;position:relative;text-decoration:none}.tooltip-inner{background-color:#291972}.tooltip.top .tooltip-arrow{border-top-color:#2f4050}.tooltip.right .tooltip-arrow{border-right-color:#2f4050}.tooltip.bottom .tooltip-arrow{border-bottom-color:#2f4050}.tooltip.left .tooltip-arrow{border-left-color:#2f4050}.easypiechart{position:relative;text-align:center}.easypiechart .h2{margin-left:10px;margin-top:10px;display:inline-block}.easypiechart canvas{top:0;left:0}.easypiechart .easypie-text{line-height:1;position:absolute;top:33px;width:100%;z-index:1}.easypiechart img{margin-top:-4px}.jqstooltip{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-state-default{background-color:#fff;background-image:none;background-repeat:repeat-x;box-shadow:none;color:#333;text-shadow:none}.fc-state-default{border:1px solid}.fc-button{color:inherit;border:1px solid #c2c4cc;cursor:pointer;display:inline-block;height:1.9em;line-height:1.9em;overflow:hidden;padding:0 .6em;position:relative;white-space:nowrap}.fc-state-active{background-color:#291972;border-color:#291972;color:#fff}.fc-header-title h2{font-size:16px;font-weight:600;color:inherit}.fc-content .fc-widget-header,.fc-content .fc-widget-content{border-color:#c2c4cc;font-weight:normal}.fc-border-separate tbody{background-color:#f8f8f8}.fc-state-highlight{background:none repeat scroll 0 0 #fcf8e3}.external-event{padding:5px 10px;border-radius:2px;cursor:pointer;margin-bottom:5px}.fc-ltr .fc-event-hori.fc-event-end,.fc-rtl .fc-event-hori.fc-event-start{border-radius:2px}.fc-event,.fc-agenda .fc-event-time,.fc-event a{padding:4px 6px;background-color:#291972;border-color:#291972}.fc-event-time,.fc-event-title{color:#717171;padding:0 1px}.ui-calendar .fc-event-time,.ui-calendar .fc-event-title{color:#fff}.chat-activity-list .chat-element{border-bottom:1px solid #c2c4cc}.chat-element:first-child{margin-top:0}.chat-element{padding-bottom:15px}.chat-element,.chat-element .media{margin-top:15px}.chat-element,.media-body{overflow:hidden}.chat-element .media-body{display:block}.media-body{display:block}.chat-element>.pull-left{margin-right:10px}.chat-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.chat-element .well{border:1px solid #c2c4cc;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.chat-element .actions{margin-top:10px}.chat-element .photos{margin:10px 0}.right.chat-element>.pull-right{margin-left:10px}.chat-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.chat{margin:0;padding:0;list-style:none}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #b3a9a9}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0;color:#777}.panel .slidedown .glyphicon,.chat .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{background-color:#291972;border-color:#291972;color:#fff;z-index:2}.list-group-item-heading{margin-top:10px;color:#231556}.list-group-item-text{margin:0 0 10px;color:#231556;font-size:12px;line-height:inherit}.no-padding .list-group-item{border-left:none;border-right:none;border-bottom:none}.no-padding .list-group-item:first-child{border-left:none;border-right:none;border-bottom:none;border-top:none}.no-padding .list-group{margin-bottom:0}.list-group-item{background-color:inherit;border:1px solid #c2c4cc;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.elements-list .list-group-item{border-left:none;border-right:none;padding:15px 25px}.elements-list .list-group-item:first-child{border-left:none;border-right:none;border-top:none !important}.elements-list .list-group{margin-bottom:0}.elements-list a{color:inherit}.elements-list .list-group-item.active,.elements-list .list-group-item:hover{background:#f3f3f4;color:inherit;border-color:#c2c4cc;border-radius:0}.elements-list li.active{transition:none}.element-detail-box{padding:25px}.flot-chart{display:block;height:200px}.widget .flot-chart.dashboard-chart{display:block;height:120px;margin-top:40px}.flot-chart.dashboard-chart{display:block;height:180px;margin-top:40px}.flot-chart-content{width:100%;height:100%}.flot-chart-pie-content{width:200px;height:200px;margin:auto}.jqstooltip{position:absolute;display:block;left:0px;top:0px;visibility:hidden;background:#2b303a;background-color:rgba(43,48,58,.8);color:#fff;text-align:left;white-space:nowrap;z-index:10000;padding:5px 5px 5px 5px;min-height:22px;border-radius:3px}.jqsfield{color:#fff;text-align:left}.h-200{min-height:200px}.legendLabel{padding-left:5px}.stat-list li:first-child{margin-top:0}.stat-list{list-style:none;padding:0;margin:0}.stat-percent{float:right}.stat-list li{margin-top:15px;position:relative}table.dataTable thead .sorting,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background:rgba(0,0,0,0)}table.dataTable thead .sorting_asc:after{float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:\\\"\\\";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:\\\"\\\";float:right;font-family:fontawesome;color:rgba(50,50,50,.5)}.dataTables_wrapper{padding-bottom:30px}.img-circle{border-radius:50%}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.42857}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^=col-]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee !important}.show-grid{margin:15px 0}.css-animation-box h1{font-size:44px}.animation-efect-links a{padding:4px 6px;font-size:12px}#animation_box{background-color:#f9f8f8;border-radius:16px;width:80%;margin:0 auto;padding-top:80px}.animation-text-box{position:absolute;margin-top:40px;left:50%;margin-left:-100px;width:200px}.animation-text-info{position:absolute;margin-top:-60px;left:50%;margin-left:-100px;width:200px;font-size:10px}.animation-text-box h2{font-size:54px;font-weight:600;margin-bottom:5px}.animation-text-box p{font-size:12px;text-transform:uppercase}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#291972;position:fixed;z-index:2000;top:0;right:100%;width:100%;height:2px}.pace-inactive{display:none}.widget{border-radius:4px;padding:15px 20px;margin-bottom:10px;margin-top:10px}.widget.style1 h2{font-size:30px}.widget h2,.widget h3{margin-top:5px;margin-bottom:0}.widget-text-box{padding:20px;border:1px solid #c2c4cc;background:#fff}.widget-head-color-box{border-radius:5px 5px 0px 0px;margin-top:10px}.widget .flot-chart{height:100px}.vertical-align div{display:inline-block;vertical-align:middle}.vertical-align h2,.vertical-align h3{margin:0}.todo-list{list-style:none outside none;margin:0;padding:0;font-size:14px}.todo-list.small-list{font-size:12px}.todo-list.small-list>li{background:#f3f3f4;border-left:none;border-right:none;border-radius:4px;color:inherit;margin-bottom:2px;padding:6px 6px 6px 12px}.todo-list.small-list .btn-xs,.todo-list.small-list .btn-group-xs>.btn{border-radius:5px;font-size:10px;line-height:1.5;padding:1px 2px 1px 5px}.todo-list>li{background:#f3f3f4;border-left:6px solid #c2c4cc;border-right:6px solid #c2c4cc;border-radius:4px;color:inherit;margin-bottom:2px;padding:10px}.todo-list .handle{cursor:move;display:inline-block;font-size:16px;margin:0 5px}.todo-list>li .label{font-size:9px;margin-left:10px}.check-link{font-size:16px}.todo-completed{text-decoration:line-through}.geo-statistic h1{font-size:36px;margin-bottom:0}.glyphicon.fa{font-family:\\\"FontAwesome\\\"}.inline{display:inline-block !important}.input-s-sm{width:120px}.input-s{width:200px}.input-s-lg{width:250px}.i-checks{padding-left:0}.form-control,.single-line{background-color:#fff;background-image:none;border:1px solid #e5e6e7;border-radius:1px;color:inherit;display:block;padding:6px 12px;transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;width:100%}.form-control:focus,.single-line:focus{border-color:#291972 !important}.has-success .form-control{border-color:#291972}.has-warning .form-control{border-color:#ff8120}.has-error .form-control{border-color:#ba0003}.has-success .control-label{color:#291972}.has-warning .control-label{color:#ff8120}.has-error .control-label{color:#ba0003}.input-group-addon{background-color:#fff;border:1px solid #c2c4cc;border-radius:4px;color:inherit;font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center}.spinner-buttons.input-group-btn .btn-xs{line-height:1.13}.spinner-buttons.input-group-btn{width:20%}.noUi-connect{background:none repeat scroll 0 0 #291972;box-shadow:none}.slider_red .noUi-connect{background:none repeat scroll 0 0 #ba0003;box-shadow:none}.ui-sortable .ibox-title{cursor:move}.ui-sortable-placeholder{border:1px dashed #cecece !important;visibility:visible !important;background:#c2c4cc}.ibox.ui-sortable-placeholder{margin:0px 0px 23px !important}.onoffswitch{position:relative;width:54px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:3px}.onoffswitch-inner{display:block;width:200%;margin-left:-100%;-moz-transition:margin .3s ease-in 0s;-webkit-transition:margin .3s ease-in 0s;-o-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:16px;padding:0;line-height:16px;font-size:10px;color:#fff;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.onoffswitch-inner:before{content:\\\"ON\\\";padding-left:7px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:\\\"OFF\\\";padding-right:7px;background-color:#fff;color:#919191;text-align:right}.onoffswitch-switch{display:block;width:18px;margin:0px;background:#fff;border:2px solid #1ab394;border-radius:3px;position:absolute;top:0;bottom:0;right:36px;-moz-transition:all .3s ease-in 0s;-webkit-transition:all .3s ease-in 0s;-o-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0px}.ui-jqgrid{-moz-box-sizing:content-box}.ui-jqgrid-btable{border-collapse:separate}.ui-jqgrid-htable{border-collapse:separate}.ui-jqgrid-titlebar{height:40px;line-height:15px;color:#676a6c;background-color:#f9f9f9;text-shadow:0 1px 0 hsla(0,0%,100%,.5)}.ui-jqgrid .ui-jqgrid-title{float:left;margin:1.1em 1em .2em}.ui-jqgrid .ui-jqgrid-titlebar{position:relative;border-left:0px solid;border-right:0px solid;border-top:0px solid}.ui-widget-header{background:none;background-image:none;background-color:#f5f5f6;text-transform:uppercase;border-top-left-radius:0px;border-top-right-radius:0px}.ui-jqgrid tr.ui-row-ltr td{border-right-color:inherit;border-right-style:solid;border-right-width:1px;text-align:left;border-color:#ddd;background-color:inherit}.ui-search-toolbar input[type=text]{font-size:12px;height:15px;border:1px solid #ccc;border-radius:0px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#f9f9f9;border:1px solid #ddd;line-height:15px;font-weight:bold;color:#676a6c;text-shadow:0 1px 0 hsla(0,0%,100%,.5)}.ui-widget-content{box-sizing:content-box}.ui-icon-triangle-1-n{background-position:1px -16px}.ui-jqgrid tr.ui-search-toolbar th{border-top-width:0px !important;border-top-color:inherit !important;border-top-style:ridge !important}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{background:#f5f5f5;border-collapse:separate}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{background:#f2fbff}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #ddd;background:#fff;font-weight:normal;color:#212121}.ui-jqgrid .ui-pg-input{font-size:inherit;width:50px;border:1px solid #ccc;height:15px}.ui-jqgrid .ui-pg-selbox{display:block;font-size:1em;height:25px;line-height:18px;margin:0;width:auto}.ui-jqgrid .ui-pager-control{position:relative}.ui-jqgrid .ui-jqgrid-pager{height:32px;position:relative}.ui-pg-table .navtable .ui-corner-all{border-radius:0px}.ui-jqgrid .ui-pg-button:hover{padding:1px;border:0px}.ui-jqgrid .loading{position:absolute;top:45%;left:45%;width:auto;height:auto;z-index:101;padding:6px;margin:5px;text-align:center;font-weight:bold;display:none;border-width:2px !important;font-size:11px}.ui-jqgrid .form-control{height:10px;width:auto;display:inline;padding:10px 12px}.ui-jqgrid-pager{height:32px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:0}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:0}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:0}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:0}.ui-widget-content{border:1px solid #ddd}.ui-jqgrid .ui-jqgrid-titlebar{padding:0}.ui-jqgrid .ui-jqgrid-titlebar{border-bottom:1px solid #ddd}.ui-jqgrid tr.jqgrow td{padding:6px}.ui-jqdialog .ui-jqdialog-titlebar{padding:10px 10px}.ui-jqdialog .ui-jqdialog-title{float:none !important}.ui-jqdialog>.ui-resizable-se{position:absolute}.dd{position:relative;display:block;margin:0;padding:0;list-style:none;font-size:13px;line-height:20px}.dd-list{display:block;position:relative;margin:0;padding:0;list-style:none}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-item,.dd-empty,.dd-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;font-size:13px;line-height:20px}.dd-handle{display:block;margin:5px 0;padding:5px 10px;color:#333;text-decoration:none;border:1px solid #c2c4cc;background:#f5f5f5;-webkit-border-radius:3px;border-radius:3px;box-sizing:border-box;-moz-box-sizing:border-box}.dd-handle span{font-weight:bold}.dd-handle:hover{background:#f0f0f0;cursor:pointer;font-weight:bold}.dd-item>button{display:block;position:relative;cursor:pointer;float:left;width:25px;height:20px;margin:5px 0;padding:0;text-indent:100%;white-space:nowrap;overflow:hidden;border:0;background:rgba(0,0,0,0);font-size:12px;line-height:1;text-align:center;font-weight:bold}.dd-item>button:before{content:\\\"+\\\";display:block;position:absolute;width:100%;text-align:center;text-indent:0}.dd-item>button[data-action=collapse]:before{content:\\\"-\\\"}#nestable2 .dd-item>button{font-family:FontAwesome;height:34px;width:33px;color:#c1c1c1}#nestable2 .dd-item>button:before{content:\\\"\\\"}#nestable2 .dd-item>button[data-action=collapse]:before{content:\\\"\\\"}.dd-placeholder,.dd-empty{margin:5px 0;padding:0;min-height:30px;background:#f2fbff;border:1px dashed #b6bcbf;box-sizing:border-box;-moz-box-sizing:border-box}.dd-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white),-webkit-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white);background-image:-moz-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white),-moz-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white);background-image:linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white),linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white);background-size:60px 60px;background-position:0 0,30px 30px}.dd-dragel{position:absolute;z-index:9999;pointer-events:none}.dd-dragel>.dd-item .dd-handle{margin-top:0}.dd-dragel .dd-handle{-webkit-box-shadow:2px 4px 6px 0 rgba(0,0,0,.1);box-shadow:2px 4px 6px 0 rgba(0,0,0,.1)}.nestable-lists{display:block;clear:both;padding:30px 0;width:100%;border:0;border-top:2px solid #ddd;border-bottom:2px solid #ddd}#nestable-menu{padding:0;margin:10px 0 20px 0}#nestable-output,#nestable2-output{width:100%;font-size:.75em;line-height:1.33333em;font-family:open sans,lucida grande,lucida sans unicode,helvetica,arial,sans-serif;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box}#nestable2 .dd-handle{color:inherit;border:1px dashed #c2c4cc;background:#f3f3f4;padding:10px}#nestable2 span.label{margin-right:10px}#nestable-output,#nestable2-output{font-size:12px;padding:25px;box-sizing:border-box;-moz-box-sizing:border-box}.CodeMirror{border:1px solid #eee;height:auto}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.google-map{height:300px}label.error{color:#cc5965;display:inline-block;margin-left:5px}.form-control.error{border:1px dotted #cc5965}.gridStyle{border:1px solid #d4d4d4;width:100%;height:400px}.gridStyle2{border:1px solid #d4d4d4;width:500px;height:300px}.ngHeaderCell{border-right:none;border-bottom:1px solid #c2c4cc}.ngCell{border-right:none}.ngTopPanel{background:#f5f5f6}.ngRow.even{background:#f9f9f9}.ngRow.selected{background:#ebf2f1}.ngRow{border-bottom:1px solid #c2c4cc}.ngCell{background-color:rgba(0,0,0,0)}.ngHeaderCell{border-right:none}#toast-container>.toast{background-image:none !important}#toast-container>.toast:before{position:fixed;font-family:FontAwesome;font-size:24px;line-height:24px;float:left;color:#fff;padding-right:.5em;margin:auto .5em auto -1.5em}#toast-container>.toast-warning:before{content:\\\"\\\"}#toast-container>.toast-error:before{content:\\\"\\\"}#toast-container>.toast-info:before{content:\\\"\\\"}#toast-container>.toast-success:before{content:\\\"\\\"}#toast-container>div{-moz-box-shadow:0 0 3px #999;-webkit-box-shadow:0 0 3px #999;box-shadow:0 0 3px #999;opacity:.9;-ms-filter:alpha(Opacity=90);filter:alpha(opacity=90)}#toast-container>:hover{-moz-box-shadow:0 0 4px #999;-webkit-box-shadow:0 0 4px #999;box-shadow:0 0 4px #999;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}.toast{background-color:#291972}.toast-success{background-color:#291972}.toast-error{background-color:#ba0003}.toast-info{background-color:#ffd942}.toast-warning{background-color:#ff8120}.toast-top-full-width{margin-top:20px}.toast-bottom-full-width{margin-bottom:20px}.cg-notify-message.inspinia-notify{background:#fff;padding:0;box-shadow:0 0 1px rgba(0,0,0,.1),0 2px 4px rgba(0,0,0,.2);-webkit-box-shadow:0 0 1 px rgba(0,0,0,.1),0 2 px 4 px rgba(0,0,0,.2);-moz-box-shadow:0 0 1 px rgba(0,0,0,.1),0 2 px 4 px rgba(0,0,0,.2);border:none;margin-top:30px;color:inherit}.inspinia-notify.alert-warning{border-left:6px solid #ff8120}.inspinia-notify.alert-success{border-left:6px solid #007138}.inspinia-notify.alert-danger{border-left:6px solid #ba0003}.inspinia-notify.alert-info{border-left:6px solid #291972}.img-container,.img-preview{overflow:hidden;text-align:center;width:100%}.img-preview-sm{height:130px;width:200px}.forum-post-container .media{margin:10px 10px 10px 10px;padding:20px 10px 20px 10px;border-bottom:1px solid #f1f1f1}.forum-avatar{float:left;margin-right:20px;text-align:center;width:110px}.forum-avatar .img-circle{height:48px;width:48px}.author-info{color:#676a6c;font-size:11px;margin-top:5px;text-align:center}.forum-post-info{padding:9px 12px 6px 12px;background:#f9f9f9;border:1px solid #f1f1f1}.media-body>.media{background:#f9f9f9;border-radius:3px;border:1px solid #f1f1f1}.forum-post-container .media-body .photos{margin:10px 0}.forum-photo{max-width:140px;border-radius:3px}.media-body>.media .forum-avatar{width:70px;margin-right:10px}.media-body>.media .forum-avatar .img-circle{height:38px;width:38px}.mid-icon{font-size:66px}.forum-item{margin:10px 0;padding:10px 0 20px;border-bottom:1px solid #f1f1f1}.views-number{font-size:24px;line-height:18px;font-weight:400}.forum-container,.forum-post-container{padding:30px !important}.forum-item small{color:#999}.forum-item .forum-sub-title{color:#999;margin-left:50px}.forum-title{margin:15px 0 15px 0}.forum-info{text-align:center}.forum-desc{color:#999}.forum-icon{float:left;width:30px;margin-right:20px;text-align:center}a.forum-item-title{color:inherit;display:block;font-size:18px;font-weight:600}a.forum-item-title:hover{color:inherit}.forum-icon .fa{font-size:30px;margin-top:8px;color:#9b9b9b}.forum-item.active .fa{color:#291972}.forum-item.active a.forum-item-title{color:#291972}@media(max-width: 992px){.forum-info{margin:15px 0 10px 0px;display:none}.forum-desc{float:none !important}}.vertical-container{width:90%;max-width:1170px;margin:0 auto}.vertical-container::after{content:\\\"\\\";display:table;clear:both}#vertical-timeline{position:relative;padding:0;margin-top:2em;margin-bottom:2em}#vertical-timeline::before{content:\\\"\\\";position:absolute;top:0;left:18px;height:100%;width:4px;background:#f1f1f1}.vertical-timeline-content .btn{float:right}#vertical-timeline.light-timeline:before{background:#e7eaec}.dark-timeline .vertical-timeline-content:before{border-color:rgba(0,0,0,0) #f5f5f5 rgba(0,0,0,0) rgba(0,0,0,0)}.dark-timeline.center-orientation .vertical-timeline-content:before{border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #f5f5f5}.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before{border-color:rgba(0,0,0,0) #f5f5f5 rgba(0,0,0,0) rgba(0,0,0,0)}.dark-timeline .vertical-timeline-content,.dark-timeline.center-orientation .vertical-timeline-content{background:#f5f5f5}@media only screen and (min-width: 1170px){#vertical-timeline.center-orientation{margin-top:3em;margin-bottom:3em}#vertical-timeline.center-orientation:before{left:50%;margin-left:-2px}}@media only screen and (max-width: 1170px){.center-orientation.dark-timeline .vertical-timeline-content:before{border-color:rgba(0,0,0,0) #f5f5f5 rgba(0,0,0,0) rgba(0,0,0,0)}}.vertical-timeline-block{position:relative;margin:2em 0}.vertical-timeline-block:after{content:\\\"\\\";display:table;clear:both}.vertical-timeline-block:first-child{margin-top:0}.vertical-timeline-block:last-child{margin-bottom:0}@media only screen and (min-width: 1170px){.center-orientation .vertical-timeline-block{margin:4em 0}.center-orientation .vertical-timeline-block:first-child{margin-top:0}.center-orientation .vertical-timeline-block:last-child{margin-bottom:0}}.vertical-timeline-icon{position:absolute;top:0;left:0;width:40px;height:40px;border-radius:50%;font-size:16px;border:3px solid #f1f1f1;text-align:center}.vertical-timeline-icon i{display:block;width:24px;height:24px;position:relative;left:50%;top:50%;margin-left:-12px;margin-top:-9px}@media only screen and (min-width: 1170px){.center-orientation .vertical-timeline-icon{width:50px;height:50px;left:50%;margin-left:-25px;-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;font-size:19px}.center-orientation .vertical-timeline-icon i{margin-left:-12px;margin-top:-10px}.center-orientation .cssanimations .vertical-timeline-icon.is-hidden{visibility:hidden}}.vertical-timeline-content{position:relative;margin-left:60px;background:#fff;border-radius:.25em;padding:1em}.vertical-timeline-content:after{content:\\\"\\\";display:table;clear:both}.vertical-timeline-content h2{font-weight:400;margin-top:4px}.vertical-timeline-content p{margin:1em 0;line-height:1.6}.vertical-timeline-content .vertical-date{float:left;font-weight:500}.vertical-date small{color:#291972;font-weight:400}.vertical-timeline-content::before{content:\\\"\\\";position:absolute;top:16px;right:100%;height:0;width:0;border:7px solid rgba(0,0,0,0);border-right:7px solid #fff}@media only screen and (min-width: 768px){.vertical-timeline-content h2{font-size:18px}.vertical-timeline-content p{font-size:13px}}@media only screen and (min-width: 1170px){.center-orientation .vertical-timeline-content{margin-left:0;padding:1.6em;width:45%}.center-orientation .vertical-timeline-content::before{top:24px;left:100%;border-color:rgba(0,0,0,0);border-left-color:#fff}.center-orientation .vertical-timeline-content .btn{float:left}.center-orientation .vertical-timeline-content .vertical-date{position:absolute;width:100%;left:122%;top:2px;font-size:14px}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before{top:24px;left:auto;right:100%;border-color:rgba(0,0,0,0);border-right-color:#fff}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date{left:auto;right:122%;text-align:right}.center-orientation .cssanimations .vertical-timeline-content.is-hidden{visibility:hidden}}.tabs-container .panel-body{background:#fff;border:1px solid #c2c4cc;border-radius:2px;padding:20px;position:relative}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #c2c4cc;border-bottom-color:rgba(0,0,0,0);background-color:#fff}.tabs-container .nav-tabs>li{float:left;margin-bottom:-1px}.tabs-container .tab-pane .panel-body{border-top:none}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #c2c4cc;border-bottom-color:rgba(0,0,0,0)}.tabs-container .nav-tabs{border-bottom:1px solid #c2c4cc}.tabs-container .tab-pane .panel-body{border-top:none}.tabs-container .tabs-left .tab-pane .panel-body,.tabs-container .tabs-right .tab-pane .panel-body{border-top:1px solid #c2c4cc}.tabs-container .nav-tabs>li a:hover{background:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.tabs-container .tabs-below>.nav-tabs,.tabs-container .tabs-right>.nav-tabs,.tabs-container .tabs-left>.nav-tabs{border-bottom:0}.tabs-container .tabs-left .panel-body{position:static}.tabs-container .tabs-left>.nav-tabs,.tabs-container .tabs-right>.nav-tabs{width:20%}.tabs-container .tabs-left .panel-body{width:80%;margin-left:20%}.tabs-container .tabs-right .panel-body{width:80%;margin-right:20%}.tabs-container .tab-content>.tab-pane,.tabs-container .pill-content>.pill-pane{display:none}.tabs-container .tab-content>.active,.tabs-container .pill-content>.active{display:block}.tabs-container .tabs-below>.nav-tabs{border-top:1px solid #c2c4cc}.tabs-container .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-container .tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-container .tabs-below>.nav-tabs>li>a:hover,.tabs-container .tabs-below>.nav-tabs>li>a:focus{border-top-color:#c2c4cc;border-bottom-color:rgba(0,0,0,0)}.tabs-container .tabs-left>.nav-tabs>li,.tabs-container .tabs-right>.nav-tabs>li{float:none}.tabs-container .tabs-left>.nav-tabs>li>a,.tabs-container .tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-container .tabs-left>.nav-tabs{float:left;margin-right:19px}.tabs-container .tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-container .tabs-left>.nav-tabs .active>a,.tabs-container .tabs-left>.nav-tabs .active>a:hover,.tabs-container .tabs-left>.nav-tabs .active>a:focus{border-color:#c2c4cc rgba(0,0,0,0) #c2c4cc #c2c4cc;*border-right-color:#fff}.tabs-container .tabs-right>.nav-tabs{float:right;margin-left:19px}.tabs-container .tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-container .tabs-right>.nav-tabs .active>a,.tabs-container .tabs-right>.nav-tabs .active>a:hover,.tabs-container .tabs-right>.nav-tabs .active>a:focus{border-color:#c2c4cc #c2c4cc #c2c4cc rgba(0,0,0,0);*border-left-color:#fff;z-index:1}.jvectormap-container{width:100%;height:100%;position:relative;overflow:hidden}.jvectormap-tip{position:absolute;display:none;border:solid 1px #cdcdcd;border-radius:3px;background:#292929;color:#fff;font-family:sans-serif,Verdana;font-size:smaller;padding:5px}.jvectormap-zoomin,.jvectormap-zoomout,.jvectormap-goback{position:absolute;left:10px;border-radius:3px;background:#291972;padding:3px;color:#fff;cursor:pointer;line-height:10px;text-align:center;box-sizing:content-box}.jvectormap-zoomin,.jvectormap-zoomout{width:10px;height:10px}.jvectormap-zoomin{top:10px}.jvectormap-zoomout{top:30px}.jvectormap-goback{bottom:10px;z-index:1000;padding:6px}.jvectormap-spinner{position:absolute;left:0;top:0;right:0;bottom:0;background:center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==)}.jvectormap-legend-title{font-weight:bold;font-size:14px;text-align:center}.jvectormap-legend-cnt{position:absolute}.jvectormap-legend-cnt-h{bottom:0;right:0}.jvectormap-legend-cnt-v{top:0;right:0}.jvectormap-legend{background:#000;color:#fff;border-radius:3px}.jvectormap-legend-cnt-h .jvectormap-legend{float:left;margin:0 10px 10px 0;padding:3px 3px 1px 3px}.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick{float:left}.jvectormap-legend-cnt-v .jvectormap-legend{margin:10px 10px 0 0;padding:3px}.jvectormap-legend-cnt-h .jvectormap-legend-tick{width:40px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample{height:15px}.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample{height:20px;width:20px;display:inline-block;vertical-align:middle}.jvectormap-legend-tick-text{font-size:12px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-text{text-align:center}.jvectormap-legend-cnt-v .jvectormap-legend-tick-text{display:inline-block;vertical-align:middle;line-height:20px;padding-left:3px}.sidebard-panel{width:220px;background:hsl(240,4.347826087%,92.4901960784%);padding:10px 20px;position:absolute;right:0}.sidebard-panel .feed-element img.img-circle{width:32px;height:32px}.sidebard-panel .feed-element,.media-body,.sidebard-panel p{font-size:12px}.sidebard-panel .feed-element{margin-top:20px;padding-bottom:0}.sidebard-panel .list-group{margin-bottom:10px}.sidebard-panel .list-group .list-group-item{padding:5px 0;font-size:12px;border:0}.sidebar-content .wrapper{padding-right:230px}.sidebar-content .wrapper,.wrapper.sidebar-content{padding-right:230px !important}.body-small .sidebar-content .wrapper,.body-small .wrapper.sidebar-content{padding-right:20px !important}#right-sidebar{background-color:#fff;border-left:1px solid #c2c4cc;border-top:1px solid #c2c4cc;overflow:hidden;position:fixed;top:60px;width:260px !important;z-index:1009;bottom:0;right:-260px}#right-sidebar.sidebar-open{right:0}#right-sidebar.sidebar-open.sidebar-top{top:0;border-top:none}.sidebar-container ul.nav-tabs{border:none}.sidebar-container ul.nav-tabs.navs-4 li{width:25%}.sidebar-container ul.nav-tabs.navs-3 li{width:33.3333%}.sidebar-container ul.nav-tabs.navs-2 li{width:50%}.sidebar-container ul.nav-tabs li{border:none}.sidebar-container ul.nav-tabs li a{border:none;padding:12px 10px;margin:0;border-radius:0;background:#231556;color:#fff;text-align:center;border-right:1px solid rgb(38.3364485981,23.0018691589,94.1981308411)}.sidebar-container ul.nav-tabs li.active a{border:none;background:#f9f9f9;color:#121321;font-weight:bold}.sidebar-container .nav-tabs>li.active>a:hover,.sidebar-container .nav-tabs>li.active>a:focus{border:none}.sidebar-container ul.sidebar-list{margin:0;padding:0}.sidebar-container ul.sidebar-list li{border-bottom:1px solid #c2c4cc;padding:15px 20px;list-style:none;font-size:12px}.sidebar-container .sidebar-message:nth-child(2n+2){background:#f9f9f9}.sidebar-container ul.sidebar-list li a{text-decoration:none;color:inherit}.sidebar-container .sidebar-content{padding:15px 20px;font-size:12px}.sidebar-container .sidebar-title{background:#fff;padding:20px;border-bottom:1px solid #c2c4cc}.sidebar-container .sidebar-title h3{margin-bottom:3px;padding-left:2px}.sidebar-container .tab-content h4{margin-bottom:5px}.sidebar-container .sidebar-message>a>.pull-left{margin-right:10px}.sidebar-container .sidebar-message>a{text-decoration:none;color:inherit}.sidebar-container .sidebar-message{padding:15px 20px}.sidebar-container .sidebar-message .message-avatar{height:38px;width:38px;border-radius:50%}.sidebar-container .setings-item{padding:15px 20px;border-bottom:1px solid #c2c4cc}body{font-family:\\\"Manrope\\\",\\\"Manrope\\\",Helvetica,Arial,sans-serif;background-color:#231556;font-size:13px;color:#121321;overflow-x:hidden}html,body{height:100%}body.full-height-layout #wrapper,body.full-height-layout #page-wrapper{height:100%}#page-wrapper{min-height:auto}body.boxed-layout{background:image-url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \")}body.boxed-layout #wrapper{background-color:#2f4050;max-width:1200px;margin:0 auto;-webkit-box-shadow:0px 0px 5px 0px rgba(0,0,0,.75);-moz-box-shadow:0px 0px 5px 0px rgba(0,0,0,.75);box-shadow:0px 0px 5px 0px rgba(0,0,0,.75)}.top-navigation.boxed-layout #wrapper,.boxed-layout #wrapper.top-navigation{max-width:1300px !important}.block{display:block}.clear{display:block;overflow:hidden}a{cursor:pointer;color:#291972}a:hover,a:focus{text-decoration:none;color:#121321}.border-bottom{border-bottom:1px solid #c2c4cc !important}.font-bold{font-weight:600}.font-noraml{font-weight:400}.text-uppercase{text-transform:uppercase}.b-r{border-right:1px solid #c2c4cc}.hr-line-dashed{border-top:1px dashed #c2c4cc;color:#fff;background-color:#fff;height:1px;margin:20px 0}.hr-line-solid{border-bottom:1px solid #c2c4cc;background-color:rgba(0,0,0,0);border-style:solid !important;margin-top:15px;margin-bottom:15px}video{width:100% !important;height:auto !important}.gallery>.row>div{margin-bottom:15px}.fancybox img{margin-bottom:5px;width:24%}.note-editor{height:auto;min-height:300px}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,0);border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.3);outline:0 none;position:relative}.modal-dialog{z-index:2200}.modal-body{padding:20px 30px 30px 30px}.inmodal .modal-body{background:#f8fafb}.inmodal .modal-header{padding:30px 15px;text-align:center}.animated.modal.fade .modal-dialog{-webkit-transform:none;-ms-transform:none;-o-transform:none;transform:none}.inmodal .modal-title{font-size:26px}.inmodal .modal-icon{font-size:84px;color:#e2e3e3}.modal-footer{margin-top:0}#wrapper{width:100%;overflow-x:hidden}.wrapper{padding:0 20px}.wrapper-content{padding:20px 10px 40px}#page-wrapper{padding:0 15px;min-height:568px;position:relative !important}@media(min-width: 768px){#page-wrapper{position:inherit;margin:0 0 0 240px;min-height:1000px}}.title-action{text-align:right;padding-top:30px}.ibox-content h1,.ibox-content h2,.ibox-content h3,.ibox-content h4,.ibox-content h5,.ibox-title h1,.ibox-title h2,.ibox-title h3,.ibox-title h4,.ibox-title h5{margin-top:5px;color:#fff}ul.unstyled,ol.unstyled{list-style:none outside none;margin-left:0}.big-icon{font-size:160px !important;color:#291972}.footer{background:none repeat scroll 0 0 #fff;border-top:1px solid #c2c4cc;bottom:0;left:0;padding:10px 20px;position:absolute;right:0}.footer.fixed_full{position:absolute;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:#fff;border-top:1px solid #c2c4cc}.footer.fixed{position:absolute;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:#fff;border-top:2px solid #c2c4cc;margin:0 !important}body.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0}body.mini-navbar.canvas-menu .footer.fixed,body.canvas-menu .footer.fixed{margin:0 !important}body.fixed-sidebar.body-small.mini-navbar .footer.fixed{margin:0}body.body-small .footer.fixed{margin-left:0px}.page-heading{border:0;padding:10px 0px 10px 0px}.panel-heading h1,.panel-heading h2{margin-bottom:5px}.table-bordered{border:1px solid #ebebeb}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{background-color:#f5f5f6;border-bottom-width:1px}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #e7e7e7}.table>thead>tr>th{border-bottom:1px solid #ddd;vertical-align:bottom}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #c2c4cc;line-height:1.42857;padding:8px;vertical-align:top}.panel.blank-panel{background:none;margin:0}.blank-panel .panel-heading{padding-bottom:0}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background:none;border-color:#ddd #ddd rgba(0,0,0,0);border-bottom:#f3f3f4;border-image:none;border-style:solid;border-width:1px;color:#555;cursor:default}.nav.nav-tabs li{background:none;border:none}.nav-tabs>li>a{color:#a7b1c2;font-weight:600;padding:10px 20px 10px 25px}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{background-color:#e6e6e6;color:#121321}.ui-tab .tab-content{padding:20px 0px}.no-padding{padding:0 !important}.no-borders{border:none !important}.no-margins{margin:0 !important}.no-top-border{border-top:0 !important}.ibox-content.text-box{padding-bottom:0px;padding-top:15px}.border-left-right{border-left:1px solid #c2c4cc;border-right:1px solid #c2c4cc;border-top:none;border-bottom:none}.border-left{border-left:1px solid #c2c4cc;border-right:none;border-top:none;border-bottom:none}.border-right{border-left:none;border-right:1px solid #c2c4cc;border-top:none;border-bottom:none}.full-width{width:100% !important}.link-block{font-size:12px;padding:10px}.nav.navbar-top-links .link-block a{font-size:12px}.link-block a{font-size:10px;color:inherit}body.mini-navbar .branding{display:none}img.circle-border{border:6px solid #fff;border-radius:50%}.branding{float:left;color:#fff;font-size:18px;font-weight:600;padding:17px 20px;text-align:center;background-color:#291972}.login-panel{margin-top:25%}.icons-box h3{margin-top:10px;margin-bottom:10px}.icons-box .infont a i{font-size:25px;display:block;color:#121321}.icons-box .infont a{color:#a6a8a9}.icons-box .infont a{padding:10px;margin:1px;display:block}.ui-draggable .ibox-title{cursor:move}.breadcrumb{background-color:#fff;padding:0;margin-bottom:0}.breadcrumb>li a{color:inherit}.breadcrumb>.active{color:inherit}code{background-color:#f9f2f4;border-radius:4px;color:#ca4440;font-size:90%;padding:2px 4px;white-space:nowrap}.ibox{clear:both;margin-bottom:25px;margin-top:0;padding:0}.ibox.collapsed .ibox-content{display:none}.ibox.collapsed .fa.fa-chevron-up:before{content:\\\"\\\"}.ibox.collapsed .fa.fa-chevron-down:before{content:\\\"\\\"}.ibox:after,.ibox:before{display:table}.ibox-title{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#fff;border-color:#c2c4cc;border-image:none;border-style:solid solid none;border-width:0px 0px 0;color:inherit;margin-bottom:0;padding:14px 15px 7px;min-height:48px}.ibox-content{background-color:#fff;color:inherit;padding:15px 20px 20px 20px;border-color:#c2c4cc;border-image:none;border-style:solid;border-width:1px;border-radius:4px}.ibox-footer{color:inherit;border-top:1px solid #c2c4cc;font-size:90%;background:#fff;padding:10px 15px}table.table-mail tr td{padding:12px}.table-mail .check-mail{padding-left:20px}.table-mail .mail-date{padding-right:20px}.star-mail,.check-mail{width:40px}.unread td a,.unread td{font-weight:600;color:inherit}.read td a,.read td{font-weight:normal;color:inherit}.unread td{background-color:#f9f8f8}.ibox-content{clear:both}.ibox-heading{background-color:#f3f6fb;border-bottom:none}.ibox-heading h3{font-weight:200;font-size:24px}.ibox-title h5{display:inline-block;font-size:14px;margin:0 0 7px;padding:0;text-overflow:ellipsis;float:left}.ibox-title .label{float:left;margin-left:4px}.ibox-tools{display:inline-block;float:right;margin-top:0;position:relative;padding:0}.ibox-tools a{cursor:pointer;margin-left:5px;color:#c4c4c4}.ibox-tools a.btn-primary{color:#fff}.ibox-tools .dropdown-menu>li>a{padding:4px 10px;font-size:12px}.ibox .open>.dropdown-menu{left:auto;right:0}.gray-bg{background-color:#f3f3f4}.white-bg{background-color:#fff}.navy-bg{background-color:#291972;color:#fff}.blue-bg{background-color:#007138;color:#fff}.lazur-bg{background-color:#ffd942;color:#fff}.yellow-bg{background-color:#ff8120;color:#fff}.red-bg{background-color:#ba0003;color:#fff}.black-bg{background-color:#262626}.panel-primary{border-color:#291972}.panel-primary>.panel-heading{background-color:#291972;border-color:#291972}.panel-success{border-color:#007138}.panel-success>.panel-heading{background-color:#007138;border-color:#007138;color:#fff}.panel-info{border-color:#ffd942}.panel-info>.panel-heading{background-color:#ffd942;border-color:#ffd942;color:#fff}.panel-warning{border-color:#ff8120}.panel-warning>.panel-heading{background-color:#ff8120;border-color:#ff8120;color:#fff}.panel-danger{border-color:#ba0003}.panel-danger>.panel-heading{background-color:#ba0003;border-color:#ba0003;color:#fff}.progress-bar{background-color:#291972}.progress-small,.progress-small .progress-bar{height:10px}.progress-small,.progress-mini{margin-top:5px}.progress-mini,.progress-mini .progress-bar{height:5px;margin-bottom:0px}.progress-bar-navy-light{background-color:#3dc7ab}.progress-bar-success{background-color:#007138}.progress-bar-info{background-color:#ffd942}.progress-bar-warning{background-color:#ff8120}.progress-bar-danger{background-color:#ba0003}.panel-title{font-size:inherit}.jumbotron{border-radius:6px;padding:40px}.jumbotron h1{margin-top:0}.text-navy{color:#291972}.text-primary{color:inherit}.text-success{color:#007138}.text-info{color:#291972}.text-warning{color:#ff8120}.text-danger{color:#ba0003}.text-muted{color:#121321}.simple_tag{background-color:#f3f3f4;border:1px solid #c2c4cc;border-radius:2px;color:inherit;font-size:10px;margin-right:5px;margin-top:5px;padding:5px 12px;display:inline-block}.img-shadow{-webkit-box-shadow:0px 0px 3px 0px #919191;-moz-box-shadow:0px 0px 3px 0px #919191;box-shadow:0px 0px 3px 0px #919191}.dashboards\\\\.dashboard_2 nav.navbar,.dashboards\\\\.dashboard_3 nav.navbar,.mailbox\\\\.inbox nav.navbar,.mailbox\\\\.email_view nav.navbar,.mailbox\\\\.email_compose nav.navbar,.dashboards\\\\.dashboard_4_1 nav.navbar,.metrics nav.navbar,.metrics\\\\.index nav.navbar{background:#fff}.Dashboard_2 .navbar.navbar-static-top,.Dashboard_3 .navbar.navbar-static-top,.Dashboard_4_1 .navbar.navbar-static-top,.ComposeEmail .navbar.navbar-static-top,.EmailView .navbar.navbar-static-top,.Inbox .navbar.navbar-static-top,.Metrics .navbar.navbar-static-top{background:#fff}a.close-canvas-menu{position:absolute;top:10px;right:15px;z-index:1011;color:#a7b1c2}a.close-canvas-menu:hover{color:#fff}.full-height{height:100%}.fh-breadcrumb{height:calc(100% - 196px);margin:0 -15px;position:relative}.fh-no-breadcrumb{height:calc(100% - 99px);margin:0 -15px;position:relative}.fh-column{background:#fff;height:100%;width:240px;float:left}.spiner-example{height:200px;padding-top:70px}.p-xxs{padding:5px}.p-xs{padding:10px}.p-sm{padding:15px}.p-m{padding:20px}.p-md{padding:25px}.p-lg{padding:30px}.p-xl{padding:40px}.m-xxs{margin:2px 4px}.m-xs{margin:5px}.m-sm{margin:10px}.m{margin:15px}.m-md{margin:20px}.m-lg{margin:30px}.m-xl{margin:50px}.m-n{margin:0 !important}.m-l-none{margin-left:0}.m-l-xs{margin-left:5px}.m-l-sm{margin-left:10px}.m-l{margin-left:15px}.m-l-md{margin-left:20px}.m-l-lg{margin-left:30px}.m-l-xl{margin-left:40px}.m-l-n-xxs{margin-left:-1px}.m-l-n-xs{margin-left:-5px}.m-l-n-sm{margin-left:-10px}.m-l-n{margin-left:-15px}.m-l-n-md{margin-left:-20px}.m-l-n-lg{margin-left:-30px}.m-l-n-xl{margin-left:-40px}.m-t-none{margin-top:0}.m-t-xxs{margin-top:1px}.m-t-xs{margin-top:5px}.m-t-sm{margin-top:10px}.m-t{margin-top:15px}.m-t-md{margin-top:20px}.m-t-lg{margin-top:30px}.m-t-xl{margin-top:40px}.m-t-n-xxs{margin-top:-1px}.m-t-n-xs{margin-top:-5px}.m-t-n-sm{margin-top:-10px}.m-t-n{margin-top:-15px}.m-t-n-md{margin-top:-20px}.m-t-n-lg{margin-top:-30px}.m-t-n-xl{margin-top:-40px}.m-r-none{margin-right:0}.m-r-xxs{margin-right:1px}.m-r-xs{margin-right:5px}.m-r-sm{margin-right:10px}.m-r{margin-right:15px}.m-r-md{margin-right:20px}.m-r-lg{margin-right:30px}.m-r-xl{margin-right:40px}.m-r-n-xxs{margin-right:-1px}.m-r-n-xs{margin-right:-5px}.m-r-n-sm{margin-right:-10px}.m-r-n{margin-right:-15px}.m-r-n-md{margin-right:-20px}.m-r-n-lg{margin-right:-30px}.m-r-n-xl{margin-right:-40px}.m-b-none{margin-bottom:0}.m-b-xxs{margin-bottom:1px}.m-b-xs{margin-bottom:5px}.m-b-sm{margin-bottom:10px}.m-b{margin-bottom:15px}.m-b-md{margin-bottom:20px}.m-b-lg{margin-bottom:30px}.m-b-xl{margin-bottom:40px}.m-b-n-xxs{margin-bottom:-1px}.m-b-n-xs{margin-bottom:-5px}.m-b-n-sm{margin-bottom:-10px}.m-b-n{margin-bottom:-15px}.m-b-n-md{margin-bottom:-20px}.m-b-n-lg{margin-bottom:-30px}.m-b-n-xl{margin-bottom:-40px}.space-15{margin:15px 0}.space-20{margin:20px 0}.space-25{margin:25px 0}.space-30{margin:30px 0}body.modal-open{padding-right:inherit !important}.jvectormap-zoomin,.jvectormap-zoomout{width:15px;height:15px;background:#1ab394}.search-form{margin-top:10px}.search-result h3{margin-bottom:0;color:#1e0fbe}.search-result .search-link{color:#006621}.search-result p{font-size:12px;margin-top:5px}.contact-box{background-color:#fff;border:1px solid #c2c4cc;padding:20px;margin-bottom:20px}.contact-box a{color:inherit}.invoice-table tbody>tr>td:last-child,.invoice-table tbody>tr>td:nth-child(4),.invoice-table tbody>tr>td:nth-child(3),.invoice-table tbody>tr>td:nth-child(2){text-align:right}.invoice-table thead>tr>th:last-child,.invoice-table thead>tr>th:nth-child(4),.invoice-table thead>tr>th:nth-child(3),.invoice-table thead>tr>th:nth-child(2){text-align:right}.invoice-total>tbody>tr>td:first-child{text-align:right}.invoice-total>tbody>tr>td{border:0 none}.invoice-total>tbody>tr>td:last-child{border-bottom:1px solid #ddd;text-align:right;width:15%}.middle-box{max-width:400px;z-index:100;margin:0 auto;padding-top:40px}.lockscreen.middle-box{width:200px;padding-top:110px}.loginscreen.middle-box{width:300px}.loginColumns{max-width:800px;margin:0 auto;padding:100px 20px 20px 20px}.passwordBox{max-width:460px;margin:0 auto;padding:100px 20px 20px 20px}.logo-name{color:#e6e6e6;font-size:180px;font-weight:800;letter-spacing:-10px;margin-bottom:0px}.middle-box h1{font-size:170px}.wrapper .middle-box{margin-top:140px}.lock-word{z-index:10;position:absolute;top:110px;left:50%;margin-left:-470px}.lock-word span{font-size:100px;font-weight:600;color:#e9e9e9;display:inline-block}.lock-word .first-word{margin-right:160px}.dashboard-header{border-top:0;padding:20px 20px 20px 20px}.dashboard-header h2{margin-top:10px;font-size:26px}.fist-item{border-top:none !important}.statistic-box{margin-top:40px}.dashboard-header .list-group-item span.label{margin-right:10px}.list-group.clear-list .list-group-item{border-top:1px solid #c2c4cc;border-bottom:0;border-right:0;border-left:0;padding:10px 0}ul.clear-list:first-child{border-top:none !important}.timeline-item .date i{position:absolute;top:0;right:0;padding:5px;width:30px;text-align:center;border-top:1px solid #c2c4cc;border-bottom:1px solid #c2c4cc;border-left:1px solid #c2c4cc;background:#f8f8f8}.timeline-item .date{text-align:right;width:110px;position:relative;padding-top:30px}.timeline-item .content{border-left:1px solid #c2c4cc;border-top:1px solid #c2c4cc;padding-top:10px;min-height:100px}.timeline-item .content:hover{background:#f6f6f6}ul.notes li,ul.tag-list li{list-style:none}ul.notes li h4{margin-top:20px;font-size:16px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;position:relative}ul.notes li div small{position:absolute;top:5px;right:5px;font-size:10px}ul.notes li div a{position:absolute;right:10px;bottom:10px;color:inherit}ul.notes li{margin:10px 40px 50px 0px;float:left}ul.notes li div p{font-size:12px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;-moz-box-shadow:5px 5px 2px #212121;-webkit-box-shadow:5px 5px 2px rgba(33,33,33,.7);box-shadow:5px 5px 2px rgba(33,33,33,.7)}ul.notes li div{-webkit-transform:rotate(-6deg);-o-transform:rotate(-6deg);-moz-transform:rotate(-6deg)}ul.notes li:nth-child(even) div{-o-transform:rotate(4deg);-webkit-transform:rotate(4deg);-moz-transform:rotate(4deg);position:relative;top:5px}ul.notes li:nth-child(3n) div{-o-transform:rotate(-3deg);-webkit-transform:rotate(-3deg);-moz-transform:rotate(-3deg);position:relative;top:-5px}ul.notes li:nth-child(5n) div{-o-transform:rotate(5deg);-webkit-transform:rotate(5deg);-moz-transform:rotate(5deg);position:relative;top:-10px}ul.notes li div:hover,ul.notes li div:focus{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);position:relative;z-index:5}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:210px;width:210px;padding:1em;-moz-box-shadow:5px 5px 7px #212121;-webkit-box-shadow:5px 5px 7px rgba(33,33,33,.7);box-shadow:5px 5px 7px rgba(33,33,33,.7);-moz-transition:-moz-transform .15s linear;-o-transition:-o-transform .15s linear;-webkit-transition:-webkit-transform .15s linear}.file-box{float:left;width:220px}.file-manager h5{text-transform:uppercase}.file-manager{list-style:none outside none;margin:0;padding:0}.folder-list li a{color:#666;display:block;padding:5px 0}.folder-list li{border-bottom:1px solid #c2c4cc;display:block}.folder-list li i{margin-right:8px;color:#3d4d5d}.category-list li a{color:#666;display:block;padding:5px 0}.category-list li{display:block}.category-list li i{margin-right:8px;color:#3d4d5d}.category-list li a .text-navy{color:#291972}.category-list li a .text-primary{color:#007138}.category-list li a .text-info{color:#ffd942}.category-list li a .text-danger{color:#ef5352}.category-list li a .text-warning{color:#f8ac59}.file-manager h5.tag-title{margin-top:20px}.tag-list li{float:left}.tag-list li a{font-size:10px;background-color:#f3f3f4;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #c2c4cc;margin-right:5px;margin-top:5px;display:block}.file{border:1px solid #c2c4cc;padding:0;background-color:#fff;position:relative;margin-bottom:20px;margin-right:20px}.file-manager .hr-line-dashed{margin:15px 0}.file .icon,.file .image{height:100px;overflow:hidden}.file .icon{padding:15px 10px;text-align:center}.file-control{color:inherit;font-size:11px;margin-right:10px}.file-control.active{text-decoration:underline}.file .icon i{font-size:70px;color:#dadada}.file .file-name{padding:10px;background-color:#f8f8f8;border-top:1px solid #c2c4cc}.file-name small{color:#121321}.file-name p{color:#121321;font-weight:700}.corner{position:absolute;display:inline-block;width:0;height:0;line-height:0;border:.6em solid rgba(0,0,0,0);border-right:.6em solid #f1f1f1;border-bottom:.6em solid #f1f1f1;right:0em;bottom:0em}a.compose-mail{padding:8px 10px}.mail-search{max-width:300px}.profile-content{border-top:none !important}.feed-activity-list .feed-element{border-bottom:1px solid #c2c4cc}.feed-element:first-child{margin-top:0}.feed-element{padding-bottom:15px}.feed-element,.feed-element .media{margin-top:15px}.feed-element,.media-body{overflow:hidden}.feed-element>.pull-left{margin-right:10px}.feed-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.feed-element .well{border:1px solid #c2c4cc;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.feed-element .actions{margin-top:10px}.feed-element .photos{margin:10px 0}.feed-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.mail-box{background-color:#fff;border:1px solid #c2c4cc;border-top:0;padding:0px;margin-bottom:20px}.mail-box-header{background-color:#fff;border:1px solid #c2c4cc;border-bottom:0;padding:30px 20px 20px 20px}.mail-box-header h2{margin-top:0px}.mailbox-content .tag-list li a{background:#fff}.mail-body{border-top:1px solid #c2c4cc;padding:20px}.mail-text{border-top:1px solid #c2c4cc}.mail-text .note-toolbar{padding:10px 15px}.mail-body .form-group{margin-bottom:5px}.mail-text .note-editor .note-toolbar{background-color:#f9f8f8}.mail-attachment{border-top:1px solid #c2c4cc;padding:20px;font-size:12px}.mailbox-content{background:none;border:none;padding:10px}.mail-ontact{width:23%}.project-people,.project-actions{text-align:right;vertical-align:middle}dd.project-people{text-align:left;margin-top:5px}.project-people img{width:32px;height:32px}.project-title a{font-size:14px;color:#121321;font-weight:600}.project-list table tr td{border-top:none;border-bottom:1px solid #c2c4cc;padding:15px 10px;vertical-align:middle}.project-manager .tag-list li a{font-size:10px;background-color:#fff;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #c2c4cc;margin-right:5px;margin-top:5px;display:block}.project-files li a{font-size:11px;color:#121321;margin-left:10px;line-height:22px}.faq-item{padding:20px;margin-bottom:2px;background:#fff}.faq-question{font-size:18px;font-weight:600;color:#291972;display:block}.faq-question:hover{color:rgb(33.4784172662,20.4136690647,93.0863309353)}.faq-answer{margin-top:10px;background:#f3f3f4;border:1px solid #c2c4cc;border-radius:3px;padding:15px}.faq-item .tag-item{background:#f3f3f4;padding:2px 6px;font-size:10px;text-transform:uppercase}.message-input{height:90px !important}.chat-avatar{white:36px;height:36px;float:left;margin-right:10px}.chat-user-name{padding:10px}.chat-user{padding:8px 10px;border-bottom:1px solid #c2c4cc}.chat-user a{color:inherit}.chat-view{z-index:20012}.chat-users,.chat-statistic{margin-left:-30px}@media(max-width: 992px){.chat-users,.chat-statistic{margin-left:0px}}.chat-view .ibox-content{padding:0}.chat-message{padding:10px 20px}.message-avatar{height:48px;width:48px;border:1px solid #c2c4cc;border-radius:4px;margin-top:1px}.chat-discussion .chat-message.left .message-avatar{float:left;margin-right:10px}.chat-discussion .chat-message.right .message-avatar{float:right;margin-left:10px}.message{background-color:#fff;border:1px solid #c2c4cc;text-align:left;display:block;padding:10px 20px;position:relative;border-radius:4px}.chat-discussion .chat-message.left .message-date{float:right}.chat-discussion .chat-message.right .message-date{float:left}.chat-discussion .chat-message.left .message{text-align:left;margin-left:55px}.chat-discussion .chat-message.right .message{text-align:right;margin-right:55px}.message-date{font-size:10px;color:#888}.message-content{display:block}.chat-discussion{background:#eee;padding:15px;height:400px;overflow-y:auto}.chat-users{overflow-y:auto;height:400px}.chat-message-form .form-group{margin-bottom:0}.jstree-open>.jstree-anchor>.fa-folder:before{content:\\\"\\\"}.jstree-default .jstree-icon.none{width:0}.clients-list{margin-top:20px}.clients-list .tab-pane{position:relative;height:600px}.client-detail{position:relative;height:620px}.clients-list table tr td{height:46px;vertical-align:middle;border:none}.client-link{font-weight:600;color:inherit}.client-link:hover{color:inherit}.client-avatar{width:42px}.client-avatar img{width:28px;height:28px;border-radius:50%}.contact-type{width:20px;color:rgb(81,85.5,148.5)}.client-status{text-align:left}.client-detail .vertical-timeline-content p{margin:0}.client-detail .vertical-timeline-icon.gray-bg{color:rgb(63,66.5,115.5)}.clients-list .nav-tabs>li.active>a,.clients-list .nav-tabs>li.active>a:hover,.clients-list .nav-tabs>li.active>a:focus{border-bottom:1px solid #fff}.blog h2{font-weight:700}.blog h5{margin:0 0 5px 0}.blog .btn{margin:0 0 5px 0}.article h1{font-size:48px;font-weight:700;color:#2f4050}.article p{font-size:15px;line-height:26px}.article-title{text-align:center;margin:40px 0 100px 0}.article .ibox-content{padding:40px}.issue-tracker .btn-link{color:#291972}table.issue-tracker tbody tr td{vertical-align:middle;height:50px}.issue-info{width:50%}.issue-info a{font-weight:600;color:#121321}.issue-info small{display:block}.team-members{margin:10px 0}.team-members img.img-circle{width:42px;height:42px;margin-bottom:5px}.sortable-list{padding:10px 0}.agile-list{list-style:none;margin:0}.agile-list li{background:#fafafb;border:1px solid #c2c4cc;margin:0px 0 10px 0;padding:10px;border-radius:2px}.agile-list li:hover{cursor:pointer;background:#fff}.agile-list li.warning-element{border-left:3px solid #ff8120}.agile-list li.danger-element{border-left:3px solid #ba0003}.agile-list li.info-element{border-left:3px solid #007138}.agile-list li.success-element{border-left:3px solid #291972}.agile-detail{margin-top:5px;font-size:12px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}.product-box{padding:0;border:1px solid #c2c4cc}.product-box:hover,.product-box.active{border:1px solid rgba(0,0,0,0);-webkit-box-shadow:0px 3px 7px 0px #a8a8a8;-moz-box-shadow:0px 3px 7px 0px #a8a8a8;box-shadow:0px 3px 7px 0px #a8a8a8}.product-imitation{text-align:center;padding:90px 0;background-color:hsl(240,4.347826087%,97.4901960784%);color:hsl(240,4.347826087%,75.4901960784%);font-weight:600}.product-imitation.xl{padding:120px 0}.product-desc{padding:20px;position:relative}.ecommerce .tag-list{padding:0}.ecommerce .fa-star{color:#d1dade}.ecommerce .fa-star.active{color:#ff8120}.ecommerce .note-editor{border:1px solid #c2c4cc}.product-name{font-size:16px;font-weight:600;color:#121321;display:block;margin:2px 0 5px 0}.product-name:hover,.product-name:focus{color:#291972}.product-price{font-size:14px;font-weight:600;color:#fff;background-color:#291972;padding:6px 12px;position:absolute;top:-32px;right:0}.social-feed-separated .social-feed-box{margin-left:62px}.social-feed-separated .social-avatar{float:left;padding:0}.social-feed-separated .social-avatar img{width:52px;height:52px;border:1px solid #c2c4cc}.social-feed-separated .social-feed-box .social-avatar{padding:15px 15px 0 15px;float:none}.social-feed-box{border:1px solid #c2c4cc;background:#fff;margin-bottom:15px}.article .social-feed-box{margin-bottom:0;border-bottom:none}.article .social-feed-box:last-child{margin-bottom:0;border-bottom:1px solid #c2c4cc}.article .social-feed-box p{font-size:13px;line-height:18px}.social-action{margin:15px}.social-avatar{padding:15px 15px 0 15px}.social-comment .social-comment{margin-left:45px}.social-avatar img{height:40px;width:40px;margin-right:10px}.social-avatar .media-body a{font-size:14px;display:block}.social-body{padding:15px}.social-body img{margin-bottom:10px}.social-footer{border-top:1px solid #c2c4cc;padding:10px 15px;background:#f9f9f9}.social-footer .social-comment img{width:32px;margin-right:10px}.social-comment:first-child{margin-top:0}.social-comment{margin-top:15px}.social-comment textarea{font-size:12px}#small-chat{position:fixed;bottom:20px;right:20px;z-index:100}#small-chat .badge{position:absolute;top:-3px;right:-4px}.open-small-chat{height:38px;width:38px;display:block;background:#1ab394;padding:9px 8px;text-align:center;color:#fff;border-radius:50%}.open-small-chat:hover{color:#fff;background:#1ab394}.small-chat-box{display:none;position:fixed;bottom:20px;right:75px;background:#fff;border:1px solid #c2c4cc;width:230px;height:320px;border-radius:4px}.small-chat-box.ng-small-chat{display:block}.body-small .small-chat-box{bottom:70px;right:20px}.small-chat-box.active{display:block}.small-chat-box .heading{background:#231556;padding:8px 15px;font-weight:bold;color:#fff}.small-chat-box .chat-date{opacity:.6;font-size:10px;font-weight:normal}.small-chat-box .content{padding:15px 15px}.small-chat-box .content .author-name{font-weight:bold;margin-bottom:3px;font-size:11px}.small-chat-box .content>div{padding-bottom:20px}.small-chat-box .content .chat-message{padding:5px 10px;border-radius:6px;font-size:11px;line-height:14px;max-width:80%;background:#f3f3f4;margin-bottom:10px}.small-chat-box .content .chat-message.active{background:#1ab394;color:#fff}.small-chat-box .content .left{text-align:left;clear:both}.small-chat-box .content .left .chat-message{float:left}.small-chat-box .content .right{text-align:right;clear:both}.small-chat-box .content .right .chat-message{float:right}.small-chat-box .form-chat{padding:10px 10px}.metismenu .plus-minus,.metismenu .plus-times{float:right}.metismenu .arrow{float:right;line-height:1.42857}.metismenu .glyphicon.arrow:before{content:\\\"\\\"}.metismenu .active>a>.glyphicon.arrow:before{content:\\\"\\\"}.metismenu .fa.arrow:before{content:\\\"\\\"}.metismenu .active>a>.fa.arrow:before{content:\\\"\\\"}.metismenu .ion.arrow:before{content:\\\"\\\"}.metismenu .active>a>.ion.arrow:before{content:\\\"\\\"}.metismenu .fa.plus-minus:before,.metismenu .fa.plus-times:before{content:\\\"\\\"}.metismenu .active>a>.fa.plus-times{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.metismenu .active>a>.fa.plus-minus:before{content:\\\"\\\"}.metismenu .collapse{display:none}.metismenu .collapse.in{display:block}.metismenu .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;transition-property:height,visibility}.sk-spinner-rotating-plane.sk-spinner{width:30px;height:30px;background-color:#291972;margin:0 auto;-webkit-animation:sk-rotatePlane 1.2s infinite ease-in-out;animation:sk-rotatePlane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}@keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}.sk-spinner-double-bounce.sk-spinner{width:40px;height:40px;position:relative;margin:0 auto}.sk-spinner-double-bounce .sk-double-bounce1,.sk-spinner-double-bounce .sk-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#291972;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-doubleBounce 2s infinite ease-in-out;animation:sk-doubleBounce 2s infinite ease-in-out}.sk-spinner-double-bounce .sk-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-wave.sk-spinner{margin:0 auto;width:50px;height:30px;text-align:center;font-size:10px}.sk-spinner-wave div{background-color:#291972;height:100%;width:6px;display:inline-block;-webkit-animation:sk-waveStretchDelay 1.2s infinite ease-in-out;animation:sk-waveStretchDelay 1.2s infinite ease-in-out}.sk-spinner-wave .sk-rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-wave .sk-rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-wave .sk-rect4{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-wave .sk-rect5{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}@-webkit-keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}.sk-spinner-wandering-cubes.sk-spinner{margin:0 auto;width:32px;height:32px;position:relative}.sk-spinner-wandering-cubes .sk-cube1,.sk-spinner-wandering-cubes .sk-cube2{background-color:#291972;width:10px;height:10px;position:absolute;top:0;left:0;-webkit-animation:sk-wanderingCubeMove 1.8s infinite ease-in-out;animation:sk-wanderingCubeMove 1.8s infinite ease-in-out}.sk-spinner-wandering-cubes .sk-cube2{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}@-webkit-keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0.5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0.5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.sk-spinner-pulse.sk-spinner{width:40px;height:40px;margin:0 auto;background-color:#291972;border-radius:100%;-webkit-animation:sk-pulseScaleOut 1s infinite ease-in-out;animation:sk-pulseScaleOut 1s infinite ease-in-out}@-webkit-keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.sk-spinner-chasing-dots.sk-spinner{margin:0 auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-chasingDotsRotate 2s infinite linear;animation:sk-chasingDotsRotate 2s infinite linear}.sk-spinner-chasing-dots .sk-dot1,.sk-spinner-chasing-dots .sk-dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#291972;border-radius:100%;-webkit-animation:sk-chasingDotsBounce 2s infinite ease-in-out;animation:sk-chasingDotsBounce 2s infinite ease-in-out}.sk-spinner-chasing-dots .sk-dot2{top:auto;bottom:0px;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-three-bounce.sk-spinner{margin:0 auto;width:70px;text-align:center}.sk-spinner-three-bounce div{width:18px;height:18px;background-color:#291972;border-radius:100%;display:inline-block;-webkit-animation:sk-threeBounceDelay 1.4s infinite ease-in-out;animation:sk-threeBounceDelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-three-bounce .sk-bounce1{-webkit-animation-delay:-0.32s;animation-delay:-0.32s}.sk-spinner-three-bounce .sk-bounce2{-webkit-animation-delay:-0.16s;animation-delay:-0.16s}@-webkit-keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-circle .sk-circle:before{content:\\\"\\\";display:block;margin:0 auto;width:20%;height:20%;background-color:#291972;border-radius:100%;-webkit-animation:sk-circleBounceDelay 1.2s infinite ease-in-out;animation:sk-circleBounceDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-cube-grid.sk-spinner{width:30px;height:30px;margin:0 auto}.sk-spinner-cube-grid .sk-cube{width:33%;height:33%;background-color:#291972;float:left;-webkit-animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out;animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out}.sk-spinner-cube-grid .sk-cube:nth-child(1){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(2){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s}.sk-spinner-cube-grid .sk-cube:nth-child(4){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(5){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(6){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(7){-webkit-animation-delay:0s;animation-delay:0s}.sk-spinner-cube-grid .sk-cube:nth-child(8){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(9){-webkit-animation-delay:.2s;animation-delay:.2s}@-webkit-keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1, 1, 1);transform:scale3D(1, 1, 1)}35%{-webkit-transform:scale3D(0, 0, 1);transform:scale3D(0, 0, 1)}}@keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1, 1, 1);transform:scale3D(1, 1, 1)}35%{-webkit-transform:scale3D(0, 0, 1);transform:scale3D(0, 0, 1)}}.sk-spinner-wordpress.sk-spinner{background-color:#291972;width:30px;height:30px;border-radius:30px;position:relative;margin:0 auto;-webkit-animation:sk-innerCircle 1s linear infinite;animation:sk-innerCircle 1s linear infinite}.sk-spinner-wordpress .sk-inner-circle{display:block;background-color:#fff;width:8px;height:8px;position:absolute;border-radius:8px;top:5px;left:5px}@-webkit-keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.sk-spinner-fading-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-fading-circle .sk-circle:before{content:\\\"\\\";display:block;margin:0 auto;width:18%;height:18%;background-color:#291972;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out;animation:sk-circleFadeDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-fading-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-fading-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-fading-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-fading-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-fading-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-fading-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-fading-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-fading-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-fading-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}body.rtls #page-wrapper{margin:0 220px 0 0}body.rtls .nav-second-level li a{padding:7px 35px 7px 10px}body.rtls .ibox-title h5{float:right}body.rtls .pull-right{float:left !important}body.rtls .pull-left{float:right !important}body.rtls .ibox-tools{float:left}body.rtls .stat-percent{float:left}body.rtls .navbar-right{float:left !important}body.rtls .navbar-top-links li:last-child{margin-left:40px;margin-right:0}body.rtls .minimalize-styl-2{float:right;margin:14px 20px 5px 5px}body.rtls .feed-element>.pull-left{margin-left:10px;margin-right:0}body.rtls .timeline-item .date{text-align:left}body.rtls .timeline-item .date i{left:0;right:auto}body.rtls .timeline-item .content{border-right:1px solid #c2c4cc;border-left:none}body.rtls .theme-config{left:0;right:auto}body.rtls .spin-icon{border-radius:0 20px 20px 0}body.rtls .toast-close-button{float:left}body.rtls #toast-container>.toast:before{margin:auto -1.5em auto .5em}body.rtls #toast-container>div{padding:15px 50px 15px 15px}body.rtls .center-orientation .vertical-timeline-icon i{margin-left:0;margin-right:-12px}body.rtls .vertical-timeline-icon i{right:50%;left:auto;margin-left:auto;margin-right:-12px}body.rtls .file-box{float:right}body.rtls ul.notes li{float:right}body.rtls .chat-users,body.rtls .chat-statistic{margin-right:-30px;margin-left:auto}body.rtls .dropdown-menu>li>a{text-align:right}body.rtls .b-r{border-left:1px solid #c2c4cc;border-right:none}body.rtls .dd-list .dd-list{padding-right:30px;padding-left:0}body.rtls .dd-item>button{float:right}body.rtls .theme-config-box{margin-left:-220px;margin-right:0}body.rtls .theme-config-box.show{margin-left:0;margin-right:0}body.rtls .spin-icon{right:0;left:auto}body.rtls .skin-setttings{margin-right:40px;margin-left:0}body.rtls .skin-setttings{direction:ltr}body.rtls .footer.fixed{margin-right:220px;margin-left:0}@media(max-width: 992px){body.rtls .chat-users,body.rtls .chat-statistic{margin-right:0px}}body.rtls.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 0 0 0}body.rtls.top-navigation .navbar-toggle{float:right;margin-left:15px;margin-right:15px}.body-small.rtls.top-navigation .navbar-header{float:none}body.rtls.top-navigation #page-wrapper{margin:0}body.rtls.mini-navbar #page-wrapper{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar #page-wrapper{margin:0 0 0 0}body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 220px 0 0}body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:220px}.body-small.rtls .navbar-fixed-top{margin-right:0px}.body-small.rtls .navbar-header{float:right}body.rtls .navbar-top-links li:last-child{margin-left:20px}body.rtls .top-navigation #page-wrapper,body.rtls.mini-navbar .top-navigation #page-wrapper,body.rtls.mini-navbar.top-navigation #page-wrapper{margin:0}body.rtls .top-navigation .footer.fixed,body.rtls.top-navigation .footer.fixed{margin:0}@media(max-width: 768px){body.rtls .navbar-top-links li:last-child{margin-left:20px}.body-small.rtls #page-wrapper{position:inherit;margin:0 0 0 0px;min-height:1000px}.body-small.rtls .navbar-static-side{display:none;z-index:1001;position:absolute;width:70px}.body-small.rtls.mini-navbar .navbar-static-side{display:block}.rtls.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:1 1;position:fixed;width:220px}.rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}}.rtls .ltr-support{direction:ltr}.theme-config{position:absolute;top:90px;right:0px;overflow:hidden}.theme-config-box{margin-right:-220px;position:relative;z-index:2000;transition-duration:.8s}.theme-config-box.show{margin-right:0px}.spin-icon{background:#291972;position:absolute;padding:7px 10px 7px 13px;border-radius:20px 0px 0px 20px;font-size:16px;top:0;left:0px;width:40px;color:#fff;cursor:pointer}.skin-setttings{width:220px;margin-left:40px;background:#f3f3f4}.skin-setttings .title{background:#efefef;text-align:center;text-transform:uppercase;font-weight:600;display:block;padding:10px 15px;font-size:12px}.setings-item{padding:10px 30px}.setings-item.skin{text-align:center}.setings-item .switch{float:right}.skin-name a{text-transform:uppercase}.setings-item a{color:#fff}.default-skin,.blue-skin,.ultra-skin,.yellow-skin{text-align:center}.default-skin{font-weight:600;background:#1ab394}.default-skin:hover{background:#199d82}.blue-skin{font-weight:600;background:url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \") repeat scroll 0 0}.blue-skin:hover{background:#0d8ddb}.yellow-skin{font-weight:600;background:url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \") repeat scroll 0 100%}.yellow-skin:hover{background:#ce8735}.ultra-skin{font-weight:600;background:url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \") repeat scroll 0 0}.ultra-skin:hover{background:#1a2d40}.skin-1 .minimalize-styl-2{margin:14px 5px 5px 30px}.skin-1 .navbar-top-links li:last-child{margin-right:30px}.skin-1.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.skin-1 .spin-icon{background:#0e9aef !important}.skin-1 .nav-header{background:#0e9aef;background:url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \")}.skin-1.mini-navbar .nav-second-level{background:#3e495f}.skin-1 .breadcrumb{background:rgba(0,0,0,0)}.skin-1 .page-heading{border:none}.skin-1 .nav>li.active{background:hsl(220,21.0191082803%,28.7843137255%)}.skin-1 .nav>li>a{color:#9ea6b9}.skin-1 .nav>li.active>a{color:#fff}.skin-1 .navbar-minimalize{background:#0e9aef;border-color:#0e9aef}body.skin-1{background:#3e495f}.skin-1 .navbar-static-top{background:#fff}.skin-1 .dashboard-header{background:rgba(0,0,0,0);border-bottom:none !important;border-top:none;padding:20px 30px 10px 30px}.fixed-nav.skin-1 .navbar-fixed-top{background:#fff}.skin-1 .wrapper-content{padding:30px 15px}.skin-1 #page-wrapper{background:#f4f6fa}.skin-1 .ibox-title,.skin-1 .ibox-content{border-width:1px}.skin-1 .ibox-content:last-child{border-style:solid solid solid solid}.skin-1 .nav>li.active{border:none}.skin-1 .nav-header{padding:35px 25px 25px 25px}.skin-1 .nav-header a.dropdown-toggle{color:#fff;margin-top:10px}.skin-1 .nav-header a.dropdown-toggle .text-muted{color:#fff;opacity:.8}.skin-1 .profile-element{text-align:center}.skin-1 .img-circle{border-radius:5px}.skin-1 .navbar-default .nav>li>a:hover,.skin-1 .navbar-default .nav>li>a:focus{background:hsl(220,21.0191082803%,28.7843137255%);color:#fff}.skin-1 .nav.nav-tabs>li.active>a{color:#555}.skin-1 .nav.nav-tabs>li.active{background:rgba(0,0,0,0)}body.skin-2{color:#565758 !important}.skin-2 .minimalize-styl-2{margin:14px 5px 5px 25px}.skin-2 .navbar-top-links li:last-child{margin-right:25px}.skin-2 .spin-icon{background:#23c6c8 !important}.skin-2 .nav-header{background:#23c6c8;background:url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \")}.skin-2.mini-navbar .nav-second-level{background:#ededed}.skin-2 .breadcrumb{background:rgba(0,0,0,0)}.skin-2.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.skin-2 .page-heading{border:none;background:hsla(0,0%,100%,.7)}.skin-2 .nav>li.active{background:#e0e0e0}.skin-2 .logo-element{padding:17px 0}.skin-2 .nav>li>a,.skin-2 .welcome-message{color:#edf6ff}.skin-2 #top-search::-moz-placeholder{color:#121321;font:bold;opacity:.5}.skin-2 #side-menu>li>a,.skin-2 .nav.nav-second-level>li>a{color:#586b7d}.skin-2 .nav>li.active>a{color:#213a53}.skin-2.mini-navbar .nav-header{background:#213a53}.skin-2 .navbar-minimalize{background:#23c6c8;border-color:#23c6c8}.skin-2 .border-bottom{border-bottom:none !important}.skin-2 #top-search{color:#fff}body.skin-2 #wrapper{background-color:#ededed}.skin-2 .navbar-static-top{background:#213a53}.fixed-nav.skin-2 .navbar-fixed-top{background:#213a53;border-bottom:none !important}.skin-2 .nav-header{padding:30px 25px 30px 25px}.skin-2 .dashboard-header{background:hsla(0,0%,100%,.4);border-bottom:none !important;border-top:none;padding:20px 30px 20px 30px}.skin-2 .wrapper-content{padding:30px 15px}.skin-2 .dashoard-1 .wrapper-content{padding:0px 30px 25px 30px}.skin-2 .ibox-title{background:hsla(0,0%,100%,.7);border:none;margin-bottom:1px}.skin-2 .ibox-content{background:hsla(0,0%,100%,.4);border:none !important}.skin-2 #page-wrapper{background:#f6f6f6;background:-webkit-radial-gradient(center, ellipse cover, rgb(246, 246, 246) 20%, rgb(213, 213, 213) 100%);background:-o-radial-gradient(center, ellipse cover, rgb(246, 246, 246) 20%, rgb(213, 213, 213) 100%);background:-ms-radial-gradient(center, ellipse cover, rgb(246, 246, 246) 20%, rgb(213, 213, 213) 100%);background:radial-gradient(ellipse at center, rgb(246, 246, 246) 20%, rgb(213, 213, 213) 100%);-ms-filter:\\\"progid:DXImageTransform.Microsoft.gradient(startColorstr=#f6f6f6, endColorstr=#d5d5d5)\\\"}.skin-2 .ibox-title,.skin-2 .ibox-content{border-width:1px}.skin-2 .ibox-content:last-child{border-style:solid solid solid solid}.skin-2 .nav>li.active{border:none}.skin-2 .nav-header a.dropdown-toggle{color:#edf6ff;margin-top:10px}.skin-2 .nav-header a.dropdown-toggle .text-muted{color:#edf6ff;opacity:.8}.skin-2 .img-circle{border-radius:10px}.skin-2 .nav.navbar-top-links>li>a:hover,.skin-2 .nav.navbar-top-links>li>a:focus{background:rgb(25.7456896552,45.25,64.7543103448)}.skin-2 .navbar-default .nav>li>a:hover,.skin-2 .navbar-default .nav>li>a:focus{background:#e0e0e0;color:#213a53}.skin-2 .nav.nav-tabs>li.active>a{color:#555}.skin-2 .nav.nav-tabs>li.active{background:rgba(0,0,0,0)}.skin-3 .minimalize-styl-2{margin:14px 5px 5px 30px}.skin-3 .navbar-top-links li:last-child{margin-right:30px}.skin-3.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.skin-3 .spin-icon{background:#ecba52 !important}body.boxed-layout.skin-3 #wrapper{background:#3e2c42}.skin-3 .nav-header{background:#ecba52;background:url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \")}.skin-3.mini-navbar .nav-second-level{background:#3e2c42}.skin-3 .breadcrumb{background:rgba(0,0,0,0)}.skin-3 .page-heading{border:none}.skin-3 .nav>li.active{background:rgb(56.2509090909,39.92,59.88)}.fixed-nav.skin-3 .navbar-fixed-top{background:#fff}.skin-3 .nav>li>a{color:#948b96}.skin-3 .nav>li.active>a{color:#fff}.skin-3 .navbar-minimalize{background:#ecba52;border-color:#ecba52}body.skin-3{background:#3e2c42}.skin-3 .navbar-static-top{background:#fff}.skin-3 .dashboard-header{background:rgba(0,0,0,0);border-bottom:none !important;border-top:none;padding:20px 30px 10px 30px}.skin-3 .wrapper-content{padding:30px 15px}.skin-3 #page-wrapper{background:#f4f6fa}.skin-3 .ibox-title,.skin-3 .ibox-content{border-width:1px}.skin-3 .ibox-content:last-child{border-style:solid solid solid solid}.skin-3 .nav>li.active{border:none}.skin-3 .nav-header{padding:35px 25px 25px 25px}.skin-3 .nav-header a.dropdown-toggle{color:#fff;margin-top:10px}.skin-3 .nav-header a.dropdown-toggle .text-muted{color:#fff;opacity:.8}.skin-3 .profile-element{text-align:center}.skin-3 .img-circle{border-radius:5px}.skin-3 .navbar-default .nav>li>a:hover,.skin-3 .navbar-default .nav>li>a:focus{background:rgb(56.2509090909,39.92,59.88);color:#fff}.skin-3 .nav.nav-tabs>li.active>a{color:#555}.skin-3 .nav.nav-tabs>li.active{background:rgba(0,0,0,0)}@media(min-width: 768px){#page-wrapper{position:inherit;margin:0 0 0 220px;min-height:1200px}.navbar-static-side{z-index:1001;position:absolute;width:220px}.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{margin-left:auto}}@media(max-width: 768px){#page-wrapper{position:inherit;margin:0 0 0 0px;min-height:1000px}.body-small .navbar-static-side{display:none;z-index:1001;position:absolute;width:70px}.body-small.mini-navbar .navbar-static-side{display:block}.lock-word{display:none}.navbar-form-custom{display:none}.navbar-header{display:inline;float:left}.sidebard-panel{z-index:2;position:relative;width:auto;min-height:100% !important}.sidebar-content .wrapper{padding-right:0px;z-index:1}.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:1001;position:fixed;width:220px}.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}.ibox-tools{float:none;text-align:right;display:block}}@media(max-width: 350px){.timeline-item .date{text-align:left;width:110px;position:relative;padding-top:30px}.timeline-item .date i{position:absolute;top:0;left:15px;padding:5px;width:30px;text-align:center;border:1px solid #c2c4cc;background:#f8f8f8}.timeline-item .content{border-left:none;border-top:1px solid #c2c4cc;padding-top:10px;min-height:100px}.nav.navbar-top-links li.dropdown{display:none}.ibox-tools{float:none;text-align:left;display:inline-block}}@media(max-width: 1000px){.welcome-message{display:none}}.lightBoxGallery{text-align:center}.lightBoxGallery img{margin:5px}body{font-size:12px}.toast-title{font-weight:bold}.toast-message{word-wrap:break-word}.toast-close-button{position:relative;right:-4px;top:-12px;float:right;font-size:20px;font-weight:bold;color:#676a6c;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8;outline:none}.toast-close-button:hover,.toast-close-button:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4}button.toast-close-button{padding:0;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container .toast{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px 3px 3px 3px;-webkit-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px;background-position:15px center;background-repeat:no-repeat;color:#fff;color:#676a6c;opacity:.8;opacity:1}#toast-container .toast>div{margin-left:5px}#toast-container .toast:hover{-moz-box-shadow:0 0 12px gray;-webkit-box-shadow:0 0 12px gray;box-shadow:0 0 12px gray;opacity:1;cursor:pointer}.toast.toast-error,.toast.toast-loading,.toast.toast-info,.toast.toast-success,.toast.toast-warning{background-size:34px}.toast-loading{background-image:url(\\\"data:image/gif;base64,R0lGODlhIgAiAPYAAP////D09/n6/Ka+0H+mxdPf577Q3YmrxjOFxpezyTSGytzl7LrM2jOExTeIy+bt8vL1+GGYxMjX4vX4+rLG1jKCwpGvxzKDw9/o7vP3+TSGyDSGyTKDwnukxDSHyjOGx8zZ41OTxrjL2arB05q2y93m7djj6pq1y7bK2DKEw9Hd5jaHy+Pq8Gebxfv8/anA0jaIy7zO29bh6TuKzKG7zsTU3zKFxO3x9eju8ziIzJ23zOXs8dXg6DKExOHp7/3+/jOFxzKEwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hZSZXNpemVkIHdpdGggZXpnaWYuY29tACH5BAQDAP8ALAAAAAAiACIAAAdsgACCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmI8hNpydnp4hkjZBpKWmpjaip6ulqZGjrKuukLCxqKq2t6+5urS8rbi/s4+1vMOOxbnHjcm2y4zNsc+L0azTitWykpuf3ZyhmeHi4+Tl5ufo6ZOBACH5BAQDAP8ALAgACQASABAAAAc+gAAhNoSFhoYhAAA2QY2Oj482ioyQlY2Si5aWmJSakZOekJyhn5mkl6CnQaOqrKeupLChsp60mpiDh7qEiYEAIfkEBAMA/wAsCAAJABIAEAAABz+ALhYdhIWGhhYuAjZBjY6PjzYCi5CVjpKUlpWYjJqQnJ6fk52hjaClpqOoqZmop66qq6+ls6G1npKCh7uFiYEAIfkEBAMA/wAsCAAJABIAEAAABz+AECAShIWGhiAQNSlBjY6Pjyk1BpCVkAaUlpqYmpuZnZefoI6co4+lpo2oqaumraOvoLGdBoupQZKCh7uFiYEAIfkEBAMA/wAsBwAJABQAEAAAB0KAAIKDhIWGOCqJiouMKjiCBkGSk5SVQQaQlpqTmACRm5qdn6CVoqSWpqeUqaqSrK2vqrGns6S1oJ2IjbuJj4a/v4EAIfkEBAMA/wAsBwAKABQADgAAB0KAAIKDhIWGOAuJiouMCzgAPyNBk5SVlkEjP5GXnJSZm52cn5Khl6OlppqkqJ6qrJWnr5OxsrSvmQCIjbuJj4a/v4EAIfkEBAMA/wAsBgALABYADAAABz6AAIKDhIWGAAIUFDQHjY6PjzSKAhNBlpeYmZkTlZqempyfopeho6Klpp6oqZudrK2voImLkLWOkhQCh7uHgQAh+QQEAwD/ACwDAAwAHAAKAAAHVIACN4M3OywsOziHi4s4hoiENwI+EZURNpg2IZmcmpyWET4lQaSlpqeopyWjqa2uQauvsqqss7Oxtre1ua4llJacm52YwpigPoKEj4mMjI6HO5ECgQAh+QQEAwD/ACwBAAwAIAAKAAAHO4AAgoOEhYaHhCIni4yNjo+QiyIHQZWWl5iZmpUHlJufoJyeoaSYnaWolqepqKuspAeKkbO0koi3uIWBACH5BAQDAP8ALAAADQAiAAgAAAc1gBM4g4SFhCyIiYaLgxM1QZCRkpOUlZI1j5aam5eZnJ+VmKCjk6Kkp6anozWCjIaJiq6FE4EAIfkEBAMA/wAsAAANACIACAAAB1aAEziDgxkBhIOCiDiKhAEZixM1QZSUKAeVlJOZQZuVByicNZ6UFJiZpJqcBxSiqaainJ2rraivp5Wps5msrpywqLKpvbacl7HIn6GojYWHiM2Ji4+RgQAh+QQEAwD/ACwAAA0AIgAIAAAHe4AuAoODP4KEAj8CGYwZiYgCLoqILjwHl5clEpgHFhg0HaEdNBgWnBIlnAc8NUGurioor0E2Kh2zHSo2sygqs0E1rbOxs7W3r7m7r72/wb/Er8a4ury+s87DstG208quzNeWnJqcnqCipKaYqKo8h4SGkIqNjpOEkpAugQAh+QQEAwD/ACwAAA0AIgAIAAAHZoAAgoOEhYaHhyMviy8sBYwvFBASkBIQFJAFLJAjgiFBoEEqIqFBETgvpS84EaUiKqUhnqWjpaepoautoa+xs6G1obeqrK6wobIAn8CkwqjEu6C9yIKKjI6QkpSMlpiMmpyI4uOIgQAh+QQEAwD/ACwAAA0AIgAIAAAHZIAAgoOEhYaHhxQviy8sLowvFBMSkBITiowuLJAUgiFBoEEqAqFBLQEvpS8BLaUCKqUhnqWjpaepoautoa+xs6G1obeqrK6wobIAn8CkwqjEu6C9yIKYi46ck5WXkJqciODhiIEAIfkEBAMA/wAsAQANACAACAAAB2WAAIKDhIWGh4Q+I4sjLD+MIwwCEi+VLxICDJA/LJA+IEGhQSouokEtEC+mLxAtpi4qpiCgoqSmqKqirK6isLK0obaiuKutr7Gis6bCocS6xr3IoSCKjI6QkpSWmJqMnJ6I4eKFgQAh+QQEAwD/ACwBAA4AIAAGAAAHY4AQEjWEOAAFhDUqLgsjjiMLLiqJBQA4iRIQBUGcQSg/EZ0tASOdQSMBLZ0RPyimBZudn6Gco6WdqKqcrK6dsKazoqSmuautr7GcwbXDuKnGvZwFgomGiISLjY+Rk4SVl4SZgQAh+QQEAwD/ACwBAA4AIAAGAAAHY4AAJSaEOAA3hCY+PxMgjiATPz6JNwA4iSUAAC1BnQQAKJ1BLTcgokEgN5ydKAAEoi2aq0GfoZ2kpqKps62vt7KitbClp7uivbDAnqDDuZ3GrK7JgomGiISLjY+Rk4SVl4SZgQAh+QQEAwD/ACwBAA4AIAAGAAAHX4AANziEAQAZhDg3Py6JOC4/g4QZAAGJNwAALUGcLQAGnEERhKFBhBGhBpqhnqudn6GjOKWnqa5BrZuvoJyytDionKq6uJnEnryipKG1wretkjiGiISLjYmQ0ZSW1QCBACH5BAQDAP8ALAEADgAgAAYAAAddgAAZEIQQAAKFED8uOI04Lj+JAgCJGQAALUGaEQAGmkERjZ9BjRGfBgCmmi2XmZudn6E4o6WnqZ+smLGwm6KftZqoqkG5rqC8oL6awEHCuJeDhYeJi46PkYWTlQCBACH5BAQDAP8ALAIADgAeAAYAAAdagBMQgxAAAoQQPy43jDcuP4gCAIgTA0GXEQAGl0EhDzecQTcPIZwGABGcA5aYmpyeoJyjpZenqZernJmbl7Chs6aoqqxBu6+fv6TBt0EDgoSGiIqNjpCEkpSBACH5BAQDAP8ALAIADgAeAAYAAAdagAIQgxAAgoQ/PzeLN4mEEAIAjwIMQZYRAAaWQSEPN5tBNw8hmwYAEZsMlZeZm52fm6KklqaolqqbmJqWr6Cypaepq0G6rp6+o8C2QQyHg4aPiYyNP5OShAKBACH5BAQDAP8ALAIADgAeAAYAAAdVgAIQgxAAgoQ/PzeLN4mEEAIAjwIGQZYRAJWWIQ83lpY3DyGfBgARpJpBmKmcnp+ho5alp7Kpq5+tn0GwpKaon7ebnbq8sr6yh4OGj4mMjT+TkoQCgQAh+QQEAwD/ACwCAA4AHgAGAAAHWoATEIMQAAKEED8/N4w3iogCAIgTI0GWEQAGlkEhDzebQTcPIZsGABGbI5WXmZudn5uipJamqJaqm5ialq+gsqWnqatBuq6evqPAtkEjgoSGiIqNjj+QkoQTgQAh+QQEAwD/ACwCAA4AHgAGAAAHWoAZEIMQAAKEED8uOIw4Lj+IAgCIGS1BlxEABpdBIQ84nEE4DyGcBgARnC2WmJqcnqCco6WXp6mXq5yZm5ewobOmqKqsQbuvn7+kwbdBLYKEhoiKjY6QhJKUgQAh+QQEAwD/ACwBAA4AIAAGAAAHYYAADyyENwAQhCw4PwIYjhgCPziJEAA3iQ8AAC1BnS0ABp1BETgYokEYOBGiBpuin66eoKKkpqKpq52tnLKxQZ+hnbWnuKy+sLy/s8KlxKrGybCDhYeJi42PkZOElZeEmYEAIfkEBAMA/wAsAQAOACAABgAAB2KAPzwqhCwAO4QqJi44DI4MOC4miTsALIk8PxARQZ0EPyedQRGNokGQnJ0nPwSiERCbop+hnaQMpqiiq621sKlBs66lormqrK6+sqDCt8Q4v7vIgomGiISLjY+Rk4SVl4SZgQAh+QQEAwD/ACwBAA4AIAAGAAAHX4A+I4MjKj8UhBQZIIQjIBmIgxQ/Ko0+IEGZQTQuNpohLCOaQSMsIZo2LjSjIJianJ6ZoKKapaeZqauaraOwn6GjtqiqrK6ZvrLAtabDupkggoSGkSOKjISP1JOVhD6BACH5BAQDAP8ALAEADQAgAAgAAAdggACCg4SFhoeEGC+LLww/jIs4EpASOJAvPwyQGCBBnkEELp9BKSUvoy8lKaMuBKMgnZ+ho6Wnn6mrn62vsZ6zn7Woqqyun7Cjv57Bt8O6xZ4gioyOl5KUlpCZm4jc3YWBACH5BAQDAP8ALAEADQAgAAgAAAdkgACCg4SEP4c/hYqDCy+OLxQ/j444EjSXNBI4ky8/FJMLNUGjQREupKMlNKg0JahBLhGoNaKkpq+qrK6osbO1o7eouaStr72ktKjBpMOjxbyyyI2PkZyVmJmbk56gi4uIid6FgQAh+QQEAwD/ACwBAA0AIAAIAAAHZYAuATeEN4OFhDiKi4iEh44uLC0hlCGTlZQNNps2DZiUl6AsCzZBpkEIp6cpqqyqqKo2C6Sqqa+uprintqaytLuvQbq6prxBvqXAt63BxrKSmKGVmpyen9ItLIKIj4WLjI3dAS6BACH5BAQDAP8ALAEADQAgAAgAAAc6gAAAGTiFhoeIiYgZgoIGQZCRkpOUkwaNAI+Vm5xBl42anaKRn46jp56YoaicpZmsoq6EirS1OIwAgQAh+QQEAwD/ACwDAA0AHAAIAAAHPYAAghI6hSeHiImJhToSgo8AI0GTlJWWliOQgpKXnZeZmpyeo0GgkKKknaaPqKmYmpGunquDjIq3iIyOgoEAIfkEBAMA/wAsBgAMABYACgAAB1mAAAAuExABATgPOw+KDziHEBMugoISBB0tLSEhNpudIZkdBBKUAChBqKmqq0EopaessaiulLCyrLSCtrequaa8uK/Aq76WmJqcnpuho6WEhoiNjY8BkZMAgQAh+QQEAwD/ACwHAAwAFAAKAAAHRIAAAAUgNQwUIyM0NIkUDDUgBYKCH0GWl5iYH5MAlZmflpuTnqCZopSln6edqaacpK1Bq7Cts7GXq4SGiIqMI46QkgCBACH5BAQDAP8ALAkACwAQAAwAAAc5gBAlC4SFhoQlECA2KUGOj5ApNiASkJaWEpWXm5mbnJqekJ2hoqCkQaOnqKakEouNoZIggoe1C4mBACH5BAQDAP8ALAkACgAQAA4AAAc/gACCPy6FhoU/ggAqHR0tj5CRjSo1QZaXmJg1lZmdlpuenqChmaOkl6anQamnrKSuobCijI6RtpOKhIeGiYKBACH5BAQDAP8ALAkACgAQAA4AAAcygCMtEYSFhoQtIxFBjI2OjoSPko2Rk5KVlpCLmZqcnZ6MmJ6inKSZppaokxGCh64RiYEAIfkEBAMA/wAsCAAJABIAEAAAB0GAACAShIWGhiAAAAhBjY6PjwiKNpCVjjaTlpaYAJSakJyen5eZo6SdpqeipqGpja2usKmyrKWzioyukoKHvYWJgQAh+QQEAwD/ACwIAAkAEgAQAAAHPoAAFh2EhYaGFgAANkGNjo+PNoqMkJWNkouWlpiUmpGTnpCcoZ+ZpJegp0GjqqynrqSwobKetJqYg4e6hImBADs=\\\")}.toast-info{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \")}.toast-error{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \")}.toast-success{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \")}.toast-warning{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \")}#toast-container.toast-top-center .toast,#toast-container.toast-bottom-center .toast{width:300px;margin-left:auto;margin-right:auto}#toast-container.toast-top-full-width .toast,#toast-container.toast-bottom-full-width .toast{width:96%;margin-left:auto;margin-right:auto}.toast{background-color:#fff}.toast-success{background-color:#fff}.toast-error{background-color:#fff}.toast-info{background-color:#fff}.toast-warning{background-color:#fff}progress-bar{position:absolute;left:0;bottom:0;height:2px;background-color:#2675b3;opacity:.4}div[toast]{opacity:1 !important}div[toast].ng-enter{opacity:0 !important;transition:opacity .3s linear}div[toast].ng-enter.ng-enter-active{opacity:1 !important}div[toast].ng-leave{opacity:1;transition:opacity .3s linear}div[toast].ng-leave.ng-leave-active{opacity:0 !important}@media all and (max-width: 240px){#toast-container .toast.div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 241px)and (max-width: 480px){#toast-container .toast.div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 481px)and (max-width: 768px){#toast-container .toast.div{padding:15px 15px 15px 50px;width:25em}}.toast-container-archive{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #c2c4cc;position:relative}.toast-container-archive .toast{overflow:hidden;padding:30px 15px 30px 55px;background-position:15px center;background-repeat:no-repeat;color:#676a6c;opacity:1}.toast-container-archive .toast:hover{-moz-box-shadow:0 0 12px #e2e2e2;-webkit-box-shadow:0 0 12px #e2e2e2;box-shadow:0 0 12px #e2e2e2;cursor:pointer}.toast-container-archive .close-btn{background-color:rgba(0,0,0,0);cursor:pointer;border-radius:0;color:#dedede}.toast-container-archive .close-btn:hover{background-color:#f73415;color:#fff}.toast-date{position:absolute;bottom:6px;right:15px;color:#b4b4b4}/*!\\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */@font-face{font-family:\\\"FontAwesome\\\";src:url(\" + ___CSS_LOADER_URL_REPLACEMENT_9___ + \");src:url(\" + ___CSS_LOADER_URL_REPLACEMENT_10___ + \") format(\\\"embedded-opentype\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_11___ + \") format(\\\"woff2\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_12___ + \") format(\\\"woff\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_13___ + \") format(\\\"truetype\\\"),url(\" + ___CSS_LOADER_URL_REPLACEMENT_14___ + \") format(\\\"svg\\\");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\\\"\\\"}.fa-music:before{content:\\\"\\\"}.fa-search:before{content:\\\"\\\"}.fa-envelope-o:before{content:\\\"\\\"}.fa-heart:before{content:\\\"\\\"}.fa-star:before{content:\\\"\\\"}.fa-star-o:before{content:\\\"\\\"}.fa-user:before{content:\\\"\\\"}.fa-film:before{content:\\\"\\\"}.fa-th-large:before{content:\\\"\\\"}.fa-th:before{content:\\\"\\\"}.fa-th-list:before{content:\\\"\\\"}.fa-check:before{content:\\\"\\\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\\\"\\\"}.fa-search-plus:before{content:\\\"\\\"}.fa-search-minus:before{content:\\\"\\\"}.fa-power-off:before{content:\\\"\\\"}.fa-signal:before{content:\\\"\\\"}.fa-gear:before,.fa-cog:before{content:\\\"\\\"}.fa-trash-o:before{content:\\\"\\\"}.fa-home:before{content:\\\"\\\"}.fa-file-o:before{content:\\\"\\\"}.fa-clock-o:before{content:\\\"\\\"}.fa-road:before{content:\\\"\\\"}.fa-download:before{content:\\\"\\\"}.fa-arrow-circle-o-down:before{content:\\\"\\\"}.fa-arrow-circle-o-up:before{content:\\\"\\\"}.fa-inbox:before{content:\\\"\\\"}.fa-play-circle-o:before{content:\\\"\\\"}.fa-rotate-right:before,.fa-repeat:before{content:\\\"\\\"}.fa-refresh:before{content:\\\"\\\"}.fa-list-alt:before{content:\\\"\\\"}.fa-lock:before{content:\\\"\\\"}.fa-flag:before{content:\\\"\\\"}.fa-headphones:before{content:\\\"\\\"}.fa-volume-off:before{content:\\\"\\\"}.fa-volume-down:before{content:\\\"\\\"}.fa-volume-up:before{content:\\\"\\\"}.fa-qrcode:before{content:\\\"\\\"}.fa-barcode:before{content:\\\"\\\"}.fa-tag:before{content:\\\"\\\"}.fa-tags:before{content:\\\"\\\"}.fa-book:before{content:\\\"\\\"}.fa-bookmark:before{content:\\\"\\\"}.fa-print:before{content:\\\"\\\"}.fa-camera:before{content:\\\"\\\"}.fa-font:before{content:\\\"\\\"}.fa-bold:before{content:\\\"\\\"}.fa-italic:before{content:\\\"\\\"}.fa-text-height:before{content:\\\"\\\"}.fa-text-width:before{content:\\\"\\\"}.fa-align-left:before{content:\\\"\\\"}.fa-align-center:before{content:\\\"\\\"}.fa-align-right:before{content:\\\"\\\"}.fa-align-justify:before{content:\\\"\\\"}.fa-list:before{content:\\\"\\\"}.fa-dedent:before,.fa-outdent:before{content:\\\"\\\"}.fa-indent:before{content:\\\"\\\"}.fa-video-camera:before{content:\\\"\\\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\\\"\\\"}.fa-pencil:before{content:\\\"\\\"}.fa-map-marker:before{content:\\\"\\\"}.fa-adjust:before{content:\\\"\\\"}.fa-tint:before{content:\\\"\\\"}.fa-edit:before,.fa-pencil-square-o:before{content:\\\"\\\"}.fa-share-square-o:before{content:\\\"\\\"}.fa-check-square-o:before{content:\\\"\\\"}.fa-arrows:before{content:\\\"\\\"}.fa-step-backward:before{content:\\\"\\\"}.fa-fast-backward:before{content:\\\"\\\"}.fa-backward:before{content:\\\"\\\"}.fa-play:before{content:\\\"\\\"}.fa-pause:before{content:\\\"\\\"}.fa-stop:before{content:\\\"\\\"}.fa-forward:before{content:\\\"\\\"}.fa-fast-forward:before{content:\\\"\\\"}.fa-step-forward:before{content:\\\"\\\"}.fa-eject:before{content:\\\"\\\"}.fa-chevron-left:before{content:\\\"\\\"}.fa-chevron-right:before{content:\\\"\\\"}.fa-plus-circle:before{content:\\\"\\\"}.fa-minus-circle:before{content:\\\"\\\"}.fa-times-circle:before{content:\\\"\\\"}.fa-check-circle:before{content:\\\"\\\"}.fa-question-circle:before{content:\\\"\\\"}.fa-info-circle:before{content:\\\"\\\"}.fa-crosshairs:before{content:\\\"\\\"}.fa-times-circle-o:before{content:\\\"\\\"}.fa-check-circle-o:before{content:\\\"\\\"}.fa-ban:before{content:\\\"\\\"}.fa-arrow-left:before{content:\\\"\\\"}.fa-arrow-right:before{content:\\\"\\\"}.fa-arrow-up:before{content:\\\"\\\"}.fa-arrow-down:before{content:\\\"\\\"}.fa-mail-forward:before,.fa-share:before{content:\\\"\\\"}.fa-expand:before{content:\\\"\\\"}.fa-compress:before{content:\\\"\\\"}.fa-plus:before{content:\\\"\\\"}.fa-minus:before{content:\\\"\\\"}.fa-asterisk:before{content:\\\"\\\"}.fa-exclamation-circle:before{content:\\\"\\\"}.fa-gift:before{content:\\\"\\\"}.fa-leaf:before{content:\\\"\\\"}.fa-fire:before{content:\\\"\\\"}.fa-eye:before{content:\\\"\\\"}.fa-eye-slash:before{content:\\\"\\\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\\\"\\\"}.fa-plane:before{content:\\\"\\\"}.fa-calendar:before{content:\\\"\\\"}.fa-random:before{content:\\\"\\\"}.fa-comment:before{content:\\\"\\\"}.fa-magnet:before{content:\\\"\\\"}.fa-chevron-up:before{content:\\\"\\\"}.fa-chevron-down:before{content:\\\"\\\"}.fa-retweet:before{content:\\\"\\\"}.fa-shopping-cart:before{content:\\\"\\\"}.fa-folder:before{content:\\\"\\\"}.fa-folder-open:before{content:\\\"\\\"}.fa-arrows-v:before{content:\\\"\\\"}.fa-arrows-h:before{content:\\\"\\\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\\\"\\\"}.fa-twitter-square:before{content:\\\"\\\"}.fa-facebook-square:before{content:\\\"\\\"}.fa-camera-retro:before{content:\\\"\\\"}.fa-key:before{content:\\\"\\\"}.fa-gears:before,.fa-cogs:before{content:\\\"\\\"}.fa-comments:before{content:\\\"\\\"}.fa-thumbs-o-up:before{content:\\\"\\\"}.fa-thumbs-o-down:before{content:\\\"\\\"}.fa-star-half:before{content:\\\"\\\"}.fa-heart-o:before{content:\\\"\\\"}.fa-sign-out:before{content:\\\"\\\"}.fa-linkedin-square:before{content:\\\"\\\"}.fa-thumb-tack:before{content:\\\"\\\"}.fa-external-link:before{content:\\\"\\\"}.fa-sign-in:before{content:\\\"\\\"}.fa-trophy:before{content:\\\"\\\"}.fa-github-square:before{content:\\\"\\\"}.fa-upload:before{content:\\\"\\\"}.fa-lemon-o:before{content:\\\"\\\"}.fa-phone:before{content:\\\"\\\"}.fa-square-o:before{content:\\\"\\\"}.fa-bookmark-o:before{content:\\\"\\\"}.fa-phone-square:before{content:\\\"\\\"}.fa-twitter:before{content:\\\"\\\"}.fa-facebook-f:before,.fa-facebook:before{content:\\\"\\\"}.fa-github:before{content:\\\"\\\"}.fa-unlock:before{content:\\\"\\\"}.fa-credit-card:before{content:\\\"\\\"}.fa-feed:before,.fa-rss:before{content:\\\"\\\"}.fa-hdd-o:before{content:\\\"\\\"}.fa-bullhorn:before{content:\\\"\\\"}.fa-bell:before{content:\\\"\\\"}.fa-certificate:before{content:\\\"\\\"}.fa-hand-o-right:before{content:\\\"\\\"}.fa-hand-o-left:before{content:\\\"\\\"}.fa-hand-o-up:before{content:\\\"\\\"}.fa-hand-o-down:before{content:\\\"\\\"}.fa-arrow-circle-left:before{content:\\\"\\\"}.fa-arrow-circle-right:before{content:\\\"\\\"}.fa-arrow-circle-up:before{content:\\\"\\\"}.fa-arrow-circle-down:before{content:\\\"\\\"}.fa-globe:before{content:\\\"\\\"}.fa-wrench:before{content:\\\"\\\"}.fa-tasks:before{content:\\\"\\\"}.fa-filter:before{content:\\\"\\\"}.fa-briefcase:before{content:\\\"\\\"}.fa-arrows-alt:before{content:\\\"\\\"}.fa-group:before,.fa-users:before{content:\\\"\\\"}.fa-chain:before,.fa-link:before{content:\\\"\\\"}.fa-cloud:before{content:\\\"\\\"}.fa-flask:before{content:\\\"\\\"}.fa-cut:before,.fa-scissors:before{content:\\\"\\\"}.fa-copy:before,.fa-files-o:before{content:\\\"\\\"}.fa-paperclip:before{content:\\\"\\\"}.fa-save:before,.fa-floppy-o:before{content:\\\"\\\"}.fa-square:before{content:\\\"\\\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\\\"\\\"}.fa-list-ul:before{content:\\\"\\\"}.fa-list-ol:before{content:\\\"\\\"}.fa-strikethrough:before{content:\\\"\\\"}.fa-underline:before{content:\\\"\\\"}.fa-table:before{content:\\\"\\\"}.fa-magic:before{content:\\\"\\\"}.fa-truck:before{content:\\\"\\\"}.fa-pinterest:before{content:\\\"\\\"}.fa-pinterest-square:before{content:\\\"\\\"}.fa-google-plus-square:before{content:\\\"\\\"}.fa-google-plus:before{content:\\\"\\\"}.fa-money:before{content:\\\"\\\"}.fa-caret-down:before{content:\\\"\\\"}.fa-caret-up:before{content:\\\"\\\"}.fa-caret-left:before{content:\\\"\\\"}.fa-caret-right:before{content:\\\"\\\"}.fa-columns:before{content:\\\"\\\"}.fa-unsorted:before,.fa-sort:before{content:\\\"\\\"}.fa-sort-down:before,.fa-sort-desc:before{content:\\\"\\\"}.fa-sort-up:before,.fa-sort-asc:before{content:\\\"\\\"}.fa-envelope:before{content:\\\"\\\"}.fa-linkedin:before{content:\\\"\\\"}.fa-rotate-left:before,.fa-undo:before{content:\\\"\\\"}.fa-legal:before,.fa-gavel:before{content:\\\"\\\"}.fa-dashboard:before,.fa-tachometer:before{content:\\\"\\\"}.fa-comment-o:before{content:\\\"\\\"}.fa-comments-o:before{content:\\\"\\\"}.fa-flash:before,.fa-bolt:before{content:\\\"\\\"}.fa-sitemap:before{content:\\\"\\\"}.fa-umbrella:before{content:\\\"\\\"}.fa-paste:before,.fa-clipboard:before{content:\\\"\\\"}.fa-lightbulb-o:before{content:\\\"\\\"}.fa-exchange:before{content:\\\"\\\"}.fa-cloud-download:before{content:\\\"\\\"}.fa-cloud-upload:before{content:\\\"\\\"}.fa-user-md:before{content:\\\"\\\"}.fa-stethoscope:before{content:\\\"\\\"}.fa-suitcase:before{content:\\\"\\\"}.fa-bell-o:before{content:\\\"\\\"}.fa-coffee:before{content:\\\"\\\"}.fa-cutlery:before{content:\\\"\\\"}.fa-file-text-o:before{content:\\\"\\\"}.fa-building-o:before{content:\\\"\\\"}.fa-hospital-o:before{content:\\\"\\\"}.fa-ambulance:before{content:\\\"\\\"}.fa-medkit:before{content:\\\"\\\"}.fa-fighter-jet:before{content:\\\"\\\"}.fa-beer:before{content:\\\"\\\"}.fa-h-square:before{content:\\\"\\\"}.fa-plus-square:before{content:\\\"\\\"}.fa-angle-double-left:before{content:\\\"\\\"}.fa-angle-double-right:before{content:\\\"\\\"}.fa-angle-double-up:before{content:\\\"\\\"}.fa-angle-double-down:before{content:\\\"\\\"}.fa-angle-left:before{content:\\\"\\\"}.fa-angle-right:before{content:\\\"\\\"}.fa-angle-up:before{content:\\\"\\\"}.fa-angle-down:before{content:\\\"\\\"}.fa-desktop:before{content:\\\"\\\"}.fa-laptop:before{content:\\\"\\\"}.fa-tablet:before{content:\\\"\\\"}.fa-mobile-phone:before,.fa-mobile:before{content:\\\"\\\"}.fa-circle-o:before{content:\\\"\\\"}.fa-quote-left:before{content:\\\"\\\"}.fa-quote-right:before{content:\\\"\\\"}.fa-spinner:before{content:\\\"\\\"}.fa-circle:before{content:\\\"\\\"}.fa-mail-reply:before,.fa-reply:before{content:\\\"\\\"}.fa-github-alt:before{content:\\\"\\\"}.fa-folder-o:before{content:\\\"\\\"}.fa-folder-open-o:before{content:\\\"\\\"}.fa-smile-o:before{content:\\\"\\\"}.fa-frown-o:before{content:\\\"\\\"}.fa-meh-o:before{content:\\\"\\\"}.fa-gamepad:before{content:\\\"\\\"}.fa-keyboard-o:before{content:\\\"\\\"}.fa-flag-o:before{content:\\\"\\\"}.fa-flag-checkered:before{content:\\\"\\\"}.fa-terminal:before{content:\\\"\\\"}.fa-code:before{content:\\\"\\\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\\\"\\\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\\\"\\\"}.fa-location-arrow:before{content:\\\"\\\"}.fa-crop:before{content:\\\"\\\"}.fa-code-fork:before{content:\\\"\\\"}.fa-unlink:before,.fa-chain-broken:before{content:\\\"\\\"}.fa-question:before{content:\\\"\\\"}.fa-info:before{content:\\\"\\\"}.fa-exclamation:before{content:\\\"\\\"}.fa-superscript:before{content:\\\"\\\"}.fa-subscript:before{content:\\\"\\\"}.fa-eraser:before{content:\\\"\\\"}.fa-puzzle-piece:before{content:\\\"\\\"}.fa-microphone:before{content:\\\"\\\"}.fa-microphone-slash:before{content:\\\"\\\"}.fa-shield:before{content:\\\"\\\"}.fa-calendar-o:before{content:\\\"\\\"}.fa-fire-extinguisher:before{content:\\\"\\\"}.fa-rocket:before{content:\\\"\\\"}.fa-maxcdn:before{content:\\\"\\\"}.fa-chevron-circle-left:before{content:\\\"\\\"}.fa-chevron-circle-right:before{content:\\\"\\\"}.fa-chevron-circle-up:before{content:\\\"\\\"}.fa-chevron-circle-down:before{content:\\\"\\\"}.fa-html5:before{content:\\\"\\\"}.fa-css3:before{content:\\\"\\\"}.fa-anchor:before{content:\\\"\\\"}.fa-unlock-alt:before{content:\\\"\\\"}.fa-bullseye:before{content:\\\"\\\"}.fa-ellipsis-h:before{content:\\\"\\\"}.fa-ellipsis-v:before{content:\\\"\\\"}.fa-rss-square:before{content:\\\"\\\"}.fa-play-circle:before{content:\\\"\\\"}.fa-ticket:before{content:\\\"\\\"}.fa-minus-square:before{content:\\\"\\\"}.fa-minus-square-o:before{content:\\\"\\\"}.fa-level-up:before{content:\\\"\\\"}.fa-level-down:before{content:\\\"\\\"}.fa-check-square:before{content:\\\"\\\"}.fa-pencil-square:before{content:\\\"\\\"}.fa-external-link-square:before{content:\\\"\\\"}.fa-share-square:before{content:\\\"\\\"}.fa-compass:before{content:\\\"\\\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\\\"\\\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\\\"\\\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\\\"\\\"}.fa-euro:before,.fa-eur:before{content:\\\"\\\"}.fa-gbp:before{content:\\\"\\\"}.fa-dollar:before,.fa-usd:before{content:\\\"\\\"}.fa-rupee:before,.fa-inr:before{content:\\\"\\\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\\\"\\\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\\\"\\\"}.fa-won:before,.fa-krw:before{content:\\\"\\\"}.fa-bitcoin:before,.fa-btc:before{content:\\\"\\\"}.fa-file:before{content:\\\"\\\"}.fa-file-text:before{content:\\\"\\\"}.fa-sort-alpha-asc:before{content:\\\"\\\"}.fa-sort-alpha-desc:before{content:\\\"\\\"}.fa-sort-amount-asc:before{content:\\\"\\\"}.fa-sort-amount-desc:before{content:\\\"\\\"}.fa-sort-numeric-asc:before{content:\\\"\\\"}.fa-sort-numeric-desc:before{content:\\\"\\\"}.fa-thumbs-up:before{content:\\\"\\\"}.fa-thumbs-down:before{content:\\\"\\\"}.fa-youtube-square:before{content:\\\"\\\"}.fa-youtube:before{content:\\\"\\\"}.fa-xing:before{content:\\\"\\\"}.fa-xing-square:before{content:\\\"\\\"}.fa-youtube-play:before{content:\\\"\\\"}.fa-dropbox:before{content:\\\"\\\"}.fa-stack-overflow:before{content:\\\"\\\"}.fa-instagram:before{content:\\\"\\\"}.fa-flickr:before{content:\\\"\\\"}.fa-adn:before{content:\\\"\\\"}.fa-bitbucket:before{content:\\\"\\\"}.fa-bitbucket-square:before{content:\\\"\\\"}.fa-tumblr:before{content:\\\"\\\"}.fa-tumblr-square:before{content:\\\"\\\"}.fa-long-arrow-down:before{content:\\\"\\\"}.fa-long-arrow-up:before{content:\\\"\\\"}.fa-long-arrow-left:before{content:\\\"\\\"}.fa-long-arrow-right:before{content:\\\"\\\"}.fa-apple:before{content:\\\"\\\"}.fa-windows:before{content:\\\"\\\"}.fa-android:before{content:\\\"\\\"}.fa-linux:before{content:\\\"\\\"}.fa-dribbble:before{content:\\\"\\\"}.fa-skype:before{content:\\\"\\\"}.fa-foursquare:before{content:\\\"\\\"}.fa-trello:before{content:\\\"\\\"}.fa-female:before{content:\\\"\\\"}.fa-male:before{content:\\\"\\\"}.fa-gittip:before,.fa-gratipay:before{content:\\\"\\\"}.fa-sun-o:before{content:\\\"\\\"}.fa-moon-o:before{content:\\\"\\\"}.fa-archive:before{content:\\\"\\\"}.fa-bug:before{content:\\\"\\\"}.fa-vk:before{content:\\\"\\\"}.fa-weibo:before{content:\\\"\\\"}.fa-renren:before{content:\\\"\\\"}.fa-pagelines:before{content:\\\"\\\"}.fa-stack-exchange:before{content:\\\"\\\"}.fa-arrow-circle-o-right:before{content:\\\"\\\"}.fa-arrow-circle-o-left:before{content:\\\"\\\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\\\"\\\"}.fa-dot-circle-o:before{content:\\\"\\\"}.fa-wheelchair:before{content:\\\"\\\"}.fa-vimeo-square:before{content:\\\"\\\"}.fa-turkish-lira:before,.fa-try:before{content:\\\"\\\"}.fa-plus-square-o:before{content:\\\"\\\"}.fa-space-shuttle:before{content:\\\"\\\"}.fa-slack:before{content:\\\"\\\"}.fa-envelope-square:before{content:\\\"\\\"}.fa-wordpress:before{content:\\\"\\\"}.fa-openid:before{content:\\\"\\\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\\\"\\\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\\\"\\\"}.fa-yahoo:before{content:\\\"\\\"}.fa-google:before{content:\\\"\\\"}.fa-reddit:before{content:\\\"\\\"}.fa-reddit-square:before{content:\\\"\\\"}.fa-stumbleupon-circle:before{content:\\\"\\\"}.fa-stumbleupon:before{content:\\\"\\\"}.fa-delicious:before{content:\\\"\\\"}.fa-digg:before{content:\\\"\\\"}.fa-pied-piper-pp:before{content:\\\"\\\"}.fa-pied-piper-alt:before{content:\\\"\\\"}.fa-drupal:before{content:\\\"\\\"}.fa-joomla:before{content:\\\"\\\"}.fa-language:before{content:\\\"\\\"}.fa-fax:before{content:\\\"\\\"}.fa-building:before{content:\\\"\\\"}.fa-child:before{content:\\\"\\\"}.fa-paw:before{content:\\\"\\\"}.fa-spoon:before{content:\\\"\\\"}.fa-cube:before{content:\\\"\\\"}.fa-cubes:before{content:\\\"\\\"}.fa-behance:before{content:\\\"\\\"}.fa-behance-square:before{content:\\\"\\\"}.fa-steam:before{content:\\\"\\\"}.fa-steam-square:before{content:\\\"\\\"}.fa-recycle:before{content:\\\"\\\"}.fa-automobile:before,.fa-car:before{content:\\\"\\\"}.fa-cab:before,.fa-taxi:before{content:\\\"\\\"}.fa-tree:before{content:\\\"\\\"}.fa-spotify:before{content:\\\"\\\"}.fa-deviantart:before{content:\\\"\\\"}.fa-soundcloud:before{content:\\\"\\\"}.fa-database:before{content:\\\"\\\"}.fa-file-pdf-o:before{content:\\\"\\\"}.fa-file-word-o:before{content:\\\"\\\"}.fa-file-excel-o:before{content:\\\"\\\"}.fa-file-powerpoint-o:before{content:\\\"\\\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\\\"\\\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\\\"\\\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\\\"\\\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\\\"\\\"}.fa-file-code-o:before{content:\\\"\\\"}.fa-vine:before{content:\\\"\\\"}.fa-codepen:before{content:\\\"\\\"}.fa-jsfiddle:before{content:\\\"\\\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\\\"\\\"}.fa-circle-o-notch:before{content:\\\"\\\"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:\\\"\\\"}.fa-ge:before,.fa-empire:before{content:\\\"\\\"}.fa-git-square:before{content:\\\"\\\"}.fa-git:before{content:\\\"\\\"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:\\\"\\\"}.fa-tencent-weibo:before{content:\\\"\\\"}.fa-qq:before{content:\\\"\\\"}.fa-wechat:before,.fa-weixin:before{content:\\\"\\\"}.fa-send:before,.fa-paper-plane:before{content:\\\"\\\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\\\"\\\"}.fa-history:before{content:\\\"\\\"}.fa-circle-thin:before{content:\\\"\\\"}.fa-header:before{content:\\\"\\\"}.fa-paragraph:before{content:\\\"\\\"}.fa-sliders:before{content:\\\"\\\"}.fa-share-alt:before{content:\\\"\\\"}.fa-share-alt-square:before{content:\\\"\\\"}.fa-bomb:before{content:\\\"\\\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\\\"\\\"}.fa-tty:before{content:\\\"\\\"}.fa-binoculars:before{content:\\\"\\\"}.fa-plug:before{content:\\\"\\\"}.fa-slideshare:before{content:\\\"\\\"}.fa-twitch:before{content:\\\"\\\"}.fa-yelp:before{content:\\\"\\\"}.fa-newspaper-o:before{content:\\\"\\\"}.fa-wifi:before{content:\\\"\\\"}.fa-calculator:before{content:\\\"\\\"}.fa-paypal:before{content:\\\"\\\"}.fa-google-wallet:before{content:\\\"\\\"}.fa-cc-visa:before{content:\\\"\\\"}.fa-cc-mastercard:before{content:\\\"\\\"}.fa-cc-discover:before{content:\\\"\\\"}.fa-cc-amex:before{content:\\\"\\\"}.fa-cc-paypal:before{content:\\\"\\\"}.fa-cc-stripe:before{content:\\\"\\\"}.fa-bell-slash:before{content:\\\"\\\"}.fa-bell-slash-o:before{content:\\\"\\\"}.fa-trash:before{content:\\\"\\\"}.fa-copyright:before{content:\\\"\\\"}.fa-at:before{content:\\\"\\\"}.fa-eyedropper:before{content:\\\"\\\"}.fa-paint-brush:before{content:\\\"\\\"}.fa-birthday-cake:before{content:\\\"\\\"}.fa-area-chart:before{content:\\\"\\\"}.fa-pie-chart:before{content:\\\"\\\"}.fa-line-chart:before{content:\\\"\\\"}.fa-lastfm:before{content:\\\"\\\"}.fa-lastfm-square:before{content:\\\"\\\"}.fa-toggle-off:before{content:\\\"\\\"}.fa-toggle-on:before{content:\\\"\\\"}.fa-bicycle:before{content:\\\"\\\"}.fa-bus:before{content:\\\"\\\"}.fa-ioxhost:before{content:\\\"\\\"}.fa-angellist:before{content:\\\"\\\"}.fa-cc:before{content:\\\"\\\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\\\"\\\"}.fa-meanpath:before{content:\\\"\\\"}.fa-buysellads:before{content:\\\"\\\"}.fa-connectdevelop:before{content:\\\"\\\"}.fa-dashcube:before{content:\\\"\\\"}.fa-forumbee:before{content:\\\"\\\"}.fa-leanpub:before{content:\\\"\\\"}.fa-sellsy:before{content:\\\"\\\"}.fa-shirtsinbulk:before{content:\\\"\\\"}.fa-simplybuilt:before{content:\\\"\\\"}.fa-skyatlas:before{content:\\\"\\\"}.fa-cart-plus:before{content:\\\"\\\"}.fa-cart-arrow-down:before{content:\\\"\\\"}.fa-diamond:before{content:\\\"\\\"}.fa-ship:before{content:\\\"\\\"}.fa-user-secret:before{content:\\\"\\\"}.fa-motorcycle:before{content:\\\"\\\"}.fa-street-view:before{content:\\\"\\\"}.fa-heartbeat:before{content:\\\"\\\"}.fa-venus:before{content:\\\"\\\"}.fa-mars:before{content:\\\"\\\"}.fa-mercury:before{content:\\\"\\\"}.fa-intersex:before,.fa-transgender:before{content:\\\"\\\"}.fa-transgender-alt:before{content:\\\"\\\"}.fa-venus-double:before{content:\\\"\\\"}.fa-mars-double:before{content:\\\"\\\"}.fa-venus-mars:before{content:\\\"\\\"}.fa-mars-stroke:before{content:\\\"\\\"}.fa-mars-stroke-v:before{content:\\\"\\\"}.fa-mars-stroke-h:before{content:\\\"\\\"}.fa-neuter:before{content:\\\"\\\"}.fa-genderless:before{content:\\\"\\\"}.fa-facebook-official:before{content:\\\"\\\"}.fa-pinterest-p:before{content:\\\"\\\"}.fa-whatsapp:before{content:\\\"\\\"}.fa-server:before{content:\\\"\\\"}.fa-user-plus:before{content:\\\"\\\"}.fa-user-times:before{content:\\\"\\\"}.fa-hotel:before,.fa-bed:before{content:\\\"\\\"}.fa-viacoin:before{content:\\\"\\\"}.fa-train:before{content:\\\"\\\"}.fa-subway:before{content:\\\"\\\"}.fa-medium:before{content:\\\"\\\"}.fa-yc:before,.fa-y-combinator:before{content:\\\"\\\"}.fa-optin-monster:before{content:\\\"\\\"}.fa-opencart:before{content:\\\"\\\"}.fa-expeditedssl:before{content:\\\"\\\"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:\\\"\\\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\\\"\\\"}.fa-battery-2:before,.fa-battery-half:before{content:\\\"\\\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\\\"\\\"}.fa-battery-0:before,.fa-battery-empty:before{content:\\\"\\\"}.fa-mouse-pointer:before{content:\\\"\\\"}.fa-i-cursor:before{content:\\\"\\\"}.fa-object-group:before{content:\\\"\\\"}.fa-object-ungroup:before{content:\\\"\\\"}.fa-sticky-note:before{content:\\\"\\\"}.fa-sticky-note-o:before{content:\\\"\\\"}.fa-cc-jcb:before{content:\\\"\\\"}.fa-cc-diners-club:before{content:\\\"\\\"}.fa-clone:before{content:\\\"\\\"}.fa-balance-scale:before{content:\\\"\\\"}.fa-hourglass-o:before{content:\\\"\\\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\\\"\\\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\\\"\\\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\\\"\\\"}.fa-hourglass:before{content:\\\"\\\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\\\"\\\"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:\\\"\\\"}.fa-hand-scissors-o:before{content:\\\"\\\"}.fa-hand-lizard-o:before{content:\\\"\\\"}.fa-hand-spock-o:before{content:\\\"\\\"}.fa-hand-pointer-o:before{content:\\\"\\\"}.fa-hand-peace-o:before{content:\\\"\\\"}.fa-trademark:before{content:\\\"\\\"}.fa-registered:before{content:\\\"\\\"}.fa-creative-commons:before{content:\\\"\\\"}.fa-gg:before{content:\\\"\\\"}.fa-gg-circle:before{content:\\\"\\\"}.fa-tripadvisor:before{content:\\\"\\\"}.fa-odnoklassniki:before{content:\\\"\\\"}.fa-odnoklassniki-square:before{content:\\\"\\\"}.fa-get-pocket:before{content:\\\"\\\"}.fa-wikipedia-w:before{content:\\\"\\\"}.fa-safari:before{content:\\\"\\\"}.fa-chrome:before{content:\\\"\\\"}.fa-firefox:before{content:\\\"\\\"}.fa-opera:before{content:\\\"\\\"}.fa-internet-explorer:before{content:\\\"\\\"}.fa-tv:before,.fa-television:before{content:\\\"\\\"}.fa-contao:before{content:\\\"\\\"}.fa-500px:before{content:\\\"\\\"}.fa-amazon:before{content:\\\"\\\"}.fa-calendar-plus-o:before{content:\\\"\\\"}.fa-calendar-minus-o:before{content:\\\"\\\"}.fa-calendar-times-o:before{content:\\\"\\\"}.fa-calendar-check-o:before{content:\\\"\\\"}.fa-industry:before{content:\\\"\\\"}.fa-map-pin:before{content:\\\"\\\"}.fa-map-signs:before{content:\\\"\\\"}.fa-map-o:before{content:\\\"\\\"}.fa-map:before{content:\\\"\\\"}.fa-commenting:before{content:\\\"\\\"}.fa-commenting-o:before{content:\\\"\\\"}.fa-houzz:before{content:\\\"\\\"}.fa-vimeo:before{content:\\\"\\\"}.fa-black-tie:before{content:\\\"\\\"}.fa-fonticons:before{content:\\\"\\\"}.fa-reddit-alien:before{content:\\\"\\\"}.fa-edge:before{content:\\\"\\\"}.fa-credit-card-alt:before{content:\\\"\\\"}.fa-codiepie:before{content:\\\"\\\"}.fa-modx:before{content:\\\"\\\"}.fa-fort-awesome:before{content:\\\"\\\"}.fa-usb:before{content:\\\"\\\"}.fa-product-hunt:before{content:\\\"\\\"}.fa-mixcloud:before{content:\\\"\\\"}.fa-scribd:before{content:\\\"\\\"}.fa-pause-circle:before{content:\\\"\\\"}.fa-pause-circle-o:before{content:\\\"\\\"}.fa-stop-circle:before{content:\\\"\\\"}.fa-stop-circle-o:before{content:\\\"\\\"}.fa-shopping-bag:before{content:\\\"\\\"}.fa-shopping-basket:before{content:\\\"\\\"}.fa-hashtag:before{content:\\\"\\\"}.fa-bluetooth:before{content:\\\"\\\"}.fa-bluetooth-b:before{content:\\\"\\\"}.fa-percent:before{content:\\\"\\\"}.fa-gitlab:before{content:\\\"\\\"}.fa-wpbeginner:before{content:\\\"\\\"}.fa-wpforms:before{content:\\\"\\\"}.fa-envira:before{content:\\\"\\\"}.fa-universal-access:before{content:\\\"\\\"}.fa-wheelchair-alt:before{content:\\\"\\\"}.fa-question-circle-o:before{content:\\\"\\\"}.fa-blind:before{content:\\\"\\\"}.fa-audio-description:before{content:\\\"\\\"}.fa-volume-control-phone:before{content:\\\"\\\"}.fa-braille:before{content:\\\"\\\"}.fa-assistive-listening-systems:before{content:\\\"\\\"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:\\\"\\\"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:\\\"\\\"}.fa-glide:before{content:\\\"\\\"}.fa-glide-g:before{content:\\\"\\\"}.fa-signing:before,.fa-sign-language:before{content:\\\"\\\"}.fa-low-vision:before{content:\\\"\\\"}.fa-viadeo:before{content:\\\"\\\"}.fa-viadeo-square:before{content:\\\"\\\"}.fa-snapchat:before{content:\\\"\\\"}.fa-snapchat-ghost:before{content:\\\"\\\"}.fa-snapchat-square:before{content:\\\"\\\"}.fa-pied-piper:before{content:\\\"\\\"}.fa-first-order:before{content:\\\"\\\"}.fa-yoast:before{content:\\\"\\\"}.fa-themeisle:before{content:\\\"\\\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\\\"\\\"}.fa-fa:before,.fa-font-awesome:before{content:\\\"\\\"}.fa-handshake-o:before{content:\\\"\\\"}.fa-envelope-open:before{content:\\\"\\\"}.fa-envelope-open-o:before{content:\\\"\\\"}.fa-linode:before{content:\\\"\\\"}.fa-address-book:before{content:\\\"\\\"}.fa-address-book-o:before{content:\\\"\\\"}.fa-vcard:before,.fa-address-card:before{content:\\\"\\\"}.fa-vcard-o:before,.fa-address-card-o:before{content:\\\"\\\"}.fa-user-circle:before{content:\\\"\\\"}.fa-user-circle-o:before{content:\\\"\\\"}.fa-user-o:before{content:\\\"\\\"}.fa-id-badge:before{content:\\\"\\\"}.fa-drivers-license:before,.fa-id-card:before{content:\\\"\\\"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:\\\"\\\"}.fa-quora:before{content:\\\"\\\"}.fa-free-code-camp:before{content:\\\"\\\"}.fa-telegram:before{content:\\\"\\\"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:\\\"\\\"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:\\\"\\\"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:\\\"\\\"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:\\\"\\\"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:\\\"\\\"}.fa-shower:before{content:\\\"\\\"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:\\\"\\\"}.fa-podcast:before{content:\\\"\\\"}.fa-window-maximize:before{content:\\\"\\\"}.fa-window-minimize:before{content:\\\"\\\"}.fa-window-restore:before{content:\\\"\\\"}.fa-times-rectangle:before,.fa-window-close:before{content:\\\"\\\"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:\\\"\\\"}.fa-bandcamp:before{content:\\\"\\\"}.fa-grav:before{content:\\\"\\\"}.fa-etsy:before{content:\\\"\\\"}.fa-imdb:before{content:\\\"\\\"}.fa-ravelry:before{content:\\\"\\\"}.fa-eercast:before{content:\\\"\\\"}.fa-microchip:before{content:\\\"\\\"}.fa-snowflake-o:before{content:\\\"\\\"}.fa-superpowers:before{content:\\\"\\\"}.fa-wpexplorer:before{content:\\\"\\\"}.fa-meetup:before{content:\\\"\\\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.ruleset-object-copy-modal .copied-objects-container{border:1px solid #dbdbdb;background:#dbdbdb;border-radius:5px;max-height:160px;overflow-y:auto}.ruleset-object-copy-modal .copied-objects-list{border:1px solid #dbdbdb;background:#fff}.form-group.im-request-salesforce-user-state .k-widget.k-dropdown{height:30px}.sap-security-designer .input-group-addon .fa-stack.fa-stack-small{font-size:.7em}.sap-security-designer .copy-grid .k-grid-content{max-height:20em}.sap-security-designer .list-item{padding:0px}.sap-security-designer .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.sap-security-designer .list-item-row-button:hover{background-color:#e0e0e0}.sap-simulation-risk-analysis-report .k-grid-content{min-height:340px}.saved-reports .no-reports{color:#d5d5d6;text-align:center;font-size:40px}.saved-reports .no-reports p:nth-child(3){font-size:15px}.rounded-border{border-radius:5px}.custom-ibox ::-webkit-scrollbar{scrollbar-width:thin;scrollbar-color:#dedede #f9f9f9;width:12px;border:1px solid #dedede}.custom-ibox ::-webkit-scrollbar-track{background:#f9f9f9}.custom-ibox ::-webkit-scrollbar-thumb{background-color:#dedede;border-radius:20px;border:3px solid #f9f9f9}.custom-ibox .ibox-dropdown{color:#121321 !important;max-width:240px;border-radius:5px;padding:6px 16px 6px 12px;font-size:12px}.custom-ibox .ibox-dropdown-sm{color:#121321 !important;max-width:150px;border-radius:5px;padding:6px 16px 6px 12px;font-size:12px}.custom-ibox select{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:200px;padding-right:15px}.custom-ibox .criteria-drop{color:#121321 !important}.custom-ibox .form-group{margin:0}.custom-ibox label{margin:0}.custom-ibox .single-line{color:#121321 !important}.custom-ibox .full-span-ibox{width:100% !important}.custom-ibox .font-w-500{font-weight:500}.custom-ibox .font-12{font-size:12px}.custom-ibox .pill-radio{background:#fff;color:#121321;padding:2px 12px;margin-right:4px;font-size:11px;border-radius:14px;cursor:pointer;display:inline-block}.custom-ibox .pill-radio:hover{background:hsl(0,0%,96%);color:#121321;font-weight:800}.custom-ibox .pill-radio.active{background:hsl(0,0%,96%);color:#121321;font-weight:800}.custom-ibox .filter-pills-above-grid{background-color:#8ea7b8 !important}.custom-ibox .check-btn-placeholder{padding:11px}.custom-ibox .flex-vcenter{display:flex;align-items:center}.custom-ibox h5{margin:0}.custom-ibox .list-view-body{max-height:550px;overflow-y:auto}@media only screen and (max-width: 1223px){.custom-ibox .list-view-body{max-height:350px;overflow-y:auto}}@media only screen and (min-width: 1224px){.custom-ibox .list-view-body{max-height:350px;overflow-y:auto}}@media only screen and (min-width: 1824px){.custom-ibox .list-view-body{max-height:500px;overflow-y:auto}}.custom-ibox list-item{border-right:1px solid #c2c4cc}.custom-ibox .ibox-title{border-radius:5px 5px 0px 0px !important;background:#231556 !important;color:#fff;padding:10px 15px}.custom-ibox .ibox-title .switch :checked+i{box-shadow:inset 0 0 1px rgba(0,0,0,.38),inset 0 0 40px #291972;-webkit-box-shadow:inset 0 0 1px rgba(0,0,0,.38),inset 0 0 40px #291972}.custom-ibox .ibox-title .fa-plus{color:#291972}.custom-ibox .ibox-title .fa-pencil{color:#291972}.custom-ibox .ibox-title .fa-copy{color:#291972}.custom-ibox .fa-ellipsis-h{color:#291972}.custom-ibox .fa-filter{margin-right:5px}.custom-ibox .btn-default{border-radius:5px;padding:2px 6px}.custom-ibox .btn-secondary{font-weight:600;color:#291972;background:#fff}.custom-ibox .btn-secondary:hover{outline:none}.custom-ibox .btn-secondary:focus{outline:none}.custom-ibox .btn-secondary:active{outline:none}.custom-ibox .popover-title{color:gray}.custom-ibox .btn-blueRadio{color:gray}.custom-ibox .pagination-sm{color:#121321;font-weight:700;white-space:nowrap;overflow:hidden;background-color:#fff}.custom-ibox .pagination>li>a,.custom-ibox .pagination>li>span{background:#fff;border-color:#c2c4cc;color:#121321;font-weight:700;white-space:nowrap;overflow:hidden;margin:0;font-size:10px}.custom-ibox .pagination-sm>li:first-child>a,.custom-ibox .pagination-sm>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.custom-ibox .pagination-sm>li:last-child>a,.custom-ibox .pagination-sm>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.custom-ibox .pagination>.active>a,.custom-ibox .pagination>.active>span,.custom-ibox .pagination>.active>a:hover,.custom-ibox .pagination>.active>span:hover,.custom-ibox .pagination>.active>a:focus,.custom-ibox .pagination>.active>span:focus{background:hsl(0,0%,96%);color:#121321;border-color:#121321;font-weight:700}.custom-ibox .ibox-bottom-bar{padding:10px 15px;background:#eeeff2;border:1px solid #c2c4cc;border-radius:4px}.custom-ibox .ibox-bottom-bar .saved-message{color:#121321}.custom-ibox .ibox-bottom-bar .btn-default{background-color:#9e9caf}.ac-my-reviews .review-assignment-tile{padding:0px}.ac-my-reviews .review-submit-btn-wrap a{color:#fff}.ac-my-reviews .review-submit-btn-wrap span{font-size:12px;font-weight:600}.ac-my-reviews .list-item{padding:0px}.ac-my-reviews .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.ac-my-reviews .list-item-row-button:hover{background-color:#e0e0e0}.ac-my-reviews .ibox-title-p-xs{border-radius:5px 5px 0px 0px !important;background:#231556 !important;color:#fff;padding:10px}.ac-my-reviews .ibox-title-p-xs h5{font-size:22.5px}.ac-my-reviews span.btn a{color:#fff}.ac-my-reviews .btn-greenRadio:focus,.ac-my-reviews .btn-greenRadio:active,.ac-my-reviews .btn-greenRadio.active,.ac-my-reviews .open .dropdown-toggle.btn-greenRadio{background-color:#bafcd4;border-color:#007138;color:#007138 !important}.task-recording-manager .list-item{padding:0px}.task-recording-manager .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.task-recording-manager .list-item-row-button:hover{background-color:#e0e0e0}.task-recording-manager input{accent-color:#e74c3c}.task-recording-manager .btn-danger{background:#e74c3c;font-size:11px;padding:3px 6px;font-weight:bold}.task-recording-manager .bulk-delete{background:#fbe1de;color:#e74c3c;padding:5px 15px}.task-recording-manager .txt-danger{color:#e74c3c}.review-schedules .btn-blue{border:2px solid #291972;color:#fff;font-size:13px;font-weight:600;display:inline-block;padding:5px 10px;border-radius:4px;background:#291972}.review-schedules .btn-blue:focus{background-color:#261769;border-color:#261769;color:#fff}.review-schedules .btn-blue:hover{background-color:#261769;border-color:#261769;color:#00ff5a}.review-schedules .btn-red{color:RGBA(231, 76, 60, 1);border:2px solid RGBA(231, 76, 60, 1);font-size:13px;font-weight:600;display:inline-block;padding:5px 10px;border-radius:15px;background:#fff;font-weight:700}.review-schedules .btn-red:hover{background:RGBA(231, 76, 60, 0.15);color:RGBA(231, 76, 60, 1)}.review-schedules .sm-spinner-contain{position:relative;left:4px;width:24px;height:8px;display:flex}.review-schedules h3{margin:0px 15px 15px 15px}.review-schedules .review-item{width:100%;height:7em;padding:0px;margin:0px}.review-schedules .review-ibox{border-radius:5px;width:100%}.review-schedules .review-ibox .ibox-title{border-radius:5px 5px 0px 0px}.review-schedules .review-ibox .review-assignment-icon-circle{margin-right:10px}.review-schedules .review-ibox .ibox-content{border-radius:0px 0px 5px 5px}.review-schedules .review-ibox .col-xs-3,.review-schedules .review-ibox col-xs-9{padding:0px}.review-schedules .review-ibox h4:nth-child(1){color:RGBA(50, 119, 179, 1);margin:15px 15px 0px 15px}.review-schedules .review-ibox .btn-blue{margin-top:15px;margin-right:10px}.group-item-owners-list .label{white-space:normal}.group-item-owners-list .list-item{padding:0px}.group-item-owners-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.group-item-owners-list .list-item-row-button:hover{background-color:#e0e0e0}.inbox-styles *{scrollbar-width:thin;scrollbar-color:#e7e7e7 #fff}.inbox-styles ::-webkit-scrollbar{width:12px;border:1px solid #e7e7e7}.inbox-styles ::-webkit-scrollbar-track{background:#fff}.inbox-styles ::-webkit-scrollbar-thumb{background-color:#e7e7e7;border-radius:20px;border:3px solid #fff}.inbox-styles .caret{margin-left:10px}.inbox-styles .list-view-body{max-height:500px;overflow-y:auto}.inbox-styles .no-left-padding{padding-left:0px}.inbox-styles .inbox-red{color:#ba0003}.inbox-styles .ibox-title{color:#121321;padding:15px;border-radius:5px}.inbox-styles .ibox{border-radius:4px}.inbox-styles .list-item{background:#fff}.inbox-styles .list-item:nth-child(even){background:#fff}.inbox-styles label{font-weight:normal}.inbox-styles p{color:#707070;font-size:10px;text-align:center}.inbox-styles .btn-default .badge{background-color:#ffd5d6;color:#ba0003;border:1px solid #f91d21}.inbox-styles .btn-primary{font-size:12px;font-weight:bold}.inbox-styles .btn-primary:hover{outline:none}.inbox-styles .btn-primary:focus{outline:none}.inbox-styles .btn-primary:active{outline:none}.inbox-styles .btn-success{font-size:12px;font-weight:bold}.inbox-styles .btn-success:hover{background-color:#25a75c;border-color:#25a75c;color:#fff}.inbox-styles .btn-success:focus{background-color:#25a75c;border-color:#25a75c;color:#fff}.inbox-styles .btn-success:active{background-color:#25a75c;border-color:#25a75c;color:#fff}.inbox-styles .open .dropdown-toggle.btn-success{background-color:#25a75c;border-color:#25a75c;color:#fff}.inbox-styles .btn-default{padding:25px 20px;width:300px;color:#121321;background-color:#fff;border-color:#c2c4cc}.inbox-styles .btn-default:hover{background:#f5f5f5;color:#121321;outline:none}.inbox-styles .btn-default:active{background:#e0e0e0;color:#121321;border-color:#c2c4cc;outline:none}.inbox-styles .btn-default:active:focus{color:#121321;background-color:#e0e0e0;border-right:4px solid #291972;outline:none;font-weight:bold}.inbox-styles .btn-default:active:hover{color:#121321;background-color:#f5f5f5;border-color:#c2c4cc;outline:none}.inbox-styles .btn-default:focus{background:#e0e0e0;color:#121321;font-weight:bold;border-right:4px solid #291972;outline:none}.maintain-risk-ruleset .list-item{padding:0px}.maintain-risk-ruleset .list-item-row-button{position:relative;border-left:1px solid #e7e7e7}.maintain-risk-ruleset .select-mode{border-right:1px solid #e7ecea;cursor:pointer}.maintain-risk-ruleset input{accent-color:#5da45e;cursor:pointer}.maintain-risk-ruleset .btn-copy{background:#5da45e;font-size:11px;padding:3px 6px;font-weight:bold;color:#fff}.maintain-risk-ruleset .btn-copy:hover{background:#579858;font-size:11px;padding:3px 6px;font-weight:bold}.maintain-risk-ruleset .bulk-copy{background:#e3efe3;color:#5da45e;padding:5px 15px}.maintain-risk-ruleset .text-copy{color:#5da45e}.maintain-business-process .list-item{padding:0px}.maintain-business-process .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.maintain-business-process .list-item-row-button:hover{background-color:#e0e0e0}.maintain-business-process .select-mode{cursor:pointer;border-right:1px solid #c2c4cc}.maintain-business-process input{accent-color:#5da45e;cursor:pointer}.maintain-business-process .btn-copy{background:#5da45e;font-size:11px;padding:3px 6px;font-weight:bold;color:#fff}.maintain-business-process .btn-copy:hover{background:#579858;font-size:11px;padding:3px 6px;font-weight:bold}.maintain-business-process .bulk-copy{background:#e3efe3;color:#5da45e;padding:5px 15px}.maintain-business-process .text-copy{color:#5da45e}.certifications-all-review .list-item{padding:0px}.certifications-all-review .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.certifications-all-review .list-item-row-button:hover{background-color:#e0e0e0}.certifications-all-review .fa-filter{margin:0}.notification-teams .list-item{padding:0px}.notification-teams .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.notification-teams .list-item-row-button:hover{background-color:#e0e0e0}.review-schedule-instances-list .list-item{padding:0px}.review-schedule-instances-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.review-schedule-instances-list .list-item-row-button:hover{background-color:#e0e0e0}.instance-assignments-list .list-item{padding:0px}.instance-assignments-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.instance-assignments-list .list-item-row-button:hover{background-color:#e0e0e0}.review-schedule-routing-criteria-instances-list .list-item{padding:0px}.review-schedule-routing-criteria-instances-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.review-schedule-routing-criteria-instances-list .list-item-row-button:hover{background-color:#e0e0e0}.generated-reports .list-item{padding:0px}.generated-reports .list-item-row-button{position:relative;border-left:1px solid #e7e7e7}.sim-risk-analysis .sapBack{font-size:1.5em;margin:5px}.sim-risk-analysis .sapBack:focus{outline:none}.sim-risk-analysis .btn-detailed{background:#2881eb;font-weight:700;color:#fff;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px;margin:5px}.sim-risk-analysis .btn-detailed:hover{background:#2876d4}.sim-risk-analysis .btn-detailed:active{background:#2876d4}.sim-risk-analysis .btn-detailed:focus{background:#2876d4;outline:none}.sim-risk-analysis .btn-single{background:#2881eb;font-weight:700;color:#fff;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px;margin:5px}.sim-risk-analysis .btn-single:hover{background:#2876d4}.sim-risk-analysis .btn-single:active{background:#2876d4}.sim-risk-analysis .btn-single:focus{background:#2876d4;outline:none}.sim-risk-analysis .btn-composite{background:#62bd60;font-weight:700;color:#fff;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px;margin:5px}.sim-risk-analysis .btn-composite:hover{background:#5aa758}.sim-risk-analysis .btn-composite:active{background:#5aa758}.sim-risk-analysis .btn-composite:focus{background:#5aa758;outline:none}.migrations-list .list-item{padding:0px}.migrations-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.migrations-list .list-item-row-button:hover{background-color:#e0e0e0}.sap-auth-field-groups .table{margin-bottom:0px}.approval-groups .list-item{padding:0px}.approval-groups .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.approval-groups .list-item-row-button:hover{background-color:#e0e0e0}.company-templates-list .list-item{padding:0px}.company-templates-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.company-templates-list .list-item-row-button:hover{background-color:#e0e0e0}.company-templates-companies-list .list-item{padding:0px}.company-templates-companies-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.company-templates-companies-list .list-item-row-button:hover{background-color:#e0e0e0}.notification-types-list .list-item{padding:0px}.notification-types-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.notification-types-list .list-item-row-button:hover{background-color:#e0e0e0}.notification-types-list .panel-heading{background-color:#fff}.ownership-groups-list .list-item{padding:0px}.ownership-groups-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.ownership-groups-list .list-item-row-button:hover{background-color:#e0e0e0}.group-roles-list .list-item{padding:0px}.group-roles-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.group-roles-list .list-item-row-button:hover{background-color:#e0e0e0}.group-owners-list .list-item{padding:0px}.group-owners-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.group-owners-list .list-item-row-button:hover{background-color:#e0e0e0}.group-multiselect-dropdown div.k-multiselect-wrap{max-height:15em;overflow:auto}.group-owner-items-list .label{white-space:normal}.group-owner-items-list .list-item{padding:0px}.group-owner-items-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.group-owner-items-list .list-item-row-button:hover{background-color:#e0e0e0}.requester-groups-list .list-item{padding:0px}.requester-groups-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.requester-groups-list .list-item-row-button:hover{background-color:#e0e0e0}.requester-group-users-list .list-item{padding:0px}.requester-group-users-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.requester-group-users-list .list-item-row-button:hover{background-color:#e0e0e0}.role-templates-list .list-item{padding:0px}.role-templates-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.role-templates-list .list-item-row-button:hover{background-color:#e0e0e0}.role-template-roles-list .list-item{padding:0px}.role-template-roles-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.role-template-roles-list .list-item-row-button:hover{background-color:#e0e0e0}.fastpath-user-list .list-item{padding:0px}.fastpath-user-list .list-item-row-button{position:relative;border-left:1px solid #c2c4cc}.fastpath-user-list .list-item-row-button:hover{background-color:#e0e0e0}.roles .list-item{padding:0px}.roles .list-item-row-button{position:relative;border-left:1px solid #e7e7e7}.roles .k-grid.k-widget .k-grid-content{max-height:503px}@media only screen and (max-width: 1223px){.roles .k-grid.k-widget .k-grid-content{max-height:303px}}@media only screen and (min-width: 1224px){.roles .k-grid.k-widget .k-grid-content{max-height:303px}}@media only screen and (min-width: 1824px){.roles .k-grid.k-widget .k-grid-content{max-height:453px}}.users .list-item{padding:0px}.users .list-item-row-button{position:relative;border-left:1px solid #e7e7e7}.security-assignment .list-item{padding:0px}.security-assignment .k-grid.k-widget .k-grid-content{max-height:503px}@media only screen and (max-width: 1223px){.security-assignment .k-grid.k-widget .k-grid-content{max-height:303px}}@media only screen and (min-width: 1224px){.security-assignment .k-grid.k-widget .k-grid-content{max-height:303px}}@media only screen and (min-width: 1824px){.security-assignment .k-grid.k-widget .k-grid-content{max-height:453px}}.identity-manager-request-details-view .request-view{padding:0px 10px}.identity-manager-request-details-view .request-view h3{font-size:11px;text-transform:uppercase;font-weight:700;margin-top:0px}.identity-manager-request-details-view .request-view p{font-size:13px}.identity-manager-request-details-view .request-view .request-expiration{color:#ba0003;font-weight:700}.identity-manager-request-details-view .request-details-headers{background-color:#fff}.identity-manager-request-details-view .request-details-headers h4{font-size:22.5px;font-weight:600}.identity-manager-request-details-view .request-details-content{padding:15px;background:#fff;border-top:1px solid #c2c4cc;border-bottom:1px solid #c2c4cc}.identity-manager-request-details-view .rd-header-tabs{border:none;padding:5px}.identity-manager-request-details-view .rd-container{border:none}.identity-manager-request-details-view .rd-notes list-item{border:1px solid #c2c4cc;border-radius:4px;padding:10px;background-color:#fff}.identity-manager-request-details-view .list-item{padding:15px}.identity-manager-request-details-view .table{margin-bottom:0px}.identity-manager-request-details-view .btn-approve-selected{background:#bafcd4;color:#007138;font-weight:700;border-radius:4px;border:1px solid #007138;padding:5px 10px}.identity-manager-request-details-view .btn-approve-selected:hover{background:#007138;color:#bafcd4;border:1px solid #007138}.identity-manager-request-details-view .btn-approve-selected:focus{background:#007138;color:#bafcd4;border:1px solid #007138}.identity-manager-request-details-view .btn-delegate-selected{background:#93deff;color:#0359a6;font-weight:700;padding:5px 10px;border-radius:4px;border:1px solid #0359a6}.identity-manager-request-details-view .btn-delegate-selected:hover{background:#0359a6;color:#93deff;border:1px solid #0359a6}.identity-manager-request-details-view .btn-delegate-selected:focus{background:#0359a6;color:#93deff;border:1px solid #0359a6}.identity-manager-request-details-view .btn-deny-selected{background:#ffd5d6;color:#ba0003;font-weight:700;padding:5px 10px;border-radius:4px;border:1px solid #f91d21}.identity-manager-request-details-view .btn-deny-selected:hover{background:#ba0003;color:#ffd5d6;border:1px solid #f91d21}.identity-manager-request-details-view .btn-deny-selected:focus{background:#ba0003;color:#ffd5d6;border:1px solid #f91d21}.identity-manager-request-details-view .table-striped tbody tr.req-access-approve:nth-of-type(odd),.identity-manager-request-details-view .table-striped tbody tr.req-access-approve:nth-of-type(even){background:#bafcd4}.identity-manager-request-details-view .table-striped tbody tr.req-access-approve:nth-of-type(odd) td:nth-child(2),.identity-manager-request-details-view .table-striped tbody tr.req-access-approve:nth-of-type(even) td:nth-child(2){color:#007138}.identity-manager-request-details-view .table-striped tbody tr.req-access-deny:nth-of-type(odd),.identity-manager-request-details-view .table-striped tbody tr.req-access-deny:nth-of-type(even){background:#ffd5d6}.identity-manager-request-details-view .table-striped tbody tr.req-access-deny:nth-of-type(odd) td:nth-child(2),.identity-manager-request-details-view .table-striped tbody tr.req-access-deny:nth-of-type(even) td:nth-child(2){color:#ba0003}.identity-manager-request-details-view .table-striped tbody tr.req-access-delegated:nth-of-type(odd),.identity-manager-request-details-view .table-striped tbody tr.req-access-delegated:nth-of-type(even){background:#93deff}.identity-manager-request-details-view .table-striped tbody tr.req-access-delegated:nth-of-type(odd) td:nth-child(2),.identity-manager-request-details-view .table-striped tbody tr.req-access-delegated:nth-of-type(even) td:nth-child(2){color:#0359a6}.identity-manager-request-details-view .associated-items-table{border:1px solid #c2c4cc;border-radius:5px;width:100%;height:auto;overflow-y:scroll;max-height:135px;margin-bottom:5px}.identity-manager-request-details-view .label{display:inline-block}.identity-manager-request-details-view .label-info{background-color:#eeeff2;color:#121321;border:1px solid #121321}.identity-manager-request-details-view .label-warning{background-color:#ffd7b8;color:#820;border:1px solid #ff8120}.identity-manager-request-details-view .label-danger{background-color:#ffd5d6;color:#ba0003;border:1px solid #f91d21}.identity-manager-request-details-view .label-success{background-color:#bafcd4;color:#007138;border:1px solid #007138}.identity-manager-request-details-view .text-success{color:#007138}.identity-manager-request-details-view .text-warning{color:#ff8120}.identity-manager-request-details-view .text-danger{color:#ba0003}.identity-manager-request-details-view .pill-radio{background:#fff;color:#121321;padding:2px 12px;margin-right:4px;font-size:11px;border-radius:4px;cursor:pointer;display:inline-block}.identity-manager-request-details-view .pill-radio:hover{background:hsl(0,0%,96%);color:#121321;font-weight:800}.identity-manager-request-details-view .pill-radio.active{background:#291972;color:#00ff5a;font-weight:800}.identity-manager-request-details-view .vAccordion--default v-pane-content div{padding-bottom:0}.identity-manager-request-details-view .vAccordion--default v-pane.is-expanded v-pane-header{color:#291972;border-color:#c2c4cc}.identity-manager-request-details-view .custom-vPane-header{border:0;padding-left:40px}.identity-manager-request-details-view .custom-vPane-header h4{margin-bottom:0;color:#121321}.identity-manager-request-details-view .custom-vPane-header:hover{color:#291972}.identity-manager-request-details-view .custom-vPane-header:focus{color:#291972}.identity-manager-request-details-view .vAccordion--default v-pane.is-expanded .custom-vPane-header{color:#291972}.identity-manager-request-details-view .icons8-new-window{cursor:pointer;font-size:20px;color:#121321}.configuration .company-logo{max-width:150px;height:auto}.configuration table{margin-bottom:0px}.ownership-group-assignments div[list-view]{height:300px;overflow:auto}.maintain-templates-list .list-item{padding:0px}.maintain-templates-list .list-item-row-button{position:relative;border-left:1px solid #e7e7e7}.maintain-system-roles .pill-radio{padding:3px 8px;margin-right:5px;background:#8ea7b8;color:#fff;font-weight:700}.maintain-system-roles .pill-radio:hover{background:#5a90bf;color:#fff;font-weight:700}.maintain-system-roles .pill-radio:active{background:#5a90bf;color:#fff;font-weight:700}.maintain-system-roles .pill-radio.active{background:#5a90bf;color:#fff;font-weight:700}.maintain-system-roles .badge{font-size:11px}.maintain-system-roles .maintain-system-roles .active-card{background-color:#291972;color:#fff}.maintain-system-roles .maintain-system-roles-modal .k-grid-content{min-height:290px}.system-user-mappings-scrollable{max-height:470px;overflow-y:scroll}.bottom-border{border-bottom:1px solid #c2c4cc}.modal-body .k-grid-content{min-height:100px}*{scrollbar-width:thin;scrollbar-color:#aaa #e7e7e7}::-webkit-scrollbar{height:12px;width:12px;border:1px solid #aaa}::-webkit-scrollbar-track{background:#e7e7e7}::-webkit-scrollbar-thumb{background-color:#aaa;border-radius:20px;border:3px solid #e7e7e7}.k-grouping-row td,.k-group-footer td,.k-grid-footer td{color:#291972}.k-popup.k-list-container{width:450px !important}.k-i-loading{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_15___ + \")}.k-i-loading.k-hidden{display:none}.k-loading-image{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_16___ + \");background-position:top;background-position-y:35%;background-color:rgba(51,51,51,.0588235294)}.k-grid tr td{border-color:#c2c4cc}.k-grid tr td{border-width:0 0 0 0}.k-gantt-toolbar .k-state-default,.k-grid .k-grouping-header,.k-grid-header,.k-grid-header-wrap,.k-grouping-header .k-group-indicator,.k-header,.k-pager-wrap,.k-pager-wrap .k-link,.k-pager-wrap .k-textbox{border-color:#c2c4cc;background-color:#fff}.k-grid input.k-checkbox+label.k-checkbox-label{cursor:pointer}.k-grid-header th.k-header{font-weight:800}.k-autocomplete,.k-block,.k-button-group .k-tool,.k-calendar th,.k-colorpicker .k-i-arrow-s,.k-content,.k-dropdown-wrap,.k-dropzone-active,.k-editable-area,.k-filter-row>th,.k-footer-template td,.k-grid td,.k-grid td.k-state-selected,.k-grid-content-locked,.k-grid-footer,.k-grid-footer-locked,.k-grid-footer-wrap,.k-grid-header,.k-grid-header-locked,.k-grid-header-wrap,.k-group,.k-group-footer td,.k-grouping-header,.k-grouping-header .k-group-indicator,.k-header,.k-input,.k-pager-refresh,.k-pager-wrap,.k-pager-wrap .k-link,.k-panel>.k-item>.k-link,.k-panelbar .k-content,.k-panelbar .k-panel,.k-panelbar>.k-item>.k-link,.k-separator,.k-slider-track,.k-splitbar,.k-state-default,.k-state-default .k-select,.k-state-disabled,.k-textbox,.k-textbox>input,.k-tiles,.k-toolbar,.k-tooltip,.k-treemap-tile,.k-upload-files,.k-widget{border-color:#c2c4cc}.k-button.k-state-hover,.k-button:hover{color:#333;border-color:#cecece;background-color:#ebebeb}.k-button{color:#333;border-color:#dbdbdb;background-color:#fff}.k-autocomplete.k-state-default,.k-dropdown-wrap.k-state-default,.k-multiselect.k-header,.k-numeric-wrap.k-state-default,.k-picker-wrap.k-state-default{border-color:#dbdbdb}.criteria-container .k-dropdown>.k-dropdown-wrap{padding:5px 0px}.criteria-container .k-dropdown>.k-dropdown-wrap>.k-select{padding-top:3px}.k-dropdown-wrap.k-state-hover{background:#fff}.k-grid tbody tr:last-child td{border-bottom:1px solid #f5f5f5}.cross-platform-users .k-grid tbody tr{height:50px}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{opacity:85%;pointer-events:none}.inline-block{display:inline-block;vertical-align:top}.vr{border-left:1px solid #eee;margin:0 8px;height:18px}.vr-ra{border-left:1px solid #d3d3d3;margin:0 8px;height:18px}.selected-tenant-in-dropdown{background-color:#e2e7e9;border-radius:4px;pointer-events:none}.set-min-col-width .k-grid col{width:150px}.sweet-alert-pre-wrap{white-space:pre-wrap}body.mini-navbar .nav-header{padding:0;background-color:#231556}.places-dropdown-shell{padding-bottom:10px}.places-dropdown-shell .form-inline .input-group{display:table}.nav-header{background-color:#231556}.semi-transparent-nav-icon{opacity:.32}.center-grid-icon{text-align:center}.search-icon{width:12px;margin-bottom:8px;margin-left:4px}.ad-user-link-text{vertical-align:bottom}.grid-trash-icon{font-size:1.2em;color:red;display:inline-flex}.trash-icon-sd{font-size:1.3em;display:inline-flex;margin:0 6px 0px 0}.sd-table-fields-pill-padding{padding:3px 8px}.plus-icon-trm{font-size:1.8em;display:inline-flex}.floating-left-icon{width:42px;float:left;height:100%;margin-top:4px}.float-icon8-left{width:42px;float:left;margin-top:-4px}.k-filter-row label>input[type=radio]{accent-color:#291972}input[type=radio]{accent-color:#291972}.input-sm{font-size:11px;border-radius:4px}input[type=checkbox]{accent-color:#291972;cursor:pointer}.label-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.elastic-builder .btn-primary{background-color:#291972;border-color:#291972;color:#fff}.elastic-builder .btn-primary:hover,.elastic-builder .btn-primary .active,.elastic-builder .btn-primary:active,.elastic-builder .btn-primary .open>.dropdown-toggle.btn-primary{background-color:#231556}.btn-primary{background-color:#291972;border-color:#291972;color:#fff}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-color:#231556}.searchBoxIcon{color:#2791d9;padding-right:8px;padding-left:4px}.risk-details-for-mitigate-modal{background-color:#f4f4f4;padding:16px 24px;margin-bottom:10px}.table-max-height-250{max-height:250px;overflow:auto;overflow-x:hidden}.dropdown-max-height{max-height:650px;overflow:auto;overflow-x:hidden}#dropdown-prevent-default{left:0;right:auto}.NavigationIcon{height:20px;width:20px;display:inline-block;background-size:20px 20px;background-repeat:no-repeat;vertical-align:middle;margin-bottom:2px}.NavigationIcon_review_assignments{height:45px;width:45px;display:inline-block;background-size:45px 45px;background-repeat:no-repeat;vertical-align:middle}.CustomIcon10{height:10px;width:10px;display:inline-block;background-size:10px 10px;background-repeat:no-repeat;vertical-align:middle;margin-right:3px;margin-bottom:2px}.custom-icon-for-h4{height:18px;width:18px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle;padding-bottom:20px}.custom-circle-icon{height:12px;width:12px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle}.custom-icon-30{height:30px;width:30px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle;padding-bottom:20px}.custom-icon-20{height:20px;width:20px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle;padding-bottom:20px}.height-width-80{height:80px;width:80px;background-size:contain}.custom-icon-for-inline-text{height:12px;width:12px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle;padding-bottom:14px}.delinea-plus{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_17___ + \")}.custom-icon-for-p{height:15px;width:15px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle;padding-bottom:16px}.noSecurityModelsLogo{height:150px;width:150px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle}.SecurityDesignerCircleOnly{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_17___ + \")}.wrap-security-model-name{overflow-wrap:break-word}.padding-left-10{padding-left:10px}.label-dimgrey{background:#eeeff2;color:#121321;border:1px solid #121321}.label-darkgray{background:#0a0a0a;color:#47535f}.error-req{color:#ba0003;font-size:14px}.count-info .badge{line-height:12px;padding:2px 5px;position:absolute;right:6px;top:12px}.icons8-risk-analysis-results{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_18___ + \")}.icons8-submit-progress{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_19___ + \")}.defaultMitigationIcon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_20___ + \")}.Integrations{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_21___ + \")}.IntegrationsPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_22___ + \")}.ChangeTracking{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_23___ + \")}.ChangeTrackingPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_24___ + \")}.AccessControl{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_25___ + \")}.AccessControlPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_26___ + \")}.AccessCertifications{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_27___ + \")}.AccessCertificationsPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_28___ + \")}.Setup{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_29___ + \")}.SetupPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_30___ + \")}.SecuritySetup{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_31___ + \")}.SecuritySetupPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_32___ + \")}.SystemConfiguration{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_29___ + \")}.SystemConfigurationPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_30___ + \")}.ReportManagement{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_33___ + \")}.ReportManagementPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_34___ + \")}.DataTransfer{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_35___ + \")}.SecurityDesigner{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_36___ + \")}.SecurityDesignerPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_37___ + \")}.IdentityManager{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_38___ + \")}.IdentityManagerPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_39___ + \")}.TransactionMonitoring{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_40___ + \")}.TransactionMonitoringPurple{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_41___ + \")}.x-circle-12{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_42___ + \");height:15px;width:15px;display:inline-block;background-size:contain;background-repeat:no-repeat;vertical-align:middle;padding-bottom:20px;margin-left:4px}.uploadIcon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_43___ + \")}.dataBasePurge{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_44___ + \")}.dataBaseCollect{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_45___ + \")}.dataBaseArchive{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_46___ + \")}.dataBaseRestore{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_47___ + \")}.snapshotCollect{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_48___ + \")}.menu-item-shield{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_49___ + \")}.xml-box-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_50___ + \")}.information{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_51___ + \")}.information-fade{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_52___ + \")}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{background:#fff}.navbar-default{font-weight:normal;font-size:12px}.k-grid,.k-scheduler,.k-menu,.k-editor{border-radius:0px}.k-block,.k-button,.k-textbox,.k-drag-clue,.k-touch-scrollbar,.k-window,.k-window-titleless .k-window-content,.k-window-action,.k-inline-block,.k-grid .k-filter-options,.k-grouping-header .k-group-indicator,.k-autocomplete,.k-multiselect,.k-combobox,.k-dropdown,.k-dropdown-wrap,.k-datepicker,.k-timepicker,.k-colorpicker,.k-datetimepicker,.k-notification,.k-numerictextbox,.k-picker-wrap,.k-numeric-wrap,.k-colorpicker,.k-list-container,.k-calendar-container,.k-calendar td,.k-calendar .k-link,.k-treeview .k-in,.k-editor-inline,.k-tooltip,.k-tile,.k-slider-track,.k-slider-selection,.k-upload,.k-split-button{border-radius:0px}.list-group-item{border:0px}.k-widget.k-tooltip-validation{border-color:#ffdeab;background-color:#ffdeab;color:#2d2d2d}.glyphicon-star-favorite:before{content:\\\"\\\";font-size:18px;color:#291972}.glyphicon-star-favorite-empty:before{content:\\\"\\\";font-size:18px;color:#121321}.navigationPlaceMarker{color:#2791d9}.hr-line-dashed-thin{border-top:1px dashed #c2c4cc;color:#fff;background-color:#fff;height:1px;margin:14px 0}.params-box-minimize{position:absolute;bottom:0px;color:#434343;padding-top:2px;padding-bottom:2px;padding-left:8px;padding-right:8px;border-top-right-radius:5px;border-top-left-radius:5px;font-size:11px;width:150px}.params-box-minimize:hover,.params-box-minimize:focus{background-color:#d1dadd;color:#646a6c}.marginBottom{margin-bottom:20px}.marginTopRequestManagement{margin-top:30px}.marginBottomTen{margin-bottom:10px}.whiteText{color:#fff}.whiteHelpIcon{color:#121321;font-size:13px}.blue-report-header{background:#fff}.import-progress-bar{background:#ffbd55}.progress-bar-bad-data{background-color:#cbcbcb;color:#595959}.navbar-fixed-top,.navbar-static-top{background:#fff}.headerPaddingTwenty{padding-left:20px}.headerPaddingThirty{padding-left:28px}.reportParametersBox{padding-top:20px;padding-bottom:25px;padding-right:30px;padding-left:30px;background:#fff;position:relative}.ibox{box-shadow:0 2px 10px 0 rgba(0,0,0,.12)}.panel-body{border-radius:0px}.darkBlueButtonHeader{background-color:#1b527e;border-color:#1b527e;border:1px solid #1b527e;color:#fff}.darkBlueButtonHeader:hover,.darkBlueButtonHeader:focus,.darkBlueButtonHeader:active,.darkBlueButtonHeader.active,.open .dropdown-toggle.darkBlueButtonHeader{background-color:#163450;border-color:#163450;border:1px solid #163450;color:#fff}.k-state-selected a,.k-state-selected:link a{color:#fff;font-weight:bold}.btn{border-radius:4px}.filter-dropdown-width{width:220px}textarea{resize:none;border-radius:4px}.form-control,.single-line{border:1px solid #c2c4cc;border-radius:4px}.alert{margin-bottom:2px;border-radius:4px;border:none;font-weight:700}.alert-info{color:#664b00;background-color:#fff0be;border-left:4px solid #ffd942}.alert-warning{background-color:#ffd7b8;color:#820;border-left:4px solid #ff8120}.alert-danger{background-color:#ffd5d6;color:#ba0003;border-left:4px solid #f91d21}.alert-success{background-color:#bafcd4;color:#007138;border-left:4px solid #007138}.btn-blue{border:2px solid #291972;color:#fff;font-size:13px;font-weight:600;display:inline-block;padding:5px 10px;border-radius:4px;background:#291972}.btn-blue:focus{background-color:#261769;border-color:#261769;color:#fff}.btn-blue:hover{background-color:#261769;border-color:#261769;color:#00ff5a}.btn-red{color:RGBA(231, 76, 60, 1);border:2px solid RGBA(231, 76, 60, 1);font-size:13px;font-weight:600;display:inline-block;padding:5px 10px;border-radius:15px;background:#fff;font-weight:700}.btn-red:hover{background:RGBA(231, 76, 60, 0.15);color:RGBA(231, 76, 60, 1)}.btn-green{color:RGBA(123, 197, 123, 1);border:2px solid RGBA(123, 197, 123, 1);font-size:13px;font-weight:600;display:inline-block;padding:5px 10px;border-radius:15px;background:#fff;font-weight:700}.btn-green:hover{background:RGBA(123, 197, 123, 0.15);color:RGBA(123, 197, 123, 1)}.btn-orange{color:RGBA(249, 182, 105, 1);border:2px solid RGBA(249, 182, 105, 1);font-size:13px;font-weight:600;display:inline-block;padding:5px 10px;border-radius:15px;background:#fff;font-weight:700}.btn-orange:hover{background:RGBA(249, 182, 105, 0.1);color:RGBA(249, 182, 105, 1)}.btn-light{color:#707070;border:1px solid #c2c3c4;font-size:13px;font-weight:600;display:inline-block;padding:5px 10px;border-radius:5px;background:#fff;font-weight:700}.btn-light:hover{background:#f4f4f4}.btn-modalClose{color:#4b4f66;border:none;background:#fff}.btn-modalClose:hover{color:#ba0003}.btn-modalClose i{font-size:1.3333333333em}.gridToolbarWrapper{border:1px solid #dbdbdb}.customToolbar{padding:4px;border-bottom:1px solid #dbdbdb;background-color:#fff}.hr-line-dashed-extra-padding{border-top:1px dashed #c2c4cc;color:#fff;background-color:#fff;height:1px;margin:30px 0}#custom-bootstrap-menu.navbar-default{font-size:12px;background-color:#e2e7e9}#custom-bootstrap-menu.navbar-default .nav>li{padding-right:4px}.nav>li.activeNoBorder{background-color:#242633;border-left:none}.gridToolbarWrapper .k-grid{border:none}.navbar-form-custom .form-group{margin-bottom:14px;margin-top:13px}.navbar-form-custom .form-control{height:31px}.navbar .form-control:focus{background:#fff}.progress-strip{height:20px;background-color:#07061d}.params-submit-button{position:absolute;right:30px;bottom:12px}.navbar .dropdown-menu{border-radius:0px}.list-group.clear-list .list-group-item{padding-right:10px}.k-grid-content{max-height:540px}.big-icon{font-size:110px !important}.big-icon-50{font-size:50px !important}.new-wizard-icon:hover{color:#595d72}.modify-wizard-icon:hover{color:#595d72}.terminate-wizard-icon:hover{color:#595d72}.passwordRequirementMet{color:#5cb85c}.selectedBigIcon{color:#76798b}.selectedBigIcon:hover{color:#595d72}.wizard-progress-container{margin-top:20px;padding:15px;width:100%;position:absolute;bottom:0}.no-gutter>[class*=col-]{padding-right:0;padding-left:0}.small-gutter>[class*=col-]{padding-right:6px;padding-left:6px}.small-gutter{margin-left:-9px;margin-right:-9px}.step-disabled{pointer-events:none;cursor:default}.roles-grid-disabled{pointer-events:none;cursor:default;opacity:.6}#wizard-body-content{padding:30px;min-height:400px}.passwordRequirements{padding-left:10px}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#24a259;border-color:#24a259}.row-eq-height{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-navigation{background-color:#fff;border:1px solid #c2c4cc;border-radius:4px}.wizard-sub-heading{color:#121321;font-size:22.5px}.simple-unordered-list{list-style:none outside none;margin:0;padding:0}.form-control-dark{border:1px solid #c2c4cc}.form-control-clear{border:0px}.ibox-padding{padding:10px 20px 10px 15px}.table-icon{padding-right:3px}.btn-white,.btn-white:hover,.btn-white:focus,.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{color:#676a6c}.btn-white:active,.btn-white.active{box-shadow:0 2px 5px rgba(0,0,0,.21) inset}.button-label{position:relative;left:-10px;display:inline-block;padding:6px 12px;background:rgba(0,0,0,.15);border-radius:3px 0 0 3px}.btn-labeled{padding-top:0;padding-bottom:0}.wizard-selection-columns{padding:100px 20px 20px 20px}.back-button-wrapper{text-align:center;background-color:#bdbdbd;color:#eee;width:50px;height:48px;line-height:44px;padding-top:2px;border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-right-radius:10px;border-bottom-left-radius:10px;margin-bottom:10px;cursor:pointer}.back-button-wrapper:hover{background-color:#afaeae}.back-button-wrapper i.fa{line-height:inherit}.yellow-edit-background{background-color:#fff1c5}.img-center{margin:0 auto}.edit-border{border:solid #291972 4px;border-radius:4px}.edit-wizard-label{background-color:#fff;color:#291972;font-size:18px;padding:6px 10px}.active-panel-header{background:#08c;color:#fff}.panel-group .panel{border-radius:0px}.panel-default{border-color:#c2c4cc}.panel-default>.panel-heading{color:#121321;background-color:#fff;border-color:#c2c4cc}.panel-heading>h4{font-size:22.5px}.wizard-steps{background-color:#f5f5f5;border-radius:4px;position:relative}.wizard-nav-container{padding-bottom:30px}.wizard-nav-list{margin-bottom:0}.previous-page-link{color:#121321;font-weight:700;font-size:14px;cursor:pointer}.previous-page-link .fa{float:left;margin-top:13px;color:#291972;margin-right:10px}.wizard-nav-link .glyphicon,.wizard-nav-link .fa{float:right;margin-top:12px;margin-right:-6px;color:#291972}.wizard-nav-list>li.step-disabled>a .fa,.wizard-nav-list>li.step-disabled>a .glyphicon{float:right;margin-top:12px;margin-right:-6px;color:rgba(18,19,33,.2509803922)}li.wizard-nav-item.active .glyphicon,li.wizard-nav-item.active .fa{opacity:1}.blue-info-link{color:#8bb7f0}li.wizard-nav-item{border-bottom:solid 1px #c2c4cc;line-height:40px}.wizard-nav-list>li.active{border-left:none}.wizard-nav-list>li.step-disabled>a{color:rgba(18,19,33,.2509803922);background-color:hsla(0,0%,100%,.2509803922)}.wizard-nav-list>li>a{background-color:#fff;padding:3px 15px 3px 20px;color:#121321;font-weight:400}.wizard-nav-list>li>a:hover{background-color:#f5f5f5}.wizard-nav-list>li.already-visited>a.wizard-nav-link{color:#121321;cursor:pointer}.wizard-nav-list>li.active>a.wizard-nav-link{color:#121321}.wizard-nav-item .already-visited .active{background-color:#5794c4}.wizard-nav-list li.active>a{background-color:#e0e0e0;font-weight:600;border-left:4px solid #291972}li.wizard-child-item{line-height:20px;text-indent:15px;font-weight:400;color:#121321}.wizard-child-list li.active>a{background-color:#eef1ff;font-weight:600;border-left:none;color:#121321}.identity-manager-application-icon{background-color:#fff;padding:15px}.tile-919aa6b9-8083-4c08-ace7-9322aa69bc4e{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_53___ + \")}.tile-c311c379-e109-4e68-8082-f9c2f2e843ff{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_54___ + \")}.tile-a4066336-3e11-4856-a7cc-9726460448b0{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_55___ + \")}.tile-34d25422-9dc2-4918-8d85-084373e4bbb3{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_56___ + \")}.tile-e0981441-d1f9-4d5a-af74-cbb7339991a0{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_57___ + \")}.tile-e39d0c80-61ea-4f40-8179-a5def6869507{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_58___ + \")}.tile-19c49353-308b-4485-babe-f4200dfd1bf0{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_59___ + \")}.tile-79f1178d-d827-460e-84e5-758c0b799115{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_60___ + \")}.tile-286e7a77-4450-4527-987c-c08680356b00{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_61___ + \")}.tile-e636d4fc-dd34-4dca-9171-d61270179167{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_62___ + \")}.tile-23fa3370-b057-489e-b6bb-49aa2a2fa040{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_63___ + \")}.tile-52c24698-ed59-4734-a80f-c7bcde27b16f{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_64___ + \")}.tile-Salesforce{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_65___ + \")}.tile-Intacct{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_66___ + \")}.identity-manager-application-tile{height:100px;width:100%;display:inline-block;background-size:contain;background-repeat:no-repeat}.file-application:hover{border:#d0d0d0 solid 1px}.selected-application{box-shadow:inset 0px 0px 40px 40px rgba(120,167,204,.14)}.disabled-application-tile{pointer-events:none;cursor:default;opacity:.7}.available-roles-table{height:300px !important;overflow:auto;overflow-x:hidden}@media(min-width: 1170px){.available-roles-table td.role-wrap{word-wrap:break-word;min-width:160px;max-width:160px}}.vertical-scroll{overflow-y:auto}.roles-table{height:300px !important;overflow:-moz-scrollbars-vertical;overflow-y:scroll}.record-types-table{height:400px !important;overflow:auto}.btn-approve{background-color:#73c940;border-color:#73c940;color:#fff}.btn-approve:hover,.btn-approve:focus,.btn-approve:active,.btn-approve.active,.open .dropdown-toggle.btn-approve{background-color:#6dbd3d;border-color:#6dbd3d;color:#fff}.btn-approve.active.focus,.btn-approve.active:focus,.btn-approve.active:hover,.btn-approve:active.focus,.btn-approve:active:focus,.btn-approve:active:hover,.open>.dropdown-toggle.btn-approve.focus,.open>.dropdown-toggle.btn-approve:focus,.open>.dropdown-toggle.btn-approve:hover{background-color:#6dbd3d;border-color:#6dbd3d;color:#fff}.fontWeight600{font-weight:600}.btn-default{color:#291972;background-color:#fff}.btn-default:hover{color:#291972;background-color:hsl(0,0%,96%)}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#291972;background-color:hsl(0,0%,96%)}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#291972;background-color:hsl(0,0%,96%)}.full button span{background-color:#32cd32;border-radius:32px;color:#000}.partially button span{background-color:orange;border-radius:32px;color:#000}.table tbody>tr>td.vert-align{vertical-align:middle}.table tbody>tr>td.vert-align-bottom{vertical-align:bottom}.col-centered{float:none;margin:0 auto}.ibox-min-height{min-height:400px;padding:30px}.review-assignments-pane{min-height:700px}.verticalTabs .nav>li.active{border-left:0px;background-color:rgba(0,0,0,0)}.topMarginForScheduleDropdown{margin-top:34px}.topMarginForScheduleSave{margin-top:56px}.modalBodyGray{background:#f2f3f5}.topPaddingFifty{padding-top:50px}.backButtonPadding{padding-top:10px;padding-bottom:10px}.navigationBack{font-size:22px;margin-right:10px;background-color:#291972;border-radius:5px}.btn-greenRadio{background:#f1f1f1;color:#676a6c !important;border:solid 1px #a9a9a9;border-radius:5px}.btn-greenRadio:focus,.btn-greenRadio:active,.btn-greenRadio.active,.open .dropdown-toggle.btn-greenRadio{background-color:#bafcd4;border-color:#007138;color:#007138 !important}.btn-redRadio{background:#f1f1f1;color:#676a6c !important;border:solid 1px #a9a9a9;border-radius:5px}.btn-redRadio:focus,.btn-redRadio:active,.btn-redRadio.active,.open .dropdown-toggle.btn-redRadio{background-color:#ffd5d6;border-color:#f91d21;color:#ba0003 !important}.btn-blueRadio{background:#f1f1f1;border:solid 1px #dadada;border-radius:5px}.btn-blueRadio:focus,.btn-blueRadio:active,.btn-blueRadio.active,.open .dropdown-toggle.btn-blueRadio{background-color:#291972;border-color:#291972;color:#fff}.btn-blueRadio-darkBG{background:#f1f1f1;color:#676a6c !important;border:solid 1px #a9a9a9;border-radius:5px}.btn-blueRadio-darkBG:focus,.btn-blueRadio-darkBG:active,.btn-blueRadio-darkBG.active,.open .dropdown-toggle.btn-blueRadio-darkBG{background-color:#3070a5;border-color:#6f6f6f;color:#fff !important}.criteria-container{position:relative;width:280px}.loading-select-icon{margin-right:10px}.medBlackSpinnerPlace{height:50px;width:50px;margin-left:10px;margin-right:10px}.medBlackSpinnerRelative{height:110px;position:relative}.pdfFontColor{color:#f56445}.excelFontColor{color:#7cba89}.text-blue{color:#5794c4}.text-white{color:#fff}.k-button.k-state-disabled,.k-button.k-state-disabled:active,.k-button.k-state-disabled:active:hover,.k-button.k-state-disabled:hover,.k-button[disabled],.k-state-disabled .k-button,.k-state-disabled .k-button:active,.k-state-disabled .k-button:hover{opacity:.65}.k-grid-header-disabled{pointer-events:none;opacity:.7}.wizard-disabled{pointer-events:none;opacity:.6}.k-grid tbody tr{height:28px}.k-grid td{white-space:nowrap}.navbar-default .special_link a{background:#135284;color:#fff}.navbar-default .special_link a:hover{background:#0f456f !important;color:#fff}.navbar-default .special_link a:focus{background:#135284 !important;color:#fff}.detailedButton{padding-right:20px;padding-left:20px;color:#fff;border-radius:15px;background-color:hsla(0,0%,100%,.2)}.detailedButton:hover{color:#fff;background-color:hsla(0,0%,100%,.3)}.backToReportViewerButton{padding-right:20px;padding-left:20px;color:#fff;border-radius:15px;background-color:rgba(38,117,179,.7)}.backToReportViewerButton:hover{color:#fff;background-color:rgba(38,117,179,.8)}.backToReportViewer{padding-top:15px;padding-left:18px;padding-right:18px}.wrap-report-button-text{text-overflow:ellipsis;overflow:hidden;white-space:normal}.nav-header{background-repeat:no-repeat}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background:#f5f5f5}.favorite-star-color{color:#ffbd55}.play-saved-report-color{color:#8cb9f3}.thinGrayBorderBottom{border-bottom:solid 1px #f3f3f3}.file-application:hover i{color:#adadad}.file-application .fileIconChecked i{color:#3276b1}.file-application>a{color:#676a6c}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#1d1d1e}.nav.navbar-top-links>li>a:hover,.nav.navbar-top-links>li>a:focus{background-color:#fff;color:rgb(25.9568345324,15.8273381295,72.1726618705)}.fixed-ibox-height{min-height:650px}.Absolute-Center{margin:auto;position:absolute;top:120px;left:50%;bottom:0;right:50%}.business-process-level{min-height:60px;padding:19px;padding:14px;margin-bottom:10px;box-shadow:2px 2px 3px #dadada}.bp-level-one{background-color:#f4f5f8}.bp-level-two{background-color:#f1f0f2}.bp-level-three{background-color:#e8e8eb}.bp-level-three-scroll-section{max-height:450px;overflow:auto;overflow-x:hidden;padding-bottom:10px}.max-height-mitigate-modal{max-height:280px;overflow:auto;overflow-x:hidden;padding-left:20px;padding-right:20px}.business-process-label{width:100%;display:inline-block;padding:6px 12px;font-size:12px;font-weight:400;line-height:1.42857143;text-align:left;white-space:nowrap;border-radius:3px;background:#4f5c67;color:#fff;margin:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px;outline:none;border:none}.form-control-max-width{max-width:300px;display:inline-block}.business-process-label[disabled],.business-process-label[readonly],fieldset[disabled] .business-process-label{color:#fff;opacity:.7}.business-process-tile{text-align:center;position:relative;display:inline-block;margin:2px;height:100px;width:160px;padding:10px;border-radius:2px;background:#4f5c67;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:none}.absolute-top-right-10{position:absolute;top:10px;right:10px}.absolute-top-right-5{position:absolute;top:5px;right:5px}.absolute-top-right{position:absolute;top:0;right:0}.absolute-bottom{position:absolute;bottom:0;right:0;left:0}.tile-x-out{background:#36424c;padding:2px;padding-top:1px;padding-bottom:1px;padding-left:2px;padding-right:2px;border-top-right-radius:2px}.tile-x-out a{color:#fff}.business-process-tile-bottom{height:18px;background:#36424c}.text-red-when-hover{color:#888}.text-orange-when-hover{color:#888}.light-gray-link{color:#4b4f66}a.text-red-when-hover:hover{color:#d60000}a.text-orange-when-hover:hover{color:#f39c12}.user-mapping-link-button{display:none}.k-grid tr:hover .user-mapping-link-button{display:inline}.user-mapping-link-button a.user-mapping-link-button:hover{color:#121321}.material-design-box{border:1px solid #eee;padding:10px 15px;text-align:left;display:block;margin-bottom:10px;margin-right:10px;background:#f6f6f6}.contain-background-icon{width:30px;height:30px;-webkit-border-radius:3px;-webkit-background-clip:padding-box;-moz-border-radius:3px;-moz-background-clip:padding;border-radius:3px;background-clip:padding-box;background-size:contain}.height-width-64{width:64px;height:64px;background-size:contain}.height-width-32{width:32px;height:32px;background-size:contain}.height-width-16{width:16px;height:16px;background-size:contain}.height-width-14{width:14px;height:14px;background-size:contain}.file-type-icon{width:42px;float:left;height:100%;margin-top:4px}.fp-circle-success{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_67___ + \")}.fp-circle-inactive{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_68___ + \")}.excel-file-icon-64{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_69___ + \")}.pdf-file-icon-64{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_70___ + \")}.word-file-icon-64{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_71___ + \")}.excel-file-icon-16{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_72___ + \")}.pdf-file-icon-16{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_73___ + \")}.csv-file-icon-16{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_74___ + \")}.default-file-icon-16{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_75___ + \")}.default-file-icon-64{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_76___ + \")}.word-file-icon-16{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_77___ + \")}.excel-file-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_78___ + \")}.pdf-file-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_79___ + \")}.csv-file-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_80___ + \")}.word-file-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_81___ + \")}.acumatica-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_82___ + \")}.oracle-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_83___ + \")}.jde-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_84___ + \")}.orfc-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_85___ + \")}.peoplesoft-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_86___ + \")}.coupa-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_87___ + \")}.dynamics-365-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_88___ + \")}.dynamics-365-sales-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_89___ + \")}.dynamics-365-businesscentral-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_90___ + \")}.gp-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_91___ + \")}.ax-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_92___ + \")}.sl-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_93___ + \")}.netSuite-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_94___ + \")}.sapb1-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_95___ + \")}.sap-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_96___ + \")}.salesforce-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_65___ + \")}.intacct-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_66___ + \")}.nav-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_97___ + \")}.zendesk-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_98___ + \")}.jira-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_99___ + \")}.workday-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_100___ + \")}.workiva-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_101___ + \")}.azure-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_102___ + \")}.azure-active-directory-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_62___ + \")}.active-directory-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_103___ + \")}.service-now-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_104___ + \")}.zuo-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_105___ + \")}.ala-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_106___ + \")}.ariba-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_107___ + \")}.freshservice-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_108___ + \")}.auditboard-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_109___ + \")}.azure-devops-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_110___ + \")}.concur-avatar-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_111___ + \")}.plugin-dropdown-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_112___ + \")}.disabled-plugin{font-size:16px;font-weight:400;padding-top:40px}.material-design-box-header{font-weight:600;font-size:13px;padding-bottom:4px}.material-design-box .info{padding-top:8px}.material-design-image{width:42px;float:left;height:100%;margin-top:4px}.add-objects-rounded-btn{padding-right:20px;padding-left:20px;color:#fff;border-radius:15px;background-color:#27ae60;font-weight:600;font-size:11px}.add-objects-rounded-btn:hover{color:#fff;background-color:#25a75c}.label-warning-light,.badge-warning-light{background-color:#ffd7b8;color:#820;border:1px solid #ff8120}.label-danger-light,.badge-danger-light{background-color:#ffd5d6;color:#ba0003;border:1px solid #f91d21}.label-primary-light,.badge-primary-light{background-color:#291972;color:#fff;border:1px solid #121321}.label-success-light,.badge-success-light{background-color:#bafcd4;color:#007138;border:1px solid #007138}.label-dimgrey-light,.badge-dimgrey-light{background-color:#eeeff2;color:#121321;border:1px solid #121321}.label-go-light,.badge-go-light{background-color:#bafcd4;color:#007138;border:1px solid #007138}.light-gray-badge-background{background-color:#eeeff2}.white-background{background-color:#fff}.label-microsoft-account,.badge-microsoft-account{background-color:#01a7f0;color:#fff}.popover{box-shadow:0 5px 10px rgba(0,0,0,.2)}.label{display:inline-block;font-weight:400}.form-control:focus{border-color:#291972 !important;outline:0}.filter-pills-above-grid{padding:10px 20px;background-color:#f5f5f5;border:solid 1px #c2c4cc;border-bottom:none}.pill-radio{color:#434343;padding:3px 14px;font-size:12px;border-radius:14px;cursor:pointer;display:inline-block}.pill-radio:hover{background-color:rgba(0,0,0,.11)}.pill-radio.active{color:#fafafa;background-color:#291972}a.text-dark{color:#5a5a5a}a.text-dark:hover{color:#383838}.dynamic-side-grid-header{border-bottom:solid 1px #dbdbdb;color:#31708f;background-color:#fff}.float-manage-data-logo-left{padding-top:4px;width:50px;float:left}.float-product-logo-left{padding-top:6px;width:75px;float:left}.large-avatar-logo{width:50px;height:50px}.product-import-header{font-size:20px;color:#47506e;font-weight:400;line-height:normal;margin:0 0 4px}.product-import-description{color:#8991a6;font-size:12px;overflow:auto}.panel-ibox-content{background-color:#fff;color:inherit;padding:15px 20px 20px 20px;border-color:#c2c4cc;border-image:none;border-style:solid;border-width:1px;border-radius:4px}.panel-ibox-title{border-radius:5px 5px 0px 0px !important;background:#fff !important;color:#121321 !important;padding:10px 15px}.panel-ibox-title h5{float:none;font-size:22.5px}.product-import-action{margin-top:15px}.light-gray-behind-icon{padding:15px 15px;display:inline-block;-moz-border-radius:100px;-webkit-border-radius:100px;border-radius:100px;background-color:#f6f6f6}.manual-mapping-modal-tile{padding:5px 10px}.manual-mapping-yellow-tile{color:#b27e00;background-color:#fff0cc;border-radius:4px;border:dashed 1px #cecece}.manual-mapping-tile-selected{border:dashed 1px #cecece;border-radius:4px}.center-div{padding-top:100px;margin:auto;width:100px;height:100px}.disabledDiv{pointer-events:none;opacity:.4}.new-mapping-dot{color:#291972;font-size:.5em;padding-right:8px;vertical-align:middle}a.text-danger:focus,a.text-danger:hover{color:#c9483b}a.text-success:focus,a.text-success:hover{color:#228f50}.dynamic-side-grid-shell{border-bottom:solid 1px #f2f2f2}.dynamic-side-grid-shell h5{color:#121321}.table tr.active th,.table tr.active td{color:#2675b3}.k-widget.k-tooltip{border-color:#000;color:#333;padding:7px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);word-wrap:break-word}.k-callout-n{border-bottom-color:#a9a9a9}.k-callout-w{border-right-color:#a9a9a9}.k-callout-s{border-top-color:#a9a9a9}.k-callout-e{border-left-color:#a9a9a9}.toolbar-link{display:inline-block;color:#121321;padding:3px 14px;font-size:12px;border-radius:4px;cursor:pointer}.toolbar-link:hover{background-color:rgba(0,0,0,.05)}.toolbar-link[disabled]{pointer-events:none;cursor:default;opacity:.7}.select-a-row-for-details-info{text-align:center;padding:20px;padding-top:30px;color:#a2a2a2;background-color:#fff}.gray-kendo-dropdown .k-dropdown-wrap.k-state-default{background-color:#fff;border-color:rgba(0,0,0,0)}.gray-kendo-dropdown .k-dropdown-wrap.k-state-default:hover{background-color:rgba(0,0,0,.05)}.k-filter-menu label{padding-right:20px}.k-filter-menu label input{margin-right:5px}.k-link input{margin-right:5px}.k-dropdown .k-input{color:#121321}.k-item .k-link{font-size:12px}.btn-grid-row-settings{background-color:inherit;border-radius:0;padding:4px}.btn-grid-row-settings:hover{background-color:#d9d9d9 !important}.k-grid tr.k-state-selected{background-color:#291972}.k-grid tr.k-state-selected:hover td{background-color:#291972}.k-link{color:#291972}.k-calendar .k-footer .k-nav-today{color:#291972}.k-calendar .k-today .k-link{color:#121321;box-shadow:inset 0 0 7px 0 #291972}.k-calendar .k-footer .k-nav-today:hover{color:#121321}.k-calendar td.k-state-focused .k-link{color:#121321;box-shadow:inset 0 0 7px 0 #291972}.k-calendar td.k-state-focused .k-link:hover{color:#121321}.k-state-selected{background-color:#291972;border-color:#291972;color:#fff}.k-state-selected .btn-grid-row-settings{color:#fff;background-color:#fff;border-color:none}.k-icon{color:#291972}.k-grid-header .k-i-sort-asc-sm,.k-grid-header .k-i-sort-desc-sm,.k-grid-header .k-sort-order{color:#291972}.row-settings-drop-padding{padding-top:12px;padding-bottom:20px}.btn-text-only{color:#291972;background-color:#fff;border-color:#fff}.btn-text-only:hover{color:#291972;background-color:hsl(0,0%,96%);border-color:hsl(0,0%,96%)}.btn-secondary{color:#291972;background-color:#fff;border-color:#291972}.btn-secondary:hover{color:rgb(34.9827338129,21.3309352518,97.2690647482);background-color:hsl(0,0%,96%);border-color:#291972}.btn-secondary:focus,.btn-secondary:active,.btn-secondary.active,.open .dropdown-toggle.btn-secondary{background-color:hsl(0,0%,96%)}.disabled-ibox{opacity:.5;pointer-events:none}.unfocused-ibox-content{opacity:.4}.focused-ibox-content{border-top:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd}.import-sub-title{text-transform:uppercase;color:#121321;font-size:15px;font-weight:600}.centered-div-1200-max{max-width:1200px;height:auto;margin:0 auto;padding:10px;position:relative}.centered-div-800-max{max-width:800px;height:auto;margin:0 auto;padding:10px;position:relative}.centered-div-450-max{max-width:450px;height:auto;margin:0 auto;padding:10px;position:relative}.div-400-max{max-width:400px;width:100%;display:inline-block;margin-right:30px;vertical-align:top}.configuartion-window-pane{min-height:500px}.sm-spinner-contain{position:relative;left:4px;width:24px;height:8px;display:inline-block}.ibox-title h5{float:none;font-size:22.5px}.ibox-title-border-bottom{border-bottom:solid 1px #c2c4cc;min-height:59px}.label-out-of-box-template{color:#121321;background-color:#eeeff2;border:1px solid #121321}.label-custom-template{color:#0359a6;background-color:#93deff;border:1px solid #0359a6}.label-sim-deployed{background-color:#93deff;color:#0359a6;border:1px solid #0359a6}.label-sim-draft{background:#eeeff2;color:#121321;border:1px solid #121321}.label-sim-ready{background-color:#bafcd4;color:#007138;border:1px solid #007138}.label-sim-analyzing{background-color:#ffd7b8;color:#820;border:1px solid #ff8120}.label-modify{background-color:#ffd7b8;color:#820;border:1px solid #ff8120}.label-add{background-color:#bafcd4;color:#007138;border:1px solid #007138}.label-remove{background-color:#ffd5d6;color:#ba0003;border:1px solid #f91d21}.role-modification-item{padding-bottom:2px;padding-top:2px}.simulator-role-child-item{padding:6px 14px;border-bottom:solid 1px #f4f4f4}.badge-simulation-object-count{font-size:9px;background-color:#eee;margin-bottom:2px}.permission-level-selection{border:none;color:#3276b1;width:58px}.run-simulation-button{width:50%;min-width:170px}.additional-downloads-btn{position:absolute;top:40px;right:22px}.file-exporting-opacity{opacity:.48}.settings-title-link:hover{text-decoration:underline}.stats-number{font-weight:200;font-size:20px}.max-height-none{height:auto !important}.k-pager-numbers li:nth-child(2):last-child{display:none}.dropdown-header{color:#121321;font-weight:600;padding:10px 22px;border-bottom:solid 1px #c2c4cc}button[title=Clear].k-button-icon{border:none;background-color:rgba(0,0,0,0) !important}span[title=clear].k-clear-value{display:none !important}.k-dropdown-operator>.k-dropdown-wrap.k-state-default{border-color:rgba(0,0,0,0)}.dropdown-menu>li>a{margin:0;padding:6px 16px}#right-sidebar-notifications{background-color:#fff;border-left:1px solid #c2c4cc;border-top:1px solid #c2c4cc;overflow:hidden;position:fixed;top:60px;width:300px !important;z-index:1008;bottom:0;right:-260px}#right-sidebar{background-color:#fff;border-left:1px solid #c2c4cc;border-top:1px solid #c2c4cc;overflow:hidden;position:fixed;top:60px;width:300px !important;z-index:1009;bottom:0;right:-300px}#right-sidebar-notifications.sidebar-open{right:0}#right-sidebar-notifications.sidebar-open.sidebar-top{top:0;border-top:none}.vertical-align-middle{display:inline-block;vertical-align:middle}.import-status-icon{display:inline-block;width:15px;height:15px}input[type=radio]{vertical-align:bottom}input[type=checkbox]{vertical-align:bottom}.o-btn{display:inline-block;width:100%;padding:25px 0;border-radius:2px;color:#291972;border-color:#c2c4cc;background-color:#fff}.o-btn:hover{background-color:#f4f4f5;border-color:#c2c4cc}.save-report-modal-helper-text{color:#121321;margin-bottom:5px;font-size:10px}oi-select .select-dropdown-optgroup-option.active:not(.disabled){background-color:#f5f5f5;color:#121321;cursor:pointer}.no-data-to-display-message{color:#f0f0f0;font-size:50px;padding-top:60px}.swal-confirm-button{background-color:#291972 !important;color:#fff !important;box-shadow:none !important;border-radius:4px;border:1px #291972 solid !important}.swal-confirm-button:hover{background-color:#261769 !important;border-color:#261769;color:#00ff5a !important}.swal-cancel-button{background-color:#fff !important;color:#121321 !important;box-shadow:none !important;border-radius:4px;border:1px #291971 solid !important}.swal-cancel-button:hover{background-color:hsl(0,0%,96%) !important;border-color:#291971;color:#121321 !important}.swal2-modal{font-family:\\\"Manrope\\\",\\\"Manrope\\\",Helvetica,Arial,sans-serif;border-radius:4px}.swal2-container{z-index:99999}.btn-group button{outline:none !important}.modal-body-no-side-padding{padding-top:20px;padding-bottom:30px}.overflow-visible{overflow:visible !important}.dropdown-menu-text-color{color:#333}.no-margin{margin:0}.btn-modalClose-white{color:#f2f2f2;background-color:rgba(0,0,0,0);border:none}.btn-modalClose-white:hover{color:#fff}.zendesk-modal-header{background-color:#03363d;color:#fff}.zendesk-status-new{color:#f5ca00}.zendesk-status-open{color:#e82a2a}.zendesk-status-pending{color:#59bbe0}.zendesk-status-solved{color:#828282}.jira-cat-toDo{color:#4a6785}.jira-cat-inProgress{color:#ffd351}.jira-cat-done{color:#14892c}.jira-no-cat{color:#ccc}.fixed-btn-width{width:50px}.media-body{width:inherit}.wrapper-content{min-height:800px}.drag-drop-pane{border:2px dashed #d3d3d3;border-radius:4px;text-align:center;color:#a9b2be}.drag-drop-pane-open{border:2px dashed #d3d3d3}.drag-drop-pane-active{border:2px dashed gray}.ibox-clickable{cursor:pointer}.ibox-clickable:hover{cursor:pointer;background-color:#fafbfc}.ibox-list-item{padding:15px 20px 15px 20px;border-top:solid 1px #c2c4cc;overflow:hidden}.ibox-list-item>.pull-left{margin-right:10px}.ibox-muted-text{color:#d0d0d0}.tracking-template-table-physical-name{font-size:10px;padding-left:10px;color:#a9a9a9}.k-filtercell>.k-operator-hidden>label{font-weight:400;padding-right:15px;margin-bottom:-5px}.k-filtercell>.k-operator-hidden>label:checked{font-weight:600}.k-filtercell>.k-operator-hidden>label>input{margin-left:3px}.new-record-list-item{border-left:3px solid #5b91c0}.saved-report-filter-counter{font-size:12px}.text-toggle-on-color{color:#291972}.vAccordion--default v-pane-header{border-bottom:1px solid #c2c4cc}.vAccordion--default v-pane-content>div{padding-bottom:0;border-bottom:solid 1px #c2c4cc}.vAccordion--default v-pane-header::after,.vAccordion--default v-pane-header::before{background-color:#121321}v-pane-header::after{left:20px !important}v-pane-header::before{left:20px !important}.vAccordion--default v-pane-header{margin-bottom:0}.custom-vPane-header{padding:20px;background-color:#fff}label[disabled]{cursor:pointer;opacity:.65;pointer-events:none}a[disabled]{cursor:pointer;opacity:.65;pointer-events:none}.list-item-row-button{height:100%;position:absolute;top:0;right:0;color:#121321;background-color:#fff;border:none;border-left:solid 1px;border-color:#c2c4cc;width:35px;padding:4px;outline:none}.list-item-row-button:hover{background-color:#e0e0e0;border-left:1px solid #c2c4cc}.saved-message{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);cursor:default;pointer-events:none;color:#2ab27b;font-weight:600}.fadein,.fadeout{-webkit-transition:all cubic-bezier(0.25, 0.46, 0.45, 0.94) 1s;-moz-transition:all cubic-bezier(0.25, 0.46, 0.45, 0.94) 1s;-o-transition:all cubic-bezier(0.25, 0.46, 0.45, 0.94) 1s;transition:all cubic-bezier(0.25, 0.46, 0.45, 0.94) 1s}.fadein.ng-hide-remove,.fadeout.ng-hide-add.ng-hide-add-active{opacity:0}.fadeout.ng-hide-add,.fadein.ng-hide-remove.ng-hide-remove-active{opacity:1}.criteria-drop{padding:10px 6px;width:100%;border:1px solid #c2c4cc;border-radius:2px;-webkit-appearance:none;-webkit-box-shadow:none;-moz-appearance:none;background:#fff url(\" + ___CSS_LOADER_URL_REPLACEMENT_113___ + \") no-repeat 99% center}select:hover{cursor:pointer}.criteria-number{display:block;padding:10px 6px;width:90px;border:1px solid #c2c4cc;border-radius:2px;-webkit-appearance:none;-webkit-box-shadow:none;-moz-appearance:none;background:#fff}.criteria-text{display:block;padding:10px 6px;width:100%;border:1px solid #c2c4cc;border-radius:2px;-webkit-appearance:none;-webkit-box-shadow:none;-moz-appearance:none;background:#fff}.form-inline .criteria-time input.form-control{width:50px;height:39px;padding:10px 6px;border:1px solid #c2c4cc;border-radius:2px}.criteria-drop-date-pick{padding:10px 6px;width:100%;border:1px solid #c2c4cc;border-radius:2px}.criteria-drop:focus{border-color:#c2c4cc !important;outline:0}.criteria-drop[disabled]{cursor:not-allowed}.criteria-drop[disabled],.criteria-drop[readonly]{background-color:#eee;opacity:1}.criteria-attached-button{padding:8px;padding-bottom:9px;border:1px solid #c2c4cc}.security-object-condition-container{padding:6px 7px;border-radius:6px;border:solid 1px #c2c4cc;background-color:#fafafa;border-left:solid #291972}.disable-pointer-events{pointer-events:none;cursor:default;opacity:.4}.help-icon-modal-header{font-size:12px;margin-left:5px}.k-popup .k-list .k-state-focused{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.k-popup .k-list .k-state-selected{border-radius:0;-webkit-box-shadow:none;box-shadow:none;background-color:#ebebeb;color:#121321;border:solid 1px #121321}.k-popup .k-list .k-state-hover .k-state-selected{border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#121321}.k-popup .k-list .k-state-hover{border-radius:0;-webkit-box-shadow:none;background-color:#f5f5f5;cursor:pointer;box-shadow:none}.k-calendar td.k-state-selected .k-link{border-color:#291972;background-color:#291972;color:#fff}.k-popup.k-calendar-container,.k-popup.k-list-container{padding:0px;border-width:0px}.k-dropdown-wrap.k-state-active.k-state-border-down,.k-numeric-wrap .k-link.k-state-selected,.k-pager-numbers.k-state-expanded .k-current-page .k-link,.k-picker-wrap.k-state-active.k-state-border-down{-webkit-box-shadow:none;box-shadow:none;border-radius:0px}.k-list-filter{margin-bottom:0}.btn-ax-security-designer{text-align:left;font-weight:600;font-size:13px}.centered-btn-ax-security-designer{text-align:center;font-weight:600;font-size:13px}.centered-text-left-btn-ax-security-designer{text-align:center;font-weight:600;font-size:13px}.btn-block{white-space:normal}.security-designer-card{border-radius:4px;border:1px solid #c2c4cc;padding:30px 20px;background-color:#fff;position:relative;margin-bottom:8px}.large-badge{padding:2px 7px;border-radius:360px;font-size:12px}.large-badge:empty{display:none}.ax-roles-badge-color{background-color:#291972;color:#fff;border:1px solid #121321}.ax-duties-badge-color{background-color:#e2e2f3;color:#231556;border:1px solid #231556}.ax-tables-badge-color{background-color:#bafcd4;color:#007138;border:1px solid #007138}.ax-table-fields-badge-color{background-color:#bafcd4;color:#007138;border:1px solid #007138}.ax-privileges-badge-color{background-color:#93deff;color:#0359a6;border:1px solid #0359a6}.ax-subroles-badge-color{background-color:#fff0be;color:#664b00;border:1px solid #ffd942}.ax-menuitems-badge-color{background-color:#eeeff2;color:#121321;border:1px solid #121321}.ax-dataentities-badge-color{background-color:#93deff;color:#0359a6;border:1px solid #0359a6}.ax-serviceoperations-badge-color{background-color:#fdc4ee;color:#7f1a86;border:1px solid #7f1a86}.btn-success{background-color:#27ae60;border-color:#27ae60;color:#fff}.btn-success:disabled,.btn-success:disabled:hover{background-color:#27ae60;border-color:#27ae60;color:#fff}.btn-success:hover,.btn-success:active,.btn-success:focus{background-color:#25a75c;border-color:#25a75c;color:#fff}.icons8,[class^=icons8-]:before{font-weight:inherit}.rounded-search-box{border-radius:4px;max-width:158px;display:inline-block;border-color:#4b4f66}.inline-grid-dropdown{padding:10px 2px;width:100%;border:solid 1px #dbdbdb;-webkit-appearance:none;-webkit-box-shadow:none;-moz-appearance:none;background:rgba(0,0,0,0) url(\" + ___CSS_LOADER_URL_REPLACEMENT_113___ + \") no-repeat 99% center}.pagination{margin:10px 0}.emptyStateMessage{text-align:center;color:#a9b2be;margin-top:100px}.large-transparent-dropdown-header{border:none;background-color:rgba(0,0,0,0);font-size:20px;font-weight:600;outline:none;padding:6px;padding-right:22px;-webkit-appearance:none;-webkit-box-shadow:none;-moz-appearance:none;background:rgba(0,0,0,0) url(\" + ___CSS_LOADER_URL_REPLACEMENT_113___ + \") no-repeat 99% center}.large-transparent-dropdown-header:hover{background-color:#fff}.large-transparent-dropdown-header:disabled{opacity:.65}.security-designer-top-page-break{margin-top:0px;border-color:#d3d3d3}.netSuite-passedValidation{text-decoration:line-through;opacity:.4}.netSuiteSecurityDesignerValidation{font-size:25px;padding-left:6px;margin-bottom:-30px;margin-left:-45px}.disable-list-during-load{pointer-events:none;opacity:.8}.is-modified-security-desiger-card{border-left:#ff8120 5px solid}.is-modified-security-designer-button{border-left:4px solid #ff8120 !important}.is-custom-security-desiger-card{border-left:#007138 5px solid}.permission-level-label{text-transform:uppercase;font-size:10px;font-weight:700;padding-left:8px}.steps-completed-counter{color:#fff;white-space:nowrap;padding-left:4px;padding-right:4px}.progress-bar[aria-valuenow=\\\"0\\\"]>.steps-completed-counter{color:#333}.center-change-dot{text-align:center;width:100%}.action-revoke-security-designer-card{opacity:.5;pointer-events:none}.center-icon{position:absolute;top:50%;left:50%;height:50%;transform:translate(-50%, -50%);display:block}.center-info{position:absolute;top:45%;left:50%;height:50%;transform:translate(-50%, -50%);display:block}.block-display{display:block}.loading-text-for-spinner{display:flex;justify-content:center;padding-top:8vh}.center-cells{display:flex;justify-content:center}.vcenter{position:absolute;left:50%;top:50%}.tooltip-inner{word-break:break-word;text-align:center}.security-designer-modifications-more-details{margin-right:-16px;margin-top:6px}.dashboard_card{border-radius:6px;background-color:#fff;box-shadow:0 2px 10px 0 rgba(0,0,0,.05)}.dashboard_card header{border-bottom:1px solid #ddd;color:#291972;text-align:center}.dashboard_card header{border-top-left-radius:6px;border-top-right-radius:6px;position:relative;font-size:16px;height:45px;line-height:45px;cursor:move}.dashboard_card .dashboard_card_content{-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;position:relative;background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;padding-bottom:10px;padding-top:10px}.dashboard_card_icon{font-size:40px;color:#2675b3}.dashboard_tile{height:102.5px;padding-top:18px}.dashboard_tile_count{font-size:28px;text-align:center}.dashboard_tile_percent{font-size:14px;text-align:center}.card_selection_pane_icon{font-size:26px;color:#5191c2}.card-selection-pane{position:absolute;right:0px;top:0px;width:380px;height:100%;background-color:#fff;border-left:1px solid #c2c4cc;z-index:1;bottom:0;overflow:auto;overflow-x:hidden}.item{width:500px}.tile{width:240px}.is-pointer-down.is-dragging{z-index:2}.margin-bottom-last-card-selection{border-bottom:solid 1px #c2c4cc;margin-bottom:30px}.detailed-label{margin-left:3px;opacity:.75;font-size:9px}.mini-navbar .detailed-label{display:block !important}.affected-objects-item{margin-left:2.5em}.dropdown-on-top{z-index:99999999999}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#dadada}.popover .arrow{visibility:hidden}#AADExchange{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_114___ + \");background-repeat:no-repeat;background-size:45px;background-position:4px}#FastpathAccount{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_115___ + \");background-repeat:no-repeat;background-size:42px;background-position:5px}.FastpathAccount{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_115___ + \");background-repeat:no-repeat;background-size:42px;background-position:5px}.AADExchange{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_114___ + \");background-repeat:no-repeat;background-size:45px;background-position:4px}.SAML2{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_116___ + \");background-repeat:no-repeat;background-size:45px;background-position:4px}.user-type-selection{color:#434343;padding:18px 60px;font-size:12px;border-radius:3px;cursor:pointer;width:100%}.user-type-selection:hover{background-color:rgba(0,0,0,.11)}.user-type-selection.active{color:#fafafa;background-color:#291972;font-weight:600}.popover{font-size:12px;border:solid 1px #eee}.popover-title{background-color:inherit}.side-margin-15{margin:0px 15px}.side-margin-9{margin:0px 9px}.text-align-left{text-align:left}.row_cell{flex:1}.row--top{align-items:flex-start}.row_cell--center{align-self:center}.row-flex{display:flex}.row-template-bottom-padding{padding-bottom:20px}.pill-trash-spacing{margin-left:.75em}.long-and-break-word{flex:1;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word}.break-word{word-wrap:break-word}.truncate-text{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.max-w-87{max-width:87%}.deployed-badge{background-color:rgba(0,0,0,0);border:solid 1px #e6e6e6;color:#c3c3c3;font-size:14px}.deployed-disabled-button{background-color:rgba(0,0,0,0);border:solid 1px #e6e6e6;color:#c3c3c3}.dimmed{position:relative}.dimmed:after{content:\\\" \\\";z-index:10;display:block;position:absolute;height:100%;top:0;left:0;right:0;background:rgba(0,0,0,.5)}.chart-details-quick-view{padding:50px 16px 35px 35px}.group-by-listview-height{height:631px}.select-listview-height-paged{height:571px}.select-listview-height{height:622px}.list-view-body.paged{height:599px}.list-view-body.filter-tab{height:624px}.list-view-body.filter-tab.paged{height:547px}.list-view-body.filter-tab.dropdown-filter{height:615px}.list-view-body.filter-tab.dropdown-filter.paged{height:564px}.my-reviews-standard-height-listview{background:#fff;height:648px}.review-status-badge{margin-left:auto;margin-top:-50px}.review-status-badge-complete{color:gray}.review-status-capitalized{text-transform:capitalize}.review-assignment-tile{padding:10px;background:#fff;position:relative;border:solid 1px #c2c4cc}.review-assignment-icon-circle{border-radius:90px;padding:5px;border:solid 1px #e8e8e8;background-color:#f8f8f8}.review-assignment-icon-circle.review-assignment-clickable.text-not-selected{border-color:#b3b3b3}.text-success.review-assignment-icon-circle{border-color:#27ae60}.text-danger.review-assignment-icon-circle{border-color:#e74c3c}.review-assignment_Risk,.review-assignment_Risk{color:#fcc201}.review-assignment_Roles,.review-assignment_SecurityRole{color:#8550b3}.review-assignment_Products,.review-assignment_Product{color:#adbacb}.review-assignment_Manager{color:#36bfce}.review-assignment_BusinessProcess{color:#e22159}.review-assignment-icons8{font-size:22px;font-weight:300}.review-assignment-tile-container{height:100px}.review-assignment-tile:hover{background:#e0e0e0;cursor:pointer}.review-assignment-tile.active-tile{background:#e0e0e0;border:solid 1px #c2c4cc}.review-tile-counter{position:absolute;bottom:5px;width:100%;text-align:center}.list-view-no-hover>list-item:hover{background-color:inherit}.list-view-height{min-height:700px}.text-transparent{color:rgba(0,0,0,0)}.review-assignment-clickable.text-not-selected:hover{cursor:pointer;border-color:#cfcfcf}.flexbox_container{height:100%;display:-ms-flexbox;display:-webkit-box;display:-moz-box;display:-ms-box;display:box;-ms-flex-direction:row;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal}.flexbox_icon_slot{width:60px;-ms-flex:0 40px;-webkit-box-flex:0;-moz-box-flex:0;-ms-box-flex:0;box-flex:0}.flexbox_content_slot{-ms-flex:1;-webkit-box-flex:1;-moz-box-flex:1;-ms-box-flex:1;box-flex:1}.text-status-light{color:#7fb3e0}.text-not-selected{color:#b3b3b3}#JiraTicketsGrid .k-grid-content{min-height:330px}#ZenDeskTicketsGrid .k-grid-content{min-height:330px}.revoked-role-offset{margin-right:50%}.loading-overlay span{position:relative;top:50%;left:50%}list-item.selected-item{background-color:#e0e0e0}.select-spinner-container{position:relative}.input-group-unstyled .input-group-addon{border:0px}@media(min-width: 992px){.modal-xl{width:1200px}}.form-control.input-sm span.k-dropdown-wrap{height:100%}.flex-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex !important}.flex-center{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;flex-direction:row}.flex-vcenter{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.flex-between{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;flex-direction:row}.flex-start{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.flex-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.flex-end{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:flex-end;flex-direction:row}.flex-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-column{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.flex-equal{-webkit-box-flex:1;-ms-flex:1;flex:1}.break-words{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./App/Shared/shared.scss\",\"webpack://./Content/SCSS/_typography.scss\",\"webpack://./Content/SCSS/_navigation.scss\",\"webpack://./Content/SCSS/_variables.scss\",\"webpack://./Content/SCSS/_top_navigation.scss\",\"webpack://./Content/SCSS/_buttons.scss\",\"webpack://./Content/SCSS/_badgets_labels.scss\",\"webpack://./Content/SCSS/_elements.scss\",\"webpack://./Content/SCSS/_sidebar.scss\",\"webpack://./Content/SCSS/_base.scss\",\"webpack://./Content/SCSS/_pages.scss\",\"webpack://./Content/SCSS/_chat.scss\",\"webpack://./Content/SCSS/_metismenu.scss\",\"webpack://./Content/SCSS/_spinners.scss\",\"webpack://./Content/SCSS/_rtl.scss\",\"webpack://./Content/SCSS/_theme-config.scss\",\"webpack://./Content/SCSS/_skins.scss\",\"webpack://./Content/SCSS/_media.scss\",\"webpack://./Content/SCSS/_custom.scss\",\"webpack://./Content/SCSS/style.scss\",\"webpack://./css/angular-toastr-custom.scss\",\"webpack://./node_modules/font-awesome/scss/font-awesome.scss\",\"webpack://./node_modules/font-awesome/scss/_path.scss\",\"webpack://./node_modules/font-awesome/scss/_core.scss\",\"webpack://./node_modules/font-awesome/scss/_larger.scss\",\"webpack://./node_modules/font-awesome/scss/_fixed-width.scss\",\"webpack://./node_modules/font-awesome/scss/_list.scss\",\"webpack://./node_modules/font-awesome/scss/_variables.scss\",\"webpack://./node_modules/font-awesome/scss/_bordered-pulled.scss\",\"webpack://./node_modules/font-awesome/scss/_animated.scss\",\"webpack://./node_modules/font-awesome/scss/_rotated-flipped.scss\",\"webpack://./node_modules/font-awesome/scss/_mixins.scss\",\"webpack://./node_modules/font-awesome/scss/_stacked.scss\",\"webpack://./node_modules/font-awesome/scss/_icons.scss\",\"webpack://./node_modules/font-awesome/scss/_screen-reader.scss\",\"webpack://./App/Shared/Components/rulesetObjectCopyModal/rulesetObjectCopyModal.scss\",\"webpack://./App/Components/RequestManagement/WizardSteps/Salesforce/salesforceUserForm.scss\",\"webpack://./App/Components/SAPSecurityDesigner/sapSecurityDesigner.scss\",\"webpack://./App/Components/SavedReports/savedReports.scss\",\"webpack://./css/scss/sharedUtilities.scss\",\"webpack://./css/scss/customIbox.scss\",\"webpack://./App/Components/Certifications/MyReviews/myReviews.scss\",\"webpack://./App/Components/AXSecurityDesigner/taskRecordingManager/taskRecordingManager.scss\",\"webpack://./App/Components/Certifications/reviewSchedules/reviewSchedules.scss\",\"webpack://./App/Components/OwnershipGroups/groupItemOwnersList/groupItemOwnersList.scss\",\"webpack://./App/Components/MyInbox/inboxStyles.scss\",\"webpack://./App/Components/maintainRiskRuleset/maintainRiskRuleset.scss\",\"webpack://./App/Components/MaintainBusinessProcess/maintainBusinessProcess.scss\",\"webpack://./App/Components/Certifications/AllReviews/certificationsAllReview.scss\",\"webpack://./App/Components/Certifications/notificationTeams/notificationTeams.scss\",\"webpack://./App/Components/Certifications/reviewSchedules/reviewScheduleInstancesList/reviewScheduleInstancesList.scss\",\"webpack://./App/Components/Certifications/reviewSchedules/scheduleInstanceAssignmentsList/instanceAssignmentsList.scss\",\"webpack://./App/Components/Certifications/reviewSchedules/routingCriteriaInstancesList/routingCriteriaInstancesList.scss\",\"webpack://./App/Components/ReportGenerator/generatedReports.scss\",\"webpack://./App/Components/SAPSecurityDesigner/simulationRiskAnalysis/simRiskAnalysis.scss\",\"webpack://./App/Components/AXSecurityDesigner/SecurityMigration/MigrationsList/migrationsList.scss\",\"webpack://./App/Components/MaintainBusinessProcess/SAPAuthFieldGroups/sapAuthFieldGroups.scss\",\"webpack://./App/Components/ApprovalGroups/approvalGroups.scss\",\"webpack://./App/Components/CompanyTemplates/CompanyTemplatesList/companyTemplatesList.scss\",\"webpack://./App/Components/CompanyTemplates/AssociatedCompaniesList/companyTemplateCompaniesList.scss\",\"webpack://./App/Components/Notifications/NotificationTypesList/notificationTypesList.scss\",\"webpack://./App/Components/OwnershipGroups/ownershipGroupsList/ownershipGroupsList.scss\",\"webpack://./App/Components/OwnershipGroups/ownershipGroupItemsList/groupItemsList.scss\",\"webpack://./App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnersList.scss\",\"webpack://./App/Components/OwnershipGroups/groupOwnerItemsList/groupOwnerItemsList.scss\",\"webpack://./App/Components/RequesterGroups/requesterGroupsList/requesterGroupsList.scss\",\"webpack://./App/Components/RequesterGroups/requesterGroupUsersList/requesterGroupUsersList.scss\",\"webpack://./App/Components/RoleTemplates/RoleTemplatesList/roleTemplatesList.scss\",\"webpack://./App/Components/RoleTemplates/AssociatedRolesList/roleTemplateRolesList.scss\",\"webpack://./App/Components/userRestrictions/fastpathUserList/fastpathUserList.scss\",\"webpack://./App/Components/Roles/roles.scss\",\"webpack://./App/Components/Users/users.scss\",\"webpack://./App/Components/securityAssignment/securityAssignment.scss\",\"webpack://./App/Components/IdentityManagerRequestDetails/identityManagerRequestDetailsView.scss\",\"webpack://./App/Components/Configuration/configuration.scss\",\"webpack://./App/Shared/Components/ownershipGroupAssignments/ownershipGroupAssignments.scss\",\"webpack://./App/Components/workdayMaintainTemplates/maintainTemplatesList.scss\",\"webpack://./App/Components/maintainSystemRoles/maintainSystemRoles.scss\",\"webpack://./App/Components/CrossPlatformUsers/crossPlatformUsers.scss\",\"webpack://./css/style.scss\"],\"names\":[],\"mappings\":\"AAYQ,kBCZR,eACE,CAAA,GAGF,cACE,CAAA,GAGF,cACE,CAAA,GAGF,cACE,CAAA,GAGF,cACE,CAAA,GAGF,cACE,CAAA,GAGF,cACE,CAAA,SAGF,cACE,CAAA,eACA,CAAA,UC9BF,UACI,CAAA,eACA,CAAA,2BACA,CAAA,uBAGJ,aCOY,CAAA,eDLR,CAAA,iBAGJ,gEACI,CAAA,aCLY,CAAA,0BDOZ,CAAA,gEAGJ,gEACI,CAAA,aCXY,CAAA,0BDaZ,CAAA,mDAGJ,eACI,CAAA,8BACA,CAAA,kEAGJ,8BACI,CAAA,YAGJ,gBACI,CAAA,QAGJ,QACI,CAAA,gBAGJ,8BACI,CAAA,oBACA,CAAA,qBAGJ,oBACI,CAAA,gCAGJ,iBACI,CAAA,uBAGJ,gBACI,CAAA,eACA,CAAA,eAGJ,kBACI,CAAA,iBACA,CAAA,qCACA,CAAA,YACA,CAAA,UACA,CAAA,cACA,CAAA,MACA,CAAA,4BACA,CAAA,SACA,CAAA,iBACA,CAAA,gBACA,CAAA,QACA,CAAA,YACA,CAAA,oBAGJ,iBACI,CAAA,aACA,CAAA,gBACA,CAAA,UACA,CAAA,eACA,CAAA,kBACA,CAAA,8BAGJ,eACI,CAAA,oCAGJ,aACI,CAAA,+CAGJ,cACI,CAAA,sCAGJ,gBACI,CAAA,YACA,CAAA,0CAGJ,kBACI,CAAA,0GAGJ,WAGI,CAAA,WACA,CAAA,qCAGJ,eACI,CAAA,kCAGJ,iBACI,CAAA,mCAGJ,kBACI,CAAA,iCAGJ,OACI,CAAA,SACA,CAAA,oCAGJ,2BACI,CAAA,8CAGJ,cACI,CAAA,gDAGJ,cACI,CAAA,yCAGJ,cACI,CAAA,YAGJ,0BACI,CAAA,kEC5CiB,CAAA,2BD8CjB,YACI,CAAA,iBACA,CAAA,uBAIR,uBACI,CAAA,eAGJ,kBACI,CAAA,6BACA,CAAA,UACA,CAAA,gCAGJ,WACI,CAAA,kBACA,CAAA,UACA,CAAA,sCAGJ,sBACI,CAAA,UACA,CAAA,wBACA,CAAA,cAGJ,aACI,CAAA,wBAGJ,aACI,CAAA,mBAGJ,gBACI,CAAA,wBACA,CAAA,cACA,CAAA,UACA,CAAA,oBAGJ,UACI,CAAA,WACA,CAAA,SACA,CAAA,WACA,CAAA,oBACA,CAAA,gCAGJ,eACI,CAAA,wBAGJ,cACI,CAAA,kCAGJ,+CACI,CAAA,kBACA,CAAA,cACA,CAAA,WACA,CAAA,QACA,CAAA,YACA,CAAA,aACA,CAAA,mBAGJ,gBACI,CAAA,eACA,CAAA,iBACA,CAAA,SACA,CAAA,QACA,CAAA,OAGJ,WACI,CAAA,2CAGJ,+BACI,CAAA,iBAGJ,WACI,CAAA,2BAGJ,WACI,CAAA,iBAGJ,iBACI,CAAA,gBACA,CAAA,YAGJ,oBACI,CAAA,uBACA,CAAA,+BAGJ,UACI,CAAA,wBACA,CAAA,qCAGJ,kBACI,CAAA,qCAGJ,wBACI,CAAA,iBACA,CAAA,wBACA,CAAA,yCAGJ,6BAEI,CAAA,uBAGJ,UACI,CAAA,wBACA,CAAA,yBACA,CAAA,iBACA,CAAA,iBACA,CAAA,sBAGJ,iBACI,CAAA,gCAGJ,kBACI,CAAA,iBAGJ,iBACI,CAAA,gBACA,CAAA,YAGJ,oBACI,CAAA,uBACA,CAAA,+BAGJ,UACI,CAAA,qBACA,CAAA,qCAGJ,kBACI,CAAA,qCAGJ,qBACI,CAAA,iBACA,CAAA,wBACA,CAAA,oIAGJ,aACI,CAAA,yBACA,CAAA,eACA,CAAA,WACA,CAAA,gEAGJ,cACI,CAAA,iBACA,CAAA,qCAGJ,mBACI,CAAA,oCAGJ,2BACI,CAAA,+BAGJ,iBACI,CAAA,SACA,CAAA,OACA,CAAA,wBACA,CAAA,2BACA,CAAA,cACA,CAAA,2CAGJ,kBACI,CAAA,yCAGJ,SACI,CAAA,gCAGJ,kBC1RO,CAAA,UD4RH,CAAA,sCAGJ,6BACI,CAAA,UACA,CAAA,2CAGJ,eACI,CAAA,aCrSG,CAAA,gCDySP,0DACI,CAAA,UACA,CAAA,sCAGJ,6BACI,CAAA,UACA,CAAA,2CAGJ,eACI,CAAA,qDACA,CAAA,cAGJ,iBACI,CAAA,cACA,CAAA,eACA,CAAA,UACA,CAAA,YACA,CAAA,cACA,CAAA,uHAGJ,0BACI,CAAA,uBACA,CAAA,qBACA,CAAA,kBACA,CAAA,kBAGJ,eACI,CAAA,uBACA,CAAA,0CACA,CAAA,YACA,CAAA,qCAGJ,kBCtUO,CAAA,oBD0UP,YACI,CAAA,kFAGJ,eAEI,CAAA,8BAGJ,wBACI,CAAA,8BAGJ,eACI,CAAA,qCAGJ,UACI,CAAA,8GAGJ,YACI,CAAA,kCAGJ,aACI,CAAA,yEAGJ,YACI,CAAA,2CAGJ,cACI,CAAA,+BAGJ,aACI,CAAA,+BAGJ,YACI,CAAA,6BAGJ,SACI,CAAA,wBCjYG,CAAA,6BDqYP,iBACI,CAAA,+BAGJ,iBACI,CAAA,4EAGJ,yBAEI,CAAA,gFAGJ,cAEI,CAAA,4EAGJ,cAEI,CAAA,WCjYY,CAAA,YDmYZ,CAAA,WACA,CAAA,mDAGJ,SACI,CAAA,6CAGJ,gBACI,CAAA,wDAGJ,kBACI,CAAA,8DAGJ,WCnZgB,CAAA,oHDuZhB,aAEI,CAAA,WACA,CAAA,4EAGJ,cACI,CAAA,iBACA,CAAA,kGAGJ,2BAEI,CAAA,wFAGJ,iBAEI,CAAA,SACA,CAAA,cACA,CAAA,4GAGJ,QAEI,CAAA,gHAGJ,cAEI,CAAA,4MAGJ,cAII,CAAA,6EAGJ,aACI,CAAA,kGAGJ,yBAEI,CAAA,wFAGJ,QAEI,CAAA,wCAGJ,YACI,CAAA,kBCliBa,CAAA,WDoiBb,CAAA,cACA,CAAA,YACA,CAAA,oDAIJ,aACI,CAAA,WACA,CAAA,8BEljBJ,aACE,CAAA,qDAIF,eACE,CAAA,aD4DK,CAAA,gBC1DL,CAAA,yDAGF,eACE,CAAA,wBAGF,eACE,CAAA,0BAGF,iBACE,CAAA,aACA,CAAA,gEAGF,eACE,CAAA,aDyCK,CAAA,+BCrCP,eACE,CAAA,WACA,CAAA,iCAEF,aDiCO,CAAA,8BC9BP,iBACE,CAAA,2CAGF,eACI,CAAA,wBACA,CAAA,oCAGJ,QACE,CAAA,gBACA,CAAA,uBAGF,cACE,CAAA,8BAGF,kBDYO,CAAA,UCVL,CAAA,iBACA,CAAA,gDAGF,cACE,CAAA,uPAGF,QAKE,CAAA,sEAGF,eACE,CAAA,8BAGF,wBACE,CAAA,yCAGF,YACE,CAAA,yGAEF,yBACE,CAAA,eAGF,wBDrBO,CAAA,UCuBL,CAAA,gBACA,CAAA,cACA,CAAA,wHAGF,2BACE,CAAA,yBAGF,+BACE,aACE,CAAA,UACA,CAAA,CAAA,kCAIJ,uBACE,CAAA,0BAGF,iBACE,wBACE,CAAA,CAAA,yBAGJ,iBACE,wBACE,CAAA,CAAA,yBAIJ,iBACE,wBACE,CAAA,iBAEF,wBACE,CAAA,CAAA,KC7HJ,kBFiGoB,CAAA,sBE7FpB,iBACI,CAAA,SAGJ,eACI,CAAA,yBAGJ,aFRY,CAAA,yBEYZ,aFoDO,CAAA,sBEhDP,aFPY,CAAA,yBEWZ,aF8CS,CAAA,wBE1CT,aF2CM,CAAA,uJEvCN,UAKI,CAAA,aAGJ,wBFpCY,CAAA,oBAAA,CAAA,UEuCR,CAAA,qKAGJ,wBACI,CAAA,oBACA,CAAA,aFzCY,CAAA,2EE6ChB,qBACI,CAAA,+cAGJ,WACI,CAAA,aAGJ,wBFQO,CAAA,oBAAA,CAAA,UELH,CAAA,iHAGJ,yCACI,CAAA,qCACA,CAAA,UACA,CAAA,2EAGJ,qBACI,CAAA,+cAGJ,2CACI,CAAA,uCACA,CAAA,UAGJ,wBFpEY,CAAA,oBAAA,CAAA,UEuER,CAAA,kGAGJ,gEACI,CAAA,4DACA,CAAA,UACA,CAAA,kEAGJ,qBACI,CAAA,kaAGJ,6CACI,CAAA,yCACA,CAAA,aAGJ,wBFzFY,CAAA,0BE2FR,CAAA,UACA,CAAA,iHAGJ,+DACI,CAAA,aFtGY,CAAA,2EE0GhB,qBACI,CAAA,+cAGJ,gEACI,CAAA,aAGJ,wBFnDS,CAAA,oBAAA,CAAA,UEsDL,CAAA,iHAGJ,6CACI,CAAA,yCACA,CAAA,UACA,CAAA,2EAGJ,qBACI,CAAA,+cAGJ,6CACI,CAAA,yCACA,CAAA,YAGJ,wBFvEM,CAAA,0BEyEF,CAAA,UACA,CAAA,4GAGJ,0CACI,CAAA,aFvHc,CAAA,wEE2HlB,qBACI,CAAA,gcAGJ,0CACI,CAAA,sCACA,CAAA,UAGJ,aACI,CAAA,kGAGJ,aFjKe,CAAA,oBEmKX,CAAA,kEAGJ,qBACI,CAAA,kaAGJ,aACI,CAAA,WAGJ,aACI,CAAA,eACA,CAAA,wBACA,CAAA,uGAGJ,aACI,CAAA,wBACA,CAAA,oCAGJ,0CACI,CAAA,qEAGJ,qBACI,CAAA,ibAGJ,aACI,CAAA,oTAGJ,eACI,CAAA,aAGJ,aACI,CAAA,8BACA,CAAA,kBACA,CAAA,aAGJ,kBACI,CAAA,eAGJ,UACI,CAAA,WACA,CAAA,cACA,CAAA,WAGJ,oBACI,CAAA,UACA,CAAA,oBACA,CAAA,wBACA,CAAA,iBACA,CAAA,eACA,CAAA,iBACA,CAAA,iBACA,CAAA,cACA,CAAA,iBACA,CAAA,eACA,CAAA,6BACA,CAAA,kBAGJ,OACI,CAAA,uBAGJ,4JACI,CAAA,8BAGJ,2JACI,CAAA,uBAGJ,4GACI,CAAA,8BAGJ,2GACI,CAAA,uBAGJ,sHACI,CAAA,8BAGJ,qHACI,CAAA,oBAGJ,wHACI,CAAA,2BAGJ,uHACI,CAAA,uBAGJ,kHACI,CAAA,8BAGJ,iHACI,CAAA,sBAGJ,kHACI,CAAA,6BAGJ,iHACI,CAAA,kBAGJ,cACI,CAAA,eACA,CAAA,kBACA,CAAA,UACA,CAAA,aACA,CAAA,gBACA,CAAA,yBAGJ,OACI,CAAA,cACA,CAAA,OC5SJ,wBHSiB,CAAA,aAJF,CAAA,wBGFX,CAAA,qBACA,CAAA,cACA,CAAA,gBACA,CAAA,iBACA,CAAA,gBACA,CAAA,OAGJ,wBHFiB,CAAA,aAJF,CAAA,wBGSb,CAAA,qBACA,CAAA,cACA,CAAA,eACA,CAAA,kBACA,CAAA,gBACA,CAAA,iBACA,CAAA,gBACA,CAAA,8BAGF,wBHXY,CAAA,UGaV,CAAA,wBACA,CAAA,8BAGF,wBHeoB,CAAA,aAEE,CAAA,wBGdpB,CAAA,8BAGF,wBHDqB,CAAA,UAEE,CAAA,wBGErB,CAAA,0CAGF,wBHPqB,CAAA,UAEE,CAAA,wBGQrB,CAAA,4BAGF,wBHlBkB,CAAA,aAEE,CAAA,wBGmBhB,CAAA,wBAGJ,wBHdqB,CAAA,aAEE,CAAA,wBGerB,CAAA,8BAGF,wBACE,CAAA,UACA,CAAA,0BAGF,qBACE,CAAA,aACA,CAAA,4BAGF,wBACE,CAAA,aACA,CAAA,aCtEF,iBACI,CAAA,UACA,CAAA,wBACA,CAAA,qBACA,CAAA,oBACA,CAAA,sBAGJ,YACI,CAAA,mBAGJ,aACI,CAAA,eACA,CAAA,cACA,CAAA,wBACA,CAAA,iBACA,CAAA,mBAGJ,UACI,CAAA,iBACA,CAAA,qCACA,CAAA,wCACA,CAAA,mCACA,CAAA,gCACA,CAAA,mDAGJ,UACI,CAAA,SACA,CAAA,WACA,CAAA,SACA,CAAA,gBACA,CAAA,cACA,CAAA,UACA,CAAA,sCACA,CAAA,gBACA,CAAA,0BACA,CAAA,6BACA,CAAA,qBACA,CAAA,0BAGJ,YACI,CAAA,iBACA,CAAA,wBJkBG,CAAA,UIhBH,CAAA,yBAGJ,aACI,CAAA,kBACA,CAAA,qBACA,CAAA,UACA,CAAA,gBACA,CAAA,oBAGJ,UACI,CAAA,UACA,CAAA,eACA,CAAA,wBACA,CAAA,iBACA,CAAA,iBACA,CAAA,KACA,CAAA,QACA,CAAA,UACA,CAAA,kCACA,CAAA,qCACA,CAAA,gCACA,CAAA,6BACA,CAAA,oEAGJ,aACI,CAAA,qEAGJ,SACI,CAAA,wCAKJ,eACI,CAAA,eACA,CAAA,0BACA,CAAA,qBACA,CAAA,wBACA,CAAA,iBACA,CAAA,WACA,CAAA,sBACA,CAAA,QACA,CAAA,eACA,CAAA,eACA,CAAA,gBACA,CAAA,iBACA,CAAA,UACA,CAAA,yDAGJ,kBACI,CAAA,wBACA,CAAA,iBACA,CAAA,eACA,CAAA,UACA,CAAA,cACA,CAAA,gBACA,CAAA,oBACA,CAAA,wBACA,CAAA,iBACA,CAAA,qKAKJ,UACI,CAAA,wBACA,CAAA,oBACA,CAAA,cACA,CAAA,SACA,CAAA,qCAGJ,qBACI,CAAA,qBACA,CAAA,aACA,CAAA,UACA,CAAA,mBACA,CAAA,gBACA,CAAA,gBACA,CAAA,iBACA,CAAA,oBACA,CAAA,eAKJ,wBJhIY,CAAA,4BIoIZ,wBACI,CAAA,8BAGJ,0BACI,CAAA,+BAGJ,2BACI,CAAA,6BAGJ,yBACI,CAAA,cAKJ,iBACI,CAAA,iBACA,CAAA,kBAGJ,gBACI,CAAA,eACA,CAAA,oBACA,CAAA,qBAGJ,KACI,CAAA,MACA,CAAA,4BAGJ,aACI,CAAA,iBACA,CAAA,QACA,CAAA,UACA,CAAA,SACA,CAAA,kBAGJ,eACI,CAAA,YAGJ,8BACI,CAAA,2BACA,CAAA,sBACA,CAAA,kBAKJ,qBACI,CAAA,qBACA,CAAA,0BACA,CAAA,eACA,CAAA,UACA,CAAA,gBACA,CAAA,kBAGJ,gBACI,CAAA,WAGJ,aACI,CAAA,wBACA,CAAA,cACA,CAAA,oBACA,CAAA,YACA,CAAA,iBACA,CAAA,eACA,CAAA,cACA,CAAA,iBACA,CAAA,kBACA,CAAA,iBAGJ,wBJ/JO,CAAA,oBAAA,CAAA,UIkKH,CAAA,oBAGJ,cACI,CAAA,eACA,CAAA,aACA,CAAA,6DAGJ,oBJxJe,CAAA,kBI0JX,CAAA,0BAGJ,wBACI,CAAA,oBAGJ,yCACI,CAAA,gBAGJ,gBACI,CAAA,iBACA,CAAA,cACA,CAAA,iBACA,CAAA,0EAGJ,iBACI,CAAA,gDAGJ,eAGI,CAAA,wBJtMG,CAAA,oBAAA,CAAA,+BI2MP,aACI,CAAA,aACA,CAAA,yDAGJ,UACI,CAAA,kCAIJ,+BACI,CAAA,0BAGJ,YACI,CAAA,cAGJ,mBACI,CAAA,mCAGJ,eACI,CAAA,0BAGJ,eACI,CAAA,0BAGJ,aACI,CAAA,YAGJ,aACI,CAAA,yBAGJ,iBACI,CAAA,mEAGJ,UACI,CAAA,WACA,CAAA,oBAGJ,wBACI,CAAA,eACA,CAAA,eACA,CAAA,iBACA,CAAA,iBACA,CAAA,cACA,CAAA,gBACA,CAAA,uBAGJ,eACI,CAAA,sBAGJ,aACI,CAAA,gCAGJ,gBACI,CAAA,YAGJ,gBACI,CAAA,iBACA,CAAA,eACA,CAAA,iBACA,CAAA,kBACA,CAAA,MAGJ,QACI,CAAA,SACA,CAAA,eACA,CAAA,SAGJ,kBACI,CAAA,kBACA,CAAA,gCACA,CAAA,yBAGJ,gBACI,CAAA,0BAGJ,iBACI,CAAA,sBAGJ,QACI,CAAA,UACA,CAAA,8CAGJ,gBAEI,CAAA,wBAGJ,YACI,CAAA,iBACA,CAAA,uFAKJ,wBJ7TO,CAAA,oBAAA,CAAA,UIgUH,CAAA,SACA,CAAA,yBAGJ,eACI,CAAA,aJjYa,CAAA,sBIqYjB,eACI,CAAA,aJtYa,CAAA,cIwYb,CAAA,mBACA,CAAA,6BAGJ,gBACI,CAAA,iBACA,CAAA,kBACA,CAAA,yCAGJ,gBACI,CAAA,iBACA,CAAA,kBACA,CAAA,eACA,CAAA,wBAGJ,eACI,CAAA,iBAGJ,wBACI,CAAA,wBACA,CAAA,aACA,CAAA,kBACA,CAAA,iBACA,CAAA,iBACA,CAAA,gCAGJ,gBACI,CAAA,iBACA,CAAA,iBACA,CAAA,4CAGJ,gBACI,CAAA,iBACA,CAAA,0BACA,CAAA,2BAGJ,eACI,CAAA,iBAGJ,aACI,CAAA,6EAGJ,kBJrXO,CAAA,aIwXH,CAAA,oBJ9WW,CAAA,eIgXX,CAAA,yBAGJ,eACI,CAAA,oBAGJ,YACI,CAAA,YAMJ,aACI,CAAA,YACA,CAAA,oCAGJ,aACI,CAAA,YACA,CAAA,eACA,CAAA,4BAGJ,aACI,CAAA,YACA,CAAA,eACA,CAAA,oBAGJ,UACI,CAAA,WACA,CAAA,wBAGJ,WACI,CAAA,YACA,CAAA,WACA,CAAA,YAGJ,iBACI,CAAA,aACA,CAAA,QACA,CAAA,OACA,CAAA,iBACA,CAAA,kBACA,CAAA,kCACA,CAAA,UACA,CAAA,eACA,CAAA,kBACA,CAAA,aACA,CAAA,uBACA,CAAA,eACA,CAAA,iBACA,CAAA,UAGJ,UACI,CAAA,eACA,CAAA,OAGJ,gBACI,CAAA,aAGJ,gBACI,CAAA,0BAGJ,YACI,CAAA,WAGJ,eACI,CAAA,SACA,CAAA,QACA,CAAA,cAGJ,WACI,CAAA,cAGJ,eACI,CAAA,iBACA,CAAA,qMAKJ,wBAKI,CAAA,yCAGJ,WACI,CAAA,uBACA,CAAA,0CAGJ,WACI,CAAA,WACA,CAAA,uBACA,CAAA,qCAGJ,WACI,CAAA,WACA,CAAA,uBACA,CAAA,uBACA,CAAA,oBAGJ,mBACI,CAAA,YAKJ,iBACI,CAAA,YAGJ,UACI,CAAA,WACA,CAAA,aACA,CAAA,kBACA,CAAA,iBACA,CAAA,cACA,CAAA,mBACA,CAAA,mBAGJ,UACI,CAAA,WACA,CAAA,iBACA,CAAA,kBACA,CAAA,cACA,CAAA,gBACA,CAAA,mBAGJ,UACI,CAAA,WACA,CAAA,iBACA,CAAA,kBACA,CAAA,cACA,CAAA,gBACA,CAAA,yBAGJ,gBACI,CAAA,mBACA,CAAA,qBACA,CAAA,gCACA,CAAA,WAGJ,aACI,CAAA,sBAKJ,cACI,CAAA,yBAGJ,eACI,CAAA,cACA,CAAA,eAGJ,wBACI,CAAA,kBACA,CAAA,SACA,CAAA,aACA,CAAA,gBACA,CAAA,oBAGJ,iBACI,CAAA,eACA,CAAA,QACA,CAAA,kBACA,CAAA,WACA,CAAA,qBAGJ,iBACI,CAAA,gBACA,CAAA,QACA,CAAA,kBACA,CAAA,WACA,CAAA,cACA,CAAA,uBAGJ,cACI,CAAA,eACA,CAAA,iBACA,CAAA,sBAGJ,cACI,CAAA,wBACA,CAAA,MAKJ,2BACI,CAAA,mBACA,CAAA,wBACA,CAAA,qBACA,CAAA,gBACA,CAAA,eAGJ,YACI,CAAA,qBAGJ,kBJxmBO,CAAA,cI0mBH,CAAA,YACA,CAAA,KACA,CAAA,UACA,CAAA,UACA,CAAA,UACA,CAAA,eAGJ,YACI,CAAA,QAKJ,iBACI,CAAA,iBACA,CAAA,kBACA,CAAA,eACA,CAAA,kBAGJ,cACI,CAAA,sBAGJ,cACI,CAAA,eACA,CAAA,iBAGJ,YACI,CAAA,wBACA,CAAA,eACA,CAAA,uBAGJ,6BACI,CAAA,eACA,CAAA,oBAGJ,YACI,CAAA,oBAGJ,oBACI,CAAA,qBACA,CAAA,sCAGJ,QACI,CAAA,WAGJ,4BACI,CAAA,QACA,CAAA,SACA,CAAA,cACA,CAAA,sBAGJ,cACI,CAAA,yBAGJ,kBJlqBO,CAAA,gBIoqBH,CAAA,iBACA,CAAA,iBACA,CAAA,aACA,CAAA,iBACA,CAAA,wBACA,CAAA,uEAGJ,iBACI,CAAA,cACA,CAAA,eACA,CAAA,uBACA,CAAA,cAGJ,kBJnrBO,CAAA,6BIqrBH,CAAA,8BACA,CAAA,iBACA,CAAA,aACA,CAAA,iBACA,CAAA,YACA,CAAA,mBAGJ,WACI,CAAA,oBACA,CAAA,cACA,CAAA,YACA,CAAA,qBAGJ,aACI,CAAA,gBACA,CAAA,YAGJ,cACI,CAAA,gBAGJ,4BACI,CAAA,kBAGJ,cACI,CAAA,eACA,CAAA,cAGJ,yBACI,CAAA,QAIJ,+BACI,CAAA,YAGJ,WACI,CAAA,SAGJ,WACI,CAAA,YAGJ,WACI,CAAA,UAGJ,cACI,CAAA,2BAGJ,qBACI,CAAA,qBACA,CAAA,wBACA,CAAA,iBACA,CAAA,aACA,CAAA,aACA,CAAA,gBACA,CAAA,0EACA,CAAA,UACA,CAAA,uCAGJ,+BACI,CAAA,2BAGJ,oBJxwBO,CAAA,2BI4wBP,oBJxwBS,CAAA,yBI4wBT,oBJ3wBM,CAAA,4BI+wBN,aJpxBO,CAAA,4BIwxBP,aJpxBS,CAAA,0BIwxBT,aJvxBM,CAAA,mBI2xBN,qBACI,CAAA,wBACA,CAAA,iBACA,CAAA,aACA,CAAA,cACA,CAAA,eACA,CAAA,aACA,CAAA,gBACA,CAAA,iBACA,CAAA,yCAGJ,gBACI,CAAA,iCAGJ,SACI,CAAA,cAGJ,yCACI,CAAA,eACA,CAAA,0BAGJ,yCACI,CAAA,eACA,CAAA,yBAKJ,WACI,CAAA,yBAGJ,oCACI,CAAA,6BACA,CAAA,kBACA,CAAA,8BAGJ,8BACI,CAAA,aAIJ,iBACI,CAAA,UACA,CAAA,wBACA,CAAA,qBACA,CAAA,oBACA,CAAA,sBAGJ,YACI,CAAA,mBAGJ,aACI,CAAA,eACA,CAAA,cACA,CAAA,wBACA,CAAA,iBACA,CAAA,mBAGJ,aACI,CAAA,UACA,CAAA,iBACA,CAAA,qCACA,CAAA,wCACA,CAAA,mCACA,CAAA,gCACA,CAAA,mDAGJ,aACI,CAAA,UACA,CAAA,SACA,CAAA,WACA,CAAA,SACA,CAAA,gBACA,CAAA,cACA,CAAA,UACA,CAAA,sCACA,CAAA,gBACA,CAAA,0BACA,CAAA,6BACA,CAAA,qBACA,CAAA,0BAGJ,YACI,CAAA,gBACA,CAAA,wBACA,CAAA,UACA,CAAA,yBAGJ,aACI,CAAA,iBACA,CAAA,qBACA,CAAA,aACA,CAAA,gBACA,CAAA,oBAGJ,aACI,CAAA,UACA,CAAA,UACA,CAAA,eACA,CAAA,wBACA,CAAA,iBACA,CAAA,iBACA,CAAA,KACA,CAAA,QACA,CAAA,UACA,CAAA,kCACA,CAAA,qCACA,CAAA,gCACA,CAAA,6BACA,CAAA,oEAGJ,aACI,CAAA,qEAGJ,SACI,CAAA,WAKJ,2BACI,CAAA,kBAGJ,wBACI,CAAA,kBAGJ,wBACI,CAAA,oBAGJ,WACI,CAAA,gBACA,CAAA,aACA,CAAA,wBACA,CAAA,sCACA,CAAA,4BAGJ,UACI,CAAA,qBACA,CAAA,+BAGJ,iBACI,CAAA,qBACA,CAAA,sBACA,CAAA,oBACA,CAAA,kBAGJ,eACI,CAAA,qBACA,CAAA,wBACA,CAAA,wBACA,CAAA,0BACA,CAAA,2BACA,CAAA,4BAGJ,0BACI,CAAA,wBACA,CAAA,sBACA,CAAA,eACA,CAAA,iBACA,CAAA,wBACA,CAAA,oCAGJ,cACI,CAAA,WACA,CAAA,qBACA,CAAA,iBACA,CAAA,2FAGJ,kBACI,CAAA,qBACA,CAAA,gBACA,CAAA,gBACA,CAAA,aACA,CAAA,sCACA,CAAA,mBAGJ,sBACI,CAAA,sBAGJ,6BACI,CAAA,mCAGJ,+BACI,CAAA,mCACA,CAAA,iCACA,CAAA,wIAGJ,kBACI,CAAA,wBACA,CAAA,iGAGJ,kBACI,CAAA,wFAGJ,qBACI,CAAA,eACA,CAAA,kBACA,CAAA,aACA,CAAA,wBAGJ,iBACI,CAAA,UACA,CAAA,qBACA,CAAA,WACA,CAAA,yBAGJ,aACI,CAAA,aACA,CAAA,WACA,CAAA,gBACA,CAAA,QACA,CAAA,UACA,CAAA,6BAGJ,iBACI,CAAA,4BAGJ,WACI,CAAA,iBACA,CAAA,sCAGJ,iBACI,CAAA,+BAGJ,WACI,CAAA,UACA,CAAA,oBAGJ,iBACI,CAAA,OACA,CAAA,QACA,CAAA,UACA,CAAA,WACA,CAAA,WACA,CAAA,WACA,CAAA,UACA,CAAA,iBACA,CAAA,gBACA,CAAA,YACA,CAAA,2BACA,CAAA,cACA,CAAA,yBAGJ,WACI,CAAA,UACA,CAAA,cACA,CAAA,iBACA,CAAA,iBAGJ,WACI,CAAA,4DAGJ,wBACI,CAAA,6DAGJ,yBACI,CAAA,+DAGJ,2BACI,CAAA,gEAGJ,4BACI,CAAA,mBAGJ,qBACI,CAAA,+BAGJ,SACI,CAAA,+BAGJ,4BACI,CAAA,wBAGJ,WACI,CAAA,mCAGJ,iBACI,CAAA,gCAGJ,qBACI,CAAA,8BAGJ,iBACI,CAAA,IAKJ,iBACI,CAAA,aACA,CAAA,QACA,CAAA,SACA,CAAA,eACA,CAAA,cACA,CAAA,gBACA,CAAA,SAGJ,aACI,CAAA,iBACA,CAAA,QACA,CAAA,SACA,CAAA,eACA,CAAA,kBAGJ,iBACI,CAAA,uBAGJ,YACI,CAAA,mCAGJ,aAGI,CAAA,iBACA,CAAA,QACA,CAAA,SACA,CAAA,eACA,CAAA,cACA,CAAA,gBACA,CAAA,WAGJ,aACI,CAAA,YACA,CAAA,gBACA,CAAA,UACA,CAAA,oBACA,CAAA,wBACA,CAAA,kBACA,CAAA,yBACA,CAAA,iBACA,CAAA,qBACA,CAAA,0BACA,CAAA,gBAGJ,gBACI,CAAA,iBAGJ,kBACI,CAAA,cACA,CAAA,gBACA,CAAA,gBAGJ,aACI,CAAA,iBACA,CAAA,cACA,CAAA,UACA,CAAA,UACA,CAAA,WACA,CAAA,YACA,CAAA,SACA,CAAA,gBACA,CAAA,kBACA,CAAA,eACA,CAAA,QACA,CAAA,wBACA,CAAA,cACA,CAAA,aACA,CAAA,iBACA,CAAA,gBACA,CAAA,uBAGJ,WACI,CAAA,aACA,CAAA,iBACA,CAAA,UACA,CAAA,iBACA,CAAA,aACA,CAAA,6CAGJ,WACI,CAAA,2BAGJ,uBACI,CAAA,WACA,CAAA,UACA,CAAA,aACA,CAAA,kCAGJ,WACI,CAAA,wDAGJ,WACI,CAAA,0BAGJ,YAEI,CAAA,SACA,CAAA,eACA,CAAA,kBACA,CAAA,yBACA,CAAA,qBACA,CAAA,0BACA,CAAA,UAGJ,sBACI,CAAA,gBACA,CAAA,wBACA,CAAA,4MACA,CAAA,sMACA,CAAA,4LACA,CAAA,yBACA,CAAA,iCACA,CAAA,WAGJ,iBACI,CAAA,YACA,CAAA,mBACA,CAAA,+BAGJ,YACI,CAAA,sBAGJ,+CACI,CAAA,uCACA,CAAA,gBAIJ,aACI,CAAA,UACA,CAAA,cACA,CAAA,UACA,CAAA,QACA,CAAA,yBACA,CAAA,4BACA,CAAA,eAGJ,SACI,CAAA,oBACA,CAAA,mCAGJ,UAEI,CAAA,eACA,CAAA,qBACA,CAAA,kFACA,CAAA,WACA,CAAA,qBACA,CAAA,0BACA,CAAA,sBAGJ,aACI,CAAA,yBACA,CAAA,kBACA,CAAA,YACA,CAAA,sBAGJ,iBACI,CAAA,mCAGJ,cAEI,CAAA,YACA,CAAA,qBACA,CAAA,0BACA,CAAA,YAIJ,qBACI,CAAA,WACA,CAAA,mBAGJ,iBACI,CAAA,eACA,CAAA,YAIJ,YACI,CAAA,YAIJ,aACI,CAAA,oBACA,CAAA,eACA,CAAA,oBAGJ,yBACI,CAAA,WAIJ,wBACI,CAAA,UACA,CAAA,YACA,CAAA,YAGJ,wBACI,CAAA,WACA,CAAA,YACA,CAAA,cAGJ,iBACI,CAAA,+BACA,CAAA,QAGJ,iBACI,CAAA,YAGJ,kBACI,CAAA,YAGJ,kBACI,CAAA,gBAGJ,kBACI,CAAA,OAGJ,+BACI,CAAA,QAGJ,8BACI,CAAA,cAGJ,iBACI,CAAA,wBAKJ,gCACI,CAAA,+BAGJ,cACI,CAAA,uBACA,CAAA,cACA,CAAA,gBACA,CAAA,UACA,CAAA,UACA,CAAA,kBACA,CAAA,4BACA,CAAA,uCAGJ,WACI,CAAA,qCAGJ,WACI,CAAA,oCAGJ,WACI,CAAA,uCAGJ,WACI,CAAA,qBAGJ,4BACI,CAAA,+BACA,CAAA,uBACA,CAAA,UACA,CAAA,4BACA,CAAA,wBACA,CAAA,wBAGJ,4BACI,CAAA,+BACA,CAAA,uBACA,CAAA,SACA,CAAA,6BACA,CAAA,yBACA,CAAA,cACA,CAAA,OAGJ,wBJh7CO,CAAA,eIo7CP,wBJp7CO,CAAA,aIw7CP,wBJn7CM,CAAA,YIu7CN,wBJz7CQ,CAAA,eI67CR,wBJ57CS,CAAA,sBIg8CT,eACI,CAAA,yBAGJ,kBACI,CAAA,mCAIJ,eACI,CAAA,SACA,CAAA,0DACA,CAAA,qEACA,CAAA,kEACA,CAAA,WACA,CAAA,eACA,CAAA,aACA,CAAA,+BAGJ,6BACI,CAAA,+BAGJ,6BACI,CAAA,8BAGJ,6BACI,CAAA,4BAGJ,6BACI,CAAA,4BAIJ,eACI,CAAA,iBACA,CAAA,UACA,CAAA,gBAGJ,YACI,CAAA,WACA,CAAA,6BAIJ,0BACI,CAAA,2BACA,CAAA,+BACA,CAAA,cAGJ,UACI,CAAA,iBACA,CAAA,iBACA,CAAA,WACA,CAAA,0BAGJ,WACI,CAAA,UACA,CAAA,aAGJ,aACI,CAAA,cACA,CAAA,cACA,CAAA,iBACA,CAAA,iBAGJ,yBACI,CAAA,kBACA,CAAA,wBACA,CAAA,mBAGJ,kBACI,CAAA,iBACA,CAAA,wBACA,CAAA,0CAGJ,aACI,CAAA,aAGJ,eACI,CAAA,iBACA,CAAA,iCAGJ,UACI,CAAA,iBACA,CAAA,6CAGJ,WACI,CAAA,UACA,CAAA,UAGJ,cACI,CAAA,YAGJ,aACI,CAAA,mBACA,CAAA,+BACA,CAAA,cAGJ,cACI,CAAA,gBACA,CAAA,eACA,CAAA,uCAGJ,uBACI,CAAA,kBAGJ,UACI,CAAA,6BAGJ,UACI,CAAA,gBACA,CAAA,aAGJ,oBACI,CAAA,YAGJ,iBACI,CAAA,YAGJ,UACI,CAAA,YAGJ,UACI,CAAA,UACA,CAAA,iBACA,CAAA,iBACA,CAAA,mBAGJ,aACI,CAAA,aACA,CAAA,cACA,CAAA,eACA,CAAA,yBAGJ,aACI,CAAA,gBAGJ,cACI,CAAA,cACA,CAAA,aACA,CAAA,uBAGJ,aJ9mDO,CAAA,sCIknDP,aJlnDO,CAAA,yBIsnDP,YAEI,sBACI,CAAA,YAEA,CAAA,YAGJ,qBACI,CAAA,CAAA,oBAMR,SAEI,CAAA,gBACA,CAAA,aACA,CAAA,2BAGJ,UAEI,CAAA,aACA,CAAA,UACA,CAAA,mBAGJ,iBACI,CAAA,SACA,CAAA,cACA,CAAA,iBACA,CAAA,2BAGJ,UACI,CAAA,iBACA,CAAA,KACA,CAAA,SACA,CAAA,WACA,CAAA,SACA,CAAA,kBACA,CAAA,gCAIJ,WACI,CAAA,yCAGJ,kBACI,CAAA,iDAIJ,8DACI,CAAA,oEAGJ,8DACI,CAAA,mMAGJ,8DAEI,CAAA,uGAGJ,kBAEI,CAAA,2CAGJ,sCACI,cACI,CAAA,iBACA,CAAA,6CAGJ,QACI,CAAA,gBACA,CAAA,CAAA,2CAIR,oEACI,8DACI,CAAA,CAAA,yBAIR,iBACI,CAAA,YACA,CAAA,+BAGJ,UACI,CAAA,aACA,CAAA,UACA,CAAA,qCAGJ,YACI,CAAA,oCAGJ,eACI,CAAA,2CAGJ,6CACI,YACI,CAAA,yDAGJ,YACI,CAAA,wDAGJ,eACI,CAAA,CAAA,wBAIR,iBACI,CAAA,KACA,CAAA,MACA,CAAA,UACA,CAAA,WACA,CAAA,iBACA,CAAA,cACA,CAAA,wBACA,CAAA,iBACA,CAAA,0BAGJ,aACI,CAAA,UACA,CAAA,WACA,CAAA,iBACA,CAAA,QACA,CAAA,OACA,CAAA,iBACA,CAAA,eACA,CAAA,2CAGJ,4CACI,UACI,CAAA,WACA,CAAA,QACA,CAAA,iBACA,CAAA,+BACA,CAAA,kCACA,CAAA,cACA,CAAA,8CAGJ,iBACI,CAAA,gBACA,CAAA,qEAGJ,iBACI,CAAA,CAAA,2BAKR,iBACI,CAAA,gBACA,CAAA,eACA,CAAA,mBACA,CAAA,WACA,CAAA,iCAGJ,UACI,CAAA,aACA,CAAA,UACA,CAAA,8BAGJ,eACI,CAAA,cACA,CAAA,6BAIJ,YACI,CAAA,eACA,CAAA,0CAIJ,UACI,CAAA,eACA,CAAA,qBAGJ,aJ/zDO,CAAA,eIi0DH,CAAA,mCAGJ,UACI,CAAA,iBACA,CAAA,QACA,CAAA,UACA,CAAA,QACA,CAAA,OACA,CAAA,8BACA,CAAA,2BACA,CAAA,0CAGJ,8BACI,cACI,CAAA,6BAGJ,cACI,CAAA,CAAA,2CAIR,+CACI,aACI,CAAA,aACA,CAAA,SACA,CAAA,uDAGJ,QACI,CAAA,SACA,CAAA,0BACA,CAAA,sBACA,CAAA,oDAGJ,UACI,CAAA,8DAGJ,iBACI,CAAA,UACA,CAAA,SACA,CAAA,OACA,CAAA,cACA,CAAA,wFAGJ,WACI,CAAA,gGAGJ,QACI,CAAA,SACA,CAAA,UACA,CAAA,0BACA,CAAA,uBACA,CAAA,6FAGJ,WACI,CAAA,uGAGJ,SACI,CAAA,UACA,CAAA,gBACA,CAAA,wEAGJ,iBACI,CAAA,CAAA,4BASJ,eACI,CAAA,wBACA,CAAA,iBACA,CAAA,YACA,CAAA,iBACA,CAAA,8HAGJ,wBAGI,CAAA,iCACA,CAAA,qBACA,CAAA,6BAGJ,UACI,CAAA,kBACA,CAAA,sCAGJ,eACI,CAAA,8HAGJ,wBACI,CAAA,iCACA,CAAA,0BAGJ,+BACI,CAAA,sCAGJ,eACI,CAAA,mGAGJ,4BACI,CAAA,qCAGJ,wBACI,CAAA,0BACA,CAAA,iHAGJ,eAGI,CAAA,uCAGJ,eACI,CAAA,2EAGJ,SACI,CAAA,uCAGJ,SACI,CAAA,eACA,CAAA,wCAGJ,SACI,CAAA,gBACA,CAAA,gFAGJ,YAEI,CAAA,2EAGJ,aAEI,CAAA,sCAGJ,4BACI,CAAA,yCAGJ,eACI,CAAA,eACA,CAAA,2CAGJ,iCACI,CAAA,8BACA,CAAA,yBACA,CAAA,kGAGJ,wBJh+DW,CAAA,iCIm+DP,CAAA,iFAIJ,UAEI,CAAA,qFAGJ,cAEI,CAAA,cACA,CAAA,iBACA,CAAA,qCAGJ,UACI,CAAA,iBACA,CAAA,0CAGJ,iBACI,CAAA,iCACA,CAAA,8BACA,CAAA,yBACA,CAAA,yJAGJ,kDAGI,EAAA,uBACA,CAAA,sCAGJ,WACI,CAAA,gBACA,CAAA,2CAGJ,gBACI,CAAA,iCACA,CAAA,8BACA,CAAA,yBACA,CAAA,4JAGJ,kDAGI,EAAA,sBACA,CAAA,SACA,CAAA,sBAKR,UACI,CAAA,WACA,CAAA,iBACA,CAAA,eACA,CAAA,gBAGJ,iBACI,CAAA,YACA,CAAA,wBACA,CAAA,iBACA,CAAA,kBACA,CAAA,UACA,CAAA,8BACA,CAAA,iBACA,CAAA,WACA,CAAA,0DAGJ,iBACI,CAAA,SACA,CAAA,iBACA,CAAA,kBJrkEG,CAAA,WIukEH,CAAA,UACA,CAAA,cACA,CAAA,gBACA,CAAA,iBACA,CAAA,sBACA,CAAA,uCAGJ,UACI,CAAA,WACA,CAAA,mBAGJ,QACI,CAAA,oBAGJ,QACI,CAAA,mBAGJ,WACI,CAAA,YACA,CAAA,WACA,CAAA,oBAGJ,iBACI,CAAA,MACA,CAAA,KACA,CAAA,OACA,CAAA,QACA,CAAA,+uIACA,CAAA,yBAGJ,gBACI,CAAA,cACA,CAAA,iBACA,CAAA,uBAGJ,iBACI,CAAA,yBAGJ,QACI,CAAA,OACA,CAAA,yBAGJ,KACI,CAAA,OACA,CAAA,mBAGJ,eACI,CAAA,UACA,CAAA,iBACA,CAAA,4CAGJ,UACI,CAAA,oBACA,CAAA,uBACA,CAAA,oEAGJ,UACI,CAAA,4CAGJ,oBACI,CAAA,WACA,CAAA,iDAGJ,UACI,CAAA,wDAGJ,WACI,CAAA,wDAGJ,WACI,CAAA,UACA,CAAA,oBACA,CAAA,qBACA,CAAA,6BAGJ,cACI,CAAA,sDAGJ,iBACI,CAAA,sDAGJ,oBACI,CAAA,qBACA,CAAA,gBACA,CAAA,gBACA,CAAA,gBCjvEJ,WACE,CAAA,+CACA,CAAA,iBACA,CAAA,iBACA,CAAA,OACA,CAAA,6CAGF,UACE,CAAA,WACA,CAAA,4DAGF,cACE,CAAA,8BAGF,eACE,CAAA,gBACA,CAAA,4BAGF,kBACE,CAAA,6CAGF,aACE,CAAA,cACA,CAAA,QACA,CAAA,0BAGF,mBACE,CAAA,mDAGF,8BACE,CAAA,2EAGF,6BACE,CAAA,eAMF,qBACI,CAAA,6BACA,CAAA,4BACA,CAAA,eACA,CAAA,cACA,CAAA,QACA,CAAA,sBACA,CAAA,YACA,CAAA,QACA,CAAA,YACA,CAAA,4BAQJ,OACE,CAAA,wCAGF,KACE,CAAA,eACA,CAAA,+BAKA,WACE,CAAA,yCAGF,SACE,CAAA,yCAEF,cACE,CAAA,yCAEF,SACE,CAAA,kCAGF,WACE,CAAA,oCAGF,WACE,CAAA,iBACA,CAAA,QACA,CAAA,eACA,CAAA,kBL5Fa,CAAA,UK8Fb,CAAA,iBACA,CAAA,qEAEA,CAAA,2CAGF,WACE,CAAA,kBACA,CAAA,aLlCS,CAAA,gBKoCT,CAAA,8FAIF,WAGE,CAAA,mCAIF,QACE,CAAA,SACA,CAAA,sCAGF,+BACE,CAAA,iBACA,CAAA,eACA,CAAA,cAEA,CAAA,oDAGF,kBACE,CAAA,wCAGF,oBACE,CAAA,aACA,CAAA,oCAGF,iBACE,CAAA,cACA,CAAA,kCAOF,eACE,CAAA,YACA,CAAA,+BACA,CAAA,qCAMA,iBACE,CAAA,gBACA,CAAA,mCAMF,iBACE,CAAA,iDAKJ,iBACE,CAAA,sCAGF,oBACE,CAAA,aACA,CAAA,oCAGF,iBACE,CAAA,oDAGF,WACE,CAAA,UACA,CAAA,iBACA,CAAA,iCAGF,iBACE,CAAA,+BACA,CAAA,KCpMJ,0DACE,CAAA,wBNKe,CAAA,cMHf,CAAA,aNuEW,CAAA,iBMrEX,CAAA,UAIF,WACE,CAAA,uEAIF,WAEE,CAAA,cAGF,eACE,CAAA,kBAIF,wDNsEkB,CAAA,2BMlElB,wBACE,CAAA,gBNgEY,CAAA,aM9DZ,CAAA,kDACA,CAAA,+CACA,CAAA,0CACA,CAAA,4EAGF,2BAEE,CAAA,OAGF,aACE,CAAA,OAGF,aACE,CAAA,eACA,CAAA,EAGF,cACE,CAAA,aNvCU,CAAA,gBM2CZ,oBACE,CAAA,aNiBW,CAAA,eMbb,0CACE,CAAA,WAGF,eACE,CAAA,aAGF,eACE,CAAA,gBAKF,wBACE,CAAA,KAGF,8BACE,CAAA,gBAGF,6BACE,CAAA,UACA,CAAA,qBACA,CAAA,UACA,CAAA,aACA,CAAA,eAGF,+BACE,CAAA,8BACA,CAAA,6BACA,CAAA,eACA,CAAA,kBACA,CAAA,MAGF,qBACE,CAAA,sBACA,CAAA,kBAIF,kBACE,CAAA,cAGF,iBACE,CAAA,SAEA,CAAA,aAIF,WACE,CAAA,gBACA,CAAA,eAIF,2BACE,CAAA,qBACA,CAAA,8BACA,CAAA,iBACA,CAAA,mCACA,CAAA,cACA,CAAA,iBACA,CAAA,cAGF,YACE,CAAA,YAGF,2BACE,CAAA,qBAIF,kBACE,CAAA,uBAGF,iBACE,CAAA,iBACA,CAAA,mCAGF,sBACE,CAAA,kBACA,CAAA,iBACA,CAAA,cACA,CAAA,sBAGF,cACE,CAAA,qBAGF,cACE,CAAA,aACA,CAAA,cAGF,YACE,CAAA,SAMF,UACE,CAAA,iBACA,CAAA,SAGF,cACE,CAAA,iBAGF,sBACE,CAAA,cAGF,cACE,CAAA,gBACA,CAAA,4BACA,CAAA,yBAGF,cACE,gBACE,CAAA,kBACA,CAAA,iBACA,CAAA,CAAA,cAIJ,gBACE,CAAA,gBACA,CAAA,gKAGF,cAEI,CAAA,UACA,CAAA,wBAGJ,4BACI,CAAA,aACA,CAAA,UAGJ,0BACI,CAAA,aN5MQ,CAAA,QMmNZ,sCAEE,CAAA,4BACA,CAAA,QACA,CAAA,MACA,CAAA,iBACA,CAAA,iBACA,CAAA,OACA,CAAA,mBAGF,iBACE,CAAA,QACA,CAAA,MACA,CAAA,OACA,CAAA,YACA,CAAA,iBACA,CAAA,eACA,CAAA,4BACA,CAAA,cAGF,iBACE,CAAA,QACA,CAAA,MACA,CAAA,OACA,CAAA,YACA,CAAA,iBACA,CAAA,eACA,CAAA,4BACA,CAAA,mBACA,CAAA,yEAGF,QAEE,CAAA,0EAGF,mBAEE,CAAA,wDAGF,QACE,CAAA,8BAGF,eACE,CAAA,cAKF,QACI,CAAA,yBACA,CAAA,oCAGJ,iBACE,CAAA,gBAKF,wBACE,CAAA,wDAGF,wBACE,CAAA,uBACA,CAAA,wKAGF,wBACE,CAAA,mBAGF,4BACE,CAAA,qBACA,CAAA,kHAGF,4BACE,CAAA,mBACA,CAAA,WACA,CAAA,kBACA,CAAA,mBAKF,eACE,CAAA,QACA,CAAA,4BAGF,gBACE,CAAA,8EAGF,8BACE,CAAA,4BACA,CAAA,6BACA,CAAA,2BACA,CAAA,eACA,CAAA,oCACA,CAAA,qBNhQK,CAAA,iBMkQL,CAAA,kBACA,CAAA,gBACA,CAAA,UACA,CAAA,cACA,CAAA,iBAGF,eACE,CAAA,WACA,CAAA,eAGF,aACE,CAAA,eACA,CAAA,2BACA,CAAA,0CAGF,wBACE,CAAA,aNtRW,CAAA,qBM0Rb,gBACE,CAAA,YAKF,oBACE,CAAA,YAGF,sBACE,CAAA,YAGF,mBACE,CAAA,eAGF,uBACE,CAAA,uBAGF,kBACE,CAAA,gBACA,CAAA,mBAGF,6BACE,CAAA,8BACA,CAAA,eACA,CAAA,kBACA,CAAA,aAGF,6BACE,CAAA,iBACA,CAAA,eACA,CAAA,kBACA,CAAA,cAGF,gBACE,CAAA,8BACA,CAAA,eACA,CAAA,kBACA,CAAA,YAGF,qBACE,CAAA,YAGF,cACE,CAAA,YACA,CAAA,oCAGF,cACE,CAAA,cAGF,cACE,CAAA,aACA,CAAA,2BAIF,YACE,CAAA,kBAGF,qBACE,CAAA,iBACA,CAAA,UAGF,UACE,CAAA,UACA,CAAA,cACA,CAAA,eACA,CAAA,iBACA,CAAA,iBACA,CAAA,wBNpXK,CAAA,aMwXP,cACE,CAAA,cAGF,eACE,CAAA,kBACA,CAAA,uBAGF,cACE,CAAA,aACA,CAAA,aN3XW,CAAA,qBM+Xb,aACE,CAAA,qBAGF,YACE,CAAA,UAEA,CAAA,aACA,CAAA,0BAGF,WACE,CAAA,YAGF,qBACE,CAAA,SACA,CAAA,eACA,CAAA,iBAGF,aACE,CAAA,oBAGF,aACE,CAAA,KAGF,wBACE,CAAA,iBACA,CAAA,aACA,CAAA,aACA,CAAA,eACA,CAAA,kBACA,CAAA,MAGF,UACE,CAAA,kBACA,CAAA,YACA,CAAA,SACA,CAAA,8BAGF,YACE,CAAA,yCAEF,WACE,CAAA,2CAEF,WACE,CAAA,yBAGF,aACE,CAAA,YAGF,8BACE,CAAA,4BACA,CAAA,6BACA,CAAA,2BACA,CAAA,qBNlbc,CAAA,oBADD,CAAA,iBMsbb,CAAA,6BACA,CAAA,sBACA,CAAA,aACA,CAAA,eACA,CAAA,qBACA,CAAA,eACA,CAAA,cAGF,qBN7bkB,CAAA,aM+bd,CAAA,2BACA,CAAA,oBNlcW,CAAA,iBMocX,CAAA,kBACA,CAAA,gBACA,CAAA,iBACA,CAAA,aAGJ,aACE,CAAA,4BACA,CAAA,aACA,CAAA,eACA,CAAA,iBACA,CAAA,uBAGF,YACE,CAAA,wBAGF,iBACE,CAAA,uBAGF,kBACE,CAAA,uBAGF,UACE,CAAA,wBAGF,eACE,CAAA,aACA,CAAA,oBAGF,kBACE,CAAA,aACA,CAAA,WAGF,wBACE,CAAA,cAGF,UACE,CAAA,cAGF,wBACE,CAAA,kBACA,CAAA,iBAGF,eACE,CAAA,cACA,CAAA,eAGF,oBACE,CAAA,cACA,CAAA,cACA,CAAA,SACA,CAAA,sBACA,CAAA,UACA,CAAA,mBAGF,UACE,CAAA,eACA,CAAA,YAGF,oBACE,CAAA,WACA,CAAA,YACA,CAAA,iBACA,CAAA,SACA,CAAA,cAGF,cACE,CAAA,eACA,CAAA,aACA,CAAA,0BAGF,UACE,CAAA,gCAGF,gBACE,CAAA,cACA,CAAA,2BAGF,SACE,CAAA,OACA,CAAA,SAKF,wBNpjBO,CAAA,UMwjBP,qBACE,CAAA,SAGF,wBNrkBO,CAAA,UMukBL,CAAA,SAGF,wBNxkBO,CAAA,UM0kBL,CAAA,UAGF,wBN5kBQ,CAAA,UM8kBN,CAAA,WAGF,wBNhlBS,CAAA,UMklBP,CAAA,QAGF,wBNplBM,CAAA,UMslBJ,CAAA,UAGF,wBACE,CAAA,eAGF,oBNlmBO,CAAA,8BMsmBP,wBNtmBO,CAAA,oBAAA,CAAA,eM2mBP,oBNzmBO,CAAA,8BM6mBP,wBN7mBO,CAAA,oBAAA,CAAA,UMgnBL,CAAA,YAGF,oBNlnBQ,CAAA,2BMsnBR,wBNtnBQ,CAAA,oBAAA,CAAA,UMynBN,CAAA,eAGF,oBN3nBS,CAAA,8BM+nBT,wBN/nBS,CAAA,oBAAA,CAAA,UMkoBP,CAAA,cAGF,oBNpoBM,CAAA,6BMwoBN,wBNxoBM,CAAA,oBAAA,CAAA,UM2oBJ,CAAA,cAGF,wBNnpBO,CAAA,8CMupBP,WACE,CAAA,+BAGF,cACE,CAAA,4CAGF,UACE,CAAA,iBACA,CAAA,yBAGF,wBACE,CAAA,sBAGF,wBNtqBO,CAAA,mBM0qBP,wBNzqBQ,CAAA,sBM6qBR,wBN5qBS,CAAA,qBMgrBT,wBN/qBM,CAAA,aMmrBN,iBACE,CAAA,WAGF,iBACE,CAAA,YACA,CAAA,cAGF,YACE,CAAA,WAKF,aNvsBO,CAAA,cM2sBP,aACE,CAAA,cAGF,aNluBsB,CAAA,WMsuBtB,aNxwBY,CAAA,cM4wBZ,aNntBS,CAAA,aMutBT,aNttBM,CAAA,YM0tBN,aNvtBa,CAAA,YM2tBb,wBACI,CAAA,wBACA,CAAA,iBACA,CAAA,aACA,CAAA,cACA,CAAA,gBACA,CAAA,cACA,CAAA,gBACA,CAAA,oBACA,CAAA,YAGJ,0CACE,CAAA,uCACA,CAAA,kCACA,CAAA,2PAIF,eAQE,CAAA,wQAIF,eAOE,CAAA,oBAIF,iBACE,CAAA,QACA,CAAA,UACA,CAAA,YACA,CAAA,aACA,CAAA,0BAGF,UACE,CAAA,aAMF,WACE,CAAA,eAGF,yBACE,CAAA,cACA,CAAA,iBACA,CAAA,kBAGF,wBACE,CAAA,cACA,CAAA,iBACA,CAAA,WAGF,eACE,CAAA,WACA,CAAA,WACA,CAAA,UACA,CAAA,gBAKF,YACE,CAAA,gBACA,CAAA,OAKF,WACE,CAAA,MAGF,YACE,CAAA,MAGF,YACE,CAAA,KAGF,YACE,CAAA,MAGF,YACE,CAAA,MAGF,YACE,CAAA,MAGF,YACE,CAAA,OAGF,cACE,CAAA,MAGF,UACE,CAAA,MAGF,WACE,CAAA,GAGF,WACE,CAAA,MAGF,WACE,CAAA,MAGF,WACE,CAAA,MAGF,WACE,CAAA,KAGF,mBACE,CAAA,UAGF,aACE,CAAA,QAGF,eACE,CAAA,QAGF,gBACE,CAAA,KAGF,gBACE,CAAA,QAGF,gBACE,CAAA,QAGF,gBACE,CAAA,QAGF,gBACE,CAAA,WAGF,gBACE,CAAA,UAGF,gBACE,CAAA,UAGF,iBACE,CAAA,OAGF,iBACE,CAAA,UAGF,iBACE,CAAA,UAGF,iBACE,CAAA,UAGF,iBACE,CAAA,UAGF,YACE,CAAA,SAGF,cACE,CAAA,QAGF,cACE,CAAA,QAGF,eACE,CAAA,KAGF,eACE,CAAA,QAGF,eACE,CAAA,QAGF,eACE,CAAA,QAGF,eACE,CAAA,WAGF,eACE,CAAA,UAGF,eACE,CAAA,UAGF,gBACE,CAAA,OAGF,gBACE,CAAA,UAGF,gBACE,CAAA,UAGF,gBACE,CAAA,UAGF,gBACE,CAAA,UAGF,cACE,CAAA,SAGF,gBACE,CAAA,QAGF,gBACE,CAAA,QAGF,iBACE,CAAA,KAGF,iBACE,CAAA,QAGF,iBACE,CAAA,QAGF,iBACE,CAAA,QAGF,iBACE,CAAA,WAGF,iBACE,CAAA,UAGF,iBACE,CAAA,UAGF,kBACE,CAAA,OAGF,kBACE,CAAA,UAGF,kBACE,CAAA,UAGF,kBACE,CAAA,UAGF,kBACE,CAAA,UAGF,eACE,CAAA,SAGF,iBACE,CAAA,QAGF,iBACE,CAAA,QAGF,kBACE,CAAA,KAGF,kBACE,CAAA,QAGF,kBACE,CAAA,QAGF,kBACE,CAAA,QAGF,kBACE,CAAA,WAGF,kBACE,CAAA,UAGF,kBACE,CAAA,UAGF,mBACE,CAAA,OAGF,mBACE,CAAA,UAGF,mBACE,CAAA,UAGF,mBACE,CAAA,UAGF,mBACE,CAAA,UAGF,aACE,CAAA,UAGF,aACE,CAAA,UAGF,aACE,CAAA,UAGF,aACE,CAAA,gBAKF,gCAAA,CAAA,uCAGA,UACE,CAAA,WACA,CAAA,kBACA,CAAA,aC5rCF,eACE,CAAA,kBAGF,eACE,CAAA,aACA,CAAA,4BAGF,aACE,CAAA,iBAGF,cACE,CAAA,cACA,CAAA,aAKF,qBACE,CAAA,wBACA,CAAA,YACA,CAAA,kBACA,CAAA,eAGF,aACE,CAAA,8JAKF,gBACE,CAAA,8JAGF,gBACE,CAAA,uCAGF,gBACE,CAAA,2BAGF,aACE,CAAA,sCAGF,4BACE,CAAA,gBACA,CAAA,SACA,CAAA,YAKF,eACE,CAAA,WACA,CAAA,aACA,CAAA,gBACA,CAAA,uBAGF,WACE,CAAA,iBACA,CAAA,wBAGF,WACE,CAAA,cAGF,eACE,CAAA,aACA,CAAA,4BACA,CAAA,aAGF,eACE,CAAA,aACA,CAAA,4BACA,CAAA,WAGF,aACE,CAAA,eACA,CAAA,eACA,CAAA,oBACA,CAAA,iBACA,CAAA,eAGF,eACE,CAAA,qBAGF,gBACE,CAAA,WAGF,UACE,CAAA,iBACA,CAAA,SACA,CAAA,QACA,CAAA,kBACA,CAAA,gBAGF,eACE,CAAA,eACA,CAAA,aACA,CAAA,oBACA,CAAA,uBAGF,kBACE,CAAA,kBAKF,YACE,CAAA,2BACA,CAAA,qBAGF,eACE,CAAA,cACA,CAAA,WAGF,0BACE,CAAA,eAGF,eACE,CAAA,8CAGF,iBACE,CAAA,wCAGF,4BACE,CAAA,eACA,CAAA,cACA,CAAA,aACA,CAAA,cACA,CAAA,0BAGF,0BACE,CAAA,uBAKF,iBACE,CAAA,KACA,CAAA,OACA,CAAA,WACA,CAAA,UACA,CAAA,iBACA,CAAA,4BACA,CAAA,+BACA,CAAA,6BACA,CAAA,kBACA,CAAA,qBAGF,gBACE,CAAA,WACA,CAAA,iBACA,CAAA,gBACA,CAAA,wBAGF,6BACE,CAAA,4BACA,CAAA,gBACA,CAAA,gBACA,CAAA,8BAGF,kBACE,CAAA,2BAIF,eACE,CAAA,eAGF,eACE,CAAA,cACA,CAAA,gBAGF,oBACE,CAAA,UACA,CAAA,eACA,CAAA,aACA,CAAA,YACA,CAAA,WACA,CAAA,WACA,CAAA,iBACA,CAAA,sBAGF,iBACE,CAAA,OACA,CAAA,SACA,CAAA,cACA,CAAA,kBAGF,iBACE,CAAA,UACA,CAAA,WACA,CAAA,aACA,CAAA,YAGF,yBACE,CAAA,UACA,CAAA,kBAGF,cACE,CAAA,gBAGF,oBACE,CAAA,UACA,CAAA,eACA,CAAA,aACA,CAAA,YACA,CAAA,WACA,CAAA,WACA,CAAA,mCAEA,CAAA,gDAEA,CAAA,wCAEA,CAAA,gBAGF,+BACE,CAAA,0BACA,CAAA,4BACA,CAAA,gCAGF,yBACE,CAAA,8BACA,CAAA,2BACA,CAAA,iBACA,CAAA,OACA,CAAA,8BAGF,0BACE,CAAA,+BACA,CAAA,4BACA,CAAA,iBACA,CAAA,QACA,CAAA,8BAGF,yBACE,CAAA,8BACA,CAAA,2BACA,CAAA,iBACA,CAAA,SACA,CAAA,4CAGF,4BACE,CAAA,yBACA,CAAA,uBACA,CAAA,iBACA,CAAA,SACA,CAAA,gBAGF,oBACE,CAAA,UACA,CAAA,eACA,CAAA,aACA,CAAA,YACA,CAAA,WACA,CAAA,WACA,CAAA,mCACA,CAAA,gDACA,CAAA,wCACA,CAAA,0CACA,CAAA,sCACA,CAAA,gDACA,CAAA,UAKF,UACE,CAAA,WACA,CAAA,iBAGF,wBACE,CAAA,cAGF,4BACE,CAAA,QACA,CAAA,SACA,CAAA,kBAGF,UACE,CAAA,aACA,CAAA,aACA,CAAA,gBAGF,+BACE,CAAA,aACA,CAAA,kBAGF,gBACE,CAAA,aACA,CAAA,oBAGF,UACE,CAAA,aACA,CAAA,aACA,CAAA,kBAGF,aACE,CAAA,oBAGF,gBACE,CAAA,aACA,CAAA,+BAGF,aP/RO,CAAA,kCOmSP,aPjSO,CAAA,+BOqSP,aPpSQ,CAAA,iCOwSR,aACE,CAAA,kCAGF,aACE,CAAA,2BAGF,eACE,CAAA,aAGF,UACE,CAAA,eAGF,cACE,CAAA,wBPnTK,CAAA,gBOqTL,CAAA,aACA,CAAA,iBACA,CAAA,wBACA,CAAA,gBACA,CAAA,cACA,CAAA,aACA,CAAA,MAGF,wBACE,CAAA,SACA,CAAA,qBACA,CAAA,iBACA,CAAA,kBACA,CAAA,iBACA,CAAA,8BAGF,aACE,CAAA,yBAGF,YACE,CAAA,eACA,CAAA,YAGF,iBACE,CAAA,iBACA,CAAA,cAGF,aACE,CAAA,cACA,CAAA,iBACA,CAAA,qBAGF,yBACE,CAAA,cAGF,cACE,CAAA,aACA,CAAA,iBAGF,YACE,CAAA,wBACA,CAAA,4BACA,CAAA,iBAGF,aP3Wa,CAAA,aO+Wb,aP/Wa,CAAA,eOiXT,CAAA,QAGJ,iBACE,CAAA,oBACA,CAAA,OACA,CAAA,QACA,CAAA,aACA,CAAA,+BACA,CAAA,+BACA,CAAA,gCACA,CAAA,SACA,CAAA,UACA,CAAA,eAGF,gBACE,CAAA,aAGF,eACE,CAAA,iBAKF,0BACE,CAAA,kCAGF,+BACE,CAAA,0BAGF,YACE,CAAA,cAGF,mBACE,CAAA,mCAGF,eACE,CAAA,0BAGF,eACE,CAAA,yBAGF,iBACE,CAAA,mEAGF,UACE,CAAA,WACA,CAAA,oBAGF,wBACE,CAAA,eACA,CAAA,eACA,CAAA,iBACA,CAAA,iBACA,CAAA,cACA,CAAA,gBACA,CAAA,uBAGF,eACE,CAAA,sBAGF,aACE,CAAA,YAGF,gBACE,CAAA,iBACA,CAAA,eACA,CAAA,iBACA,CAAA,kBACA,CAAA,UAKF,qBACE,CAAA,wBACA,CAAA,YACA,CAAA,WACA,CAAA,kBACA,CAAA,iBAGF,qBACE,CAAA,wBACA,CAAA,eACA,CAAA,2BACA,CAAA,oBAGF,cACE,CAAA,gCAGF,eACE,CAAA,WAGF,4BACE,CAAA,YACA,CAAA,WAGF,4BACE,CAAA,yBAGF,iBACE,CAAA,uBAGF,iBACE,CAAA,sCAGF,wBACE,CAAA,iBAGF,4BACE,CAAA,YACA,CAAA,cACA,CAAA,iBAGF,eACE,CAAA,WACA,CAAA,YACA,CAAA,aAGF,SACE,CAAA,iCAIF,gBACE,CAAA,qBACA,CAAA,kBAGF,eACE,CAAA,cACA,CAAA,oBAGF,UACE,CAAA,WACA,CAAA,iBAGF,cACE,CAAA,aPrhBW,CAAA,eOuhBX,CAAA,0BAGF,eACE,CAAA,+BACA,CAAA,iBACA,CAAA,qBACA,CAAA,gCAGF,cACE,CAAA,qBACA,CAAA,gBACA,CAAA,aACA,CAAA,iBACA,CAAA,wBACA,CAAA,gBACA,CAAA,cACA,CAAA,aACA,CAAA,oBAGF,cACE,CAAA,aP9iBW,CAAA,gBOgjBX,CAAA,gBACA,CAAA,UAKF,YACE,CAAA,iBACA,CAAA,eACA,CAAA,cAGF,cACE,CAAA,eACA,CAAA,aPtkBK,CAAA,aOwkBL,CAAA,oBAGF,oDACE,CAAA,YAGF,eACE,CAAA,kBPvkBK,CAAA,wBOykBL,CAAA,iBACA,CAAA,YACA,CAAA,oBAGF,kBP9kBO,CAAA,eOglBL,CAAA,cACA,CAAA,wBACA,CAAA,eAKF,sBACE,CAAA,aAGF,UACE,CAAA,WACA,CAAA,UACA,CAAA,iBACA,CAAA,gBAGF,YACE,CAAA,WAGF,gBACI,CAAA,+BACA,CAAA,aAGJ,aACE,CAAA,WAGF,aACE,CAAA,4BAGF,iBACE,CAAA,yBAGF,4BACE,eACE,CAAA,CAAA,yBAGJ,SACE,CAAA,cAGF,iBACE,CAAA,gBAGF,WACI,CAAA,UACA,CAAA,wBACA,CAAA,iBACA,CAAA,cACA,CAAA,oDAGJ,UACE,CAAA,iBACA,CAAA,qDAGF,WACE,CAAA,gBACA,CAAA,SAGF,qBACI,CAAA,wBACA,CAAA,eACA,CAAA,aACA,CAAA,iBACA,CAAA,iBACA,CAAA,iBACA,CAAA,kDAGJ,WACE,CAAA,mDAGF,UACE,CAAA,6CAGF,eACE,CAAA,gBACA,CAAA,8CAGF,gBACE,CAAA,iBACA,CAAA,cAGF,cACE,CAAA,UACA,CAAA,iBAGF,aACE,CAAA,iBAGF,eACE,CAAA,YACA,CAAA,YACA,CAAA,eACA,CAAA,YAGF,eACE,CAAA,YACA,CAAA,+BAGF,eACE,CAAA,8CAIF,WACE,CAAA,kCAGF,OACE,CAAA,cAMF,eACE,CAAA,wBAGF,iBACE,CAAA,YACA,CAAA,eAGF,iBACE,CAAA,YACA,CAAA,0BAGF,WACE,CAAA,qBACA,CAAA,WACA,CAAA,aAGF,eACE,CAAA,aACA,CAAA,mBAGF,aACE,CAAA,eAGF,UACE,CAAA,mBAGF,UACE,CAAA,WACA,CAAA,iBACA,CAAA,cAGF,UACE,CAAA,wBACA,CAAA,eAGF,eACE,CAAA,4CAGF,QACE,CAAA,+CAGF,wBACE,CAAA,wHAIA,4BACE,CAAA,SAKJ,eACE,CAAA,SAGF,gBACE,CAAA,WAGF,gBACE,CAAA,YAGF,cACE,CAAA,eACA,CAAA,aACA,CAAA,WAGF,cACE,CAAA,gBACA,CAAA,eAGF,iBACE,CAAA,qBACA,CAAA,uBAGF,YACE,CAAA,yBAKF,aPj0BO,CAAA,gCOq0BP,qBACE,CAAA,WACA,CAAA,YAGF,SACE,CAAA,cAGF,eACE,CAAA,aPv0BW,CAAA,kBO20Bb,aACE,CAAA,cAIF,aACE,CAAA,6BAGF,UACE,CAAA,WACA,CAAA,iBACA,CAAA,eAKF,cACE,CAAA,YAEF,eACE,CAAA,QACA,CAAA,eAEF,kBACI,CAAA,wBACA,CAAA,mBACA,CAAA,YACA,CAAA,iBACA,CAAA,qBAEJ,cACE,CAAA,eACA,CAAA,+BAEF,6BACE,CAAA,8BAEF,6BACE,CAAA,4BAEF,6BACE,CAAA,+BAEF,6BACE,CAAA,cAEF,cACE,CAAA,cACA,CAAA,IAIF,wBACE,CAAA,oBACA,CAAA,IAGF,wBACE,CAAA,aAKF,SACE,CAAA,wBAEA,CAAA,uCAGF,8BAEE,CAAA,0CACA,CAAA,uCACA,CAAA,kCACA,CAAA,mBAGF,iBACE,CAAA,cACA,CAAA,qDACA,CAAA,0CACA,CAAA,eACA,CAAA,sBAGF,eACE,CAAA,cAGF,YACE,CAAA,iBACA,CAAA,qBAGF,SACE,CAAA,oBAGF,aP56Ba,CAAA,2BOg7Bb,aPt7BS,CAAA,wBO07BT,wBACE,CAAA,cAGF,cACE,CAAA,eACA,CAAA,aP57BW,CAAA,aO87BX,CAAA,kBACA,CAAA,wCAGF,aP18BO,CAAA,eO+8BP,cACE,CAAA,eACA,CAAA,UACA,CAAA,wBPl9BK,CAAA,gBOo9BL,CAAA,iBAEA,CAAA,SACA,CAAA,OACA,CAAA,wCAIF,gBACE,CAAA,sCAGF,UACE,CAAA,SACA,CAAA,0CAGF,UACI,CAAA,WACA,CAAA,wBACA,CAAA,uDAGJ,wBACE,CAAA,UACA,CAAA,iBAGF,wBAEI,CAAA,eACA,CAAA,kBACA,CAAA,0BAGJ,eACE,CAAA,kBACA,CAAA,qCAGF,eACE,CAAA,+BACA,CAAA,4BAGF,cACE,CAAA,gBACA,CAAA,eAGF,WACE,CAAA,eAGF,wBACE,CAAA,gCAGF,gBACE,CAAA,mBAGF,WACE,CAAA,UACA,CAAA,iBACA,CAAA,6BAGF,cACE,CAAA,aACA,CAAA,aAGF,YACE,CAAA,iBAGF,kBACE,CAAA,eAGF,4BACI,CAAA,iBACA,CAAA,kBACA,CAAA,mCAGJ,UACE,CAAA,iBACA,CAAA,4BAGF,YACE,CAAA,gBAGF,eACE,CAAA,yBAGF,cACE,CAAA,YC3nCF,cACE,CAAA,WACA,CAAA,UACA,CAAA,WACA,CAAA,mBAGF,iBACE,CAAA,QACA,CAAA,UACA,CAAA,iBAGF,WACE,CAAA,UACA,CAAA,aACA,CAAA,kBACA,CAAA,eACA,CAAA,iBACA,CAAA,UACA,CAAA,iBACA,CAAA,uBAGF,UACE,CAAA,kBACA,CAAA,gBAIF,YACE,CAAA,cACA,CAAA,WACA,CAAA,UACA,CAAA,eACA,CAAA,wBACA,CAAA,WACA,CAAA,YACA,CAAA,iBACA,CAAA,8BAGF,aACE,CAAA,4BAIA,WACE,CAAA,UACA,CAAA,uBAIJ,aACE,CAAA,yBAKA,kBRrDe,CAAA,gBQuDb,CAAA,gBACA,CAAA,UACA,CAAA,2BAGF,UACE,CAAA,cACA,CAAA,kBACA,CAAA,yBAGF,iBACE,CAAA,sCAEA,gBACE,CAAA,iBACA,CAAA,cACA,CAAA,6BAGF,mBACE,CAAA,uCAGF,gBACE,CAAA,iBACA,CAAA,cACA,CAAA,gBACA,CAAA,aACA,CAAA,kBACA,CAAA,kBACA,CAAA,8CAGF,kBACE,CAAA,UACA,CAAA,+BAGF,eACE,CAAA,UACA,CAAA,6CAEA,UACE,CAAA,gCAIJ,gBACE,CAAA,UACA,CAAA,8CAEA,WACE,CAAA,2BAON,iBACE,CAAA,8CCjHJ,WACE,CAAA,kBAGF,WACE,CAAA,mBACA,CAAA,mCAGF,WACE,CAAA,6CAGF,WACE,CAAA,4BAGF,WACE,CAAA,sCAGF,WACE,CAAA,6BAGF,WACE,CAAA,uCAGF,WACE,CAAA,kEAGF,WACE,CAAA,oCAGF,+BACE,CAAA,2BACA,CAAA,uBACA,CAAA,2CAGF,WACE,CAAA,qBAGF,YACE,CAAA,wBAGF,aACE,CAAA,uBAGF,iBACE,CAAA,QACA,CAAA,eACA,CAAA,uCACA,CAAA,+BACA,CAAA,gCACA,CAAA,wBACA,CAAA,6CACA,CAAA,qCACA,CAAA,sCClEF,UACE,CAAA,WACA,CAAA,wBVyDK,CAAA,aAgBO,CAAA,0DUtEZ,CAAA,kDACA,CAAA,kCAEF,GACE,gEACE,CAAA,wDACA,CAAA,IAEF,qEACE,CAAA,6DACA,CAAA,KAEF,wEACE,CAAA,gEACA,CAAA,CAAA,0BAEJ,GACE,gEACE,CAAA,wDACA,CAAA,IAEF,qEACE,CAAA,6DACA,CAAA,KAEF,wEACE,CAAA,gEACA,CAAA,CAAA,qCAWJ,UACE,CAAA,WACA,CAAA,iBACA,CAAA,aV6BY,CAAA,0FU3Bd,UACE,CAAA,WACA,CAAA,iBACA,CAAA,wBVQK,CAAA,UUNL,CAAA,iBACA,CAAA,KACA,CAAA,MACA,CAAA,yDACA,CAAA,iDACA,CAAA,6CACF,2BACE,CAAA,mBACA,CAAA,mCAEF,QACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,2BAEJ,QACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,4BAcJ,aVlBc,CAAA,UUoBZ,CAAA,WACA,CAAA,iBACA,CAAA,cACA,CAAA,qBACF,wBVxCO,CAAA,WU0CL,CAAA,SACA,CAAA,oBACA,CAAA,+DACA,CAAA,uDACA,CAAA,2BACF,6BACE,CAAA,qBACA,CAAA,2BACF,2BACE,CAAA,mBACA,CAAA,2BACF,6BACE,CAAA,qBACA,CAAA,2BACF,6BACE,CAAA,qBACA,CAAA,uCAEF,YACE,6BACE,CAAA,qBACA,CAAA,IAEF,2BACE,CAAA,mBACA,CAAA,CAAA,+BAEJ,YACE,6BACE,CAAA,qBACA,CAAA,IAEF,2BACE,CAAA,mBACA,CAAA,CAAA,uCAWJ,aVvEc,CAAA,UUyEZ,CAAA,WACA,CAAA,iBACA,CAAA,4EACF,wBV5FO,CAAA,UU8FL,CAAA,WACA,CAAA,iBACA,CAAA,KACA,CAAA,MACA,CAAA,gEACA,CAAA,wDACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,wCAEF,IACE,4DACE,CAAA,oDACA,CAAA,IAEF,mEAEE,CAAA,2DACA,CAAA,MAEF,mEACE,CAAA,2DACA,CAAA,IAEF,6EACE,CAAA,qEACA,CAAA,KAEF,iCACE,CAAA,yBACA,CAAA,CAAA,gCAEJ,IACE,4DACE,CAAA,oDACA,CAAA,IAEF,mEAEE,CAAA,2DACA,CAAA,MAEF,mEACE,CAAA,2DACA,CAAA,IAEF,6EACE,CAAA,qEACA,CAAA,KAEF,iCACE,CAAA,yBACA,CAAA,CAAA,6BAQJ,UACE,CAAA,WACA,CAAA,aV7IY,CAAA,wBAhBP,CAAA,kBUgKL,CAAA,0DACA,CAAA,kDACA,CAAA,oCAEF,GACE,0BACE,CAAA,kBACA,CAAA,KAEF,0BACE,CAAA,kBACA,CAAA,SACA,CAAA,CAAA,4BAEJ,GACE,0BACE,CAAA,kBACA,CAAA,KAEF,0BACE,CAAA,kBACA,CAAA,SACA,CAAA,CAAA,oCAWJ,aVjLc,CAAA,UUmLZ,CAAA,WACA,CAAA,iBACA,CAAA,iBACA,CAAA,yDACA,CAAA,iDACA,CAAA,oEACF,SACE,CAAA,UACA,CAAA,oBACA,CAAA,iBACA,CAAA,KACA,CAAA,wBV9MK,CAAA,kBUgNL,CAAA,8DACA,CAAA,sDACA,CAAA,kCACF,QACE,CAAA,UACA,CAAA,2BACA,CAAA,mBACA,CAAA,wCAEF,KACE,gCACE,CAAA,wBACA,CAAA,CAAA,gCAEJ,KACE,gCACE,CAAA,wBACA,CAAA,CAAA,wCAEJ,QACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,gCAEJ,QACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,oCAYJ,aV/Oc,CAAA,UUiPZ,CAAA,iBACA,CAAA,6BACF,UACE,CAAA,WACA,CAAA,wBVrQK,CAAA,kBUuQL,CAAA,oBACA,CAAA,+DACA,CAAA,uDACA,CAAA,gCAEA,CAAA,wBACA,CAAA,qCACF,8BACE,CAAA,sBACA,CAAA,qCACF,8BACE,CAAA,sBACA,CAAA,uCAEF,YACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,+BAEJ,YACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,8BAqBJ,aV1Sc,CAAA,UU4SZ,CAAA,WACA,CAAA,iBACA,CAAA,8BACF,UACE,CAAA,WACA,CAAA,iBACA,CAAA,MACA,CAAA,KACA,CAAA,qCACF,UACE,CAAA,aACA,CAAA,aVvTY,CAAA,SUyTZ,CAAA,UACA,CAAA,wBV1UK,CAAA,kBU4UL,CAAA,gEACA,CAAA,wDACA,CAAA,gCAEA,CAAA,wBACA,CAAA,+BACF,+BACE,CAAA,2BACA,CAAA,uBACA,CAAA,+BACF,+BACE,CAAA,2BACA,CAAA,uBACA,CAAA,+BACF,+BACE,CAAA,2BACA,CAAA,uBACA,CAAA,+BACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,+BACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,+BACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,+BACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,+BACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,gCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,gCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,gCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,sCACF,2BACE,CAAA,mBACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,sCACF,6BACE,CAAA,qBACA,CAAA,uCACF,6BACE,CAAA,qBACA,CAAA,uCACF,6BACE,CAAA,qBACA,CAAA,uCACF,6BACE,CAAA,qBACA,CAAA,wCAEF,YACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,gCAEJ,YACE,0BACE,CAAA,kBACA,CAAA,IAEF,0BACE,CAAA,kBACA,CAAA,CAAA,iCAyBJ,UACE,CAAA,WACA,CAAA,aV3bY,CAAA,+BU6bd,SACE,CAAA,UACA,CAAA,wBV/cK,CAAA,UUidL,CAAA,iEACA,CAAA,yDACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,4CACF,0BACE,CAAA,kBACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,4CACF,2BACE,CAAA,mBACA,CAAA,yCAEF,YACE,kCACE,CAAA,0BACA,CAAA,IAEF,kCACE,CAAA,0BACA,CAAA,CAAA,iCAEJ,YACE,kCACE,CAAA,0BACA,CAAA,IAEF,kCACE,CAAA,0BACA,CAAA,CAAA,iCAUJ,wBV1gBO,CAAA,UU4gBL,CAAA,WACA,CAAA,kBACA,CAAA,iBACA,CAAA,aV/fY,CAAA,mDUigBZ,CAAA,2CACA,CAAA,uCACF,aACE,CAAA,qBACA,CAAA,SACA,CAAA,UACA,CAAA,iBACA,CAAA,iBACA,CAAA,OACA,CAAA,QACA,CAAA,kCAEF,GACE,2BACE,CAAA,mBACA,CAAA,KAEF,gCACE,CAAA,wBACA,CAAA,CAAA,0BAEJ,GACE,2BACE,CAAA,mBACA,CAAA,KAEF,gCACE,CAAA,wBACA,CAAA,CAAA,qCAqBJ,aVljBc,CAAA,UUojBZ,CAAA,WACA,CAAA,iBACA,CAAA,qCACF,UACE,CAAA,WACA,CAAA,iBACA,CAAA,MACA,CAAA,KACA,CAAA,4CACF,UACE,CAAA,aACA,CAAA,aV/jBY,CAAA,SUikBZ,CAAA,UACA,CAAA,wBVllBK,CAAA,kBUolBL,CAAA,8DACA,CAAA,sDACA,CAAA,gCAEA,CAAA,wBACA,CAAA,sCACF,+BACE,CAAA,2BACA,CAAA,uBACA,CAAA,sCACF,+BACE,CAAA,2BACA,CAAA,uBACA,CAAA,sCACF,+BACE,CAAA,2BACA,CAAA,uBACA,CAAA,sCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,sCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,sCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,sCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,sCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,uCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,uCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,uCACF,gCACE,CAAA,4BACA,CAAA,wBACA,CAAA,6CACF,6BACE,CAAA,qBACA,CAAA,6CACF,2BACE,CAAA,mBACA,CAAA,6CACF,6BACE,CAAA,qBACA,CAAA,6CACF,6BACE,CAAA,qBACA,CAAA,6CACF,6BACE,CAAA,qBACA,CAAA,6CACF,6BACE,CAAA,qBACA,CAAA,6CACF,6BACE,CAAA,qBACA,CAAA,6CACF,6BACE,CAAA,qBACA,CAAA,8CACF,6BACE,CAAA,qBACA,CAAA,8CACF,6BACE,CAAA,qBACA,CAAA,8CACF,6BACE,CAAA,qBACA,CAAA,sCAEF,YACE,SACE,CAAA,IAEF,SACE,CAAA,CAAA,8BAEJ,YACE,SACE,CAAA,IAEF,SACE,CAAA,CAAA,wBCnvBA,kBACI,CAAA,iCAGJ,yBACI,CAAA,yBAGJ,WACI,CAAA,sBAGJ,qBACI,CAAA,qBAGJ,sBACI,CAAA,sBAGJ,UACI,CAAA,wBAGJ,UACI,CAAA,wBAGJ,qBACI,CAAA,0CAGJ,gBACI,CAAA,cACA,CAAA,6BAGJ,WACI,CAAA,wBACA,CAAA,mCAGJ,gBACI,CAAA,cACA,CAAA,+BAGJ,eACI,CAAA,iCAGJ,MACI,CAAA,UACA,CAAA,kCAGJ,8BACI,CAAA,gBACA,CAAA,wBAGJ,MACI,CAAA,UACA,CAAA,qBAGJ,2BACI,CAAA,8BAGJ,UACI,CAAA,yCAGJ,4BACI,CAAA,+BAGJ,2BACI,CAAA,wDAGJ,aACI,CAAA,kBACA,CAAA,oCAGJ,SACI,CAAA,SACA,CAAA,gBACA,CAAA,kBACA,CAAA,oBAGJ,WACI,CAAA,sBAGJ,WACI,CAAA,gDAGJ,kBACI,CAAA,gBACA,CAAA,8BAGJ,gBACI,CAAA,eAGJ,6BACI,CAAA,iBACA,CAAA,4BAGJ,kBACI,CAAA,cACA,CAAA,0BAGJ,WACI,CAAA,4BAGJ,kBACI,CAAA,cACA,CAAA,iCAGJ,aACI,CAAA,cACA,CAAA,qBAGJ,OACI,CAAA,SACA,CAAA,0BAGJ,iBACI,CAAA,aACA,CAAA,0BAGJ,aACI,CAAA,wBAGJ,kBACI,CAAA,aACA,CAAA,yBAIR,gDAEI,gBACE,CAAA,CAAA,8EAKN,iBACE,CAAA,4FAGF,cACE,CAAA,wCAIF,WACE,CAAA,gBACA,CAAA,iBACA,CAAA,+CAGF,UACE,CAAA,uCAGF,QACE,CAAA,oCAGF,iBACE,CAAA,kDAGF,cACE,CAAA,6DAGF,kBACE,CAAA,mEAGF,WX/GgB,CAAA,mCWmHhB,gBACE,CAAA,gCAGF,WACE,CAAA,0CAGF,gBACE,CAAA,+IAGF,QACE,CAAA,+EAGF,QACE,CAAA,yBAGF,0CAEE,gBACE,CAAA,+BAGF,gBACE,CAAA,gBACA,CAAA,iBACA,CAAA,qCAGF,YACE,CAAA,YACA,CAAA,iBACA,CAAA,UACA,CAAA,iDAGF,aACE,CAAA,mDAGF,YACE,CAAA,WACA,CAAA,cAEA,CAAA,WXlKY,CAAA,+DWsKd,aACE,CAAA,CAAA,mBAMJ,aACE,CAAA,cCnQF,iBACE,CAAA,QACA,CAAA,SACA,CAAA,eACA,CAAA,kBAGF,mBACE,CAAA,iBACA,CAAA,YACA,CAAA,uBACA,CAAA,uBAGF,gBACE,CAAA,WAGF,kBZ2CO,CAAA,iBYzCL,CAAA,yBACA,CAAA,+BACA,CAAA,cACA,CAAA,KACA,CAAA,QACA,CAAA,UACA,CAAA,UACA,CAAA,cACA,CAAA,gBAGF,WACE,CAAA,gBACA,CAAA,kBZqCK,CAAA,uBYjCP,kBACE,CAAA,iBACA,CAAA,wBACA,CAAA,eACA,CAAA,aACA,CAAA,iBACA,CAAA,cACA,CAAA,cAGF,iBACE,CAAA,mBAGF,iBACE,CAAA,sBAGF,WACE,CAAA,aAGF,wBACE,CAAA,gBAGF,UACE,CAAA,kDAGF,iBACE,CAAA,cAGF,eACE,CAAA,kBACA,CAAA,oBAGF,kBACE,CAAA,WAGF,eACE,CAAA,oEACA,CAAA,iBAGF,kBACE,CAAA,aAGF,eACE,CAAA,uEACA,CAAA,mBAGF,kBACE,CAAA,YAGF,eACE,CAAA,oEACA,CAAA,kBAGF,kBACE,CAAA,2BCjGF,wBACE,CAAA,wCAGF,iBACE,CAAA,qCAGF,wBACE,CAAA,mBAGF,6BACE,CAAA,oBAGF,kBAtBe,CAAA,kDAwBb,CAAA,sCAGF,kBA1BgB,CAAA,oBA8BhB,wBACE,CAAA,sBAGF,WACE,CAAA,uBAGF,iDACE,CAAA,kBAGF,aAzCiB,CAAA,yBA6CjB,UACE,CAAA,2BAGF,kBAnDe,CAAA,oBAAA,CAAA,YAwDf,kBAvDgB,CAAA,2BA2DhB,eACE,CAAA,0BAGF,wBACE,CAAA,6BACA,CAAA,eACA,CAAA,2BACA,CAAA,oCAGF,eACE,CAAA,yBAGF,iBACE,CAAA,sBAGF,kBA5EiB,CAAA,0CAgFjB,gBACE,CAAA,iCAGF,oCACE,CAAA,uBAGF,WACE,CAAA,oBAGF,2BACE,CAAA,sCAGF,UACE,CAAA,eACA,CAAA,kDAGF,UACE,CAAA,UACA,CAAA,yBAGF,iBACE,CAAA,oBAGF,iBACE,CAAA,gFAGF,iDACE,CAAA,UACA,CAAA,kCAGF,UACE,CAAA,gCAEF,wBACE,CAAA,YAeF,wBACE,CAAA,2BAGF,wBACE,CAAA,wCAGF,iBACE,CAAA,mBAGF,6BACE,CAAA,oBAGF,kBAtBe,CAAA,kDAwBb,CAAA,sCAGF,kBA1BgB,CAAA,oBA8BhB,wBACE,CAAA,qCAGF,wBACE,CAAA,sBAGF,WACE,CAAA,6BACA,CAAA,uBAGF,kBACE,CAAA,sBAGF,cACE,CAAA,2CAGF,aACE,CAAA,sCAGF,aACI,CAAA,SACA,CAAA,UACA,CAAA,2DAGJ,aACE,CAAA,yBAGF,aAhEoB,CAAA,gCAoEpB,kBApEoB,CAAA,2BAwEpB,kBA1Ee,CAAA,oBAAA,CAAA,uBA+Ef,6BACE,CAAA,oBAGF,UACE,CAAA,qBAGF,wBAtFgB,CAAA,2BA0FhB,kBAzFoB,CAAA,oCA6FpB,kBA7FoB,CAAA,6BA+FlB,CAAA,oBAGF,2BACE,CAAA,0BAGF,6BACE,CAAA,6BACA,CAAA,eACA,CAAA,2BACA,CAAA,yBAGF,iBACE,CAAA,qCAGF,0BACE,CAAA,oBAGF,6BACE,CAAA,WACA,CAAA,iBACA,CAAA,sBAGF,6BACE,CAAA,sBACA,CAAA,sBAGF,kBACE,CAAA,0GACA,CAAA,qGACA,CAAA,sGACA,CAAA,8FACA,CAAA,mGACA,CAAA,0CAGF,gBACE,CAAA,iCAGF,oCACE,CAAA,uBAGF,WACE,CAAA,sCAGF,aACE,CAAA,eACA,CAAA,kDAGF,aACE,CAAA,UACA,CAAA,oBAGF,kBACE,CAAA,kFAGF,iDACE,CAAA,gFAGF,kBACE,CAAA,aACA,CAAA,kCAGF,UACE,CAAA,gCAEF,wBACE,CAAA,2BAeF,wBACE,CAAA,wCAGF,iBACE,CAAA,qCAGF,wBACE,CAAA,mBAGF,6BACE,CAAA,kCAGF,kBArBgB,CAAA,oBAyBhB,kBA1Be,CAAA,kDA4Bb,CAAA,sCAGF,kBA9BgB,CAAA,oBAkChB,wBACE,CAAA,sBAGF,WACE,CAAA,uBAGF,yCACE,CAAA,oCAGF,eACE,CAAA,kBAGF,aAjDiB,CAAA,yBAqDjB,UACE,CAAA,2BAGF,kBA3De,CAAA,oBAAA,CAAA,YAgEf,kBA/DgB,CAAA,2BAmEhB,eACE,CAAA,0BAGF,wBACE,CAAA,6BACA,CAAA,eACA,CAAA,2BACA,CAAA,yBAGF,iBACE,CAAA,sBAGF,kBAhFiB,CAAA,0CAoFjB,gBACE,CAAA,iCAGF,oCACE,CAAA,uBAGF,WACE,CAAA,oBAGF,2BACE,CAAA,sCAGF,UACE,CAAA,eACA,CAAA,kDAGF,UACE,CAAA,UACA,CAAA,yBAGF,iBACE,CAAA,oBAGF,iBACE,CAAA,gFAGF,yCACE,CAAA,UACA,CAAA,kCAIF,UACE,CAAA,gCAEF,wBACE,CAAA,yBC3cF,cACE,gBACE,CAAA,kBACA,CAAA,iBACA,CAAA,oBAEF,YACE,CAAA,iBACA,CAAA,WdkFY,CAAA,0Gc/Ed,gBAGE,CAAA,CAAA,yBAIJ,cACE,gBACE,CAAA,gBACA,CAAA,iBACA,CAAA,gCAEF,YACE,CAAA,YACA,CAAA,iBACA,CAAA,UACA,CAAA,4CAEF,aACE,CAAA,WAEF,YACE,CAAA,oBAEF,YACE,CAAA,eAGF,cACE,CAAA,UACA,CAAA,gBAEF,SACE,CAAA,iBACA,CAAA,UACA,CAAA,0BACA,CAAA,0BAEF,iBACE,CAAA,SACA,CAAA,8CAEF,YACE,CAAA,YACA,CAAA,cACA,CAAA,WdiCY,CAAA,0Dc9Bd,aACE,CAAA,YAGF,UACE,CAAA,gBACA,CAAA,aACA,CAAA,CAAA,yBAIJ,qBACE,eACE,CAAA,WACA,CAAA,iBACA,CAAA,gBACA,CAAA,uBAEF,iBACE,CAAA,KACA,CAAA,SACA,CAAA,WACA,CAAA,UACA,CAAA,iBACA,CAAA,wBACA,CAAA,kBACA,CAAA,wBAEF,gBACE,CAAA,4BACA,CAAA,gBACA,CAAA,gBACA,CAAA,kCAEF,YACE,CAAA,YAGF,UACE,CAAA,eACA,CAAA,oBACA,CAAA,CAAA,0BCpGJ,iBACE,YACE,CAAA,CAAA,iBAIJ,iBACE,CAAA,qBAGF,UACE,CAAA,KCoCF,cACI,CAAA,aCjDJ,gBACI,CAAA,eAGJ,oBACI,CAAA,oBAGJ,iBACI,CAAA,UACA,CAAA,SACA,CAAA,WACA,CAAA,cACA,CAAA,gBACA,CAAA,aACA,CAAA,gCACA,CAAA,wBACA,CAAA,UACA,CAAA,YACA,CAAA,oDAGA,UAEI,CAAA,oBACA,CAAA,cACA,CAAA,UACA,CAAA,0BAKR,SACI,CAAA,cACA,CAAA,wBACA,CAAA,QACA,CAAA,uBACA,CAAA,kBAGJ,KACI,CAAA,OACA,CAAA,UACA,CAAA,qBAGJ,QACI,CAAA,OACA,CAAA,UACA,CAAA,sBAGJ,KACI,CAAA,OACA,CAAA,UACA,CAAA,yBAGJ,QACI,CAAA,OACA,CAAA,UACA,CAAA,gBAGJ,QACI,CAAA,SACA,CAAA,iBAGJ,QACI,CAAA,UACA,CAAA,oBAGJ,UACI,CAAA,WACA,CAAA,mBAGJ,WACI,CAAA,SACA,CAAA,iBAGJ,cACI,CAAA,cACA,CAAA,mBAIA,0BACI,CAAA,6BACA,CAAA,qBACA,CAAA,wBAGJ,iBACI,CAAA,eACA,CAAA,cACA,CAAA,2BACA,CAAA,WACA,CAAA,kCACA,CAAA,qCACA,CAAA,6BAEA,CAAA,+BACA,CAAA,2BACA,CAAA,UAIA,CAAA,aACA,CAAA,UACA,CAAA,SACA,CAAA,4BAGA,eACI,CAAA,8BAGJ,6BACI,CAAA,gCACA,CAAA,wBACA,CAAA,SACA,CAAA,cACA,CAAA,oGAGZ,oBACI,CAAA,eAIJ,81LACI,CAAA,YAGJ,wDACI,CAAA,aAGJ,wDACI,CAAA,eAGJ,wDACI,CAAA,eAGJ,wDACI,CAAA,qFAGJ,WAEI,CAAA,gBACA,CAAA,iBACA,CAAA,6FAGJ,SAEI,CAAA,gBACA,CAAA,iBACA,CAAA,OAGJ,qBACI,CAAA,eAGJ,qBACI,CAAA,aAGJ,qBACI,CAAA,YAGJ,qBACI,CAAA,eAGJ,qBACI,CAAA,aAGJ,iBACI,CAAA,MACA,CAAA,QACA,CAAA,UACA,CAAA,wBACA,CAAA,UACA,CAAA,WAGJ,oBACI,CAAA,oBAGA,oBACI,CAAA,6BACA,CAAA,oCAGA,oBACI,CAAA,oBAGR,SACI,CAAA,6BACA,CAAA,oCAGA,oBACI,CAAA,kCAGZ,4BACI,wBACI,CAAA,UACA,CAAA,qCAGJ,YACI,CAAA,UACA,CAAA,CAAA,wDAIR,4BACI,wBACI,CAAA,UACA,CAAA,qCAGJ,YACI,CAAA,UACA,CAAA,CAAA,wDAIR,4BACI,2BACI,CAAA,UACA,CAAA,CAAA,yBAIR,0BACI,CAAA,6BACA,CAAA,qBACA,CAAA,+BACA,CAAA,iBACA,CAAA,gCAGA,eACI,CAAA,2BACA,CAAA,+BACA,CAAA,2BACA,CAAA,aACA,CAAA,SACA,CAAA,sCAGA,gCACI,CAAA,mCACA,CAAA,2BACA,CAAA,cACA,CAAA,oCAGR,8BACI,CAAA,cACA,CAAA,eACA,CAAA,aACA,CAAA,0CAGA,wBACI,CAAA,UACA,CAAA,YAGZ,iBACI,CAAA,UACA,CAAA,UACA,CAAA,aACA,CAAA;;;EClSJ,CCGA,WACE,yBAAA,CACA,2CAAA,CACA,4SAAA,CAMA,kBAAA,CACA,iBAAA,CCVF,IACE,oBAAA,CACA,4CAAA,CACA,iBAAA,CACA,mBAAA,CACA,kCAAA,CACA,iCAAA,CCLF,OACE,wBAAA,CACA,iBAAA,CACA,mBAAA,CAEF,OAAA,aAAA,CACA,OAAA,aAAA,CACA,OAAA,aAAA,CACA,OAAA,aAAA,CCVA,OACE,oBAAA,CACA,iBAAA,CCDF,OACE,cAAA,CACA,0BCMoB,CDLpB,oBAAA,CACA,UAAA,iBAAA,CAEF,OACE,iBAAA,CACA,oBAAA,CACA,oBCDoB,CDEpB,iBAAA,CACA,iBAAA,CACA,aACE,oBAAA,CEbJ,WACE,wBAAA,CACA,uBAAA,CACA,kBAAA,CAGF,cAAA,UAAA,CACA,eAAA,WAAA,CAGE,iBAAA,iBAAA,CACA,kBAAA,gBAAA,CAIF,YAAA,WAAA,CACA,WAAA,UAAA,CAGE,cAAA,iBAAA,CACA,eAAA,gBAAA,CCpBF,SACE,4CAAA,CACQ,oCAAA,CAGV,UACE,8CAAA,CACQ,sCAAA,CAGV,2BACE,GACE,8BAAA,CACQ,sBAAA,CAEV,KACE,gCAAA,CACQ,wBAAA,CAAA,CAIZ,mBACE,GACE,8BAAA,CACQ,sBAAA,CAEV,KACE,gCAAA,CACQ,wBAAA,CAAA,CC5BZ,cCWE,qEAAA,CACA,+BAAA,CACI,2BAAA,CACI,uBAAA,CDbV,eCUE,qEAAA,CACA,gCAAA,CACI,4BAAA,CACI,wBAAA,CDZV,eCSE,qEAAA,CACA,gCAAA,CACI,4BAAA,CACI,wBAAA,CDVV,oBCcE,+EAAA,CACA,8BAAA,CACI,0BAAA,CACI,sBAAA,CDhBV,kBCaE,+EAAA,CACA,8BAAA,CACI,0BAAA,CACI,sBAAA,CDXV,gHAKE,WAAA,CEfF,UACE,iBAAA,CACA,oBAAA,CACA,SAAA,CACA,UAAA,CACA,eAAA,CACA,qBAAA,CAEF,0BACE,iBAAA,CACA,MAAA,CACA,UAAA,CACA,iBAAA,CAEF,aAAA,mBAAA,CACA,aAAA,aAAA,CACA,YAAA,ULTsB,CMPtB,iBAAA,WNwUe,CMvUf,iBAAA,WN2de,CM1df,kBAAA,WN0jBgB,CMzjBhB,sBAAA,WNsOoB,CMrOpB,iBAAA,WNuWe,CMtWf,gBAAA,WNknBc,CMjnBd,kBAAA,WNsnBgB,CMrnBhB,gBAAA,WNytBc,CMxtBd,gBAAA,WNmRc,CMlRd,oBAAA,WNupBkB,CMtpBlB,cAAA,WNqpBY,CMppBZ,mBAAA,WNspBiB,CMrpBjB,iBAAA,WNyIe,CMxIf,oDAEkC,WNqqBnB,CMpqBf,uBAAA,WN8iBqB,CM7iBrB,wBAAA,WN4iBsB,CM3iBtB,qBAAA,WN4fmB,CM3fnB,kBAAA,WNikBgB,CMhkBhB,+BACgC,WNgKnB,CM/Jb,mBAAA,WN+qBiB,CM9qBjB,gBAAA,WNwVc,CMvVd,kBAAA,WNuPgB,CMtPhB,mBAAA,WNgJiB,CM/IjB,gBAAA,WNmhBc,CMlhBd,oBAAA,WNgMkB,CM/LlB,+BAAA,WNY6B,CMX7B,6BAAA,WNc2B,CMb3B,iBAAA,WNqWe,CMpWf,yBAAA,WNweuB,CMvevB,0CACmC,WNsgBnB,CMrgBhB,mBAAA,WNggBiB,CM/fjB,oBAAA,WNwYkB,CMvYlB,gBAAA,WN2Yc,CM1Yd,gBAAA,WN4Pc,CM3Pd,sBAAA,WNoUoB,CMnUpB,sBAAA,WNitBoB,CMhtBpB,uBAAA,WN+sBqB,CM9sBrB,qBAAA,WNgtBmB,CM/sBnB,kBAAA,WNyegB,CMxehB,mBAAA,WNwBiB,CMvBjB,eAAA,WNymBa,CMxmBb,gBAAA,WNymBc,CMxmBd,gBAAA,WNyDc,CMxDd,oBAAA,WNyDkB,CMxDlB,iBAAA,WN+de,CM9df,kBAAA,WN2EgB,CM1EhB,gBAAA,WN0Pc,CMzPd,gBAAA,WNiDc,CMhDd,kBAAA,WN0VgB,CMzVhB,uBAAA,WNwmBqB,CMvmBrB,sBAAA,WNwmBoB,CMvmBpB,sBAAA,WNpCoB,CMqCpB,wBAAA,WNvCsB,CMwCtB,uBAAA,WNrCqB,CMsCrB,yBAAA,WNxCuB,CMyCvB,gBAAA,WN+Wc,CM9Wd,qCACoC,WN2anB,CM1ajB,kBAAA,WNsUgB,CMrUhB,wBAAA,WNkrBsB,CMjrBtB,uDAEsC,WN0bnB,CMzbnB,kBAAA,WNkbgB,CMjbhB,sBAAA,WNwXoB,CMvXpB,kBAAA,WNtDgB,CMuDhB,gBAAA,WNmnBc,CMlnBd,2CAC4C,WN+anB,CM9azB,0BAAA,WN8fwB,CM7fxB,0BAAA,WN+EwB,CM9ExB,kBAAA,WNzBgB,CM0BhB,yBAAA,WNmjBuB,CMljBvB,yBAAA,WNqLuB,CMpLvB,oBAAA,WNlBkB,CMmBlB,gBAAA,WNsbc,CMrbd,iBAAA,WNgae,CM/Zf,gBAAA,WNmjBc,CMljBd,mBAAA,WN+NiB,CM9NjB,wBAAA,WNgLsB,CM/KtB,wBAAA,WN4iBsB,CM3iBtB,iBAAA,WN+Ie,CM9If,wBAAA,WNyEsB,CMxEtB,yBAAA,WNyEuB,CMxEvB,uBAAA,WNkbqB,CMjbrB,wBAAA,WNuXsB,CMtXtB,wBAAA,WN2lBsB,CM1lBtB,wBAAA,WN2DsB,CM1DtB,2BAAA,WNybyB,CMxbzB,uBAAA,WN0SqB,CMzSrB,sBAAA,WN0GoB,CMzGpB,0BAAA,WNulBwB,CMtlBxB,0BAAA,WNuDwB,CMtDxB,eAAA,WNnCa,CMoCb,sBAAA,WNnDoB,CMoDpB,uBAAA,WNnDqB,CMoDrB,oBAAA,WNnDkB,CMoDlB,sBAAA,WNvDoB,CMwDpB,yCACkC,WN4dnB,CM3df,kBAAA,WN8IgB,CM7IhB,oBAAA,WNsFkB,CMrFlB,gBAAA,WN+Zc,CM9Zd,iBAAA,WNoWe,CMnWf,oBAAA,WNpDkB,CMqDlB,8BAAA,WNuI4B,CMtI5B,gBAAA,WNkNc,CMjNd,gBAAA,WN0Sc,CMzSd,gBAAA,WN6Kc,CM5Kd,eAAA,WNyIa,CMxIb,qBAAA,WNyImB,CMxInB,mDACiD,WNiInB,CMhI9B,iBAAA,WN+Ye,CM9Yf,oBAAA,WAAA,CACA,kBAAA,WNoagB,CMnahB,mBAAA,WNgEiB,CM/DjB,kBAAA,WN6TgB,CM5ThB,sBAAA,WNuCoB,CMtCpB,wBAAA,WNmCsB,CMlCtB,mBAAA,WN+aiB,CM9ajB,yBAAA,WNkduB,CMjdvB,kBAAA,WN0KgB,CMzKhB,uBAAA,WN2KqB,CM1KrB,oBAAA,WN3EkB,CM4ElB,oBAAA,WN7EkB,CM8ElB,4CACsC,WNlEnB,CMmEnB,0BAAA,WN+kBwB,CM9kBxB,2BAAA,WN4HyB,CM3HzB,wBAAA,WNTsB,CMUtB,eAAA,WN2Qa,CM1Qb,iCACiC,WN6CnB,CM5Cd,oBAAA,WNkDkB,CMjDlB,uBAAA,WNsiBqB,CMriBrB,yBAAA,WNoiBuB,CMniBvB,qBAAA,WN2emB,CM1enB,mBAAA,WN8NiB,CM7NjB,oBAAA,WNockB,CMnclB,2BAAA,WNuRyB,CMtRzB,sBAAA,WN6hBoB,CM5hBpB,yBAAA,WNsGuB,CMrGvB,mBAAA,WN8biB,CM7bjB,kBAAA,WNqjBgB,CMpjBhB,yBAAA,WNgLuB,CM/KvB,kBAAA,WNukBgB,CMtkBhB,mBAAA,WNqQiB,CMpQjB,iBAAA,WNiWe,CMhWf,oBAAA,WN2dkB,CM1dlB,sBAAA,WNjDoB,CMkDpB,wBAAA,WN+VsB,CM9VtB,mBAAA,WNsjBiB,CMrjBjB,0CACqC,WNgGnB,CM/FlB,kBAAA,WNoKgB,CMnKhB,kBAAA,WN0jBgB,CMzjBhB,uBAAA,WNoCqB,CMnCrB,+BACgC,WN+YnB,CM9Yb,iBAAA,WNoMe,CMnMf,oBAAA,WNrDkB,CMsDlB,gBAAA,WNhFc,CMiFd,uBAAA,WNrBqB,CMsBrB,wBAAA,WNoLsB,CMnLtB,uBAAA,WNkLqB,CMjLrB,qBAAA,WNmLmB,CMlLnB,uBAAA,WN+KqB,CM9KrB,6BAAA,WNrI2B,CMsI3B,8BAAA,WNjI4B,CMkI5B,2BAAA,WNjIyB,CMkIzB,6BAAA,WNzI2B,CM0I3B,iBAAA,WN2Je,CM1Jf,kBAAA,WN6lBgB,CM5lBhB,iBAAA,WNqee,CMpef,kBAAA,WNyGgB,CMxGhB,qBAAA,WNzEmB,CM0EnB,sBAAA,WNlIoB,CMmIpB,kCACkC,WNijBnB,CMhjBf,iCACiC,WN4OnB,CM3Od,iBAAA,WNde,CMef,iBAAA,WN0Ge,CMzGf,mCACqC,WN6XnB,CM5XlB,mCACoC,WN2FnB,CM1FjB,qBAAA,WN6SmB,CM5SnB,oCACqC,WNqGnB,CMpGlB,kBAAA,WNgbgB,CM/ahB,sDAEiC,WNlInB,CMmId,mBAAA,WNsOiB,CMrOjB,mBAAA,WNoOiB,CMnOjB,yBAAA,WN+buB,CM9bvB,qBAAA,WN2gBmB,CM1gBnB,iBAAA,WNuce,CMtcf,iBAAA,WNyOe,CMxOf,iBAAA,WN6fe,CM5ff,qBAAA,WNmTmB,CMlTnB,4BAAA,WNoT0B,CMnT1B,8BAAA,WNgI4B,CM/H5B,uBAAA,WN4HqB,CM3HrB,iBAAA,WNqQe,CMpQf,sBAAA,WNpFoB,CMqFpB,oBAAA,WN9EkB,CM+ElB,sBAAA,WNrFoB,CMsFpB,uBAAA,WNrFqB,CMsFrB,mBAAA,WNhCiB,CMiCjB,oCACiC,WN0YnB,CMzYd,0CACsC,WN8YnB,CM7YnB,uCACqC,WN2YnB,CM1YlB,oBAAA,WNUkB,CMTlB,oBAAA,WNuMkB,CMtMlB,uCACiC,WNqfnB,CMpfd,kCACkC,WNoFnB,CMnFf,2CACuC,WN+anB,CM9apB,qBAAA,WN7CmB,CM8CnB,sBAAA,WN1CoB,CM2CpB,iCACiC,WNpInB,CMqId,mBAAA,WN6WiB,CM5WjB,oBAAA,WNyekB,CMxelB,sCACsC,WNrEnB,CMsEnB,uBAAA,WNqLqB,CMpLrB,oBAAA,WNGkB,CMFlB,0BAAA,WNnEwB,CMoExB,wBAAA,WNnEsB,CMoEtB,mBAAA,WNifiB,CMhfjB,uBAAA,WN8YqB,CM7YrB,oBAAA,WNyZkB,CMxZlB,kBAAA,WN9JgB,CM+JhB,kBAAA,WNlEgB,CMmEhB,mBAAA,WN1CiB,CM2CjB,uBAAA,WN8BqB,CM7BrB,sBAAA,WN1IoB,CM2IpB,sBAAA,WNsHoB,CMrHpB,qBAAA,WNrOmB,CMsOnB,kBAAA,WN4MgB,CM3MhB,uBAAA,WNUqB,CMTrB,gBAAA,WN3Kc,CM4Kd,oBAAA,WNuFkB,CMtFlB,uBAAA,WN2QqB,CM1QrB,6BAAA,WNrO2B,CMsO3B,8BAAA,WNrO4B,CMsO5B,2BAAA,WNrOyB,CMsOzB,6BAAA,WNzO2B,CM0O3B,sBAAA,WNrOoB,CMsOpB,uBAAA,WNrOqB,CMsOrB,oBAAA,WNrOkB,CMsOlB,sBAAA,WNzOoB,CM0OpB,mBAAA,WNpDiB,CMqDjB,kBAAA,WN4IgB,CM3IhB,kBAAA,WNwYgB,CMvYhB,0CACmC,WNuMnB,CMtMhB,oBAAA,WNzGkB,CM0GlB,sBAAA,WNyQoB,CMxQpB,uBAAA,WNyQqB,CMxQrB,mBAAA,WN+ViB,CM9VjB,kBAAA,WN9GgB,CM+GhB,uCACkC,WNoRnB,CMnRf,sBAAA,WN+CoB,CM9CpB,oBAAA,WNmBkB,CMlBlB,yBAAA,WNoBuB,CMnBvB,mBAAA,WNqUiB,CMpUjB,mBAAA,WN2BiB,CM1BjB,iBAAA,WNgLe,CM/Kf,mBAAA,WN2BiB,CM1BjB,sBAAA,WNuHoB,CMtHpB,kBAAA,WNMgB,CMLhB,0BAAA,WNIwB,CMHxB,oBAAA,WN6XkB,CM5XlB,gBAAA,WNhHc,CMiHd,+CACsC,WNuQnB,CMtQnB,4EAEwC,WNsVnB,CMrVrB,0BAAA,WNwIwB,CMvIxB,gBAAA,WNhGc,CMiGd,qBAAA,WNvHmB,CMwHnB,0CACyC,WNtJnB,CMuJtB,oBAAA,WNyOkB,CMxOlB,gBAAA,WN0Fc,CMzFd,uBAAA,WN1DqB,CM2DrB,uBAAA,WNkWqB,CMjWrB,qBAAA,WN4VmB,CM3VnB,kBAAA,WNlEgB,CMmEhB,wBAAA,WNgOsB,CM/NtB,sBAAA,WN2JoB,CM1JpB,4BAAA,WN2J0B,CM1J1B,kBAAA,WNsRgB,CMrRhB,sBAAA,WN5LoB,CM6LpB,6BAAA,WNxB2B,CMyB3B,kBAAA,WNuPgB,CMtPhB,kBAAA,WN6IgB,CM5IhB,+BAAA,WN9J6B,CM+J7B,gCAAA,WN9J8B,CM+J9B,6BAAA,WN9J2B,CM+J3B,+BAAA,WNlK6B,CMmK7B,iBAAA,WN8De,CM7Df,gBAAA,WNrHc,CMsHd,kBAAA,WNvSgB,CMwShB,sBAAA,WN2ZoB,CM1ZpB,oBAAA,WNhNkB,CMiNlB,sBAAA,WN7FoB,CM8FpB,sBAAA,WN7FoB,CM8FpB,sBAAA,WN+OoB,CM9OpB,uBAAA,WNiMqB,CMhMrB,kBAAA,WN6WgB,CM5WhB,wBAAA,WN0IsB,CMzItB,0BAAA,WN0IwB,CMzIxB,oBAAA,WNqFkB,CMpFlB,sBAAA,WNmFoB,CMlFpB,wBAAA,WNnLsB,CMoLtB,yBAAA,WN0KuB,CMzKvB,gCAAA,WNpF8B,CMqF9B,wBAAA,WNwPsB,CMvPtB,mBAAA,WNjJiB,CMkJjB,sDACgD,WN/MnB,CMgN7B,kDAC8C,WN9MnB,CM+M3B,wDACiD,WNjNnB,CMkN9B,+BACgC,WNvGnB,CMwGb,eAAA,WNhCa,CMiCb,iCACgC,WNqYnB,CMpYb,gCACgC,WN4CnB,CM3Cb,4DAGgC,WNgDnB,CM/Cb,kDAEgC,WNiNnB,CMhNb,8BACgC,WN+CnB,CM9Cb,kCACgC,WN3PnB,CM4Pb,gBAAA,WNhGc,CMiGd,qBAAA,WNpFmB,CMqFnB,0BAAA,WN0PwB,CMzPxB,2BAAA,WN0PyB,CMzPzB,2BAAA,WN0PyB,CMzPzB,4BAAA,WN0P0B,CMzP1B,4BAAA,WN6P0B,CM5P1B,6BAAA,WN6P2B,CM5P3B,qBAAA,WNkUmB,CMjUnB,uBAAA,WN8TqB,CM7TrB,0BAAA,WNyawB,CMxaxB,mBAAA,WNsaiB,CMrajB,gBAAA,WN2Zc,CM1Zd,uBAAA,WN2ZqB,CM1ZrB,wBAAA,WNoasB,CMnatB,mBAAA,WNxJiB,CMyJjB,0BAAA,WN8PwB,CM7PxB,qBAAA,WNgBmB,CMfnB,kBAAA,WNpFgB,CMqFhB,eAAA,WN3Wa,CM4Wb,qBAAA,WN/RmB,CMgSnB,4BAAA,WN/R0B,CMgS1B,kBAAA,WN+UgB,CM9UhB,yBAAA,WN+UuB,CM9UvB,2BAAA,WNgDyB,CM/CzB,yBAAA,WNkDuB,CMjDvB,2BAAA,WN+CyB,CM9CzB,4BAAA,WN+C0B,CM9C1B,iBAAA,WNjWe,CMkWf,mBAAA,WNmYiB,CMlYjB,mBAAA,WN7WiB,CM8WjB,iBAAA,WNkCe,CMjCf,oBAAA,WN5KkB,CM6KlB,iBAAA,WNgNe,CM/Mf,sBAAA,WNxFoB,CMyFpB,kBAAA,WN4TgB,CM3ThB,kBAAA,WNtIgB,CMuIhB,gBAAA,WN6Cc,CM5Cd,sCACqC,WN5DnB,CM6DlB,iBAAA,WN8Pe,CM7Pf,kBAAA,WNuEgB,CMtEhB,mBAAA,WN9WiB,CM+WjB,eAAA,WNtSa,CMuSb,cAAA,WNiWY,CMhWZ,iBAAA,WNuWe,CMtWf,kBAAA,WN+IgB,CM9IhB,qBAAA,WNkFmB,CMjFnB,0BAAA,WN6NwB,CM5NxB,gCAAA,WN/W8B,CMgX9B,+BAAA,WNjX6B,CMkX7B,sDACgD,WNzRnB,CM0R7B,wBAAA,WNnMsB,CMoMtB,sBAAA,WNiWoB,CMhWpB,wBAAA,WNoVsB,CMnVtB,uCACgC,WN0SnB,CMzSb,yBAAA,WN0GuB,CMzGvB,yBAAA,WN4MuB,CM3MvB,iBAAA,WNsLe,CMrLf,2BAAA,WNzLyB,CM0LzB,qBAAA,WNoWmB,CMnWnB,kBAAA,WN8DgB,CM7DhB,6DAEuC,WN8SnB,CM7SpB,kDAC2C,WN1FnB,CM2FxB,iBAAA,WNsWe,CMrWf,kBAAA,WNlGgB,CMmGhB,kBAAA,WNgHgB,CM/GhB,yBAAA,WNiHuB,CMhHvB,8BAAA,WNyN4B,CMxN5B,uBAAA,WNuNqB,CMtNrB,qBAAA,WN/NmB,CMgOnB,gBAAA,WN5Nc,CM6Nd,yBAAA,WN2EuB,CM1EvB,0BAAA,WNyEwB,CMxExB,kBAAA,WNvNgB,CMwNhB,kBAAA,WNzCgB,CM0ChB,oBAAA,WNpCkB,CMqClB,eAAA,WNtLa,CMuLb,oBAAA,WN7UkB,CM8UlB,iBAAA,WN1Re,CM2Rf,eAAA,WNsDa,CMrDb,iBAAA,WNmLe,CMlLf,gBAAA,WNrPc,CMsPd,iBAAA,WNrPe,CMsPf,mBAAA,WN7WiB,CM8WjB,0BAAA,WN7WwB,CM8WxB,iBAAA,WN0Le,CMzLf,wBAAA,WN0LsB,CMzLtB,mBAAA,WNyFiB,CMxFjB,qCACgC,WNzUnB,CM0Ub,+BACiC,WN+MnB,CM9Md,gBAAA,WN4Pc,CM3Pd,mBAAA,WNuKiB,CMtKjB,sBAAA,WNtPoB,CMuPpB,sBAAA,WNiKoB,CMhKpB,oBAAA,WN9PkB,CM+PlB,sBAAA,WN/LoB,CMgMpB,uBAAA,WNxLqB,CMyLrB,wBAAA,WNrMsB,CMsMtB,6BAAA,WN/L2B,CMgM3B,0EAEyC,WNxMnB,CMyMtB,gDAC2C,WN9MnB,CM+MxB,gDACyC,WN/MnB,CMgNtB,gDACyC,WNpMnB,CMqMtB,uBAAA,WNjNqB,CMkNrB,gBAAA,WNuRc,CMtRd,mBAAA,WN5SiB,CM6SjB,oBAAA,WN9EkB,CM+ElB,wGAIsC,WNnEnB,CMoEnB,0BAAA,WN/TwB,CMgUxB,qDAEkC,WNqDnB,CMpDf,gCACmC,WNnQnB,CMoQhB,sBAAA,WNzKoB,CM0KpB,eAAA,WN3Ka,CM4Kb,2EAEwC,WNxJnB,CMyJrB,yBAAA,WN2KuB,CM1KvB,cAAA,WNiCY,CMhCZ,oCACmC,WN0QnB,CMzQhB,uCACwC,WNVnB,CMWrB,2CAC0C,WNXnB,CMYvB,mBAAA,WN1IiB,CM2IjB,uBAAA,WNlVqB,CMmVrB,kBAAA,WNjJgB,CMkJhB,qBAAA,WNbmB,CMcnB,mBAAA,WN+FiB,CM9FjB,qBAAA,WNuEmB,CMtEnB,4BAAA,WNuE0B,CMtE1B,gBAAA,WNzZc,CM0Zd,6CACqC,WN5MnB,CM6MlB,eAAA,WN0Ma,CMzMb,sBAAA,WNxaoB,CMyapB,gBAAA,WNIc,CMHd,sBAAA,WNuFoB,CMtFpB,kBAAA,WN2MgB,CM1MhB,gBAAA,WN+Qc,CM9Qd,uBAAA,WNzCqB,CM0CrB,gBAAA,WNwPc,CMvPd,sBAAA,WNrZoB,CMsZpB,kBAAA,WNvBgB,CMwBhB,yBAAA,WN3LuB,CM4LvB,mBAAA,WN5XiB,CM6XjB,yBAAA,WNhYuB,CMiYvB,uBAAA,WNnYqB,CMoYrB,mBAAA,WNtYiB,CMuYjB,qBAAA,WNlYmB,CMmYnB,qBAAA,WNlYmB,CMmYnB,sBAAA,WN3boB,CM4bpB,wBAAA,WN3bsB,CM4btB,iBAAA,WN+Ke,CM9Kf,qBAAA,WNnVmB,CMoVnB,cAAA,WN9dY,CM+dZ,sBAAA,WN5RoB,CM6RpB,uBAAA,WN/CqB,CMgDrB,yBAAA,WN9buB,CM+bvB,sBAAA,WNtfoB,CMufpB,qBAAA,WN/BmB,CMgCnB,sBAAA,WNzHoB,CM0HpB,kBAAA,WNvIgB,CMwIhB,yBAAA,WNvIuB,CMwIvB,sBAAA,WN4JoB,CM3JpB,qBAAA,WN4JmB,CM3JnB,mBAAA,WNxciB,CMycjB,eAAA,WNjba,CMkbb,mBAAA,WNvJiB,CMwJjB,qBAAA,WN3gBmB,CM4gBnB,cAAA,WN7ZY,CM8ZZ,mDAEgC,WNzKnB,CM0Kb,oBAAA,WNpGkB,CMqGlB,sBAAA,WNxboB,CMybpB,0BAAA,WN5WwB,CM6WxB,oBAAA,WN9VkB,CM+VlB,oBAAA,WN9PkB,CM+PlB,mBAAA,WNrJiB,CMsJjB,kBAAA,WNegB,CMdhB,wBAAA,WN2BsB,CM1BtB,uBAAA,WNoCqB,CMnCrB,oBAAA,WNqCkB,CMpClB,qBAAA,WN5amB,CM6anB,2BAAA,WN9ayB,CM+azB,mBAAA,WN/ViB,CMgWjB,gBAAA,WNoBc,CMnBd,uBAAA,WN8KqB,CM7KrB,sBAAA,WN/FoB,CMgGpB,uBAAA,WN6EqB,CM5ErB,qBAAA,WN9MmB,CM+MnB,iBAAA,WN+Ke,CM9Kf,gBAAA,WN7Hc,CM8Hd,mBAAA,WNnHiB,CMoHjB,2CACwC,WNkInB,CMjIrB,2BAAA,WNkIyB,CMjIzB,wBAAA,WN0KsB,CMzKtB,uBAAA,WNlIqB,CMmIrB,sBAAA,WNyKoB,CMxKpB,uBAAA,WNnIqB,CMoIrB,yBAAA,WNlIuB,CMmIvB,yBAAA,WNpIuB,CMqIvB,kBAAA,WN1GgB,CM2GhB,sBAAA,WN7QoB,CM8QpB,6BAAA,WN1U2B,CM2U3B,uBAAA,WNzEqB,CM0ErB,oBAAA,WNkLkB,CMjLlB,kBAAA,WNXgB,CMYhB,qBAAA,WNuJmB,CMtJnB,sBAAA,WNwJoB,CMvJpB,gCACgC,WN/fnB,CMggBb,mBAAA,WN4JiB,CM3JjB,iBAAA,WN8Ge,CM7Gf,kBAAA,WNwDgB,CMvDhB,kBAAA,WN9IgB,CM+IhB,sCACyC,WN0LnB,CMzLtB,yBAAA,WNjHuB,CMkHvB,oBAAA,WNrHkB,CMsHlB,wBAAA,WNnWsB,CMoWtB,gEAEyC,WN/gBnB,CMghBtB,uDACmD,WN9gBnB,CM+gBhC,6CACyC,WNlhBnB,CMmhBtB,gDAC4C,WNnhBnB,CMohBzB,8CAC0C,WNxhBnB,CMyhBvB,yBAAA,WN3IuB,CM4IvB,oBAAA,WN3OkB,CM4OlB,wBAAA,WNxIsB,CMyItB,0BAAA,WNxIwB,CMyIxB,uBAAA,WNwBqB,CMvBrB,yBAAA,WNwBuB,CMvBvB,kBAAA,WN/dgB,CMgehB,0BAAA,WNlewB,CMmexB,iBAAA,WNpce,CMqcf,yBAAA,WNljBuB,CMmjBvB,uBAAA,WNxPqB,CMyPrB,kDAC4C,WNzPnB,CM0PzB,iDAC2C,WN7PnB,CM8PxB,gDAC0C,WNhQnB,CMiQvB,qBAAA,WNrQmB,CMsQnB,8CACwC,WNxRnB,CMyRrB,+CACyC,WN7RnB,CM8RtB,2BAAA,WN1RyB,CM2RzB,yBAAA,WNpSuB,CMqSvB,wBAAA,WN3RsB,CM4RtB,0BAAA,WN/RwB,CMgSxB,wBAAA,WNjSsB,CMkStB,qBAAA,WN+DmB,CM9DnB,sBAAA,WN/FoB,CMgGpB,4BAAA,WN/b0B,CMgc1B,cAAA,WNtUY,CMuUZ,qBAAA,WNtUmB,CMuUnB,uBAAA,WNkEqB,CMjErB,yBAAA,WNrKuB,CMsKvB,gCAAA,WNrK8B,CMsK9B,sBAAA,WN5UoB,CM6UpB,uBAAA,WNwHqB,CMvHrB,kBAAA,WNnFgB,CMoFhB,kBAAA,WNzegB,CM0ehB,mBAAA,WN9WiB,CM+WjB,iBAAA,WNxKe,CMyKf,6BAAA,WNpQ2B,CMqQ3B,oCACuC,WNSnB,CMRpB,kBAAA,WNjdgB,CMkdhB,iBAAA,WNzoBe,CM0oBf,kBAAA,WN/nBgB,CMgoBhB,2BAAA,WN3hByB,CM4hBzB,4BAAA,WN9hB0B,CM+hB1B,4BAAA,WN5hB0B,CM6hB1B,4BAAA,WNjiB0B,CMkiB1B,oBAAA,WNpRkB,CMqRlB,mBAAA,WN5NiB,CM6NjB,qBAAA,WN5NmB,CM6NnB,iBAAA,WN/Ne,CMgOf,eAAA,WNlOa,CMmOb,sBAAA,WNpeoB,CMqepB,wBAAA,WNpesB,CMqetB,iBAAA,WNtSe,CMuSf,iBAAA,WNiFe,CMhFf,qBAAA,WNlkBmB,CMmkBnB,qBAAA,WNrXmB,CMsXnB,wBAAA,WNpIsB,CMqItB,gBAAA,WNpcc,CMqcd,2BAAA,WNheyB,CMiezB,oBAAA,WNpfkB,CMqflB,gBAAA,WNlNc,CMmNd,wBAAA,WN1XsB,CM2XtB,eAAA,WNoDa,CMnDb,wBAAA,WN3JsB,CM4JtB,oBAAA,WNzNkB,CM0NlB,kBAAA,WNlHgB,CMmHhB,wBAAA,WN7LsB,CM8LtB,0BAAA,WN7LwB,CM8LxB,uBAAA,WN3CqB,CM4CrB,yBAAA,WN3CuB,CM4CvB,wBAAA,WNrGsB,CMsGtB,2BAAA,WNrGyB,CMsGzB,mBAAA,WN7UiB,CM8UjB,qBAAA,WNnlBmB,CMolBnB,uBAAA,WNnlBqB,CMolBrB,mBAAA,WN/LiB,CMgMjB,kBAAA,WNlXgB,CMmXhB,sBAAA,WNkFoB,CMjFpB,mBAAA,WNmFiB,CMlFjB,kBAAA,WN9cgB,CM+chB,4BAAA,WN2B0B,CM1B1B,0BAAA,WNmEwB,CMlExB,6BAAA,WNxK2B,CMyK3B,iBAAA,WN9lBe,CM+lBf,6BAAA,WNtoB2B,CMuoB3B,gCAAA,WNqD8B,CMpD9B,mBAAA,WNxlBiB,CMylBjB,uCAAA,WN5oBqC,CM6oBrC,2EACgE,WN9qBnB,CM+qB7C,+DAEiC,WNvfnB,CMwfd,iBAAA,WNhYe,CMiYf,mBAAA,WNhYiB,CMiYjB,4CAC0C,WN1HnB,CM2HvB,sBAAA,WNzRoB,CM0RpB,kBAAA,WNiCgB,CMhChB,yBAAA,WNiCuB,CMhCvB,oBAAA,WNlHkB,CMmHlB,0BAAA,WNlHwB,CMmHxB,2BAAA,WNlHyB,CMmHzB,sBAAA,WNrNoB,CMsNpB,uBAAA,WNpbqB,CMqbrB,iBAAA,WNmEe,CMlEf,qBAAA,WNpDmB,CMqDnB,8DACiD,WNzYnB,CM0Y9B,sCACyC,WN7anB,CM8atB,uBAAA,WNtXqB,CMuXrB,yBAAA,WNlfuB,CMmfvB,2BAAA,WNlfyB,CMmfzB,kBAAA,WNtTgB,CMuThB,wBAAA,WNptBsB,CMqtBtB,0BAAA,WNptBwB,CMqtBxB,yCACyC,WNrtBnB,CMstBtB,6CAC2C,WNttBnB,CMutBxB,uBAAA,WNJqB,CMKrB,yBAAA,WNJuB,CMKvB,kBAAA,WNHgB,CMIhB,oBAAA,WN3WkB,CM4WlB,8CACoC,WN5WnB,CM6WjB,kDACsC,WN7WnB,CM8WnB,iBAAA,WNtNe,CMuNf,0BAAA,WN3bwB,CM4bxB,oBAAA,WNtFkB,CMuFlB,4EAE6C,WNxEnB,CMyE1B,+DACuD,WNvEnB,CMwEpC,qDAC6C,WN3EnB,CM4E1B,wDACgD,WN5EnB,CM6E7B,sDAC8C,WNjFnB,CMkF3B,kBAAA,WN3KgB,CM4KhB,kDAEiC,WNzrBnB,CM0rBd,mBAAA,WNlPiB,CMmPjB,2BAAA,WNKyB,CMJzB,2BAAA,WNKyB,CMJzB,0BAAA,WNKwB,CMJxB,mDACyC,WNDnB,CMEtB,uDAC2C,WNFnB,CMGxB,oBAAA,WNxsBkB,CMysBlB,gBAAA,WNpbc,CMqbd,gBAAA,WN1hBc,CM2hBd,gBAAA,WNxYc,CMyYd,mBAAA,WN/OiB,CMgPjB,mBAAA,WNziBiB,CM0iBjB,qBAAA,WNjUmB,CMkUnB,uBAAA,WN7KqB,CM8KrB,uBAAA,WNhIqB,CMiIrB,sBAAA,WNJoB,CMKpB,kBAAA,WNxUgB,COzchB,SH8BE,iBAAA,CACA,SAAA,CACA,UAAA,CACA,SAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,QAAA,CAUA,mDAEE,eAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,gBAAA,CACA,SAAA,CIxDA,qDACI,wBAAA,CACA,kBAAA,CACA,iBAAA,CACA,gBAAA,CACA,eAAA,CAGJ,gDACI,wBAAA,CACA,eAAA,CCVR,kEACI,WAAA,CCCI,mEACI,cAAA,CAKJ,kDACI,eAAA,CAIR,kCACI,WAAA,CAGJ,6CACI,iBAAA,CACA,6BAAA,CAGJ,mDACI,wBAAA,CAIR,qDACI,gBAAA,CC5BA,2BACI,aAAA,CACA,iBAAA,CACA,cAAA,CAEA,0CACI,cAAA,CCPX,gBACG,iBAAA,CCEA,iCACI,oBAAA,CACA,+BAAA,CACA,UAAA,CACA,wBAAA,CAGJ,uCACI,kBAAA,CAGJ,uCACI,wBAAA,CACA,kBAAA,CACA,wBAAA,CAGJ,4BACI,wBAAA,CACA,eAAA,CACA,iBAAA,CACA,yBAAA,CACA,cAAA,CAGJ,+BACI,wBAAA,CACA,eAAA,CACA,iBAAA,CACA,yBAAA,CACA,cAAA,CAGJ,oBACI,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CACA,kBAAA,CAGJ,4BACI,wBAAA,CAGJ,yBACI,QAAA,CAGJ,mBACI,QAAA,CAGJ,0BACI,wBAAA,CAGJ,6BACI,qBAAA,CAGJ,yBACI,eAAA,CAGJ,sBACI,cAAA,CAGJ,yBACI,eAAA,CACA,aAAA,CACA,gBAAA,CACA,gBAAA,CACA,cAAA,CACA,kBAAA,CACA,cAAA,CACA,oBAAA,CAGJ,+BACI,wBAAA,CACA,arCXK,CqCYL,eAAA,CAGJ,gCACI,wBAAA,CACA,arCjBK,CqCkBL,eAAA,CAGJ,sCACI,mCAAA,CAGJ,oCACI,YAAA,CAGJ,2BACI,YAAA,CACA,kBAAA,CAGJ,gBACI,QAAA,CAGJ,6BACI,gBAAA,CACA,eAAA,CAGJ,2CACI,6BACI,gBAAA,CACA,eAAA,CAAA,CAIR,2CACI,6BACI,gBAAA,CACA,eAAA,CAAA,CAIR,2CACI,6BACI,gBAAA,CACA,eAAA,CAAA,CAIR,uBACI,8BAAA,CAGJ,yBACI,wCAAA,CACA,6BAAA,CACA,UAAA,CACA,iBAAA,CAEA,4CACI,+DAAA,CACA,uEAAA,CAGJ,kCACI,aAAA,CAGJ,oCACI,aAAA,CAGJ,kCACI,aAAA,CAIR,4BACI,arC1JI,CqC6JR,wBACI,gBAAA,CAGJ,0BACI,iBAAA,CACA,eAAA,CAGJ,4BACI,eAAA,CACA,arCxKI,CqCyKJ,eAAA,CAEA,kCACI,YAAA,CAGJ,kCACI,YAAA,CAGJ,mCACI,YAAA,CAIR,4BACI,UAAA,CAGJ,4BACI,UAAA,CAGJ,4BACI,arCpIK,CqCqIL,eAAA,CACA,kBAAA,CACA,eAAA,CACA,qBAAA,CAGJ,+DACI,eAAA,CACA,oBrClIO,CqCmIP,arC9IK,CqC+IL,eAAA,CACA,kBAAA,CACA,eAAA,CACA,QAAA,CACA,cAAA,CAGJ,6FACI,0BAAA,CACA,6BAAA,CAGJ,2FACI,2BAAA,CACA,8BAAA,CAGJ,mPACI,wBAAA,CACA,arClKK,CqCmKL,oBrCnKK,CqCoKL,eAAA,CAGJ,8BACI,iBAAA,CACA,kBAAA,CACA,wBAAA,CACA,iBAAA,CAEA,6CACI,aAAA,CAGJ,2CACI,wBrCjPI,CsCVZ,uCACI,WAAA,CAIA,yCACI,UAAA,CAGJ,4CACI,cAAA,CACA,eAAA,CAIR,0BACI,WAAA,CAGJ,qCACI,iBAAA,CACA,6BAAA,CAGJ,2CACI,wBAAA,CAGJ,gCACI,wCAAA,CACA,6BAAA,CACA,UAAA,CACA,YAAA,CAEA,mCACI,gBAAA,CAIR,0BACI,UAAA,CAGJ,sKACI,wBAAA,CACA,oBAAA,CACA,wBAAA,CC9CJ,mCACI,WAAA,CAGJ,8CACI,iBAAA,CACA,6BAAA,CAGJ,oDACI,wBAAA,CAGJ,8BACI,oBAAA,CAGJ,oCACI,kBAAA,CACA,cAAA,CACA,eAAA,CACA,gBAAA,CAGJ,qCACI,kBAAA,CACA,aAAA,CACA,gBAAA,CAGJ,oCACI,aAAA,CC/BJ,4BACI,wBAAA,CACA,UAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,gBAAA,CACA,iBAAA,CACA,kBxCLI,CwCQR,kCACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAIJ,kCACI,wBAAA,CACA,oBAAA,CACA,axCfQ,CwCkBZ,2BACI,0BAAA,CACA,qCAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,gBAAA,CACA,kBAAA,CACA,eAAA,CACA,eAAA,CAGJ,iCACI,kCAAA,CACA,0BAAA,CAGJ,sCACI,iBAAA,CACA,QAAA,CACA,UAAA,CACA,UAAA,CACA,YAAA,CAGJ,qBACI,yBAAA,CAGJ,+BACI,UAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAGJ,+BACI,iBAAA,CACA,UAAA,CAEA,2CACI,6BAAA,CAGJ,8DACI,iBAAA,CAGJ,6CACI,6BAAA,CAGJ,iFACI,WAAA,CAGJ,+CACI,2BAAA,CACA,yBAAA,CAGJ,yCACI,eAAA,CACA,iBAAA,CCvFR,+BACI,kBAAA,CAGJ,mCACI,WAAA,CAGJ,8CACI,iBAAA,CACA,6BAAA,CAGJ,oDACI,wBAAA,CCdJ,gBACI,oBAAA,CACA,4BAAA,CAGJ,kCACI,UAAA,CACA,wBAAA,CAGJ,wCACI,eAAA,CAGJ,wCACI,wBAAA,CACA,kBAAA,CACA,qBAAA,CAGJ,qBACI,gBAAA,CAGJ,8BACI,gBAAA,CACA,eAAA,CAGJ,+BACI,gBAAA,CAGJ,yBACI,a1CoCF,C0CjCF,0BACI,aAAA,CACA,YAAA,CACA,iBAAA,CAGJ,oBACI,iBAAA,CAGJ,yBACI,eAAA,CAGJ,yCACI,eAAA,CAGJ,oBACI,kBAAA,CAGJ,gBACI,aAAA,CACA,cAAA,CACA,iBAAA,CAGJ,kCACI,wBAAA,CACA,aAAA,CACA,wBAAA,CAGJ,2BACI,cAAA,CACA,gBAAA,CAEA,iCACI,YAAA,CAGJ,iCACI,YAAA,CAGJ,kCACI,YAAA,CAIR,2BACI,cAAA,CACA,gBAAA,CAEA,iCACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAGJ,iCACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAGJ,kCACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAKJ,iDACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAIR,2BACI,iBAAA,CACA,WAAA,CACA,aAAA,CACA,qBAAA,CACA,oBAAA,CAEA,iCACI,kBAAA,CACA,aAAA,CACA,YAAA,CAGJ,kCAgBI,kBAAA,CACA,aAAA,CACA,oBAAA,CACA,YAAA,CAlBA,wCACI,aAAA,CACA,wBAAA,CACA,8BAAA,CACA,YAAA,CACA,gBAAA,CAGJ,wCACI,aAAA,CACA,wBAAA,CACA,oBAAA,CACA,YAAA,CASR,iCACI,kBAAA,CACA,aAAA,CACA,gBAAA,CACA,8BAAA,CACA,YAAA,CC/JR,kCACI,WAAA,CAGJ,6CACI,iBAAA,CACA,6BAAA,CAGJ,oCACI,8BAAA,CACA,cAAA,CAGJ,6BACI,oBAAA,CACA,cAAA,CAGJ,iCACI,kBAAA,CACA,cAAA,CACA,eAAA,CACA,gBAAA,CACA,UAAA,CAGJ,uCACI,kBAAA,CACA,cAAA,CACA,eAAA,CACA,gBAAA,CAGJ,kCACI,kBAAA,CACA,aAAA,CACA,gBAAA,CAGJ,kCACI,aAAA,CCzCJ,sCACI,WAAA,CAGJ,iDACI,iBAAA,CACA,6BAAA,CAGJ,uDACI,wBAAA,CAGJ,wCACI,cAAA,CACA,8BAAA,CAGJ,iCACI,oBAAA,CACA,cAAA,CAGJ,qCACI,kBAAA,CACA,cAAA,CACA,eAAA,CACA,gBAAA,CACA,UAAA,CAGJ,2CACI,kBAAA,CACA,cAAA,CACA,eAAA,CACA,gBAAA,CAGJ,sCACI,kBAAA,CACA,aAAA,CACA,gBAAA,CAGJ,sCACI,aAAA,CC7CJ,sCACI,WAAA,CAGJ,iDACI,iBAAA,CACA,6BAAA,CAGJ,uDACI,wBAAA,CAGJ,sCACI,QAAA,CCdJ,+BACI,WAAA,CAGJ,0CACI,iBAAA,CACA,6BAAA,CAGJ,gDACI,wBAAA,CCVJ,2CACI,WAAA,CAGJ,sDACI,iBAAA,CACA,6BAAA,CAGJ,4DACI,wBAAA,CCVJ,sCACI,WAAA,CAGJ,iDACI,iBAAA,CACA,6BAAA,CAGJ,uDACI,wBAAA,CCVJ,4DACI,WAAA,CAGJ,uEACI,iBAAA,CACA,6BAAA,CAGJ,6EACI,wBAAA,CCVJ,8BACI,WAAA,CAGJ,yCACI,iBAAA,CACA,6BAAA,CCNJ,4BACI,eAAA,CACA,UAAA,CAEA,kCACI,YAAA,CAIR,iCACI,kBAAA,CACA,eAAA,CACA,UAAA,CACA,gBAAA,CACA,cAAA,CACA,eAAA,CACA,iBAAA,CACA,UAAA,CAEA,uCACI,kBAAA,CAGJ,wCACI,kBAAA,CAGJ,uCACI,kBAAA,CACA,YAAA,CAIR,+BACI,kBAAA,CACA,eAAA,CACA,UAAA,CACA,gBAAA,CACA,cAAA,CACA,eAAA,CACA,iBAAA,CACA,UAAA,CAEA,qCACI,kBAAA,CAGJ,sCACI,kBAAA,CAGJ,qCACI,kBAAA,CACA,YAAA,CAIR,kCACI,kBAAA,CACA,eAAA,CACA,UAAA,CACA,gBAAA,CACA,cAAA,CACA,eAAA,CACA,iBAAA,CACA,UAAA,CAEA,wCACI,kBAAA,CAGJ,yCACI,kBAAA,CAGJ,wCACI,kBAAA,CACA,YAAA,CC7ER,4BACI,WAAA,CAGJ,uCACI,iBAAA,CACA,6BAAA,CAGJ,6CACI,wBAAA,CCVJ,8BACI,iBAAA,CCDJ,4BACI,WAAA,CAGJ,uCACI,iBAAA,CACA,6BAAA,CAGJ,6CACI,wBAAA,CCVJ,mCACI,WAAA,CAGJ,8CACI,iBAAA,CACA,6BAAA,CAGJ,oDACI,wBAAA,CCVJ,6CACI,WAAA,CAGJ,wDACI,iBAAA,CACA,6BAAA,CAGJ,8DACI,wBAAA,CCVJ,oCACI,WAAA,CAGJ,+CACI,iBAAA,CACA,6BAAA,CAGJ,qDACI,wBAAA,CAGJ,wCACI,qBAAA,CCdJ,kCACI,WAAA,CAGJ,6CACI,iBAAA,CACA,6BAAA,CAGJ,mDACI,wBAAA,CCVJ,6BACI,WAAA,CAGJ,wCACI,iBAAA,CACA,6BAAA,CAGJ,8CACI,wBAAA,CCVJ,8BACI,WAAA,CAGJ,yCACI,iBAAA,CACA,6BAAA,CAGJ,+CACI,wBAAA,CAKJ,mDACI,eAAA,CACA,aAAA,CCjBJ,+BACI,kBAAA,CAGJ,mCACI,WAAA,CAGJ,8CACI,iBAAA,CACA,6BAAA,CAGJ,oDACI,wBAAA,CCdJ,kCACI,WAAA,CAGJ,6CACI,iBAAA,CACA,6BAAA,CAGJ,mDACI,wBAAA,CCVJ,uCACI,WAAA,CAGJ,kDACI,iBAAA,CACA,6BAAA,CAGJ,wDACI,wBAAA,CCTJ,gCACI,WAAA,CAGJ,2CACI,iBAAA,CACA,6BAAA,CAGJ,iDACI,wBAAA,CCXJ,qCACI,WAAA,CAGJ,gDACI,iBAAA,CACA,6BAAA,CAGJ,sDACI,wBAAA,CCVJ,+BACI,WAAA,CAGJ,0CACI,iBAAA,CACA,6BAAA,CAGJ,gDACI,wBAAA,CCVJ,kBACI,WAAA,CAGJ,6BACI,iBAAA,CACA,6BAAA,CAGJ,wCACI,gBAAA,CAGJ,2CACI,wCACI,gBAAA,CAAA,CAIR,2CACI,wCACI,gBAAA,CAAA,CAIR,2CACI,wCACI,gBAAA,CAAA,CC3BR,kBACI,WAAA,CAGJ,6BACI,iBAAA,CACA,6BAAA,CCNJ,gCACI,WAAA,CAGJ,sDACI,gBAAA,CAGJ,2CACI,sDACI,gBAAA,CAAA,CAIR,2CACI,sDACI,gBAAA,CAAA,CAIR,2CACI,sDACI,gBAAA,CAAA,CCrBR,qDACI,gBAAA,CAEA,wDACI,cAAA,CACA,wBAAA,CACA,eAAA,CACA,cAAA,CAGJ,uDACI,cAAA,CAGJ,yEACI,atEsDN,CsErDM,eAAA,CAIR,gEACI,qBAAA,CAEA,mEACI,gBAAA,CACA,eAAA,CAIR,gEACI,YAAA,CACA,eAAA,CACA,4BAAA,CACA,+BAAA,CAGJ,uDACI,WAAA,CACA,WAAA,CAGJ,qDACI,WAAA,CAKA,2DACI,wBAAA,CACA,iBAAA,CACA,YAAA,CACA,qBAAA,CAIR,kDACI,YAAA,CAGJ,8CACI,iBAAA,CAGJ,6DACI,kBtErBY,CsEsBZ,atEpBc,CsEqBd,eAAA,CACA,iBAAA,CACA,wBAAA,CACA,gBAAA,CAEA,mEACI,kBtE3BU,CsE4BV,atE9BQ,CsE+BR,wBAAA,CAGJ,mEACI,kBtEjCU,CsEkCV,atEpCQ,CsEqCR,wBAAA,CAIR,8DACI,kBtErCW,CsEsCX,atEpCa,CsEqCb,eAAA,CACA,gBAAA,CACA,iBAAA,CACA,wBAAA,CAEA,oEACI,kBtE3CS,CsE4CT,atE9CO,CsE+CP,wBAAA,CAGJ,oEACI,kBtEjDS,CsEkDT,atEpDO,CsEqDP,wBAAA,CAIR,0DACI,kBtE9EU,CsE+EV,atE7EY,CsE8EZ,eAAA,CACA,gBAAA,CACA,iBAAA,CACA,wBAAA,CAEA,gEACI,kBtEpFQ,CsEqFR,atEvFM,CsEwFN,wBAAA,CAGJ,gEACI,kBtE1FQ,CsE2FR,atE7FM,CsE8FN,wBAAA,CAMA,uMACI,kBtEtFI,CsEwFJ,uOACI,atEvFE,CsE2FV,iMACI,kBtE7GE,CsE+GF,iOACI,atE9GA,CsEkHR,2MACI,kBtEjGG,CsEmGH,2OACI,atElGC,CsEwGjB,+DACI,wBAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,gBAAA,CACA,iBAAA,CAGJ,8CACI,oBAAA,CAGJ,mDACI,wBtElKS,CsEmKT,atEvKO,CsEwKP,wBAAA,CAGJ,sDACI,wBtE9Ia,CsE+Ib,UtE7Ie,CsE8If,wBAAA,CAGJ,qDACI,wBtEzJU,CsE0JV,atExJY,CsEyJZ,wBAAA,CAGJ,sDACI,wBtEhJY,CsEiJZ,atE/Ic,CsEgJd,wBAAA,CAGJ,qDACI,atEpJc,CsEuJlB,qDACI,atEjIC,CsEoIL,oDACI,atE3KY,CsE8KhB,mDACI,eAAA,CACA,atEtIK,CsEuIL,gBAAA,CACA,gBAAA,CACA,cAAA,CACA,iBAAA,CACA,cAAA,CACA,oBAAA,CAGJ,yDACI,wBAAA,CACA,atEjJK,CsEkJL,eAAA,CAGJ,0DACI,kBtEnNI,CsEoNJ,atE1NQ,CsE2NR,eAAA,CAIA,+EACI,gBAAA,CAKJ,6FACI,atEhOA,CsEiOA,oBAAA,CAIR,4DACI,QAAA,CACA,iBAAA,CAEA,+DACI,eAAA,CACA,atE9KC,CsEkLT,kEACI,atEhPI,CsEmPR,kEACI,atEpPI,CsEwPJ,oGACI,atEzPA,CsE6PR,0DACI,cAAA,CACA,cAAA,CACA,atEnMK,CuEzET,6BACG,eAAA,CACA,WAAA,CAEH,qBACI,iBAAA,CCLJ,4CACI,YAAA,CACA,aAAA,CCFJ,oCACI,WAAA,CAGJ,+CACI,iBAAA,CACA,6BAAA,CCLJ,mCACI,eAAA,CACA,gBAAA,CACA,kBAAA,CACA,UAAA,CACA,eAAA,CAEA,yCACI,kBAAA,CACA,UAAA,CACA,eAAA,CAGJ,0CACI,kBAAA,CACA,UAAA,CACA,eAAA,CAIR,0CACI,kBAAA,CACA,UAAA,CACA,eAAA,CAGJ,8BACI,cAAA,CAIA,2DACI,wBAAA,CACA,UAAA,CAKJ,oEACI,gBAAA,CCzCX,iCACG,gBAAA,CACA,iBAAA,CAGJ,eACI,+BAAA,C9EqDA,4BACI,gBAAA,C+E1DR,EACI,oBAAA,CACA,4BAAA,CAGJ,oBACI,WAAA,CACA,UAAA,CACA,qBAAA,CAGJ,0BACI,kBAAA,CAGJ,0BACI,qBAAA,CACA,kBAAA,CACA,wBAAA,CAGJ,wDACI,aAAA,CAGJ,0BACI,sBAAA,CAGJ,aACI,yDAAA,CAGJ,sBAEI,YAAA,CAGJ,iBACI,yDAAA,CACA,uBAAA,CACA,yBAAA,CACA,2CAAA,CAGJ,cACI,oBAAA,CAGJ,cACI,oBAAA,CAGJ,6MACI,oBAAA,CACA,qBAAA,CAGJ,gDACI,cAAA,CAGJ,2BACI,eAAA,CAGJ,6zBACI,oBAAA,CAGJ,wCACI,UAAA,CACA,oBAAA,CACA,wBAAA,CAGJ,UACI,UAAA,CACA,oBAAA,CACA,qBAAA,CAGJ,wJACI,oBAAA,CAGJ,iDACI,eAAA,CAGJ,2DACI,eAAA,CAGJ,+BACI,eAAA,CAGJ,+BACI,+BAAA,CAGJ,uCACI,WAAA,CAGJ,qDACI,WAAA,CACA,mBAAA,CAGJ,cACI,oBAAA,CACA,kBAAA,CAGJ,IACI,0BAAA,CACA,YAAA,CACA,WAAA,CAGJ,OACI,6BAAA,CACA,YAAA,CACA,WAAA,CAGJ,6BACI,wBAAA,CACA,iBAAA,CACA,mBAAA,CAGJ,+BACI,WAAA,CAGJ,sBACI,oBAAA,CAGJ,6BACI,SAAA,CACA,wB5E5Ia,C4E+IjB,uBACI,mBAAA,CAGJ,iDACI,aAAA,CAGJ,YACI,wB5ExJa,C4E4JjB,2BACI,WAAA,CAGJ,kBACI,iBAAA,CAGJ,aACI,UAAA,CACA,iBAAA,CACA,eAAA,CAGJ,mBACI,qBAAA,CAGJ,iBACI,eAAA,CACA,SAAA,CACA,mBAAA,CAGJ,eACI,eAAA,CACA,mBAAA,CACA,kBAAA,CAGJ,8BACI,eAAA,CAGJ,eACI,eAAA,CACA,mBAAA,CAGJ,oBACI,UAAA,CACA,UAAA,CACA,WAAA,CACA,cAAA,CAGJ,kBACI,UAAA,CACA,UAAA,CACA,eAAA,CAGJ,sCACI,oB5E1MQ,C4E6MZ,kBACI,oB5E9MQ,C4EiNZ,UACI,cAAA,CACA,iBAAA,CAGJ,qBACI,oB5EvNQ,C4EwNR,cAAA,CAGJ,YACI,kBAAA,CACA,iBAAA,CACA,mBAAA,CAKA,8BACI,wB5EpOI,C4EqOJ,oB5ErOI,C4EsOJ,UAAA,CAEA,gLACI,wB5EhPK,C4EuPjB,aACI,wB5E1PQ,C4E2PR,oB5E3PQ,C4E4PR,UAAA,CAGJ,2EACI,wB5E9Pa,C4EiQjB,eACI,aAAA,CACA,iBAAA,CACA,gBAAA,CAGJ,iCACI,wBAAA,CACA,iBAAA,CACA,kBAAA,CAGJ,sBACI,gBAAA,CACA,aAAA,CACA,iBAAA,CAGJ,qBACI,gBAAA,CACA,aAAA,CACA,iBAAA,CAGJ,0BACI,MAAA,CACA,UAAA,CAIJ,gBACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,yBAAA,CACA,2BAAA,CACA,qBAAA,CACA,iBAAA,CAGJ,mCACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,yBAAA,CACA,2BAAA,CACA,qBAAA,CAGJ,cACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,yBAAA,CACA,2BAAA,CACA,qBAAA,CACA,gBAAA,CACA,iBAAA,CAGJ,oBACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CACA,mBAAA,CAGJ,oBACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CAGJ,gBACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CACA,mBAAA,CAGJ,gBACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CACA,mBAAA,CAGJ,iBACI,WAAA,CACA,UAAA,CACA,uBAAA,CAGJ,6BACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CACA,mBAAA,CAGJ,cACI,yDAAA,CAGJ,mBACI,WAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CACA,mBAAA,CAGJ,sBACI,YAAA,CACA,WAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CAGJ,4BACI,yDAAA,CAGJ,0BACI,wBAAA,CAGJ,iBACI,iBAAA,CAGJ,eACI,kB5ErZa,C4EsZb,a5E1ZW,C4E2ZX,wBAAA,CAGJ,gBACI,kBAAA,CACA,aAAA,CAGJ,WACI,a5ElWE,C4EmWF,cAAA,CAGJ,mBACI,gBAAA,CACA,eAAA,CACA,iBAAA,CACA,SAAA,CACA,QAAA,CAGJ,8BACI,yDAAA,CAGJ,wBACI,yDAAA,CAGJ,uBACI,yDAAA,CAGJ,cACI,yDAAA,CAGJ,oBACI,yDAAA,CAGJ,gBACI,yDAAA,CAGJ,sBACI,yDAAA,CAGJ,eACI,yDAAA,CAGJ,qBACI,yDAAA,CAGJ,sBACI,yDAAA,CAGJ,4BACI,yDAAA,CAGJ,OACI,yDAAA,CAGJ,aACI,yDAAA,CAGJ,eACI,yDAAA,CAGJ,qBACI,yDAAA,CAGJ,qBACI,yDAAA,CAGJ,2BACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,wBACI,yDAAA,CAGJ,cACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,wBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,uBACI,yDAAA,CAGJ,uBACI,yDAAA,CAGJ,6BACI,yDAAA,CAGJ,aACI,yDAAA,CACA,WAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CACA,qBAAA,CACA,mBAAA,CACA,eAAA,CAGJ,YACI,yDAAA,CAGJ,eACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,cACI,yDAAA,CAGJ,aACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,8EACI,eAAA,CAGJ,gBACI,kBAAA,CACA,cAAA,CAGJ,uCACI,iBAAA,CAGJ,mmBACI,iBAAA,CAGJ,iBACI,UAAA,CAGJ,+BACI,oBAAA,CACA,wBAAA,CACA,aAAA,CAGJ,gCACI,WAAA,CACA,cAAA,CACA,a5E3mBQ,C4E8mBZ,sCACI,WAAA,CACA,cAAA,CACA,a5EhnBW,C4EmnBf,uBACI,aAAA,CAGJ,qBACI,6BAAA,CACA,UAAA,CACA,qBAAA,CACA,UAAA,CACA,aAAA,CAGJ,qBACI,iBAAA,CACA,UAAA,CACA,aAAA,CACA,eAAA,CACA,kBAAA,CACA,gBAAA,CACA,iBAAA,CACA,2BAAA,CACA,0BAAA,CACA,cAAA,CACA,WAAA,CAGJ,sDACI,wBAAA,CACA,aAAA,CAGJ,cACI,kBAAA,CAGJ,4BACI,eAAA,CAGJ,iBACI,kBAAA,CAGJ,WACI,UAAA,CAGJ,eACI,a5EnqBW,C4EoqBX,cAAA,CAGJ,oBACI,eAAA,CAGJ,qBACI,kBAAA,CAGJ,uBACI,wBAAA,CACA,aAAA,CAGJ,qCACI,eAAA,CAGJ,qBACI,iBAAA,CAGJ,qBACI,iBAAA,CAIJ,qBACI,gBAAA,CACA,mBAAA,CACA,kBAAA,CACA,iBAAA,CACA,eAAA,CACA,iBAAA,CAGJ,MACI,uCAAA,CAGJ,YACI,iBAAA,CAGJ,sBACI,wBAAA,CACA,oBAAA,CACA,wBAAA,CACA,UAAA,CAGJ,8JACI,wBAAA,CACA,oBAAA,CACA,wBAAA,CACA,UAAA,CAGJ,6CACI,UAAA,CACA,gBAAA,CAGJ,KACI,iBAAA,CAKJ,uBACI,WAAA,CAGJ,SACI,WAAA,CACA,iBAAA,CAGJ,2BACI,wBAAA,CACA,iBAAA,CAGJ,OACI,iBAAA,CACA,iBAAA,CACA,WAAA,CACA,eAAA,CAGJ,YACI,a5E5tBmB,C4E6tBnB,wB5E/tBiB,C4EguBjB,6BAAA,CAGJ,eACI,wB5EzuBiB,C4E0uBjB,U5ExuBmB,C4EyuBnB,6BAAA,CAGJ,cACI,wB5EpvBc,C4EqvBd,a5EnvBgB,C4EovBhB,6BAAA,CAGJ,eACI,wB5E3uBgB,C4E4uBhB,a5E1uBkB,C4E2uBlB,6BAAA,CAGJ,UACI,wBAAA,CACA,UAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,gBAAA,CACA,iBAAA,CACA,kB5EjyBQ,C4EoyBZ,gBACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAIJ,gBACI,wBAAA,CACA,oBAAA,CACA,a5E3yBY,C4E8yBhB,SACI,0BAAA,CACA,qCAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,gBAAA,CACA,kBAAA,CACA,eAAA,CACA,eAAA,CAGJ,eACI,kCAAA,CACA,0BAAA,CAGJ,WACI,4BAAA,CACA,uCAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,gBAAA,CACA,kBAAA,CACA,eAAA,CACA,eAAA,CAGJ,iBACI,oCAAA,CACA,4BAAA,CAGJ,YACI,4BAAA,CACA,uCAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,gBAAA,CACA,kBAAA,CACA,eAAA,CACA,eAAA,CAGJ,kBACI,mCAAA,CACA,4BAAA,CAGJ,WACI,aAAA,CACA,wBAAA,CACA,cAAA,CACA,eAAA,CACA,oBAAA,CACA,gBAAA,CACA,iBAAA,CACA,eAAA,CACA,eAAA,CAGJ,iBACI,kBAAA,CAGJ,gBACI,aAAA,CACA,WAAA,CACA,eAAA,CAGJ,sBACI,a5ExzBE,C4E2zBN,kBACI,wBAAA,CAGJ,oBACI,wBAAA,CAGJ,eACI,WAAA,CACA,+BAAA,CACA,qBAAA,CAGJ,8BACI,6BAAA,CACA,UAAA,CACA,qBAAA,CACA,UAAA,CACA,aAAA,CAGJ,sCACI,cAAA,CACA,wBAAA,CAGJ,8CACI,iBAAA,CAGJ,uBACI,wBAAA,CACA,gBAAA,CAGJ,4BACI,WAAA,CAGJ,gCACI,kBAAA,CACA,eAAA,CAGJ,kCACI,WAAA,CAGJ,4BACI,eAAA,CAGJ,gBACI,WAAA,CACA,wBAAA,CAGJ,sBACI,iBAAA,CACA,UAAA,CACA,WAAA,CAGJ,uBACI,iBAAA,CASJ,wCACI,kBAAA,CAGJ,gBACI,gBAAA,CAGJ,UACI,0BAAA,CAGJ,aACI,yBAAA,CAGJ,uBACI,aAAA,CAGJ,0BACI,aAAA,CAGJ,6BACI,aAAA,CAGJ,wBACI,aAAA,CAGJ,iBACI,aAAA,CAGJ,uBACI,aAAA,CAMJ,2BACI,eAAA,CACA,YAAA,CACA,UAAA,CACA,iBAAA,CACA,QAAA,CAGJ,yBACI,eAAA,CACA,cAAA,CAGJ,4BACI,iBAAA,CACA,gBAAA,CAGJ,cACI,gBAAA,CACA,iBAAA,CAGJ,eACI,mBAAA,CACA,cAAA,CAGJ,qBACI,mBAAA,CACA,cAAA,CACA,UAAA,CAGJ,qBACI,YAAA,CACA,gBAAA,CAKJ,sBACI,iBAAA,CAGJ,4PACI,UAAA,CACA,wBAAA,CACA,oBAAA,CAGJ,eACI,mBAAA,CACA,oBAAA,CACA,mBAAA,CACA,YAAA,CAGJ,mBACI,qBAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,oBACI,a5E9+BS,C4E++BT,gBAAA,CAGJ,uBACI,4BAAA,CACA,QAAA,CACA,SAAA,CAGJ,mBACI,wBAAA,CAGJ,oBACI,UAAA,CAGJ,cACI,2BAAA,CAGJ,YACI,iBAAA,CAGJ,kHACI,aAAA,CAGJ,oCACI,0CAAA,CAGJ,cACI,iBAAA,CACA,UAAA,CACA,oBAAA,CACA,gBAAA,CACA,0BAAA,CACA,yBAAA,CAGJ,aACI,aAAA,CACA,gBAAA,CAGJ,0BACI,4BAAA,CAGJ,qBACI,iBAAA,CACA,wBAAA,CACA,UAAA,CACA,UAAA,CACA,WAAA,CACA,gBAAA,CACA,eAAA,CACA,2BAAA,CACA,4BAAA,CACA,+BAAA,CACA,8BAAA,CACA,kBAAA,CACA,cAAA,CAGJ,2BACI,wBAAA,CAGJ,0BACI,mBAAA,CAGJ,wBACI,wBAAA,CAGJ,YACI,aAAA,CAGJ,aACI,wBAAA,CACA,iBAAA,CAGJ,mBACI,qBAAA,CACA,a5EtoCQ,C4EuoCR,cAAA,CACA,gBAAA,CAGJ,qBACI,eAAA,CACA,UAAA,CAGJ,oBACI,iBAAA,CAGJ,eACI,oB5E7kCW,C4EglCf,8BACI,a5E5lCS,C4E6lCT,qBAAA,CACA,oB5EnlCW,C4EslCf,kBACI,gBAAA,CAKJ,cACI,wBAAA,CACA,iBAAA,CACA,iBAAA,CAGJ,sBACI,mBAAA,CAGJ,iBACI,eAAA,CAGJ,oBACI,a5EtnCS,C4EunCT,eAAA,CACA,cAAA,CACA,cAAA,CAGJ,wBACI,UAAA,CACA,eAAA,CACA,a5E5rCQ,C4E6rCR,iBAAA,CAGJ,iDACI,WAAA,CACA,eAAA,CACA,iBAAA,CACA,a5EpsCQ,C4EusCZ,uFACI,WAAA,CACA,eAAA,CACA,iBAAA,CACA,gCAAA,CAGJ,mEACI,SAAA,CAGJ,gBACI,aAAA,CAGJ,mBACI,+BAAA,CACA,gBAAA,CAGJ,2BACI,gBAAA,CAGJ,oCACI,gCAAA,CACA,4CAAA,CAGJ,sBACI,qBAAA,CACA,yBAAA,CACA,a5E1qCS,C4E2qCT,eAAA,CAGJ,4BACI,wBAAA,CAGJ,sDACI,a5EnrCS,C4EorCT,cAAA,CAGJ,6CACI,a5ExrCS,C4E2rCb,0CACI,wBAAA,CAGJ,6BACI,wBAAA,CACA,eAAA,CACA,6BAAA,CAGJ,qBACI,gBAAA,CACA,gBAAA,CACA,eAAA,CACA,a5EzsCS,C4E4sCb,+BACI,wBAAA,CACA,eAAA,CACA,gBAAA,CACA,a5EhtCS,C4EmtCb,mCACI,qBAAA,CACA,YAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAOJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,2CACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,cACI,yDAAA,CAGJ,mCACI,YAAA,CACA,UAAA,CACA,oBAAA,CACA,uBAAA,CACA,2BAAA,CAGJ,wBACI,wBAAA,CAGJ,sBACI,wDAAA,CAGJ,2BACI,mBAAA,CACA,cAAA,CACA,UAAA,CAGJ,uBACI,uBAAA,CACA,aAAA,CACA,iBAAA,CAGJ,0BACI,oCACI,oBAAA,CACA,eAAA,CACA,eAAA,CAAA,CAIR,iBACI,eAAA,CAGJ,aACI,uBAAA,CACA,iCAAA,CACA,iBAAA,CAGJ,oBACI,uBAAA,CACA,aAAA,CAGJ,aACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAGJ,iHACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAGJ,uRACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAGJ,eACI,eAAA,CAGJ,aACI,aAAA,CACA,qBAAA,CAGJ,mBACI,aAAA,CACA,8BAAA,CAGJ,uRACI,aAAA,CACA,8BAAA,CAGJ,iHACI,aAAA,CACA,8BAAA,CAGJ,kBACI,wBAAA,CACA,kBAAA,CACA,UAAA,CAGJ,uBACI,uBAAA,CACA,kBAAA,CACA,UAAA,CAGJ,8BACI,qBAAA,CAGJ,qCACI,qBAAA,CAGJ,cACI,UAAA,CACA,aAAA,CAGJ,iBACI,gBAAA,CACA,YAAA,CAGJ,yBACI,gBAAA,CAGJ,6BACI,eAAA,CACA,8BAAA,CAGJ,8BACI,eAAA,CAGJ,0BACI,eAAA,CAGJ,eACI,kBAAA,CAKJ,iBACI,gBAAA,CAGJ,mBACI,gBAAA,CACA,mBAAA,CAGJ,gBACI,cAAA,CACA,iBAAA,CACA,wB5Ex/CQ,C4Ey/CR,iBAAA,CAGJ,gBACI,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,0GACI,wB5E39CgB,C4E49ChB,oB5E39CoB,C4E49CpB,wBAAA,CAGJ,cACI,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,kGACI,wB5Ev/Cc,C4Ew/Cd,oB5Ev/CkB,C4Ew/ClB,wBAAA,CAGJ,eACI,kBAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,sGACI,wB5EphDQ,C4EqhDR,oB5ErhDQ,C4EshDR,UAAA,CAGJ,sBACI,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,kIACI,wBAAA,CACA,oBAAA,CACA,qBAAA,CAGJ,oBACI,iBAAA,CACA,WAAA,CAGJ,qBACI,iBAAA,CAGJ,sBACI,WAAA,CACA,UAAA,CACA,gBAAA,CACA,iBAAA,CAGJ,yBACI,YAAA,CACA,iBAAA,CAGJ,cACI,aAAA,CAGJ,gBACI,aAAA,CAGJ,WACI,aAAA,CAIJ,YACI,UAAA,CAGJ,2PACI,WAAA,CAGJ,wBACI,mBAAA,CACA,UAAA,CAGJ,iBACI,mBAAA,CACA,UAAA,CAGJ,iBACI,WAAA,CAGJ,WACI,kBAAA,CAGJ,gCACI,kBAAA,CACA,UAAA,CAGJ,sCACI,6BAAA,CACA,UAAA,CAGJ,sCACI,6BAAA,CACA,UAAA,CAGJ,gBACI,kBAAA,CACA,iBAAA,CACA,UAAA,CACA,kBAAA,CACA,mCAAA,CAGJ,sBACI,UAAA,CACA,mCAAA,CAGJ,0BACI,kBAAA,CACA,iBAAA,CACA,UAAA,CACA,kBAAA,CACA,oCAAA,CAGJ,gCACI,UAAA,CACA,oCAAA,CAGJ,oBACI,gBAAA,CACA,iBAAA,CACA,kBAAA,CAGJ,yBACI,sBAAA,CACA,eAAA,CACA,kBAAA,CAGJ,YACI,2BAAA,CAGJ,oDACI,kBAAA,CAGJ,qBACI,aAAA,CAGJ,yBACI,aAAA,CAkBJ,sBACI,+BAAA,CAGJ,0BACI,aAAA,CAGJ,qCACI,aAAA,CAGJ,oBACI,aAAA,CAGJ,mDACI,wBAAA,CAGJ,kEACI,qBAAA,CACA,oDAAA,CAGJ,mBACI,gBAAA,CAGJ,iBACI,WAAA,CACA,iBAAA,CACA,SAAA,CACA,QAAA,CACA,QAAA,CACA,SAAA,CAGJ,wBACI,eAAA,CACA,YAAA,CACA,YAAA,CACA,kBAAA,CACA,8BAAA,CAGJ,cACI,wBAAA,CAGJ,cACI,wBAAA,CAGJ,gBACI,wBAAA,CAGJ,+BACI,gBAAA,CACA,aAAA,CACA,iBAAA,CACA,mBAAA,CAGJ,2BACI,gBAAA,CACA,aAAA,CACA,iBAAA,CACA,iBAAA,CACA,kBAAA,CAOJ,wBACI,UAAA,CACA,oBAAA,CACA,gBAAA,CACA,cAAA,CACA,eAAA,CACA,sBAAA,CACA,eAAA,CACA,kBAAA,CACA,iBAAA,CACA,kBAAA,CACA,UAAA,CACA,UAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,eAAA,CACA,YAAA,CACA,WAAA,CAGJ,wBACI,eAAA,CACA,oBAAA,CAGJ,+GACI,UAAA,CACA,UAAA,CAGJ,uBACI,iBAAA,CACA,iBAAA,CACA,oBAAA,CACA,UAAA,CACA,YAAA,CACA,WAAA,CACA,YAAA,CACA,iBAAA,CACA,kBAAA,CACA,UAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CAiCJ,uBACI,iBAAA,CACA,QAAA,CACA,UAAA,CAGJ,sBACI,iBAAA,CACA,OAAA,CACA,SAAA,CAGJ,oBACI,iBAAA,CACA,KAAA,CACA,OAAA,CAGJ,iBACI,iBAAA,CACA,QAAA,CACA,OAAA,CACA,MAAA,CAGJ,YACI,kBAAA,CACA,WAAA,CACA,eAAA,CACA,kBAAA,CACA,gBAAA,CACA,iBAAA,CACA,2BAAA,CAGJ,cACI,UAAA,CAGJ,8BACI,WAAA,CACA,kBAAA,CAGJ,qBACI,UAAA,CAGJ,wBACI,UAAA,CAGJ,iBACI,aAAA,CAGJ,4BACI,aAAA,CAGJ,+BACI,aAAA,CAGJ,0BACI,YAAA,CAGJ,2CACI,cAAA,CAGJ,2DACI,aAAA,CAGJ,qBAII,qBAAA,CACA,iBAAA,CACA,eAAA,CACA,aAAA,CACA,kBAAA,CACA,iBAAA,CACA,kBAAA,CAGJ,yBACI,UAAA,CACA,WAAA,CACA,yBAAA,CACA,mCAAA,CACA,sBAAA,CACA,4BAAA,CACA,iBAAA,CACA,2BAAA,CACA,uBAAA,CAGJ,iBACI,UAAA,CACA,WAAA,CACA,uBAAA,CAGJ,iBACI,UAAA,CACA,WAAA,CACA,uBAAA,CAGJ,iBACI,UAAA,CACA,WAAA,CACA,uBAAA,CAGJ,iBACI,UAAA,CACA,WAAA,CACA,uBAAA,CAGJ,gBACI,UAAA,CACA,UAAA,CACA,WAAA,CACA,cAAA,CAGJ,mBACI,yDAAA,CAGJ,oBACI,yDAAA,CAGJ,oBACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,mBACI,yDAAA,CAGJ,oBACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,sBACI,yDAAA,CAGJ,sBACI,yDAAA,CAGJ,mBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,eACI,yDAAA,CAGJ,eACI,yDAAA,CAGJ,gBACI,yDAAA,CAGJ,uBACI,yDAAA,CAGJ,oBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,wBACI,yDAAA,CAGJ,mBACI,yDAAA,CAGJ,0BACI,yDAAA,CAGJ,gCACI,yDAAA,CAGJ,0CACI,yDAAA,CAGJ,gBACI,yDAAA,CAGJ,gBACI,yDAAA,CAGJ,gBACI,yDAAA,CAGJ,sBACI,yDAAA,CAGJ,mBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,wBACI,yDAAA,CAGJ,qBACI,yDAAA,CAGJ,iBACI,yDAAA,CAGJ,qBACI,yDAAA,CAGJ,kBACI,yDAAA,CAGJ,qBACI,0DAAA,CAGJ,qBACI,0DAAA,CAGJ,mBACI,0DAAA,CAGJ,oCACI,yDAAA,CAGJ,8BACI,0DAAA,CAGJ,yBACI,0DAAA,CAGJ,iBACI,0DAAA,CAGJ,iBACI,0DAAA,CAGJ,mBACI,0DAAA,CAGJ,0BACI,0DAAA,CAGJ,wBACI,0DAAA,CAGJ,0BACI,0DAAA,CAGJ,oBACI,0DAAA,CAGJ,sBACI,0DAAA,CAGJ,iBACI,cAAA,CACA,eAAA,CACA,gBAAA,CAGJ,4BACI,eAAA,CACA,cAAA,CACA,kBAAA,CAGJ,2BACI,eAAA,CAGJ,uBACI,UAAA,CACA,UAAA,CACA,WAAA,CACA,cAAA,CAGJ,yBACI,kBAAA,CACA,iBAAA,CACA,UAAA,CACA,kBAAA,CACA,wBAAA,CACA,eAAA,CACA,cAAA,CAGJ,+BACI,UAAA,CACA,wBAAA,CAGJ,0CACI,wB5E1qEiB,C4E2qEjB,U5EzqEmB,C4E0qEnB,wBAAA,CAGJ,wCACI,wB5ErrEc,C4EsrEd,a5EprEgB,C4EqrEhB,wBAAA,CAGJ,0CACI,wB5E5sEQ,C4E6sER,UAAA,CACA,wBAAA,CAGJ,0CACI,wB5ElrEgB,C4EmrEhB,a5EjrEkB,C4EkrElB,wBAAA,CAGJ,0CACI,wB5E5tEa,C4E6tEb,a5EjuEW,C4EkuEX,wBAAA,CAGJ,gCACI,wB5E9rEgB,C4E+rEhB,a5E7rEkB,C4E8rElB,wBAAA,CAGJ,6BACI,wB5ExuEa,C4E2uEjB,kBACI,qBAAA,CAGJ,kDACI,wBAAA,CACA,UAAA,CAGJ,SACI,oCAAA,CAGJ,OACI,oBAAA,CACA,eAAA,CAGJ,oBACI,+BAAA,CACA,SAAA,CAGJ,yBACI,iBAAA,CACA,wBAAA,CACA,wBAAA,CACA,kBAAA,CAGJ,YACI,aAAA,CACA,gBAAA,CACA,cAAA,CACA,kBAAA,CACA,cAAA,CACA,oBAAA,CAGJ,kBACI,gCAAA,CAGJ,mBACI,aAAA,CACA,wB5EpxEQ,C4EuxEZ,YACI,aAAA,CAGJ,kBACI,aAAA,CAGJ,0BACI,+BAAA,CACA,aAAA,CACA,qBAAA,CAGJ,6BACI,eAAA,CACA,UAAA,CACA,UAAA,CAGJ,yBACI,eAAA,CACA,UAAA,CACA,UAAA,CAGJ,mBACI,UAAA,CACA,WAAA,CAGJ,uBACI,cAAA,CACA,aAAA,CACA,eAAA,CACA,kBAAA,CACA,cAAA,CAGJ,4BACI,aAAA,CACA,cAAA,CACA,aAAA,CAGJ,oBACI,qB5E3vEc,C4E4vEd,aAAA,CACA,2BAAA,CACA,oB5EhwEW,C4EiwEX,iBAAA,CACA,kBAAA,CACA,gBAAA,CACA,iBAAA,CAIJ,kBACI,wCAAA,CACA,0BAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,qBACI,UAAA,CACA,gBAAA,CAGJ,uBACI,eAAA,CAGJ,wBACI,iBAAA,CACA,oBAAA,CACA,wBAAA,CACA,2BAAA,CACA,mBAAA,CACA,wBAAA,CAGJ,2BACI,gBAAA,CAGJ,4BACI,aAAA,CACA,wBAAA,CACA,iBAAA,CACA,yBAAA,CAGJ,8BACI,yBAAA,CACA,iBAAA,CAGJ,YACI,iBAAA,CACA,WAAA,CACA,WAAA,CACA,YAAA,CAGJ,aACI,mBAAA,CACA,UAAA,CAGJ,iBACI,aAAA,CACA,cAAA,CACA,iBAAA,CACA,qBAAA,CAGJ,wCACI,aAAA,CAGJ,0CACI,aAAA,CAGJ,yBACI,+BAAA,CAGJ,4BACI,aAAA,CAGJ,wCAEI,aAAA,CAIJ,oBACI,iBAAA,CACA,UAAA,CACA,WAAA,CACA,qBAAA,CACA,qBAAA,CACA,+BAAA,CACA,iBAAA,CACA,4CAAA,CACA,oCAAA,CACA,oBAAA,CAGJ,aACI,2BAAA,CAGJ,aACI,0BAAA,CAGJ,aACI,wBAAA,CAGJ,aACI,yBAAA,CAGJ,cACI,oBAAA,CACA,aAAA,CACA,gBAAA,CACA,cAAA,CACA,iBAAA,CACA,cAAA,CAGJ,oBACI,gCAAA,CAGJ,wBACI,mBAAA,CACA,cAAA,CACA,UAAA,CAGJ,+BACI,iBAAA,CACA,YAAA,CACA,gBAAA,CACA,aAAA,CACA,qBAAA,CAGJ,sDACI,qBAAA,CACA,0BAAA,CAGJ,4DACI,gCAAA,CAGJ,qBACI,kBAAA,CAGJ,2BACI,gBAAA,CAGJ,cACI,gBAAA,CAGJ,qBACI,a5En7ES,C4Es7Eb,gBACI,cAAA,CAaJ,uBACI,wBAAA,CACA,eAAA,CACA,WAAA,CAGJ,6BACI,mCAAA,CAIA,4BACI,wB5E7gFI,C4E+gFJ,qCACI,wB5EhhFA,C4EqhFZ,QACI,a5EthFQ,C4EyhFZ,mCACI,a5E1hFQ,C4E6hFZ,6BACI,a5Ej+ES,C4Ek+ET,kCAAA,CAGJ,yCACI,a5Et+ES,C4Ey+Eb,uCACI,a5E1+ES,C4E2+ET,kCAAA,CAGJ,6CACI,a5E/+ES,C4Ek/Eb,kBACI,wB5EhjFQ,C4EijFR,oB5EjjFQ,C4EkjFR,UAAA,CAGJ,yCACI,UAAA,CACA,qBAAA,CACA,iBAAA,CAGJ,QACI,a5E5jFQ,C4E+jFZ,8FACI,a5EhkFQ,C4EmkFZ,2BACI,gBAAA,CACA,mBAAA,CAGJ,eACI,a5EzkFQ,C4E0kFR,qBAAA,CACA,iBAAA,CAGJ,qBACI,a5E/kFQ,C4EglFR,8BAAA,CACA,0BAAA,CAGJ,eACI,a5ErlFQ,C4EslFR,qBAAA,CACA,oB5EvlFQ,C4E0lFZ,qBACI,oDAAA,CACA,8BAAA,CACA,oB5E7lFQ,C4EgmFZ,sGACI,8BAAA,CAIJ,eACI,UAAA,CACA,mBAAA,CAGJ,wBACI,UAAA,CAGJ,sBACI,4BAAA,CACA,+BAAA,CAGJ,kBACI,wBAAA,CACA,a5E7nFW,C4E8nFX,cAAA,CACA,eAAA,CAGJ,uBACI,gBAAA,CACA,WAAA,CACA,aAAA,CACA,YAAA,CACA,iBAAA,CAGJ,sBACI,eAAA,CACA,WAAA,CACA,aAAA,CACA,YAAA,CACA,iBAAA,CAGJ,sBACI,eAAA,CACA,WAAA,CACA,aAAA,CACA,YAAA,CACA,iBAAA,CAGJ,aACI,eAAA,CACA,UAAA,CACA,oBAAA,CACA,iBAAA,CACA,kBAAA,CAOJ,2BACI,gBAAA,CAGJ,oBACI,iBAAA,CACA,QAAA,CACA,UAAA,CACA,UAAA,CACA,oBAAA,CAGJ,eACI,UAAA,CACA,gBAAA,CAGJ,0BACI,+BAAA,CACA,eAAA,CAGJ,2BACI,a5E7rFW,C4E8rFX,wB5E1rFa,C4E2rFb,wBAAA,CAGJ,uBACI,a5EppFiB,C4EqpFjB,wB5EvpFe,C4EwpFf,wBAAA,CAGJ,oBACI,wB5E5pFe,C4E6pFf,a5E3pFiB,C4E4pFjB,wBAAA,CAGJ,iBACI,kB5E3sFa,C4E4sFb,a5EhtFW,C4EitFX,wBAAA,CAGJ,iBACI,wB5E7qFgB,C4E8qFhB,a5E5qFkB,C4E6qFlB,wBAAA,CAGJ,qBACI,wB5E7rFiB,C4E8rFjB,U5E5rFmB,C4E6rFnB,wBAAA,CAGJ,cACI,wB5EnsFiB,C4EosFjB,U5ElsFmB,C4EmsFnB,wBAAA,CAGJ,WACI,wB5E/rFgB,C4EgsFhB,a5E9rFkB,C4E+rFlB,wBAAA,CAGJ,cACI,wB5EptFc,C4EqtFd,a5EntFgB,C4EotFhB,wBAAA,CAGJ,wBACI,kBAAA,CACA,eAAA,CAGJ,2BACI,gBAAA,CACA,+BAAA,CAGJ,+BACI,aAAA,CACA,qBAAA,CACA,iBAAA,CAGJ,4BACI,WAAA,CACA,aAAA,CACA,UAAA,CAGJ,uBACI,SAAA,CACA,eAAA,CAIJ,0BACI,iBAAA,CACA,QAAA,CACA,UAAA,CAGJ,wBACI,WAAA,CAGJ,2BACI,yBAAA,CAGJ,cACI,eAAA,CACA,cAAA,CAGJ,iBACI,sBAAA,CAIJ,4CACI,YAAA,CAGJ,iBACI,a5EtuFS,C4EuuFT,eAAA,CACA,iBAAA,CACA,+BAAA,CAGJ,kCACI,WAAA,CACA,yCAAA,CAGJ,gCACI,uBAAA,CAIJ,sDACI,0BAAA,CAGJ,oBACI,QAAA,CACA,gBAAA,CAGJ,6BACI,qBAAA,CACA,6BAAA,CACA,4BAAA,CACA,eAAA,CACA,cAAA,CACA,QAAA,CACA,sBAAA,CACA,YAAA,CACA,QAAA,CACA,YAAA,CAGJ,eACI,qBAAA,CACA,6BAAA,CACA,4BAAA,CACA,eAAA,CACA,cAAA,CACA,QAAA,CACA,sBAAA,CACA,YAAA,CACA,QAAA,CACA,YAAA,CAGJ,0CACI,OAAA,CAGJ,sDACI,KAAA,CACA,eAAA,CAGJ,uBACI,oBAAA,CACA,qBAAA,CAGJ,oBACI,oBAAA,CACA,UAAA,CACA,WAAA,CAGJ,kBACI,qBAAA,CAGJ,qBACI,qBAAA,CAGJ,OACI,oBAAA,CACA,UAAA,CACA,cAAA,CACA,iBAAA,CACA,a5Ev3FQ,C4Ew3FR,oB5EhzFW,C4EizFX,qBAAA,CAGJ,aACI,wBAAA,CACA,oB5EtzFW,C4EyzFf,+BACI,a5Er0FS,C4Es0FT,iBAAA,CACA,cAAA,CAGJ,iEACI,wBAAA,CACA,a5E50FS,C4E60FT,cAAA,CAGJ,4BACI,aAAA,CACA,cAAA,CACA,gBAAA,CAGJ,qBACI,mCAAA,CACA,qBAAA,CACA,0BAAA,CACA,iBAAA,CACA,mCAAA,CAGJ,2BACI,mCAAA,CACA,oBAAA,CACA,wBAAA,CAGJ,oBACI,gCAAA,CACA,wBAAA,CACA,0BAAA,CACA,iBAAA,CACA,mCAAA,CAGJ,0BACI,yCAAA,CACA,oBAAA,CACA,wBAAA,CAIJ,aACI,0DAAA,CACA,iBAAA,CAGJ,iBACI,aAAA,CAGJ,kBACI,uBAAA,CAGJ,4BACI,gBAAA,CACA,mBAAA,CAGJ,kBACI,2BAAA,CAGJ,0BACI,UAAA,CAGJ,WACI,QAAA,CAGJ,sBACI,aAAA,CACA,8BAAA,CACA,WAAA,CAGJ,4BACI,UAAA,CAGJ,sBACI,wBAAA,CACA,UAAA,CAGJ,oBACI,aAAA,CAGJ,qBACI,aAAA,CAGJ,wBACI,aAAA,CAGJ,uBACI,aAAA,CAGJ,eACI,aAAA,CAGJ,qBACI,aAAA,CAGJ,eACI,aAAA,CAGJ,aACI,UAAA,CAGJ,iBACI,UAAA,CAGJ,YACI,aAAA,CAGJ,iBACI,gBAAA,CAGJ,gBACI,yBAAA,CACA,iBAAA,CACA,iBAAA,CACA,aAAA,CAGJ,qBACI,yBAAA,CAGJ,uBACI,sBAAA,CAGJ,gBACI,cAAA,CAGJ,sBACI,cAAA,CACA,wBAAA,CAGJ,gBACI,2BAAA,CACA,4BAAA,CACA,eAAA,CAGJ,2BACI,iBAAA,CAGJ,iBACI,aAAA,CAGJ,uCACI,cAAA,CACA,iBAAA,CACA,aAAA,CAGJ,uCACI,eAAA,CACA,kBAAA,CACA,kBAAA,CAGJ,+CACI,eAAA,CAGJ,6CACI,eAAA,CAGJ,sBACI,6BAAA,CAGJ,6BACI,cAAA,CAGJ,sBACI,a5E5kGQ,C4E+kGZ,mCACI,+BAAA,CAGJ,wCACI,gBAAA,CACA,+BAAA,CAGJ,qFACI,wB5E5hGS,C4E+hGb,qBACI,oBAAA,CAGJ,sBACI,oBAAA,CAGJ,mCACI,eAAA,CAGJ,qBACI,YAAA,CACA,qBAAA,CAGJ,gBACI,cAAA,CACA,WAAA,CACA,mBAAA,CAGJ,YACI,cAAA,CACA,WAAA,CACA,mBAAA,CAGJ,sBACI,WAAA,CACA,iBAAA,CACA,KAAA,CACA,OAAA,CACA,a5EjkGS,C4EkkGT,qBAAA,CACA,WAAA,CACA,qBAAA,CACA,oBAAA,CACA,UAAA,CACA,WAAA,CACA,YAAA,CAGJ,4BACI,wBAAA,CACA,6BAAA,CAGJ,eACI,8BAAA,CACA,0BAAA,CACA,cAAA,CACA,mBAAA,CACA,aAAA,CACA,eAAA,CAGJ,iBAEI,8DAAA,CACA,2DAAA,CACA,yDAAA,CACA,sDAAA,CAGJ,+DAEI,SAAA,CAGJ,kEAEI,SAAA,CAIJ,eACI,gBAAA,CACA,UAAA,CACA,wBAAA,CACA,iBAAA,CACA,uBAAA,CACA,uBAAA,CACA,oBAAA,CACA,8EAAA,CAGJ,aACI,cAAA,CAGJ,iBACI,aAAA,CACA,gBAAA,CACA,UAAA,CACA,wBAAA,CACA,iBAAA,CACA,uBAAA,CACA,uBAAA,CACA,oBAAA,CACA,eAAA,CAGJ,eACI,aAAA,CACA,gBAAA,CACA,UAAA,CACA,wBAAA,CACA,iBAAA,CACA,uBAAA,CACA,uBAAA,CACA,oBAAA,CACA,eAAA,CAGJ,+CACI,UAAA,CACA,WAAA,CACA,gBAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,yBACI,gBAAA,CACA,UAAA,CACA,wBAAA,CACA,iBAAA,CAGJ,qBACI,+BAAA,CACA,SAAA,CAGJ,yBACI,kBAAA,CAGJ,kDACI,qBAAA,CACA,SAAA,CAGJ,0BACI,WAAA,CACA,kBAAA,CACA,wBAAA,CAGJ,qCACI,eAAA,CACA,iBAAA,CACA,wBAAA,CACA,wBAAA,CACA,yBAAA,CAGJ,wBACI,mBAAA,CACA,cAAA,CACA,UAAA,CAGJ,wBACI,cAAA,CACA,eAAA,CAGJ,kCACI,eAAA,CACA,uBAAA,CACA,eAAA,CAGJ,mCACI,eAAA,CACA,uBAAA,CACA,eAAA,CACA,wBAAA,CACA,a5EptGS,C4EqtGT,wBAAA,CAGJ,kDACI,eAAA,CACA,uBAAA,CACA,eAAA,CACA,a5E5tGS,C4E+tGb,gCACI,eAAA,CACA,uBAAA,CACA,wBAAA,CACA,cAAA,CACA,eAAA,CAGJ,wCACI,oB5EryGQ,C4EsyGR,wB5EtyGQ,C4EuyGR,UAAA,CAGJ,wDACI,WAAA,CACA,gBAAA,CAGJ,yMACI,uBAAA,CACA,eAAA,CACA,iBAAA,CAGJ,eACI,eAAA,CAGJ,0BACI,eAAA,CACA,eAAA,CACA,cAAA,CAGJ,mCACI,iBAAA,CACA,eAAA,CACA,cAAA,CAGJ,6CACI,iBAAA,CACA,eAAA,CACA,cAAA,CAGJ,WACI,kBAAA,CAGJ,wBAEI,iBAAA,CACA,wBAAA,CACA,iBAAA,CACA,qBAAA,CACA,iBAAA,CACA,iBAAA,CAGJ,aACI,eAAA,CACA,mBAAA,CACA,cAAA,CAGJ,mBACI,YAAA,CAGJ,sBACI,wB5Ep2GQ,C4Eq2GR,UAAA,CACA,wBAAA,CAGJ,uBACI,wB5Eh0GiB,C4Ei0GjB,a5E/zGmB,C4Eg0GnB,wBAAA,CAGJ,uBACI,wB5Eh1GgB,C4Ei1GhB,a5E/0GkB,C4Eg1GlB,wBAAA,CAGJ,6BACI,wB5Et1GgB,C4Eu1GhB,a5Er1GkB,C4Es1GlB,wBAAA,CAGJ,2BACI,wB5Ev1Ge,C4Ew1Gf,a5Et1GiB,C4Eu1GjB,wBAAA,CAGJ,yBACI,wB5Ev2GiB,C4Ew2GjB,a5Et2GmB,C4Eu2GnB,wBAAA,CAGJ,0BACI,wB5E54Ga,C4E64Gb,a5Ej5GW,C4Ek5GX,wBAAA,CAGJ,6BACI,wB5Ez2Ge,C4E02Gf,a5Ex2GiB,C4Ey2GjB,wBAAA,CAGJ,kCACI,wB5Er2Ge,C4Es2Gf,a5Ep2GiB,C4Eq2GjB,wBAAA,CAGJ,aACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAGJ,kDACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAGJ,0DACI,wBAAA,CACA,oBAAA,CACA,UAAA,CAIJ,gCACI,mBAAA,CAGJ,oBACI,iBAAA,CACA,eAAA,CACA,oBAAA,CACA,oBAAA,CAGJ,sBACI,gBAAA,CACA,UAAA,CACA,wBAAA,CACA,uBAAA,CACA,uBAAA,CACA,oBAAA,CACA,uFAAA,CAGJ,YACI,aAAA,CAGJ,mBACI,iBAAA,CACA,aAAA,CACA,gBAAA,CAGJ,mCACI,WAAA,CACA,8BAAA,CACA,cAAA,CACA,eAAA,CACA,YAAA,CACA,WAAA,CACA,kBAAA,CACA,uBAAA,CACA,uBAAA,CACA,oBAAA,CACA,uFAAA,CAGJ,yCACI,qBAAA,CAGJ,4CACI,WAAA,CAGJ,kCACI,cAAA,CACA,oBAAA,CAGJ,2BACI,4BAAA,CACA,UAAA,CAGJ,oCACI,cAAA,CACA,gBAAA,CACA,mBAAA,CACA,iBAAA,CAGJ,0BACI,mBAAA,CACA,UAAA,CAGJ,mCACI,6BAAA,CAGJ,sCACI,wCAAA,CAGJ,iCACI,6BAAA,CAGJ,wBACI,wBAAA,CACA,cAAA,CACA,eAAA,CACA,gBAAA,CAGJ,yBACI,UAAA,CACA,kBAAA,CACA,gBAAA,CACA,iBAAA,CAGJ,0DACI,UAAA,CAGJ,mBACI,iBAAA,CACA,UAAA,CAGJ,sCACI,UAAA,CACA,mBAAA,CAGJ,aACI,iBAAA,CACA,OAAA,CACA,QAAA,CACA,UAAA,CACA,+BAAA,CACA,aAAA,CAGJ,aACI,iBAAA,CACA,OAAA,CACA,QAAA,CACA,UAAA,CACA,+BAAA,CACA,aAAA,CAGJ,eACI,aAAA,CAGJ,0BACI,YAAA,CACA,sBAAA,CACA,eAAA,CAGJ,cACI,YAAA,CACA,sBAAA,CAGJ,SACI,iBAAA,CACA,QAAA,CACA,OAAA,CAGJ,eACI,qBAAA,CACA,iBAAA,CAGJ,8CACI,kBAAA,CACA,cAAA,CAIJ,gBAGI,iBAAA,CACA,qBAAA,CACA,uCAAA,CAGJ,uBAEI,4BAAA,CACA,a5E5lHQ,C4E6lHR,iBAAA,CAGJ,uBACI,0BAAA,CACA,2BAAA,CACA,iBAAA,CACA,cAAA,CACA,WAAA,CACA,gBAAA,CACA,WAAA,CAGJ,wCACI,0BAAA,CACA,qBAAA,CACA,kBAAA,CACA,oBAAA,CACA,mBAAA,CACA,YAAA,CACA,0BAAA,CACA,sBAAA,CACA,kBAAA,CACA,iBAAA,CACA,qBAAA,CACA,6BAAA,CACA,8BAAA,CACA,mBAAA,CACA,gBAAA,CAGJ,qBACI,cAAA,CAEA,aAAA,CAGJ,gBAGI,cAAA,CACA,gBAAA,CAIJ,sBACI,cAAA,CACA,iBAAA,CAGJ,wBACI,cAAA,CACA,iBAAA,CAGJ,0BACI,cAAA,CACA,aAAA,CAOJ,qBACI,iBAAA,CACA,SAAA,CACA,OAAA,CACA,WAAA,CACA,WAAA,CACA,qBAAA,CACA,6BAAA,CACA,SAAA,CACA,QAAA,CACA,aAAA,CACA,iBAAA,CAKJ,MACI,WAAA,CAMJ,MACI,WAAA,CAWJ,6BACI,SAAA,CAGJ,mCACI,+BAAA,CACA,kBAAA,CAGJ,gBACI,eAAA,CACA,WAAA,CACA,aAAA,CAGJ,6BACI,wBAAA,CAGJ,uBACI,iBAAA,CAGJ,iBACI,mBAAA,CAGJ,6FACI,aAAA,CAGJ,gBACI,iBAAA,CAGJ,aACI,0DAAA,CACA,2BAAA,CACA,oBAAA,CACA,uBAAA,CAGJ,iBACI,0DAAA,CACA,2BAAA,CACA,oBAAA,CACA,uBAAA,CAGJ,iBACI,0DAAA,CACA,2BAAA,CACA,oBAAA,CACA,uBAAA,CAGJ,aACI,0DAAA,CACA,2BAAA,CACA,oBAAA,CACA,uBAAA,CAGJ,OACI,0DAAA,CACA,2BAAA,CACA,oBAAA,CACA,uBAAA,CAGJ,qBACI,aAAA,CACA,iBAAA,CACA,cAAA,CACA,iBAAA,CACA,cAAA,CACA,UAAA,CAGJ,2BACI,gCAAA,CAGJ,4BACI,aAAA,CACA,wB5ErxHQ,C4EsxHR,eAAA,CAGJ,SACI,cAAA,CACA,qBAAA,CAGJ,eACI,wBAAA,CAGJ,gBACI,eAAA,CAGJ,eACI,cAAA,CAGJ,iBACI,eAAA,CAGJ,UACI,MAAA,CAGJ,UACI,sBAAA,CAGJ,kBACI,iBAAA,CAGJ,UACI,YAAA,CAGJ,6BACI,mBAAA,CAGJ,oBACI,iBAAA,CAGJ,qBACI,MAAA,CAEA,eAAA,CACA,sBAAA,CACA,oBAAA,CAGJ,YACI,oBAAA,CAGJ,eACI,eAAA,CACA,sBAAA,CACA,mBAAA,CACA,oBAAA,CACA,2BAAA,CAGJ,UACI,aAAA,CAIJ,gBACI,8BAAA,CACA,wBAAA,CACA,aAAA,CACA,cAAA,CAGJ,0BACI,8BAAA,CACA,wBAAA,CACA,aAAA,CAGJ,QACI,iBAAA,CAGJ,cACI,WAAA,CACA,UAAA,CACA,aAAA,CACA,iBAAA,CACA,WAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,yBAAA,CAGJ,0BACI,2BAAA,CAGJ,0BACI,YAAA,CAGJ,8BACI,YAAA,CAGJ,wBACI,YAAA,CAGJ,sBACI,YAAA,CAGJ,2BACI,YAAA,CAGJ,iCACI,YAAA,CAGJ,2CACI,YAAA,CAGJ,iDACI,YAAA,CAGJ,qCACI,eAAA,CACA,YAAA,CAGJ,qBACI,gBAAA,CACA,gBAAA,CAGJ,8BACI,UAAA,CAGJ,2BACI,yBAAA,CAGJ,wBACI,YAAA,CAEA,eAAA,CAEA,iBAAA,CACA,wBAAA,CAGJ,+BACI,kBAAA,CACA,WAAA,CACA,wBAAA,CACA,wBAAA,CAGJ,6EACI,oBAAA,CAGJ,4CACI,oBAAA,CAGJ,2CACI,oBAAA,CAGJ,gDAEI,aAAA,CAGJ,yDAEI,aAAA,CAGJ,uDAEI,aAAA,CAGJ,2BACI,aAAA,CAGJ,mCACI,aAAA,CAGJ,0BAEI,cAAA,CACA,eAAA,CAGJ,kCAEI,YAAA,CAGJ,8BACI,kBAAA,CACA,cAAA,CAGJ,oCACI,kBAAA,CACA,wBAAA,CAIJ,qBACI,iBAAA,CACA,UAAA,CACA,UAAA,CACA,iBAAA,CAGJ,oCACI,wBAAA,CAGJ,kBACI,gBAAA,CAGJ,kBACI,mBAAA,CAGJ,qDACI,cAAA,CACA,oBAAA,CAGJ,mBACI,WAAA,CACA,mBAAA,CACA,mBAAA,CACA,gBAAA,CACA,eAAA,CACA,WAAA,CACA,sBAAA,CACA,6BAAA,CACA,0BAAA,CACA,yBAAA,CACA,qBAAA,CAGJ,mBACI,UAAA,CACA,eAAA,CACA,kBAAA,CACA,eAAA,CACA,cAAA,CACA,UAAA,CAIJ,sBACI,UAAA,CACA,kBAAA,CACA,eAAA,CACA,cAAA,CACA,UAAA,CAGJ,mBACI,aAAA,CAGJ,mBACI,aAAA,CAIJ,iCACI,gBAAA,CAGJ,oCACI,gBAAA,CAGJ,qBACI,gBAAA,CAGJ,sBACI,iBAAA,CACA,OAAA,CACA,QAAA,CAGJ,wBACI,wBAAA,CAIJ,0BACI,iBAAA,CAGJ,yCACI,UAAA,CAGJ,yBACI,UACI,YAAA,CAAA,CAKR,4CACI,WAAA,CAKJ,aACI,0BAAA,CACA,0BAAA,CACA,8BAAA,CAGJ,aACI,mBAAA,CACA,mBAAA,CACA,YAAA,CACA,wBAAA,CACA,qBAAA,CACA,kBAAA,CACA,uBAAA,CACA,oBAAA,CACA,sBAAA,CACA,kBAAA,CAGJ,cACI,mBAAA,CACA,mBAAA,CACA,YAAA,CACA,wBAAA,CACA,qBAAA,CACA,kBAAA,CAGJ,cACI,mBAAA,CACA,mBAAA,CACA,YAAA,CACA,wBAAA,CACA,qBAAA,CACA,6BAAA,CACA,kBAAA,CAGJ,YACI,mBAAA,CACA,mBAAA,CACA,YAAA,CACA,6BAAA,CACA,4BAAA,CACA,sBAAA,CACA,kBAAA,CACA,uBAAA,CACA,oBAAA,CACA,sBAAA,CAGJ,aACI,0BAAA,CACA,0BAAA,CACA,mBAAA,CAGJ,UACI,mBAAA,CACA,mBAAA,CACA,YAAA,CACA,wBAAA,CACA,qBAAA,CACA,wBAAA,CACA,kBAAA,CAGJ,WACI,mBAAA,CACA,mBAAA,CACA,YAAA,CACA,kBAAA,CACA,cAAA,CAGJ,aACI,mBAAA,CACA,mBAAA,CACA,YAAA,CACA,2BAAA,CACA,4BAAA,CACA,yBAAA,CACA,qBAAA,CAGJ,YACI,kBAAA,CACA,UAAA,CACA,MAAA,CAKJ,aACI,wBAAA,CACA,oBAAA,CACA,wBAAA,CACA,oBAAA,CACA,qBAAA,CACA,gBAAA,CACA,iBAAA,CACA,oBAAA,CACA,YAAA\",\"sourcesContent\":[\"@import '../App/Shared/Components/roleMultiselectDropdown/roleMultiselectDropdown.css';\\r\\n@import '../../App/Shared/Components/rulesetObjectCopyModal/rulesetObjectCopyModal.scss';\\r\\n@import '../App/Components/Notifications/notifications.css';\\r\\n@import '../App/Components/Users/usersView.css';\\r\\n@import '../App/Components/DataChanges/ServiceNow/ServiceNowTicketModal.css';\\r\\n@import '../App/Components/AXSecurityDesigner/AXSecurityDesigner.css';\\r\\n@import '../App/Components/ApprovalRules/approvalRules.css';\\r\\n@import '../App/Components/RequestManagement/WizardSteps/Universal/linkTickets/ServiceNow/IMRequestServiceNowTicketModal.css';\\r\\n@import '../App/Components/NetSuiteArmQuantification/NetSuiteArmQuantification.css';\\r\\n@import '../App/Components/DataChangesOracleCloud/oracleCloudDataChanges.css';\\r\\n@import '../App/Components/RequestManagement/AX7Person/ax7PersonSearch.css';\\r\\n@import '../App/Components/RequestManagement/WizardSteps/Universal/summary.css';\\r\\n@import '../App/Components/RequestManagement/WizardSteps/Universal/effectiveDates.css';\\r\\n@import '../../App/Components/RequestManagement/WizardSteps/Salesforce/salesforceUserForm.scss';\\r\\n@import '../../App/Components/SAPSecurityDesigner/sapSecurityDesigner.scss';\\r\\n@import '../../App/Components/SavedReports/savedReports.scss';\\r\\n@import '../../css/scss/sharedUtilities.scss';\\r\\n@import '../../css/scss/customIbox.scss';\\r\\n@import '../../App/Components/Certifications/MyReviews/myReviews.scss';\\r\\n@import '../../App/Components/AXSecurityDesigner/taskRecordingManager/taskRecordingManager.scss';\\r\\n@import '../../App/Components/Certifications/reviewSchedules/reviewSchedules.scss';\\r\\n@import '../../App/Components/OwnershipGroups/groupItemOwnersList/groupItemOwnersList.scss';\\r\\n@import '../../App/Components/MyInbox/inboxStyles.scss';\\r\\n@import '../../App/Components/maintainRiskRuleset/maintainRiskRuleset.scss';\\r\\n@import '../../App/Components/MaintainBusinessProcess/maintainBusinessProcess.scss';\\r\\n@import '../../App/Components/Certifications/AllReviews/certificationsAllReview.scss';\\r\\n@import '../../App/Components/Certifications/notificationTeams/notificationTeams.scss';\\r\\n@import '../../App/Components/Certifications/reviewSchedules/reviewScheduleInstancesList/reviewScheduleInstancesList.scss';\\r\\n@import '../../App/Components/Certifications/reviewSchedules/scheduleInstanceAssignmentsList/instanceAssignmentsList.scss';\\r\\n@import '../../App/Components/Certifications/reviewSchedules/routingCriteriaInstancesList/routingCriteriaInstancesList.scss';\\r\\n@import '../../App/Components/ReportGenerator/generatedReports.scss';\\r\\n@import '../../App/Components/SAPSecurityDesigner/simulationRiskAnalysis/simRiskAnalysis.scss';\\r\\n@import '../../App/Components/AXSecurityDesigner/SecurityMigration/MigrationsList/migrationsList.scss';\\r\\n@import '../../App/Components/MaintainBusinessProcess/SAPAuthFieldGroups/sapAuthFieldGroups.scss';\\r\\n@import '../../App/Components/ApprovalGroups/approvalGroups.scss';\\r\\n@import '../../App/Components/CompanyTemplates/CompanyTemplatesList/companyTemplatesList.scss';\\r\\n@import '../../App/Components/CompanyTemplates/AssociatedCompaniesList/companyTemplateCompaniesList.scss';\\r\\n@import '../../App/Components/Notifications/NotificationTypesList/notificationTypesList.scss';\\r\\n@import '../../App/Components/OwnershipGroups/ownershipGroupsList/ownershipGroupsList.scss';\\r\\n@import '../../App/Components/OwnershipGroups/ownershipGroupItemsList/groupItemsList.scss';\\r\\n@import '../../App/Components/OwnershipGroups/ownershipGroupOwnersList/groupOwnersList.scss';\\r\\n@import '../../App/Components/OwnershipGroups/groupOwnerItemsList/groupOwnerItemsList.scss';\\r\\n@import '../../App/Components/RequesterGroups/requesterGroupsList/requesterGroupsList.scss';\\r\\n@import '../../App/Components/RequesterGroups/requesterGroupUsersList/requesterGroupUsersList.scss';\\r\\n@import '../../App/Components/RoleTemplates/RoleTemplatesList/roleTemplatesList.scss';\\r\\n@import '../../App/Components/RoleTemplates/AssociatedRolesList/roleTemplateRolesList.scss';\\r\\n@import '../../App/Components/userRestrictions/fastpathUserList/fastpathUserList.scss';\\r\\n@import '../../App/Components/Roles/roles.scss';\\r\\n@import '../../App/Components/Users/users.scss';\\r\\n@import '../../App/Components/securityAssignment/securityAssignment.scss';\\r\\n@import '../../App/Components/IdentityManagerRequestDetails/identityManagerRequestDetailsView.scss';\\r\\n@import '../../App/Components/Configuration/configuration.scss';\\r\\n@import '../../App/Shared/Components/ownershipGroupAssignments/ownershipGroupAssignments.scss';\\r\\n@import '../../App/Components/workdayMaintainTemplates/maintainTemplatesList.scss';\\r\\n@import '../../App/Components/maintainSystemRoles/maintainSystemRoles.scss';\\r\\n@import '../../App/Components/CrossPlatformUsers/crossPlatformUsers.scss';\\r\\n\\r\\n// give grids in modals a minimum height setting so loading indicator shows when no records are available\\r\\n.modal-body {\\r\\n .k-grid-content {\\r\\n min-height: 100px;\\r\\n }\\r\\n}\",\"h1, h2, h3, h4, h5, h6 {\\r\\n font-weight: 100;\\r\\n}\\r\\n\\r\\nh1 {\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\nh2 {\\r\\n font-size: 27px;\\r\\n}\\r\\n\\r\\nh3 {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\nh4 {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\nh5 {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\nh6 {\\r\\n font-size: 10px;\\r\\n}\\r\\n\\r\\nh3, h4, h5 {\\r\\n margin-top: 5px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\",\".nav > li > a {\\r\\n color: white;\\r\\n font-weight: 600;\\r\\n padding: 14px 20px 14px 25px;\\r\\n}\\r\\n\\r\\n.nav.navbar-right > li > a {\\r\\n color: $fp-purple;\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.nav > li.active > a {\\r\\n background-color: lighten($delinea-purple, 10%);\\r\\n color: $delinea-green;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.navbar-default .nav > li > a:hover, .navbar-default .nav > li > a:focus {\\r\\n background-color: lighten($delinea-purple, 10%);\\r\\n color: $delinea-green;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\\r\\n background: #fff;\\r\\n background-color: transparent;\\r\\n}\\r\\n\\r\\n.nav.navbar-top-links > li > a:hover, .nav.navbar-top-links > li > a:focus {\\r\\n background-color: transparent;\\r\\n}\\r\\n\\r\\n.nav > li > a i {\\r\\n margin-right: 6px;\\r\\n}\\r\\n\\r\\n.navbar {\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n.navbar-default {\\r\\n background-color: transparent;\\r\\n border-color: #C1C1C1;\\r\\n}\\r\\n\\r\\n.navbar-top-links li {\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.navbar-top-links li:last-child {\\r\\n margin-right: 40px;\\r\\n}\\r\\n\\r\\n.navbar-top-links li a {\\r\\n padding: 14px 3px;\\r\\n min-height: 50px;\\r\\n}\\r\\n\\r\\n.dropdown-menu {\\r\\n border: medium none;\\r\\n border-radius: 3px;\\r\\n box-shadow: 0 0 3px rgba(86, 96, 117, 0.7);\\r\\n display: none;\\r\\n float: left;\\r\\n font-size: 12px;\\r\\n left: 0;\\r\\n list-style: none outside none;\\r\\n padding: 0;\\r\\n position: absolute;\\r\\n text-shadow: none;\\r\\n top: 100%;\\r\\n z-index: 1000;\\r\\n}\\r\\n\\r\\n.dropdown-menu > li > a {\\r\\n border-radius: 3px;\\r\\n color: inherit;\\r\\n line-height: 25px;\\r\\n margin: 4px;\\r\\n text-align: left;\\r\\n font-weight: normal;\\r\\n}\\r\\n\\r\\n.dropdown-menu > li > a.font-bold {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-menu li {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-menu li:last-child {\\r\\n margin-right: 0;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-menu li a {\\r\\n padding: 3px 20px;\\r\\n min-height: 0;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-menu li a div {\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-messages,\\r\\n.navbar-top-links .dropdown-tasks,\\r\\n.navbar-top-links .dropdown-alerts {\\r\\n width: 500px;\\r\\n min-width: 0;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-messages {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-tasks {\\r\\n margin-left: -59px;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-alerts {\\r\\n margin-left: -123px;\\r\\n}\\r\\n\\r\\n.navbar-top-links .dropdown-user {\\r\\n right: 0;\\r\\n left: auto;\\r\\n}\\r\\n\\r\\n.dropdown-messages, .dropdown-alerts {\\r\\n padding: 10px 10px 10px 10px;\\r\\n}\\r\\n\\r\\n.dropdown-messages li a, .dropdown-alerts li a {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.dropdown-messages li em, .dropdown-alerts li em {\\r\\n font-size: 10px;\\r\\n}\\r\\n\\r\\n.nav.navbar-top-links .dropdown-alerts a {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.nav-header {\\r\\n padding: 5px 25px 33px 25px;\\r\\n background: $nav-profil-pattern;\\r\\n .dropdown-menu {\\r\\n height: 500px;\\r\\n overflow-y: scroll;\\r\\n }\\r\\n}\\r\\n\\r\\n.pace-done .nav-header {\\r\\n transition-duration: 0.5s;\\r\\n}\\r\\n\\r\\n.nav > li.active {\\r\\n background: #242633;\\r\\n border-left: 4px solid $delinea-green;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.nav.nav-second-level > li.active {\\r\\n border: none;\\r\\n background: #242633;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.nav.nav-second-level.collapse[style] {\\r\\n height: auto !important;\\r\\n color: white;\\r\\n background-color: #242633;\\r\\n}\\r\\n\\r\\n.nav-header a {\\r\\n color: #dfe4ed;\\r\\n}\\r\\n\\r\\n.nav-header .text-muted {\\r\\n color: #8095a8;\\r\\n}\\r\\n\\r\\n.minimalize-styl-2 {\\r\\n padding: 4px 12px;\\r\\n margin: 14px 5px 5px 20px;\\r\\n font-size: 14px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.navbar-form-custom {\\r\\n float: left;\\r\\n height: 50px;\\r\\n padding: 0;\\r\\n width: 200px;\\r\\n display: inline-table;\\r\\n}\\r\\n\\r\\n.navbar-form-custom .form-group {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.nav.navbar-top-links a {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.navbar-form-custom .form-control {\\r\\n background: none repeat scroll 0 0 rgba(0, 0, 0, 0);\\r\\n border: medium none;\\r\\n font-size: 14px;\\r\\n height: 60px;\\r\\n margin: 0;\\r\\n z-index: 1000;\\r\\n color: #121321;\\r\\n}\\r\\n\\r\\n.count-info .label {\\r\\n line-height: 12px;\\r\\n padding: 2px 5px;\\r\\n position: absolute;\\r\\n right: 6px;\\r\\n top: 12px;\\r\\n}\\r\\n\\r\\n.arrow {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.mini-navbar .nav-second-level li > a > .arrow {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.fa.arrow:before {\\r\\n content: \\\"\\\\f104\\\";\\r\\n}\\r\\n\\r\\n.active > a > .fa.arrow:before {\\r\\n content: \\\"\\\\f107\\\";\\r\\n}\\r\\n \\r\\n.nav-third-level {\\r\\n overflow-y: scroll;\\r\\n max-height: 185px;\\r\\n}\\r\\n\\r\\n.nav-scroll {\\r\\n scrollbar-width: thin;\\r\\n scrollbar-color: #C2C4CC;\\r\\n}\\r\\n\\r\\n.nav-scroll::-webkit-scrollbar {\\r\\n width: 12px;\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.nav-scroll::-webkit-scrollbar-track {\\r\\n background: #C2C4CC;\\r\\n}\\r\\n\\r\\n.nav-scroll::-webkit-scrollbar-thumb {\\r\\n background-color: #C2C4CC;\\r\\n border-radius: 5px;\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.nav-second-level li,\\r\\n.nav-third-level li {\\r\\n border-bottom: none !important;\\r\\n}\\r\\n\\r\\n.nav-second-level li a {\\r\\n color: white;\\r\\n background-color: #242633;\\r\\n padding: 7px 10px 7px 10px;\\r\\n padding-left: 52px;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.nav-third-level li a {\\r\\n padding-left: 62px;\\r\\n}\\r\\n\\r\\n.nav-second-level li:last-child {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.nav-third-level {\\r\\n overflow-y: scroll;\\r\\n max-height: 165px;\\r\\n}\\r\\n\\r\\n.nav-scroll {\\r\\n scrollbar-width: thin;\\r\\n scrollbar-color: #C2C4CC;\\r\\n}\\r\\n\\r\\n.nav-scroll::-webkit-scrollbar {\\r\\n width: 12px;\\r\\n border: 1px solid #FFFFFF;\\r\\n}\\r\\n\\r\\n.nav-scroll::-webkit-scrollbar-track {\\r\\n background: #C2C4CC;\\r\\n}\\r\\n\\r\\n.nav-scroll::-webkit-scrollbar-thumb {\\r\\n background-color: #FFFFFF;\\r\\n border-radius: 5px;\\r\\n border: 3px solid #C2C4CC;\\r\\n}\\r\\n\\r\\nbody:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover > .nav-second-level, .mini-navbar .nav li:focus > .nav-second-level {\\r\\n display: block;\\r\\n border-radius: 0 2px 2px 0;\\r\\n min-width: 140px;\\r\\n height: auto;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .navbar-default .nav > li > .nav-second-level li a {\\r\\n font-size: 13px;\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n.fixed-nav .slimScrollDiv #side-menu {\\r\\n padding-bottom: 60px;\\r\\n}\\r\\n\\r\\n.mini-navbar .nav-second-level li a {\\r\\n padding: 10px 10px 10px 15px;\\r\\n}\\r\\n\\r\\n.mini-navbar .nav-second-level {\\r\\n position: absolute;\\r\\n left: 70px;\\r\\n top: 0px;\\r\\n background-color: #242633;\\r\\n padding: 10px 10px 10px 10px;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.canvas-menu.mini-navbar .nav-second-level {\\r\\n background: #242633;\\r\\n}\\r\\n\\r\\n.mini-navbar li.active .nav-second-level {\\r\\n left: 65px;\\r\\n}\\r\\n\\r\\n.navbar-default .special_link a {\\r\\n background: $navy;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.navbar-default .special_link a:hover {\\r\\n background: #17987e !important;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.navbar-default .special_link a span.label {\\r\\n background: white;\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n.navbar-default .landing_link a {\\r\\n background: lighten($navy, 3%);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.navbar-default .landing_link a:hover {\\r\\n background: $navy !important;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.navbar-default .landing_link a span.label {\\r\\n background: white;\\r\\n color: lighten($navy, 3%);\\r\\n}\\r\\n\\r\\n.logo-element {\\r\\n text-align: center;\\r\\n font-size: 18px;\\r\\n font-weight: 600;\\r\\n color: white;\\r\\n display: none;\\r\\n padding: 18px 0;\\r\\n}\\r\\n\\r\\n.pace-done .navbar-static-side, .pace-done .nav-header, .pace-done li.active, .pace-done #page-wrapper, .pace-done .footer {\\r\\n -webkit-transition: all 0.5s;\\r\\n -moz-transition: all 0.5s;\\r\\n -o-transition: all 0.5s;\\r\\n transition: all 0.5s;\\r\\n}\\r\\n\\r\\n.navbar-fixed-top {\\r\\n background: white;\\r\\n transition-duration: 0.5s;\\r\\n border-bottom: 1px solid #C2C4CC !important;\\r\\n z-index: 1030;\\r\\n}\\r\\n\\r\\n.navbar-fixed-top, .navbar-static-top {\\r\\n background: $gray;\\r\\n}\\r\\n\\r\\n.fixed-nav #wrapper {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\nbody.fixed-nav #wrapper .navbar-static-side,\\r\\nbody.fixed-nav #wrapper #page-wrapper {\\r\\n margin-top: 60px;\\r\\n}\\r\\n\\r\\n.fixed-nav .minimalize-styl-2 {\\r\\n margin: 14px 5px 5px 15px;\\r\\n}\\r\\n\\r\\n.body-small .navbar-fixed-top {\\r\\n margin-left: 0px;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .navbar-static-side {\\r\\n width: 70px;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .profile-element, body.mini-navbar .nav-label, body.mini-navbar .navbar-default .nav li a span {\\r\\n display: none;\\r\\n}\\r\\n\\r\\nbody.canvas-menu .profile-element {\\r\\n display: block;\\r\\n}\\r\\n\\r\\nbody:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level {\\r\\n display: none;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .navbar-default .nav > li > a {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .logo-element {\\r\\n display: block;\\r\\n}\\r\\n\\r\\nbody.canvas-menu .logo-element {\\r\\n display: none;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .nav-header {\\r\\n padding: 0;\\r\\n background-color: $navy;\\r\\n}\\r\\n\\r\\nbody.canvas-menu .nav-header {\\r\\n padding: 33px 25px;\\r\\n}\\r\\n\\r\\nbody.mini-navbar #page-wrapper {\\r\\n margin: 0 0 0 70px;\\r\\n}\\r\\n\\r\\nbody.fixed-sidebar.mini-navbar .footer,\\r\\nbody.canvas-menu.mini-navbar .footer {\\r\\n margin: 0 0 0 0 !important;\\r\\n}\\r\\n\\r\\nbody.canvas-menu.mini-navbar #page-wrapper,\\r\\nbody.canvas-menu.mini-navbar .footer {\\r\\n margin: 0 0 0 0;\\r\\n}\\r\\n\\r\\nbody.fixed-sidebar .navbar-static-side,\\r\\nbody.canvas-menu .navbar-static-side {\\r\\n position: fixed;\\r\\n width: $sidebar-width;\\r\\n z-index: 1001;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\nbody.fixed-sidebar.mini-navbar .navbar-static-side {\\r\\n width: 0px;\\r\\n}\\r\\n\\r\\nbody.fixed-sidebar.mini-navbar #page-wrapper {\\r\\n margin: 0 0 0 0px;\\r\\n}\\r\\n\\r\\nbody.body-small.fixed-sidebar.mini-navbar #page-wrapper {\\r\\n margin: 0 0 0 $sidebar-width;\\r\\n}\\r\\n\\r\\nbody.body-small.fixed-sidebar.mini-navbar .navbar-static-side {\\r\\n width: $sidebar-width;\\r\\n}\\r\\n\\r\\n.fixed-sidebar.mini-navbar .nav li:focus > .nav-second-level,\\r\\n.canvas-menu.mini-navbar .nav li:focus > .nav-second-level {\\r\\n display: block;\\r\\n height: auto;\\r\\n}\\r\\n\\r\\nbody.canvas-menu.mini-navbar .navbar-default .nav > li > .nav-second-level li a {\\r\\n font-size: 13px;\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n.fixed-sidebar.mini-navbar .nav-second-level li a,\\r\\n.canvas-menu.mini-navbar .nav-second-level li a {\\r\\n padding: 10px 10px 10px 15px;\\r\\n}\\r\\n\\r\\n.fixed-sidebar.mini-navbar .nav-second-level,\\r\\n.canvas-menu.mini-navbar .nav-second-level {\\r\\n position: relative;\\r\\n padding: 0;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.fixed-sidebar.mini-navbar li.active .nav-second-level,\\r\\n.canvas-menu.mini-navbar li.active .nav-second-level {\\r\\n left: 0px\\r\\n}\\r\\n\\r\\nbody.fixed-sidebar.mini-navbar .navbar-default .nav > li > a,\\r\\nbody.canvas-menu.mini-navbar .navbar-default .nav > li > a {\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\nbody.fixed-sidebar.mini-navbar .nav-label,\\r\\nbody.fixed-sidebar.mini-navbar .navbar-default .nav li a span,\\r\\nbody.canvas-menu.mini-navbar .nav-label,\\r\\nbody.canvas-menu.mini-navbar .navbar-default .nav li a span {\\r\\n display: inline;\\r\\n}\\r\\n\\r\\nbody.canvas-menu.mini-navbar .navbar-default .nav li .profile-element a span {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.canvas-menu.mini-navbar .nav-second-level li a,\\r\\n.fixed-sidebar.mini-navbar .nav-second-level li a {\\r\\n padding: 7px 10px 7px 52px\\r\\n}\\r\\n\\r\\n.fixed-sidebar.mini-navbar .nav-second-level,\\r\\n.canvas-menu.mini-navbar .nav-second-level {\\r\\n left: 0px\\r\\n}\\r\\n\\r\\nbody.canvas-menu nav.navbar-static-side {\\r\\n z-index: 1001;\\r\\n background: $nav-bg;\\r\\n height: 100%;\\r\\n position: fixed;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n\\r\\nbody.canvas-menu.mini-navbar nav.navbar-static-side {\\r\\n display: block;\\r\\n width: 220px;\\r\\n}\\r\\n\",\"// Font\\r\\n$font-stack: \\\"Manrope\\\", \\\"Manrope\\\", Helvetica, Arial, sans-serif;\\r\\n\\r\\n// Basic Colors\\r\\n$fp-yellow: #291972; // New Delinea Primary Purple\\r\\n$fp-dark-gray: #121321;\\r\\n$delinea-purple: #231556; // Delinea Brand Purple\\r\\n$delinea-green: #00FF5A; // Delinea primary green for button text\\r\\n$fp-light-gray: #C2C4CC;\\r\\n$fp-gray-report: #EEEFF2;\\r\\n$fp-gray-panel: #D2D1DB;\\r\\n$fp-gray-pager: #9E9CAF;\\r\\n$fp-dark-gray-pager: #6D6B80;\\r\\n$fp-purple: #291972; // New Delinea Primary Purple\\r\\n$fp-dark-purple: #FFFFFF; // New Delinea Dark Purple\\r\\n$light-green: #BAFCD4; // New Delinea Success bg\\r\\n$dark-green: #007138; // New Delinea Success text, icon, border\\r\\n\\r\\n$fp-light-orange: #FFD7B8; // New Delinea Warning Background\\r\\n$fp-burnt-orange: #882200; // New Delinea Warning text, icon, border\\r\\n$fp-light-yellow: #FFF0BE; // New Delinea Caution background\\r\\n$fp-gold: #664b00; // New Delinea Caution text, icon, border\\r\\n\\r\\n// fp labels and badges\\r\\n// gray\\r\\n$fp-label-gray-bg: $fp-gray-report;\\r\\n$fp-label-gray-border: $fp-dark-gray;\\r\\n$fp-label-gray-text: $fp-dark-gray;\\r\\n\\r\\n// red\\r\\n$fp-label-red-bg: #FFD5D6; // New Delinea Error bg\\r\\n$fp-label-red-border: #F91D21; // New Delinea Error text, icon, border\\r\\n$fp-label-red-text: #BA0003; // New Delinea Error text\\r\\n\\r\\n// orange\\r\\n$fp-label-orange-bg: #FFD7B8;\\r\\n$fp-label-orange-border: #FF8120;\\r\\n$fp-label-orange-text: #882200;\\r\\n\\r\\n// yellow\\r\\n$fp-label-yellow-bg: #FFF0BE;\\r\\n$fp-label-yellow-border: #FFD942;\\r\\n$fp-label-yellow-text: #664b00;\\r\\n\\r\\n// green\\r\\n$fp-label-green-bg: #BAFCD4;\\r\\n$fp-label-green-border: #007138;\\r\\n$fp-label-green-text: #007138;\\r\\n\\r\\n// blue\\r\\n$fp-label-blue-bg: #93DEFF;\\r\\n$fp-label-blue-border: #0359A6;\\r\\n$fp-label-blue-text: #0359A6;\\r\\n\\r\\n// purple\\r\\n$fp-label-purple-bg: #E2E2F3;\\r\\n$fp-label-purple-border: #231556;\\r\\n$fp-label-purple-text: #231556;\\r\\n\\r\\n// pink\\r\\n$fp-label-pink-bg: #FDC4EE;\\r\\n$fp-label-pink-border: #7F1A86;\\r\\n$fp-label-pink-text: #7F1A86;\\r\\n\\r\\n\\r\\n// Updated to corresponding Delinea Hex, name does not represent proper color\\r\\n$navy: #291972; // Primary purple color\\r\\n$dark-gray: #c2c2c2; // Default color\\r\\n$blue: #007138; // Success color\\r\\n$lazur: #FFD942; // Info color\\r\\n$yellow: #FF8120; // Warning color\\r\\n$red: #BA0003; // Danger color\\r\\n\\r\\n// Various colors\\r\\n$text-color: #121321; // Body text\\r\\n$gray: #f3f3f4; // Background wrapper color\\r\\n$light-gray: #d1dade; // Default label, badget\\r\\n$label-badget-color: #5e5e5e;\\r\\n$light-blue: #f3f6fb;\\r\\n\\r\\n// Spiner color and margin\\r\\n$spin-color: $navy;\\r\\n$spin-margin: 0 auto;\\r\\n\\r\\n// IBOX colors ( default panel colors)\\r\\n$border-color: #C2C4CC; // IBox border\\r\\n$ibox-title-bg: white; // IBox Background header\\r\\n$ibox-content-bg: white; // IBox Background content\\r\\n\\r\\n//Sidebar width\\r\\n$sidebar-width: 220px;\\r\\n\\r\\n// Boxed layout width\\r\\n$boxed-width: 1200px;\\r\\n$boxed-backgound: image-url(\\\"patterns/shattered.png\\\");\\r\\n\\r\\n//Border radius for buttons\\r\\n$btn-border-radius: 20px;\\r\\n\\r\\n//Navigation\\r\\n$nav-bg: $delinea-purple;\\r\\n$nav-profil-pattern: image-url(\\\"patterns/header-profile.png\\\") no-repeat;\\r\\n$nav-text-color: #FFFFFF;\\r\\n\",\".top-navigation #page-wrapper {\\r\\n margin-left: 0;\\r\\n}\\r\\n\\r\\n\\r\\n.top-navigation .navbar-nav .dropdown-menu > .active > a {\\r\\n background: white;\\r\\n color: $navy;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.white-bg .navbar-fixed-top, .white-bg .navbar-static-top {\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.top-navigation .navbar {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.top-navigation .nav > li > a {\\r\\n padding: 15px 20px;\\r\\n color: #676a6c;\\r\\n}\\r\\n\\r\\n.top-navigation .nav > li a:hover, .top-navigation .nav > li a:focus {\\r\\n background: #fff;\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n.top-navigation .nav > li.active {\\r\\n background: #fff;\\r\\n border: none;\\r\\n}\\r\\n.top-navigation .nav > li.active > a {\\r\\n color: $navy;\\r\\n}\\r\\n.top-navigation .navbar-right {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.top-navigation .navbar-nav .dropdown-menu {\\r\\n box-shadow: none;\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.top-navigation .dropdown-menu > li > a {\\r\\n margin: 0;\\r\\n padding: 7px 20px;\\r\\n}\\r\\n\\r\\n.navbar .dropdown-menu {\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.top-navigation .navbar-brand {\\r\\n background: $navy;\\r\\n color: #fff;\\r\\n padding: 15px 25px;\\r\\n}\\r\\n\\r\\n.top-navigation .navbar-top-links li:last-child {\\r\\n margin-right: 0;\\r\\n}\\r\\n\\r\\n.top-navigation.mini-navbar #page-wrapper,\\r\\n.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,\\r\\n.mini-navbar .top-navigation #page-wrapper,\\r\\n.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,\\r\\n.canvas-menu #page-wrapper {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.top-navigation.fixed-nav #wrapper, .fixed-nav #wrapper.top-navigation {\\r\\n margin-top: 50px;\\r\\n}\\r\\n\\r\\n.top-navigation .footer.fixed {\\r\\n margin-left: 0 !important;\\r\\n}\\r\\n\\r\\n.top-navigation .wrapper.wrapper-content {\\r\\n padding: 40px;\\r\\n}\\r\\n.top-navigation.body-small .wrapper.wrapper-content, .body-small .top-navigation .wrapper.wrapper-content {\\r\\n padding: 40px 0px 40px 0px;\\r\\n}\\r\\n\\r\\n.navbar-toggle {\\r\\n background-color: $navy;\\r\\n color: #fff;\\r\\n padding: 6px 12px;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.top-navigation .navbar-nav .open .dropdown-menu > li > a, .top-navigation .navbar-nav .open .dropdown-menu .dropdown-header {\\r\\n padding: 10px 15px 10px 20px;\\r\\n}\\r\\n\\r\\n@media (max-width: 768px) {\\r\\n .top-navigation .navbar-header {\\r\\n display: block;\\r\\n float: none;\\r\\n }\\r\\n}\\r\\n\\r\\n.menu-visible-lg, .menu-visible-md {\\r\\n display: none !important;\\r\\n}\\r\\n\\r\\n@media (min-width: 1200px) {\\r\\n .menu-visible-lg {\\r\\n display: block !important;\\r\\n }\\r\\n}\\r\\n@media (min-width: 992px) {\\r\\n .menu-visible-md {\\r\\n display: block !important;\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 767px) {\\r\\n .menu-visible-md {\\r\\n display: block !important;\\r\\n }\\r\\n .menu-visible-lg {\\r\\n display: block !important;\\r\\n }\\r\\n}\",\".btn {\\r\\n border-radius: $btn-border-radius;\\r\\n}\\r\\n\\r\\n.float-e-margins .btn {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.btn-w-m {\\r\\n min-width: 120px;\\r\\n}\\r\\n\\r\\n.btn-primary.btn-outline {\\r\\n color: $fp-yellow;\\r\\n}\\r\\n\\r\\n.btn-success.btn-outline {\\r\\n color: $blue;\\r\\n}\\r\\n\\r\\n.btn-info.btn-outline {\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.btn-warning.btn-outline {\\r\\n color: $yellow;\\r\\n}\\r\\n\\r\\n.btn-danger.btn-outline {\\r\\n color: $red;\\r\\n}\\r\\n\\r\\n.btn-primary.btn-outline:hover,\\r\\n.btn-success.btn-outline:hover,\\r\\n.btn-info.btn-outline:hover,\\r\\n.btn-warning.btn-outline:hover,\\r\\n.btn-danger.btn-outline:hover {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-primary {\\r\\n background-color: $fp-yellow;\\r\\n border-color: $fp-yellow;\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary:active:focus, .btn-primary.active, .btn-primary.active:focus, .open .dropdown-toggle.btn-primary {\\r\\n background-color: #261769;\\r\\n border-color: #261769;\\r\\n color: $delinea-green;\\r\\n}\\r\\n\\r\\n.btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled]:active, .btn-primary.active[disabled], fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active {\\r\\n opacity: 60%;\\r\\n}\\r\\n\\r\\n.btn-success {\\r\\n background-color: $blue;\\r\\n border-color: $blue;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success {\\r\\n background-color: darken($blue, 3%);\\r\\n border-color: darken($blue, 3%);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success.active[disabled], fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active {\\r\\n background-color: lighten($blue, 4%);\\r\\n border-color: lighten($blue, 4%);\\r\\n}\\r\\n\\r\\n.btn-info {\\r\\n background-color: $fp-purple;\\r\\n border-color: $fp-purple;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info {\\r\\n background-color: darken($fp-purple, 3%);\\r\\n border-color: darken($fp-purple, 3%);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, .btn-info.active[disabled], fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active {\\r\\n background-color: lighten($lazur, 4%);\\r\\n border-color: lighten($lazur, 4%);\\r\\n}\\r\\n\\r\\n.btn-default {\\r\\n background-color: $fp-purple;\\r\\n border-color: transparent;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {\\r\\n background-color: darken($fp-purple, 4%);\\r\\n color: $delinea-green;\\r\\n}\\r\\n\\r\\n.btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled]:active, .btn-default.active[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active {\\r\\n background-color: lighten($fp-purple, 4%);\\r\\n}\\r\\n\\r\\n.btn-warning {\\r\\n background-color: $yellow;\\r\\n border-color: $yellow;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning {\\r\\n background-color: darken($yellow, 3%);\\r\\n border-color: darken($yellow, 3%);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled]:active, .btn-warning.active[disabled], fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active {\\r\\n background-color: lighten($yellow, 4%);\\r\\n border-color: lighten($yellow, 4%);\\r\\n}\\r\\n\\r\\n.btn-danger {\\r\\n background-color: $red;\\r\\n border-color: transparent;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger {\\r\\n background-color: darken($red, 4%);\\r\\n color: $fp-label-red-bg;\\r\\n}\\r\\n\\r\\n.btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled]:active, .btn-danger.active[disabled], fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active {\\r\\n background-color: lighten($red, 4%);\\r\\n border-color: lighten($red, 4%);\\r\\n}\\r\\n\\r\\n.btn-link {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.btn-link:hover, .btn-link:focus, .btn-link:active, .btn-link.active, .open .dropdown-toggle.btn-link {\\r\\n color: $fp-dark-gray;\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n.btn-link:active, .btn-link.active, .open .dropdown-toggle.btn-link {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-link.disabled, .btn-link.disabled:hover, .btn-link.disabled:focus, .btn-link.disabled:active, .btn-link.disabled.active, .btn-link[disabled], .btn-link[disabled]:hover, .btn-link[disabled]:focus, .btn-link[disabled]:active, .btn-link.active[disabled], fieldset[disabled] .btn-link, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus, fieldset[disabled] .btn-link:active, fieldset[disabled] .btn-link.active {\\r\\n color: #cacaca;\\r\\n}\\r\\n\\r\\n.btn-white {\\r\\n color: inherit;\\r\\n background: white;\\r\\n border: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.btn-white:hover, .btn-white:focus, .btn-white:active, .btn-white.active, .open .dropdown-toggle.btn-white {\\r\\n color: inherit;\\r\\n border: 1px solid #d2d2d2;\\r\\n}\\r\\n\\r\\n.btn-white:active, .btn-white.active {\\r\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;\\r\\n}\\r\\n\\r\\n.btn-white:active, .btn-white.active, .open .dropdown-toggle.btn-white {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n.btn-white.disabled, .btn-white.disabled:hover, .btn-white.disabled:focus, .btn-white.disabled:active, .btn-white.disabled.active, .btn-white[disabled], .btn-white[disabled]:hover, .btn-white[disabled]:focus, .btn-white[disabled]:active, .btn-white.active[disabled], fieldset[disabled] .btn-white, fieldset[disabled] .btn-white:hover, fieldset[disabled] .btn-white:focus, fieldset[disabled] .btn-white:active, fieldset[disabled] .btn-white.active {\\r\\n color: #cacaca;\\r\\n}\\r\\n\\r\\n.form-control, .form-control:focus, .has-error .form-control:focus, .has-success .form-control:focus, .has-warning .form-control:focus, .navbar-collapse, .navbar-form, .navbar-form-custom .form-control:focus, .navbar-form-custom .form-control:hover, .open .btn.dropdown-toggle, .panel, .popover, .progress, .progress-bar {\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.btn-outline {\\r\\n color: inherit;\\r\\n background-color: transparent;\\r\\n transition: all 0.5s;\\r\\n}\\r\\n\\r\\n.btn-rounded {\\r\\n border-radius: 50px;\\r\\n}\\r\\n\\r\\n.btn-large-dim {\\r\\n width: 90px;\\r\\n height: 90px;\\r\\n font-size: 42px;\\r\\n}\\r\\n\\r\\nbutton.dim {\\r\\n display: inline-block;\\r\\n color: white;\\r\\n text-decoration: none;\\r\\n text-transform: uppercase;\\r\\n text-align: center;\\r\\n padding-top: 6px;\\r\\n margin-right: 10px;\\r\\n position: relative;\\r\\n cursor: pointer;\\r\\n border-radius: 5px;\\r\\n font-weight: 600;\\r\\n margin-bottom: 20px !important;\\r\\n}\\r\\n\\r\\nbutton.dim:active {\\r\\n top: 3px;\\r\\n}\\r\\n\\r\\nbutton.btn-primary.dim {\\r\\n box-shadow: inset 0px 0px 0px darken($fp-yellow, 6%), 0px 5px 0px 0px darken($fp-yellow, 6%), 0px 10px 5px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-primary.dim:active {\\r\\n box-shadow: inset 0px 0px 0px darken($fp-yellow, 6%), 0px 2px 0px 0px darken($fp-yellow, 6%), 0px 5px 3px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-default.dim {\\r\\n box-shadow: inset 0px 0px 0px darken($dark-gray, 6%), 0px 5px 0px 0px darken($dark-gray, 6%), 0px 10px 5px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-default.dim:active {\\r\\n box-shadow: inset 0px 0px 0px darken($dark-gray, 6%), 0px 2px 0px 0px darken($dark-gray, 6%), 0px 5px 3px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-warning.dim {\\r\\n box-shadow: inset 0px 0px 0px darken($yellow, 6%), 0px 5px 0px 0px darken($yellow, 6%), 0px 10px 5px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-warning.dim:active {\\r\\n box-shadow: inset 0px 0px 0px darken($yellow, 6%), 0px 2px 0px 0px darken($yellow, 6%), 0px 5px 3px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-info.dim {\\r\\n box-shadow: inset 0px 0px 0px darken($lazur, 6%), 0px 5px 0px 0px darken($lazur, 6%), 0px 10px 5px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-info.dim:active {\\r\\n box-shadow: inset 0px 0px 0px darken($lazur, 6%), 0px 2px 0px 0px darken($lazur, 6%), 0px 5px 3px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-success.dim {\\r\\n box-shadow: inset 0px 0px 0px darken($blue, 6%), 0px 5px 0px 0px darken($blue, 6%), 0px 10px 5px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-success.dim:active {\\r\\n box-shadow: inset 0px 0px 0px darken($blue, 6%), 0px 2px 0px 0px darken($blue, 6%), 0px 5px 3px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-danger.dim {\\r\\n box-shadow: inset 0px 0px 0px darken($red, 6%), 0px 5px 0px 0px darken($red, 6%), 0px 10px 5px #999999;\\r\\n}\\r\\n\\r\\nbutton.btn-danger.dim:active {\\r\\n box-shadow: inset 0px 0px 0px darken($red, 6%), 0px 2px 0px 0px darken($red, 6%), 0px 5px 3px #999999;\\r\\n}\\r\\n\\r\\nbutton.dim:before {\\r\\n font-size: 50px;\\r\\n line-height: 1em;\\r\\n font-weight: normal;\\r\\n color: white;\\r\\n display: block;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\nbutton.dim:active:before {\\r\\n top: 7px;\\r\\n font-size: 50px;\\r\\n}\\r\\n\",\".label {\\r\\n background-color: $fp-label-gray-bg;\\r\\n color: $fp-label-gray-text;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n font-family: \\\"Manrope\\\";\\r\\n font-size: 10px;\\r\\n padding: 4px 10px;\\r\\n border-radius: 8px;\\r\\n text-shadow: none;\\r\\n}\\r\\n\\r\\n.badge {\\r\\n background-color: $fp-label-gray-bg;\\r\\n color: $fp-label-gray-text;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n font-family: \\\"Manrope\\\";\\r\\n font-size: 11px;\\r\\n font-weight: 600;\\r\\n padding-bottom: 4px;\\r\\n padding-left: 6px;\\r\\n padding-right: 6px;\\r\\n text-shadow: none;\\r\\n }\\r\\n\\r\\n.label-primary, .badge-primary {\\r\\n background-color: $fp-purple;\\r\\n color: white;\\r\\n border: 1px solid $delinea-purple;\\r\\n }\\r\\n\\r\\n.label-success, .badge-success {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n }\\r\\n\\r\\n.label-warning, .badge-warning {\\r\\n background-color: $fp-label-orange-bg;\\r\\n color: $fp-label-orange-text;\\r\\n border: 1px solid $fp-label-orange-border;\\r\\n }\\r\\n\\r\\n.label-warning-light, .badge-warning-light {\\r\\n background-color: $fp-label-orange-bg;\\r\\n color: $fp-label-orange-text;\\r\\n border: 1px solid $fp-label-orange-border;\\r\\n }\\r\\n\\r\\n.label-danger, .badge-danger {\\r\\n background-color: $fp-label-red-bg;\\r\\n color: $fp-label-red-text;\\r\\n border: 1px solid $fp-label-red-border;\\r\\n}\\r\\n\\r\\n.label-info, .badge-info {\\r\\n background-color: $fp-label-yellow-bg;\\r\\n color: $fp-label-yellow-text;\\r\\n border: 1px solid $fp-label-yellow-border;\\r\\n }\\r\\n\\r\\n.label-inverse, .badge-inverse {\\r\\n background-color: #262626;\\r\\n color: white;\\r\\n }\\r\\n\\r\\n.label-white, .badge-white {\\r\\n background-color: white;\\r\\n color: #5e5e5e;\\r\\n }\\r\\n\\r\\n.label-white, .badge-disable {\\r\\n background-color: #2a2e36;\\r\\n color: #8b91a0;\\r\\n }\\r\\n\",\"/* TOOGLE SWICH */\\r\\n\\r\\n.onoffswitch {\\r\\n position: relative;\\r\\n width: 64px;\\r\\n -webkit-user-select: none;\\r\\n -moz-user-select: none;\\r\\n -ms-user-select: none;\\r\\n}\\r\\n\\r\\n.onoffswitch-checkbox {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.onoffswitch-label {\\r\\n display: block;\\r\\n overflow: hidden;\\r\\n cursor: pointer;\\r\\n border: 2px solid $navy;\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner {\\r\\n width: 200%;\\r\\n margin-left: -100%;\\r\\n -moz-transition: margin 0.3s ease-in 0s;\\r\\n -webkit-transition: margin 0.3s ease-in 0s;\\r\\n -o-transition: margin 0.3s ease-in 0s;\\r\\n transition: margin 0.3s ease-in 0s;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner:before, .onoffswitch-inner:after {\\r\\n float: left;\\r\\n width: 50%;\\r\\n height: 20px;\\r\\n padding: 0;\\r\\n line-height: 20px;\\r\\n font-size: 12px;\\r\\n color: white;\\r\\n font-family: Trebuchet, Arial, sans-serif;\\r\\n font-weight: bold;\\r\\n -moz-box-sizing: border-box;\\r\\n -webkit-box-sizing: border-box;\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner:before {\\r\\n content: \\\"ON\\\";\\r\\n padding-left: 10px;\\r\\n background-color: $navy;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner:after {\\r\\n content: \\\"OFF\\\";\\r\\n padding-right: 10px;\\r\\n background-color: white;\\r\\n color: #999999;\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.onoffswitch-switch {\\r\\n width: 20px;\\r\\n margin: 0px;\\r\\n background: white;\\r\\n border: 2px solid $navy;\\r\\n border-radius: 2px;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n right: 44px;\\r\\n -moz-transition: all 0.3s ease-in 0s;\\r\\n -webkit-transition: all 0.3s ease-in 0s;\\r\\n -o-transition: all 0.3s ease-in 0s;\\r\\n transition: all 0.3s ease-in 0s;\\r\\n}\\r\\n\\r\\n.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {\\r\\n margin-left: 0;\\r\\n}\\r\\n\\r\\n.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {\\r\\n right: 0px;\\r\\n}\\r\\n\\r\\n/* CHOSEN PLUGIN */\\r\\n\\r\\n.chosen-container-single .chosen-single {\\r\\n background: white;\\r\\n box-shadow: none;\\r\\n -moz-box-sizing: border-box;\\r\\n background-color: white;\\r\\n border: 1px solid #cbd5dd;\\r\\n border-radius: 2px;\\r\\n cursor: text;\\r\\n height: auto !important;\\r\\n margin: 0;\\r\\n min-height: 30px;\\r\\n overflow: hidden;\\r\\n padding: 4px 12px;\\r\\n position: relative;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.chosen-container-multi .chosen-choices li.search-choice {\\r\\n background: #f1f1f1;\\r\\n border: 1px solid #ededed;\\r\\n border-radius: 2px;\\r\\n box-shadow: none;\\r\\n color: #333333;\\r\\n cursor: default;\\r\\n line-height: 13px;\\r\\n margin: 3px 0 3px 5px;\\r\\n padding: 3px 20px 3px 5px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n/* PAGINATIN */\\r\\n\\r\\n.pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus {\\r\\n color: #fff;\\r\\n background-color: #291972;\\r\\n border-color: #291972;\\r\\n cursor: default;\\r\\n z-index: 2;\\r\\n}\\r\\n\\r\\n.pagination > li > a, .pagination > li > span {\\r\\n background-color: white;\\r\\n border: 1px solid #dddddd;\\r\\n color: inherit;\\r\\n float: left;\\r\\n line-height: 1.42857;\\r\\n margin-left: -1px;\\r\\n padding: 4px 10px;\\r\\n position: relative;\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n/* TOOLTIPS */\\r\\n\\r\\n.tooltip-inner {\\r\\n background-color: $fp-purple;\\r\\n}\\r\\n\\r\\n.tooltip.top .tooltip-arrow {\\r\\n border-top-color: #2f4050;\\r\\n}\\r\\n\\r\\n.tooltip.right .tooltip-arrow {\\r\\n border-right-color: #2f4050;\\r\\n}\\r\\n\\r\\n.tooltip.bottom .tooltip-arrow {\\r\\n border-bottom-color: #2f4050;\\r\\n}\\r\\n\\r\\n.tooltip.left .tooltip-arrow {\\r\\n border-left-color: #2f4050;\\r\\n}\\r\\n\\r\\n/* EASY PIE CHART */\\r\\n\\r\\n.easypiechart {\\r\\n position: relative;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.easypiechart .h2 {\\r\\n margin-left: 10px;\\r\\n margin-top: 10px;\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.easypiechart canvas {\\r\\n top: 0;\\r\\n left: 0;\\r\\n}\\r\\n\\r\\n.easypiechart .easypie-text {\\r\\n line-height: 1;\\r\\n position: absolute;\\r\\n top: 33px;\\r\\n width: 100%;\\r\\n z-index: 1;\\r\\n}\\r\\n\\r\\n.easypiechart img {\\r\\n margin-top: -4px;\\r\\n}\\r\\n\\r\\n.jqstooltip {\\r\\n -webkit-box-sizing: content-box;\\r\\n -moz-box-sizing: content-box;\\r\\n box-sizing: content-box;\\r\\n}\\r\\n\\r\\n/* FULLCALENDAR */\\r\\n\\r\\n.fc-state-default {\\r\\n background-color: white;\\r\\n background-image: none;\\r\\n background-repeat: repeat-x;\\r\\n box-shadow: none;\\r\\n color: #333333;\\r\\n text-shadow: none;\\r\\n}\\r\\n\\r\\n.fc-state-default {\\r\\n border: 1px solid;\\r\\n}\\r\\n\\r\\n.fc-button {\\r\\n color: inherit;\\r\\n border: 1px solid $border-color;\\r\\n cursor: pointer;\\r\\n display: inline-block;\\r\\n height: 1.9em;\\r\\n line-height: 1.9em;\\r\\n overflow: hidden;\\r\\n padding: 0 0.6em;\\r\\n position: relative;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.fc-state-active {\\r\\n background-color: $navy;\\r\\n border-color: $navy;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.fc-header-title h2 {\\r\\n font-size: 16px;\\r\\n font-weight: 600;\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.fc-content .fc-widget-header, .fc-content .fc-widget-content {\\r\\n border-color: $border-color;\\r\\n font-weight: normal;\\r\\n}\\r\\n\\r\\n.fc-border-separate tbody {\\r\\n background-color: #f8f8f8;\\r\\n}\\r\\n\\r\\n.fc-state-highlight {\\r\\n background: none repeat scroll 0 0 #fcf8e3;\\r\\n}\\r\\n\\r\\n.external-event {\\r\\n padding: 5px 10px;\\r\\n border-radius: 2px;\\r\\n cursor: pointer;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.fc-ltr .fc-event-hori.fc-event-end, .fc-rtl .fc-event-hori.fc-event-start {\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\n.fc-event,\\r\\n.fc-agenda .fc-event-time,\\r\\n.fc-event a {\\r\\n padding: 4px 6px;\\r\\n background-color: $navy;\\r\\n border-color: $navy;\\r\\n}\\r\\n\\r\\n.fc-event-time, .fc-event-title {\\r\\n color: #717171;\\r\\n padding: 0 1px;\\r\\n}\\r\\n\\r\\n.ui-calendar .fc-event-time, .ui-calendar .fc-event-title {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n/* Chat */\\r\\n.chat-activity-list .chat-element {\\r\\n border-bottom: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.chat-element:first-child {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n.chat-element {\\r\\n padding-bottom: 15px;\\r\\n}\\r\\n\\r\\n.chat-element, .chat-element .media {\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n.chat-element, .media-body {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.chat-element .media-body {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.media-body {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.chat-element > .pull-left {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.chat-element img.img-circle, .dropdown-messages-box img.img-circle {\\r\\n width: 38px;\\r\\n height: 38px;\\r\\n}\\r\\n\\r\\n.chat-element .well {\\r\\n border: 1px solid $border-color;\\r\\n box-shadow: none;\\r\\n margin-top: 10px;\\r\\n margin-bottom: 5px;\\r\\n padding: 10px 20px;\\r\\n font-size: 11px;\\r\\n line-height: 16px;\\r\\n}\\r\\n\\r\\n.chat-element .actions {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.chat-element .photos {\\r\\n margin: 10px 0;\\r\\n}\\r\\n\\r\\n.right.chat-element > .pull-right {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.chat-photo {\\r\\n max-height: 180px;\\r\\n border-radius: 4px;\\r\\n overflow: hidden;\\r\\n margin-right: 10px;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.chat {\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n list-style: none;\\r\\n}\\r\\n\\r\\n.chat li {\\r\\n margin-bottom: 10px;\\r\\n padding-bottom: 5px;\\r\\n border-bottom: 1px dotted #b3a9a9;\\r\\n}\\r\\n\\r\\n.chat li.left .chat-body {\\r\\n margin-left: 60px;\\r\\n}\\r\\n\\r\\n.chat li.right .chat-body {\\r\\n margin-right: 60px;\\r\\n}\\r\\n\\r\\n.chat li .chat-body p {\\r\\n margin: 0;\\r\\n color: #777777;\\r\\n}\\r\\n\\r\\n.panel .slidedown .glyphicon,\\r\\n.chat .glyphicon {\\r\\n margin-right: 5px;\\r\\n}\\r\\n\\r\\n.chat-panel .panel-body {\\r\\n height: 350px;\\r\\n overflow-y: scroll;\\r\\n}\\r\\n\\r\\n/* LIST GROUP */\\r\\n\\r\\na.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus {\\r\\n background-color: $navy;\\r\\n border-color: $navy;\\r\\n color: white;\\r\\n z-index: 2;\\r\\n}\\r\\n\\r\\n.list-group-item-heading {\\r\\n margin-top: 10px;\\r\\n color: $delinea-purple;\\r\\n}\\r\\n\\r\\n.list-group-item-text {\\r\\n margin: 0 0 10px;\\r\\n color: $delinea-purple;\\r\\n font-size: 12px;\\r\\n line-height: inherit;\\r\\n}\\r\\n\\r\\n.no-padding .list-group-item {\\r\\n border-left: none;\\r\\n border-right: none;\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.no-padding .list-group-item:first-child {\\r\\n border-left: none;\\r\\n border-right: none;\\r\\n border-bottom: none;\\r\\n border-top: none;\\r\\n}\\r\\n\\r\\n.no-padding .list-group {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.list-group-item {\\r\\n background-color: inherit;\\r\\n border: 1px solid $border-color;\\r\\n display: block;\\r\\n margin-bottom: -1px;\\r\\n padding: 10px 15px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.elements-list .list-group-item {\\r\\n border-left: none;\\r\\n border-right: none;\\r\\n padding: 15px 25px;\\r\\n}\\r\\n\\r\\n.elements-list .list-group-item:first-child {\\r\\n border-left: none;\\r\\n border-right: none;\\r\\n border-top: none !important;\\r\\n}\\r\\n\\r\\n.elements-list .list-group {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.elements-list a {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.elements-list .list-group-item.active,\\r\\n.elements-list .list-group-item:hover {\\r\\n background: $gray;\\r\\n color: inherit;\\r\\n border-color: $border-color;\\r\\n border-radius: 0;\\r\\n}\\r\\n\\r\\n.elements-list li.active {\\r\\n transition: none;\\r\\n}\\r\\n\\r\\n.element-detail-box {\\r\\n padding: 25px;\\r\\n}\\r\\n\\r\\n\\r\\n/* FLOT CHART */\\r\\n\\r\\n.flot-chart {\\r\\n display: block;\\r\\n height: 200px;\\r\\n}\\r\\n\\r\\n.widget .flot-chart.dashboard-chart {\\r\\n display: block;\\r\\n height: 120px;\\r\\n margin-top: 40px;\\r\\n}\\r\\n\\r\\n.flot-chart.dashboard-chart {\\r\\n display: block;\\r\\n height: 180px;\\r\\n margin-top: 40px;\\r\\n}\\r\\n\\r\\n.flot-chart-content {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.flot-chart-pie-content {\\r\\n width: 200px;\\r\\n height: 200px;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.jqstooltip {\\r\\n position: absolute;\\r\\n display: block;\\r\\n left: 0px;\\r\\n top: 0px;\\r\\n visibility: hidden;\\r\\n background: rgb(43, 48, 58);\\r\\n background-color: rgba(43, 48, 58, 0.8);\\r\\n color: white;\\r\\n text-align: left;\\r\\n white-space: nowrap;\\r\\n z-index: 10000;\\r\\n padding: 5px 5px 5px 5px;\\r\\n min-height: 22px;\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n.jqsfield {\\r\\n color: white;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.h-200 {\\r\\n min-height: 200px;\\r\\n}\\r\\n\\r\\n.legendLabel {\\r\\n padding-left: 5px;\\r\\n}\\r\\n\\r\\n.stat-list li:first-child {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n.stat-list {\\r\\n list-style: none;\\r\\n padding: 0;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.stat-percent {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.stat-list li {\\r\\n margin-top: 15px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n/* DATATABLES */\\r\\n\\r\\ntable.dataTable thead .sorting,\\r\\ntable.dataTable thead .sorting_asc:after,\\r\\ntable.dataTable thead .sorting_desc,\\r\\ntable.dataTable thead .sorting_asc_disabled,\\r\\ntable.dataTable thead .sorting_desc_disabled {\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\ntable.dataTable thead .sorting_asc:after {\\r\\n float: right;\\r\\n font-family: fontawesome;\\r\\n}\\r\\n\\r\\ntable.dataTable thead .sorting_desc:after {\\r\\n content: \\\"\\\\f0dd\\\";\\r\\n float: right;\\r\\n font-family: fontawesome;\\r\\n}\\r\\n\\r\\ntable.dataTable thead .sorting:after {\\r\\n content: \\\"\\\\f0dc\\\";\\r\\n float: right;\\r\\n font-family: fontawesome;\\r\\n color: rgba(50, 50, 50, 0.5);\\r\\n}\\r\\n\\r\\n.dataTables_wrapper {\\r\\n padding-bottom: 30px;\\r\\n}\\r\\n\\r\\n/* CIRCLE */\\r\\n\\r\\n.img-circle {\\r\\n border-radius: 50%;\\r\\n}\\r\\n\\r\\n.btn-circle {\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n padding: 6px 0;\\r\\n border-radius: 15px;\\r\\n text-align: center;\\r\\n font-size: 12px;\\r\\n line-height: 1.42857;\\r\\n}\\r\\n\\r\\n.btn-circle.btn-lg {\\r\\n width: 50px;\\r\\n height: 50px;\\r\\n padding: 10px 16px;\\r\\n border-radius: 25px;\\r\\n font-size: 18px;\\r\\n line-height: 1.33;\\r\\n}\\r\\n\\r\\n.btn-circle.btn-xl {\\r\\n width: 70px;\\r\\n height: 70px;\\r\\n padding: 10px 16px;\\r\\n border-radius: 35px;\\r\\n font-size: 24px;\\r\\n line-height: 1.33;\\r\\n}\\r\\n\\r\\n.show-grid [class^=\\\"col-\\\"] {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n border: 1px solid #dddddd;\\r\\n background-color: #eeeeee !important;\\r\\n}\\r\\n\\r\\n.show-grid {\\r\\n margin: 15px 0;\\r\\n}\\r\\n\\r\\n/* ANIMATION */\\r\\n\\r\\n.css-animation-box h1 {\\r\\n font-size: 44px;\\r\\n}\\r\\n\\r\\n.animation-efect-links a {\\r\\n padding: 4px 6px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n#animation_box {\\r\\n background-color: #f9f8f8;\\r\\n border-radius: 16px;\\r\\n width: 80%;\\r\\n margin: 0 auto;\\r\\n padding-top: 80px;\\r\\n}\\r\\n\\r\\n.animation-text-box {\\r\\n position: absolute;\\r\\n margin-top: 40px;\\r\\n left: 50%;\\r\\n margin-left: -100px;\\r\\n width: 200px;\\r\\n}\\r\\n\\r\\n.animation-text-info {\\r\\n position: absolute;\\r\\n margin-top: -60px;\\r\\n left: 50%;\\r\\n margin-left: -100px;\\r\\n width: 200px;\\r\\n font-size: 10px;\\r\\n}\\r\\n\\r\\n.animation-text-box h2 {\\r\\n font-size: 54px;\\r\\n font-weight: 600;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.animation-text-box p {\\r\\n font-size: 12px;\\r\\n text-transform: uppercase;\\r\\n}\\r\\n\\r\\n/* PEACE */\\r\\n\\r\\n.pace {\\r\\n -webkit-pointer-events: none;\\r\\n pointer-events: none;\\r\\n -webkit-user-select: none;\\r\\n -moz-user-select: none;\\r\\n user-select: none;\\r\\n}\\r\\n\\r\\n.pace-inactive {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.pace .pace-progress {\\r\\n background: $navy;\\r\\n position: fixed;\\r\\n z-index: 2000;\\r\\n top: 0;\\r\\n right: 100%;\\r\\n width: 100%;\\r\\n height: 2px;\\r\\n}\\r\\n\\r\\n.pace-inactive {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n/* WIDGETS */\\r\\n\\r\\n.widget {\\r\\n border-radius: 4px;\\r\\n padding: 15px 20px;\\r\\n margin-bottom: 10px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.widget.style1 h2 {\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\n.widget h2, .widget h3 {\\r\\n margin-top: 5px;\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.widget-text-box {\\r\\n padding: 20px;\\r\\n border: 1px solid $border-color;\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.widget-head-color-box {\\r\\n border-radius: 5px 5px 0px 0px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.widget .flot-chart {\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.vertical-align div {\\r\\n display: inline-block;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.vertical-align h2, .vertical-align h3 {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.todo-list {\\r\\n list-style: none outside none;\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.todo-list.small-list {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.todo-list.small-list > li {\\r\\n background: $gray;\\r\\n border-left: none;\\r\\n border-right: none;\\r\\n border-radius: 4px;\\r\\n color: inherit;\\r\\n margin-bottom: 2px;\\r\\n padding: 6px 6px 6px 12px;\\r\\n}\\r\\n\\r\\n.todo-list.small-list .btn-xs, .todo-list.small-list .btn-group-xs > .btn {\\r\\n border-radius: 5px;\\r\\n font-size: 10px;\\r\\n line-height: 1.5;\\r\\n padding: 1px 2px 1px 5px;\\r\\n}\\r\\n\\r\\n.todo-list > li {\\r\\n background: $gray;\\r\\n border-left: 6px solid $border-color;\\r\\n border-right: 6px solid $border-color;\\r\\n border-radius: 4px;\\r\\n color: inherit;\\r\\n margin-bottom: 2px;\\r\\n padding: 10px;\\r\\n}\\r\\n\\r\\n.todo-list .handle {\\r\\n cursor: move;\\r\\n display: inline-block;\\r\\n font-size: 16px;\\r\\n margin: 0 5px;\\r\\n}\\r\\n\\r\\n.todo-list > li .label {\\r\\n font-size: 9px;\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.check-link {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.todo-completed {\\r\\n text-decoration: line-through;\\r\\n}\\r\\n\\r\\n.geo-statistic h1 {\\r\\n font-size: 36px;\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.glyphicon.fa {\\r\\n font-family: \\\"FontAwesome\\\";\\r\\n}\\r\\n\\r\\n/* INPUTS */\\r\\n.inline {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.input-s-sm {\\r\\n width: 120px;\\r\\n}\\r\\n\\r\\n.input-s {\\r\\n width: 200px;\\r\\n}\\r\\n\\r\\n.input-s-lg {\\r\\n width: 250px;\\r\\n}\\r\\n\\r\\n.i-checks {\\r\\n padding-left: 0;\\r\\n}\\r\\n\\r\\n.form-control, .single-line {\\r\\n background-color: white;\\r\\n background-image: none;\\r\\n border: 1px solid #e5e6e7;\\r\\n border-radius: 1px;\\r\\n color: inherit;\\r\\n display: block;\\r\\n padding: 6px 12px;\\r\\n transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.form-control:focus, .single-line:focus {\\r\\n border-color: $navy !important;\\r\\n}\\r\\n\\r\\n.has-success .form-control {\\r\\n border-color: $navy;\\r\\n}\\r\\n\\r\\n.has-warning .form-control {\\r\\n border-color: $yellow;\\r\\n}\\r\\n\\r\\n.has-error .form-control {\\r\\n border-color: $red;\\r\\n}\\r\\n\\r\\n.has-success .control-label {\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n.has-warning .control-label {\\r\\n color: $yellow;\\r\\n}\\r\\n\\r\\n.has-error .control-label {\\r\\n color: $red;\\r\\n}\\r\\n\\r\\n.input-group-addon {\\r\\n background-color: white;\\r\\n border: 1px solid $border-color;\\r\\n border-radius: 4px;\\r\\n color: inherit;\\r\\n font-size: 14px;\\r\\n font-weight: 400;\\r\\n line-height: 1;\\r\\n padding: 6px 12px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.spinner-buttons.input-group-btn .btn-xs {\\r\\n line-height: 1.13;\\r\\n}\\r\\n\\r\\n.spinner-buttons.input-group-btn {\\r\\n width: 20%;\\r\\n}\\r\\n\\r\\n.noUi-connect {\\r\\n background: none repeat scroll 0 0 $navy;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.slider_red .noUi-connect {\\r\\n background: none repeat scroll 0 0 $red;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n/* UI Sortable */\\r\\n\\r\\n.ui-sortable .ibox-title {\\r\\n cursor: move;\\r\\n}\\r\\n\\r\\n.ui-sortable-placeholder {\\r\\n border: 1px dashed #cecece !important;\\r\\n visibility: visible !important;\\r\\n background: #C2C4CC;\\r\\n}\\r\\n\\r\\n.ibox.ui-sortable-placeholder {\\r\\n margin: 0px 0px 23px !important;\\r\\n}\\r\\n\\r\\n/* SWITCHES */\\r\\n.onoffswitch {\\r\\n position: relative;\\r\\n width: 54px;\\r\\n -webkit-user-select: none;\\r\\n -moz-user-select: none;\\r\\n -ms-user-select: none;\\r\\n}\\r\\n\\r\\n.onoffswitch-checkbox {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.onoffswitch-label {\\r\\n display: block;\\r\\n overflow: hidden;\\r\\n cursor: pointer;\\r\\n border: 2px solid #1ab394;\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner {\\r\\n display: block;\\r\\n width: 200%;\\r\\n margin-left: -100%;\\r\\n -moz-transition: margin 0.3s ease-in 0s;\\r\\n -webkit-transition: margin 0.3s ease-in 0s;\\r\\n -o-transition: margin 0.3s ease-in 0s;\\r\\n transition: margin 0.3s ease-in 0s;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner:before, .onoffswitch-inner:after {\\r\\n display: block;\\r\\n float: left;\\r\\n width: 50%;\\r\\n height: 16px;\\r\\n padding: 0;\\r\\n line-height: 16px;\\r\\n font-size: 10px;\\r\\n color: white;\\r\\n font-family: Trebuchet, Arial, sans-serif;\\r\\n font-weight: bold;\\r\\n -moz-box-sizing: border-box;\\r\\n -webkit-box-sizing: border-box;\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner:before {\\r\\n content: \\\"ON\\\";\\r\\n padding-left: 7px;\\r\\n background-color: #1ab394;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.onoffswitch-inner:after {\\r\\n content: \\\"OFF\\\";\\r\\n padding-right: 7px;\\r\\n background-color: white;\\r\\n color: #919191;\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.onoffswitch-switch {\\r\\n display: block;\\r\\n width: 18px;\\r\\n margin: 0px;\\r\\n background: white;\\r\\n border: 2px solid #1ab394;\\r\\n border-radius: 3px;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n right: 36px;\\r\\n -moz-transition: all 0.3s ease-in 0s;\\r\\n -webkit-transition: all 0.3s ease-in 0s;\\r\\n -o-transition: all 0.3s ease-in 0s;\\r\\n transition: all 0.3s ease-in 0s;\\r\\n}\\r\\n\\r\\n.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {\\r\\n margin-left: 0;\\r\\n}\\r\\n\\r\\n.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {\\r\\n right: 0px;\\r\\n}\\r\\n\\r\\n/* jqGrid */\\r\\n\\r\\n.ui-jqgrid {\\r\\n -moz-box-sizing: content-box;\\r\\n}\\r\\n\\r\\n.ui-jqgrid-btable {\\r\\n border-collapse: separate;\\r\\n}\\r\\n\\r\\n.ui-jqgrid-htable {\\r\\n border-collapse: separate;\\r\\n}\\r\\n\\r\\n.ui-jqgrid-titlebar {\\r\\n height: 40px;\\r\\n line-height: 15px;\\r\\n color: #676a6c;\\r\\n background-color: #f9f9f9;\\r\\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-jqgrid-title {\\r\\n float: left;\\r\\n margin: 1.1em 1em 0.2em;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-jqgrid-titlebar {\\r\\n position: relative;\\r\\n border-left: 0px solid;\\r\\n border-right: 0px solid;\\r\\n border-top: 0px solid;\\r\\n}\\r\\n\\r\\n.ui-widget-header {\\r\\n background: none;\\r\\n background-image: none;\\r\\n background-color: #f5f5f6;\\r\\n text-transform: uppercase;\\r\\n border-top-left-radius: 0px;\\r\\n border-top-right-radius: 0px;\\r\\n}\\r\\n\\r\\n.ui-jqgrid tr.ui-row-ltr td {\\r\\n border-right-color: inherit;\\r\\n border-right-style: solid;\\r\\n border-right-width: 1px;\\r\\n text-align: left;\\r\\n border-color: #dddddd;\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.ui-search-toolbar input[type=\\\"text\\\"] {\\r\\n font-size: 12px;\\r\\n height: 15px;\\r\\n border: 1px solid #cccccc;\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {\\r\\n background: #f9f9f9;\\r\\n border: 1px solid #dddddd;\\r\\n line-height: 15px;\\r\\n font-weight: bold;\\r\\n color: #676a6c;\\r\\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\\r\\n}\\r\\n\\r\\n.ui-widget-content {\\r\\n box-sizing: content-box;\\r\\n}\\r\\n\\r\\n.ui-icon-triangle-1-n {\\r\\n background-position: 1px -16px;\\r\\n}\\r\\n\\r\\n.ui-jqgrid tr.ui-search-toolbar th {\\r\\n border-top-width: 0px !important;\\r\\n border-top-color: inherit !important;\\r\\n border-top-style: ridge !important;\\r\\n}\\r\\n\\r\\n.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus {\\r\\n background: whitesmoke;\\r\\n border-collapse: separate;\\r\\n}\\r\\n\\r\\n.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {\\r\\n background: #f2fbff;\\r\\n}\\r\\n\\r\\n.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {\\r\\n border: 1px solid #dddddd;\\r\\n background: white;\\r\\n font-weight: normal;\\r\\n color: #212121;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-pg-input {\\r\\n font-size: inherit;\\r\\n width: 50px;\\r\\n border: 1px solid #cccccc;\\r\\n height: 15px;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-pg-selbox {\\r\\n display: block;\\r\\n font-size: 1em;\\r\\n height: 25px;\\r\\n line-height: 18px;\\r\\n margin: 0;\\r\\n width: auto;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-pager-control {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-jqgrid-pager {\\r\\n height: 32px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.ui-pg-table .navtable .ui-corner-all {\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-pg-button:hover {\\r\\n padding: 1px;\\r\\n border: 0px;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .loading {\\r\\n position: absolute;\\r\\n top: 45%;\\r\\n left: 45%;\\r\\n width: auto;\\r\\n height: auto;\\r\\n z-index: 101;\\r\\n padding: 6px;\\r\\n margin: 5px;\\r\\n text-align: center;\\r\\n font-weight: bold;\\r\\n display: none;\\r\\n border-width: 2px !important;\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .form-control {\\r\\n height: 10px;\\r\\n width: auto;\\r\\n display: inline;\\r\\n padding: 10px 12px;\\r\\n}\\r\\n\\r\\n.ui-jqgrid-pager {\\r\\n height: 32px;\\r\\n}\\r\\n\\r\\n.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl {\\r\\n border-top-left-radius: 0;\\r\\n}\\r\\n\\r\\n.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr {\\r\\n border-top-right-radius: 0;\\r\\n}\\r\\n\\r\\n.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl {\\r\\n border-bottom-left-radius: 0;\\r\\n}\\r\\n\\r\\n.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br {\\r\\n border-bottom-right-radius: 0;\\r\\n}\\r\\n\\r\\n.ui-widget-content {\\r\\n border: 1px solid #dddddd;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-jqgrid-titlebar {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.ui-jqgrid .ui-jqgrid-titlebar {\\r\\n border-bottom: 1px solid #dddddd;\\r\\n}\\r\\n\\r\\n.ui-jqgrid tr.jqgrow td {\\r\\n padding: 6px;\\r\\n}\\r\\n\\r\\n.ui-jqdialog .ui-jqdialog-titlebar {\\r\\n padding: 10px 10px;\\r\\n}\\r\\n\\r\\n.ui-jqdialog .ui-jqdialog-title {\\r\\n float: none !important;\\r\\n}\\r\\n\\r\\n.ui-jqdialog > .ui-resizable-se {\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n/* Nestable list */\\r\\n\\r\\n.dd {\\r\\n position: relative;\\r\\n display: block;\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n list-style: none;\\r\\n font-size: 13px;\\r\\n line-height: 20px;\\r\\n}\\r\\n\\r\\n.dd-list {\\r\\n display: block;\\r\\n position: relative;\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n list-style: none;\\r\\n}\\r\\n\\r\\n.dd-list .dd-list {\\r\\n padding-left: 30px;\\r\\n}\\r\\n\\r\\n.dd-collapsed .dd-list {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.dd-item,\\r\\n.dd-empty,\\r\\n.dd-placeholder {\\r\\n display: block;\\r\\n position: relative;\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n min-height: 20px;\\r\\n font-size: 13px;\\r\\n line-height: 20px;\\r\\n}\\r\\n\\r\\n.dd-handle {\\r\\n display: block;\\r\\n margin: 5px 0;\\r\\n padding: 5px 10px;\\r\\n color: #333333;\\r\\n text-decoration: none;\\r\\n border: 1px solid #C2C4CC;\\r\\n background: whitesmoke;\\r\\n -webkit-border-radius: 3px;\\r\\n border-radius: 3px;\\r\\n box-sizing: border-box;\\r\\n -moz-box-sizing: border-box;\\r\\n}\\r\\n\\r\\n.dd-handle span {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.dd-handle:hover {\\r\\n background: #f0f0f0;\\r\\n cursor: pointer;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.dd-item > button {\\r\\n display: block;\\r\\n position: relative;\\r\\n cursor: pointer;\\r\\n float: left;\\r\\n width: 25px;\\r\\n height: 20px;\\r\\n margin: 5px 0;\\r\\n padding: 0;\\r\\n text-indent: 100%;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n border: 0;\\r\\n background: transparent;\\r\\n font-size: 12px;\\r\\n line-height: 1;\\r\\n text-align: center;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.dd-item > button:before {\\r\\n content: \\\"+\\\";\\r\\n display: block;\\r\\n position: absolute;\\r\\n width: 100%;\\r\\n text-align: center;\\r\\n text-indent: 0;\\r\\n}\\r\\n\\r\\n.dd-item > button[data-action=\\\"collapse\\\"]:before {\\r\\n content: \\\"-\\\";\\r\\n}\\r\\n\\r\\n#nestable2 .dd-item > button {\\r\\n font-family: FontAwesome;\\r\\n height: 34px;\\r\\n width: 33px;\\r\\n color: #c1c1c1;\\r\\n}\\r\\n\\r\\n#nestable2 .dd-item > button:before {\\r\\n content: \\\"\\\\f067\\\";\\r\\n}\\r\\n\\r\\n#nestable2 .dd-item > button[data-action=\\\"collapse\\\"]:before {\\r\\n content: \\\"\\\\f068\\\";\\r\\n}\\r\\n\\r\\n.dd-placeholder,\\r\\n.dd-empty {\\r\\n margin: 5px 0;\\r\\n padding: 0;\\r\\n min-height: 30px;\\r\\n background: #f2fbff;\\r\\n border: 1px dashed #b6bcbf;\\r\\n box-sizing: border-box;\\r\\n -moz-box-sizing: border-box;\\r\\n}\\r\\n\\r\\n.dd-empty {\\r\\n border: 1px dashed #bbbbbb;\\r\\n min-height: 100px;\\r\\n background-color: #e5e5e5;\\r\\n background-image: -webkit-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white), -webkit-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white);\\r\\n background-image: -moz-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white), -moz-linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white);\\r\\n background-image: linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white), linear-gradient(45deg, white 25%, transparent 25%, transparent 75%, white 75%, white);\\r\\n background-size: 60px 60px;\\r\\n background-position: 0 0, 30px 30px;\\r\\n}\\r\\n\\r\\n.dd-dragel {\\r\\n position: absolute;\\r\\n z-index: 9999;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.dd-dragel > .dd-item .dd-handle {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n.dd-dragel .dd-handle {\\r\\n -webkit-box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);\\r\\n box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);\\r\\n}\\r\\n\\r\\n/* Nestable List */\\r\\n.nestable-lists {\\r\\n display: block;\\r\\n clear: both;\\r\\n padding: 30px 0;\\r\\n width: 100%;\\r\\n border: 0;\\r\\n border-top: 2px solid #dddddd;\\r\\n border-bottom: 2px solid #dddddd;\\r\\n}\\r\\n\\r\\n#nestable-menu {\\r\\n padding: 0;\\r\\n margin: 10px 0 20px 0;\\r\\n}\\r\\n\\r\\n#nestable-output,\\r\\n#nestable2-output {\\r\\n width: 100%;\\r\\n font-size: 0.75em;\\r\\n line-height: 1.33333em;\\r\\n font-family: open sans, lucida grande, lucida sans unicode, helvetica, arial, sans-serif;\\r\\n padding: 5px;\\r\\n box-sizing: border-box;\\r\\n -moz-box-sizing: border-box;\\r\\n}\\r\\n\\r\\n#nestable2 .dd-handle {\\r\\n color: inherit;\\r\\n border: 1px dashed #C2C4CC;\\r\\n background: #f3f3f4;\\r\\n padding: 10px;\\r\\n}\\r\\n\\r\\n#nestable2 span.label {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n#nestable-output,\\r\\n#nestable2-output {\\r\\n font-size: 12px;\\r\\n padding: 25px;\\r\\n box-sizing: border-box;\\r\\n -moz-box-sizing: border-box;\\r\\n}\\r\\n\\r\\n/* CodeMirror */\\r\\n.CodeMirror {\\r\\n border: 1px solid #eeeeee;\\r\\n height: auto;\\r\\n}\\r\\n\\r\\n.CodeMirror-scroll {\\r\\n overflow-y: hidden;\\r\\n overflow-x: auto;\\r\\n}\\r\\n\\r\\n/* Google Maps */\\r\\n.google-map {\\r\\n height: 300px;\\r\\n}\\r\\n\\r\\n/* Validation */\\r\\nlabel.error {\\r\\n color: #cc5965;\\r\\n display: inline-block;\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.form-control.error {\\r\\n border: 1px dotted #cc5965;\\r\\n}\\r\\n\\r\\n/* ngGrid */\\r\\n.gridStyle {\\r\\n border: 1px solid rgb(212, 212, 212);\\r\\n width: 100%;\\r\\n height: 400px;\\r\\n}\\r\\n\\r\\n.gridStyle2 {\\r\\n border: 1px solid rgb(212, 212, 212);\\r\\n width: 500px;\\r\\n height: 300px;\\r\\n}\\r\\n\\r\\n.ngHeaderCell {\\r\\n border-right: none;\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.ngCell {\\r\\n border-right: none;\\r\\n}\\r\\n\\r\\n.ngTopPanel {\\r\\n background: #f5f5f6;\\r\\n}\\r\\n\\r\\n.ngRow.even {\\r\\n background: #f9f9f9;\\r\\n}\\r\\n\\r\\n.ngRow.selected {\\r\\n background: #ebf2f1;\\r\\n}\\r\\n\\r\\n.ngRow {\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.ngCell {\\r\\n background-color: transparent;\\r\\n}\\r\\n\\r\\n.ngHeaderCell {\\r\\n border-right: none;\\r\\n}\\r\\n\\r\\n/* Toastr custom style */\\r\\n\\r\\n#toast-container > .toast {\\r\\n background-image: none !important;\\r\\n}\\r\\n\\r\\n#toast-container > .toast:before {\\r\\n position: fixed;\\r\\n font-family: FontAwesome;\\r\\n font-size: 24px;\\r\\n line-height: 24px;\\r\\n float: left;\\r\\n color: #FFF;\\r\\n padding-right: 0.5em;\\r\\n margin: auto 0.5em auto -1.5em;\\r\\n}\\r\\n\\r\\n#toast-container > .toast-warning:before {\\r\\n content: \\\"\\\\f0e7\\\";\\r\\n}\\r\\n\\r\\n#toast-container > .toast-error:before {\\r\\n content: \\\"\\\\f071\\\";\\r\\n}\\r\\n\\r\\n#toast-container > .toast-info:before {\\r\\n content: \\\"\\\\f005\\\";\\r\\n}\\r\\n\\r\\n#toast-container > .toast-success:before {\\r\\n content: \\\"\\\\f00C\\\";\\r\\n}\\r\\n\\r\\n#toast-container > div {\\r\\n -moz-box-shadow: 0 0 3px #999;\\r\\n -webkit-box-shadow: 0 0 3px #999;\\r\\n box-shadow: 0 0 3px #999;\\r\\n opacity: .9;\\r\\n -ms-filter: alpha(Opacity=90);\\r\\n filter: alpha(opacity=90)\\r\\n}\\r\\n\\r\\n#toast-container > :hover {\\r\\n -moz-box-shadow: 0 0 4px #999;\\r\\n -webkit-box-shadow: 0 0 4px #999;\\r\\n box-shadow: 0 0 4px #999;\\r\\n opacity: 1;\\r\\n -ms-filter: alpha(Opacity=100);\\r\\n filter: alpha(opacity=100);\\r\\n cursor: pointer\\r\\n}\\r\\n\\r\\n.toast {\\r\\n background-color: $navy;\\r\\n}\\r\\n\\r\\n.toast-success {\\r\\n background-color: $navy;\\r\\n}\\r\\n\\r\\n.toast-error {\\r\\n background-color: $red;\\r\\n}\\r\\n\\r\\n.toast-info {\\r\\n background-color: $lazur;\\r\\n}\\r\\n\\r\\n.toast-warning {\\r\\n background-color: $yellow;\\r\\n}\\r\\n\\r\\n.toast-top-full-width {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n.toast-bottom-full-width {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n/* Notifie */\\r\\n.cg-notify-message.inspinia-notify {\\r\\n background: #fff;\\r\\n padding: 0;\\r\\n box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);\\r\\n -webkit-box-shadow: 0 0 1 px rgba(0, 0, 0, 0.1), 0 2 px 4 px rgba(0, 0, 0, 0.2);\\r\\n -moz-box-shadow: 0 0 1 px rgba(0, 0, 0, 0.1), 0 2 px 4 px rgba(0, 0, 0, 0.2);\\r\\n border: none;\\r\\n margin-top: 30px;\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.inspinia-notify.alert-warning {\\r\\n border-left: 6px solid $yellow;\\r\\n}\\r\\n\\r\\n.inspinia-notify.alert-success {\\r\\n border-left: 6px solid $blue;\\r\\n}\\r\\n\\r\\n.inspinia-notify.alert-danger {\\r\\n border-left: 6px solid $red;\\r\\n}\\r\\n\\r\\n.inspinia-notify.alert-info {\\r\\n border-left: 6px solid $navy;\\r\\n}\\r\\n\\r\\n/* Image cropper style */\\r\\n.img-container, .img-preview {\\r\\n overflow: hidden;\\r\\n text-align: center;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.img-preview-sm {\\r\\n height: 130px;\\r\\n width: 200px;\\r\\n}\\r\\n\\r\\n/* Forum styles */\\r\\n.forum-post-container .media {\\r\\n margin: 10px 10px 10px 10px;\\r\\n padding: 20px 10px 20px 10px;\\r\\n border-bottom: 1px solid #f1f1f1;\\r\\n}\\r\\n\\r\\n.forum-avatar {\\r\\n float: left;\\r\\n margin-right: 20px;\\r\\n text-align: center;\\r\\n width: 110px;\\r\\n}\\r\\n\\r\\n.forum-avatar .img-circle {\\r\\n height: 48px;\\r\\n width: 48px;\\r\\n}\\r\\n\\r\\n.author-info {\\r\\n color: #676a6c;\\r\\n font-size: 11px;\\r\\n margin-top: 5px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.forum-post-info {\\r\\n padding: 9px 12px 6px 12px;\\r\\n background: #f9f9f9;\\r\\n border: 1px solid #f1f1f1;\\r\\n}\\r\\n\\r\\n.media-body > .media {\\r\\n background: #f9f9f9;\\r\\n border-radius: 3px;\\r\\n border: 1px solid #f1f1f1;\\r\\n}\\r\\n\\r\\n.forum-post-container .media-body .photos {\\r\\n margin: 10px 0;\\r\\n}\\r\\n\\r\\n.forum-photo {\\r\\n max-width: 140px;\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n.media-body > .media .forum-avatar {\\r\\n width: 70px;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.media-body > .media .forum-avatar .img-circle {\\r\\n height: 38px;\\r\\n width: 38px;\\r\\n}\\r\\n\\r\\n.mid-icon {\\r\\n font-size: 66px;\\r\\n}\\r\\n\\r\\n.forum-item {\\r\\n margin: 10px 0;\\r\\n padding: 10px 0 20px;\\r\\n border-bottom: 1px solid #f1f1f1;\\r\\n}\\r\\n\\r\\n.views-number {\\r\\n font-size: 24px;\\r\\n line-height: 18px;\\r\\n font-weight: 400;\\r\\n}\\r\\n\\r\\n.forum-container, .forum-post-container {\\r\\n padding: 30px !important;\\r\\n}\\r\\n\\r\\n.forum-item small {\\r\\n color: #999;\\r\\n}\\r\\n\\r\\n.forum-item .forum-sub-title {\\r\\n color: #999;\\r\\n margin-left: 50px;\\r\\n}\\r\\n\\r\\n.forum-title {\\r\\n margin: 15px 0 15px 0;\\r\\n}\\r\\n\\r\\n.forum-info {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.forum-desc {\\r\\n color: #999;\\r\\n}\\r\\n\\r\\n.forum-icon {\\r\\n float: left;\\r\\n width: 30px;\\r\\n margin-right: 20px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\na.forum-item-title {\\r\\n color: inherit;\\r\\n display: block;\\r\\n font-size: 18px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\na.forum-item-title:hover {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.forum-icon .fa {\\r\\n font-size: 30px;\\r\\n margin-top: 8px;\\r\\n color: #9b9b9b;\\r\\n}\\r\\n\\r\\n.forum-item.active .fa {\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n.forum-item.active a.forum-item-title {\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n@media (max-width: 992px) {\\r\\n\\r\\n .forum-info {\\r\\n margin: 15px 0 10px 0px;\\r\\n /* Comment this is you want to show forum info in small devices */\\r\\n display: none;\\r\\n }\\r\\n\\r\\n .forum-desc {\\r\\n float: none !important;\\r\\n }\\r\\n}\\r\\n\\r\\n/* New Timeline style */\\r\\n\\r\\n.vertical-container {\\r\\n /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */\\r\\n width: 90%;\\r\\n max-width: 1170px;\\r\\n margin: 0 auto;\\r\\n}\\r\\n\\r\\n.vertical-container::after {\\r\\n /* clearfix */\\r\\n content: '';\\r\\n display: table;\\r\\n clear: both;\\r\\n}\\r\\n\\r\\n#vertical-timeline {\\r\\n position: relative;\\r\\n padding: 0;\\r\\n margin-top: 2em;\\r\\n margin-bottom: 2em;\\r\\n}\\r\\n\\r\\n#vertical-timeline::before {\\r\\n content: '';\\r\\n position: absolute;\\r\\n top: 0;\\r\\n left: 18px;\\r\\n height: 100%;\\r\\n width: 4px;\\r\\n background: #f1f1f1;\\r\\n}\\r\\n\\r\\n\\r\\n.vertical-timeline-content .btn {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n#vertical-timeline.light-timeline:before {\\r\\n background: #e7eaec;\\r\\n}\\r\\n\\r\\n\\r\\n.dark-timeline .vertical-timeline-content:before {\\r\\n border-color: transparent #f5f5f5 transparent transparent;\\r\\n}\\r\\n\\r\\n.dark-timeline.center-orientation .vertical-timeline-content:before {\\r\\n border-color: transparent transparent transparent #f5f5f5;\\r\\n}\\r\\n\\r\\n.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,\\r\\n.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before {\\r\\n border-color: transparent #f5f5f5 transparent transparent;\\r\\n}\\r\\n\\r\\n.dark-timeline .vertical-timeline-content,\\r\\n.dark-timeline.center-orientation .vertical-timeline-content {\\r\\n background: #f5f5f5;\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 1170px) {\\r\\n #vertical-timeline.center-orientation {\\r\\n margin-top: 3em;\\r\\n margin-bottom: 3em;\\r\\n }\\r\\n\\r\\n #vertical-timeline.center-orientation:before {\\r\\n left: 50%;\\r\\n margin-left: -2px;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width: 1170px) {\\r\\n .center-orientation.dark-timeline .vertical-timeline-content:before {\\r\\n border-color: transparent #f5f5f5 transparent transparent;\\r\\n }\\r\\n}\\r\\n\\r\\n.vertical-timeline-block {\\r\\n position: relative;\\r\\n margin: 2em 0;\\r\\n}\\r\\n\\r\\n.vertical-timeline-block:after {\\r\\n content: \\\"\\\";\\r\\n display: table;\\r\\n clear: both;\\r\\n}\\r\\n\\r\\n.vertical-timeline-block:first-child {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n.vertical-timeline-block:last-child {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 1170px) {\\r\\n .center-orientation .vertical-timeline-block {\\r\\n margin: 4em 0;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-block:first-child {\\r\\n margin-top: 0;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-block:last-child {\\r\\n margin-bottom: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.vertical-timeline-icon {\\r\\n position: absolute;\\r\\n top: 0;\\r\\n left: 0;\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n border-radius: 50%;\\r\\n font-size: 16px;\\r\\n border: 3px solid #f1f1f1;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.vertical-timeline-icon i {\\r\\n display: block;\\r\\n width: 24px;\\r\\n height: 24px;\\r\\n position: relative;\\r\\n left: 50%;\\r\\n top: 50%;\\r\\n margin-left: -12px;\\r\\n margin-top: -9px;\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 1170px) {\\r\\n .center-orientation .vertical-timeline-icon {\\r\\n width: 50px;\\r\\n height: 50px;\\r\\n left: 50%;\\r\\n margin-left: -25px;\\r\\n -webkit-transform: translateZ(0);\\r\\n -webkit-backface-visibility: hidden;\\r\\n font-size: 19px;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-icon i {\\r\\n margin-left: -12px;\\r\\n margin-top: -10px;\\r\\n }\\r\\n\\r\\n .center-orientation .cssanimations .vertical-timeline-icon.is-hidden {\\r\\n visibility: hidden;\\r\\n }\\r\\n}\\r\\n\\r\\n\\r\\n.vertical-timeline-content {\\r\\n position: relative;\\r\\n margin-left: 60px;\\r\\n background: white;\\r\\n border-radius: 0.25em;\\r\\n padding: 1em;\\r\\n}\\r\\n\\r\\n.vertical-timeline-content:after {\\r\\n content: \\\"\\\";\\r\\n display: table;\\r\\n clear: both;\\r\\n}\\r\\n\\r\\n.vertical-timeline-content h2 {\\r\\n font-weight: 400;\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n\\r\\n.vertical-timeline-content p {\\r\\n margin: 1em 0;\\r\\n line-height: 1.6;\\r\\n}\\r\\n\\r\\n\\r\\n.vertical-timeline-content .vertical-date {\\r\\n float: left;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.vertical-date small {\\r\\n color: $navy;\\r\\n font-weight: 400;\\r\\n}\\r\\n\\r\\n.vertical-timeline-content::before {\\r\\n content: '';\\r\\n position: absolute;\\r\\n top: 16px;\\r\\n right: 100%;\\r\\n height: 0;\\r\\n width: 0;\\r\\n border: 7px solid transparent;\\r\\n border-right: 7px solid white;\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 768px) {\\r\\n .vertical-timeline-content h2 {\\r\\n font-size: 18px;\\r\\n }\\r\\n\\r\\n .vertical-timeline-content p {\\r\\n font-size: 13px;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 1170px) {\\r\\n .center-orientation .vertical-timeline-content {\\r\\n margin-left: 0;\\r\\n padding: 1.6em;\\r\\n width: 45%;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-content::before {\\r\\n top: 24px;\\r\\n left: 100%;\\r\\n border-color: transparent;\\r\\n border-left-color: white;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-content .btn {\\r\\n float: left;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-content .vertical-date {\\r\\n position: absolute;\\r\\n width: 100%;\\r\\n left: 122%;\\r\\n top: 2px;\\r\\n font-size: 14px;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content {\\r\\n float: right;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before {\\r\\n top: 24px;\\r\\n left: auto;\\r\\n right: 100%;\\r\\n border-color: transparent;\\r\\n border-right-color: white;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn {\\r\\n float: right;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date {\\r\\n left: auto;\\r\\n right: 122%;\\r\\n text-align: right;\\r\\n }\\r\\n\\r\\n .center-orientation .cssanimations .vertical-timeline-content.is-hidden {\\r\\n visibility: hidden;\\r\\n }\\r\\n}\\r\\n\\r\\n\\r\\n/* Tabs */\\r\\n\\r\\n.tabs-container {\\r\\n\\r\\n .panel-body {\\r\\n background: #fff;\\r\\n border: 1px solid $border-color;\\r\\n border-radius: 2px;\\r\\n padding: 20px;\\r\\n position: relative;\\r\\n }\\r\\n\\r\\n .nav-tabs > li.active > a,\\r\\n .nav-tabs > li.active > a:hover,\\r\\n .nav-tabs > li.active > a:focus {\\r\\n border: 1px solid $border-color;\\r\\n border-bottom-color: transparent;\\r\\n background-color: #fff;\\r\\n }\\r\\n\\r\\n .nav-tabs > li {\\r\\n float: left;\\r\\n margin-bottom: -1px;\\r\\n }\\r\\n\\r\\n .tab-pane .panel-body {\\r\\n border-top: none;\\r\\n }\\r\\n\\r\\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\\r\\n border: 1px solid $border-color;\\r\\n border-bottom-color: transparent;\\r\\n }\\r\\n\\r\\n .nav-tabs {\\r\\n border-bottom: 1px solid $border-color;\\r\\n }\\r\\n\\r\\n .tab-pane .panel-body {\\r\\n border-top: none;\\r\\n }\\r\\n\\r\\n .tabs-left .tab-pane .panel-body, .tabs-right .tab-pane .panel-body {\\r\\n border-top: 1px solid $border-color;\\r\\n }\\r\\n\\r\\n .nav-tabs > li a:hover {\\r\\n background: transparent;\\r\\n border-color: transparent;\\r\\n }\\r\\n\\r\\n .tabs-below > .nav-tabs,\\r\\n .tabs-right > .nav-tabs,\\r\\n .tabs-left > .nav-tabs {\\r\\n border-bottom: 0;\\r\\n }\\r\\n\\r\\n .tabs-left .panel-body {\\r\\n position: static;\\r\\n }\\r\\n\\r\\n .tabs-left > .nav-tabs, .tabs-right > .nav-tabs {\\r\\n width: 20%;\\r\\n }\\r\\n\\r\\n .tabs-left .panel-body {\\r\\n width: 80%;\\r\\n margin-left: 20%;\\r\\n }\\r\\n\\r\\n .tabs-right .panel-body {\\r\\n width: 80%;\\r\\n margin-right: 20%;\\r\\n }\\r\\n\\r\\n .tab-content > .tab-pane,\\r\\n .pill-content > .pill-pane {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n .tab-content > .active,\\r\\n .pill-content > .active {\\r\\n display: block;\\r\\n }\\r\\n\\r\\n .tabs-below > .nav-tabs {\\r\\n border-top: 1px solid $border-color;\\r\\n }\\r\\n\\r\\n .tabs-below > .nav-tabs > li {\\r\\n margin-top: -1px;\\r\\n margin-bottom: 0;\\r\\n }\\r\\n\\r\\n .tabs-below > .nav-tabs > li > a {\\r\\n -webkit-border-radius: 0 0 4px 4px;\\r\\n -moz-border-radius: 0 0 4px 4px;\\r\\n border-radius: 0 0 4px 4px;\\r\\n }\\r\\n\\r\\n .tabs-below > .nav-tabs > li > a:hover,\\r\\n .tabs-below > .nav-tabs > li > a:focus {\\r\\n border-top-color: $border-color;\\r\\n border-bottom-color: transparent;\\r\\n }\\r\\n\\r\\n\\r\\n .tabs-left > .nav-tabs > li,\\r\\n .tabs-right > .nav-tabs > li {\\r\\n float: none;\\r\\n }\\r\\n\\r\\n .tabs-left > .nav-tabs > li > a,\\r\\n .tabs-right > .nav-tabs > li > a {\\r\\n min-width: 74px;\\r\\n margin-right: 0;\\r\\n margin-bottom: 3px;\\r\\n }\\r\\n\\r\\n .tabs-left > .nav-tabs {\\r\\n float: left;\\r\\n margin-right: 19px;\\r\\n }\\r\\n\\r\\n .tabs-left > .nav-tabs > li > a {\\r\\n margin-right: -1px;\\r\\n -webkit-border-radius: 4px 0 0 4px;\\r\\n -moz-border-radius: 4px 0 0 4px;\\r\\n border-radius: 4px 0 0 4px;\\r\\n }\\r\\n\\r\\n .tabs-left > .nav-tabs .active > a,\\r\\n .tabs-left > .nav-tabs .active > a:hover,\\r\\n .tabs-left > .nav-tabs .active > a:focus {\\r\\n border-color: $border-color transparent $border-color $border-color;\\r\\n *border-right-color: #ffffff;\\r\\n }\\r\\n\\r\\n .tabs-right > .nav-tabs {\\r\\n float: right;\\r\\n margin-left: 19px;\\r\\n }\\r\\n\\r\\n .tabs-right > .nav-tabs > li > a {\\r\\n margin-left: -1px;\\r\\n -webkit-border-radius: 0 4px 4px 0;\\r\\n -moz-border-radius: 0 4px 4px 0;\\r\\n border-radius: 0 4px 4px 0;\\r\\n }\\r\\n\\r\\n .tabs-right > .nav-tabs .active > a,\\r\\n .tabs-right > .nav-tabs .active > a:hover,\\r\\n .tabs-right > .nav-tabs .active > a:focus {\\r\\n border-color: $border-color $border-color $border-color transparent;\\r\\n *border-left-color: #ffffff;\\r\\n z-index: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* jsvectormap */\\r\\n.jvectormap-container {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n position: relative;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.jvectormap-tip {\\r\\n position: absolute;\\r\\n display: none;\\r\\n border: solid 1px #CDCDCD;\\r\\n border-radius: 3px;\\r\\n background: #292929;\\r\\n color: white;\\r\\n font-family: sans-serif, Verdana;\\r\\n font-size: smaller;\\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.jvectormap-zoomin, .jvectormap-zoomout, .jvectormap-goback {\\r\\n position: absolute;\\r\\n left: 10px;\\r\\n border-radius: 3px;\\r\\n background: $navy;\\r\\n padding: 3px;\\r\\n color: white;\\r\\n cursor: pointer;\\r\\n line-height: 10px;\\r\\n text-align: center;\\r\\n box-sizing: content-box;\\r\\n}\\r\\n\\r\\n.jvectormap-zoomin, .jvectormap-zoomout {\\r\\n width: 10px;\\r\\n height: 10px;\\r\\n}\\r\\n\\r\\n.jvectormap-zoomin {\\r\\n top: 10px;\\r\\n}\\r\\n\\r\\n.jvectormap-zoomout {\\r\\n top: 30px;\\r\\n}\\r\\n\\r\\n.jvectormap-goback {\\r\\n bottom: 10px;\\r\\n z-index: 1000;\\r\\n padding: 6px;\\r\\n}\\r\\n\\r\\n.jvectormap-spinner {\\r\\n position: absolute;\\r\\n left: 0;\\r\\n top: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n background: center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==);\\r\\n}\\r\\n\\r\\n.jvectormap-legend-title {\\r\\n font-weight: bold;\\r\\n font-size: 14px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt {\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-h {\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-v {\\r\\n top: 0;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n.jvectormap-legend {\\r\\n background: black;\\r\\n color: white;\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-h .jvectormap-legend {\\r\\n float: left;\\r\\n margin: 0 10px 10px 0;\\r\\n padding: 3px 3px 1px 3px;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-v .jvectormap-legend {\\r\\n margin: 10px 10px 0 0;\\r\\n padding: 3px;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-h .jvectormap-legend-tick {\\r\\n width: 40px;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample {\\r\\n height: 15px;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample {\\r\\n height: 20px;\\r\\n width: 20px;\\r\\n display: inline-block;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-tick-text {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-h .jvectormap-legend-tick-text {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.jvectormap-legend-cnt-v .jvectormap-legend-tick-text {\\r\\n display: inline-block;\\r\\n vertical-align: middle;\\r\\n line-height: 20px;\\r\\n padding-left: 3px;\\r\\n}\\r\\n\",\".sidebard-panel {\\r\\n width: 220px;\\r\\n background: darken($gray, 3%);\\r\\n padding: 10px 20px;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n.sidebard-panel .feed-element img.img-circle {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n}\\r\\n\\r\\n.sidebard-panel .feed-element, .media-body, .sidebard-panel p {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.sidebard-panel .feed-element {\\r\\n margin-top: 20px;\\r\\n padding-bottom: 0;\\r\\n}\\r\\n\\r\\n.sidebard-panel .list-group {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.sidebard-panel .list-group .list-group-item {\\r\\n padding: 5px 0;\\r\\n font-size: 12px;\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n.sidebar-content .wrapper {\\r\\n padding-right: 230px;\\r\\n}\\r\\n\\r\\n.sidebar-content .wrapper, .wrapper.sidebar-content {\\r\\n padding-right: 230px !important;\\r\\n}\\r\\n\\r\\n.body-small .sidebar-content .wrapper, .body-small .wrapper.sidebar-content {\\r\\n padding-right: 20px !important;\\r\\n}\\r\\n\\r\\n\\r\\n// Right sidebar\\r\\n\\r\\n#right-sidebar {\\r\\n background-color: #fff;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n border-top: 1px solid #C2C4CC;\\r\\n overflow: hidden;\\r\\n position: fixed;\\r\\n top: 60px;\\r\\n width: 260px !important;\\r\\n z-index: 1009;\\r\\n bottom: 0;\\r\\n right: -260px;\\r\\n}\\r\\n\\r\\n.sidebar-container {\\r\\n /*padding: 10px;*/\\r\\n // padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n#right-sidebar.sidebar-open {\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n#right-sidebar.sidebar-open.sidebar-top {\\r\\n top: 0;\\r\\n border-top: none;\\r\\n}\\r\\n\\r\\n.sidebar-container {\\r\\n\\r\\n ul.nav-tabs {\\r\\n border: none;\\r\\n }\\r\\n\\r\\n ul.nav-tabs.navs-4 li {\\r\\n width: 25%;\\r\\n }\\r\\n ul.nav-tabs.navs-3 li {\\r\\n width: 33.3333%;\\r\\n }\\r\\n ul.nav-tabs.navs-2 li {\\r\\n width: 50%;\\r\\n }\\r\\n\\r\\n ul.nav-tabs li {\\r\\n border: none;\\r\\n }\\r\\n\\r\\n ul.nav-tabs li a {\\r\\n border: none;\\r\\n padding: 12px 10px;\\r\\n margin: 0;\\r\\n border-radius: 0;\\r\\n background: $nav-bg;\\r\\n color: #fff;\\r\\n text-align: center;\\r\\n\\r\\n border-right:1px solid lighten($nav-bg, 2%) ;\\r\\n }\\r\\n\\r\\n ul.nav-tabs li.active a {\\r\\n border: none;\\r\\n background: #f9f9f9;\\r\\n color: $text-color;\\r\\n font-weight: bold;\\r\\n\\r\\n }\\r\\n\\r\\n .nav-tabs > li.active > a:hover,\\r\\n .nav-tabs > li.active > a:focus {\\r\\n\\r\\n border: none;\\r\\n\\r\\n }\\r\\n\\r\\n ul.sidebar-list {\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n }\\r\\n\\r\\n ul.sidebar-list li {\\r\\n border-bottom: 1px solid $border-color;\\r\\n padding: 15px 20px;\\r\\n list-style: none;\\r\\n\\r\\n font-size: 12px;\\r\\n }\\r\\n\\r\\n .sidebar-message:nth-child(2n+2) {\\r\\n background: #f9f9f9;\\r\\n }\\r\\n\\r\\n ul.sidebar-list li a {\\r\\n text-decoration: none;\\r\\n color: inherit;\\r\\n }\\r\\n\\r\\n .sidebar-content {\\r\\n padding: 15px 20px ;\\r\\n font-size: 12px;\\r\\n }\\r\\n\\r\\n .date-item {\\r\\n\\r\\n }\\r\\n\\r\\n .sidebar-title {\\r\\n background: white;\\r\\n padding: 20px;\\r\\n border-bottom: 1px solid $border-color;\\r\\n\\r\\n .fa {\\r\\n // font-size: 13px;\\r\\n }\\r\\n\\r\\n h3 {\\r\\n margin-bottom: 3px;\\r\\n padding-left: 2px;\\r\\n }\\r\\n }\\r\\n\\r\\n .tab-content {\\r\\n\\r\\n h4 {\\r\\n margin-bottom: 5px;\\r\\n }\\r\\n\\r\\n }\\r\\n\\r\\n .sidebar-message > a > .pull-left {\\r\\n margin-right: 10px;\\r\\n }\\r\\n\\r\\n .sidebar-message > a {\\r\\n text-decoration: none;\\r\\n color: inherit;\\r\\n }\\r\\n\\r\\n .sidebar-message {\\r\\n padding: 15px 20px;\\r\\n }\\r\\n\\r\\n .sidebar-message .message-avatar {\\r\\n height: 38px;\\r\\n width: 38px;\\r\\n border-radius: 50%;\\r\\n }\\r\\n\\r\\n .setings-item {\\r\\n padding: 15px 20px;\\r\\n border-bottom: 1px solid $border-color;\\r\\n }\\r\\n\\r\\n}\\r\\n\\r\\n\",\"body {\\r\\n font-family: $font-stack;\\r\\n background-color: $nav-bg;\\r\\n font-size: 13px;\\r\\n color: $text-color;\\r\\n overflow-x: hidden;\\r\\n\\r\\n}\\r\\n\\r\\nhtml,body {\\r\\n height: 100%;\\r\\n\\r\\n}\\r\\n\\r\\nbody.full-height-layout #wrapper,\\r\\nbody.full-height-layout #page-wrapper {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n#page-wrapper {\\r\\n min-height: auto;\\r\\n}\\r\\n\\r\\n\\r\\nbody.boxed-layout {\\r\\n background: $boxed-backgound;\\r\\n}\\r\\n\\r\\nbody.boxed-layout #wrapper {\\r\\n background-color: #2f4050;\\r\\n max-width: $boxed-width;\\r\\n margin: 0 auto;\\r\\n -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);\\r\\n -moz-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);\\r\\n box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);\\r\\n}\\r\\n\\r\\n.top-navigation.boxed-layout #wrapper,\\r\\n.boxed-layout #wrapper.top-navigation {\\r\\n max-width: 1300px !important;\\r\\n}\\r\\n\\r\\n.block {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.clear {\\r\\n display: block;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\na {\\r\\n cursor: pointer;\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\na:hover, a:focus {\\r\\n text-decoration: none;\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.border-bottom {\\r\\n border-bottom: 1px solid $border-color !important;\\r\\n}\\r\\n\\r\\n.font-bold {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.font-noraml {\\r\\n font-weight: 400;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n.text-uppercase {\\r\\n text-transform: uppercase;\\r\\n}\\r\\n\\r\\n.b-r {\\r\\n border-right: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.hr-line-dashed {\\r\\n border-top: 1px dashed $border-color;\\r\\n color: #ffffff;\\r\\n background-color: #ffffff;\\r\\n height: 1px;\\r\\n margin: 20px 0;\\r\\n}\\r\\n\\r\\n.hr-line-solid {\\r\\n border-bottom: 1px solid $border-color;\\r\\n background-color: rgba(0, 0, 0, 0);\\r\\n border-style: solid !important;\\r\\n margin-top: 15px;\\r\\n margin-bottom: 15px;\\r\\n}\\r\\n\\r\\nvideo {\\r\\n width: 100% !important;\\r\\n height: auto !important;\\r\\n}\\r\\n\\r\\n/* GALLERY */\\r\\n.gallery > .row > div {\\r\\n margin-bottom: 15px;\\r\\n}\\r\\n\\r\\n.fancybox img {\\r\\n margin-bottom: 5px;\\r\\n /* Only for demo */\\r\\n width: 24%;\\r\\n}\\r\\n\\r\\n/* Summernote text editor */\\r\\n.note-editor {\\r\\n height: auto;\\r\\n min-height: 300px;\\r\\n}\\r\\n\\r\\n/* MODAL */\\r\\n.modal-content {\\r\\n background-clip: padding-box;\\r\\n background-color: #FFFFFF;\\r\\n border: 1px solid rgba(0, 0, 0, 0);\\r\\n border-radius: 4px;\\r\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\\r\\n outline: 0 none;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.modal-dialog {\\r\\n z-index: 2200;\\r\\n}\\r\\n\\r\\n.modal-body {\\r\\n padding: 20px 30px 30px 30px;\\r\\n}\\r\\n\\r\\n\\r\\n.inmodal .modal-body {\\r\\n background: #f8fafb;\\r\\n}\\r\\n\\r\\n.inmodal .modal-header {\\r\\n padding: 30px 15px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.animated.modal.fade .modal-dialog {\\r\\n -webkit-transform: none;\\r\\n -ms-transform: none;\\r\\n -o-transform: none;\\r\\n transform: none;\\r\\n}\\r\\n\\r\\n.inmodal .modal-title {\\r\\n font-size: 26px;\\r\\n}\\r\\n\\r\\n.inmodal .modal-icon {\\r\\n font-size: 84px;\\r\\n color: #e2e3e3;\\r\\n}\\r\\n\\r\\n.modal-footer {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n\\r\\n/* WRAPPERS */\\r\\n\\r\\n#wrapper {\\r\\n width: 100%;\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.wrapper {\\r\\n padding: 0 20px;\\r\\n}\\r\\n\\r\\n.wrapper-content {\\r\\n padding: 20px 10px 40px;\\r\\n}\\r\\n\\r\\n#page-wrapper {\\r\\n padding: 0 15px;\\r\\n min-height: 568px;\\r\\n position: relative !important;\\r\\n}\\r\\n\\r\\n@media (min-width: 768px) {\\r\\n #page-wrapper {\\r\\n position: inherit;\\r\\n margin: 0 0 0 240px;\\r\\n min-height: 1000px;\\r\\n }\\r\\n}\\r\\n\\r\\n.title-action {\\r\\n text-align: right;\\r\\n padding-top: 30px;\\r\\n}\\r\\n\\r\\n.ibox-content h1, .ibox-content h2, .ibox-content h3, .ibox-content h4, .ibox-content h5,\\r\\n.ibox-title h1, .ibox-title h2, .ibox-title h3, .ibox-title h4, .ibox-title h5 {\\r\\n margin-top: 5px;\\r\\n color: white;\\r\\n}\\r\\n\\r\\nul.unstyled, ol.unstyled {\\r\\n list-style: none outside none;\\r\\n margin-left: 0;\\r\\n}\\r\\n\\r\\n.big-icon {\\r\\n font-size: 160px !important;\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n\\r\\n/* FOOTER */\\r\\n\\r\\n.footer {\\r\\n\\r\\n background: none repeat scroll 0 0 white;\\r\\n border-top: 1px solid $border-color;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n padding: 10px 20px;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n.footer.fixed_full {\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n z-index: 1000;\\r\\n padding:10px 20px;\\r\\n background: white;\\r\\n border-top: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.footer.fixed {\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n z-index: 1000;\\r\\n padding:10px 20px;\\r\\n background: white;\\r\\n border-top: 2px solid $border-color;\\r\\n margin:0 !important;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .footer.fixed,\\r\\nbody.body-small.mini-navbar .footer.fixed {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\nbody.mini-navbar.canvas-menu .footer.fixed,\\r\\nbody.canvas-menu .footer.fixed {\\r\\n margin: 0 !important;\\r\\n}\\r\\n\\r\\nbody.fixed-sidebar.body-small.mini-navbar .footer.fixed {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\nbody.body-small .footer.fixed {\\r\\n margin-left: 0px;\\r\\n}\\r\\n\\r\\n/* PANELS */\\r\\n\\r\\n.page-heading {\\r\\n border: 0;\\r\\n padding: 10px 0px 10px 0px;\\r\\n}\\r\\n\\r\\n.panel-heading h1, .panel-heading h2 {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n/* TABLES */\\r\\n\\r\\n.table-bordered {\\r\\n border: 1px solid #EBEBEB;\\r\\n}\\r\\n\\r\\n.table-bordered > thead > tr > th, .table-bordered > thead > tr > td {\\r\\n background-color: #F5F5F6;\\r\\n border-bottom-width: 1px;\\r\\n}\\r\\n\\r\\n.table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td {\\r\\n border: 1px solid #e7e7e7;\\r\\n}\\r\\n\\r\\n.table > thead > tr > th {\\r\\n border-bottom: 1px solid #DDDDDD;\\r\\n vertical-align: bottom;\\r\\n}\\r\\n\\r\\n.table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td {\\r\\n border-top: 1px solid $border-color;\\r\\n line-height: 1.42857;\\r\\n padding: 8px;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n/* PANELS */\\r\\n\\r\\n.panel.blank-panel {\\r\\n background: none;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.blank-panel .panel-heading {\\r\\n padding-bottom: 0;\\r\\n}\\r\\n\\r\\n.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\\r\\n -moz-border-bottom-colors: none;\\r\\n -moz-border-left-colors: none;\\r\\n -moz-border-right-colors: none;\\r\\n -moz-border-top-colors: none;\\r\\n background: none;\\r\\n border-color: #DDDDDD #DDDDDD rgba(0, 0, 0, 0);\\r\\n border-bottom: $gray;\\r\\n border-image: none;\\r\\n border-style: solid;\\r\\n border-width: 1px;\\r\\n color: #555555;\\r\\n cursor: default;\\r\\n}\\r\\n\\r\\n.nav.nav-tabs li {\\r\\n background: none;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.nav-tabs > li > a {\\r\\n color: #A7B1C2;\\r\\n font-weight: 600;\\r\\n padding: 10px 20px 10px 25px;\\r\\n}\\r\\n\\r\\n.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {\\r\\n background-color: #e6e6e6;\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.ui-tab .tab-content {\\r\\n padding: 20px 0px;\\r\\n}\\r\\n\\r\\n/* GLOBAL */\\r\\n\\r\\n.no-padding {\\r\\n padding: 0 !important;\\r\\n}\\r\\n\\r\\n.no-borders {\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n.no-margins {\\r\\n margin: 0 !important;\\r\\n}\\r\\n\\r\\n.no-top-border {\\r\\n border-top: 0 !important;\\r\\n}\\r\\n\\r\\n.ibox-content.text-box {\\r\\n padding-bottom: 0px;\\r\\n padding-top: 15px;\\r\\n}\\r\\n\\r\\n.border-left-right {\\r\\n border-left: 1px solid $border-color;\\r\\n border-right: 1px solid $border-color;\\r\\n border-top: none;\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.border-left{\\r\\n border-left: 1px solid $border-color;\\r\\n border-right: none;\\r\\n border-top: none;\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.border-right {\\r\\n border-left: none;\\r\\n border-right: 1px solid $border-color;\\r\\n border-top: none;\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.full-width {\\r\\n width: 100% !important;\\r\\n}\\r\\n\\r\\n.link-block {\\r\\n font-size: 12px;\\r\\n padding: 10px;\\r\\n}\\r\\n\\r\\n.nav.navbar-top-links .link-block a {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.link-block a {\\r\\n font-size: 10px;\\r\\n color: inherit;\\r\\n\\r\\n}\\r\\n\\r\\nbody.mini-navbar .branding {\\r\\n display: none;\\r\\n}\\r\\n\\r\\nimg.circle-border {\\r\\n border: 6px solid #FFFFFF;\\r\\n border-radius: 50%;\\r\\n}\\r\\n\\r\\n.branding {\\r\\n float: left;\\r\\n color: #FFFFFF;\\r\\n font-size: 18px;\\r\\n font-weight: 600;\\r\\n padding: 17px 20px;\\r\\n text-align: center;\\r\\n background-color: $navy;\\r\\n}\\r\\n\\r\\n.login-panel {\\r\\n margin-top: 25%;\\r\\n}\\r\\n\\r\\n.icons-box h3 {\\r\\n margin-top: 10px;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.icons-box .infont a i {\\r\\n font-size: 25px;\\r\\n display: block;\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.icons-box .infont a {\\r\\n color: #a6a8a9;\\r\\n}\\r\\n\\r\\n.icons-box .infont a {\\r\\n padding: 10px;\\r\\n\\r\\n margin: 1px;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.ui-draggable .ibox-title {\\r\\n cursor: move;\\r\\n}\\r\\n\\r\\n.breadcrumb {\\r\\n background-color: #ffffff;\\r\\n padding: 0;\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.breadcrumb > li a {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.breadcrumb > .active {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\ncode {\\r\\n background-color: #F9F2F4;\\r\\n border-radius: 4px;\\r\\n color: #ca4440;\\r\\n font-size: 90%;\\r\\n padding: 2px 4px;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.ibox {\\r\\n clear: both;\\r\\n margin-bottom: 25px;\\r\\n margin-top: 0;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.ibox.collapsed .ibox-content{\\r\\n display: none;\\r\\n}\\r\\n.ibox.collapsed .fa.fa-chevron-up:before {\\r\\n content: \\\"\\\\f078\\\";\\r\\n}\\r\\n.ibox.collapsed .fa.fa-chevron-down:before {\\r\\n content: \\\"\\\\f077\\\";\\r\\n}\\r\\n\\r\\n.ibox:after, .ibox:before {\\r\\n display: table;\\r\\n}\\r\\n\\r\\n.ibox-title {\\r\\n -moz-border-bottom-colors: none;\\r\\n -moz-border-left-colors: none;\\r\\n -moz-border-right-colors: none;\\r\\n -moz-border-top-colors: none;\\r\\n background-color: $ibox-title-bg;\\r\\n border-color: $border-color;\\r\\n border-image: none;\\r\\n border-style: solid solid none;\\r\\n border-width: 0px 0px 0;\\r\\n color: inherit;\\r\\n margin-bottom: 0;\\r\\n padding: 14px 15px 7px;\\r\\n min-height: 48px;\\r\\n}\\r\\n\\r\\n.ibox-content {\\r\\n background-color: $ibox-content-bg;\\r\\n color: inherit;\\r\\n padding: 15px 20px 20px 20px;\\r\\n border-color: $border-color;\\r\\n border-image: none;\\r\\n border-style: solid;\\r\\n border-width: 1px;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.ibox-footer {\\r\\n color: inherit;\\r\\n border-top: 1px solid $border-color;\\r\\n font-size: 90%;\\r\\n background: #ffffff;\\r\\n padding: 10px 15px;\\r\\n}\\r\\n\\r\\ntable.table-mail tr td {\\r\\n padding: 12px;\\r\\n}\\r\\n\\r\\n.table-mail .check-mail {\\r\\n padding-left: 20px;\\r\\n}\\r\\n\\r\\n.table-mail .mail-date {\\r\\n padding-right: 20px;\\r\\n}\\r\\n\\r\\n.star-mail, .check-mail {\\r\\n width: 40px;\\r\\n}\\r\\n\\r\\n.unread td a, .unread td {\\r\\n font-weight: 600;\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.read td a, .read td {\\r\\n font-weight: normal;\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.unread td {\\r\\n background-color: #f9f8f8;\\r\\n}\\r\\n\\r\\n.ibox-content {\\r\\n clear: both;\\r\\n}\\r\\n\\r\\n.ibox-heading {\\r\\n background-color: #f3f6fb;\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.ibox-heading h3 {\\r\\n font-weight: 200;\\r\\n font-size: 24px;\\r\\n}\\r\\n\\r\\n.ibox-title h5 {\\r\\n display: inline-block;\\r\\n font-size: 14px;\\r\\n margin: 0 0 7px;\\r\\n padding: 0;\\r\\n text-overflow: ellipsis;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.ibox-title .label {\\r\\n float: left;\\r\\n margin-left: 4px;\\r\\n}\\r\\n\\r\\n.ibox-tools {\\r\\n display: inline-block;\\r\\n float: right;\\r\\n margin-top: 0;\\r\\n position: relative;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.ibox-tools a {\\r\\n cursor: pointer;\\r\\n margin-left: 5px;\\r\\n color: #c4c4c4;\\r\\n}\\r\\n\\r\\n.ibox-tools a.btn-primary {\\r\\n color: #fff;\\r\\n}\\r\\n\\r\\n.ibox-tools .dropdown-menu > li > a {\\r\\n padding: 4px 10px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.ibox .open > .dropdown-menu {\\r\\n left: auto;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n/* BACKGROUNDS */\\r\\n\\r\\n.gray-bg {\\r\\n background-color: $gray;\\r\\n}\\r\\n\\r\\n.white-bg {\\r\\n background-color: #ffffff;\\r\\n}\\r\\n\\r\\n.navy-bg {\\r\\n background-color: $navy;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.blue-bg {\\r\\n background-color: $blue;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.lazur-bg {\\r\\n background-color: $lazur;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.yellow-bg {\\r\\n background-color: $yellow;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.red-bg {\\r\\n background-color: $red;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.black-bg {\\r\\n background-color: #262626;\\r\\n}\\r\\n\\r\\n.panel-primary {\\r\\n border-color: $navy;\\r\\n}\\r\\n\\r\\n.panel-primary > .panel-heading {\\r\\n background-color: $navy;\\r\\n border-color: $navy;\\r\\n}\\r\\n\\r\\n.panel-success {\\r\\n border-color: $blue;\\r\\n}\\r\\n\\r\\n.panel-success > .panel-heading {\\r\\n background-color: $blue;\\r\\n border-color: $blue;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.panel-info {\\r\\n border-color: $lazur;\\r\\n}\\r\\n\\r\\n.panel-info > .panel-heading {\\r\\n background-color: $lazur;\\r\\n border-color: $lazur;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.panel-warning {\\r\\n border-color: $yellow;\\r\\n}\\r\\n\\r\\n.panel-warning > .panel-heading {\\r\\n background-color: $yellow;\\r\\n border-color: $yellow;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.panel-danger {\\r\\n border-color: $red;\\r\\n}\\r\\n\\r\\n.panel-danger > .panel-heading {\\r\\n background-color: $red;\\r\\n border-color: $red;\\r\\n color: #ffffff;\\r\\n}\\r\\n\\r\\n.progress-bar {\\r\\n background-color: $navy;\\r\\n}\\r\\n\\r\\n.progress-small, .progress-small .progress-bar {\\r\\n height: 10px;\\r\\n}\\r\\n\\r\\n.progress-small, .progress-mini {\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.progress-mini, .progress-mini .progress-bar {\\r\\n height: 5px;\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n.progress-bar-navy-light {\\r\\n background-color: #3dc7ab;\\r\\n}\\r\\n\\r\\n.progress-bar-success {\\r\\n background-color: $blue;\\r\\n}\\r\\n\\r\\n.progress-bar-info {\\r\\n background-color: $lazur;\\r\\n}\\r\\n\\r\\n.progress-bar-warning {\\r\\n background-color: $yellow;\\r\\n}\\r\\n\\r\\n.progress-bar-danger {\\r\\n background-color: $red;\\r\\n}\\r\\n\\r\\n.panel-title {\\r\\n font-size: inherit;\\r\\n}\\r\\n\\r\\n.jumbotron {\\r\\n border-radius: 6px;\\r\\n padding: 40px;\\r\\n}\\r\\n\\r\\n.jumbotron h1 {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n/* COLORS */\\r\\n\\r\\n.text-navy {\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n.text-primary {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.text-success {\\r\\n color: $fp-label-green-text;\\r\\n}\\r\\n\\r\\n.text-info {\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.text-warning {\\r\\n color: $yellow;\\r\\n}\\r\\n\\r\\n.text-danger {\\r\\n color: $red;\\r\\n}\\r\\n\\r\\n.text-muted {\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.simple_tag {\\r\\n background-color: #f3f3f4;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n color: inherit;\\r\\n font-size: 10px;\\r\\n margin-right: 5px;\\r\\n margin-top: 5px;\\r\\n padding: 5px 12px;\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.img-shadow {\\r\\n -webkit-box-shadow: 0px 0px 3px 0px rgba(145,145,145,1);\\r\\n -moz-box-shadow: 0px 0px 3px 0px rgba(145,145,145,1);\\r\\n box-shadow: 0px 0px 3px 0px rgba(145,145,145,1);\\r\\n}\\r\\n\\r\\n/* For handle diferent bg color in AngularJS version */\\r\\n.dashboards\\\\.dashboard_2 nav.navbar,\\r\\n.dashboards\\\\.dashboard_3 nav.navbar,\\r\\n.mailbox\\\\.inbox nav.navbar,\\r\\n.mailbox\\\\.email_view nav.navbar,\\r\\n.mailbox\\\\.email_compose nav.navbar,\\r\\n.dashboards\\\\.dashboard_4_1 nav.navbar,\\r\\n.metrics nav.navbar, .metrics\\\\.index nav.navbar\\r\\n{\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n/* For handle diferent bg color in MVC version */\\r\\n.Dashboard_2 .navbar.navbar-static-top,\\r\\n.Dashboard_3 .navbar.navbar-static-top,\\r\\n.Dashboard_4_1 .navbar.navbar-static-top,\\r\\n.ComposeEmail .navbar.navbar-static-top,\\r\\n.EmailView .navbar.navbar-static-top,\\r\\n.Inbox .navbar.navbar-static-top,\\r\\n.Metrics .navbar.navbar-static-top {\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n\\r\\na.close-canvas-menu {\\r\\n position: absolute;\\r\\n top:10px;\\r\\n right: 15px;\\r\\n z-index: 1011;\\r\\n color: #a7b1c2;\\r\\n}\\r\\n\\r\\na.close-canvas-menu:hover {\\r\\n color: #fff;\\r\\n}\\r\\n\\r\\n/* FULL HEIGHT */\\r\\n\\r\\n\\r\\n.full-height {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.fh-breadcrumb {\\r\\n height: calc(100% - 196px);\\r\\n margin: 0 -15px;\\r\\n position: relative\\r\\n}\\r\\n\\r\\n.fh-no-breadcrumb {\\r\\n height: calc(100% - 99px);\\r\\n margin: 0 -15px;\\r\\n position: relative\\r\\n}\\r\\n\\r\\n.fh-column {\\r\\n background: #fff;\\r\\n height: 100%;\\r\\n width: 240px;\\r\\n float: left\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n.spiner-example {\\r\\n height: 200px;\\r\\n padding-top: 70px;\\r\\n}\\r\\n\\r\\n/* MARGINS & PADDINGS */\\r\\n\\r\\n.p-xxs {\\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.p-xs {\\r\\n padding: 10px;\\r\\n}\\r\\n\\r\\n.p-sm {\\r\\n padding: 15px;\\r\\n}\\r\\n\\r\\n.p-m {\\r\\n padding: 20px;\\r\\n}\\r\\n\\r\\n.p-md {\\r\\n padding: 25px;\\r\\n}\\r\\n\\r\\n.p-lg {\\r\\n padding: 30px;\\r\\n}\\r\\n\\r\\n.p-xl {\\r\\n padding: 40px;\\r\\n}\\r\\n\\r\\n.m-xxs {\\r\\n margin: 2px 4px;\\r\\n}\\r\\n\\r\\n.m-xs {\\r\\n margin: 5px;\\r\\n}\\r\\n\\r\\n.m-sm {\\r\\n margin: 10px;\\r\\n}\\r\\n\\r\\n.m {\\r\\n margin: 15px;\\r\\n}\\r\\n\\r\\n.m-md {\\r\\n margin: 20px;\\r\\n}\\r\\n\\r\\n.m-lg {\\r\\n margin: 30px;\\r\\n}\\r\\n\\r\\n.m-xl {\\r\\n margin: 50px;\\r\\n}\\r\\n\\r\\n.m-n {\\r\\n margin: 0 !important;\\r\\n}\\r\\n\\r\\n.m-l-none {\\r\\n margin-left: 0;\\r\\n}\\r\\n\\r\\n.m-l-xs {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.m-l-sm {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.m-l {\\r\\n margin-left: 15px;\\r\\n}\\r\\n\\r\\n.m-l-md {\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n.m-l-lg {\\r\\n margin-left: 30px;\\r\\n}\\r\\n\\r\\n.m-l-xl {\\r\\n margin-left: 40px;\\r\\n}\\r\\n\\r\\n.m-l-n-xxs {\\r\\n margin-left: -1px;\\r\\n}\\r\\n\\r\\n.m-l-n-xs {\\r\\n margin-left: -5px;\\r\\n}\\r\\n\\r\\n.m-l-n-sm {\\r\\n margin-left: -10px;\\r\\n}\\r\\n\\r\\n.m-l-n {\\r\\n margin-left: -15px;\\r\\n}\\r\\n\\r\\n.m-l-n-md {\\r\\n margin-left: -20px;\\r\\n}\\r\\n\\r\\n.m-l-n-lg {\\r\\n margin-left: -30px;\\r\\n}\\r\\n\\r\\n.m-l-n-xl {\\r\\n margin-left: -40px;\\r\\n}\\r\\n\\r\\n.m-t-none {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n.m-t-xxs {\\r\\n margin-top: 1px;\\r\\n}\\r\\n\\r\\n.m-t-xs {\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.m-t-sm {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.m-t {\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n.m-t-md {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n.m-t-lg {\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n.m-t-xl {\\r\\n margin-top: 40px;\\r\\n}\\r\\n\\r\\n.m-t-n-xxs {\\r\\n margin-top: -1px;\\r\\n}\\r\\n\\r\\n.m-t-n-xs {\\r\\n margin-top: -5px;\\r\\n}\\r\\n\\r\\n.m-t-n-sm {\\r\\n margin-top: -10px;\\r\\n}\\r\\n\\r\\n.m-t-n {\\r\\n margin-top: -15px;\\r\\n}\\r\\n\\r\\n.m-t-n-md {\\r\\n margin-top: -20px;\\r\\n}\\r\\n\\r\\n.m-t-n-lg {\\r\\n margin-top: -30px;\\r\\n}\\r\\n\\r\\n.m-t-n-xl {\\r\\n margin-top: -40px;\\r\\n}\\r\\n\\r\\n.m-r-none {\\r\\n margin-right: 0;\\r\\n}\\r\\n\\r\\n.m-r-xxs {\\r\\n margin-right: 1px;\\r\\n}\\r\\n\\r\\n.m-r-xs {\\r\\n margin-right: 5px;\\r\\n}\\r\\n\\r\\n.m-r-sm {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.m-r {\\r\\n margin-right: 15px;\\r\\n}\\r\\n\\r\\n.m-r-md {\\r\\n margin-right: 20px;\\r\\n}\\r\\n\\r\\n.m-r-lg {\\r\\n margin-right: 30px;\\r\\n}\\r\\n\\r\\n.m-r-xl {\\r\\n margin-right: 40px;\\r\\n}\\r\\n\\r\\n.m-r-n-xxs {\\r\\n margin-right: -1px;\\r\\n}\\r\\n\\r\\n.m-r-n-xs {\\r\\n margin-right: -5px;\\r\\n}\\r\\n\\r\\n.m-r-n-sm {\\r\\n margin-right: -10px;\\r\\n}\\r\\n\\r\\n.m-r-n {\\r\\n margin-right: -15px;\\r\\n}\\r\\n\\r\\n.m-r-n-md {\\r\\n margin-right: -20px;\\r\\n}\\r\\n\\r\\n.m-r-n-lg {\\r\\n margin-right: -30px;\\r\\n}\\r\\n\\r\\n.m-r-n-xl {\\r\\n margin-right: -40px;\\r\\n}\\r\\n\\r\\n.m-b-none {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.m-b-xxs {\\r\\n margin-bottom: 1px;\\r\\n}\\r\\n\\r\\n.m-b-xs {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.m-b-sm {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.m-b {\\r\\n margin-bottom: 15px;\\r\\n}\\r\\n\\r\\n.m-b-md {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.m-b-lg {\\r\\n margin-bottom: 30px;\\r\\n}\\r\\n\\r\\n.m-b-xl {\\r\\n margin-bottom: 40px;\\r\\n}\\r\\n\\r\\n.m-b-n-xxs {\\r\\n margin-bottom: -1px;\\r\\n}\\r\\n\\r\\n.m-b-n-xs {\\r\\n margin-bottom: -5px;\\r\\n}\\r\\n\\r\\n.m-b-n-sm {\\r\\n margin-bottom: -10px;\\r\\n}\\r\\n\\r\\n.m-b-n {\\r\\n margin-bottom: -15px;\\r\\n}\\r\\n\\r\\n.m-b-n-md {\\r\\n margin-bottom: -20px;\\r\\n}\\r\\n\\r\\n.m-b-n-lg {\\r\\n margin-bottom: -30px;\\r\\n}\\r\\n\\r\\n.m-b-n-xl {\\r\\n margin-bottom: -40px;\\r\\n}\\r\\n\\r\\n.space-15 {\\r\\n margin: 15px 0;\\r\\n}\\r\\n\\r\\n.space-20 {\\r\\n margin: 20px 0;\\r\\n}\\r\\n\\r\\n.space-25 {\\r\\n margin: 25px 0;\\r\\n}\\r\\n\\r\\n.space-30 {\\r\\n margin: 30px 0;\\r\\n}\\r\\n\\r\\n// Bootstrap issue in 3.3.0 with modal https://github.com/twbs/bootstrap/issues/9855\\r\\n// Fix\\r\\nbody.modal-open { padding-right:inherit !important; }\\r\\n\\r\\n/* Style correction for Vector Map */\\r\\n.jvectormap-zoomin, .jvectormap-zoomout {\\r\\n width: 15px;\\r\\n height: 15px;\\r\\n background: #1ab394;\\r\\n}\",\"/* SEARCH PAGE */\\r\\n\\r\\n.search-form {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.search-result h3 {\\r\\n margin-bottom: 0;\\r\\n color: #1e0fbe;\\r\\n}\\r\\n\\r\\n.search-result .search-link {\\r\\n color: #006621;\\r\\n}\\r\\n\\r\\n.search-result p {\\r\\n font-size: 12px;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n/* CONTACTS */\\r\\n\\r\\n.contact-box {\\r\\n background-color: white;\\r\\n border: 1px solid $border-color;\\r\\n padding: 20px;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.contact-box a {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n/* INVOICE */\\r\\n\\r\\n.invoice-table tbody > tr > td:last-child, .invoice-table tbody > tr > td:nth-child(4), .invoice-table tbody > tr > td:nth-child(3), .invoice-table tbody > tr > td:nth-child(2) {\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.invoice-table thead > tr > th:last-child, .invoice-table thead > tr > th:nth-child(4), .invoice-table thead > tr > th:nth-child(3), .invoice-table thead > tr > th:nth-child(2) {\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.invoice-total > tbody > tr > td:first-child {\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.invoice-total > tbody > tr > td {\\r\\n border: 0 none;\\r\\n}\\r\\n\\r\\n.invoice-total > tbody > tr > td:last-child {\\r\\n border-bottom: 1px solid #dddddd;\\r\\n text-align: right;\\r\\n width: 15%;\\r\\n}\\r\\n\\r\\n/* ERROR & LOGIN & LOCKSCREEN */\\r\\n\\r\\n.middle-box {\\r\\n max-width: 400px;\\r\\n z-index: 100;\\r\\n margin: 0 auto;\\r\\n padding-top: 40px;\\r\\n}\\r\\n\\r\\n.lockscreen.middle-box {\\r\\n width: 200px;\\r\\n padding-top: 110px;\\r\\n}\\r\\n\\r\\n.loginscreen.middle-box {\\r\\n width: 300px;\\r\\n}\\r\\n\\r\\n.loginColumns {\\r\\n max-width: 800px;\\r\\n margin: 0 auto;\\r\\n padding: 100px 20px 20px 20px;\\r\\n}\\r\\n\\r\\n.passwordBox {\\r\\n max-width: 460px;\\r\\n margin: 0 auto;\\r\\n padding: 100px 20px 20px 20px;\\r\\n}\\r\\n\\r\\n.logo-name {\\r\\n color: #e6e6e6;\\r\\n font-size: 180px;\\r\\n font-weight: 800;\\r\\n letter-spacing: -10px;\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n.middle-box h1 {\\r\\n font-size: 170px;\\r\\n}\\r\\n\\r\\n.wrapper .middle-box {\\r\\n margin-top: 140px;\\r\\n}\\r\\n\\r\\n.lock-word {\\r\\n z-index: 10;\\r\\n position: absolute;\\r\\n top: 110px;\\r\\n left: 50%;\\r\\n margin-left: -470px;\\r\\n}\\r\\n\\r\\n.lock-word span {\\r\\n font-size: 100px;\\r\\n font-weight: 600;\\r\\n color: #e9e9e9;\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.lock-word .first-word {\\r\\n margin-right: 160px;\\r\\n}\\r\\n\\r\\n/* DASBOARD */\\r\\n\\r\\n.dashboard-header {\\r\\n border-top: 0;\\r\\n padding: 20px 20px 20px 20px;\\r\\n}\\r\\n\\r\\n.dashboard-header h2 {\\r\\n margin-top: 10px;\\r\\n font-size: 26px;\\r\\n}\\r\\n\\r\\n.fist-item {\\r\\n border-top: none !important;\\r\\n}\\r\\n\\r\\n.statistic-box {\\r\\n margin-top: 40px;\\r\\n}\\r\\n\\r\\n.dashboard-header .list-group-item span.label {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.list-group.clear-list .list-group-item {\\r\\n border-top: 1px solid $border-color;\\r\\n border-bottom: 0;\\r\\n border-right: 0;\\r\\n border-left: 0;\\r\\n padding: 10px 0;\\r\\n}\\r\\n\\r\\nul.clear-list:first-child {\\r\\n border-top: none !important;\\r\\n}\\r\\n\\r\\n/* Intimeline */\\r\\n\\r\\n.timeline-item .date i {\\r\\n position: absolute;\\r\\n top: 0;\\r\\n right: 0;\\r\\n padding: 5px;\\r\\n width: 30px;\\r\\n text-align: center;\\r\\n border-top: 1px solid $border-color;\\r\\n border-bottom: 1px solid $border-color;\\r\\n border-left: 1px solid $border-color;\\r\\n background: #f8f8f8;\\r\\n}\\r\\n\\r\\n.timeline-item .date {\\r\\n text-align: right;\\r\\n width: 110px;\\r\\n position: relative;\\r\\n padding-top: 30px;\\r\\n}\\r\\n\\r\\n.timeline-item .content {\\r\\n border-left: 1px solid $border-color;\\r\\n border-top: 1px solid $border-color;\\r\\n padding-top: 10px;\\r\\n min-height: 100px;\\r\\n}\\r\\n\\r\\n.timeline-item .content:hover {\\r\\n background: #f6f6f6;\\r\\n}\\r\\n\\r\\n/* PIN BOARD */\\r\\nul.notes li, ul.tag-list li {\\r\\n list-style: none;\\r\\n}\\r\\n\\r\\nul.notes li h4 {\\r\\n margin-top: 20px;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\nul.notes li div {\\r\\n text-decoration: none;\\r\\n color: black;\\r\\n background: #ffffcc;\\r\\n display: block;\\r\\n height: 140px;\\r\\n width: 140px;\\r\\n padding: 1em;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\nul.notes li div small {\\r\\n position: absolute;\\r\\n top: 5px;\\r\\n right: 5px;\\r\\n font-size: 10px;\\r\\n}\\r\\n\\r\\nul.notes li div a {\\r\\n position: absolute;\\r\\n right: 10px;\\r\\n bottom: 10px;\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\nul.notes li {\\r\\n margin: 10px 40px 50px 0px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\nul.notes li div p {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\nul.notes li div {\\r\\n text-decoration: none;\\r\\n color: black;\\r\\n background: #ffffcc;\\r\\n display: block;\\r\\n height: 140px;\\r\\n width: 140px;\\r\\n padding: 1em;\\r\\n /* Firefox */\\r\\n -moz-box-shadow: 5px 5px 2px rgba(33, 33, 33, 1);\\r\\n /* Safari+Chrome */\\r\\n -webkit-box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);\\r\\n /* Opera */\\r\\n box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);\\r\\n}\\r\\n\\r\\nul.notes li div {\\r\\n -webkit-transform: rotate(-6deg);\\r\\n -o-transform: rotate(-6deg);\\r\\n -moz-transform: rotate(-6deg);\\r\\n}\\r\\n\\r\\nul.notes li:nth-child(even) div {\\r\\n -o-transform: rotate(4deg);\\r\\n -webkit-transform: rotate(4deg);\\r\\n -moz-transform: rotate(4deg);\\r\\n position: relative;\\r\\n top: 5px;\\r\\n}\\r\\n\\r\\nul.notes li:nth-child(3n) div {\\r\\n -o-transform: rotate(-3deg);\\r\\n -webkit-transform: rotate(-3deg);\\r\\n -moz-transform: rotate(-3deg);\\r\\n position: relative;\\r\\n top: -5px;\\r\\n}\\r\\n\\r\\nul.notes li:nth-child(5n) div {\\r\\n -o-transform: rotate(5deg);\\r\\n -webkit-transform: rotate(5deg);\\r\\n -moz-transform: rotate(5deg);\\r\\n position: relative;\\r\\n top: -10px;\\r\\n}\\r\\n\\r\\nul.notes li div:hover, ul.notes li div:focus {\\r\\n -webkit-transform: scale(1.1);\\r\\n -moz-transform: scale(1.1);\\r\\n -o-transform: scale(1.1);\\r\\n position: relative;\\r\\n z-index: 5;\\r\\n}\\r\\n\\r\\nul.notes li div {\\r\\n text-decoration: none;\\r\\n color: black;\\r\\n background: #ffffcc;\\r\\n display: block;\\r\\n height: 210px;\\r\\n width: 210px;\\r\\n padding: 1em;\\r\\n -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, 1);\\r\\n -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);\\r\\n box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);\\r\\n -moz-transition: -moz-transform 0.15s linear;\\r\\n -o-transition: -o-transform 0.15s linear;\\r\\n -webkit-transition: -webkit-transform 0.15s linear;\\r\\n}\\r\\n\\r\\n/* FILE MANAGER */\\r\\n\\r\\n.file-box {\\r\\n float: left;\\r\\n width: 220px;\\r\\n}\\r\\n\\r\\n.file-manager h5 {\\r\\n text-transform: uppercase;\\r\\n}\\r\\n\\r\\n.file-manager {\\r\\n list-style: none outside none;\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.folder-list li a {\\r\\n color: #666666;\\r\\n display: block;\\r\\n padding: 5px 0;\\r\\n}\\r\\n\\r\\n.folder-list li {\\r\\n border-bottom: 1px solid $border-color;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.folder-list li i {\\r\\n margin-right: 8px;\\r\\n color: #3d4d5d;\\r\\n}\\r\\n\\r\\n.category-list li a {\\r\\n color: #666666;\\r\\n display: block;\\r\\n padding: 5px 0;\\r\\n}\\r\\n\\r\\n.category-list li {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.category-list li i {\\r\\n margin-right: 8px;\\r\\n color: #3d4d5d;\\r\\n}\\r\\n\\r\\n.category-list li a .text-navy {\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n.category-list li a .text-primary {\\r\\n color: $blue;\\r\\n}\\r\\n\\r\\n.category-list li a .text-info {\\r\\n color: $lazur;\\r\\n}\\r\\n\\r\\n.category-list li a .text-danger {\\r\\n color: #ef5352;\\r\\n}\\r\\n\\r\\n.category-list li a .text-warning {\\r\\n color: #f8ac59;\\r\\n}\\r\\n\\r\\n.file-manager h5.tag-title {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n.tag-list li {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.tag-list li a {\\r\\n font-size: 10px;\\r\\n background-color: $gray;\\r\\n padding: 5px 12px;\\r\\n color: inherit;\\r\\n border-radius: 2px;\\r\\n border: 1px solid $border-color;\\r\\n margin-right: 5px;\\r\\n margin-top: 5px;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.file {\\r\\n border: 1px solid $border-color;\\r\\n padding: 0;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n margin-bottom: 20px;\\r\\n margin-right: 20px;\\r\\n}\\r\\n\\r\\n.file-manager .hr-line-dashed {\\r\\n margin: 15px 0;\\r\\n}\\r\\n\\r\\n.file .icon, .file .image {\\r\\n height: 100px;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.file .icon {\\r\\n padding: 15px 10px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.file-control {\\r\\n color: inherit;\\r\\n font-size: 11px;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.file-control.active {\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.file .icon i {\\r\\n font-size: 70px;\\r\\n color: #dadada;\\r\\n}\\r\\n\\r\\n.file .file-name {\\r\\n padding: 10px;\\r\\n background-color: #f8f8f8;\\r\\n border-top: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.file-name small {\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.file-name p {\\r\\n color: $text-color;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.corner {\\r\\n position: absolute;\\r\\n display: inline-block;\\r\\n width: 0;\\r\\n height: 0;\\r\\n line-height: 0;\\r\\n border: 0.6em solid transparent;\\r\\n border-right: 0.6em solid #f1f1f1;\\r\\n border-bottom: 0.6em solid #f1f1f1;\\r\\n right: 0em;\\r\\n bottom: 0em;\\r\\n}\\r\\n\\r\\na.compose-mail {\\r\\n padding: 8px 10px;\\r\\n}\\r\\n\\r\\n.mail-search {\\r\\n max-width: 300px;\\r\\n}\\r\\n\\r\\n/* PROFILE */\\r\\n\\r\\n.profile-content {\\r\\n border-top: none !important;\\r\\n}\\r\\n\\r\\n.feed-activity-list .feed-element {\\r\\n border-bottom: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.feed-element:first-child {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n.feed-element {\\r\\n padding-bottom: 15px;\\r\\n}\\r\\n\\r\\n.feed-element, .feed-element .media {\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n.feed-element, .media-body {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.feed-element > .pull-left {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.feed-element img.img-circle, .dropdown-messages-box img.img-circle {\\r\\n width: 38px;\\r\\n height: 38px;\\r\\n}\\r\\n\\r\\n.feed-element .well {\\r\\n border: 1px solid $border-color;\\r\\n box-shadow: none;\\r\\n margin-top: 10px;\\r\\n margin-bottom: 5px;\\r\\n padding: 10px 20px;\\r\\n font-size: 11px;\\r\\n line-height: 16px;\\r\\n}\\r\\n\\r\\n.feed-element .actions {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.feed-element .photos {\\r\\n margin: 10px 0;\\r\\n}\\r\\n\\r\\n.feed-photo {\\r\\n max-height: 180px;\\r\\n border-radius: 4px;\\r\\n overflow: hidden;\\r\\n margin-right: 10px;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n/* MAILBOX */\\r\\n\\r\\n.mail-box {\\r\\n background-color: white;\\r\\n border: 1px solid $border-color;\\r\\n border-top: 0;\\r\\n padding: 0px;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.mail-box-header {\\r\\n background-color: white;\\r\\n border: 1px solid $border-color;\\r\\n border-bottom: 0;\\r\\n padding: 30px 20px 20px 20px;\\r\\n}\\r\\n\\r\\n.mail-box-header h2 {\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.mailbox-content .tag-list li a {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.mail-body {\\r\\n border-top: 1px solid $border-color;\\r\\n padding: 20px;\\r\\n}\\r\\n\\r\\n.mail-text {\\r\\n border-top: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.mail-text .note-toolbar {\\r\\n padding: 10px 15px;\\r\\n}\\r\\n\\r\\n.mail-body .form-group {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.mail-text .note-editor .note-toolbar {\\r\\n background-color: #f9f8f8;\\r\\n}\\r\\n\\r\\n.mail-attachment {\\r\\n border-top: 1px solid $border-color;\\r\\n padding: 20px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.mailbox-content {\\r\\n background: none;\\r\\n border: none;\\r\\n padding: 10px;\\r\\n}\\r\\n\\r\\n.mail-ontact {\\r\\n width: 23%;\\r\\n}\\r\\n\\r\\n/* PROJECTS */\\r\\n.project-people, .project-actions {\\r\\n text-align: right;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\ndd.project-people {\\r\\n text-align: left;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.project-people img {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n}\\r\\n\\r\\n.project-title a {\\r\\n font-size: 14px;\\r\\n color: $text-color;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.project-list table tr td {\\r\\n border-top: none;\\r\\n border-bottom: 1px solid $border-color;\\r\\n padding: 15px 10px;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.project-manager .tag-list li a {\\r\\n font-size: 10px;\\r\\n background-color: white;\\r\\n padding: 5px 12px;\\r\\n color: inherit;\\r\\n border-radius: 2px;\\r\\n border: 1px solid $border-color;\\r\\n margin-right: 5px;\\r\\n margin-top: 5px;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.project-files li a {\\r\\n font-size: 11px;\\r\\n color: $text-color;\\r\\n margin-left: 10px;\\r\\n line-height: 22px;\\r\\n}\\r\\n\\r\\n/* FAQ */\\r\\n\\r\\n.faq-item {\\r\\n padding: 20px;\\r\\n margin-bottom: 2px;\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.faq-question {\\r\\n font-size: 18px;\\r\\n font-weight: 600;\\r\\n color: $navy;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.faq-question:hover {\\r\\n color: darken($navy, 5%);\\r\\n}\\r\\n\\r\\n.faq-answer {\\r\\n margin-top: 10px;\\r\\n background: $gray;\\r\\n border: 1px solid $border-color;\\r\\n border-radius: 3px;\\r\\n padding: 15px;\\r\\n}\\r\\n\\r\\n.faq-item .tag-item {\\r\\n background: $gray;\\r\\n padding: 2px 6px;\\r\\n font-size: 10px;\\r\\n text-transform: uppercase;\\r\\n}\\r\\n\\r\\n\\r\\n/* Chat view */\\r\\n.message-input {\\r\\n height: 90px !important;\\r\\n}\\r\\n\\r\\n.chat-avatar {\\r\\n white: 36px;\\r\\n height: 36px;\\r\\n float: left;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.chat-user-name {\\r\\n padding: 10px;\\r\\n}\\r\\n\\r\\n.chat-user {\\r\\n padding: 8px 10px;\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.chat-user a {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.chat-view {\\r\\n z-index: 20012;\\r\\n}\\r\\n\\r\\n.chat-users, .chat-statistic {\\r\\n margin-left: -30px;\\r\\n}\\r\\n\\r\\n@media (max-width: 992px) {\\r\\n .chat-users,.chat-statistic {\\r\\n margin-left: 0px;\\r\\n }\\r\\n}\\r\\n.chat-view .ibox-content {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.chat-message {\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.message-avatar {\\r\\n height: 48px;\\r\\n width: 48px;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 4px;\\r\\n margin-top: 1px;\\r\\n}\\r\\n\\r\\n.chat-discussion .chat-message.left .message-avatar {\\r\\n float: left;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.chat-discussion .chat-message.right .message-avatar {\\r\\n float: right;\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.message {\\r\\n background-color: #fff;\\r\\n border: 1px solid #C2C4CC;\\r\\n text-align: left;\\r\\n display: block;\\r\\n padding: 10px 20px;\\r\\n position: relative;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.chat-discussion .chat-message.left .message-date {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.chat-discussion .chat-message.right .message-date {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.chat-discussion .chat-message.left .message {\\r\\n text-align: left;\\r\\n margin-left: 55px;\\r\\n}\\r\\n\\r\\n.chat-discussion .chat-message.right .message {\\r\\n text-align: right;\\r\\n margin-right: 55px;\\r\\n}\\r\\n\\r\\n.message-date {\\r\\n font-size: 10px;\\r\\n color: #888888;\\r\\n}\\r\\n\\r\\n.message-content {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.chat-discussion {\\r\\n background: #eee;\\r\\n padding: 15px;\\r\\n height: 400px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\n.chat-users {\\r\\n overflow-y: auto;\\r\\n height: 400px;\\r\\n}\\r\\n\\r\\n.chat-message-form .form-group {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n/* jsTree */\\r\\n.jstree-open > .jstree-anchor > .fa-folder:before {\\r\\n content: \\\"\\\\f07c\\\";\\r\\n}\\r\\n\\r\\n.jstree-default .jstree-icon.none {\\r\\n width: 0;\\r\\n}\\r\\n\\r\\n\\r\\n/* CLIENTS */\\r\\n\\r\\n.clients-list {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n.clients-list .tab-pane {\\r\\n position: relative;\\r\\n height: 600px;\\r\\n}\\r\\n\\r\\n.client-detail {\\r\\n position: relative;\\r\\n height: 620px;\\r\\n}\\r\\n\\r\\n.clients-list table tr td {\\r\\n height: 46px;\\r\\n vertical-align: middle;\\r\\n border: none ;\\r\\n}\\r\\n\\r\\n.client-link {\\r\\n font-weight: 600;\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.client-link:hover {\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n.client-avatar {\\r\\n width: 42px;\\r\\n}\\r\\n\\r\\n.client-avatar img {\\r\\n width: 28px;\\r\\n height: 28px;\\r\\n border-radius: 50%;\\r\\n}\\r\\n\\r\\n.contact-type {\\r\\n width: 20px;\\r\\n color: lighten($text-color, 35%);\\r\\n}\\r\\n\\r\\n.client-status {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.client-detail .vertical-timeline-content p {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.client-detail .vertical-timeline-icon.gray-bg {\\r\\n color: lighten($text-color, 25px);\\r\\n}\\r\\n\\r\\n.clients-list {\\r\\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\\r\\n border-bottom: 1px solid #fff;\\r\\n }\\r\\n}\\r\\n\\r\\n/* BLOG ARTICLE */\\r\\n.blog h2 {\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.blog h5 {\\r\\n margin: 0 0 5px 0;\\r\\n}\\r\\n\\r\\n.blog .btn{\\r\\n margin: 0 0 5px 0;\\r\\n}\\r\\n\\r\\n.article h1 {\\r\\n font-size: 48px;\\r\\n font-weight: 700;\\r\\n color: #2F4050;\\r\\n}\\r\\n\\r\\n.article p {\\r\\n font-size: 15px;\\r\\n line-height: 26px;\\r\\n}\\r\\n\\r\\n.article-title {\\r\\n text-align: center;\\r\\n margin: 40px 0 100px 0;\\r\\n}\\r\\n\\r\\n.article .ibox-content {\\r\\n padding: 40px;\\r\\n}\\r\\n\\r\\n/* ISSUE TRACKER */\\r\\n\\r\\n.issue-tracker .btn-link {\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\ntable.issue-tracker tbody tr td {\\r\\n vertical-align: middle;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n.issue-info {\\r\\n width: 50%;\\r\\n}\\r\\n\\r\\n.issue-info a {\\r\\n font-weight: 600;\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.issue-info small {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n/* TEAMS */\\r\\n.team-members {\\r\\n margin: 10px 0;\\r\\n}\\r\\n\\r\\n.team-members img.img-circle {\\r\\n width: 42px;\\r\\n height: 42px;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n/* AGILE BOARD */\\r\\n\\r\\n.sortable-list {\\r\\n padding: 10px 0;\\r\\n}\\r\\n.agile-list {\\r\\n list-style: none;\\r\\n margin: 0;\\r\\n}\\r\\n.agile-list li {\\r\\n background: #FAFAFB;\\r\\n border: 1px solid #C2C4CC;\\r\\n margin: 0px 0 10px 0;\\r\\n padding: 10px;\\r\\n border-radius: 2px;\\r\\n}\\r\\n.agile-list li:hover {\\r\\n cursor: pointer;\\r\\n background: #fff;\\r\\n}\\r\\n.agile-list li.warning-element {\\r\\n border-left: 3px solid $yellow;\\r\\n}\\r\\n.agile-list li.danger-element {\\r\\n border-left: 3px solid $red;\\r\\n}\\r\\n.agile-list li.info-element {\\r\\n border-left: 3px solid $blue;\\r\\n}\\r\\n.agile-list li.success-element {\\r\\n border-left: 3px solid $navy;\\r\\n}\\r\\n.agile-detail {\\r\\n margin-top: 5px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n/* DIFF */\\r\\nins {\\r\\n background-color: #c6ffc6;\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\ndel {\\r\\n background-color: #ffc6c6;\\r\\n}\\r\\n\\r\\n\\r\\n/* E-commerce */\\r\\n.product-box {\\r\\n padding: 0;\\r\\n\\r\\n border: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.product-box:hover,\\r\\n.product-box.active {\\r\\n border: 1px solid transparent;\\r\\n -webkit-box-shadow: 0px 3px 7px 0px rgba(168,168,168,1);\\r\\n -moz-box-shadow: 0px 3px 7px 0px rgba(168,168,168,1);\\r\\n box-shadow: 0px 3px 7px 0px rgba(168,168,168,1);\\r\\n}\\r\\n\\r\\n.product-imitation {\\r\\n text-align: center;\\r\\n padding: 90px 0;\\r\\n background-color: lighten($gray, 2%);\\r\\n color: darken($gray, 20%);\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.product-imitation.xl {\\r\\n padding: 120px 0;\\r\\n}\\r\\n\\r\\n.product-desc {\\r\\n padding: 20px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.ecommerce .tag-list {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.ecommerce .fa-star {\\r\\n color: $light-gray;\\r\\n}\\r\\n\\r\\n.ecommerce .fa-star.active {\\r\\n color: $yellow;\\r\\n}\\r\\n\\r\\n.ecommerce .note-editor {\\r\\n border: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.product-name {\\r\\n font-size: 16px;\\r\\n font-weight: 600;\\r\\n color: $text-color;\\r\\n display: block;\\r\\n margin: 2px 0 5px 0;\\r\\n}\\r\\n\\r\\n.product-name:hover,\\r\\n.product-name:focus {\\r\\n color: $navy;\\r\\n}\\r\\n\\r\\n.product-price {\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n color: #ffffff;\\r\\n background-color: $navy;\\r\\n padding: 6px 12px;\\r\\n\\r\\n position: absolute;\\r\\n top: -32px;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n/* Social feed */\\r\\n.social-feed-separated .social-feed-box {\\r\\n margin-left: 62px;\\r\\n}\\r\\n\\r\\n.social-feed-separated .social-avatar {\\r\\n float: left;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.social-feed-separated .social-avatar img {\\r\\n width: 52px;\\r\\n height: 52px;\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.social-feed-separated .social-feed-box .social-avatar {\\r\\n padding: 15px 15px 0 15px;\\r\\n float: none;\\r\\n}\\r\\n\\r\\n.social-feed-box {\\r\\n /*padding: 15px;*/\\r\\n border: 1px solid #C2C4CC;\\r\\n background: #fff;\\r\\n margin-bottom: 15px;\\r\\n}\\r\\n\\r\\n.article .social-feed-box {\\r\\n margin-bottom: 0;\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.article .social-feed-box:last-child{\\r\\n margin-bottom: 0;\\r\\n border-bottom: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.article .social-feed-box p {\\r\\n font-size: 13px;\\r\\n line-height: 18px;\\r\\n}\\r\\n\\r\\n.social-action {\\r\\n margin: 15px;\\r\\n}\\r\\n\\r\\n.social-avatar {\\r\\n padding: 15px 15px 0 15px;\\r\\n}\\r\\n\\r\\n.social-comment .social-comment {\\r\\n margin-left: 45px;\\r\\n}\\r\\n\\r\\n.social-avatar img {\\r\\n height: 40px;\\r\\n width: 40px;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.social-avatar .media-body a {\\r\\n font-size: 14px;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.social-body {\\r\\n padding: 15px;\\r\\n}\\r\\n\\r\\n.social-body img {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.social-footer {\\r\\n border-top: 1px solid #C2C4CC;\\r\\n padding: 10px 15px;\\r\\n background: #f9f9f9;\\r\\n}\\r\\n\\r\\n.social-footer .social-comment img {\\r\\n width: 32px;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.social-comment:first-child {\\r\\n margin-top: 0;\\r\\n}\\r\\n\\r\\n.social-comment {\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n.social-comment textarea {\\r\\n font-size: 12px;\\r\\n}\",\"#small-chat {\\r\\n position: fixed;\\r\\n bottom: 20px;\\r\\n right: 20px;\\r\\n z-index: 100;\\r\\n}\\r\\n\\r\\n#small-chat .badge {\\r\\n position: absolute;\\r\\n top: -3px;\\r\\n right: -4px;\\r\\n}\\r\\n\\r\\n.open-small-chat {\\r\\n height: 38px;\\r\\n width: 38px;\\r\\n display: block;\\r\\n background: #1ab394;\\r\\n padding: 9px 8px;\\r\\n text-align: center;\\r\\n color: #fff;\\r\\n border-radius: 50%;\\r\\n}\\r\\n\\r\\n.open-small-chat:hover {\\r\\n color: white;\\r\\n background: #1ab394;\\r\\n}\\r\\n\\r\\n\\r\\n.small-chat-box {\\r\\n display: none;\\r\\n position: fixed;\\r\\n bottom: 20px;\\r\\n right: 75px;\\r\\n background: #fff;\\r\\n border: 1px solid $border-color;\\r\\n width: 230px;\\r\\n height: 320px;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.small-chat-box.ng-small-chat {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.body-small {\\r\\n .small-chat-box {\\r\\n bottom: 70px;\\r\\n right: 20px;\\r\\n }\\r\\n}\\r\\n\\r\\n.small-chat-box.active {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.small-chat-box {\\r\\n\\r\\n .heading {\\r\\n background: $nav-bg;\\r\\n padding: 8px 15px;\\r\\n font-weight: bold;\\r\\n color: #fff;\\r\\n }\\r\\n\\r\\n .chat-date {\\r\\n opacity: 0.6;\\r\\n font-size: 10px;\\r\\n font-weight: normal;\\r\\n }\\r\\n\\r\\n .content {\\r\\n padding: 15px 15px;\\r\\n\\r\\n .author-name {\\r\\n font-weight: bold;\\r\\n margin-bottom: 3px;\\r\\n font-size: 11px;\\r\\n }\\r\\n\\r\\n > div {\\r\\n padding-bottom: 20px;\\r\\n }\\r\\n\\r\\n .chat-message {\\r\\n padding: 5px 10px;\\r\\n border-radius: 6px;\\r\\n font-size: 11px;\\r\\n line-height: 14px;\\r\\n max-width: 80%;\\r\\n background: #f3f3f4;\\r\\n margin-bottom: 10px;\\r\\n }\\r\\n\\r\\n .chat-message.active {\\r\\n background: #1ab394;\\r\\n color: #fff;\\r\\n }\\r\\n\\r\\n .left {\\r\\n text-align: left;\\r\\n clear: both;\\r\\n\\r\\n .chat-message {\\r\\n float: left;\\r\\n }\\r\\n }\\r\\n\\r\\n .right {\\r\\n text-align: right;\\r\\n clear: both;\\r\\n\\r\\n .chat-message {\\r\\n float: right;\\r\\n }\\r\\n\\r\\n }\\r\\n\\r\\n }\\r\\n\\r\\n .form-chat {\\r\\n padding: 10px 10px;\\r\\n }\\r\\n\\r\\n}\",\"/*\\r\\n * metismenu - v2.0.2\\r\\n * A jQuery menu plugin\\r\\n * https://github.com/onokumus/metisMenu\\r\\n *\\r\\n * Made by Osman Nuri Okumus\\r\\n * Under MIT License\\r\\n */\\r\\n\\r\\n.metismenu .plus-minus, .metismenu .plus-times {\\r\\n float: right\\r\\n}\\r\\n\\r\\n.metismenu .arrow {\\r\\n float: right;\\r\\n line-height: 1.42857\\r\\n}\\r\\n\\r\\n.metismenu .glyphicon.arrow:before {\\r\\n content: \\\"\\\\e079\\\"\\r\\n}\\r\\n\\r\\n.metismenu .active > a > .glyphicon.arrow:before {\\r\\n content: \\\"\\\\e114\\\"\\r\\n}\\r\\n\\r\\n.metismenu .fa.arrow:before {\\r\\n content: \\\"\\\\f104\\\"\\r\\n}\\r\\n\\r\\n.metismenu .active > a > .fa.arrow:before {\\r\\n content: \\\"\\\\f107\\\"\\r\\n}\\r\\n\\r\\n.metismenu .ion.arrow:before {\\r\\n content: \\\"\\\\f3d2\\\"\\r\\n}\\r\\n\\r\\n.metismenu .active > a > .ion.arrow:before {\\r\\n content: \\\"\\\\f3d0\\\"\\r\\n}\\r\\n\\r\\n.metismenu .fa.plus-minus:before, .metismenu .fa.plus-times:before {\\r\\n content: \\\"\\\\f067\\\"\\r\\n}\\r\\n\\r\\n.metismenu .active > a > .fa.plus-times {\\r\\n -webkit-transform: rotate(45deg);\\r\\n -ms-transform: rotate(45deg);\\r\\n transform: rotate(45deg)\\r\\n}\\r\\n\\r\\n.metismenu .active > a > .fa.plus-minus:before {\\r\\n content: \\\"\\\\f068\\\"\\r\\n}\\r\\n\\r\\n.metismenu .collapse {\\r\\n display: none\\r\\n}\\r\\n\\r\\n.metismenu .collapse.in {\\r\\n display: block\\r\\n}\\r\\n\\r\\n.metismenu .collapsing {\\r\\n position: relative;\\r\\n height: 0;\\r\\n overflow: hidden;\\r\\n -webkit-transition-timing-function: ease;\\r\\n transition-timing-function: ease;\\r\\n -webkit-transition-duration: .35s;\\r\\n transition-duration: .35s;\\r\\n -webkit-transition-property: height, visibility;\\r\\n transition-property: height, visibility\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\",\"/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *\\r\\n */\\r\\n\\r\\n.sk-spinner-rotating-plane.sk-spinner {\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n background-color: $spin-color;\\r\\n margin: $spin-margin;\\r\\n -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out;\\r\\n animation: sk-rotatePlane 1.2s infinite ease-in-out; }\\r\\n\\r\\n@-webkit-keyframes sk-rotatePlane {\\r\\n 0% {\\r\\n -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);\\r\\n transform: perspective(120px) rotateX(0deg) rotateY(0deg); }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);\\r\\n transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);\\r\\n transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } }\\r\\n\\r\\n@keyframes sk-rotatePlane {\\r\\n 0% {\\r\\n -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);\\r\\n transform: perspective(120px) rotateX(0deg) rotateY(0deg); }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);\\r\\n transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);\\r\\n transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-double-bounce.sk-spinner {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n position: relative;\\r\\n margin: $spin-margin; }\\r\\n.sk-spinner-double-bounce .sk-double-bounce1, .sk-spinner-double-bounce .sk-double-bounce2 {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n border-radius: 50%;\\r\\n background-color: $spin-color;\\r\\n opacity: 0.6;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n left: 0;\\r\\n -webkit-animation: sk-doubleBounce 2s infinite ease-in-out;\\r\\n animation: sk-doubleBounce 2s infinite ease-in-out; }\\r\\n.sk-spinner-double-bounce .sk-double-bounce2 {\\r\\n -webkit-animation-delay: -1s;\\r\\n animation-delay: -1s; }\\r\\n\\r\\n@-webkit-keyframes sk-doubleBounce {\\r\\n 0%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n@keyframes sk-doubleBounce {\\r\\n 0%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-wave.sk-spinner {\\r\\n margin: $spin-margin;\\r\\n width: 50px;\\r\\n height: 30px;\\r\\n text-align: center;\\r\\n font-size: 10px; }\\r\\n.sk-spinner-wave div {\\r\\n background-color: $spin-color;\\r\\n height: 100%;\\r\\n width: 6px;\\r\\n display: inline-block;\\r\\n -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out;\\r\\n animation: sk-waveStretchDelay 1.2s infinite ease-in-out; }\\r\\n.sk-spinner-wave .sk-rect2 {\\r\\n -webkit-animation-delay: -1.1s;\\r\\n animation-delay: -1.1s; }\\r\\n.sk-spinner-wave .sk-rect3 {\\r\\n -webkit-animation-delay: -1s;\\r\\n animation-delay: -1s; }\\r\\n.sk-spinner-wave .sk-rect4 {\\r\\n -webkit-animation-delay: -0.9s;\\r\\n animation-delay: -0.9s; }\\r\\n.sk-spinner-wave .sk-rect5 {\\r\\n -webkit-animation-delay: -0.8s;\\r\\n animation-delay: -0.8s; }\\r\\n\\r\\n@-webkit-keyframes sk-waveStretchDelay {\\r\\n 0%, 40%, 100% {\\r\\n -webkit-transform: scaleY(0.4);\\r\\n transform: scaleY(0.4); }\\r\\n\\r\\n 20% {\\r\\n -webkit-transform: scaleY(1);\\r\\n transform: scaleY(1); } }\\r\\n\\r\\n@keyframes sk-waveStretchDelay {\\r\\n 0%, 40%, 100% {\\r\\n -webkit-transform: scaleY(0.4);\\r\\n transform: scaleY(0.4); }\\r\\n\\r\\n 20% {\\r\\n -webkit-transform: scaleY(1);\\r\\n transform: scaleY(1); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-wandering-cubes.sk-spinner {\\r\\n margin: $spin-margin;\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n position: relative; }\\r\\n.sk-spinner-wandering-cubes .sk-cube1, .sk-spinner-wandering-cubes .sk-cube2 {\\r\\n background-color: $spin-color;\\r\\n width: 10px;\\r\\n height: 10px;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n left: 0;\\r\\n -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;\\r\\n animation: sk-wanderingCubeMove 1.8s infinite ease-in-out; }\\r\\n.sk-spinner-wandering-cubes .sk-cube2 {\\r\\n -webkit-animation-delay: -0.9s;\\r\\n animation-delay: -0.9s; }\\r\\n\\r\\n@-webkit-keyframes sk-wanderingCubeMove {\\r\\n 25% {\\r\\n -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);\\r\\n transform: translateX(42px) rotate(-90deg) scale(0.5); }\\r\\n\\r\\n 50% {\\r\\n /* Hack to make FF rotate in the right direction */\\r\\n -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);\\r\\n transform: translateX(42px) translateY(42px) rotate(-179deg); }\\r\\n\\r\\n 50.1% {\\r\\n -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);\\r\\n transform: translateX(42px) translateY(42px) rotate(-180deg); }\\r\\n\\r\\n 75% {\\r\\n -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);\\r\\n transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(-360deg);\\r\\n transform: rotate(-360deg); } }\\r\\n\\r\\n@keyframes sk-wanderingCubeMove {\\r\\n 25% {\\r\\n -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);\\r\\n transform: translateX(42px) rotate(-90deg) scale(0.5); }\\r\\n\\r\\n 50% {\\r\\n /* Hack to make FF rotate in the right direction */\\r\\n -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);\\r\\n transform: translateX(42px) translateY(42px) rotate(-179deg); }\\r\\n\\r\\n 50.1% {\\r\\n -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);\\r\\n transform: translateX(42px) translateY(42px) rotate(-180deg); }\\r\\n\\r\\n 75% {\\r\\n -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);\\r\\n transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(-360deg);\\r\\n transform: rotate(-360deg); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *\\r\\n */\\r\\n.sk-spinner-pulse.sk-spinner {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n margin: $spin-margin;\\r\\n background-color: $spin-color;\\r\\n border-radius: 100%;\\r\\n -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out;\\r\\n animation: sk-pulseScaleOut 1s infinite ease-in-out; }\\r\\n\\r\\n@-webkit-keyframes sk-pulseScaleOut {\\r\\n 0% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n opacity: 0; } }\\r\\n\\r\\n@keyframes sk-pulseScaleOut {\\r\\n 0% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1);\\r\\n opacity: 0; } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-chasing-dots.sk-spinner {\\r\\n margin: $spin-margin;\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n position: relative;\\r\\n text-align: center;\\r\\n -webkit-animation: sk-chasingDotsRotate 2s infinite linear;\\r\\n animation: sk-chasingDotsRotate 2s infinite linear; }\\r\\n.sk-spinner-chasing-dots .sk-dot1, .sk-spinner-chasing-dots .sk-dot2 {\\r\\n width: 60%;\\r\\n height: 60%;\\r\\n display: inline-block;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n background-color: $spin-color;\\r\\n border-radius: 100%;\\r\\n -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out;\\r\\n animation: sk-chasingDotsBounce 2s infinite ease-in-out; }\\r\\n.sk-spinner-chasing-dots .sk-dot2 {\\r\\n top: auto;\\r\\n bottom: 0px;\\r\\n -webkit-animation-delay: -1s;\\r\\n animation-delay: -1s; }\\r\\n\\r\\n@-webkit-keyframes sk-chasingDotsRotate {\\r\\n 100% {\\r\\n -webkit-transform: rotate(360deg);\\r\\n transform: rotate(360deg); } }\\r\\n\\r\\n@keyframes sk-chasingDotsRotate {\\r\\n 100% {\\r\\n -webkit-transform: rotate(360deg);\\r\\n transform: rotate(360deg); } }\\r\\n\\r\\n@-webkit-keyframes sk-chasingDotsBounce {\\r\\n 0%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n@keyframes sk-chasingDotsBounce {\\r\\n 0%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 50% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-three-bounce.sk-spinner {\\r\\n margin: $spin-margin;\\r\\n width: 70px;\\r\\n text-align: center; }\\r\\n.sk-spinner-three-bounce div {\\r\\n width: 18px;\\r\\n height: 18px;\\r\\n background-color: $spin-color;\\r\\n border-radius: 100%;\\r\\n display: inline-block;\\r\\n -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out;\\r\\n animation: sk-threeBounceDelay 1.4s infinite ease-in-out;\\r\\n /* Prevent first frame from flickering when animation starts */\\r\\n -webkit-animation-fill-mode: both;\\r\\n animation-fill-mode: both; }\\r\\n.sk-spinner-three-bounce .sk-bounce1 {\\r\\n -webkit-animation-delay: -0.32s;\\r\\n animation-delay: -0.32s; }\\r\\n.sk-spinner-three-bounce .sk-bounce2 {\\r\\n -webkit-animation-delay: -0.16s;\\r\\n animation-delay: -0.16s; }\\r\\n\\r\\n@-webkit-keyframes sk-threeBounceDelay {\\r\\n 0%, 80%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n@keyframes sk-threeBounceDelay {\\r\\n 0%, 80%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-circle.sk-spinner {\\r\\n margin: $spin-margin;\\r\\n width: 22px;\\r\\n height: 22px;\\r\\n position: relative; }\\r\\n.sk-spinner-circle .sk-circle {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n position: absolute;\\r\\n left: 0;\\r\\n top: 0; }\\r\\n.sk-spinner-circle .sk-circle:before {\\r\\n content: '';\\r\\n display: block;\\r\\n margin: $spin-margin;\\r\\n width: 20%;\\r\\n height: 20%;\\r\\n background-color: $spin-color;\\r\\n border-radius: 100%;\\r\\n -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out;\\r\\n animation: sk-circleBounceDelay 1.2s infinite ease-in-out;\\r\\n /* Prevent first frame from flickering when animation starts */\\r\\n -webkit-animation-fill-mode: both;\\r\\n animation-fill-mode: both; }\\r\\n.sk-spinner-circle .sk-circle2 {\\r\\n -webkit-transform: rotate(30deg);\\r\\n -ms-transform: rotate(30deg);\\r\\n transform: rotate(30deg); }\\r\\n.sk-spinner-circle .sk-circle3 {\\r\\n -webkit-transform: rotate(60deg);\\r\\n -ms-transform: rotate(60deg);\\r\\n transform: rotate(60deg); }\\r\\n.sk-spinner-circle .sk-circle4 {\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg); }\\r\\n.sk-spinner-circle .sk-circle5 {\\r\\n -webkit-transform: rotate(120deg);\\r\\n -ms-transform: rotate(120deg);\\r\\n transform: rotate(120deg); }\\r\\n.sk-spinner-circle .sk-circle6 {\\r\\n -webkit-transform: rotate(150deg);\\r\\n -ms-transform: rotate(150deg);\\r\\n transform: rotate(150deg); }\\r\\n.sk-spinner-circle .sk-circle7 {\\r\\n -webkit-transform: rotate(180deg);\\r\\n -ms-transform: rotate(180deg);\\r\\n transform: rotate(180deg); }\\r\\n.sk-spinner-circle .sk-circle8 {\\r\\n -webkit-transform: rotate(210deg);\\r\\n -ms-transform: rotate(210deg);\\r\\n transform: rotate(210deg); }\\r\\n.sk-spinner-circle .sk-circle9 {\\r\\n -webkit-transform: rotate(240deg);\\r\\n -ms-transform: rotate(240deg);\\r\\n transform: rotate(240deg); }\\r\\n.sk-spinner-circle .sk-circle10 {\\r\\n -webkit-transform: rotate(270deg);\\r\\n -ms-transform: rotate(270deg);\\r\\n transform: rotate(270deg); }\\r\\n.sk-spinner-circle .sk-circle11 {\\r\\n -webkit-transform: rotate(300deg);\\r\\n -ms-transform: rotate(300deg);\\r\\n transform: rotate(300deg); }\\r\\n.sk-spinner-circle .sk-circle12 {\\r\\n -webkit-transform: rotate(330deg);\\r\\n -ms-transform: rotate(330deg);\\r\\n transform: rotate(330deg); }\\r\\n.sk-spinner-circle .sk-circle2:before {\\r\\n -webkit-animation-delay: -1.1s;\\r\\n animation-delay: -1.1s; }\\r\\n.sk-spinner-circle .sk-circle3:before {\\r\\n -webkit-animation-delay: -1s;\\r\\n animation-delay: -1s; }\\r\\n.sk-spinner-circle .sk-circle4:before {\\r\\n -webkit-animation-delay: -0.9s;\\r\\n animation-delay: -0.9s; }\\r\\n.sk-spinner-circle .sk-circle5:before {\\r\\n -webkit-animation-delay: -0.8s;\\r\\n animation-delay: -0.8s; }\\r\\n.sk-spinner-circle .sk-circle6:before {\\r\\n -webkit-animation-delay: -0.7s;\\r\\n animation-delay: -0.7s; }\\r\\n.sk-spinner-circle .sk-circle7:before {\\r\\n -webkit-animation-delay: -0.6s;\\r\\n animation-delay: -0.6s; }\\r\\n.sk-spinner-circle .sk-circle8:before {\\r\\n -webkit-animation-delay: -0.5s;\\r\\n animation-delay: -0.5s; }\\r\\n.sk-spinner-circle .sk-circle9:before {\\r\\n -webkit-animation-delay: -0.4s;\\r\\n animation-delay: -0.4s; }\\r\\n.sk-spinner-circle .sk-circle10:before {\\r\\n -webkit-animation-delay: -0.3s;\\r\\n animation-delay: -0.3s; }\\r\\n.sk-spinner-circle .sk-circle11:before {\\r\\n -webkit-animation-delay: -0.2s;\\r\\n animation-delay: -0.2s; }\\r\\n.sk-spinner-circle .sk-circle12:before {\\r\\n -webkit-animation-delay: -0.1s;\\r\\n animation-delay: -0.1s; }\\r\\n\\r\\n@-webkit-keyframes sk-circleBounceDelay {\\r\\n 0%, 80%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n@keyframes sk-circleBounceDelay {\\r\\n 0%, 80%, 100% {\\r\\n -webkit-transform: scale(0);\\r\\n transform: scale(0); }\\r\\n\\r\\n 40% {\\r\\n -webkit-transform: scale(1);\\r\\n transform: scale(1); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-cube-grid {\\r\\n /*\\r\\n * Spinner positions\\r\\n * 1 2 3\\r\\n * 4 5 6\\r\\n * 7 8 9\\r\\n */ }\\r\\n.sk-spinner-cube-grid.sk-spinner {\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n margin: $spin-margin; }\\r\\n.sk-spinner-cube-grid .sk-cube {\\r\\n width: 33%;\\r\\n height: 33%;\\r\\n background-color: $spin-color;\\r\\n float: left;\\r\\n -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;\\r\\n animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(1) {\\r\\n -webkit-animation-delay: 0.2s;\\r\\n animation-delay: 0.2s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(2) {\\r\\n -webkit-animation-delay: 0.3s;\\r\\n animation-delay: 0.3s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(3) {\\r\\n -webkit-animation-delay: 0.4s;\\r\\n animation-delay: 0.4s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(4) {\\r\\n -webkit-animation-delay: 0.1s;\\r\\n animation-delay: 0.1s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(5) {\\r\\n -webkit-animation-delay: 0.2s;\\r\\n animation-delay: 0.2s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(6) {\\r\\n -webkit-animation-delay: 0.3s;\\r\\n animation-delay: 0.3s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(7) {\\r\\n -webkit-animation-delay: 0s;\\r\\n animation-delay: 0s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(8) {\\r\\n -webkit-animation-delay: 0.1s;\\r\\n animation-delay: 0.1s; }\\r\\n.sk-spinner-cube-grid .sk-cube:nth-child(9) {\\r\\n -webkit-animation-delay: 0.2s;\\r\\n animation-delay: 0.2s; }\\r\\n\\r\\n@-webkit-keyframes sk-cubeGridScaleDelay {\\r\\n 0%, 70%, 100% {\\r\\n -webkit-transform: scale3D(1, 1, 1);\\r\\n transform: scale3D(1, 1, 1); }\\r\\n\\r\\n 35% {\\r\\n -webkit-transform: scale3D(0, 0, 1);\\r\\n transform: scale3D(0, 0, 1); } }\\r\\n\\r\\n@keyframes sk-cubeGridScaleDelay {\\r\\n 0%, 70%, 100% {\\r\\n -webkit-transform: scale3D(1, 1, 1);\\r\\n transform: scale3D(1, 1, 1); }\\r\\n\\r\\n 35% {\\r\\n -webkit-transform: scale3D(0, 0, 1);\\r\\n transform: scale3D(0, 0, 1); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n * \\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-wordpress.sk-spinner {\\r\\n background-color: $spin-color;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n border-radius: 30px;\\r\\n position: relative;\\r\\n margin: $spin-margin;\\r\\n -webkit-animation: sk-innerCircle 1s linear infinite;\\r\\n animation: sk-innerCircle 1s linear infinite; }\\r\\n.sk-spinner-wordpress .sk-inner-circle {\\r\\n display: block;\\r\\n background-color: #fff;\\r\\n width: 8px;\\r\\n height: 8px;\\r\\n position: absolute;\\r\\n border-radius: 8px;\\r\\n top: 5px;\\r\\n left: 5px; }\\r\\n\\r\\n@-webkit-keyframes sk-innerCircle {\\r\\n 0% {\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(360deg);\\r\\n transform: rotate(360deg); } }\\r\\n\\r\\n@keyframes sk-innerCircle {\\r\\n 0% {\\r\\n -webkit-transform: rotate(0);\\r\\n transform: rotate(0); }\\r\\n\\r\\n 100% {\\r\\n -webkit-transform: rotate(360deg);\\r\\n transform: rotate(360deg); } }\\r\\n\\r\\n/*\\r\\n * Usage:\\r\\n *\\r\\n * \\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *
\\r\\n *\\r\\n */\\r\\n.sk-spinner-fading-circle.sk-spinner {\\r\\n margin: $spin-margin;\\r\\n width: 22px;\\r\\n height: 22px;\\r\\n position: relative; }\\r\\n.sk-spinner-fading-circle .sk-circle {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n position: absolute;\\r\\n left: 0;\\r\\n top: 0; }\\r\\n.sk-spinner-fading-circle .sk-circle:before {\\r\\n content: '';\\r\\n display: block;\\r\\n margin: $spin-margin;\\r\\n width: 18%;\\r\\n height: 18%;\\r\\n background-color: $spin-color;\\r\\n border-radius: 100%;\\r\\n -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out;\\r\\n animation: sk-circleFadeDelay 1.2s infinite ease-in-out;\\r\\n /* Prevent first frame from flickering when animation starts */\\r\\n -webkit-animation-fill-mode: both;\\r\\n animation-fill-mode: both; }\\r\\n.sk-spinner-fading-circle .sk-circle2 {\\r\\n -webkit-transform: rotate(30deg);\\r\\n -ms-transform: rotate(30deg);\\r\\n transform: rotate(30deg); }\\r\\n.sk-spinner-fading-circle .sk-circle3 {\\r\\n -webkit-transform: rotate(60deg);\\r\\n -ms-transform: rotate(60deg);\\r\\n transform: rotate(60deg); }\\r\\n.sk-spinner-fading-circle .sk-circle4 {\\r\\n -webkit-transform: rotate(90deg);\\r\\n -ms-transform: rotate(90deg);\\r\\n transform: rotate(90deg); }\\r\\n.sk-spinner-fading-circle .sk-circle5 {\\r\\n -webkit-transform: rotate(120deg);\\r\\n -ms-transform: rotate(120deg);\\r\\n transform: rotate(120deg); }\\r\\n.sk-spinner-fading-circle .sk-circle6 {\\r\\n -webkit-transform: rotate(150deg);\\r\\n -ms-transform: rotate(150deg);\\r\\n transform: rotate(150deg); }\\r\\n.sk-spinner-fading-circle .sk-circle7 {\\r\\n -webkit-transform: rotate(180deg);\\r\\n -ms-transform: rotate(180deg);\\r\\n transform: rotate(180deg); }\\r\\n.sk-spinner-fading-circle .sk-circle8 {\\r\\n -webkit-transform: rotate(210deg);\\r\\n -ms-transform: rotate(210deg);\\r\\n transform: rotate(210deg); }\\r\\n.sk-spinner-fading-circle .sk-circle9 {\\r\\n -webkit-transform: rotate(240deg);\\r\\n -ms-transform: rotate(240deg);\\r\\n transform: rotate(240deg); }\\r\\n.sk-spinner-fading-circle .sk-circle10 {\\r\\n -webkit-transform: rotate(270deg);\\r\\n -ms-transform: rotate(270deg);\\r\\n transform: rotate(270deg); }\\r\\n.sk-spinner-fading-circle .sk-circle11 {\\r\\n -webkit-transform: rotate(300deg);\\r\\n -ms-transform: rotate(300deg);\\r\\n transform: rotate(300deg); }\\r\\n.sk-spinner-fading-circle .sk-circle12 {\\r\\n -webkit-transform: rotate(330deg);\\r\\n -ms-transform: rotate(330deg);\\r\\n transform: rotate(330deg); }\\r\\n.sk-spinner-fading-circle .sk-circle2:before {\\r\\n -webkit-animation-delay: -1.1s;\\r\\n animation-delay: -1.1s; }\\r\\n.sk-spinner-fading-circle .sk-circle3:before {\\r\\n -webkit-animation-delay: -1s;\\r\\n animation-delay: -1s; }\\r\\n.sk-spinner-fading-circle .sk-circle4:before {\\r\\n -webkit-animation-delay: -0.9s;\\r\\n animation-delay: -0.9s; }\\r\\n.sk-spinner-fading-circle .sk-circle5:before {\\r\\n -webkit-animation-delay: -0.8s;\\r\\n animation-delay: -0.8s; }\\r\\n.sk-spinner-fading-circle .sk-circle6:before {\\r\\n -webkit-animation-delay: -0.7s;\\r\\n animation-delay: -0.7s; }\\r\\n.sk-spinner-fading-circle .sk-circle7:before {\\r\\n -webkit-animation-delay: -0.6s;\\r\\n animation-delay: -0.6s; }\\r\\n.sk-spinner-fading-circle .sk-circle8:before {\\r\\n -webkit-animation-delay: -0.5s;\\r\\n animation-delay: -0.5s; }\\r\\n.sk-spinner-fading-circle .sk-circle9:before {\\r\\n -webkit-animation-delay: -0.4s;\\r\\n animation-delay: -0.4s; }\\r\\n.sk-spinner-fading-circle .sk-circle10:before {\\r\\n -webkit-animation-delay: -0.3s;\\r\\n animation-delay: -0.3s; }\\r\\n.sk-spinner-fading-circle .sk-circle11:before {\\r\\n -webkit-animation-delay: -0.2s;\\r\\n animation-delay: -0.2s; }\\r\\n.sk-spinner-fading-circle .sk-circle12:before {\\r\\n -webkit-animation-delay: -0.1s;\\r\\n animation-delay: -0.1s; }\\r\\n\\r\\n@-webkit-keyframes sk-circleFadeDelay {\\r\\n 0%, 39%, 100% {\\r\\n opacity: 0; }\\r\\n\\r\\n 40% {\\r\\n opacity: 1; } }\\r\\n\\r\\n@keyframes sk-circleFadeDelay {\\r\\n 0%, 39%, 100% {\\r\\n opacity: 0; }\\r\\n\\r\\n 40% {\\r\\n opacity: 1; } }\\r\\n\\r\\n\",\"//RTL Support\\r\\nbody.rtls {\\r\\n\\r\\n #page-wrapper {\\r\\n margin: 0 220px 0 0;\\r\\n }\\r\\n\\r\\n .nav-second-level li a {\\r\\n padding: 7px 35px 7px 10px;\\r\\n }\\r\\n\\r\\n .ibox-title h5 {\\r\\n float: right;\\r\\n }\\r\\n\\r\\n .pull-right {\\r\\n float: left !important;\\r\\n }\\r\\n\\r\\n .pull-left {\\r\\n float: right !important;\\r\\n }\\r\\n\\r\\n .ibox-tools {\\r\\n float: left;\\r\\n }\\r\\n\\r\\n .stat-percent {\\r\\n float: left;\\r\\n }\\r\\n\\r\\n .navbar-right {\\r\\n float: left !important;\\r\\n }\\r\\n\\r\\n .navbar-top-links li:last-child {\\r\\n margin-left: 40px;\\r\\n margin-right: 0;\\r\\n }\\r\\n\\r\\n .minimalize-styl-2 {\\r\\n float: right;\\r\\n margin: 14px 20px 5px 5px;\\r\\n }\\r\\n\\r\\n .feed-element > .pull-left {\\r\\n margin-left: 10px;\\r\\n margin-right: 0;\\r\\n }\\r\\n\\r\\n .timeline-item .date {\\r\\n text-align: left;\\r\\n }\\r\\n\\r\\n .timeline-item .date i {\\r\\n left: 0;\\r\\n right: auto;\\r\\n }\\r\\n\\r\\n .timeline-item .content {\\r\\n border-right: 1px solid #C2C4CC;\\r\\n border-left: none;\\r\\n }\\r\\n\\r\\n .theme-config {\\r\\n left: 0;\\r\\n right: auto;\\r\\n }\\r\\n\\r\\n .spin-icon {\\r\\n border-radius: 0 20px 20px 0;\\r\\n }\\r\\n\\r\\n .toast-close-button {\\r\\n float: left;\\r\\n }\\r\\n\\r\\n #toast-container > .toast:before {\\r\\n margin: auto -1.5em auto 0.5em;\\r\\n }\\r\\n\\r\\n #toast-container > div {\\r\\n padding: 15px 50px 15px 15px;\\r\\n }\\r\\n\\r\\n .center-orientation .vertical-timeline-icon i {\\r\\n margin-left: 0;\\r\\n margin-right: -12px;\\r\\n }\\r\\n\\r\\n .vertical-timeline-icon i {\\r\\n right: 50%;\\r\\n left: auto;\\r\\n margin-left: auto;\\r\\n margin-right: -12px;\\r\\n }\\r\\n\\r\\n .file-box {\\r\\n float: right;\\r\\n }\\r\\n\\r\\n ul.notes li {\\r\\n float: right;\\r\\n }\\r\\n\\r\\n .chat-users, .chat-statistic {\\r\\n margin-right: -30px;\\r\\n margin-left: auto;\\r\\n }\\r\\n\\r\\n .dropdown-menu > li > a {\\r\\n text-align: right;\\r\\n }\\r\\n\\r\\n .b-r {\\r\\n border-left: 1px solid #C2C4CC;\\r\\n border-right: none;\\r\\n }\\r\\n\\r\\n .dd-list .dd-list {\\r\\n padding-right: 30px;\\r\\n padding-left: 0;\\r\\n }\\r\\n\\r\\n .dd-item > button {\\r\\n float: right\\r\\n }\\r\\n /* Theme config */\\r\\n .theme-config-box {\\r\\n margin-left: -220px;\\r\\n margin-right: 0;\\r\\n }\\r\\n\\r\\n .theme-config-box.show {\\r\\n margin-left: 0;\\r\\n margin-right: 0;\\r\\n }\\r\\n\\r\\n .spin-icon {\\r\\n right: 0;\\r\\n left: auto;\\r\\n }\\r\\n\\r\\n .skin-setttings {\\r\\n margin-right: 40px;\\r\\n margin-left: 0;\\r\\n }\\r\\n\\r\\n .skin-setttings {\\r\\n direction: ltr;\\r\\n }\\r\\n\\r\\n .footer.fixed {\\r\\n margin-right: 220px;\\r\\n margin-left: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 992px) {\\r\\n body.rtls {\\r\\n .chat-users,.chat-statistic {\\r\\n margin-right: 0px;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\nbody.rtls.mini-navbar .footer.fixed, body.body-small.mini-navbar .footer.fixed {\\r\\n margin: 0 70px 0 0;\\r\\n}\\r\\n\\r\\nbody.rtls.mini-navbar.fixed-sidebar .footer.fixed, body.body-small.mini-navbar .footer.fixed {\\r\\n margin: 0 0 0 0;\\r\\n}\\r\\n\\r\\n\\r\\nbody.rtls.top-navigation .navbar-toggle {\\r\\n float: right;\\r\\n margin-left: 15px;\\r\\n margin-right: 15px;\\r\\n}\\r\\n\\r\\n.body-small.rtls.top-navigation .navbar-header {\\r\\n float: none;\\r\\n}\\r\\n\\r\\nbody.rtls.top-navigation #page-wrapper {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\nbody.rtls.mini-navbar #page-wrapper {\\r\\n margin: 0 70px 0 0;\\r\\n}\\r\\n\\r\\nbody.rtls.mini-navbar.fixed-sidebar #page-wrapper {\\r\\n margin: 0 0 0 0;\\r\\n}\\r\\n\\r\\nbody.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper {\\r\\n margin: 0 $sidebar-width 0 0;\\r\\n}\\r\\n\\r\\nbody.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side {\\r\\n width: $sidebar-width;\\r\\n}\\r\\n\\r\\n.body-small.rtls .navbar-fixed-top {\\r\\n margin-right: 0px;\\r\\n}\\r\\n\\r\\n.body-small.rtls .navbar-header {\\r\\n float: right;\\r\\n}\\r\\n\\r\\nbody.rtls .navbar-top-links li:last-child {\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\nbody.rtls .top-navigation #page-wrapper, body.rtls.mini-navbar .top-navigation #page-wrapper, body.rtls.mini-navbar.top-navigation #page-wrapper {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\nbody.rtls .top-navigation .footer.fixed, body.rtls.top-navigation .footer.fixed {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n@media (max-width: 768px) {\\r\\n\\r\\n body.rtls .navbar-top-links li:last-child {\\r\\n margin-left: 20px;\\r\\n }\\r\\n\\r\\n .body-small.rtls #page-wrapper {\\r\\n position: inherit;\\r\\n margin: 0 0 0 0px;\\r\\n min-height: 1000px;\\r\\n }\\r\\n\\r\\n .body-small.rtls .navbar-static-side {\\r\\n display: none;\\r\\n z-index: 1001;\\r\\n position: absolute;\\r\\n width: 70px;\\r\\n }\\r\\n\\r\\n .body-small.rtls.mini-navbar .navbar-static-side {\\r\\n display: block;\\r\\n }\\r\\n\\r\\n .rtls.fixed-sidebar.body-small .navbar-static-side {\\r\\n display: none;\\r\\n z-index: 1\\r\\n 001;\\r\\n position: fixed;\\r\\n width: $sidebar-width;\\r\\n }\\r\\n\\r\\n .rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side {\\r\\n display: block;\\r\\n }\\r\\n\\r\\n}\\r\\n\\r\\n// For special ltr supporting plugin\\r\\n.rtls .ltr-support {\\r\\n direction: ltr;\\r\\n}\\r\\n\",\"/*\\r\\n * This is style for skin config\\r\\n * Use only in demo theme\\r\\n */\\r\\n\\r\\n.theme-config {\\r\\n position: absolute;\\r\\n top: 90px;\\r\\n right: 0px;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.theme-config-box {\\r\\n margin-right: -220px;\\r\\n position: relative;\\r\\n z-index: 2000;\\r\\n transition-duration: 0.8s;\\r\\n}\\r\\n\\r\\n.theme-config-box.show {\\r\\n margin-right: 0px;\\r\\n}\\r\\n\\r\\n.spin-icon {\\r\\n background: $navy;\\r\\n position: absolute;\\r\\n padding: 7px 10px 7px 13px;\\r\\n border-radius: 20px 0px 0px 20px;\\r\\n font-size: 16px;\\r\\n top: 0;\\r\\n left: 0px;\\r\\n width: 40px;\\r\\n color: white;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.skin-setttings {\\r\\n width: 220px;\\r\\n margin-left: 40px;\\r\\n background: $gray;\\r\\n}\\r\\n\\r\\n.skin-setttings .title {\\r\\n background: #efefef;\\r\\n text-align: center;\\r\\n text-transform: uppercase;\\r\\n font-weight: 600;\\r\\n display: block;\\r\\n padding: 10px 15px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.setings-item {\\r\\n padding: 10px 30px;\\r\\n}\\r\\n\\r\\n.setings-item.skin {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.setings-item .switch {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.skin-name a {\\r\\n text-transform: uppercase;\\r\\n}\\r\\n\\r\\n.setings-item a {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.default-skin, .blue-skin, .ultra-skin, .yellow-skin {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.default-skin {\\r\\n font-weight: 600;\\r\\n background: #1ab394;\\r\\n}\\r\\n\\r\\n.default-skin:hover {\\r\\n background: #199d82;\\r\\n}\\r\\n\\r\\n.blue-skin {\\r\\n font-weight: 600;\\r\\n background: url(\\\"patterns/header-profile-skin-1.png\\\") repeat scroll 0 0;\\r\\n}\\r\\n\\r\\n.blue-skin:hover {\\r\\n background: #0d8ddb;\\r\\n}\\r\\n\\r\\n.yellow-skin {\\r\\n font-weight: 600;\\r\\n background: url(\\\"patterns/header-profile-skin-3.png\\\") repeat scroll 0 100%;\\r\\n}\\r\\n\\r\\n.yellow-skin:hover {\\r\\n background: #ce8735;\\r\\n}\\r\\n\\r\\n.ultra-skin {\\r\\n font-weight: 600;\\r\\n background: url(\\\"patterns/header-profile-skin-2.png\\\") repeat scroll 0 0;\\r\\n}\\r\\n\\r\\n.ultra-skin:hover {\\r\\n background: #1a2d40;\\r\\n}\\r\\n\",\"/*\\r\\n * SKIN 1 - INSPINIA - Responsive Admin Theme\\r\\n * NAME - Blue light\\r\\n */\\r\\n\\r\\n// Main colors\\r\\n$skin-1-color: #0e9aef;\\r\\n$skin-1-nav-bg: #3e495f;\\r\\n$skin-1-a-color: #9ea6b9;\\r\\n$skin-1-page-bg: #f4f6fa;\\r\\n\\r\\n// Custom style\\r\\n.skin-1 .minimalize-styl-2 {\\r\\n margin: 14px 5px 5px 30px;\\r\\n}\\r\\n\\r\\n.skin-1 .navbar-top-links li:last-child {\\r\\n margin-right: 30px;\\r\\n}\\r\\n\\r\\n.skin-1.fixed-nav .minimalize-styl-2 {\\r\\n margin: 14px 5px 5px 15px;\\r\\n}\\r\\n\\r\\n.skin-1 .spin-icon {\\r\\n background: $skin-1-color !important;\\r\\n}\\r\\n\\r\\n.skin-1 .nav-header {\\r\\n background: $skin-1-color;\\r\\n background: url(\\\"patterns/header-profile-skin-1.png\\\");\\r\\n}\\r\\n\\r\\n.skin-1.mini-navbar .nav-second-level {\\r\\n background: $skin-1-nav-bg;\\r\\n}\\r\\n\\r\\n.skin-1 .breadcrumb {\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\n.skin-1 .page-heading {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.skin-1 .nav > li.active {\\r\\n background: darken($skin-1-nav-bg, 2%);\\r\\n}\\r\\n\\r\\n.skin-1 .nav > li > a {\\r\\n color: $skin-1-a-color;\\r\\n}\\r\\n\\r\\n.skin-1 .nav > li.active > a {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.skin-1 .navbar-minimalize {\\r\\n background: $skin-1-color;\\r\\n border-color: $skin-1-color;\\r\\n}\\r\\n\\r\\nbody.skin-1 {\\r\\n background: $skin-1-nav-bg;\\r\\n}\\r\\n\\r\\n.skin-1 .navbar-static-top {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.skin-1 .dashboard-header {\\r\\n background: transparent;\\r\\n border-bottom: none !important;\\r\\n border-top: none;\\r\\n padding: 20px 30px 10px 30px;\\r\\n}\\r\\n\\r\\n.fixed-nav.skin-1 .navbar-fixed-top {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.skin-1 .wrapper-content {\\r\\n padding: 30px 15px;\\r\\n}\\r\\n\\r\\n.skin-1 #page-wrapper {\\r\\n background: $skin-1-page-bg;\\r\\n}\\r\\n\\r\\n.skin-1 .ibox-title, .skin-1 .ibox-content {\\r\\n border-width: 1px;\\r\\n}\\r\\n\\r\\n.skin-1 .ibox-content:last-child {\\r\\n border-style: solid solid solid solid;\\r\\n}\\r\\n\\r\\n.skin-1 .nav > li.active {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.skin-1 .nav-header {\\r\\n padding: 35px 25px 25px 25px;\\r\\n}\\r\\n\\r\\n.skin-1 .nav-header a.dropdown-toggle {\\r\\n color: white;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.skin-1 .nav-header a.dropdown-toggle .text-muted {\\r\\n color: white;\\r\\n opacity: 0.8;\\r\\n}\\r\\n\\r\\n.skin-1 .profile-element {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.skin-1 .img-circle {\\r\\n border-radius: 5px;\\r\\n}\\r\\n\\r\\n.skin-1 .navbar-default .nav > li > a:hover, .skin-1 .navbar-default .nav > li > a:focus {\\r\\n background: darken($skin-1-nav-bg, 2%);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.skin-1 .nav.nav-tabs > li.active > a {\\r\\n color: #555;\\r\\n}\\r\\n.skin-1 .nav.nav-tabs > li.active {\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\n/*\\r\\n * SKIN 2 - INSPINIA - Responsive Admin Theme\\r\\n * NAME - Inspinia Ultra\\r\\n */\\r\\n\\r\\n// Main colors\\r\\n$skin-2-color: #23c6c8;\\r\\n$skin-2-nav-bg: #ededed;\\r\\n$skin-2-nav-top-bg: #213a53;\\r\\n\\r\\n// Custom style\\r\\n\\r\\nbody.skin-2 {\\r\\n color: #565758 !important;\\r\\n}\\r\\n\\r\\n.skin-2 .minimalize-styl-2 {\\r\\n margin: 14px 5px 5px 25px;\\r\\n}\\r\\n\\r\\n.skin-2 .navbar-top-links li:last-child {\\r\\n margin-right: 25px;\\r\\n}\\r\\n\\r\\n.skin-2 .spin-icon {\\r\\n background: $skin-2-color !important;\\r\\n}\\r\\n\\r\\n.skin-2 .nav-header {\\r\\n background: $skin-2-color;\\r\\n background: url(\\\"patterns/header-profile-skin-2.png\\\");\\r\\n}\\r\\n\\r\\n.skin-2.mini-navbar .nav-second-level {\\r\\n background: $skin-2-nav-bg;\\r\\n}\\r\\n\\r\\n.skin-2 .breadcrumb {\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\n.skin-2.fixed-nav .minimalize-styl-2 {\\r\\n margin: 14px 5px 5px 15px;\\r\\n}\\r\\n\\r\\n.skin-2 .page-heading {\\r\\n border: none;\\r\\n background: rgba(255, 255, 255, 0.7);\\r\\n}\\r\\n\\r\\n.skin-2 .nav > li.active {\\r\\n background: #e0e0e0;\\r\\n}\\r\\n\\r\\n.skin-2 .logo-element {\\r\\n padding: 17px 0;\\r\\n}\\r\\n\\r\\n.skin-2 .nav > li > a, .skin-2 .welcome-message {\\r\\n color: #edf6ff;\\r\\n}\\r\\n\\r\\n.skin-2 #top-search::-moz-placeholder {\\r\\n color: #121321;\\r\\n font: bold;\\r\\n opacity: 0.5;\\r\\n}\\r\\n\\r\\n.skin-2 #side-menu > li > a, .skin-2 .nav.nav-second-level > li > a {\\r\\n color: #586b7d;\\r\\n}\\r\\n\\r\\n.skin-2 .nav > li.active > a {\\r\\n color: $skin-2-nav-top-bg;\\r\\n}\\r\\n\\r\\n.skin-2.mini-navbar .nav-header {\\r\\n background: $skin-2-nav-top-bg;\\r\\n}\\r\\n\\r\\n.skin-2 .navbar-minimalize {\\r\\n background: $skin-2-color;\\r\\n border-color: $skin-2-color;\\r\\n}\\r\\n\\r\\n.skin-2 .border-bottom {\\r\\n border-bottom: none !important;\\r\\n}\\r\\n\\r\\n.skin-2 #top-search {\\r\\n color: white;\\r\\n}\\r\\n\\r\\nbody.skin-2 #wrapper {\\r\\n background-color: $skin-2-nav-bg;\\r\\n}\\r\\n\\r\\n.skin-2 .navbar-static-top {\\r\\n background: $skin-2-nav-top-bg;\\r\\n}\\r\\n\\r\\n.fixed-nav.skin-2 .navbar-fixed-top {\\r\\n background: $skin-2-nav-top-bg;\\r\\n border-bottom: none !important;\\r\\n}\\r\\n\\r\\n.skin-2 .nav-header {\\r\\n padding: 30px 25px 30px 25px;\\r\\n}\\r\\n\\r\\n.skin-2 .dashboard-header {\\r\\n background: rgba(255, 255, 255, 0.4);\\r\\n border-bottom: none !important;\\r\\n border-top: none;\\r\\n padding: 20px 30px 20px 30px;\\r\\n}\\r\\n\\r\\n.skin-2 .wrapper-content {\\r\\n padding: 30px 15px;\\r\\n}\\r\\n\\r\\n.skin-2 .dashoard-1 .wrapper-content {\\r\\n padding: 0px 30px 25px 30px;\\r\\n}\\r\\n\\r\\n.skin-2 .ibox-title {\\r\\n background: rgba(255, 255, 255, 0.7);\\r\\n border: none;\\r\\n margin-bottom: 1px;\\r\\n}\\r\\n\\r\\n.skin-2 .ibox-content {\\r\\n background: rgba(255, 255, 255, 0.4);\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n.skin-2 #page-wrapper {\\r\\n background: rgba(246, 246, 246, 1);\\r\\n background: -webkit-radial-gradient(center, ellipse cover, rgba(246, 246, 246, 1) 20%, rgba(213, 213, 213, 1) 100%);\\r\\n background: -o-radial-gradient(center, ellipse cover, rgba(246, 246, 246, 1) 20%, rgba(213, 213, 213, 1) 100%);\\r\\n background: -ms-radial-gradient(center, ellipse cover, rgba(246, 246, 246, 1) 20%, rgba(213, 213, 213, 1) 100%);\\r\\n background: radial-gradient(ellipse at center, rgba(246, 246, 246, 1) 20%, rgba(213, 213, 213, 1) 100%);\\r\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.gradient(startColorstr=#f6f6f6, endColorstr=#d5d5d5)\\\";\\r\\n}\\r\\n\\r\\n.skin-2 .ibox-title, .skin-2 .ibox-content {\\r\\n border-width: 1px;\\r\\n}\\r\\n\\r\\n.skin-2 .ibox-content:last-child {\\r\\n border-style: solid solid solid solid;\\r\\n}\\r\\n\\r\\n.skin-2 .nav > li.active {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.skin-2 .nav-header a.dropdown-toggle {\\r\\n color: #edf6ff;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.skin-2 .nav-header a.dropdown-toggle .text-muted {\\r\\n color: #edf6ff;\\r\\n opacity: 0.8;\\r\\n}\\r\\n\\r\\n.skin-2 .img-circle {\\r\\n border-radius: 10px;\\r\\n}\\r\\n\\r\\n.skin-2 .nav.navbar-top-links > li > a:hover, .skin-2 .nav.navbar-top-links > li > a:focus {\\r\\n background: darken($skin-2-nav-top-bg, 5%);\\r\\n}\\r\\n\\r\\n.skin-2 .navbar-default .nav > li > a:hover, .skin-2 .navbar-default .nav > li > a:focus {\\r\\n background: #e0e0e0;\\r\\n color: #213a53;\\r\\n}\\r\\n\\r\\n.skin-2 .nav.nav-tabs > li.active > a {\\r\\n color: #555;\\r\\n}\\r\\n.skin-2 .nav.nav-tabs > li.active {\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\n/*\\r\\n * SKIN 3 - INSPINIA - Responsive Admin Theme\\r\\n * NAME - Yellow/purple\\r\\n */\\r\\n\\r\\n// Main colors\\r\\n$skin-3-color: #ecba52;\\r\\n$skin-3-nav-bg: #3e2c42;\\r\\n$skin-3-a-color: #948b96;\\r\\n$skin-3-page-bg: #f4f6fa;\\r\\n\\r\\n// Custom style\\r\\n.skin-3 .minimalize-styl-2 {\\r\\n margin: 14px 5px 5px 30px;\\r\\n}\\r\\n\\r\\n.skin-3 .navbar-top-links li:last-child {\\r\\n margin-right: 30px;\\r\\n}\\r\\n\\r\\n.skin-3.fixed-nav .minimalize-styl-2 {\\r\\n margin: 14px 5px 5px 15px;\\r\\n}\\r\\n\\r\\n.skin-3 .spin-icon {\\r\\n background: $skin-3-color !important;\\r\\n}\\r\\n\\r\\nbody.boxed-layout.skin-3 #wrapper {\\r\\n background: $skin-3-nav-bg;\\r\\n}\\r\\n\\r\\n.skin-3 .nav-header {\\r\\n background: $skin-3-color;\\r\\n background: url(\\\"patterns/header-profile-skin-3.png\\\");\\r\\n}\\r\\n\\r\\n.skin-3.mini-navbar .nav-second-level {\\r\\n background: $skin-3-nav-bg;\\r\\n}\\r\\n\\r\\n.skin-3 .breadcrumb {\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\n.skin-3 .page-heading {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.skin-3 .nav > li.active {\\r\\n background: darken($skin-3-nav-bg, 2%);\\r\\n}\\r\\n\\r\\n.fixed-nav.skin-3 .navbar-fixed-top {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.skin-3 .nav > li > a {\\r\\n color: $skin-3-a-color;\\r\\n}\\r\\n\\r\\n.skin-3 .nav > li.active > a {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.skin-3 .navbar-minimalize {\\r\\n background: $skin-3-color;\\r\\n border-color: $skin-3-color;\\r\\n}\\r\\n\\r\\nbody.skin-3 {\\r\\n background: $skin-3-nav-bg;\\r\\n}\\r\\n\\r\\n.skin-3 .navbar-static-top {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.skin-3 .dashboard-header {\\r\\n background: transparent;\\r\\n border-bottom: none !important;\\r\\n border-top: none;\\r\\n padding: 20px 30px 10px 30px;\\r\\n}\\r\\n\\r\\n.skin-3 .wrapper-content {\\r\\n padding: 30px 15px;\\r\\n}\\r\\n\\r\\n.skin-3 #page-wrapper {\\r\\n background: $skin-3-page-bg;\\r\\n}\\r\\n\\r\\n.skin-3 .ibox-title, .skin-3 .ibox-content {\\r\\n border-width: 1px;\\r\\n}\\r\\n\\r\\n.skin-3 .ibox-content:last-child {\\r\\n border-style: solid solid solid solid;\\r\\n}\\r\\n\\r\\n.skin-3 .nav > li.active {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.skin-3 .nav-header {\\r\\n padding: 35px 25px 25px 25px;\\r\\n}\\r\\n\\r\\n.skin-3 .nav-header a.dropdown-toggle {\\r\\n color: white;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.skin-3 .nav-header a.dropdown-toggle .text-muted {\\r\\n color: white;\\r\\n opacity: 0.8;\\r\\n}\\r\\n\\r\\n.skin-3 .profile-element {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.skin-3 .img-circle {\\r\\n border-radius: 5px;\\r\\n}\\r\\n\\r\\n.skin-3 .navbar-default .nav > li > a:hover, .skin-3 .navbar-default .nav > li > a:focus {\\r\\n background: darken($skin-3-nav-bg, 2%);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n\\r\\n.skin-3 .nav.nav-tabs > li.active > a {\\r\\n color: #555;\\r\\n}\\r\\n.skin-3 .nav.nav-tabs > li.active {\\r\\n background: transparent;\\r\\n}\",\"@media (min-width: 768px) {\\r\\n #page-wrapper {\\r\\n position: inherit;\\r\\n margin: 0 0 0 $sidebar-width;\\r\\n min-height: 1200px;\\r\\n }\\r\\n .navbar-static-side {\\r\\n z-index: 1001;\\r\\n position: absolute;\\r\\n width: $sidebar-width;\\r\\n }\\r\\n .navbar-top-links .dropdown-messages,\\r\\n .navbar-top-links .dropdown-tasks,\\r\\n .navbar-top-links .dropdown-alerts {\\r\\n margin-left: auto;\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 768px) {\\r\\n #page-wrapper {\\r\\n position: inherit;\\r\\n margin: 0 0 0 0px;\\r\\n min-height: 1000px;\\r\\n }\\r\\n .body-small .navbar-static-side {\\r\\n display: none;\\r\\n z-index:1001;\\r\\n position: absolute;\\r\\n width: 70px;\\r\\n }\\r\\n .body-small.mini-navbar .navbar-static-side {\\r\\n display: block;\\r\\n }\\r\\n .lock-word {\\r\\n display: none;\\r\\n }\\r\\n .navbar-form-custom {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n .navbar-header {\\r\\n display: inline;\\r\\n float: left;\\r\\n }\\r\\n .sidebard-panel {\\r\\n z-index: 2;\\r\\n position: relative;\\r\\n width: auto;\\r\\n min-height: 100% !important;\\r\\n }\\r\\n .sidebar-content .wrapper {\\r\\n padding-right: 0px;\\r\\n z-index: 1;\\r\\n }\\r\\n .fixed-sidebar.body-small .navbar-static-side {\\r\\n display: none;\\r\\n z-index: 1001;\\r\\n position: fixed;\\r\\n width: $sidebar-width;\\r\\n }\\r\\n .fixed-sidebar.body-small.mini-navbar .navbar-static-side {\\r\\n display: block;\\r\\n }\\r\\n\\r\\n .ibox-tools {\\r\\n float: none;\\r\\n text-align: right;\\r\\n display: block;\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 350px) {\\r\\n .timeline-item .date {\\r\\n text-align: left;\\r\\n width: 110px;\\r\\n position: relative;\\r\\n padding-top: 30px;\\r\\n }\\r\\n .timeline-item .date i {\\r\\n position: absolute;\\r\\n top: 0;\\r\\n left: 15px;\\r\\n padding: 5px;\\r\\n width: 30px;\\r\\n text-align: center;\\r\\n border: 1px solid $border-color;\\r\\n background: #f8f8f8;\\r\\n }\\r\\n .timeline-item .content {\\r\\n border-left: none;\\r\\n border-top: 1px solid $border-color;\\r\\n padding-top: 10px;\\r\\n min-height: 100px;\\r\\n }\\r\\n .nav.navbar-top-links li.dropdown {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n .ibox-tools {\\r\\n float: none;\\r\\n text-align: left;\\r\\n display: inline-block;\\r\\n }\\r\\n}\\r\\n\",\"/* Only demo */\\r\\n@media (max-width: 1000px) {\\r\\n .welcome-message {\\r\\n display: none;\\r\\n }\\r\\n}\\r\\n\\r\\n.lightBoxGallery {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.lightBoxGallery img {\\r\\n margin: 5px;\\r\\n}\",\"/*\\r\\n *\\r\\n * INSPINIA - Responsive Admin Theme\\r\\n * version 2.2\\r\\n *\\r\\n*/\\r\\n\\r\\n// Google Fonts\\r\\n@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap');\\r\\n\\r\\n\\r\\n// Variables, Mixins\\r\\n@import \\\"variables\\\";\\r\\n@import \\\"mixins\\\";\\r\\n\\r\\n// INSPINIA Theme Elements\\r\\n@import \\\"typography\\\";\\r\\n@import \\\"navigation\\\";\\r\\n@import \\\"top_navigation\\\";\\r\\n@import \\\"buttons\\\";\\r\\n@import \\\"badgets_labels\\\";\\r\\n@import \\\"elements\\\";\\r\\n@import \\\"sidebar\\\";\\r\\n@import \\\"base\\\";\\r\\n@import \\\"pages\\\";\\r\\n@import \\\"chat\\\";\\r\\n@import \\\"metismenu\\\";\\r\\n@import \\\"spinners\\\";\\r\\n\\r\\n// Landing page\\r\\n/*@import \\\"landing\\\";*/\\r\\n\\r\\n// RTL Support\\r\\n@import \\\"rtl\\\";\\r\\n\\r\\n// For demo only - config box style\\r\\n@import \\\"theme-config\\\";\\r\\n\\r\\n// INSPINIA Skins\\r\\n@import \\\"skins\\\";\\r\\n\\r\\n// Media query style\\r\\n@import \\\"media\\\";\\r\\n\\r\\n// Custom style\\r\\n// Your custom style to override base style\\r\\n@import \\\"custom\\\";\\r\\n\\r\\nbody {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\",\".toast-title {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.toast-message {\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.toast-close-button {\\r\\n position: relative;\\r\\n right: -4px;\\r\\n top: -12px;\\r\\n float: right;\\r\\n font-size: 20px;\\r\\n font-weight: bold;\\r\\n color: rgb(103, 106, 108);\\r\\n -webkit-text-shadow: 0 1px 0 #ffffff;\\r\\n text-shadow: 0 1px 0 #ffffff;\\r\\n opacity: 0.8;\\r\\n outline: none;\\r\\n}\\r\\n\\r\\n .toast-close-button:hover,\\r\\n .toast-close-button:focus {\\r\\n color: #000000;\\r\\n text-decoration: none;\\r\\n cursor: pointer;\\r\\n opacity: 0.4;\\r\\n }\\r\\n/*Additional properties for button version\\r\\n iOS requires the button element instead of an anchor tag.\\r\\n If you want the anchor version, it requires `href=\\\"#\\\"`.*/\\r\\nbutton.toast-close-button {\\r\\n padding: 0;\\r\\n cursor: pointer;\\r\\n background: transparent;\\r\\n border: 0;\\r\\n -webkit-appearance: none;\\r\\n}\\r\\n\\r\\n.toast-top-center {\\r\\n top: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.toast-bottom-center {\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.toast-top-full-width {\\r\\n top: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.toast-bottom-full-width {\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.toast-top-left {\\r\\n top: 12px;\\r\\n left: 12px;\\r\\n}\\r\\n\\r\\n.toast-top-right {\\r\\n top: 12px;\\r\\n right: 12px;\\r\\n}\\r\\n\\r\\n.toast-bottom-right {\\r\\n right: 12px;\\r\\n bottom: 12px;\\r\\n}\\r\\n\\r\\n.toast-bottom-left {\\r\\n bottom: 12px;\\r\\n left: 12px;\\r\\n}\\r\\n\\r\\n#toast-container {\\r\\n position: fixed;\\r\\n z-index: 999999;\\r\\n /*overrides*/\\r\\n}\\r\\n\\r\\n #toast-container * {\\r\\n -moz-box-sizing: border-box;\\r\\n -webkit-box-sizing: border-box;\\r\\n box-sizing: border-box;\\r\\n }\\r\\n\\r\\n #toast-container .toast {\\r\\n position: relative;\\r\\n overflow: hidden;\\r\\n margin: 0 0 6px;\\r\\n padding: 15px 15px 15px 50px;\\r\\n width: 300px;\\r\\n -moz-border-radius: 3px 3px 3px 3px;\\r\\n -webkit-border-radius: 3px 3px 3px 3px;\\r\\n\\r\\n border-radius: 3px 3px 3px 3px;\\r\\n background-position: 15px center;\\r\\n background-repeat: no-repeat;\\r\\n /*-moz-box-shadow: 0 0 12px #999999;\\r\\n -webkit-box-shadow: 0 0 12px #999999;\\r\\n box-shadow: 0 0 12px #999999;*/\\r\\n color: #FFFFFF;\\r\\n color: rgb(103, 106, 108);\\r\\n opacity: 0.8;\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n #toast-container .toast > div {\\r\\n margin-left: 5px;\\r\\n }\\r\\n\\r\\n #toast-container .toast:hover {\\r\\n -moz-box-shadow: 0 0 12px #808080;\\r\\n -webkit-box-shadow: 0 0 12px #808080;\\r\\n box-shadow: 0 0 12px #808080;\\r\\n opacity: 1;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n.toast.toast-error, .toast.toast-loading, .toast.toast-info, .toast.toast-success, .toast.toast-warning {\\r\\n background-size: 34px;\\r\\n}\\r\\n\\r\\n\\r\\n.toast-loading {\\r\\n background-image: url('data:image/gif;base64,R0lGODlhIgAiAPYAAP////D09/n6/Ka+0H+mxdPf577Q3YmrxjOFxpezyTSGytzl7LrM2jOExTeIy+bt8vL1+GGYxMjX4vX4+rLG1jKCwpGvxzKDw9/o7vP3+TSGyDSGyTKDwnukxDSHyjOGx8zZ41OTxrjL2arB05q2y93m7djj6pq1y7bK2DKEw9Hd5jaHy+Pq8Gebxfv8/anA0jaIy7zO29bh6TuKzKG7zsTU3zKFxO3x9eju8ziIzJ23zOXs8dXg6DKExOHp7/3+/jOFxzKEwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hZSZXNpemVkIHdpdGggZXpnaWYuY29tACH5BAQDAP8ALAAAAAAiACIAAAdsgACCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmI8hNpydnp4hkjZBpKWmpjaip6ulqZGjrKuukLCxqKq2t6+5urS8rbi/s4+1vMOOxbnHjcm2y4zNsc+L0azTitWykpuf3ZyhmeHi4+Tl5ufo6ZOBACH5BAQDAP8ALAgACQASABAAAAc+gAAhNoSFhoYhAAA2QY2Oj482ioyQlY2Si5aWmJSakZOekJyhn5mkl6CnQaOqrKeupLChsp60mpiDh7qEiYEAIfkEBAMA/wAsCAAJABIAEAAABz+ALhYdhIWGhhYuAjZBjY6PjzYCi5CVjpKUlpWYjJqQnJ6fk52hjaClpqOoqZmop66qq6+ls6G1npKCh7uFiYEAIfkEBAMA/wAsCAAJABIAEAAABz+AECAShIWGhiAQNSlBjY6Pjyk1BpCVkAaUlpqYmpuZnZefoI6co4+lpo2oqaumraOvoLGdBoupQZKCh7uFiYEAIfkEBAMA/wAsBwAJABQAEAAAB0KAAIKDhIWGOCqJiouMKjiCBkGSk5SVQQaQlpqTmACRm5qdn6CVoqSWpqeUqaqSrK2vqrGns6S1oJ2IjbuJj4a/v4EAIfkEBAMA/wAsBwAKABQADgAAB0KAAIKDhIWGOAuJiouMCzgAPyNBk5SVlkEjP5GXnJSZm52cn5Khl6OlppqkqJ6qrJWnr5OxsrSvmQCIjbuJj4a/v4EAIfkEBAMA/wAsBgALABYADAAABz6AAIKDhIWGAAIUFDQHjY6PjzSKAhNBlpeYmZkTlZqempyfopeho6Klpp6oqZudrK2voImLkLWOkhQCh7uHgQAh+QQEAwD/ACwDAAwAHAAKAAAHVIACN4M3OywsOziHi4s4hoiENwI+EZURNpg2IZmcmpyWET4lQaSlpqeopyWjqa2uQauvsqqss7Oxtre1ua4llJacm52YwpigPoKEj4mMjI6HO5ECgQAh+QQEAwD/ACwBAAwAIAAKAAAHO4AAgoOEhYaHhCIni4yNjo+QiyIHQZWWl5iZmpUHlJufoJyeoaSYnaWolqepqKuspAeKkbO0koi3uIWBACH5BAQDAP8ALAAADQAiAAgAAAc1gBM4g4SFhCyIiYaLgxM1QZCRkpOUlZI1j5aam5eZnJ+VmKCjk6Kkp6anozWCjIaJiq6FE4EAIfkEBAMA/wAsAAANACIACAAAB1aAEziDgxkBhIOCiDiKhAEZixM1QZSUKAeVlJOZQZuVByicNZ6UFJiZpJqcBxSiqaainJ2rraivp5Wps5msrpywqLKpvbacl7HIn6GojYWHiM2Ji4+RgQAh+QQEAwD/ACwAAA0AIgAIAAAHe4AuAoODP4KEAj8CGYwZiYgCLoqILjwHl5clEpgHFhg0HaEdNBgWnBIlnAc8NUGurioor0E2Kh2zHSo2sygqs0E1rbOxs7W3r7m7r72/wb/Er8a4ury+s87DstG208quzNeWnJqcnqCipKaYqKo8h4SGkIqNjpOEkpAugQAh+QQEAwD/ACwAAA0AIgAIAAAHZoAAgoOEhYaHhyMviy8sBYwvFBASkBIQFJAFLJAjgiFBoEEqIqFBETgvpS84EaUiKqUhnqWjpaepoautoa+xs6G1obeqrK6wobIAn8CkwqjEu6C9yIKKjI6QkpSMlpiMmpyI4uOIgQAh+QQEAwD/ACwAAA0AIgAIAAAHZIAAgoOEhYaHhxQviy8sLowvFBMSkBITiowuLJAUgiFBoEEqAqFBLQEvpS8BLaUCKqUhnqWjpaepoautoa+xs6G1obeqrK6wobIAn8CkwqjEu6C9yIKYi46ck5WXkJqciODhiIEAIfkEBAMA/wAsAQANACAACAAAB2WAAIKDhIWGh4Q+I4sjLD+MIwwCEi+VLxICDJA/LJA+IEGhQSouokEtEC+mLxAtpi4qpiCgoqSmqKqirK6isLK0obaiuKutr7Gis6bCocS6xr3IoSCKjI6QkpSWmJqMnJ6I4eKFgQAh+QQEAwD/ACwBAA4AIAAGAAAHY4AQEjWEOAAFhDUqLgsjjiMLLiqJBQA4iRIQBUGcQSg/EZ0tASOdQSMBLZ0RPyimBZudn6Gco6WdqKqcrK6dsKazoqSmuautr7GcwbXDuKnGvZwFgomGiISLjY+Rk4SVl4SZgQAh+QQEAwD/ACwBAA4AIAAGAAAHY4AAJSaEOAA3hCY+PxMgjiATPz6JNwA4iSUAAC1BnQQAKJ1BLTcgokEgN5ydKAAEoi2aq0GfoZ2kpqKps62vt7KitbClp7uivbDAnqDDuZ3GrK7JgomGiISLjY+Rk4SVl4SZgQAh+QQEAwD/ACwBAA4AIAAGAAAHX4AANziEAQAZhDg3Py6JOC4/g4QZAAGJNwAALUGcLQAGnEERhKFBhBGhBpqhnqudn6GjOKWnqa5BrZuvoJyytDionKq6uJnEnryipKG1wretkjiGiISLjYmQ0ZSW1QCBACH5BAQDAP8ALAEADgAgAAYAAAddgAAZEIQQAAKFED8uOI04Lj+JAgCJGQAALUGaEQAGmkERjZ9BjRGfBgCmmi2XmZudn6E4o6WnqZ+smLGwm6KftZqoqkG5rqC8oL6awEHCuJeDhYeJi46PkYWTlQCBACH5BAQDAP8ALAIADgAeAAYAAAdagBMQgxAAAoQQPy43jDcuP4gCAIgTA0GXEQAGl0EhDzecQTcPIZwGABGcA5aYmpyeoJyjpZenqZernJmbl7Chs6aoqqxBu6+fv6TBt0EDgoSGiIqNjpCEkpSBACH5BAQDAP8ALAIADgAeAAYAAAdagAIQgxAAgoQ/PzeLN4mEEAIAjwIMQZYRAAaWQSEPN5tBNw8hmwYAEZsMlZeZm52fm6KklqaolqqbmJqWr6Cypaepq0G6rp6+o8C2QQyHg4aPiYyNP5OShAKBACH5BAQDAP8ALAIADgAeAAYAAAdVgAIQgxAAgoQ/PzeLN4mEEAIAjwIGQZYRAJWWIQ83lpY3DyGfBgARpJpBmKmcnp+ho5alp7Kpq5+tn0GwpKaon7ebnbq8sr6yh4OGj4mMjT+TkoQCgQAh+QQEAwD/ACwCAA4AHgAGAAAHWoATEIMQAAKEED8/N4w3iogCAIgTI0GWEQAGlkEhDzebQTcPIZsGABGbI5WXmZudn5uipJamqJaqm5ialq+gsqWnqatBuq6evqPAtkEjgoSGiIqNjj+QkoQTgQAh+QQEAwD/ACwCAA4AHgAGAAAHWoAZEIMQAAKEED8uOIw4Lj+IAgCIGS1BlxEABpdBIQ84nEE4DyGcBgARnC2WmJqcnqCco6WXp6mXq5yZm5ewobOmqKqsQbuvn7+kwbdBLYKEhoiKjY6QhJKUgQAh+QQEAwD/ACwBAA4AIAAGAAAHYYAADyyENwAQhCw4PwIYjhgCPziJEAA3iQ8AAC1BnS0ABp1BETgYokEYOBGiBpuin66eoKKkpqKpq52tnLKxQZ+hnbWnuKy+sLy/s8KlxKrGybCDhYeJi42PkZOElZeEmYEAIfkEBAMA/wAsAQAOACAABgAAB2KAPzwqhCwAO4QqJi44DI4MOC4miTsALIk8PxARQZ0EPyedQRGNokGQnJ0nPwSiERCbop+hnaQMpqiiq621sKlBs66lormqrK6+sqDCt8Q4v7vIgomGiISLjY+Rk4SVl4SZgQAh+QQEAwD/ACwBAA4AIAAGAAAHX4A+I4MjKj8UhBQZIIQjIBmIgxQ/Ko0+IEGZQTQuNpohLCOaQSMsIZo2LjSjIJianJ6ZoKKapaeZqauaraOwn6GjtqiqrK6ZvrLAtabDupkggoSGkSOKjISP1JOVhD6BACH5BAQDAP8ALAEADQAgAAgAAAdggACCg4SFhoeEGC+LLww/jIs4EpASOJAvPwyQGCBBnkEELp9BKSUvoy8lKaMuBKMgnZ+ho6Wnn6mrn62vsZ6zn7Woqqyun7Cjv57Bt8O6xZ4gioyOl5KUlpCZm4jc3YWBACH5BAQDAP8ALAEADQAgAAgAAAdkgACCg4SEP4c/hYqDCy+OLxQ/j444EjSXNBI4ky8/FJMLNUGjQREupKMlNKg0JahBLhGoNaKkpq+qrK6osbO1o7eouaStr72ktKjBpMOjxbyyyI2PkZyVmJmbk56gi4uIid6FgQAh+QQEAwD/ACwBAA0AIAAIAAAHZYAuATeEN4OFhDiKi4iEh44uLC0hlCGTlZQNNps2DZiUl6AsCzZBpkEIp6cpqqyqqKo2C6Sqqa+uprintqaytLuvQbq6prxBvqXAt63BxrKSmKGVmpyen9ItLIKIj4WLjI3dAS6BACH5BAQDAP8ALAEADQAgAAgAAAc6gAAAGTiFhoeIiYgZgoIGQZCRkpOUkwaNAI+Vm5xBl42anaKRn46jp56YoaicpZmsoq6EirS1OIwAgQAh+QQEAwD/ACwDAA0AHAAIAAAHPYAAghI6hSeHiImJhToSgo8AI0GTlJWWliOQgpKXnZeZmpyeo0GgkKKknaaPqKmYmpGunquDjIq3iIyOgoEAIfkEBAMA/wAsBgAMABYACgAAB1mAAAAuExABATgPOw+KDziHEBMugoISBB0tLSEhNpudIZkdBBKUAChBqKmqq0EopaessaiulLCyrLSCtrequaa8uK/Aq76WmJqcnpuho6WEhoiNjY8BkZMAgQAh+QQEAwD/ACwHAAwAFAAKAAAHRIAAAAUgNQwUIyM0NIkUDDUgBYKCH0GWl5iYH5MAlZmflpuTnqCZopSln6edqaacpK1Bq7Cts7GXq4SGiIqMI46QkgCBACH5BAQDAP8ALAkACwAQAAwAAAc5gBAlC4SFhoQlECA2KUGOj5ApNiASkJaWEpWXm5mbnJqekJ2hoqCkQaOnqKakEouNoZIggoe1C4mBACH5BAQDAP8ALAkACgAQAA4AAAc/gACCPy6FhoU/ggAqHR0tj5CRjSo1QZaXmJg1lZmdlpuenqChmaOkl6anQamnrKSuobCijI6RtpOKhIeGiYKBACH5BAQDAP8ALAkACgAQAA4AAAcygCMtEYSFhoQtIxFBjI2OjoSPko2Rk5KVlpCLmZqcnZ6MmJ6inKSZppaokxGCh64RiYEAIfkEBAMA/wAsCAAJABIAEAAAB0GAACAShIWGhiAAAAhBjY6PjwiKNpCVjjaTlpaYAJSakJyen5eZo6SdpqeipqGpja2usKmyrKWzioyukoKHvYWJgQAh+QQEAwD/ACwIAAkAEgAQAAAHPoAAFh2EhYaGFgAANkGNjo+PNoqMkJWNkouWlpiUmpGTnpCcoZ+ZpJegp0GjqqynrqSwobKetJqYg4e6hImBADs=');\\r\\n}\\r\\n\\r\\n.toast-info {\\r\\n background-image: url('../Content/Images/SVG/icons8-Info Squared.svg');\\r\\n}\\r\\n\\r\\n.toast-error {\\r\\n background-image: url('../Content/Images/SVG/icons8-WarningRed.svg');\\r\\n}\\r\\n\\r\\n.toast-success {\\r\\n background-image: url('../Content/Images/SVG/icons8-Ok.svg');\\r\\n}\\r\\n\\r\\n.toast-warning {\\r\\n background-image: url('../Content/Images/SVG/icons8-Warning.svg');\\r\\n}\\r\\n\\r\\n#toast-container.toast-top-center .toast,\\r\\n#toast-container.toast-bottom-center .toast {\\r\\n width: 300px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n#toast-container.toast-top-full-width .toast,\\r\\n#toast-container.toast-bottom-full-width .toast {\\r\\n width: 96%;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n.toast {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.toast-success {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.toast-error {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.toast-info {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.toast-warning {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\nprogress-bar {\\r\\n position: absolute;\\r\\n left: 0;\\r\\n bottom: 0;\\r\\n height: 2px;\\r\\n background-color: #2675B3;\\r\\n opacity: 0.4;\\r\\n}\\r\\n/*Animations*/\\r\\ndiv[toast] {\\r\\n opacity: 1 !important;\\r\\n}\\r\\n\\r\\n div[toast].ng-enter {\\r\\n opacity: 0 !important;\\r\\n transition: opacity .3s linear;\\r\\n }\\r\\n\\r\\n div[toast].ng-enter.ng-enter-active {\\r\\n opacity: 1 !important;\\r\\n }\\r\\n\\r\\n div[toast].ng-leave {\\r\\n opacity: 1;\\r\\n transition: opacity .3s linear;\\r\\n }\\r\\n\\r\\n div[toast].ng-leave.ng-leave-active {\\r\\n opacity: 0 !important;\\r\\n }\\r\\n/*Responsive Design*/\\r\\n@media all and (max-width: 240px) {\\r\\n #toast-container .toast.div {\\r\\n padding: 8px 8px 8px 50px;\\r\\n width: 11em;\\r\\n }\\r\\n\\r\\n #toast-container .toast-close-button {\\r\\n right: -0.2em;\\r\\n top: -0.2em;\\r\\n }\\r\\n}\\r\\n\\r\\n@media all and (min-width: 241px) and (max-width: 480px) {\\r\\n #toast-container .toast.div {\\r\\n padding: 8px 8px 8px 50px;\\r\\n width: 18em;\\r\\n }\\r\\n\\r\\n #toast-container .toast-close-button {\\r\\n right: -0.2em;\\r\\n top: -0.2em;\\r\\n }\\r\\n}\\r\\n\\r\\n@media all and (min-width: 481px) and (max-width: 768px) {\\r\\n #toast-container .toast.div {\\r\\n padding: 15px 15px 15px 50px;\\r\\n width: 25em;\\r\\n }\\r\\n}\\r\\n\\r\\n.toast-container-archive {\\r\\n -moz-box-sizing: border-box;\\r\\n -webkit-box-sizing: border-box;\\r\\n box-sizing: border-box;\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n .toast-container-archive .toast {\\r\\n overflow: hidden;\\r\\n padding: 30px 15px 30px 55px;\\r\\n background-position: 15px center;\\r\\n background-repeat: no-repeat;\\r\\n color: rgb(103, 106, 108);\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n .toast-container-archive .toast:hover {\\r\\n -moz-box-shadow: 0 0 12px #e2e2e2;\\r\\n -webkit-box-shadow: 0 0 12px #e2e2e2;\\r\\n box-shadow: 0 0 12px #e2e2e2;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .toast-container-archive .close-btn {\\r\\n background-color: transparent;\\r\\n cursor: pointer;\\r\\n border-radius: 0;\\r\\n color: rgb(222, 222, 222);\\r\\n }\\r\\n\\r\\n .toast-container-archive .close-btn:hover {\\r\\n background-color: #f73415;\\r\\n color: white;\\r\\n }\\r\\n\\r\\n.toast-date {\\r\\n position: absolute;\\r\\n bottom: 6px;\\r\\n right: 15px;\\r\\n color: #b4b4b4;\\r\\n}\\r\\n\",\"/*!\\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */\\n\\n@import \\\"variables\\\";\\n@import \\\"mixins\\\";\\n@import \\\"path\\\";\\n@import \\\"core\\\";\\n@import \\\"larger\\\";\\n@import \\\"fixed-width\\\";\\n@import \\\"list\\\";\\n@import \\\"bordered-pulled\\\";\\n@import \\\"animated\\\";\\n@import \\\"rotated-flipped\\\";\\n@import \\\"stacked\\\";\\n@import \\\"icons\\\";\\n@import \\\"screen-reader\\\";\\n\",\"/* FONT PATH\\n * -------------------------- */\\n\\n@font-face {\\n font-family: 'FontAwesome';\\n src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\\n src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\\n url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\\n url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\\n url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\\n url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\\n// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\\n font-weight: normal;\\n font-style: normal;\\n}\\n\",\"// Base Class Definition\\n// -------------------------\\n\\n.#{$fa-css-prefix} {\\n display: inline-block;\\n font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\\n font-size: inherit; // can't have font-size inherit on line above, so need to override\\n text-rendering: auto; // optimizelegibility throws things off #1094\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n\\n}\\n\",\"// Icon Sizes\\n// -------------------------\\n\\n/* makes the font 33% larger relative to the icon container */\\n.#{$fa-css-prefix}-lg {\\n font-size: (4em / 3);\\n line-height: (3em / 4);\\n vertical-align: -15%;\\n}\\n.#{$fa-css-prefix}-2x { font-size: 2em; }\\n.#{$fa-css-prefix}-3x { font-size: 3em; }\\n.#{$fa-css-prefix}-4x { font-size: 4em; }\\n.#{$fa-css-prefix}-5x { font-size: 5em; }\\n\",\"// Fixed Width Icons\\n// -------------------------\\n.#{$fa-css-prefix}-fw {\\n width: (18em / 14);\\n text-align: center;\\n}\\n\",\"// List Icons\\n// -------------------------\\n\\n.#{$fa-css-prefix}-ul {\\n padding-left: 0;\\n margin-left: $fa-li-width;\\n list-style-type: none;\\n > li { position: relative; }\\n}\\n.#{$fa-css-prefix}-li {\\n position: absolute;\\n left: -$fa-li-width;\\n width: $fa-li-width;\\n top: (2em / 14);\\n text-align: center;\\n &.#{$fa-css-prefix}-lg {\\n left: -$fa-li-width + (4em / 14);\\n }\\n}\\n\",\"// Variables\\n// --------------------------\\n\\n$fa-font-path: \\\"../fonts\\\" !default;\\n$fa-font-size-base: 14px !default;\\n$fa-line-height-base: 1 !default;\\n//$fa-font-path: \\\"//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts\\\" !default; // for referencing Bootstrap CDN font files directly\\n$fa-css-prefix: fa !default;\\n$fa-version: \\\"4.7.0\\\" !default;\\n$fa-border-color: #eee !default;\\n$fa-inverse: #fff !default;\\n$fa-li-width: (30em / 14) !default;\\n\\n$fa-var-500px: \\\"\\\\f26e\\\";\\n$fa-var-address-book: \\\"\\\\f2b9\\\";\\n$fa-var-address-book-o: \\\"\\\\f2ba\\\";\\n$fa-var-address-card: \\\"\\\\f2bb\\\";\\n$fa-var-address-card-o: \\\"\\\\f2bc\\\";\\n$fa-var-adjust: \\\"\\\\f042\\\";\\n$fa-var-adn: \\\"\\\\f170\\\";\\n$fa-var-align-center: \\\"\\\\f037\\\";\\n$fa-var-align-justify: \\\"\\\\f039\\\";\\n$fa-var-align-left: \\\"\\\\f036\\\";\\n$fa-var-align-right: \\\"\\\\f038\\\";\\n$fa-var-amazon: \\\"\\\\f270\\\";\\n$fa-var-ambulance: \\\"\\\\f0f9\\\";\\n$fa-var-american-sign-language-interpreting: \\\"\\\\f2a3\\\";\\n$fa-var-anchor: \\\"\\\\f13d\\\";\\n$fa-var-android: \\\"\\\\f17b\\\";\\n$fa-var-angellist: \\\"\\\\f209\\\";\\n$fa-var-angle-double-down: \\\"\\\\f103\\\";\\n$fa-var-angle-double-left: \\\"\\\\f100\\\";\\n$fa-var-angle-double-right: \\\"\\\\f101\\\";\\n$fa-var-angle-double-up: \\\"\\\\f102\\\";\\n$fa-var-angle-down: \\\"\\\\f107\\\";\\n$fa-var-angle-left: \\\"\\\\f104\\\";\\n$fa-var-angle-right: \\\"\\\\f105\\\";\\n$fa-var-angle-up: \\\"\\\\f106\\\";\\n$fa-var-apple: \\\"\\\\f179\\\";\\n$fa-var-archive: \\\"\\\\f187\\\";\\n$fa-var-area-chart: \\\"\\\\f1fe\\\";\\n$fa-var-arrow-circle-down: \\\"\\\\f0ab\\\";\\n$fa-var-arrow-circle-left: \\\"\\\\f0a8\\\";\\n$fa-var-arrow-circle-o-down: \\\"\\\\f01a\\\";\\n$fa-var-arrow-circle-o-left: \\\"\\\\f190\\\";\\n$fa-var-arrow-circle-o-right: \\\"\\\\f18e\\\";\\n$fa-var-arrow-circle-o-up: \\\"\\\\f01b\\\";\\n$fa-var-arrow-circle-right: \\\"\\\\f0a9\\\";\\n$fa-var-arrow-circle-up: \\\"\\\\f0aa\\\";\\n$fa-var-arrow-down: \\\"\\\\f063\\\";\\n$fa-var-arrow-left: \\\"\\\\f060\\\";\\n$fa-var-arrow-right: \\\"\\\\f061\\\";\\n$fa-var-arrow-up: \\\"\\\\f062\\\";\\n$fa-var-arrows: \\\"\\\\f047\\\";\\n$fa-var-arrows-alt: \\\"\\\\f0b2\\\";\\n$fa-var-arrows-h: \\\"\\\\f07e\\\";\\n$fa-var-arrows-v: \\\"\\\\f07d\\\";\\n$fa-var-asl-interpreting: \\\"\\\\f2a3\\\";\\n$fa-var-assistive-listening-systems: \\\"\\\\f2a2\\\";\\n$fa-var-asterisk: \\\"\\\\f069\\\";\\n$fa-var-at: \\\"\\\\f1fa\\\";\\n$fa-var-audio-description: \\\"\\\\f29e\\\";\\n$fa-var-automobile: \\\"\\\\f1b9\\\";\\n$fa-var-backward: \\\"\\\\f04a\\\";\\n$fa-var-balance-scale: \\\"\\\\f24e\\\";\\n$fa-var-ban: \\\"\\\\f05e\\\";\\n$fa-var-bandcamp: \\\"\\\\f2d5\\\";\\n$fa-var-bank: \\\"\\\\f19c\\\";\\n$fa-var-bar-chart: \\\"\\\\f080\\\";\\n$fa-var-bar-chart-o: \\\"\\\\f080\\\";\\n$fa-var-barcode: \\\"\\\\f02a\\\";\\n$fa-var-bars: \\\"\\\\f0c9\\\";\\n$fa-var-bath: \\\"\\\\f2cd\\\";\\n$fa-var-bathtub: \\\"\\\\f2cd\\\";\\n$fa-var-battery: \\\"\\\\f240\\\";\\n$fa-var-battery-0: \\\"\\\\f244\\\";\\n$fa-var-battery-1: \\\"\\\\f243\\\";\\n$fa-var-battery-2: \\\"\\\\f242\\\";\\n$fa-var-battery-3: \\\"\\\\f241\\\";\\n$fa-var-battery-4: \\\"\\\\f240\\\";\\n$fa-var-battery-empty: \\\"\\\\f244\\\";\\n$fa-var-battery-full: \\\"\\\\f240\\\";\\n$fa-var-battery-half: \\\"\\\\f242\\\";\\n$fa-var-battery-quarter: \\\"\\\\f243\\\";\\n$fa-var-battery-three-quarters: \\\"\\\\f241\\\";\\n$fa-var-bed: \\\"\\\\f236\\\";\\n$fa-var-beer: \\\"\\\\f0fc\\\";\\n$fa-var-behance: \\\"\\\\f1b4\\\";\\n$fa-var-behance-square: \\\"\\\\f1b5\\\";\\n$fa-var-bell: \\\"\\\\f0f3\\\";\\n$fa-var-bell-o: \\\"\\\\f0a2\\\";\\n$fa-var-bell-slash: \\\"\\\\f1f6\\\";\\n$fa-var-bell-slash-o: \\\"\\\\f1f7\\\";\\n$fa-var-bicycle: \\\"\\\\f206\\\";\\n$fa-var-binoculars: \\\"\\\\f1e5\\\";\\n$fa-var-birthday-cake: \\\"\\\\f1fd\\\";\\n$fa-var-bitbucket: \\\"\\\\f171\\\";\\n$fa-var-bitbucket-square: \\\"\\\\f172\\\";\\n$fa-var-bitcoin: \\\"\\\\f15a\\\";\\n$fa-var-black-tie: \\\"\\\\f27e\\\";\\n$fa-var-blind: \\\"\\\\f29d\\\";\\n$fa-var-bluetooth: \\\"\\\\f293\\\";\\n$fa-var-bluetooth-b: \\\"\\\\f294\\\";\\n$fa-var-bold: \\\"\\\\f032\\\";\\n$fa-var-bolt: \\\"\\\\f0e7\\\";\\n$fa-var-bomb: \\\"\\\\f1e2\\\";\\n$fa-var-book: \\\"\\\\f02d\\\";\\n$fa-var-bookmark: \\\"\\\\f02e\\\";\\n$fa-var-bookmark-o: \\\"\\\\f097\\\";\\n$fa-var-braille: \\\"\\\\f2a1\\\";\\n$fa-var-briefcase: \\\"\\\\f0b1\\\";\\n$fa-var-btc: \\\"\\\\f15a\\\";\\n$fa-var-bug: \\\"\\\\f188\\\";\\n$fa-var-building: \\\"\\\\f1ad\\\";\\n$fa-var-building-o: \\\"\\\\f0f7\\\";\\n$fa-var-bullhorn: \\\"\\\\f0a1\\\";\\n$fa-var-bullseye: \\\"\\\\f140\\\";\\n$fa-var-bus: \\\"\\\\f207\\\";\\n$fa-var-buysellads: \\\"\\\\f20d\\\";\\n$fa-var-cab: \\\"\\\\f1ba\\\";\\n$fa-var-calculator: \\\"\\\\f1ec\\\";\\n$fa-var-calendar: \\\"\\\\f073\\\";\\n$fa-var-calendar-check-o: \\\"\\\\f274\\\";\\n$fa-var-calendar-minus-o: \\\"\\\\f272\\\";\\n$fa-var-calendar-o: \\\"\\\\f133\\\";\\n$fa-var-calendar-plus-o: \\\"\\\\f271\\\";\\n$fa-var-calendar-times-o: \\\"\\\\f273\\\";\\n$fa-var-camera: \\\"\\\\f030\\\";\\n$fa-var-camera-retro: \\\"\\\\f083\\\";\\n$fa-var-car: \\\"\\\\f1b9\\\";\\n$fa-var-caret-down: \\\"\\\\f0d7\\\";\\n$fa-var-caret-left: \\\"\\\\f0d9\\\";\\n$fa-var-caret-right: \\\"\\\\f0da\\\";\\n$fa-var-caret-square-o-down: \\\"\\\\f150\\\";\\n$fa-var-caret-square-o-left: \\\"\\\\f191\\\";\\n$fa-var-caret-square-o-right: \\\"\\\\f152\\\";\\n$fa-var-caret-square-o-up: \\\"\\\\f151\\\";\\n$fa-var-caret-up: \\\"\\\\f0d8\\\";\\n$fa-var-cart-arrow-down: \\\"\\\\f218\\\";\\n$fa-var-cart-plus: \\\"\\\\f217\\\";\\n$fa-var-cc: \\\"\\\\f20a\\\";\\n$fa-var-cc-amex: \\\"\\\\f1f3\\\";\\n$fa-var-cc-diners-club: \\\"\\\\f24c\\\";\\n$fa-var-cc-discover: \\\"\\\\f1f2\\\";\\n$fa-var-cc-jcb: \\\"\\\\f24b\\\";\\n$fa-var-cc-mastercard: \\\"\\\\f1f1\\\";\\n$fa-var-cc-paypal: \\\"\\\\f1f4\\\";\\n$fa-var-cc-stripe: \\\"\\\\f1f5\\\";\\n$fa-var-cc-visa: \\\"\\\\f1f0\\\";\\n$fa-var-certificate: \\\"\\\\f0a3\\\";\\n$fa-var-chain: \\\"\\\\f0c1\\\";\\n$fa-var-chain-broken: \\\"\\\\f127\\\";\\n$fa-var-check: \\\"\\\\f00c\\\";\\n$fa-var-check-circle: \\\"\\\\f058\\\";\\n$fa-var-check-circle-o: \\\"\\\\f05d\\\";\\n$fa-var-check-square: \\\"\\\\f14a\\\";\\n$fa-var-check-square-o: \\\"\\\\f046\\\";\\n$fa-var-chevron-circle-down: \\\"\\\\f13a\\\";\\n$fa-var-chevron-circle-left: \\\"\\\\f137\\\";\\n$fa-var-chevron-circle-right: \\\"\\\\f138\\\";\\n$fa-var-chevron-circle-up: \\\"\\\\f139\\\";\\n$fa-var-chevron-down: \\\"\\\\f078\\\";\\n$fa-var-chevron-left: \\\"\\\\f053\\\";\\n$fa-var-chevron-right: \\\"\\\\f054\\\";\\n$fa-var-chevron-up: \\\"\\\\f077\\\";\\n$fa-var-child: \\\"\\\\f1ae\\\";\\n$fa-var-chrome: \\\"\\\\f268\\\";\\n$fa-var-circle: \\\"\\\\f111\\\";\\n$fa-var-circle-o: \\\"\\\\f10c\\\";\\n$fa-var-circle-o-notch: \\\"\\\\f1ce\\\";\\n$fa-var-circle-thin: \\\"\\\\f1db\\\";\\n$fa-var-clipboard: \\\"\\\\f0ea\\\";\\n$fa-var-clock-o: \\\"\\\\f017\\\";\\n$fa-var-clone: \\\"\\\\f24d\\\";\\n$fa-var-close: \\\"\\\\f00d\\\";\\n$fa-var-cloud: \\\"\\\\f0c2\\\";\\n$fa-var-cloud-download: \\\"\\\\f0ed\\\";\\n$fa-var-cloud-upload: \\\"\\\\f0ee\\\";\\n$fa-var-cny: \\\"\\\\f157\\\";\\n$fa-var-code: \\\"\\\\f121\\\";\\n$fa-var-code-fork: \\\"\\\\f126\\\";\\n$fa-var-codepen: \\\"\\\\f1cb\\\";\\n$fa-var-codiepie: \\\"\\\\f284\\\";\\n$fa-var-coffee: \\\"\\\\f0f4\\\";\\n$fa-var-cog: \\\"\\\\f013\\\";\\n$fa-var-cogs: \\\"\\\\f085\\\";\\n$fa-var-columns: \\\"\\\\f0db\\\";\\n$fa-var-comment: \\\"\\\\f075\\\";\\n$fa-var-comment-o: \\\"\\\\f0e5\\\";\\n$fa-var-commenting: \\\"\\\\f27a\\\";\\n$fa-var-commenting-o: \\\"\\\\f27b\\\";\\n$fa-var-comments: \\\"\\\\f086\\\";\\n$fa-var-comments-o: \\\"\\\\f0e6\\\";\\n$fa-var-compass: \\\"\\\\f14e\\\";\\n$fa-var-compress: \\\"\\\\f066\\\";\\n$fa-var-connectdevelop: \\\"\\\\f20e\\\";\\n$fa-var-contao: \\\"\\\\f26d\\\";\\n$fa-var-copy: \\\"\\\\f0c5\\\";\\n$fa-var-copyright: \\\"\\\\f1f9\\\";\\n$fa-var-creative-commons: \\\"\\\\f25e\\\";\\n$fa-var-credit-card: \\\"\\\\f09d\\\";\\n$fa-var-credit-card-alt: \\\"\\\\f283\\\";\\n$fa-var-crop: \\\"\\\\f125\\\";\\n$fa-var-crosshairs: \\\"\\\\f05b\\\";\\n$fa-var-css3: \\\"\\\\f13c\\\";\\n$fa-var-cube: \\\"\\\\f1b2\\\";\\n$fa-var-cubes: \\\"\\\\f1b3\\\";\\n$fa-var-cut: \\\"\\\\f0c4\\\";\\n$fa-var-cutlery: \\\"\\\\f0f5\\\";\\n$fa-var-dashboard: \\\"\\\\f0e4\\\";\\n$fa-var-dashcube: \\\"\\\\f210\\\";\\n$fa-var-database: \\\"\\\\f1c0\\\";\\n$fa-var-deaf: \\\"\\\\f2a4\\\";\\n$fa-var-deafness: \\\"\\\\f2a4\\\";\\n$fa-var-dedent: \\\"\\\\f03b\\\";\\n$fa-var-delicious: \\\"\\\\f1a5\\\";\\n$fa-var-desktop: \\\"\\\\f108\\\";\\n$fa-var-deviantart: \\\"\\\\f1bd\\\";\\n$fa-var-diamond: \\\"\\\\f219\\\";\\n$fa-var-digg: \\\"\\\\f1a6\\\";\\n$fa-var-dollar: \\\"\\\\f155\\\";\\n$fa-var-dot-circle-o: \\\"\\\\f192\\\";\\n$fa-var-download: \\\"\\\\f019\\\";\\n$fa-var-dribbble: \\\"\\\\f17d\\\";\\n$fa-var-drivers-license: \\\"\\\\f2c2\\\";\\n$fa-var-drivers-license-o: \\\"\\\\f2c3\\\";\\n$fa-var-dropbox: \\\"\\\\f16b\\\";\\n$fa-var-drupal: \\\"\\\\f1a9\\\";\\n$fa-var-edge: \\\"\\\\f282\\\";\\n$fa-var-edit: \\\"\\\\f044\\\";\\n$fa-var-eercast: \\\"\\\\f2da\\\";\\n$fa-var-eject: \\\"\\\\f052\\\";\\n$fa-var-ellipsis-h: \\\"\\\\f141\\\";\\n$fa-var-ellipsis-v: \\\"\\\\f142\\\";\\n$fa-var-empire: \\\"\\\\f1d1\\\";\\n$fa-var-envelope: \\\"\\\\f0e0\\\";\\n$fa-var-envelope-o: \\\"\\\\f003\\\";\\n$fa-var-envelope-open: \\\"\\\\f2b6\\\";\\n$fa-var-envelope-open-o: \\\"\\\\f2b7\\\";\\n$fa-var-envelope-square: \\\"\\\\f199\\\";\\n$fa-var-envira: \\\"\\\\f299\\\";\\n$fa-var-eraser: \\\"\\\\f12d\\\";\\n$fa-var-etsy: \\\"\\\\f2d7\\\";\\n$fa-var-eur: \\\"\\\\f153\\\";\\n$fa-var-euro: \\\"\\\\f153\\\";\\n$fa-var-exchange: \\\"\\\\f0ec\\\";\\n$fa-var-exclamation: \\\"\\\\f12a\\\";\\n$fa-var-exclamation-circle: \\\"\\\\f06a\\\";\\n$fa-var-exclamation-triangle: \\\"\\\\f071\\\";\\n$fa-var-expand: \\\"\\\\f065\\\";\\n$fa-var-expeditedssl: \\\"\\\\f23e\\\";\\n$fa-var-external-link: \\\"\\\\f08e\\\";\\n$fa-var-external-link-square: \\\"\\\\f14c\\\";\\n$fa-var-eye: \\\"\\\\f06e\\\";\\n$fa-var-eye-slash: \\\"\\\\f070\\\";\\n$fa-var-eyedropper: \\\"\\\\f1fb\\\";\\n$fa-var-fa: \\\"\\\\f2b4\\\";\\n$fa-var-facebook: \\\"\\\\f09a\\\";\\n$fa-var-facebook-f: \\\"\\\\f09a\\\";\\n$fa-var-facebook-official: \\\"\\\\f230\\\";\\n$fa-var-facebook-square: \\\"\\\\f082\\\";\\n$fa-var-fast-backward: \\\"\\\\f049\\\";\\n$fa-var-fast-forward: \\\"\\\\f050\\\";\\n$fa-var-fax: \\\"\\\\f1ac\\\";\\n$fa-var-feed: \\\"\\\\f09e\\\";\\n$fa-var-female: \\\"\\\\f182\\\";\\n$fa-var-fighter-jet: \\\"\\\\f0fb\\\";\\n$fa-var-file: \\\"\\\\f15b\\\";\\n$fa-var-file-archive-o: \\\"\\\\f1c6\\\";\\n$fa-var-file-audio-o: \\\"\\\\f1c7\\\";\\n$fa-var-file-code-o: \\\"\\\\f1c9\\\";\\n$fa-var-file-excel-o: \\\"\\\\f1c3\\\";\\n$fa-var-file-image-o: \\\"\\\\f1c5\\\";\\n$fa-var-file-movie-o: \\\"\\\\f1c8\\\";\\n$fa-var-file-o: \\\"\\\\f016\\\";\\n$fa-var-file-pdf-o: \\\"\\\\f1c1\\\";\\n$fa-var-file-photo-o: \\\"\\\\f1c5\\\";\\n$fa-var-file-picture-o: \\\"\\\\f1c5\\\";\\n$fa-var-file-powerpoint-o: \\\"\\\\f1c4\\\";\\n$fa-var-file-sound-o: \\\"\\\\f1c7\\\";\\n$fa-var-file-text: \\\"\\\\f15c\\\";\\n$fa-var-file-text-o: \\\"\\\\f0f6\\\";\\n$fa-var-file-video-o: \\\"\\\\f1c8\\\";\\n$fa-var-file-word-o: \\\"\\\\f1c2\\\";\\n$fa-var-file-zip-o: \\\"\\\\f1c6\\\";\\n$fa-var-files-o: \\\"\\\\f0c5\\\";\\n$fa-var-film: \\\"\\\\f008\\\";\\n$fa-var-filter: \\\"\\\\f0b0\\\";\\n$fa-var-fire: \\\"\\\\f06d\\\";\\n$fa-var-fire-extinguisher: \\\"\\\\f134\\\";\\n$fa-var-firefox: \\\"\\\\f269\\\";\\n$fa-var-first-order: \\\"\\\\f2b0\\\";\\n$fa-var-flag: \\\"\\\\f024\\\";\\n$fa-var-flag-checkered: \\\"\\\\f11e\\\";\\n$fa-var-flag-o: \\\"\\\\f11d\\\";\\n$fa-var-flash: \\\"\\\\f0e7\\\";\\n$fa-var-flask: \\\"\\\\f0c3\\\";\\n$fa-var-flickr: \\\"\\\\f16e\\\";\\n$fa-var-floppy-o: \\\"\\\\f0c7\\\";\\n$fa-var-folder: \\\"\\\\f07b\\\";\\n$fa-var-folder-o: \\\"\\\\f114\\\";\\n$fa-var-folder-open: \\\"\\\\f07c\\\";\\n$fa-var-folder-open-o: \\\"\\\\f115\\\";\\n$fa-var-font: \\\"\\\\f031\\\";\\n$fa-var-font-awesome: \\\"\\\\f2b4\\\";\\n$fa-var-fonticons: \\\"\\\\f280\\\";\\n$fa-var-fort-awesome: \\\"\\\\f286\\\";\\n$fa-var-forumbee: \\\"\\\\f211\\\";\\n$fa-var-forward: \\\"\\\\f04e\\\";\\n$fa-var-foursquare: \\\"\\\\f180\\\";\\n$fa-var-free-code-camp: \\\"\\\\f2c5\\\";\\n$fa-var-frown-o: \\\"\\\\f119\\\";\\n$fa-var-futbol-o: \\\"\\\\f1e3\\\";\\n$fa-var-gamepad: \\\"\\\\f11b\\\";\\n$fa-var-gavel: \\\"\\\\f0e3\\\";\\n$fa-var-gbp: \\\"\\\\f154\\\";\\n$fa-var-ge: \\\"\\\\f1d1\\\";\\n$fa-var-gear: \\\"\\\\f013\\\";\\n$fa-var-gears: \\\"\\\\f085\\\";\\n$fa-var-genderless: \\\"\\\\f22d\\\";\\n$fa-var-get-pocket: \\\"\\\\f265\\\";\\n$fa-var-gg: \\\"\\\\f260\\\";\\n$fa-var-gg-circle: \\\"\\\\f261\\\";\\n$fa-var-gift: \\\"\\\\f06b\\\";\\n$fa-var-git: \\\"\\\\f1d3\\\";\\n$fa-var-git-square: \\\"\\\\f1d2\\\";\\n$fa-var-github: \\\"\\\\f09b\\\";\\n$fa-var-github-alt: \\\"\\\\f113\\\";\\n$fa-var-github-square: \\\"\\\\f092\\\";\\n$fa-var-gitlab: \\\"\\\\f296\\\";\\n$fa-var-gittip: \\\"\\\\f184\\\";\\n$fa-var-glass: \\\"\\\\f000\\\";\\n$fa-var-glide: \\\"\\\\f2a5\\\";\\n$fa-var-glide-g: \\\"\\\\f2a6\\\";\\n$fa-var-globe: \\\"\\\\f0ac\\\";\\n$fa-var-google: \\\"\\\\f1a0\\\";\\n$fa-var-google-plus: \\\"\\\\f0d5\\\";\\n$fa-var-google-plus-circle: \\\"\\\\f2b3\\\";\\n$fa-var-google-plus-official: \\\"\\\\f2b3\\\";\\n$fa-var-google-plus-square: \\\"\\\\f0d4\\\";\\n$fa-var-google-wallet: \\\"\\\\f1ee\\\";\\n$fa-var-graduation-cap: \\\"\\\\f19d\\\";\\n$fa-var-gratipay: \\\"\\\\f184\\\";\\n$fa-var-grav: \\\"\\\\f2d6\\\";\\n$fa-var-group: \\\"\\\\f0c0\\\";\\n$fa-var-h-square: \\\"\\\\f0fd\\\";\\n$fa-var-hacker-news: \\\"\\\\f1d4\\\";\\n$fa-var-hand-grab-o: \\\"\\\\f255\\\";\\n$fa-var-hand-lizard-o: \\\"\\\\f258\\\";\\n$fa-var-hand-o-down: \\\"\\\\f0a7\\\";\\n$fa-var-hand-o-left: \\\"\\\\f0a5\\\";\\n$fa-var-hand-o-right: \\\"\\\\f0a4\\\";\\n$fa-var-hand-o-up: \\\"\\\\f0a6\\\";\\n$fa-var-hand-paper-o: \\\"\\\\f256\\\";\\n$fa-var-hand-peace-o: \\\"\\\\f25b\\\";\\n$fa-var-hand-pointer-o: \\\"\\\\f25a\\\";\\n$fa-var-hand-rock-o: \\\"\\\\f255\\\";\\n$fa-var-hand-scissors-o: \\\"\\\\f257\\\";\\n$fa-var-hand-spock-o: \\\"\\\\f259\\\";\\n$fa-var-hand-stop-o: \\\"\\\\f256\\\";\\n$fa-var-handshake-o: \\\"\\\\f2b5\\\";\\n$fa-var-hard-of-hearing: \\\"\\\\f2a4\\\";\\n$fa-var-hashtag: \\\"\\\\f292\\\";\\n$fa-var-hdd-o: \\\"\\\\f0a0\\\";\\n$fa-var-header: \\\"\\\\f1dc\\\";\\n$fa-var-headphones: \\\"\\\\f025\\\";\\n$fa-var-heart: \\\"\\\\f004\\\";\\n$fa-var-heart-o: \\\"\\\\f08a\\\";\\n$fa-var-heartbeat: \\\"\\\\f21e\\\";\\n$fa-var-history: \\\"\\\\f1da\\\";\\n$fa-var-home: \\\"\\\\f015\\\";\\n$fa-var-hospital-o: \\\"\\\\f0f8\\\";\\n$fa-var-hotel: \\\"\\\\f236\\\";\\n$fa-var-hourglass: \\\"\\\\f254\\\";\\n$fa-var-hourglass-1: \\\"\\\\f251\\\";\\n$fa-var-hourglass-2: \\\"\\\\f252\\\";\\n$fa-var-hourglass-3: \\\"\\\\f253\\\";\\n$fa-var-hourglass-end: \\\"\\\\f253\\\";\\n$fa-var-hourglass-half: \\\"\\\\f252\\\";\\n$fa-var-hourglass-o: \\\"\\\\f250\\\";\\n$fa-var-hourglass-start: \\\"\\\\f251\\\";\\n$fa-var-houzz: \\\"\\\\f27c\\\";\\n$fa-var-html5: \\\"\\\\f13b\\\";\\n$fa-var-i-cursor: \\\"\\\\f246\\\";\\n$fa-var-id-badge: \\\"\\\\f2c1\\\";\\n$fa-var-id-card: \\\"\\\\f2c2\\\";\\n$fa-var-id-card-o: \\\"\\\\f2c3\\\";\\n$fa-var-ils: \\\"\\\\f20b\\\";\\n$fa-var-image: \\\"\\\\f03e\\\";\\n$fa-var-imdb: \\\"\\\\f2d8\\\";\\n$fa-var-inbox: \\\"\\\\f01c\\\";\\n$fa-var-indent: \\\"\\\\f03c\\\";\\n$fa-var-industry: \\\"\\\\f275\\\";\\n$fa-var-info: \\\"\\\\f129\\\";\\n$fa-var-info-circle: \\\"\\\\f05a\\\";\\n$fa-var-inr: \\\"\\\\f156\\\";\\n$fa-var-instagram: \\\"\\\\f16d\\\";\\n$fa-var-institution: \\\"\\\\f19c\\\";\\n$fa-var-internet-explorer: \\\"\\\\f26b\\\";\\n$fa-var-intersex: \\\"\\\\f224\\\";\\n$fa-var-ioxhost: \\\"\\\\f208\\\";\\n$fa-var-italic: \\\"\\\\f033\\\";\\n$fa-var-joomla: \\\"\\\\f1aa\\\";\\n$fa-var-jpy: \\\"\\\\f157\\\";\\n$fa-var-jsfiddle: \\\"\\\\f1cc\\\";\\n$fa-var-key: \\\"\\\\f084\\\";\\n$fa-var-keyboard-o: \\\"\\\\f11c\\\";\\n$fa-var-krw: \\\"\\\\f159\\\";\\n$fa-var-language: \\\"\\\\f1ab\\\";\\n$fa-var-laptop: \\\"\\\\f109\\\";\\n$fa-var-lastfm: \\\"\\\\f202\\\";\\n$fa-var-lastfm-square: \\\"\\\\f203\\\";\\n$fa-var-leaf: \\\"\\\\f06c\\\";\\n$fa-var-leanpub: \\\"\\\\f212\\\";\\n$fa-var-legal: \\\"\\\\f0e3\\\";\\n$fa-var-lemon-o: \\\"\\\\f094\\\";\\n$fa-var-level-down: \\\"\\\\f149\\\";\\n$fa-var-level-up: \\\"\\\\f148\\\";\\n$fa-var-life-bouy: \\\"\\\\f1cd\\\";\\n$fa-var-life-buoy: \\\"\\\\f1cd\\\";\\n$fa-var-life-ring: \\\"\\\\f1cd\\\";\\n$fa-var-life-saver: \\\"\\\\f1cd\\\";\\n$fa-var-lightbulb-o: \\\"\\\\f0eb\\\";\\n$fa-var-line-chart: \\\"\\\\f201\\\";\\n$fa-var-link: \\\"\\\\f0c1\\\";\\n$fa-var-linkedin: \\\"\\\\f0e1\\\";\\n$fa-var-linkedin-square: \\\"\\\\f08c\\\";\\n$fa-var-linode: \\\"\\\\f2b8\\\";\\n$fa-var-linux: \\\"\\\\f17c\\\";\\n$fa-var-list: \\\"\\\\f03a\\\";\\n$fa-var-list-alt: \\\"\\\\f022\\\";\\n$fa-var-list-ol: \\\"\\\\f0cb\\\";\\n$fa-var-list-ul: \\\"\\\\f0ca\\\";\\n$fa-var-location-arrow: \\\"\\\\f124\\\";\\n$fa-var-lock: \\\"\\\\f023\\\";\\n$fa-var-long-arrow-down: \\\"\\\\f175\\\";\\n$fa-var-long-arrow-left: \\\"\\\\f177\\\";\\n$fa-var-long-arrow-right: \\\"\\\\f178\\\";\\n$fa-var-long-arrow-up: \\\"\\\\f176\\\";\\n$fa-var-low-vision: \\\"\\\\f2a8\\\";\\n$fa-var-magic: \\\"\\\\f0d0\\\";\\n$fa-var-magnet: \\\"\\\\f076\\\";\\n$fa-var-mail-forward: \\\"\\\\f064\\\";\\n$fa-var-mail-reply: \\\"\\\\f112\\\";\\n$fa-var-mail-reply-all: \\\"\\\\f122\\\";\\n$fa-var-male: \\\"\\\\f183\\\";\\n$fa-var-map: \\\"\\\\f279\\\";\\n$fa-var-map-marker: \\\"\\\\f041\\\";\\n$fa-var-map-o: \\\"\\\\f278\\\";\\n$fa-var-map-pin: \\\"\\\\f276\\\";\\n$fa-var-map-signs: \\\"\\\\f277\\\";\\n$fa-var-mars: \\\"\\\\f222\\\";\\n$fa-var-mars-double: \\\"\\\\f227\\\";\\n$fa-var-mars-stroke: \\\"\\\\f229\\\";\\n$fa-var-mars-stroke-h: \\\"\\\\f22b\\\";\\n$fa-var-mars-stroke-v: \\\"\\\\f22a\\\";\\n$fa-var-maxcdn: \\\"\\\\f136\\\";\\n$fa-var-meanpath: \\\"\\\\f20c\\\";\\n$fa-var-medium: \\\"\\\\f23a\\\";\\n$fa-var-medkit: \\\"\\\\f0fa\\\";\\n$fa-var-meetup: \\\"\\\\f2e0\\\";\\n$fa-var-meh-o: \\\"\\\\f11a\\\";\\n$fa-var-mercury: \\\"\\\\f223\\\";\\n$fa-var-microchip: \\\"\\\\f2db\\\";\\n$fa-var-microphone: \\\"\\\\f130\\\";\\n$fa-var-microphone-slash: \\\"\\\\f131\\\";\\n$fa-var-minus: \\\"\\\\f068\\\";\\n$fa-var-minus-circle: \\\"\\\\f056\\\";\\n$fa-var-minus-square: \\\"\\\\f146\\\";\\n$fa-var-minus-square-o: \\\"\\\\f147\\\";\\n$fa-var-mixcloud: \\\"\\\\f289\\\";\\n$fa-var-mobile: \\\"\\\\f10b\\\";\\n$fa-var-mobile-phone: \\\"\\\\f10b\\\";\\n$fa-var-modx: \\\"\\\\f285\\\";\\n$fa-var-money: \\\"\\\\f0d6\\\";\\n$fa-var-moon-o: \\\"\\\\f186\\\";\\n$fa-var-mortar-board: \\\"\\\\f19d\\\";\\n$fa-var-motorcycle: \\\"\\\\f21c\\\";\\n$fa-var-mouse-pointer: \\\"\\\\f245\\\";\\n$fa-var-music: \\\"\\\\f001\\\";\\n$fa-var-navicon: \\\"\\\\f0c9\\\";\\n$fa-var-neuter: \\\"\\\\f22c\\\";\\n$fa-var-newspaper-o: \\\"\\\\f1ea\\\";\\n$fa-var-object-group: \\\"\\\\f247\\\";\\n$fa-var-object-ungroup: \\\"\\\\f248\\\";\\n$fa-var-odnoklassniki: \\\"\\\\f263\\\";\\n$fa-var-odnoklassniki-square: \\\"\\\\f264\\\";\\n$fa-var-opencart: \\\"\\\\f23d\\\";\\n$fa-var-openid: \\\"\\\\f19b\\\";\\n$fa-var-opera: \\\"\\\\f26a\\\";\\n$fa-var-optin-monster: \\\"\\\\f23c\\\";\\n$fa-var-outdent: \\\"\\\\f03b\\\";\\n$fa-var-pagelines: \\\"\\\\f18c\\\";\\n$fa-var-paint-brush: \\\"\\\\f1fc\\\";\\n$fa-var-paper-plane: \\\"\\\\f1d8\\\";\\n$fa-var-paper-plane-o: \\\"\\\\f1d9\\\";\\n$fa-var-paperclip: \\\"\\\\f0c6\\\";\\n$fa-var-paragraph: \\\"\\\\f1dd\\\";\\n$fa-var-paste: \\\"\\\\f0ea\\\";\\n$fa-var-pause: \\\"\\\\f04c\\\";\\n$fa-var-pause-circle: \\\"\\\\f28b\\\";\\n$fa-var-pause-circle-o: \\\"\\\\f28c\\\";\\n$fa-var-paw: \\\"\\\\f1b0\\\";\\n$fa-var-paypal: \\\"\\\\f1ed\\\";\\n$fa-var-pencil: \\\"\\\\f040\\\";\\n$fa-var-pencil-square: \\\"\\\\f14b\\\";\\n$fa-var-pencil-square-o: \\\"\\\\f044\\\";\\n$fa-var-percent: \\\"\\\\f295\\\";\\n$fa-var-phone: \\\"\\\\f095\\\";\\n$fa-var-phone-square: \\\"\\\\f098\\\";\\n$fa-var-photo: \\\"\\\\f03e\\\";\\n$fa-var-picture-o: \\\"\\\\f03e\\\";\\n$fa-var-pie-chart: \\\"\\\\f200\\\";\\n$fa-var-pied-piper: \\\"\\\\f2ae\\\";\\n$fa-var-pied-piper-alt: \\\"\\\\f1a8\\\";\\n$fa-var-pied-piper-pp: \\\"\\\\f1a7\\\";\\n$fa-var-pinterest: \\\"\\\\f0d2\\\";\\n$fa-var-pinterest-p: \\\"\\\\f231\\\";\\n$fa-var-pinterest-square: \\\"\\\\f0d3\\\";\\n$fa-var-plane: \\\"\\\\f072\\\";\\n$fa-var-play: \\\"\\\\f04b\\\";\\n$fa-var-play-circle: \\\"\\\\f144\\\";\\n$fa-var-play-circle-o: \\\"\\\\f01d\\\";\\n$fa-var-plug: \\\"\\\\f1e6\\\";\\n$fa-var-plus: \\\"\\\\f067\\\";\\n$fa-var-plus-circle: \\\"\\\\f055\\\";\\n$fa-var-plus-square: \\\"\\\\f0fe\\\";\\n$fa-var-plus-square-o: \\\"\\\\f196\\\";\\n$fa-var-podcast: \\\"\\\\f2ce\\\";\\n$fa-var-power-off: \\\"\\\\f011\\\";\\n$fa-var-print: \\\"\\\\f02f\\\";\\n$fa-var-product-hunt: \\\"\\\\f288\\\";\\n$fa-var-puzzle-piece: \\\"\\\\f12e\\\";\\n$fa-var-qq: \\\"\\\\f1d6\\\";\\n$fa-var-qrcode: \\\"\\\\f029\\\";\\n$fa-var-question: \\\"\\\\f128\\\";\\n$fa-var-question-circle: \\\"\\\\f059\\\";\\n$fa-var-question-circle-o: \\\"\\\\f29c\\\";\\n$fa-var-quora: \\\"\\\\f2c4\\\";\\n$fa-var-quote-left: \\\"\\\\f10d\\\";\\n$fa-var-quote-right: \\\"\\\\f10e\\\";\\n$fa-var-ra: \\\"\\\\f1d0\\\";\\n$fa-var-random: \\\"\\\\f074\\\";\\n$fa-var-ravelry: \\\"\\\\f2d9\\\";\\n$fa-var-rebel: \\\"\\\\f1d0\\\";\\n$fa-var-recycle: \\\"\\\\f1b8\\\";\\n$fa-var-reddit: \\\"\\\\f1a1\\\";\\n$fa-var-reddit-alien: \\\"\\\\f281\\\";\\n$fa-var-reddit-square: \\\"\\\\f1a2\\\";\\n$fa-var-refresh: \\\"\\\\f021\\\";\\n$fa-var-registered: \\\"\\\\f25d\\\";\\n$fa-var-remove: \\\"\\\\f00d\\\";\\n$fa-var-renren: \\\"\\\\f18b\\\";\\n$fa-var-reorder: \\\"\\\\f0c9\\\";\\n$fa-var-repeat: \\\"\\\\f01e\\\";\\n$fa-var-reply: \\\"\\\\f112\\\";\\n$fa-var-reply-all: \\\"\\\\f122\\\";\\n$fa-var-resistance: \\\"\\\\f1d0\\\";\\n$fa-var-retweet: \\\"\\\\f079\\\";\\n$fa-var-rmb: \\\"\\\\f157\\\";\\n$fa-var-road: \\\"\\\\f018\\\";\\n$fa-var-rocket: \\\"\\\\f135\\\";\\n$fa-var-rotate-left: \\\"\\\\f0e2\\\";\\n$fa-var-rotate-right: \\\"\\\\f01e\\\";\\n$fa-var-rouble: \\\"\\\\f158\\\";\\n$fa-var-rss: \\\"\\\\f09e\\\";\\n$fa-var-rss-square: \\\"\\\\f143\\\";\\n$fa-var-rub: \\\"\\\\f158\\\";\\n$fa-var-ruble: \\\"\\\\f158\\\";\\n$fa-var-rupee: \\\"\\\\f156\\\";\\n$fa-var-s15: \\\"\\\\f2cd\\\";\\n$fa-var-safari: \\\"\\\\f267\\\";\\n$fa-var-save: \\\"\\\\f0c7\\\";\\n$fa-var-scissors: \\\"\\\\f0c4\\\";\\n$fa-var-scribd: \\\"\\\\f28a\\\";\\n$fa-var-search: \\\"\\\\f002\\\";\\n$fa-var-search-minus: \\\"\\\\f010\\\";\\n$fa-var-search-plus: \\\"\\\\f00e\\\";\\n$fa-var-sellsy: \\\"\\\\f213\\\";\\n$fa-var-send: \\\"\\\\f1d8\\\";\\n$fa-var-send-o: \\\"\\\\f1d9\\\";\\n$fa-var-server: \\\"\\\\f233\\\";\\n$fa-var-share: \\\"\\\\f064\\\";\\n$fa-var-share-alt: \\\"\\\\f1e0\\\";\\n$fa-var-share-alt-square: \\\"\\\\f1e1\\\";\\n$fa-var-share-square: \\\"\\\\f14d\\\";\\n$fa-var-share-square-o: \\\"\\\\f045\\\";\\n$fa-var-shekel: \\\"\\\\f20b\\\";\\n$fa-var-sheqel: \\\"\\\\f20b\\\";\\n$fa-var-shield: \\\"\\\\f132\\\";\\n$fa-var-ship: \\\"\\\\f21a\\\";\\n$fa-var-shirtsinbulk: \\\"\\\\f214\\\";\\n$fa-var-shopping-bag: \\\"\\\\f290\\\";\\n$fa-var-shopping-basket: \\\"\\\\f291\\\";\\n$fa-var-shopping-cart: \\\"\\\\f07a\\\";\\n$fa-var-shower: \\\"\\\\f2cc\\\";\\n$fa-var-sign-in: \\\"\\\\f090\\\";\\n$fa-var-sign-language: \\\"\\\\f2a7\\\";\\n$fa-var-sign-out: \\\"\\\\f08b\\\";\\n$fa-var-signal: \\\"\\\\f012\\\";\\n$fa-var-signing: \\\"\\\\f2a7\\\";\\n$fa-var-simplybuilt: \\\"\\\\f215\\\";\\n$fa-var-sitemap: \\\"\\\\f0e8\\\";\\n$fa-var-skyatlas: \\\"\\\\f216\\\";\\n$fa-var-skype: \\\"\\\\f17e\\\";\\n$fa-var-slack: \\\"\\\\f198\\\";\\n$fa-var-sliders: \\\"\\\\f1de\\\";\\n$fa-var-slideshare: \\\"\\\\f1e7\\\";\\n$fa-var-smile-o: \\\"\\\\f118\\\";\\n$fa-var-snapchat: \\\"\\\\f2ab\\\";\\n$fa-var-snapchat-ghost: \\\"\\\\f2ac\\\";\\n$fa-var-snapchat-square: \\\"\\\\f2ad\\\";\\n$fa-var-snowflake-o: \\\"\\\\f2dc\\\";\\n$fa-var-soccer-ball-o: \\\"\\\\f1e3\\\";\\n$fa-var-sort: \\\"\\\\f0dc\\\";\\n$fa-var-sort-alpha-asc: \\\"\\\\f15d\\\";\\n$fa-var-sort-alpha-desc: \\\"\\\\f15e\\\";\\n$fa-var-sort-amount-asc: \\\"\\\\f160\\\";\\n$fa-var-sort-amount-desc: \\\"\\\\f161\\\";\\n$fa-var-sort-asc: \\\"\\\\f0de\\\";\\n$fa-var-sort-desc: \\\"\\\\f0dd\\\";\\n$fa-var-sort-down: \\\"\\\\f0dd\\\";\\n$fa-var-sort-numeric-asc: \\\"\\\\f162\\\";\\n$fa-var-sort-numeric-desc: \\\"\\\\f163\\\";\\n$fa-var-sort-up: \\\"\\\\f0de\\\";\\n$fa-var-soundcloud: \\\"\\\\f1be\\\";\\n$fa-var-space-shuttle: \\\"\\\\f197\\\";\\n$fa-var-spinner: \\\"\\\\f110\\\";\\n$fa-var-spoon: \\\"\\\\f1b1\\\";\\n$fa-var-spotify: \\\"\\\\f1bc\\\";\\n$fa-var-square: \\\"\\\\f0c8\\\";\\n$fa-var-square-o: \\\"\\\\f096\\\";\\n$fa-var-stack-exchange: \\\"\\\\f18d\\\";\\n$fa-var-stack-overflow: \\\"\\\\f16c\\\";\\n$fa-var-star: \\\"\\\\f005\\\";\\n$fa-var-star-half: \\\"\\\\f089\\\";\\n$fa-var-star-half-empty: \\\"\\\\f123\\\";\\n$fa-var-star-half-full: \\\"\\\\f123\\\";\\n$fa-var-star-half-o: \\\"\\\\f123\\\";\\n$fa-var-star-o: \\\"\\\\f006\\\";\\n$fa-var-steam: \\\"\\\\f1b6\\\";\\n$fa-var-steam-square: \\\"\\\\f1b7\\\";\\n$fa-var-step-backward: \\\"\\\\f048\\\";\\n$fa-var-step-forward: \\\"\\\\f051\\\";\\n$fa-var-stethoscope: \\\"\\\\f0f1\\\";\\n$fa-var-sticky-note: \\\"\\\\f249\\\";\\n$fa-var-sticky-note-o: \\\"\\\\f24a\\\";\\n$fa-var-stop: \\\"\\\\f04d\\\";\\n$fa-var-stop-circle: \\\"\\\\f28d\\\";\\n$fa-var-stop-circle-o: \\\"\\\\f28e\\\";\\n$fa-var-street-view: \\\"\\\\f21d\\\";\\n$fa-var-strikethrough: \\\"\\\\f0cc\\\";\\n$fa-var-stumbleupon: \\\"\\\\f1a4\\\";\\n$fa-var-stumbleupon-circle: \\\"\\\\f1a3\\\";\\n$fa-var-subscript: \\\"\\\\f12c\\\";\\n$fa-var-subway: \\\"\\\\f239\\\";\\n$fa-var-suitcase: \\\"\\\\f0f2\\\";\\n$fa-var-sun-o: \\\"\\\\f185\\\";\\n$fa-var-superpowers: \\\"\\\\f2dd\\\";\\n$fa-var-superscript: \\\"\\\\f12b\\\";\\n$fa-var-support: \\\"\\\\f1cd\\\";\\n$fa-var-table: \\\"\\\\f0ce\\\";\\n$fa-var-tablet: \\\"\\\\f10a\\\";\\n$fa-var-tachometer: \\\"\\\\f0e4\\\";\\n$fa-var-tag: \\\"\\\\f02b\\\";\\n$fa-var-tags: \\\"\\\\f02c\\\";\\n$fa-var-tasks: \\\"\\\\f0ae\\\";\\n$fa-var-taxi: \\\"\\\\f1ba\\\";\\n$fa-var-telegram: \\\"\\\\f2c6\\\";\\n$fa-var-television: \\\"\\\\f26c\\\";\\n$fa-var-tencent-weibo: \\\"\\\\f1d5\\\";\\n$fa-var-terminal: \\\"\\\\f120\\\";\\n$fa-var-text-height: \\\"\\\\f034\\\";\\n$fa-var-text-width: \\\"\\\\f035\\\";\\n$fa-var-th: \\\"\\\\f00a\\\";\\n$fa-var-th-large: \\\"\\\\f009\\\";\\n$fa-var-th-list: \\\"\\\\f00b\\\";\\n$fa-var-themeisle: \\\"\\\\f2b2\\\";\\n$fa-var-thermometer: \\\"\\\\f2c7\\\";\\n$fa-var-thermometer-0: \\\"\\\\f2cb\\\";\\n$fa-var-thermometer-1: \\\"\\\\f2ca\\\";\\n$fa-var-thermometer-2: \\\"\\\\f2c9\\\";\\n$fa-var-thermometer-3: \\\"\\\\f2c8\\\";\\n$fa-var-thermometer-4: \\\"\\\\f2c7\\\";\\n$fa-var-thermometer-empty: \\\"\\\\f2cb\\\";\\n$fa-var-thermometer-full: \\\"\\\\f2c7\\\";\\n$fa-var-thermometer-half: \\\"\\\\f2c9\\\";\\n$fa-var-thermometer-quarter: \\\"\\\\f2ca\\\";\\n$fa-var-thermometer-three-quarters: \\\"\\\\f2c8\\\";\\n$fa-var-thumb-tack: \\\"\\\\f08d\\\";\\n$fa-var-thumbs-down: \\\"\\\\f165\\\";\\n$fa-var-thumbs-o-down: \\\"\\\\f088\\\";\\n$fa-var-thumbs-o-up: \\\"\\\\f087\\\";\\n$fa-var-thumbs-up: \\\"\\\\f164\\\";\\n$fa-var-ticket: \\\"\\\\f145\\\";\\n$fa-var-times: \\\"\\\\f00d\\\";\\n$fa-var-times-circle: \\\"\\\\f057\\\";\\n$fa-var-times-circle-o: \\\"\\\\f05c\\\";\\n$fa-var-times-rectangle: \\\"\\\\f2d3\\\";\\n$fa-var-times-rectangle-o: \\\"\\\\f2d4\\\";\\n$fa-var-tint: \\\"\\\\f043\\\";\\n$fa-var-toggle-down: \\\"\\\\f150\\\";\\n$fa-var-toggle-left: \\\"\\\\f191\\\";\\n$fa-var-toggle-off: \\\"\\\\f204\\\";\\n$fa-var-toggle-on: \\\"\\\\f205\\\";\\n$fa-var-toggle-right: \\\"\\\\f152\\\";\\n$fa-var-toggle-up: \\\"\\\\f151\\\";\\n$fa-var-trademark: \\\"\\\\f25c\\\";\\n$fa-var-train: \\\"\\\\f238\\\";\\n$fa-var-transgender: \\\"\\\\f224\\\";\\n$fa-var-transgender-alt: \\\"\\\\f225\\\";\\n$fa-var-trash: \\\"\\\\f1f8\\\";\\n$fa-var-trash-o: \\\"\\\\f014\\\";\\n$fa-var-tree: \\\"\\\\f1bb\\\";\\n$fa-var-trello: \\\"\\\\f181\\\";\\n$fa-var-tripadvisor: \\\"\\\\f262\\\";\\n$fa-var-trophy: \\\"\\\\f091\\\";\\n$fa-var-truck: \\\"\\\\f0d1\\\";\\n$fa-var-try: \\\"\\\\f195\\\";\\n$fa-var-tty: \\\"\\\\f1e4\\\";\\n$fa-var-tumblr: \\\"\\\\f173\\\";\\n$fa-var-tumblr-square: \\\"\\\\f174\\\";\\n$fa-var-turkish-lira: \\\"\\\\f195\\\";\\n$fa-var-tv: \\\"\\\\f26c\\\";\\n$fa-var-twitch: \\\"\\\\f1e8\\\";\\n$fa-var-twitter: \\\"\\\\f099\\\";\\n$fa-var-twitter-square: \\\"\\\\f081\\\";\\n$fa-var-umbrella: \\\"\\\\f0e9\\\";\\n$fa-var-underline: \\\"\\\\f0cd\\\";\\n$fa-var-undo: \\\"\\\\f0e2\\\";\\n$fa-var-universal-access: \\\"\\\\f29a\\\";\\n$fa-var-university: \\\"\\\\f19c\\\";\\n$fa-var-unlink: \\\"\\\\f127\\\";\\n$fa-var-unlock: \\\"\\\\f09c\\\";\\n$fa-var-unlock-alt: \\\"\\\\f13e\\\";\\n$fa-var-unsorted: \\\"\\\\f0dc\\\";\\n$fa-var-upload: \\\"\\\\f093\\\";\\n$fa-var-usb: \\\"\\\\f287\\\";\\n$fa-var-usd: \\\"\\\\f155\\\";\\n$fa-var-user: \\\"\\\\f007\\\";\\n$fa-var-user-circle: \\\"\\\\f2bd\\\";\\n$fa-var-user-circle-o: \\\"\\\\f2be\\\";\\n$fa-var-user-md: \\\"\\\\f0f0\\\";\\n$fa-var-user-o: \\\"\\\\f2c0\\\";\\n$fa-var-user-plus: \\\"\\\\f234\\\";\\n$fa-var-user-secret: \\\"\\\\f21b\\\";\\n$fa-var-user-times: \\\"\\\\f235\\\";\\n$fa-var-users: \\\"\\\\f0c0\\\";\\n$fa-var-vcard: \\\"\\\\f2bb\\\";\\n$fa-var-vcard-o: \\\"\\\\f2bc\\\";\\n$fa-var-venus: \\\"\\\\f221\\\";\\n$fa-var-venus-double: \\\"\\\\f226\\\";\\n$fa-var-venus-mars: \\\"\\\\f228\\\";\\n$fa-var-viacoin: \\\"\\\\f237\\\";\\n$fa-var-viadeo: \\\"\\\\f2a9\\\";\\n$fa-var-viadeo-square: \\\"\\\\f2aa\\\";\\n$fa-var-video-camera: \\\"\\\\f03d\\\";\\n$fa-var-vimeo: \\\"\\\\f27d\\\";\\n$fa-var-vimeo-square: \\\"\\\\f194\\\";\\n$fa-var-vine: \\\"\\\\f1ca\\\";\\n$fa-var-vk: \\\"\\\\f189\\\";\\n$fa-var-volume-control-phone: \\\"\\\\f2a0\\\";\\n$fa-var-volume-down: \\\"\\\\f027\\\";\\n$fa-var-volume-off: \\\"\\\\f026\\\";\\n$fa-var-volume-up: \\\"\\\\f028\\\";\\n$fa-var-warning: \\\"\\\\f071\\\";\\n$fa-var-wechat: \\\"\\\\f1d7\\\";\\n$fa-var-weibo: \\\"\\\\f18a\\\";\\n$fa-var-weixin: \\\"\\\\f1d7\\\";\\n$fa-var-whatsapp: \\\"\\\\f232\\\";\\n$fa-var-wheelchair: \\\"\\\\f193\\\";\\n$fa-var-wheelchair-alt: \\\"\\\\f29b\\\";\\n$fa-var-wifi: \\\"\\\\f1eb\\\";\\n$fa-var-wikipedia-w: \\\"\\\\f266\\\";\\n$fa-var-window-close: \\\"\\\\f2d3\\\";\\n$fa-var-window-close-o: \\\"\\\\f2d4\\\";\\n$fa-var-window-maximize: \\\"\\\\f2d0\\\";\\n$fa-var-window-minimize: \\\"\\\\f2d1\\\";\\n$fa-var-window-restore: \\\"\\\\f2d2\\\";\\n$fa-var-windows: \\\"\\\\f17a\\\";\\n$fa-var-won: \\\"\\\\f159\\\";\\n$fa-var-wordpress: \\\"\\\\f19a\\\";\\n$fa-var-wpbeginner: \\\"\\\\f297\\\";\\n$fa-var-wpexplorer: \\\"\\\\f2de\\\";\\n$fa-var-wpforms: \\\"\\\\f298\\\";\\n$fa-var-wrench: \\\"\\\\f0ad\\\";\\n$fa-var-xing: \\\"\\\\f168\\\";\\n$fa-var-xing-square: \\\"\\\\f169\\\";\\n$fa-var-y-combinator: \\\"\\\\f23b\\\";\\n$fa-var-y-combinator-square: \\\"\\\\f1d4\\\";\\n$fa-var-yahoo: \\\"\\\\f19e\\\";\\n$fa-var-yc: \\\"\\\\f23b\\\";\\n$fa-var-yc-square: \\\"\\\\f1d4\\\";\\n$fa-var-yelp: \\\"\\\\f1e9\\\";\\n$fa-var-yen: \\\"\\\\f157\\\";\\n$fa-var-yoast: \\\"\\\\f2b1\\\";\\n$fa-var-youtube: \\\"\\\\f167\\\";\\n$fa-var-youtube-play: \\\"\\\\f16a\\\";\\n$fa-var-youtube-square: \\\"\\\\f166\\\";\\n\\n\",\"// Bordered & Pulled\\n// -------------------------\\n\\n.#{$fa-css-prefix}-border {\\n padding: .2em .25em .15em;\\n border: solid .08em $fa-border-color;\\n border-radius: .1em;\\n}\\n\\n.#{$fa-css-prefix}-pull-left { float: left; }\\n.#{$fa-css-prefix}-pull-right { float: right; }\\n\\n.#{$fa-css-prefix} {\\n &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }\\n &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }\\n}\\n\\n/* Deprecated as of 4.4.0 */\\n.pull-right { float: right; }\\n.pull-left { float: left; }\\n\\n.#{$fa-css-prefix} {\\n &.pull-left { margin-right: .3em; }\\n &.pull-right { margin-left: .3em; }\\n}\\n\",\"// Spinning Icons\\n// --------------------------\\n\\n.#{$fa-css-prefix}-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.#{$fa-css-prefix}-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(359deg);\\n transform: rotate(359deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(359deg);\\n transform: rotate(359deg);\\n }\\n}\\n\",\"// Rotated & Flipped Icons\\n// -------------------------\\n\\n.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }\\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\\n\\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\\n.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }\\n\\n// Hook for IE8-9\\n// -------------------------\\n\\n:root .#{$fa-css-prefix}-rotate-90,\\n:root .#{$fa-css-prefix}-rotate-180,\\n:root .#{$fa-css-prefix}-rotate-270,\\n:root .#{$fa-css-prefix}-flip-horizontal,\\n:root .#{$fa-css-prefix}-flip-vertical {\\n filter: none;\\n}\\n\",\"// Mixins\\n// --------------------------\\n\\n@mixin fa-icon() {\\n display: inline-block;\\n font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\\n font-size: inherit; // can't have font-size inherit on line above, so need to override\\n text-rendering: auto; // optimizelegibility throws things off #1094\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n\\n}\\n\\n@mixin fa-icon-rotate($degrees, $rotation) {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})\\\";\\n -webkit-transform: rotate($degrees);\\n -ms-transform: rotate($degrees);\\n transform: rotate($degrees);\\n}\\n\\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)\\\";\\n -webkit-transform: scale($horiz, $vert);\\n -ms-transform: scale($horiz, $vert);\\n transform: scale($horiz, $vert);\\n}\\n\\n\\n// Only display content to screen readers. A la Bootstrap 4.\\n//\\n// See: http://a11yproject.com/posts/how-to-hide-content/\\n\\n@mixin sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0,0,0,0);\\n border: 0;\\n}\\n\\n// Use in conjunction with .sr-only to only display content when it's focused.\\n//\\n// Useful for \\\"Skip to main content\\\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\\n//\\n// Credit: HTML5 Boilerplate\\n\\n@mixin sr-only-focusable {\\n &:active,\\n &:focus {\\n position: static;\\n width: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n clip: auto;\\n }\\n}\\n\",\"// Stacked Icons\\n// -------------------------\\n\\n.#{$fa-css-prefix}-stack {\\n position: relative;\\n display: inline-block;\\n width: 2em;\\n height: 2em;\\n line-height: 2em;\\n vertical-align: middle;\\n}\\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\\n position: absolute;\\n left: 0;\\n width: 100%;\\n text-align: center;\\n}\\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\\n\",\"/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\\n readers do not read off random characters that represent icons */\\n\\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\\n.#{$fa-css-prefix}-remove:before,\\n.#{$fa-css-prefix}-close:before,\\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\\n.#{$fa-css-prefix}-gear:before,\\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\\n.#{$fa-css-prefix}-rotate-right:before,\\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\\n.#{$fa-css-prefix}-dedent:before,\\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\\n.#{$fa-css-prefix}-photo:before,\\n.#{$fa-css-prefix}-image:before,\\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\\n.#{$fa-css-prefix}-edit:before,\\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\\n.#{$fa-css-prefix}-mail-forward:before,\\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\\n.#{$fa-css-prefix}-warning:before,\\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\\n.#{$fa-css-prefix}-bar-chart-o:before,\\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\\n.#{$fa-css-prefix}-gears:before,\\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\\n.#{$fa-css-prefix}-facebook-f:before,\\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\\n.#{$fa-css-prefix}-feed:before,\\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\\n.#{$fa-css-prefix}-group:before,\\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\\n.#{$fa-css-prefix}-chain:before,\\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\\n.#{$fa-css-prefix}-cut:before,\\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\\n.#{$fa-css-prefix}-copy:before,\\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\\n.#{$fa-css-prefix}-save:before,\\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\\n.#{$fa-css-prefix}-navicon:before,\\n.#{$fa-css-prefix}-reorder:before,\\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\\n.#{$fa-css-prefix}-unsorted:before,\\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\\n.#{$fa-css-prefix}-sort-down:before,\\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\\n.#{$fa-css-prefix}-sort-up:before,\\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\\n.#{$fa-css-prefix}-rotate-left:before,\\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\\n.#{$fa-css-prefix}-legal:before,\\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\\n.#{$fa-css-prefix}-dashboard:before,\\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\\n.#{$fa-css-prefix}-flash:before,\\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\\n.#{$fa-css-prefix}-paste:before,\\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\\n.#{$fa-css-prefix}-mobile-phone:before,\\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\\n.#{$fa-css-prefix}-mail-reply:before,\\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\\n.#{$fa-css-prefix}-mail-reply-all:before,\\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\\n.#{$fa-css-prefix}-star-half-empty:before,\\n.#{$fa-css-prefix}-star-half-full:before,\\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\\n.#{$fa-css-prefix}-unlink:before,\\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\\n.#{$fa-css-prefix}-toggle-down:before,\\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\\n.#{$fa-css-prefix}-toggle-up:before,\\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\\n.#{$fa-css-prefix}-toggle-right:before,\\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\\n.#{$fa-css-prefix}-euro:before,\\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\\n.#{$fa-css-prefix}-dollar:before,\\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\\n.#{$fa-css-prefix}-rupee:before,\\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\\n.#{$fa-css-prefix}-cny:before,\\n.#{$fa-css-prefix}-rmb:before,\\n.#{$fa-css-prefix}-yen:before,\\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\\n.#{$fa-css-prefix}-ruble:before,\\n.#{$fa-css-prefix}-rouble:before,\\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\\n.#{$fa-css-prefix}-won:before,\\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\\n.#{$fa-css-prefix}-bitcoin:before,\\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\\n.#{$fa-css-prefix}-gittip:before,\\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\\n.#{$fa-css-prefix}-toggle-left:before,\\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\\n.#{$fa-css-prefix}-turkish-lira:before,\\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\\n.#{$fa-css-prefix}-institution:before,\\n.#{$fa-css-prefix}-bank:before,\\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\\n.#{$fa-css-prefix}-mortar-board:before,\\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\\n.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }\\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\\n.#{$fa-css-prefix}-automobile:before,\\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\\n.#{$fa-css-prefix}-cab:before,\\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\\n.#{$fa-css-prefix}-file-photo-o:before,\\n.#{$fa-css-prefix}-file-picture-o:before,\\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\\n.#{$fa-css-prefix}-file-zip-o:before,\\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\\n.#{$fa-css-prefix}-file-sound-o:before,\\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\\n.#{$fa-css-prefix}-file-movie-o:before,\\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\\n.#{$fa-css-prefix}-life-bouy:before,\\n.#{$fa-css-prefix}-life-buoy:before,\\n.#{$fa-css-prefix}-life-saver:before,\\n.#{$fa-css-prefix}-support:before,\\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\\n.#{$fa-css-prefix}-ra:before,\\n.#{$fa-css-prefix}-resistance:before,\\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\\n.#{$fa-css-prefix}-ge:before,\\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\\n.#{$fa-css-prefix}-y-combinator-square:before,\\n.#{$fa-css-prefix}-yc-square:before,\\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\\n.#{$fa-css-prefix}-wechat:before,\\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\\n.#{$fa-css-prefix}-send:before,\\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\\n.#{$fa-css-prefix}-send-o:before,\\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\\n.#{$fa-css-prefix}-soccer-ball-o:before,\\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\\n.#{$fa-css-prefix}-shekel:before,\\n.#{$fa-css-prefix}-sheqel:before,\\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\\n.#{$fa-css-prefix}-intersex:before,\\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\\n.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }\\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\\n.#{$fa-css-prefix}-hotel:before,\\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\\n.#{$fa-css-prefix}-yc:before,\\n.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }\\n.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }\\n.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }\\n.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }\\n.#{$fa-css-prefix}-battery-4:before,\\n.#{$fa-css-prefix}-battery:before,\\n.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }\\n.#{$fa-css-prefix}-battery-3:before,\\n.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }\\n.#{$fa-css-prefix}-battery-2:before,\\n.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }\\n.#{$fa-css-prefix}-battery-1:before,\\n.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }\\n.#{$fa-css-prefix}-battery-0:before,\\n.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }\\n.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }\\n.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }\\n.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }\\n.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }\\n.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }\\n.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }\\n.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }\\n.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }\\n.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }\\n.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }\\n.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }\\n.#{$fa-css-prefix}-hourglass-1:before,\\n.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }\\n.#{$fa-css-prefix}-hourglass-2:before,\\n.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }\\n.#{$fa-css-prefix}-hourglass-3:before,\\n.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }\\n.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }\\n.#{$fa-css-prefix}-hand-grab-o:before,\\n.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }\\n.#{$fa-css-prefix}-hand-stop-o:before,\\n.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }\\n.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }\\n.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }\\n.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }\\n.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }\\n.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }\\n.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }\\n.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }\\n.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }\\n.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }\\n.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }\\n.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }\\n.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }\\n.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }\\n.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }\\n.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }\\n.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }\\n.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }\\n.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }\\n.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }\\n.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }\\n.#{$fa-css-prefix}-tv:before,\\n.#{$fa-css-prefix}-television:before { content: $fa-var-television; }\\n.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }\\n.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }\\n.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }\\n.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }\\n.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }\\n.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }\\n.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }\\n.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }\\n.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }\\n.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }\\n.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }\\n.#{$fa-css-prefix}-map:before { content: $fa-var-map; }\\n.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }\\n.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }\\n.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }\\n.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }\\n.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }\\n.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }\\n.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }\\n.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }\\n.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }\\n.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }\\n.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }\\n.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }\\n.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }\\n.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }\\n.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }\\n.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }\\n.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }\\n.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }\\n.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }\\n.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }\\n.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }\\n.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }\\n.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }\\n.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }\\n.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }\\n.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }\\n.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }\\n.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }\\n.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }\\n.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }\\n.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }\\n.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }\\n.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }\\n.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }\\n.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }\\n.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }\\n.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }\\n.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }\\n.#{$fa-css-prefix}-asl-interpreting:before,\\n.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }\\n.#{$fa-css-prefix}-deafness:before,\\n.#{$fa-css-prefix}-hard-of-hearing:before,\\n.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }\\n.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }\\n.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }\\n.#{$fa-css-prefix}-signing:before,\\n.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }\\n.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }\\n.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }\\n.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }\\n.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }\\n.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }\\n.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }\\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\\n.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }\\n.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }\\n.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }\\n.#{$fa-css-prefix}-google-plus-circle:before,\\n.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }\\n.#{$fa-css-prefix}-fa:before,\\n.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }\\n.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; }\\n.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; }\\n.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; }\\n.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; }\\n.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; }\\n.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; }\\n.#{$fa-css-prefix}-vcard:before,\\n.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; }\\n.#{$fa-css-prefix}-vcard-o:before,\\n.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; }\\n.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; }\\n.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; }\\n.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; }\\n.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; }\\n.#{$fa-css-prefix}-drivers-license:before,\\n.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; }\\n.#{$fa-css-prefix}-drivers-license-o:before,\\n.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; }\\n.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; }\\n.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; }\\n.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; }\\n.#{$fa-css-prefix}-thermometer-4:before,\\n.#{$fa-css-prefix}-thermometer:before,\\n.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; }\\n.#{$fa-css-prefix}-thermometer-3:before,\\n.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; }\\n.#{$fa-css-prefix}-thermometer-2:before,\\n.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; }\\n.#{$fa-css-prefix}-thermometer-1:before,\\n.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; }\\n.#{$fa-css-prefix}-thermometer-0:before,\\n.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; }\\n.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; }\\n.#{$fa-css-prefix}-bathtub:before,\\n.#{$fa-css-prefix}-s15:before,\\n.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; }\\n.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; }\\n.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; }\\n.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; }\\n.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; }\\n.#{$fa-css-prefix}-times-rectangle:before,\\n.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; }\\n.#{$fa-css-prefix}-times-rectangle-o:before,\\n.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; }\\n.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; }\\n.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; }\\n.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; }\\n.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; }\\n.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; }\\n.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; }\\n.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; }\\n.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; }\\n.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; }\\n.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; }\\n.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; }\\n\",\"// Screen Readers\\n// -------------------------\\n\\n.sr-only { @include sr-only(); }\\n.sr-only-focusable { @include sr-only-focusable(); }\\n\",\".ruleset-object-copy-modal {\\r\\n .copied-objects-container {\\r\\n border: 1px solid #DBDBDB;\\r\\n background: #DBDBDB;\\r\\n border-radius: 5px;\\r\\n max-height: 160px;\\r\\n overflow-y: auto;\\r\\n }\\r\\n\\r\\n .copied-objects-list {\\r\\n border: 1px solid #DBDBDB;\\r\\n background: #FFFFFF;\\r\\n }\\r\\n}\\r\\n\",\"/* Height difference causing floated zip code form-group to get stuck */\\r\\n.form-group.im-request-salesforce-user-state .k-widget.k-dropdown {\\r\\n height: 30px;\\r\\n}\",\".sap-security-designer {\\r\\n // resize stacked font icons to match standard ones in list view headings\\r\\n .input-group-addon {\\r\\n .fa-stack.fa-stack-small {\\r\\n font-size: .7em\\r\\n }\\r\\n }\\r\\n // minimize grid height for role modal when copying role\\r\\n .copy-grid {\\r\\n .k-grid-content {\\r\\n max-height: 20em;\\r\\n }\\r\\n }\\r\\n // list-item and context menu styles\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\\r\\n.sap-simulation-risk-analysis-report .k-grid-content {\\r\\n min-height: 340px;\\r\\n}\\r\\n\",\".saved-reports {\\r\\n .no-reports {\\r\\n color: #d5d5d6;\\r\\n text-align: center;\\r\\n font-size: 40px;\\r\\n\\r\\n p:nth-child(3) {\\r\\n font-size: 15px;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".rounded-border {\\r\\n border-radius: 5px;\\r\\n}\\r\\n\",\".custom-ibox {\\r\\n /* Panel Header and Footer */\\r\\n\\r\\n ::-webkit-scrollbar {\\r\\n scrollbar-width: thin;\\r\\n scrollbar-color: #DEDEDE #F9F9F9;\\r\\n width: 12px;\\r\\n border: 1px solid #DEDEDE;\\r\\n }\\r\\n\\r\\n ::-webkit-scrollbar-track {\\r\\n background: #F9F9F9;\\r\\n }\\r\\n\\r\\n ::-webkit-scrollbar-thumb {\\r\\n background-color: #DEDEDE;\\r\\n border-radius: 20px;\\r\\n border: 3px solid #F9F9F9;\\r\\n }\\r\\n\\r\\n .ibox-dropdown {\\r\\n color: #121321 !important;\\r\\n max-width: 240px;\\r\\n border-radius: 5px;\\r\\n padding: 6px 16px 6px 12px;\\r\\n font-size: 12px;\\r\\n }\\r\\n\\r\\n .ibox-dropdown-sm {\\r\\n color: #121321 !important;\\r\\n max-width: 150px;\\r\\n border-radius: 5px;\\r\\n padding: 6px 16px 6px 12px;\\r\\n font-size: 12px;\\r\\n }\\r\\n\\r\\n select {\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n width: 200px;\\r\\n padding-right: 15px;\\r\\n }\\r\\n\\r\\n .criteria-drop {\\r\\n color: #121321 !important;\\r\\n }\\r\\n\\r\\n .form-group {\\r\\n margin: 0;\\r\\n }\\r\\n\\r\\n label {\\r\\n margin: 0;\\r\\n }\\r\\n\\r\\n .single-line {\\r\\n color: #121321 !important;\\r\\n }\\r\\n\\r\\n .full-span-ibox {\\r\\n width: 100% !important;\\r\\n }\\r\\n\\r\\n .font-w-500 {\\r\\n font-weight: 500;\\r\\n }\\r\\n\\r\\n .font-12 {\\r\\n font-size: 12px;\\r\\n }\\r\\n\\r\\n .pill-radio {\\r\\n background: white;\\r\\n color: $text-color;\\r\\n padding: 2px 12px;\\r\\n margin-right: 4px;\\r\\n font-size: 11px;\\r\\n border-radius: 14px;\\r\\n cursor: pointer;\\r\\n display: inline-block;\\r\\n }\\r\\n\\r\\n .pill-radio:hover {\\r\\n background: darken(white, 4%);\\r\\n color: $text-color;\\r\\n font-weight: 800;\\r\\n }\\r\\n\\r\\n .pill-radio.active {\\r\\n background: darken(white, 4%);\\r\\n color: $text-color;\\r\\n font-weight: 800;\\r\\n }\\r\\n\\r\\n .filter-pills-above-grid {\\r\\n background-color: #8EA7B8 !important;\\r\\n }\\r\\n\\r\\n .check-btn-placeholder {\\r\\n padding: 11px;\\r\\n }\\r\\n\\r\\n .flex-vcenter {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n }\\r\\n\\r\\n h5 {\\r\\n margin: 0;\\r\\n }\\r\\n\\r\\n .list-view-body {\\r\\n max-height: 550px;\\r\\n overflow-y: auto;\\r\\n }\\r\\n /* Desktops and laptops ----------- */\\r\\n @media only screen and (max-width : 1223px) {\\r\\n .list-view-body {\\r\\n max-height: 350px;\\r\\n overflow-y: auto;\\r\\n }\\r\\n }\\r\\n\\r\\n @media only screen and (min-width : 1224px) {\\r\\n .list-view-body {\\r\\n max-height: 350px;\\r\\n overflow-y: auto;\\r\\n }\\r\\n }\\r\\n /* Large screens ----------- */\\r\\n @media only screen and (min-width : 1824px) {\\r\\n .list-view-body {\\r\\n max-height: 500px;\\r\\n overflow-y: auto;\\r\\n }\\r\\n }\\r\\n\\r\\n list-item {\\r\\n border-right: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .ibox-title {\\r\\n border-radius: 5px 5px 0px 0px !important;\\r\\n background: #231556 !important;\\r\\n color: white;\\r\\n padding: 10px 15px;\\r\\n\\r\\n .switch :checked + i {\\r\\n box-shadow: inset 0 0 1px rgba(0,0,0,.38), inset 0 0 40px #291972;\\r\\n -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,.38), inset 0 0 40px #291972;\\r\\n }\\r\\n\\r\\n .fa-plus {\\r\\n color: #291972;\\r\\n }\\r\\n\\r\\n .fa-pencil {\\r\\n color: #291972;\\r\\n }\\r\\n\\r\\n .fa-copy {\\r\\n color: #291972;\\r\\n }\\r\\n }\\r\\n\\r\\n .fa-ellipsis-h {\\r\\n color: $fp-purple;\\r\\n }\\r\\n\\r\\n .fa-filter {\\r\\n margin-right: 5px;\\r\\n }\\r\\n\\r\\n .btn-default {\\r\\n border-radius: 5px;\\r\\n padding: 2px 6px;\\r\\n }\\r\\n\\r\\n .btn-secondary {\\r\\n font-weight: 600;\\r\\n color: $fp-purple;\\r\\n background: white;\\r\\n\\r\\n &:hover {\\r\\n outline: none;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n outline: none;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n outline: none;\\r\\n }\\r\\n }\\r\\n\\r\\n .popover-title {\\r\\n color: #808080;\\r\\n }\\r\\n\\r\\n .btn-blueRadio {\\r\\n color: #808080;\\r\\n }\\r\\n\\r\\n .pagination-sm {\\r\\n color: $text-color;\\r\\n font-weight: 700;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n background-color: white;\\r\\n }\\r\\n\\r\\n .pagination > li > a, .pagination > li > span {\\r\\n background: white;\\r\\n border-color: $border-color;\\r\\n color: $text-color;\\r\\n font-weight: 700;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n margin: 0;\\r\\n font-size: 10px;\\r\\n }\\r\\n\\r\\n .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span {\\r\\n border-top-left-radius: 6px;\\r\\n border-bottom-left-radius: 6px;\\r\\n }\\r\\n\\r\\n .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span {\\r\\n border-top-right-radius: 6px;\\r\\n border-bottom-right-radius: 6px;\\r\\n }\\r\\n\\r\\n .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus {\\r\\n background: darken(white, 4%);\\r\\n color: $text-color;\\r\\n border-color: $text-color;\\r\\n font-weight: 700;\\r\\n }\\r\\n\\r\\n .ibox-bottom-bar {\\r\\n padding: 10px 15px;\\r\\n background: #EEEFF2;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 4px;\\r\\n\\r\\n .saved-message {\\r\\n color: #121321;\\r\\n }\\r\\n\\r\\n .btn-default {\\r\\n background-color: $fp-gray-pager;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".ac-my-reviews {\\r\\n .review-assignment-tile {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .review-submit-btn-wrap {\\r\\n a {\\r\\n color: white;\\r\\n }\\r\\n\\r\\n span {\\r\\n font-size: 12px;\\r\\n font-weight: 600;\\r\\n }\\r\\n }\\r\\n\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n\\r\\n .ibox-title-p-xs {\\r\\n border-radius: 5px 5px 0px 0px !important;\\r\\n background: $delinea-purple !important;\\r\\n color: white;\\r\\n padding: 10px;\\r\\n\\r\\n h5 {\\r\\n font-size: 22.5px;\\r\\n }\\r\\n }\\r\\n\\r\\n span.btn a {\\r\\n color: white;\\r\\n }\\r\\n\\r\\n .btn-greenRadio:focus, .btn-greenRadio:active, .btn-greenRadio.active, .open .dropdown-toggle.btn-greenRadio {\\r\\n background-color: $fp-label-green-bg;\\r\\n border-color: $fp-label-green-border;\\r\\n color: $fp-label-green-text !important;\\r\\n }\\r\\n}\\r\\n\",\".task-recording-manager {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n\\r\\n input {\\r\\n accent-color: #E74C3C;\\r\\n }\\r\\n\\r\\n .btn-danger {\\r\\n background: #E74C3C;\\r\\n font-size: 11px;\\r\\n padding: 3px 6px;\\r\\n font-weight: bold;\\r\\n }\\r\\n\\r\\n .bulk-delete {\\r\\n background: #FBE1DE;\\r\\n color: #E74C3C;\\r\\n padding: 5px 15px;\\r\\n }\\r\\n\\r\\n .txt-danger {\\r\\n color: #E74C3C;\\r\\n }\\r\\n}\\r\\n\",\".review-schedules {\\r\\n .btn-blue {\\r\\n border: 2px solid $fp-yellow;\\r\\n color: white;\\r\\n font-size: 13px;\\r\\n font-weight: 600;\\r\\n display: inline-block;\\r\\n padding: 5px 10px;\\r\\n border-radius: 4px;\\r\\n background: $fp-yellow;\\r\\n }\\r\\n\\r\\n .btn-blue:focus {\\r\\n background-color: #261769;\\r\\n border-color: #261769;\\r\\n color: white;\\r\\n }\\r\\n\\r\\n\\r\\n .btn-blue:hover {\\r\\n background-color: #261769;\\r\\n border-color: #261769;\\r\\n color: $delinea-green;\\r\\n }\\r\\n\\r\\n .btn-red {\\r\\n color: RGBA(231,76,60,1);\\r\\n border: 2px solid RGBA(231,76,60,1);\\r\\n font-size: 13px;\\r\\n font-weight: 600;\\r\\n display: inline-block;\\r\\n padding: 5px 10px;\\r\\n border-radius: 15px;\\r\\n background: white;\\r\\n font-weight: 700;\\r\\n }\\r\\n\\r\\n .btn-red:hover {\\r\\n background: RGBA(231,76,60,0.15);\\r\\n color: RGBA(231,76,60,1);\\r\\n }\\r\\n\\r\\n .sm-spinner-contain {\\r\\n position: relative;\\r\\n left: 4px;\\r\\n width: 24px;\\r\\n height: 8px;\\r\\n display: flex;\\r\\n }\\r\\n\\r\\n h3 {\\r\\n margin: 0px 15px 15px 15px;\\r\\n }\\r\\n\\r\\n .review-item {\\r\\n width: 100%;\\r\\n height: 7em;\\r\\n padding: 0px;\\r\\n margin: 0px;\\r\\n }\\r\\n\\r\\n .review-ibox {\\r\\n border-radius: 5px;\\r\\n width: 100%;\\r\\n\\r\\n .ibox-title {\\r\\n border-radius: 5px 5px 0px 0px;\\r\\n }\\r\\n\\r\\n .review-assignment-icon-circle {\\r\\n margin-right: 10px;\\r\\n }\\r\\n\\r\\n .ibox-content {\\r\\n border-radius: 0px 0px 5px 5px;\\r\\n }\\r\\n\\r\\n .col-xs-3, col-xs-9 {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n h4:nth-child(1) {\\r\\n color: RGBA(50,119,179,1);\\r\\n margin: 15px 15px 0px 15px;\\r\\n }\\r\\n\\r\\n .btn-blue {\\r\\n margin-top: 15px;\\r\\n margin-right: 10px;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".group-item-owners-list {\\r\\n .label {\\r\\n white-space: normal;\\r\\n }\\r\\n\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".inbox-styles {\\r\\n * {\\r\\n scrollbar-width: thin;\\r\\n scrollbar-color: #E7E7E7 #FFF;\\r\\n }\\r\\n\\r\\n ::-webkit-scrollbar {\\r\\n width: 12px;\\r\\n border: 1px solid #E7E7E7;\\r\\n }\\r\\n\\r\\n ::-webkit-scrollbar-track {\\r\\n background: #FFF;\\r\\n }\\r\\n\\r\\n ::-webkit-scrollbar-thumb {\\r\\n background-color: #E7E7E7;\\r\\n border-radius: 20px;\\r\\n border: 3px solid #FFF;\\r\\n }\\r\\n\\r\\n .caret {\\r\\n margin-left: 10px;\\r\\n }\\r\\n\\r\\n .list-view-body {\\r\\n max-height: 500px;\\r\\n overflow-y: auto;\\r\\n }\\r\\n\\r\\n .no-left-padding {\\r\\n padding-left: 0px;\\r\\n }\\r\\n\\r\\n .inbox-red {\\r\\n color: $red;\\r\\n }\\r\\n\\r\\n .ibox-title {\\r\\n color: #121321;\\r\\n padding: 15px;\\r\\n border-radius: 5px;\\r\\n }\\r\\n\\r\\n .ibox {\\r\\n border-radius: 4px;\\r\\n }\\r\\n\\r\\n .list-item {\\r\\n background: white;\\r\\n }\\r\\n\\r\\n .list-item:nth-child(even) {\\r\\n background: #FFF;\\r\\n }\\r\\n\\r\\n label {\\r\\n font-weight: normal;\\r\\n }\\r\\n\\r\\n p {\\r\\n color: #707070;\\r\\n font-size: 10px;\\r\\n text-align: center;\\r\\n }\\r\\n\\r\\n .btn-default .badge {\\r\\n background-color: #FFD5D6;\\r\\n color: #BA0003;\\r\\n border: 1px solid #F91D21;\\r\\n }\\r\\n\\r\\n .btn-primary {\\r\\n font-size: 12px;\\r\\n font-weight: bold;\\r\\n\\r\\n &:hover {\\r\\n outline: none;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n outline: none;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n outline: none;\\r\\n }\\r\\n }\\r\\n\\r\\n .btn-success {\\r\\n font-size: 12px;\\r\\n font-weight: bold;\\r\\n\\r\\n &:hover {\\r\\n background-color: #25a75c;\\r\\n border-color: #25a75c;\\r\\n color: white;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background-color: #25a75c;\\r\\n border-color: #25a75c;\\r\\n color: white;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n background-color: #25a75c;\\r\\n border-color: #25a75c;\\r\\n color: white;\\r\\n }\\r\\n }\\r\\n\\r\\n .open {\\r\\n .dropdown-toggle.btn-success {\\r\\n background-color: #25a75c;\\r\\n border-color: #25a75c;\\r\\n color: white;\\r\\n }\\r\\n }\\r\\n\\r\\n .btn-default {\\r\\n padding: 25px 20px;\\r\\n width: 300px;\\r\\n color: #121321;\\r\\n background-color: white;\\r\\n border-color: #C2C4CC;\\r\\n\\r\\n &:hover {\\r\\n background: #f5f5f5;\\r\\n color: #121321;\\r\\n outline: none;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n &:focus {\\r\\n color: #121321;\\r\\n background-color: #e0e0e0;\\r\\n border-right: 4px solid $fp-purple;\\r\\n outline: none;\\r\\n font-weight: bold;\\r\\n }\\r\\n\\r\\n &:hover {\\r\\n color: #121321;\\r\\n background-color: #f5f5f5;\\r\\n border-color: #C2C4CC;\\r\\n outline: none;\\r\\n }\\r\\n\\r\\n background: #e0e0e0;\\r\\n color: #121321;\\r\\n border-color: #C2C4CC;\\r\\n outline: none;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background: #e0e0e0;\\r\\n color: #121321;\\r\\n font-weight: bold;\\r\\n border-right: 4px solid $fp-purple;\\r\\n outline: none;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".maintain-risk-ruleset {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #e7e7e7;\\r\\n }\\r\\n\\r\\n .select-mode {\\r\\n border-right: 1px solid #E7ECEA;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n input {\\r\\n accent-color: #5DA45E;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .btn-copy {\\r\\n background: #5DA45E;\\r\\n font-size: 11px;\\r\\n padding: 3px 6px;\\r\\n font-weight: bold;\\r\\n color: #fff;\\r\\n }\\r\\n\\r\\n .btn-copy:hover {\\r\\n background: #579858;\\r\\n font-size: 11px;\\r\\n padding: 3px 6px;\\r\\n font-weight: bold;\\r\\n }\\r\\n\\r\\n .bulk-copy {\\r\\n background: #E3EFE3;\\r\\n color: #5DA45E;\\r\\n padding: 5px 15px;\\r\\n }\\r\\n\\r\\n .text-copy {\\r\\n color: #5DA45E;\\r\\n }\\r\\n}\\r\\n\",\".maintain-business-process {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n\\r\\n .select-mode {\\r\\n cursor: pointer;\\r\\n border-right: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n input {\\r\\n accent-color: #5DA45E;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .btn-copy {\\r\\n background: #5DA45E;\\r\\n font-size: 11px;\\r\\n padding: 3px 6px;\\r\\n font-weight: bold;\\r\\n color: #fff;\\r\\n }\\r\\n\\r\\n .btn-copy:hover {\\r\\n background: #579858;\\r\\n font-size: 11px;\\r\\n padding: 3px 6px;\\r\\n font-weight: bold;\\r\\n }\\r\\n\\r\\n .bulk-copy {\\r\\n background: #E3EFE3;\\r\\n color: #5DA45E;\\r\\n padding: 5px 15px;\\r\\n }\\r\\n\\r\\n .text-copy {\\r\\n color: #5DA45E;\\r\\n }\\r\\n}\\r\\n\",\".certifications-all-review {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n\\r\\n .fa-filter {\\r\\n margin: 0;\\r\\n }\\r\\n}\\r\\n\",\".notification-teams {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".review-schedule-instances-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".instance-assignments-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".review-schedule-routing-criteria-instances-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".generated-reports {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #e7e7e7;\\r\\n }\\r\\n}\\r\\n\",\".sim-risk-analysis {\\r\\n .sapBack {\\r\\n font-size: 1.5em;\\r\\n margin: 5px;\\r\\n\\r\\n &:focus {\\r\\n outline: none;\\r\\n }\\r\\n }\\r\\n\\r\\n .btn-detailed {\\r\\n background: #2881EB;\\r\\n font-weight: 700;\\r\\n color: white;\\r\\n padding: 5px 10px;\\r\\n font-size: 12px;\\r\\n line-height: 1.5;\\r\\n border-radius: 3px;\\r\\n margin: 5px;\\r\\n\\r\\n &:hover {\\r\\n background: #2876D4;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n background: #2876D4;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background: #2876D4;\\r\\n outline: none;\\r\\n }\\r\\n }\\r\\n\\r\\n .btn-single {\\r\\n background: #2881EB;\\r\\n font-weight: 700;\\r\\n color: white;\\r\\n padding: 5px 10px;\\r\\n font-size: 12px;\\r\\n line-height: 1.5;\\r\\n border-radius: 3px;\\r\\n margin: 5px;\\r\\n\\r\\n &:hover {\\r\\n background: #2876D4;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n background: #2876D4;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background: #2876D4;\\r\\n outline: none;\\r\\n }\\r\\n }\\r\\n\\r\\n .btn-composite {\\r\\n background: #62BD60;\\r\\n font-weight: 700;\\r\\n color: white;\\r\\n padding: 5px 10px;\\r\\n font-size: 12px;\\r\\n line-height: 1.5;\\r\\n border-radius: 3px;\\r\\n margin: 5px;\\r\\n\\r\\n &:hover {\\r\\n background: #5AA758;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n background: #5AA758;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background: #5AA758;\\r\\n outline: none;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".migrations-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".sap-auth-field-groups {\\r\\n .table {\\r\\n margin-bottom: 0px;\\r\\n }\\r\\n}\\r\\n\",\".approval-groups {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".company-templates-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".company-templates-companies-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".notification-types-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n\\r\\n .panel-heading {\\r\\n background-color: white;\\r\\n }\\r\\n}\\r\\n\",\".ownership-groups-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".group-roles-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".group-owners-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\\r\\n.group-multiselect-dropdown {\\r\\n div.k-multiselect-wrap {\\r\\n max-height: 15em;\\r\\n overflow: auto;\\r\\n }\\r\\n}\\r\\n\",\".group-owner-items-list {\\r\\n .label {\\r\\n white-space: normal;\\r\\n }\\r\\n\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".requester-groups-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".requester-group-users-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".role-templates-list {\\r\\n\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".role-template-roles-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".fastpath-user-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n }\\r\\n\\r\\n .list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n }\\r\\n}\\r\\n\",\".roles {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #e7e7e7;\\r\\n }\\r\\n\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 503px;\\r\\n }\\r\\n /* Desktops and laptops ----------- */\\r\\n @media only screen and (max-width : 1223px) {\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 303px;\\r\\n }\\r\\n }\\r\\n\\r\\n @media only screen and (min-width : 1224px) {\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 303px;\\r\\n }\\r\\n }\\r\\n /* Large screens ----------- */\\r\\n @media only screen and (min-width : 1824px) {\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 453px;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".users {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #e7e7e7;\\r\\n }\\r\\n}\\r\\n\",\".security-assignment {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 503px;\\r\\n }\\r\\n /* Desktops and laptops ----------- */\\r\\n @media only screen and (max-width : 1223px) {\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 303px;\\r\\n }\\r\\n }\\r\\n\\r\\n @media only screen and (min-width : 1224px) {\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 303px;\\r\\n }\\r\\n }\\r\\n /* Large screens ----------- */\\r\\n @media only screen and (min-width : 1824px) {\\r\\n .k-grid.k-widget .k-grid-content {\\r\\n max-height: 453px;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".identity-manager-request-details-view {\\r\\n\\r\\n .request-view {\\r\\n padding: 0px 10px;\\r\\n\\r\\n h3 {\\r\\n font-size: 11px;\\r\\n text-transform: uppercase;\\r\\n font-weight: 700;\\r\\n margin-top: 0px;\\r\\n }\\r\\n\\r\\n p {\\r\\n font-size: 13px;\\r\\n }\\r\\n\\r\\n .request-expiration {\\r\\n color: $red;\\r\\n font-weight: 700;\\r\\n }\\r\\n }\\r\\n\\r\\n .request-details-headers {\\r\\n background-color: white;\\r\\n\\r\\n h4 {\\r\\n font-size: 22.5px;\\r\\n font-weight: 600;\\r\\n }\\r\\n }\\r\\n\\r\\n .request-details-content {\\r\\n padding: 15px;\\r\\n background: white;\\r\\n border-top: 1px solid $border-color;\\r\\n border-bottom: 1px solid $border-color;\\r\\n }\\r\\n\\r\\n .rd-header-tabs {\\r\\n border: none;\\r\\n padding: 5px;\\r\\n }\\r\\n\\r\\n .rd-container {\\r\\n border: none;\\r\\n }\\r\\n\\r\\n .rd-notes {\\r\\n\\r\\n list-item {\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 4px;\\r\\n padding: 10px;\\r\\n background-color: white;\\r\\n }\\r\\n }\\r\\n\\r\\n .list-item {\\r\\n padding: 15px;\\r\\n }\\r\\n\\r\\n .table {\\r\\n margin-bottom: 0px;\\r\\n }\\r\\n\\r\\n .btn-approve-selected {\\r\\n background: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n font-weight: 700;\\r\\n border-radius: 4px;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n padding: 5px 10px;\\r\\n\\r\\n &:hover {\\r\\n background: $fp-label-green-text;\\r\\n color: $fp-label-green-bg;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background: $fp-label-green-text;\\r\\n color: $fp-label-green-bg;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n }\\r\\n }\\r\\n\\r\\n .btn-delegate-selected {\\r\\n background: $fp-label-blue-bg;\\r\\n color: $fp-label-blue-text;\\r\\n font-weight: 700;\\r\\n padding: 5px 10px;\\r\\n border-radius: 4px;\\r\\n border: 1px solid $fp-label-blue-border;\\r\\n\\r\\n &:hover {\\r\\n background: $fp-label-blue-text;\\r\\n color: $fp-label-blue-bg;\\r\\n border: 1px solid $fp-label-blue-border;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background: $fp-label-blue-text;\\r\\n color: $fp-label-blue-bg;\\r\\n border: 1px solid $fp-label-blue-border;\\r\\n }\\r\\n }\\r\\n\\r\\n .btn-deny-selected {\\r\\n background: $fp-label-red-bg;\\r\\n color: $fp-label-red-text;\\r\\n font-weight: 700;\\r\\n padding: 5px 10px;\\r\\n border-radius: 4px;\\r\\n border: 1px solid $fp-label-red-border;\\r\\n\\r\\n &:hover {\\r\\n background: $fp-label-red-text;\\r\\n color: $fp-label-red-bg;\\r\\n border: 1px solid $fp-label-red-border;\\r\\n }\\r\\n\\r\\n &:focus {\\r\\n background: $fp-label-red-text;\\r\\n color: $fp-label-red-bg;\\r\\n border: 1px solid $fp-label-red-border;\\r\\n }\\r\\n }\\r\\n\\r\\n .table-striped {\\r\\n tbody {\\r\\n tr.req-access-approve:nth-of-type(odd), tr.req-access-approve:nth-of-type(even) {\\r\\n background: $fp-label-green-bg;\\r\\n\\r\\n td:nth-child(2) {\\r\\n color: $fp-label-green-text;\\r\\n }\\r\\n }\\r\\n\\r\\n tr.req-access-deny:nth-of-type(odd), tr.req-access-deny:nth-of-type(even) {\\r\\n background: $fp-label-red-bg;\\r\\n\\r\\n td:nth-child(2) {\\r\\n color: $fp-label-red-text;\\r\\n }\\r\\n }\\r\\n\\r\\n tr.req-access-delegated:nth-of-type(odd), tr.req-access-delegated:nth-of-type(even) {\\r\\n background: $fp-label-blue-bg;\\r\\n\\r\\n td:nth-child(2) {\\r\\n color: $fp-label-blue-text;\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n .associated-items-table {\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 5px;\\r\\n width: 100%;\\r\\n height: auto;\\r\\n overflow-y: scroll;\\r\\n max-height: 135px;\\r\\n margin-bottom: 5px;\\r\\n }\\r\\n\\r\\n .label {\\r\\n display: inline-block;\\r\\n }\\r\\n\\r\\n .label-info {\\r\\n background-color: $fp-label-gray-bg;\\r\\n color: $fp-label-gray-text;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n }\\r\\n\\r\\n .label-warning {\\r\\n background-color: $fp-label-orange-bg;\\r\\n color: $fp-label-orange-text;\\r\\n border: 1px solid $fp-label-orange-border;\\r\\n }\\r\\n\\r\\n .label-danger {\\r\\n background-color: $fp-label-red-bg;\\r\\n color: $fp-label-red-text;\\r\\n border: 1px solid $fp-label-red-border;\\r\\n }\\r\\n\\r\\n .label-success {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n }\\r\\n\\r\\n .text-success {\\r\\n color: $fp-label-green-text;\\r\\n }\\r\\n\\r\\n .text-warning {\\r\\n color: $yellow;\\r\\n }\\r\\n\\r\\n .text-danger {\\r\\n color: $fp-label-red-text;\\r\\n }\\r\\n\\r\\n .pill-radio {\\r\\n background: white;\\r\\n color: $text-color;\\r\\n padding: 2px 12px;\\r\\n margin-right: 4px;\\r\\n font-size: 11px;\\r\\n border-radius: 4px;\\r\\n cursor: pointer;\\r\\n display: inline-block;\\r\\n }\\r\\n\\r\\n .pill-radio:hover {\\r\\n background: darken(white, 4%);\\r\\n color: $text-color;\\r\\n font-weight: 800;\\r\\n }\\r\\n\\r\\n .pill-radio.active {\\r\\n background: $fp-purple;\\r\\n color: $delinea-green;\\r\\n font-weight: 800;\\r\\n }\\r\\n\\r\\n .vAccordion--default v-pane-content {\\r\\n div {\\r\\n padding-bottom: 0;\\r\\n }\\r\\n }\\r\\n\\r\\n .vAccordion--default v-pane.is-expanded {\\r\\n v-pane-header {\\r\\n color: $fp-purple;\\r\\n border-color: #C2C4CC;\\r\\n }\\r\\n }\\r\\n\\r\\n .custom-vPane-header {\\r\\n border: 0;\\r\\n padding-left: 40px;\\r\\n\\r\\n h4 {\\r\\n margin-bottom: 0;\\r\\n color: $text-color;\\r\\n }\\r\\n }\\r\\n\\r\\n .custom-vPane-header:hover {\\r\\n color: $fp-purple;\\r\\n }\\r\\n\\r\\n .custom-vPane-header:focus {\\r\\n color: $fp-purple;\\r\\n }\\r\\n\\r\\n .vAccordion--default v-pane.is-expanded {\\r\\n .custom-vPane-header {\\r\\n color: $fp-purple;\\r\\n }\\r\\n }\\r\\n\\r\\n .icons8-new-window {\\r\\n cursor: pointer;\\r\\n font-size: 20px;\\r\\n color: $text-color;\\r\\n }\\r\\n}\\r\\n\",\".configuration {\\r\\n .company-logo {\\r\\n max-width: 150px;\\r\\n height:auto;\\r\\n }\\r\\n table {\\r\\n margin-bottom: 0px;\\r\\n }\\r\\n}\\r\\n\",\".ownership-group-assignments {\\r\\n div[list-view] {\\r\\n height: 300px;\\r\\n overflow: auto;\\r\\n }\\r\\n}\",\".maintain-templates-list {\\r\\n .list-item {\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n .list-item-row-button {\\r\\n position: relative;\\r\\n border-left: 1px solid #e7e7e7;\\r\\n }\\r\\n}\\r\\n\",\".maintain-system-roles {\\r\\n\\r\\n .pill-radio {\\r\\n padding: 3px 8px;\\r\\n margin-right: 5px;\\r\\n background: #8EA7B8;\\r\\n color: #FFF;\\r\\n font-weight: 700;\\r\\n\\r\\n &:hover {\\r\\n background: #5A90BF;\\r\\n color: #FFF;\\r\\n font-weight: 700;\\r\\n }\\r\\n\\r\\n &:active {\\r\\n background: #5A90BF;\\r\\n color: #FFF;\\r\\n font-weight: 700;\\r\\n }\\r\\n }\\r\\n\\r\\n .pill-radio.active {\\r\\n background: #5A90BF;\\r\\n color: #FFF;\\r\\n font-weight: 700;\\r\\n }\\r\\n\\r\\n .badge {\\r\\n font-size: 11px;\\r\\n }\\r\\n\\r\\n .maintain-system-roles {\\r\\n .active-card {\\r\\n background-color: #291972;\\r\\n color: white;\\r\\n }\\r\\n }\\r\\n\\r\\n .maintain-system-roles-modal {\\r\\n .k-grid-content {\\r\\n min-height: 290px;\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\".system-user-mappings-scrollable {\\r\\n max-height: 470px;\\r\\n overflow-y: scroll;\\r\\n}\\r\\n\\r\\n.bottom-border {\\r\\n border-bottom: 1px solid #C2C4CC;\\r\\n}\\r\\n\",\"/*CUSTOM EDITS FOR FASTPATH HERE*/\\r\\n\\r\\n* {\\r\\n scrollbar-width: thin;\\r\\n scrollbar-color: #aaa #e7e7e7;\\r\\n}\\r\\n\\r\\n::-webkit-scrollbar {\\r\\n height: 12px;\\r\\n width: 12px;\\r\\n border: 1px solid #aaa;\\r\\n}\\r\\n\\r\\n::-webkit-scrollbar-track {\\r\\n background: #e7e7e7;\\r\\n}\\r\\n\\r\\n::-webkit-scrollbar-thumb {\\r\\n background-color: #aaa;\\r\\n border-radius: 20px;\\r\\n border: 3px solid #e7e7e7;\\r\\n}\\r\\n\\r\\n.k-grouping-row td, .k-group-footer td, .k-grid-footer td {\\r\\n color: #291972;\\r\\n}\\r\\n\\r\\n.k-popup.k-list-container {\\r\\n width: 450px !important;\\r\\n}\\r\\n\\r\\n.k-i-loading {\\r\\n background-image: url('../Content/Images/SVG/16Spinner.svg');\\r\\n}\\r\\n\\r\\n.k-i-loading.k-hidden {\\r\\n /* hide loading icon in kendo UI widgets */\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.k-loading-image {\\r\\n background-image: url('plugins/kendo/Bootstrap/loading-image-spinner.gif');\\r\\n background-position: top;\\r\\n background-position-y: 35%;\\r\\n background-color: #3333330f;\\r\\n}\\r\\n\\r\\n.k-grid tr td {\\r\\n border-color: #C2C4CC;\\r\\n}\\r\\n\\r\\n.k-grid tr td {\\r\\n border-width: 0 0 0 0;\\r\\n}\\r\\n\\r\\n.k-gantt-toolbar .k-state-default, .k-grid .k-grouping-header, .k-grid-header, .k-grid-header-wrap, .k-grouping-header .k-group-indicator, .k-header, .k-pager-wrap, .k-pager-wrap .k-link, .k-pager-wrap .k-textbox {\\r\\n border-color: #C2C4CC;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.k-grid input.k-checkbox + label.k-checkbox-label {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.k-grid-header th.k-header {\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.k-autocomplete, .k-block, .k-button-group .k-tool, .k-calendar th, .k-colorpicker .k-i-arrow-s, .k-content, .k-dropdown-wrap, .k-dropzone-active, .k-editable-area, .k-filter-row > th, .k-footer-template td, .k-grid td, .k-grid td.k-state-selected, .k-grid-content-locked, .k-grid-footer, .k-grid-footer-locked, .k-grid-footer-wrap, .k-grid-header, .k-grid-header-locked, .k-grid-header-wrap, .k-group, .k-group-footer td, .k-grouping-header, .k-grouping-header .k-group-indicator, .k-header, .k-input, .k-pager-refresh, .k-pager-wrap, .k-pager-wrap .k-link, .k-panel > .k-item > .k-link, .k-panelbar .k-content, .k-panelbar .k-panel, .k-panelbar > .k-item > .k-link, .k-separator, .k-slider-track, .k-splitbar, .k-state-default, .k-state-default .k-select, .k-state-disabled, .k-textbox, .k-textbox > input, .k-tiles, .k-toolbar, .k-tooltip, .k-treemap-tile, .k-upload-files, .k-widget {\\r\\n border-color: #C2C4CC;\\r\\n}\\r\\n\\r\\n.k-button.k-state-hover, .k-button:hover {\\r\\n color: #333;\\r\\n border-color: #cecece;\\r\\n background-color: #ebebeb;\\r\\n}\\r\\n\\r\\n.k-button {\\r\\n color: #333;\\r\\n border-color: #dbdbdb;\\r\\n background-color: #fff;\\r\\n}\\r\\n\\r\\n.k-autocomplete.k-state-default, .k-dropdown-wrap.k-state-default, .k-multiselect.k-header, .k-numeric-wrap.k-state-default, .k-picker-wrap.k-state-default {\\r\\n border-color: #dbdbdb;\\r\\n}\\r\\n\\r\\n.criteria-container .k-dropdown > .k-dropdown-wrap {\\r\\n padding: 5px 0px;\\r\\n}\\r\\n\\r\\n.criteria-container .k-dropdown > .k-dropdown-wrap > .k-select {\\r\\n padding-top: 3px;\\r\\n}\\r\\n\\r\\n.k-dropdown-wrap.k-state-hover {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.k-grid tbody tr:last-child td {\\r\\n border-bottom: 1px solid #f5f5f5;\\r\\n}\\r\\n\\r\\n.cross-platform-users .k-grid tbody tr {\\r\\n height: 50px\\r\\n}\\r\\n\\r\\n.btn.disabled, .btn[disabled], fieldset[disabled] .btn {\\r\\n opacity: 85%;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.inline-block {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.vr {\\r\\n border-left: 1px solid #eeeeee;\\r\\n margin: 0 8px;\\r\\n height: 18px;\\r\\n}\\r\\n\\r\\n.vr-ra {\\r\\n border-left: 1px solid #d3d3d3;\\r\\n margin: 0 8px;\\r\\n height: 18px;\\r\\n}\\r\\n\\r\\n.selected-tenant-in-dropdown {\\r\\n background-color: #e2e7e9;\\r\\n border-radius: 4px;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.set-min-col-width .k-grid col {\\r\\n width: 150px;\\r\\n}\\r\\n\\r\\n.sweet-alert-pre-wrap {\\r\\n white-space: pre-wrap;\\r\\n}\\r\\n\\r\\nbody.mini-navbar .nav-header {\\r\\n padding: 0;\\r\\n background-color: $delinea-purple;\\r\\n}\\r\\n\\r\\n.places-dropdown-shell {\\r\\n padding-bottom: 10px;\\r\\n}\\r\\n\\r\\n.places-dropdown-shell .form-inline .input-group {\\r\\n display: table;\\r\\n}\\r\\n\\r\\n.nav-header {\\r\\n background-color: $delinea-purple\\r\\n /*background-image: url('patterns/header-profile-black.png');*/\\r\\n}\\r\\n\\r\\n.semi-transparent-nav-icon {\\r\\n opacity: 0.32;\\r\\n}\\r\\n\\r\\n.center-grid-icon {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.search-icon {\\r\\n width: 12px;\\r\\n margin-bottom: 8px;\\r\\n margin-left: 4px;\\r\\n}\\r\\n\\r\\n.ad-user-link-text {\\r\\n vertical-align: bottom;\\r\\n}\\r\\n\\r\\n.grid-trash-icon {\\r\\n font-size: 1.2em;\\r\\n color: red;\\r\\n display: inline-flex;\\r\\n}\\r\\n\\r\\n.trash-icon-sd {\\r\\n font-size: 1.3em;\\r\\n display: inline-flex;\\r\\n margin: 0 6px 0px 0;\\r\\n}\\r\\n\\r\\n.sd-table-fields-pill-padding {\\r\\n padding: 3px 8px;\\r\\n}\\r\\n\\r\\n.plus-icon-trm {\\r\\n font-size: 1.8em;\\r\\n display: inline-flex;\\r\\n}\\r\\n\\r\\n.floating-left-icon {\\r\\n width: 42px;\\r\\n float: left;\\r\\n height: 100%;\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.float-icon8-left {\\r\\n width: 42px;\\r\\n float: left;\\r\\n margin-top: -4px;\\r\\n}\\r\\n\\r\\n.k-filter-row label>input[type=radio] {\\r\\n accent-color: $fp-purple;\\r\\n}\\r\\n\\r\\ninput[type=radio] {\\r\\n accent-color: $fp-purple;\\r\\n}\\r\\n\\r\\n.input-sm {\\r\\n font-size: 11px;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\ninput[type=checkbox] {\\r\\n accent-color: $fp-purple;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.label-pill {\\r\\n padding-right: .6em;\\r\\n padding-left: .6em;\\r\\n border-radius: 10rem;\\r\\n}\\r\\n\\r\\n.elastic-builder {\\r\\n\\r\\n .btn-primary {\\r\\n background-color: $fp-purple;\\r\\n border-color: $fp-purple;\\r\\n color: white;\\r\\n\\r\\n &:hover, .active, &:active, .open > .dropdown-toggle.btn-primary {\\r\\n background-color: $delinea-purple;\\r\\n }\\r\\n\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\n.btn-primary {\\r\\n background-color: $fp-yellow;\\r\\n border-color: $fp-yellow;\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.btn-primary.active, .btn-primary:active, .open > .dropdown-toggle.btn-primary {\\r\\n background-color: $delinea-purple;\\r\\n}\\r\\n\\r\\n.searchBoxIcon {\\r\\n color: #2791D9;\\r\\n padding-right: 8px;\\r\\n padding-left: 4px;\\r\\n}\\r\\n\\r\\n.risk-details-for-mitigate-modal {\\r\\n background-color: #f4f4f4;\\r\\n padding: 16px 24px;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.table-max-height-250 {\\r\\n max-height: 250px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.dropdown-max-height {\\r\\n max-height: 650px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n#dropdown-prevent-default {\\r\\n left: 0;\\r\\n right: auto;\\r\\n}\\r\\n\\r\\n/*Style Navigation Items*/\\r\\n.NavigationIcon {\\r\\n height: 20px;\\r\\n width: 20px;\\r\\n display: inline-block;\\r\\n background-size: 20px 20px;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n margin-bottom: 2px;\\r\\n}\\r\\n\\r\\n.NavigationIcon_review_assignments {\\r\\n height: 45px;\\r\\n width: 45px;\\r\\n display: inline-block;\\r\\n background-size: 45px 45px;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.CustomIcon10 {\\r\\n height: 10px;\\r\\n width: 10px;\\r\\n display: inline-block;\\r\\n background-size: 10px 10px;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n margin-right: 3px;\\r\\n margin-bottom: 2px;\\r\\n}\\r\\n\\r\\n.custom-icon-for-h4 {\\r\\n height: 18px;\\r\\n width: 18px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.custom-circle-icon {\\r\\n height: 12px;\\r\\n width: 12px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.custom-icon-30 {\\r\\n height: 30px;\\r\\n width: 30px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.custom-icon-20 {\\r\\n height: 20px;\\r\\n width: 20px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.height-width-80 {\\r\\n height: 80px;\\r\\n width: 80px;\\r\\n background-size: contain;\\r\\n}\\r\\n\\r\\n.custom-icon-for-inline-text {\\r\\n height: 12px;\\r\\n width: 12px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n padding-bottom: 14px;\\r\\n}\\r\\n\\r\\n.delinea-plus {\\r\\n background-image: url('../Content/Images/SVG/SecurityDesignerCircleOnlyIcon.svg');\\r\\n}\\r\\n\\r\\n.custom-icon-for-p {\\r\\n height: 15px;\\r\\n width: 15px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n padding-bottom: 16px;\\r\\n}\\r\\n\\r\\n.noSecurityModelsLogo {\\r\\n height: 150px;\\r\\n width: 150px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.SecurityDesignerCircleOnly {\\r\\n background-image: url('../Content/Images/SVG/SecurityDesignerCircleOnlyIcon.svg');\\r\\n}\\r\\n\\r\\n.wrap-security-model-name {\\r\\n overflow-wrap: break-word\\r\\n}\\r\\n\\r\\n.padding-left-10 {\\r\\n padding-left: 10px;\\r\\n}\\r\\n\\r\\n.label-dimgrey {\\r\\n background: $fp-label-gray-bg;\\r\\n color: $fp-label-gray-text;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n}\\r\\n\\r\\n.label-darkgray {\\r\\n background: #0a0a0a;\\r\\n color: #47535f;\\r\\n}\\r\\n\\r\\n.error-req {\\r\\n color: $red;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.count-info .badge {\\r\\n line-height: 12px;\\r\\n padding: 2px 5px;\\r\\n position: absolute;\\r\\n right: 6px;\\r\\n top: 12px;\\r\\n}\\r\\n\\r\\n.icons8-risk-analysis-results {\\r\\n background-image: url('../Content/Images/SVG/SecurityDesignerRiskAnalysisResults.svg');\\r\\n}\\r\\n\\r\\n.icons8-submit-progress {\\r\\n background-image: url('../Content/Images/SVG/icons8-Submit Progress.svg');\\r\\n}\\r\\n\\r\\n.defaultMitigationIcon {\\r\\n background-image: url('../Content/Images/SVG/DefaultMit.svg');\\r\\n}\\r\\n\\r\\n.Integrations {\\r\\n background-image: url('../Content/Images/SVG/ConnectionsWhite.svg');\\r\\n}\\r\\n\\r\\n.IntegrationsPurple {\\r\\n background-image: url('../Content/Images/SVG/ConnectionsPurple.svg');\\r\\n}\\r\\n\\r\\n.ChangeTracking {\\r\\n background-image: url('../Content/Images/SVG/Change ThemeWhite.svg');\\r\\n}\\r\\n\\r\\n.ChangeTrackingPurple {\\r\\n background-image: url('../Content/Images/SVG/Change ThemePurple.svg');\\r\\n}\\r\\n\\r\\n.AccessControl {\\r\\n background-image: url('../Content/Images/SVG/AccessRiskMonitorWhite.svg');\\r\\n}\\r\\n\\r\\n.AccessControlPurple {\\r\\n background-image: url('../Content/Images/SVG/AccessRiskMonitorPurple.svg');\\r\\n}\\r\\n\\r\\n.AccessCertifications {\\r\\n background-image: url('../Content/Images/SVG/certificationsWhite.svg');\\r\\n}\\r\\n\\r\\n.AccessCertificationsPurple {\\r\\n background-image: url('../Content/Images/SVG/certificationsPurple.svg');\\r\\n}\\r\\n\\r\\n.Setup {\\r\\n background-image: url('../Content/Images/SVG/SettingsWhite.svg');\\r\\n}\\r\\n\\r\\n.SetupPurple {\\r\\n background-image: url('../Content/Images/SVG/SettingsPurple.svg');\\r\\n}\\r\\n\\r\\n.SecuritySetup {\\r\\n background-image: url('../Content/Images/SVG/SecuritySetupWhite.svg');\\r\\n}\\r\\n\\r\\n.SecuritySetupPurple {\\r\\n background-image: url('../Content/Images/SVG/SecuritySetupPurple.svg');\\r\\n}\\r\\n\\r\\n.SystemConfiguration {\\r\\n background-image: url('../Content/Images/SVG/SettingsWhite.svg');\\r\\n}\\r\\n\\r\\n.SystemConfigurationPurple {\\r\\n background-image: url('../Content/Images/SVG/SettingsPurple.svg');\\r\\n}\\r\\n\\r\\n.ReportManagement {\\r\\n background-image: url('../Content/Images/SVG/CalendarWhite.svg');\\r\\n}\\r\\n\\r\\n.ReportManagementPurple {\\r\\n background-image: url('../Content/Images/SVG/CalendarPurple.svg');\\r\\n}\\r\\n\\r\\n.DataTransfer {\\r\\n background-image: url('../Content/Images/SVG/DataTransferPurple.svg');\\r\\n}\\r\\n\\r\\n.SecurityDesigner {\\r\\n background-image: url('../Content/Images/SVG/SecurityDesignerIconWhite.svg');\\r\\n}\\r\\n\\r\\n.SecurityDesignerPurple {\\r\\n background-image: url('../Content/Images/SVG/SecurityDesignerIconPurple.svg');\\r\\n}\\r\\n\\r\\n.IdentityManager {\\r\\n background-image: url('../Content/Images/SVG/Electronic Identity CardWhite.svg');\\r\\n}\\r\\n\\r\\n.IdentityManagerPurple {\\r\\n background-image: url('../Content/Images/SVG/Electronic Identity CardPurple.svg');\\r\\n}\\r\\n\\r\\n.TransactionMonitoring {\\r\\n background-image: url('../Content/Images/SVG/icons8-surveyWhite.svg');\\r\\n}\\r\\n\\r\\n.TransactionMonitoringPurple {\\r\\n background-image: url('../Content/Images/SVG/icons8-surveyPurple.svg');\\r\\n}\\r\\n\\r\\n.x-circle-12 {\\r\\n background-image: url('../Content/Images/SVG/x-circle-12.svg');\\r\\n height: 15px;\\r\\n width: 15px;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n vertical-align: middle;\\r\\n padding-bottom: 20px;\\r\\n margin-left: 4px;\\r\\n}\\r\\n\\r\\n.uploadIcon {\\r\\n background-image: url('../Content/Images/SVG/UploadPurple.svg');\\r\\n}\\r\\n\\r\\n.dataBasePurge {\\r\\n background-image: url('../Content/Images/SVG/PurgeDataChanges.svg');\\r\\n}\\r\\n\\r\\n.dataBaseCollect {\\r\\n background-image: url('../Content/Images/SVG/CollectDataChanges.svg');\\r\\n}\\r\\n\\r\\n.dataBaseArchive {\\r\\n background-image: url('../Content/Images/SVG/ArchiveDataCanges.svg');\\r\\n}\\r\\n\\r\\n.dataBaseRestore {\\r\\n background-image: url('../Content/Images/SVG/RestoreDataChanges.svg');\\r\\n}\\r\\n\\r\\n.snapshotCollect {\\r\\n background-image: url('../Content/Images/SVG/CollectSnapshot.svg');\\r\\n}\\r\\n\\r\\n.menu-item-shield {\\r\\n background-image: url('../Content/Images/SVG/Application Shield.svg');\\r\\n}\\r\\n\\r\\n.xml-box-icon {\\r\\n background-image: url('../Content/Images/SVG/XML.svg');\\r\\n}\\r\\n\\r\\n.information {\\r\\n background-image: url('../Content/Images/SVG/securityDesigner/icons8-info.svg');\\r\\n}\\r\\n\\r\\n.information-fade {\\r\\n background-image: url('../Content/Images/SVG/securityDesigner/icons8-info-fade.svg');\\r\\n}\\r\\n\\r\\n.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.navbar-default {\\r\\n font-weight: normal;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.k-grid, .k-scheduler, .k-menu, .k-editor {\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.k-block, .k-button, .k-textbox, .k-drag-clue, .k-touch-scrollbar, .k-window, .k-window-titleless .k-window-content, .k-window-action, .k-inline-block, .k-grid .k-filter-options, .k-grouping-header .k-group-indicator, .k-autocomplete, .k-multiselect, .k-combobox, .k-dropdown, .k-dropdown-wrap, .k-datepicker, .k-timepicker, .k-colorpicker, .k-datetimepicker, .k-notification, .k-numerictextbox, .k-picker-wrap, .k-numeric-wrap, .k-colorpicker, .k-list-container, .k-calendar-container, .k-calendar td, .k-calendar .k-link, .k-treeview .k-in, .k-editor-inline, .k-tooltip, .k-tile, .k-slider-track, .k-slider-selection, .k-upload, .k-split-button {\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.list-group-item {\\r\\n border: 0px;\\r\\n}\\r\\n\\r\\n.k-widget.k-tooltip-validation {\\r\\n border-color: #FFDEAB;\\r\\n background-color: #FFDEAB;\\r\\n color: #2D2D2D;\\r\\n}\\r\\n\\r\\n.glyphicon-star-favorite:before {\\r\\n content: \\\"\\\\e006\\\";\\r\\n font-size: 18px;\\r\\n color: $fp-yellow;\\r\\n}\\r\\n\\r\\n.glyphicon-star-favorite-empty:before {\\r\\n content: \\\"\\\\e006\\\";\\r\\n font-size: 18px;\\r\\n color: $fp-dark-gray;\\r\\n}\\r\\n\\r\\n.navigationPlaceMarker {\\r\\n color: #2791D9;\\r\\n}\\r\\n\\r\\n.hr-line-dashed-thin {\\r\\n border-top: 1px dashed #C2C4CC;\\r\\n color: #ffffff;\\r\\n background-color: #ffffff;\\r\\n height: 1px;\\r\\n margin: 14px 0;\\r\\n}\\r\\n\\r\\n.params-box-minimize {\\r\\n position: absolute;\\r\\n bottom: 0px;\\r\\n color: #434343;\\r\\n padding-top: 2px;\\r\\n padding-bottom: 2px;\\r\\n padding-left: 8px;\\r\\n padding-right: 8px;\\r\\n border-top-right-radius: 5px;\\r\\n border-top-left-radius: 5px;\\r\\n font-size: 11px;\\r\\n width: 150px;\\r\\n}\\r\\n\\r\\n.params-box-minimize:hover, .params-box-minimize:focus {\\r\\n background-color: #d1dadd;\\r\\n color: #646a6c;\\r\\n}\\r\\n\\r\\n.marginBottom {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.marginTopRequestManagement {\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n.marginBottomTen {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.whiteText {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.whiteHelpIcon {\\r\\n color: $fp-dark-gray;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.blue-report-header {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.import-progress-bar {\\r\\n background: #ffbd55;\\r\\n}\\r\\n\\r\\n.progress-bar-bad-data {\\r\\n background-color: #cbcbcb;\\r\\n color: #595959;\\r\\n}\\r\\n\\r\\n.navbar-fixed-top, .navbar-static-top {\\r\\n background: #FFFFFF;\\r\\n}\\r\\n\\r\\n.headerPaddingTwenty {\\r\\n padding-left: 20px;\\r\\n}\\r\\n\\r\\n.headerPaddingThirty {\\r\\n padding-left: 28px;\\r\\n}\\r\\n\\r\\n\\r\\n.reportParametersBox {\\r\\n padding-top: 20px;\\r\\n padding-bottom: 25px;\\r\\n padding-right: 30px;\\r\\n padding-left: 30px;\\r\\n background: white;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.ibox {\\r\\n box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.12);\\r\\n}\\r\\n\\r\\n.panel-body {\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.darkBlueButtonHeader {\\r\\n background-color: #1b527e;\\r\\n border-color: #1b527e;\\r\\n border: 1px solid #1b527e;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.darkBlueButtonHeader:hover, .darkBlueButtonHeader:focus, .darkBlueButtonHeader:active, .darkBlueButtonHeader.active, .open .dropdown-toggle.darkBlueButtonHeader {\\r\\n background-color: #163450;\\r\\n border-color: #163450;\\r\\n border: 1px solid #163450;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.k-state-selected a, .k-state-selected:link a {\\r\\n color: white;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.btn {\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n.filter-dropdown-width {\\r\\n width: 220px;\\r\\n}\\r\\n\\r\\ntextarea {\\r\\n resize: none;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.form-control, .single-line {\\r\\n border: 1px solid $border-color;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.alert {\\r\\n margin-bottom: 2px;\\r\\n border-radius: 4px;\\r\\n border: none;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.alert-info {\\r\\n color: $fp-label-yellow-text;\\r\\n background-color: $fp-label-yellow-bg;\\r\\n border-left: 4px solid $fp-label-yellow-border;\\r\\n}\\r\\n\\r\\n.alert-warning {\\r\\n background-color: $fp-label-orange-bg;\\r\\n color: $fp-label-orange-text;\\r\\n border-left: 4px solid $fp-label-orange-border;\\r\\n}\\r\\n\\r\\n.alert-danger {\\r\\n background-color: $fp-label-red-bg;\\r\\n color: $fp-label-red-text;\\r\\n border-left: 4px solid $fp-label-red-border;\\r\\n}\\r\\n\\r\\n.alert-success {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border-left: 4px solid $fp-label-green-border;\\r\\n}\\r\\n\\r\\n.btn-blue {\\r\\n border: 2px solid $fp-yellow;\\r\\n color: white;\\r\\n font-size: 13px;\\r\\n font-weight: 600;\\r\\n display: inline-block;\\r\\n padding: 5px 10px;\\r\\n border-radius: 4px;\\r\\n background: $fp-yellow;\\r\\n}\\r\\n\\r\\n.btn-blue:focus {\\r\\n background-color: #261769;\\r\\n border-color: #261769;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n\\r\\n.btn-blue:hover {\\r\\n background-color: #261769;\\r\\n border-color: #261769;\\r\\n color: $delinea-green;\\r\\n}\\r\\n\\r\\n.btn-red {\\r\\n color: RGBA(231,76,60,1);\\r\\n border: 2px solid RGBA(231,76,60,1);\\r\\n font-size: 13px;\\r\\n font-weight: 600;\\r\\n display: inline-block;\\r\\n padding: 5px 10px;\\r\\n border-radius: 15px;\\r\\n background: white;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.btn-red:hover {\\r\\n background: RGBA(231,76,60,0.15);\\r\\n color: RGBA(231,76,60,1);\\r\\n}\\r\\n\\r\\n.btn-green {\\r\\n color: RGBA(123, 197, 123, 1);\\r\\n border: 2px solid RGBA(123, 197, 123, 1);\\r\\n font-size: 13px;\\r\\n font-weight: 600;\\r\\n display: inline-block;\\r\\n padding: 5px 10px;\\r\\n border-radius: 15px;\\r\\n background: white;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.btn-green:hover {\\r\\n background: RGBA(123, 197, 123, 0.15);\\r\\n color: RGBA(123, 197, 123, 1);\\r\\n}\\r\\n\\r\\n.btn-orange {\\r\\n color: RGBA(249, 182, 105, 1);\\r\\n border: 2px solid RGBA(249, 182, 105, 1);\\r\\n font-size: 13px;\\r\\n font-weight: 600;\\r\\n display: inline-block;\\r\\n padding: 5px 10px;\\r\\n border-radius: 15px;\\r\\n background: white;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.btn-orange:hover {\\r\\n background: RGBA(249, 182, 105, 0.10);\\r\\n color: RGBA(249, 182, 105, 1);\\r\\n}\\r\\n\\r\\n.btn-light {\\r\\n color: #707070;\\r\\n border: 1px solid #C2C3C4;\\r\\n font-size: 13px;\\r\\n font-weight: 600;\\r\\n display: inline-block;\\r\\n padding: 5px 10px;\\r\\n border-radius: 5px;\\r\\n background: white;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.btn-light:hover {\\r\\n background: #F4F4F4;\\r\\n}\\r\\n\\r\\n.btn-modalClose {\\r\\n color: #4b4f66;\\r\\n border: none;\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.btn-modalClose:hover {\\r\\n color: $red;\\r\\n}\\r\\n\\r\\n.btn-modalClose i {\\r\\n font-size: 1.3333333333em;\\r\\n}\\r\\n\\r\\n.gridToolbarWrapper {\\r\\n border: 1px solid #dbdbdb;\\r\\n}\\r\\n\\r\\n.customToolbar {\\r\\n padding: 4px;\\r\\n border-bottom: 1px solid #dbdbdb;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.hr-line-dashed-extra-padding {\\r\\n border-top: 1px dashed #C2C4CC;\\r\\n color: #ffffff;\\r\\n background-color: #ffffff;\\r\\n height: 1px;\\r\\n margin: 30px 0;\\r\\n}\\r\\n\\r\\n#custom-bootstrap-menu.navbar-default {\\r\\n font-size: 12px;\\r\\n background-color: #E2E7E9;\\r\\n}\\r\\n\\r\\n#custom-bootstrap-menu.navbar-default .nav > li {\\r\\n padding-right: 4px;\\r\\n}\\r\\n\\r\\n.nav > li.activeNoBorder {\\r\\n background-color: #242633;\\r\\n border-left: none;\\r\\n}\\r\\n\\r\\n.gridToolbarWrapper .k-grid {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.navbar-form-custom .form-group {\\r\\n margin-bottom: 14px;\\r\\n margin-top: 13px;\\r\\n}\\r\\n\\r\\n.navbar-form-custom .form-control {\\r\\n height: 31px;\\r\\n}\\r\\n\\r\\n.navbar .form-control:focus {\\r\\n background: #FFFFFF;\\r\\n}\\r\\n\\r\\n.progress-strip {\\r\\n height: 20px;\\r\\n background-color: #07061D;\\r\\n}\\r\\n\\r\\n.params-submit-button {\\r\\n position: absolute;\\r\\n right: 30px;\\r\\n bottom: 12px;\\r\\n}\\r\\n\\r\\n.navbar .dropdown-menu {\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n/*.label {\\r\\n text-align: left;\\r\\n max-width: 400px;\\r\\n white-space: normal;\\r\\n}*/\\r\\n\\r\\n.list-group.clear-list .list-group-item {\\r\\n padding-right: 10px;\\r\\n}\\r\\n\\r\\n.k-grid-content {\\r\\n max-height: 540px;\\r\\n}\\r\\n\\r\\n.big-icon {\\r\\n font-size: 110px !important;\\r\\n}\\r\\n\\r\\n.big-icon-50 {\\r\\n font-size: 50px !important;\\r\\n}\\r\\n\\r\\n.new-wizard-icon:hover {\\r\\n color: #595d72;\\r\\n}\\r\\n\\r\\n.modify-wizard-icon:hover {\\r\\n color: #595d72;\\r\\n}\\r\\n\\r\\n.terminate-wizard-icon:hover {\\r\\n color: #595d72;\\r\\n}\\r\\n\\r\\n.passwordRequirementMet {\\r\\n color: #5CB85C;\\r\\n}\\r\\n\\r\\n.selectedBigIcon {\\r\\n color: #76798b;\\r\\n}\\r\\n\\r\\n.selectedBigIcon:hover {\\r\\n color: #595d72;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* WIZARD PROGRESS BAR */\\r\\n.wizard-progress-container {\\r\\n margin-top: 20px;\\r\\n padding: 15px;\\r\\n width: 100%;\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n}\\r\\n\\r\\n.no-gutter > [class*='col-'] {\\r\\n padding-right: 0;\\r\\n padding-left: 0;\\r\\n}\\r\\n\\r\\n.small-gutter > [class*='col-'] {\\r\\n padding-right: 6px;\\r\\n padding-left: 6px;\\r\\n}\\r\\n\\r\\n.small-gutter {\\r\\n margin-left: -9px;\\r\\n margin-right: -9px;\\r\\n}\\r\\n\\r\\n.step-disabled {\\r\\n pointer-events: none;\\r\\n cursor: default;\\r\\n}\\r\\n\\r\\n.roles-grid-disabled {\\r\\n pointer-events: none;\\r\\n cursor: default;\\r\\n opacity: 0.6;\\r\\n}\\r\\n\\r\\n#wizard-body-content {\\r\\n padding: 30px;\\r\\n min-height: 400px;\\r\\n /*overflow: auto;*/\\r\\n /*overflow-x: hidden;*/\\r\\n}\\r\\n\\r\\n.passwordRequirements {\\r\\n padding-left: 10px;\\r\\n}\\r\\n\\r\\n.btn-info.active.focus, .btn-info.active:focus, .btn-info.active:hover, .btn-info:active.focus, .btn-info:active:focus, .btn-info:active:hover, .open > .dropdown-toggle.btn-info.focus, .open > .dropdown-toggle.btn-info:focus, .open > .dropdown-toggle.btn-info:hover {\\r\\n color: #fff;\\r\\n background-color: #24a259;\\r\\n border-color: #24a259;\\r\\n}\\r\\n\\r\\n.row-eq-height {\\r\\n display: -webkit-box;\\r\\n display: -webkit-flex;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.wizard-navigation {\\r\\n background-color: white;\\r\\n border: 1px solid $border-color;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.wizard-sub-heading {\\r\\n color: $text-color;\\r\\n font-size: 22.5px;\\r\\n}\\r\\n\\r\\n.simple-unordered-list {\\r\\n list-style: none outside none;\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.form-control-dark {\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.form-control-clear {\\r\\n border: 0px;\\r\\n}\\r\\n\\r\\n.ibox-padding {\\r\\n padding: 10px 20px 10px 15px;\\r\\n}\\r\\n\\r\\n.table-icon {\\r\\n padding-right: 3px;\\r\\n}\\r\\n\\r\\n.btn-white, .btn-white:hover, .btn-white:focus, .btn-white:active, .btn-white.active, .open .dropdown-toggle.btn-white {\\r\\n color: #676a6c;\\r\\n}\\r\\n\\r\\n.btn-white:active, .btn-white.active {\\r\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.21) inset;\\r\\n}\\r\\n\\r\\n.button-label {\\r\\n position: relative;\\r\\n left: -10px;\\r\\n display: inline-block;\\r\\n padding: 6px 12px;\\r\\n background: rgba(0,0,0,0.15);\\r\\n border-radius: 3px 0 0 3px;\\r\\n}\\r\\n\\r\\n.btn-labeled {\\r\\n padding-top: 0;\\r\\n padding-bottom: 0;\\r\\n}\\r\\n\\r\\n.wizard-selection-columns {\\r\\n padding: 100px 20px 20px 20px;\\r\\n}\\r\\n\\r\\n.back-button-wrapper {\\r\\n text-align: center;\\r\\n background-color: #BDBDBD;\\r\\n color: #eeeeee;\\r\\n width: 50px;\\r\\n height: 48px;\\r\\n line-height: 44px;\\r\\n padding-top: 2px;\\r\\n border-top-left-radius: 10px;\\r\\n border-top-right-radius: 10px;\\r\\n border-bottom-right-radius: 10px;\\r\\n border-bottom-left-radius: 10px;\\r\\n margin-bottom: 10px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.back-button-wrapper:hover {\\r\\n background-color: #AFAEAE;\\r\\n}\\r\\n\\r\\n.back-button-wrapper i.fa {\\r\\n line-height: inherit;\\r\\n}\\r\\n\\r\\n.yellow-edit-background {\\r\\n background-color: #FFF1C5;\\r\\n}\\r\\n\\r\\n.img-center {\\r\\n margin: 0 auto;\\r\\n}\\r\\n\\r\\n.edit-border {\\r\\n border: solid $fp-purple 4px;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.edit-wizard-label {\\r\\n background-color: white;\\r\\n color: $fp-purple;\\r\\n font-size: 18px;\\r\\n padding: 6px 10px;\\r\\n}\\r\\n\\r\\n.active-panel-header {\\r\\n background: #0088CC;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.panel-group .panel {\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.panel-default {\\r\\n border-color: $border-color;\\r\\n}\\r\\n\\r\\n.panel-default > .panel-heading {\\r\\n color: $text-color;\\r\\n background-color: white;\\r\\n border-color: $border-color;\\r\\n}\\r\\n\\r\\n.panel-heading > h4 {\\r\\n font-size: 22.5px;\\r\\n}\\r\\n\\r\\n\\r\\n/* WIZARD NAVIGATION */\\r\\n.wizard-steps {\\r\\n background-color: #f5f5f5;\\r\\n border-radius: 4px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.wizard-nav-container {\\r\\n padding-bottom: 30px;\\r\\n}\\r\\n\\r\\n.wizard-nav-list {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.previous-page-link {\\r\\n color: $text-color;\\r\\n font-weight: 700;\\r\\n font-size: 14px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.previous-page-link .fa {\\r\\n float: left;\\r\\n margin-top: 13px;\\r\\n color: $fp-purple;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.wizard-nav-link .glyphicon, .wizard-nav-link .fa {\\r\\n float: right;\\r\\n margin-top: 12px;\\r\\n margin-right: -6px;\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.wizard-nav-list > li.step-disabled > a .fa, .wizard-nav-list > li.step-disabled > a .glyphicon {\\r\\n float: right;\\r\\n margin-top: 12px;\\r\\n margin-right: -6px;\\r\\n color: #12132140;\\r\\n}\\r\\n\\r\\nli.wizard-nav-item.active .glyphicon, li.wizard-nav-item.active .fa {\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n.blue-info-link {\\r\\n color: #8BB7F0;\\r\\n}\\r\\n\\r\\nli.wizard-nav-item {\\r\\n border-bottom: solid 1px $border-color;\\r\\n line-height: 40px;\\r\\n}\\r\\n\\r\\n.wizard-nav-list > li.active {\\r\\n border-left: none;\\r\\n}\\r\\n\\r\\n.wizard-nav-list > li.step-disabled > a {\\r\\n color: #12132140;\\r\\n background-color: #ffffff40;\\r\\n}\\r\\n\\r\\n.wizard-nav-list > li > a {\\r\\n background-color: white;\\r\\n padding: 3px 15px 3px 20px;\\r\\n color: $text-color;\\r\\n font-weight: 400;\\r\\n}\\r\\n\\r\\n.wizard-nav-list > li > a:hover {\\r\\n background-color: #f5f5f5;\\r\\n}\\r\\n\\r\\n.wizard-nav-list > li.already-visited > a.wizard-nav-link {\\r\\n color: $text-color;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.wizard-nav-list > li.active > a.wizard-nav-link {\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.wizard-nav-item .already-visited .active {\\r\\n background-color: #5794C4;\\r\\n}\\r\\n\\r\\n.wizard-nav-list li.active > a {\\r\\n background-color: #e0e0e0;\\r\\n font-weight: 600;\\r\\n border-left: 4px solid $fp-purple;\\r\\n}\\r\\n\\r\\nli.wizard-child-item {\\r\\n line-height: 20px;\\r\\n text-indent: 15px;\\r\\n font-weight: 400;\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.wizard-child-list li.active > a {\\r\\n background-color: #EEF1FF;\\r\\n font-weight: 600;\\r\\n border-left: none;\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.identity-manager-application-icon {\\r\\n background-color: white;\\r\\n padding: 15px;\\r\\n}\\r\\n\\r\\n.tile-919aa6b9-8083-4c08-ace7-9322aa69bc4e {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/NetSuiteIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-c311c379-e109-4e68-8082-f9c2f2e843ff {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/Dynamics365IMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-a4066336-3e11-4856-a7cc-9726460448b0 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/SAPIMTile.svg');\\r\\n}\\r\\n\\r\\n/*.tile-a4066336-3e11-4 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/SAPB1IMTile.svg');\\r\\n}*/\\r\\n\\r\\n.tile-34d25422-9dc2-4918-8d85-084373e4bbb3 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/OracleIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-e0981441-d1f9-4d5a-af74-cbb7339991a0 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/DynamicsGPIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-e39d0c80-61ea-4f40-8179-a5def6869507 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/DynamicsAXIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-19c49353-308b-4485-babe-f4200dfd1bf0 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/DynamicsNAVIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-79f1178d-d827-460e-84e5-758c0b799115 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/Dynamics365CustomerEngagementIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-286e7a77-4450-4527-987c-c08680356b00 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/OracleCloudIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-e636d4fc-dd34-4dca-9171-d61270179167 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/AzureActiveDirectory.svg');\\r\\n}\\r\\n\\r\\n.tile-23fa3370-b057-489e-b6bb-49aa2a2fa040 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/UniversalProduct.svg');\\r\\n}\\r\\n\\r\\n.tile-52c24698-ed59-4734-a80f-c7bcde27b16f {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IMTiles/PeopleSoftIMTile.svg');\\r\\n}\\r\\n\\r\\n.tile-Salesforce {\\r\\n background-image: url('../Content/Images/ApplicationLogos/SalesforceLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.tile-Intacct {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IntacctLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.identity-manager-application-tile {\\r\\n height: 100px;\\r\\n width: 100%;\\r\\n display: inline-block;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n}\\r\\n\\r\\n.file-application:hover {\\r\\n border: #D0D0D0 solid 1px;\\r\\n}\\r\\n\\r\\n.selected-application {\\r\\n box-shadow: inset 0px 0px 40px 40px rgba(120,167,204,0.14);\\r\\n}\\r\\n\\r\\n.disabled-application-tile {\\r\\n pointer-events: none;\\r\\n cursor: default;\\r\\n opacity: .7;\\r\\n}\\r\\n\\r\\n.available-roles-table {\\r\\n height: 300px !important;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n@media (min-width: 1170px) {\\r\\n .available-roles-table td.role-wrap {\\r\\n word-wrap: break-word;\\r\\n min-width: 160px;\\r\\n max-width: 160px;\\r\\n }\\r\\n}\\r\\n\\r\\n.vertical-scroll {\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\n.roles-table {\\r\\n height: 300px !important;\\r\\n overflow: -moz-scrollbars-vertical;\\r\\n overflow-y: scroll;\\r\\n}\\r\\n\\r\\n.record-types-table {\\r\\n height: 400px !important;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.btn-approve {\\r\\n background-color: #73C940;\\r\\n border-color: #73C940;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-approve:hover, .btn-approve:focus, .btn-approve:active, .btn-approve.active, .open .dropdown-toggle.btn-approve {\\r\\n background-color: #6DBD3D;\\r\\n border-color: #6DBD3D;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-approve.active.focus, .btn-approve.active:focus, .btn-approve.active:hover, .btn-approve:active.focus, .btn-approve:active:focus, .btn-approve:active:hover, .open > .dropdown-toggle.btn-approve.focus, .open > .dropdown-toggle.btn-approve:focus, .open > .dropdown-toggle.btn-approve:hover {\\r\\n background-color: #6DBD3D;\\r\\n border-color: #6DBD3D;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.fontWeight600 {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.btn-default {\\r\\n color: #291972;\\r\\n background-color: #fff;\\r\\n}\\r\\n\\r\\n.btn-default:hover {\\r\\n color: #291972;\\r\\n background-color: darken(#fff, 4%);\\r\\n}\\r\\n\\r\\n.btn-default.active.focus, .btn-default.active:focus, .btn-default.active:hover, .btn-default:active.focus, .btn-default:active:focus, .btn-default:active:hover, .open > .dropdown-toggle.btn-default.focus, .open > .dropdown-toggle.btn-default:focus, .open > .dropdown-toggle.btn-default:hover {\\r\\n color: #291972;\\r\\n background-color: darken(#fff, 4%);\\r\\n}\\r\\n\\r\\n.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {\\r\\n color: #291972;\\r\\n background-color: darken(#fff, 4%);\\r\\n}\\r\\n\\r\\n.full button span {\\r\\n background-color: limegreen;\\r\\n border-radius: 32px;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.partially button span {\\r\\n background-color: orange;\\r\\n border-radius: 32px;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.table tbody > tr > td.vert-align {\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.table tbody > tr > td.vert-align-bottom {\\r\\n vertical-align: bottom;\\r\\n}\\r\\n\\r\\n.col-centered {\\r\\n float: none;\\r\\n margin: 0 auto;\\r\\n}\\r\\n\\r\\n.ibox-min-height {\\r\\n min-height: 400px;\\r\\n padding: 30px;\\r\\n}\\r\\n\\r\\n.review-assignments-pane {\\r\\n min-height: 700px;\\r\\n}\\r\\n\\r\\n.verticalTabs .nav > li.active {\\r\\n border-left: 0px;\\r\\n background-color: transparent;\\r\\n}\\r\\n\\r\\n.topMarginForScheduleDropdown {\\r\\n margin-top: 34px;\\r\\n}\\r\\n\\r\\n.topMarginForScheduleSave {\\r\\n margin-top: 56px;\\r\\n}\\r\\n\\r\\n.modalBodyGray {\\r\\n background: #F2F3F5;\\r\\n /*box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);*/\\r\\n /*margin-bottom: 10px;*/\\r\\n}\\r\\n\\r\\n.topPaddingFifty {\\r\\n padding-top: 50px;\\r\\n}\\r\\n\\r\\n.backButtonPadding {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n}\\r\\n\\r\\n.navigationBack {\\r\\n font-size: 22px;\\r\\n margin-right: 10px;\\r\\n background-color: $fp-yellow;\\r\\n border-radius: 5px;\\r\\n}\\r\\n\\r\\n.btn-greenRadio {\\r\\n background: #F1F1F1;\\r\\n color: rgb(103, 106, 108) !important;\\r\\n border: solid 1px #A9A9A9;\\r\\n border-radius: 5px;\\r\\n}\\r\\n\\r\\n.btn-greenRadio:focus, .btn-greenRadio:active, .btn-greenRadio.active, .open .dropdown-toggle.btn-greenRadio {\\r\\n background-color: $fp-label-green-bg;\\r\\n border-color: $fp-label-green-border;\\r\\n color: $fp-label-green-text !important;\\r\\n}\\r\\n\\r\\n.btn-redRadio {\\r\\n background: #F1F1F1;\\r\\n color: rgb(103, 106, 108) !important;\\r\\n border: solid 1px #A9A9A9;\\r\\n border-radius: 5px;\\r\\n}\\r\\n\\r\\n.btn-redRadio:focus, .btn-redRadio:active, .btn-redRadio.active, .open .dropdown-toggle.btn-redRadio {\\r\\n background-color: $fp-label-red-bg;\\r\\n border-color: $fp-label-red-border;\\r\\n color: $fp-label-red-text !important;\\r\\n}\\r\\n\\r\\n.btn-blueRadio {\\r\\n background: #F1F1F1;\\r\\n border: solid 1px #dadada;\\r\\n border-radius: 5px;\\r\\n}\\r\\n\\r\\n.btn-blueRadio:focus, .btn-blueRadio:active, .btn-blueRadio.active, .open .dropdown-toggle.btn-blueRadio {\\r\\n background-color: $fp-purple;\\r\\n border-color: $fp-purple;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-blueRadio-darkBG {\\r\\n background: #F1F1F1;\\r\\n color: rgb(103, 106, 108) !important;\\r\\n border: solid 1px #A9A9A9;\\r\\n border-radius: 5px;\\r\\n}\\r\\n\\r\\n.btn-blueRadio-darkBG:focus, .btn-blueRadio-darkBG:active, .btn-blueRadio-darkBG.active, .open .dropdown-toggle.btn-blueRadio-darkBG {\\r\\n background-color: #3070A5;\\r\\n border-color: #6F6F6F;\\r\\n color: white !important;\\r\\n}\\r\\n\\r\\n.criteria-container {\\r\\n position: relative;\\r\\n width: 280px;\\r\\n}\\r\\n\\r\\n.loading-select-icon {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.medBlackSpinnerPlace {\\r\\n height: 50px;\\r\\n width: 50px;\\r\\n margin-left: 10px;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.medBlackSpinnerRelative {\\r\\n height: 110px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.pdfFontColor {\\r\\n color: #F56445;\\r\\n}\\r\\n\\r\\n.excelFontColor {\\r\\n color: #7cba89;\\r\\n}\\r\\n\\r\\n.text-blue {\\r\\n color: #5794C4;\\r\\n}\\r\\n\\r\\n\\r\\n.text-white {\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.k-button.k-state-disabled, .k-button.k-state-disabled:active, .k-button.k-state-disabled:active:hover, .k-button.k-state-disabled:hover, .k-button[disabled], .k-state-disabled .k-button, .k-state-disabled .k-button:active, .k-state-disabled .k-button:hover {\\r\\n opacity: .65;\\r\\n}\\r\\n\\r\\n.k-grid-header-disabled {\\r\\n pointer-events: none;\\r\\n opacity: .7;\\r\\n}\\r\\n\\r\\n.wizard-disabled {\\r\\n pointer-events: none;\\r\\n opacity: .6;\\r\\n}\\r\\n\\r\\n.k-grid tbody tr {\\r\\n height: 28px;\\r\\n}\\r\\n\\r\\n.k-grid td {\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.navbar-default .special_link a {\\r\\n background: #135284;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.navbar-default .special_link a:hover {\\r\\n background: #0f456f !important;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.navbar-default .special_link a:focus {\\r\\n background: #135284 !important;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.detailedButton {\\r\\n padding-right: 20px;\\r\\n padding-left: 20px;\\r\\n color: white;\\r\\n border-radius: 15px;\\r\\n background-color: rgba(255, 255, 255, 0.2);\\r\\n}\\r\\n\\r\\n.detailedButton:hover {\\r\\n color: white;\\r\\n background-color: rgba(255, 255, 255, 0.3);\\r\\n}\\r\\n\\r\\n.backToReportViewerButton {\\r\\n padding-right: 20px;\\r\\n padding-left: 20px;\\r\\n color: white;\\r\\n border-radius: 15px;\\r\\n background-color: rgba(38, 117, 179, 0.70);\\r\\n}\\r\\n\\r\\n.backToReportViewerButton:hover {\\r\\n color: white;\\r\\n background-color: rgba(38, 117, 179, 0.80);\\r\\n}\\r\\n\\r\\n.backToReportViewer {\\r\\n padding-top: 15px;\\r\\n padding-left: 18px;\\r\\n padding-right: 18px;\\r\\n}\\r\\n\\r\\n.wrap-report-button-text {\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n white-space: normal\\r\\n}\\r\\n\\r\\n.nav-header {\\r\\n background-repeat: no-repeat;\\r\\n}\\r\\n\\r\\n.dropdown-menu > li > a:focus, .dropdown-menu > li > a:hover {\\r\\n background: #f5f5f5;\\r\\n}\\r\\n\\r\\n.favorite-star-color {\\r\\n color: #FFBD55;\\r\\n}\\r\\n\\r\\n.play-saved-report-color {\\r\\n color: #8CB9F3;\\r\\n}\\r\\n\\r\\n/*.todo-list.small-list :hover {\\r\\n background: #edf0f5;\\r\\n}\\r\\n\\r\\n.todo-list.small-list > li {\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.todo-list.small-list > li {\\r\\n background: white;\\r\\n margin-bottom: 0;\\r\\n padding-bottom: 8px;\\r\\n padding-top: 8px;\\r\\n}*/\\r\\n\\r\\n.thinGrayBorderBottom {\\r\\n border-bottom: solid 1px #f3f3f3;\\r\\n}\\r\\n\\r\\n.file-application:hover i {\\r\\n color: #adadad;\\r\\n}\\r\\n\\r\\n.file-application .fileIconChecked i {\\r\\n color: #3276b1;\\r\\n}\\r\\n\\r\\n.file-application > a {\\r\\n color: #676a6c;\\r\\n}\\r\\n\\r\\n.nav .open > a, .nav .open > a:focus, .nav .open > a:hover {\\r\\n background-color: #1d1d1e;\\r\\n}\\r\\n\\r\\n.nav.navbar-top-links > li > a:hover, .nav.navbar-top-links > li > a:focus {\\r\\n background-color: white;\\r\\n color: darken($fp-purple, 10%);\\r\\n}\\r\\n\\r\\n.fixed-ibox-height {\\r\\n min-height: 650px;\\r\\n}\\r\\n\\r\\n.Absolute-Center {\\r\\n margin: auto;\\r\\n position: absolute;\\r\\n top: 120px;\\r\\n left: 50%;\\r\\n bottom: 0;\\r\\n right: 50%;\\r\\n}\\r\\n\\r\\n.business-process-level {\\r\\n min-height: 60px;\\r\\n padding: 19px;\\r\\n padding: 14px;\\r\\n margin-bottom: 10px;\\r\\n box-shadow: 2px 2px 3px #dadada;\\r\\n}\\r\\n\\r\\n.bp-level-one {\\r\\n background-color: #F4F5F8;\\r\\n}\\r\\n\\r\\n.bp-level-two {\\r\\n background-color: #F1F0F2;\\r\\n}\\r\\n\\r\\n.bp-level-three {\\r\\n background-color: #E8E8EB;\\r\\n}\\r\\n\\r\\n.bp-level-three-scroll-section {\\r\\n max-height: 450px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n padding-bottom: 10px;\\r\\n}\\r\\n\\r\\n.max-height-mitigate-modal {\\r\\n max-height: 280px;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n padding-left: 20px;\\r\\n padding-right: 20px;\\r\\n}\\r\\n\\r\\n/*.bp-level-four {\\r\\n background-color: #D7D7D8;\\r\\n}*/\\r\\n\\r\\n.business-process-label {\\r\\n width: 100%;\\r\\n display: inline-block;\\r\\n padding: 6px 12px;\\r\\n font-size: 12px;\\r\\n font-weight: 400;\\r\\n line-height: 1.42857143;\\r\\n text-align: left;\\r\\n white-space: nowrap;\\r\\n border-radius: 3px;\\r\\n background: #4F5C67;\\r\\n color: white;\\r\\n margin: 2px;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n max-width: 220px;\\r\\n outline: none;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.form-control-max-width {\\r\\n max-width: 300px;\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.business-process-label[disabled], .business-process-label[readonly], fieldset[disabled] .business-process-label {\\r\\n color: white;\\r\\n opacity: .7;\\r\\n}\\r\\n\\r\\n.business-process-tile {\\r\\n text-align: center;\\r\\n position: relative;\\r\\n display: inline-block;\\r\\n margin: 2px;\\r\\n height: 100px;\\r\\n width: 160px;\\r\\n padding: 10px;\\r\\n border-radius: 2px;\\r\\n background: #4F5C67;\\r\\n color: white;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n/*.business-process-tile:hover {\\r\\n background: #3c4954;\\r\\n }*/\\r\\n\\r\\n/*.transparent-business-process-tile {\\r\\n text-align: center;\\r\\n position: relative;\\r\\n display: inline-block;\\r\\n margin: 1px;\\r\\n padding: 12px;\\r\\n border-radius: 2px;\\r\\n color: #899E8C;\\r\\n overflow: hidden;\\r\\n height: 100px;\\r\\n width: 160px;\\r\\n padding-top: 25px;\\r\\n background: #9CB09F;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n}\\r\\n\\r\\n .transparent-business-process-tile a {\\r\\n color: #f9f9f9;\\r\\n }\\r\\n\\r\\n .transparent-business-process-tile a:hover {\\r\\n color: white;\\r\\n }*/\\r\\n\\r\\n.absolute-top-right-10 {\\r\\n position: absolute;\\r\\n top: 10px;\\r\\n right: 10px;\\r\\n}\\r\\n\\r\\n.absolute-top-right-5 {\\r\\n position: absolute;\\r\\n top: 5px;\\r\\n right: 5px;\\r\\n}\\r\\n\\r\\n.absolute-top-right {\\r\\n position: absolute;\\r\\n top: 0;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n.absolute-bottom {\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n left: 0;\\r\\n}\\r\\n\\r\\n.tile-x-out {\\r\\n background: #36424c;\\r\\n padding: 2px;\\r\\n padding-top: 1px;\\r\\n padding-bottom: 1px;\\r\\n padding-left: 2px;\\r\\n padding-right: 2px;\\r\\n border-top-right-radius: 2px;\\r\\n}\\r\\n\\r\\n.tile-x-out a {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.business-process-tile-bottom {\\r\\n height: 18px;\\r\\n background: #36424c;\\r\\n}\\r\\n\\r\\n.text-red-when-hover {\\r\\n color: #888888;\\r\\n}\\r\\n\\r\\n.text-orange-when-hover {\\r\\n color: #888888;\\r\\n}\\r\\n\\r\\n.light-gray-link {\\r\\n color: #4b4f66;\\r\\n}\\r\\n\\r\\na.text-red-when-hover:hover {\\r\\n color: #d60000;\\r\\n}\\r\\n\\r\\na.text-orange-when-hover:hover {\\r\\n color: #f39c12;\\r\\n}\\r\\n\\r\\n.user-mapping-link-button {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.k-grid tr:hover .user-mapping-link-button {\\r\\n display: inline;\\r\\n}\\r\\n\\r\\n.user-mapping-link-button a.user-mapping-link-button:hover {\\r\\n color: #121321;\\r\\n}\\r\\n\\r\\n.material-design-box {\\r\\n /* border-radius: 3px; */\\r\\n /* box-shadow: 2px 2px 3px #dadada; */\\r\\n /* box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.12); */\\r\\n border: 1px solid #eeeeee;\\r\\n padding: 10px 15px;\\r\\n text-align: left;\\r\\n display: block;\\r\\n margin-bottom: 10px;\\r\\n margin-right: 10px;\\r\\n background: rgb(246, 246, 246);\\r\\n}\\r\\n\\r\\n.contain-background-icon {\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n -webkit-border-radius: 3px;\\r\\n -webkit-background-clip: padding-box;\\r\\n -moz-border-radius: 3px;\\r\\n -moz-background-clip: padding;\\r\\n border-radius: 3px;\\r\\n background-clip: padding-box;\\r\\n background-size: contain;\\r\\n}\\r\\n\\r\\n.height-width-64 {\\r\\n width: 64px;\\r\\n height: 64px;\\r\\n background-size: contain;\\r\\n}\\r\\n\\r\\n.height-width-32 {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n background-size: contain;\\r\\n}\\r\\n\\r\\n.height-width-16 {\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n background-size: contain;\\r\\n}\\r\\n\\r\\n.height-width-14 {\\r\\n width: 14px;\\r\\n height: 14px;\\r\\n background-size: contain;\\r\\n}\\r\\n\\r\\n.file-type-icon {\\r\\n width: 42px;\\r\\n float: left;\\r\\n height: 100%;\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.fp-circle-success {\\r\\n background-image: url('../Content/Images/SVG/fp-circle-success.svg');\\r\\n}\\r\\n\\r\\n.fp-circle-inactive {\\r\\n background-image: url('../Content/Images/SVG/fp-circle-inactive.svg');\\r\\n}\\r\\n\\r\\n.excel-file-icon-64 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/xlsx_64.png');\\r\\n}\\r\\n\\r\\n.pdf-file-icon-64 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/pdf_64.png');\\r\\n}\\r\\n\\r\\n.word-file-icon-64 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/docx_64.png');\\r\\n}\\r\\n\\r\\n.excel-file-icon-16 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/xlsx_16.png');\\r\\n}\\r\\n\\r\\n.pdf-file-icon-16 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/pdf_16.png');\\r\\n}\\r\\n\\r\\n.csv-file-icon-16 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/csv-16.png');\\r\\n}\\r\\n\\r\\n.default-file-icon-16 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/default-16.png');\\r\\n}\\r\\n\\r\\n.default-file-icon-64 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/default-64.png');\\r\\n}\\r\\n\\r\\n.word-file-icon-16 {\\r\\n background-image: url('../Content/Images/FileTypeIcons/docx_16.png');\\r\\n}\\r\\n\\r\\n.excel-file-icon {\\r\\n background-image: url('../Content/Images/FileTypeIcons/xlsx_32.png');\\r\\n}\\r\\n\\r\\n.pdf-file-icon {\\r\\n background-image: url('../Content/Images/FileTypeIcons/pdf_32.png');\\r\\n}\\r\\n\\r\\n.csv-file-icon {\\r\\n background-image: url('../Content/Images/FileTypeIcons/csv-64.png');\\r\\n}\\r\\n\\r\\n.word-file-icon {\\r\\n background-image: url('../Content/Images/FileTypeIcons/docx_32.png');\\r\\n}\\r\\n\\r\\n.acumatica-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/AcumaticaSVG.svg');\\r\\n}\\r\\n\\r\\n.oracle-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/OracleLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.jde-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/OracleJDEdwardsSVG.svg');\\r\\n}\\r\\n\\r\\n.orfc-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/OracleCloudFinLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.peoplesoft-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/PeopleSoftSVG.svg');\\r\\n}\\r\\n\\r\\n.coupa-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/CoupaSVG.svg');\\r\\n}\\r\\n\\r\\n.dynamics-365-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/Dynamics365SVG.svg');\\r\\n}\\r\\n\\r\\n.dynamics-365-sales-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/Dynamics365SalesSVG.svg');\\r\\n}\\r\\n\\r\\n.dynamics-365-businesscentral-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/DynamicsNav2019BusinessCentral.svg');\\r\\n}\\r\\n\\r\\n.gp-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/DynamicsGPSVG.svg');\\r\\n}\\r\\n\\r\\n.ax-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/DynamicsAXSVG.svg');\\r\\n}\\r\\n\\r\\n.sl-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/DynamicsSLSVG.svg');\\r\\n}\\r\\n\\r\\n.netSuite-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/netsuite-oracle.svg');\\r\\n}\\r\\n\\r\\n.sapb1-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/SAPB1LogoSVG.svg');\\r\\n}\\r\\n\\r\\n.sap-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/SAPLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.salesforce-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/SalesforceLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.intacct-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/IntacctLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.nav-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/DynamicsNAVSVG.svg');\\r\\n}\\r\\n\\r\\n.zendesk-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/ZendeskLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.jira-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/JiraLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.workday-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/WorkdaySVG.svg');\\r\\n}\\r\\n\\r\\n.workiva-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/WorkivaLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.azure-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/AzureSVG.svg');\\r\\n}\\r\\n\\r\\n.azure-active-directory-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/AzureActiveDirectory.svg');\\r\\n}\\r\\n\\r\\n.active-directory-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/microsoftActiveDirectory.svg');\\r\\n}\\r\\n\\r\\n.service-now-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/service-now.svg');\\r\\n}\\r\\n\\r\\n.zuo-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/ZuoraLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.ala-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/ALA_Logo.svg');\\r\\n}\\r\\n\\r\\n.ariba-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/AribaLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.freshservice-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/FreshserviceLogo.svg');\\r\\n}\\r\\n\\r\\n.auditboard-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/AuditBoardLogo.svg');\\r\\n}\\r\\n\\r\\n.azure-devops-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/AzureDevOpsLogoSVG.svg');\\r\\n}\\r\\n\\r\\n.concur-avatar-logo {\\r\\n background-image: url('../Content/Images/ApplicationLogos/SAPConcurLogo.svg');\\r\\n}\\r\\n\\r\\n.plugin-dropdown-logo {\\r\\n background-image: url('../Content/Images/SVG/LinkClippedWithDrop.svg');\\r\\n}\\r\\n\\r\\n.disabled-plugin {\\r\\n font-size: 16px;\\r\\n font-weight: 400;\\r\\n padding-top: 40px;\\r\\n}\\r\\n\\r\\n.material-design-box-header {\\r\\n font-weight: 600;\\r\\n font-size: 13px;\\r\\n padding-bottom: 4px;\\r\\n}\\r\\n\\r\\n.material-design-box .info {\\r\\n padding-top: 8px;\\r\\n}\\r\\n\\r\\n.material-design-image {\\r\\n width: 42px;\\r\\n float: left;\\r\\n height: 100%;\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.add-objects-rounded-btn {\\r\\n padding-right: 20px;\\r\\n padding-left: 20px;\\r\\n color: white;\\r\\n border-radius: 15px;\\r\\n background-color: #27ae60;\\r\\n font-weight: 600;\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.add-objects-rounded-btn:hover {\\r\\n color: white;\\r\\n background-color: #25a75c;\\r\\n}\\r\\n\\r\\n.label-warning-light, .badge-warning-light {\\r\\n background-color: $fp-label-orange-bg;\\r\\n color: $fp-label-orange-text;\\r\\n border: 1px solid $fp-label-orange-border;\\r\\n}\\r\\n\\r\\n.label-danger-light, .badge-danger-light {\\r\\n background-color: $fp-label-red-bg;\\r\\n color: $fp-label-red-text;\\r\\n border: 1px solid $fp-label-red-border;\\r\\n}\\r\\n\\r\\n.label-primary-light, .badge-primary-light {\\r\\n background-color: $fp-purple;\\r\\n color: white;\\r\\n border: 1px solid $text-color;\\r\\n}\\r\\n\\r\\n.label-success-light, .badge-success-light {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n}\\r\\n\\r\\n.label-dimgrey-light, .badge-dimgrey-light {\\r\\n background-color: $fp-label-gray-bg;\\r\\n color: $fp-label-gray-text;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n}\\r\\n\\r\\n.label-go-light, .badge-go-light {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n}\\r\\n\\r\\n.light-gray-badge-background {\\r\\n background-color: $fp-label-gray-bg;\\r\\n}\\r\\n\\r\\n.white-background {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.label-microsoft-account, .badge-microsoft-account {\\r\\n background-color: #01A7F0;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.popover {\\r\\n box-shadow: 0 5px 10px rgba(0,0,0,.2);\\r\\n}\\r\\n\\r\\n.label {\\r\\n display: inline-block;\\r\\n font-weight: 400;\\r\\n}\\r\\n\\r\\n.form-control:focus {\\r\\n border-color: $fp-purple !important;\\r\\n outline: 0;\\r\\n}\\r\\n\\r\\n.filter-pills-above-grid {\\r\\n padding: 10px 20px;\\r\\n background-color: #f5f5f5;\\r\\n border: solid 1px $border-color;\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.pill-radio {\\r\\n color: #434343;\\r\\n padding: 3px 14px;\\r\\n font-size: 12px;\\r\\n border-radius: 14px;\\r\\n cursor: pointer;\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.pill-radio:hover {\\r\\n background-color: rgba(0, 0, 0, 0.11);\\r\\n}\\r\\n\\r\\n.pill-radio.active {\\r\\n color: #fafafa;\\r\\n background-color: $fp-purple;\\r\\n}\\r\\n\\r\\na.text-dark {\\r\\n color: #5a5a5a;\\r\\n}\\r\\n\\r\\na.text-dark:hover {\\r\\n color: #383838;\\r\\n}\\r\\n\\r\\n.dynamic-side-grid-header {\\r\\n border-bottom: solid 1px #dbdbdb;\\r\\n color: #31708f;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.float-manage-data-logo-left {\\r\\n padding-top: 4px;\\r\\n width: 50px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.float-product-logo-left {\\r\\n padding-top: 6px;\\r\\n width: 75px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.large-avatar-logo {\\r\\n width: 50px;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n.product-import-header {\\r\\n font-size: 20px;\\r\\n color: #47506e;\\r\\n font-weight: 400;\\r\\n line-height: normal;\\r\\n margin: 0 0 4px;\\r\\n}\\r\\n\\r\\n.product-import-description {\\r\\n color: #8991a6;\\r\\n font-size: 12px;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.panel-ibox-content {\\r\\n background-color: $ibox-content-bg;\\r\\n color: inherit;\\r\\n padding: 15px 20px 20px 20px;\\r\\n border-color: $border-color;\\r\\n border-image: none;\\r\\n border-style: solid;\\r\\n border-width: 1px;\\r\\n border-radius: 4px;\\r\\n\\r\\n}\\r\\n\\r\\n.panel-ibox-title {\\r\\n border-radius: 5px 5px 0px 0px !important;\\r\\n background: white !important;\\r\\n color: #121321 !important;\\r\\n padding: 10px 15px;\\r\\n}\\r\\n\\r\\n.panel-ibox-title h5 {\\r\\n float: none;\\r\\n font-size: 22.5px;\\r\\n}\\r\\n\\r\\n.product-import-action {\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n.light-gray-behind-icon {\\r\\n padding: 15px 15px;\\r\\n display: inline-block;\\r\\n -moz-border-radius: 100px;\\r\\n -webkit-border-radius: 100px;\\r\\n border-radius: 100px;\\r\\n background-color: #f6f6f6;\\r\\n}\\r\\n\\r\\n.manual-mapping-modal-tile {\\r\\n padding: 5px 10px;\\r\\n}\\r\\n\\r\\n.manual-mapping-yellow-tile {\\r\\n color: #B27E00;\\r\\n background-color: #fff0cc;\\r\\n border-radius: 4px;\\r\\n border: dashed 1px rgb(206, 206, 206);\\r\\n}\\r\\n\\r\\n.manual-mapping-tile-selected {\\r\\n border: dashed 1px rgb(206, 206, 206);\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.center-div {\\r\\n padding-top: 100px;\\r\\n margin: auto;\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.disabledDiv {\\r\\n pointer-events: none;\\r\\n opacity: 0.4;\\r\\n}\\r\\n\\r\\n.new-mapping-dot {\\r\\n color: #291972;\\r\\n font-size: .5em;\\r\\n padding-right: 8px;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\na.text-danger:focus, a.text-danger:hover {\\r\\n color: #c9483b;\\r\\n}\\r\\n\\r\\na.text-success:focus, a.text-success:hover {\\r\\n color: #228f50;\\r\\n}\\r\\n\\r\\n.dynamic-side-grid-shell {\\r\\n border-bottom: solid 1px #f2f2f2;\\r\\n}\\r\\n\\r\\n.dynamic-side-grid-shell h5 {\\r\\n color: #121321;\\r\\n}\\r\\n\\r\\n.table tr.active th,\\r\\n.table tr.active td {\\r\\n color: #2675B3;\\r\\n /*font-weight: 600;*/\\r\\n}\\r\\n\\r\\n.k-widget.k-tooltip {\\r\\n border-color: #000;\\r\\n color: #333;\\r\\n padding: 7px;\\r\\n background-color: #fff;\\r\\n border: 1px solid #ccc;\\r\\n border: 1px solid rgba(0,0,0,.2);\\r\\n border-radius: 6px;\\r\\n -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);\\r\\n box-shadow: 0 5px 10px rgba(0,0,0,.2);\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.k-callout-n {\\r\\n border-bottom-color: darkgray;\\r\\n}\\r\\n\\r\\n.k-callout-w {\\r\\n border-right-color: darkgray;\\r\\n}\\r\\n\\r\\n.k-callout-s {\\r\\n border-top-color: darkgray;\\r\\n}\\r\\n\\r\\n.k-callout-e {\\r\\n border-left-color: darkgray;\\r\\n}\\r\\n\\r\\n.toolbar-link {\\r\\n display: inline-block;\\r\\n color: #121321;\\r\\n padding: 3px 14px;\\r\\n font-size: 12px;\\r\\n border-radius: 4px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.toolbar-link:hover {\\r\\n background-color: rgba(0, 0, 0, 0.05);\\r\\n}\\r\\n\\r\\n.toolbar-link[disabled] {\\r\\n pointer-events: none;\\r\\n cursor: default;\\r\\n opacity: 0.7;\\r\\n}\\r\\n\\r\\n.select-a-row-for-details-info {\\r\\n text-align: center;\\r\\n padding: 20px;\\r\\n padding-top: 30px;\\r\\n color: #a2a2a2;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.gray-kendo-dropdown .k-dropdown-wrap.k-state-default {\\r\\n background-color: white;\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.gray-kendo-dropdown .k-dropdown-wrap.k-state-default:hover {\\r\\n background-color: rgba(0, 0, 0, 0.05);\\r\\n}\\r\\n\\r\\n.k-filter-menu label {\\r\\n padding-right: 20px;\\r\\n}\\r\\n\\r\\n.k-filter-menu label input {\\r\\n margin-right: 5px;\\r\\n}\\r\\n\\r\\n.k-link input {\\r\\n margin-right: 5px;\\r\\n}\\r\\n\\r\\n.k-dropdown .k-input {\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.k-item .k-link {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n/*.btn-grid-row-settings {\\r\\n color: #373a3c;\\r\\n background-color: white !important;\\r\\n border-radius: 0;\\r\\n border: none;\\r\\n border-bottom: solid 1px #d3d3d3;\\r\\n border-right: solid 1px #d3d3d3;\\r\\n padding: 4px;\\r\\n}*/\\r\\n\\r\\n.btn-grid-row-settings {\\r\\n background-color: inherit;\\r\\n border-radius: 0;\\r\\n padding: 4px;\\r\\n}\\r\\n\\r\\n.btn-grid-row-settings:hover {\\r\\n background-color: #d9d9d9 !important\\r\\n}\\r\\n\\r\\n.k-grid {\\r\\n tr.k-state-selected {\\r\\n background-color: $fp-purple;\\r\\n\\r\\n &:hover td {\\r\\n background-color: $fp-purple;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.k-link {\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.k-calendar .k-footer .k-nav-today {\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.k-calendar .k-today .k-link {\\r\\n color: $text-color;\\r\\n box-shadow: inset 0 0 7px 0 $fp-purple;\\r\\n}\\r\\n\\r\\n.k-calendar .k-footer .k-nav-today:hover {\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.k-calendar td.k-state-focused .k-link {\\r\\n color: $text-color;\\r\\n box-shadow: inset 0 0 7px 0 $fp-purple;\\r\\n}\\r\\n\\r\\n.k-calendar td.k-state-focused .k-link:hover {\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.k-state-selected {\\r\\n background-color: $fp-purple;\\r\\n border-color: $fp-purple;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.k-state-selected .btn-grid-row-settings {\\r\\n color: white;\\r\\n background-color: white;\\r\\n border-color: none;\\r\\n}\\r\\n\\r\\n.k-icon {\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.k-grid-header .k-i-sort-asc-sm, .k-grid-header .k-i-sort-desc-sm, .k-grid-header .k-sort-order {\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.row-settings-drop-padding {\\r\\n padding-top: 12px;\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.btn-text-only {\\r\\n color: $fp-purple;\\r\\n background-color: white;\\r\\n border-color: white;\\r\\n}\\r\\n\\r\\n.btn-text-only:hover {\\r\\n color: $fp-purple;\\r\\n background-color: darken(white, 4%);\\r\\n border-color: darken(white, 4%);\\r\\n}\\r\\n\\r\\n.btn-secondary {\\r\\n color: $fp-purple;\\r\\n background-color: white;\\r\\n border-color: $fp-purple;\\r\\n}\\r\\n\\r\\n.btn-secondary:hover {\\r\\n color: darken($fp-purple, 4%);\\r\\n background-color: darken(white, 4%);\\r\\n border-color: $fp-purple;\\r\\n}\\r\\n\\r\\n.btn-secondary:focus, .btn-secondary:active, .btn-secondary.active, .open .dropdown-toggle.btn-secondary {\\r\\n background-color: darken(white, 4%);\\r\\n}\\r\\n\\r\\n\\r\\n.disabled-ibox {\\r\\n opacity: .50;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.unfocused-ibox-content {\\r\\n opacity: .4;\\r\\n}\\r\\n\\r\\n.focused-ibox-content {\\r\\n border-top: 1px solid #cdcdcd;\\r\\n border-bottom: 1px solid #cdcdcd;\\r\\n}\\r\\n\\r\\n.import-sub-title {\\r\\n text-transform: uppercase;\\r\\n color: $fp-dark-gray;\\r\\n font-size: 15px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.centered-div-1200-max {\\r\\n max-width: 1200px;\\r\\n height: auto;\\r\\n margin: 0 auto;\\r\\n padding: 10px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.centered-div-800-max {\\r\\n max-width: 800px;\\r\\n height: auto;\\r\\n margin: 0 auto;\\r\\n padding: 10px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.centered-div-450-max {\\r\\n max-width: 450px;\\r\\n height: auto;\\r\\n margin: 0 auto;\\r\\n padding: 10px;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.div-400-max {\\r\\n max-width: 400px;\\r\\n width: 100%;\\r\\n display: inline-block;\\r\\n margin-right: 30px;\\r\\n vertical-align: top;\\r\\n /*height: auto;\\r\\n margin: 0 auto;\\r\\n padding: 10px;\\r\\n position: relative;*/\\r\\n}\\r\\n\\r\\n.configuartion-window-pane {\\r\\n min-height: 500px;\\r\\n}\\r\\n\\r\\n.sm-spinner-contain {\\r\\n position: relative;\\r\\n left: 4px;\\r\\n width: 24px;\\r\\n height: 8px;\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.ibox-title h5 {\\r\\n float: none;\\r\\n font-size: 22.5px;\\r\\n}\\r\\n\\r\\n.ibox-title-border-bottom {\\r\\n border-bottom: solid 1px #C2C4CC;\\r\\n min-height: 59px;\\r\\n}\\r\\n\\r\\n.label-out-of-box-template {\\r\\n color: $fp-label-gray-text;\\r\\n background-color: $fp-label-gray-bg;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n}\\r\\n\\r\\n.label-custom-template {\\r\\n color: $fp-label-blue-text;\\r\\n background-color: $fp-label-blue-bg;\\r\\n border: 1px solid $fp-label-blue-border;\\r\\n}\\r\\n\\r\\n.label-sim-deployed {\\r\\n background-color: $fp-label-blue-bg;\\r\\n color: $fp-label-blue-text;\\r\\n border: 1px solid $fp-label-blue-border;\\r\\n}\\r\\n\\r\\n.label-sim-draft {\\r\\n background: $fp-label-gray-bg;\\r\\n color: $fp-label-gray-text;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n}\\r\\n\\r\\n.label-sim-ready {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n}\\r\\n\\r\\n.label-sim-analyzing {\\r\\n background-color: $fp-label-orange-bg;\\r\\n color: $fp-label-orange-text;\\r\\n border: 1px solid $fp-label-orange-border;\\r\\n}\\r\\n\\r\\n.label-modify {\\r\\n background-color: $fp-label-orange-bg;\\r\\n color: $fp-label-orange-text;\\r\\n border: 1px solid $fp-label-orange-border;\\r\\n}\\r\\n\\r\\n.label-add {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n}\\r\\n\\r\\n.label-remove {\\r\\n background-color: $fp-label-red-bg;\\r\\n color: $fp-label-red-text;\\r\\n border: 1px solid $fp-label-red-border;\\r\\n}\\r\\n\\r\\n.role-modification-item {\\r\\n padding-bottom: 2px;\\r\\n padding-top: 2px;\\r\\n}\\r\\n\\r\\n.simulator-role-child-item {\\r\\n padding: 6px 14px;\\r\\n border-bottom: solid 1px #f4f4f4;\\r\\n}\\r\\n\\r\\n.badge-simulation-object-count {\\r\\n font-size: 9px;\\r\\n background-color: #eeeeee;\\r\\n margin-bottom: 2px;\\r\\n}\\r\\n\\r\\n.permission-level-selection {\\r\\n border: none;\\r\\n color: #3276B1;\\r\\n width: 58px;\\r\\n}\\r\\n\\r\\n.run-simulation-button {\\r\\n width: 50%;\\r\\n min-width: 170px;\\r\\n}\\r\\n\\r\\n\\r\\n.additional-downloads-btn {\\r\\n position: absolute;\\r\\n top: 40px;\\r\\n right: 22px;\\r\\n}\\r\\n\\r\\n.file-exporting-opacity {\\r\\n opacity: 0.48;\\r\\n}\\r\\n\\r\\n.settings-title-link:hover {\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.stats-number {\\r\\n font-weight: 200;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.max-height-none {\\r\\n height: auto !important;\\r\\n}\\r\\n\\r\\n/*Removes pager numbers if unable to see page 2*/\\r\\n.k-pager-numbers li:nth-child(2):last-child {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.dropdown-header {\\r\\n color: $text-color;\\r\\n font-weight: 600;\\r\\n padding: 10px 22px;\\r\\n border-bottom: solid 1px $border-color;\\r\\n}\\r\\n\\r\\nbutton[title=\\\"Clear\\\"].k-button-icon {\\r\\n border: none;\\r\\n background-color: transparent !important;\\r\\n}\\r\\n\\r\\nspan[title=\\\"clear\\\"].k-clear-value {\\r\\n display: none !important;\\r\\n}\\r\\n\\r\\n\\r\\n.k-dropdown-operator > .k-dropdown-wrap.k-state-default {\\r\\n border-color: transparent;\\r\\n}\\r\\n\\r\\n.dropdown-menu > li > a {\\r\\n margin: 0;\\r\\n padding: 6px 16px;\\r\\n}\\r\\n\\r\\n#right-sidebar-notifications {\\r\\n background-color: #fff;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n border-top: 1px solid #C2C4CC;\\r\\n overflow: hidden;\\r\\n position: fixed;\\r\\n top: 60px;\\r\\n width: 300px !important;\\r\\n z-index: 1008;\\r\\n bottom: 0;\\r\\n right: -260px;\\r\\n}\\r\\n\\r\\n#right-sidebar {\\r\\n background-color: #fff;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n border-top: 1px solid #C2C4CC;\\r\\n overflow: hidden;\\r\\n position: fixed;\\r\\n top: 60px;\\r\\n width: 300px !important;\\r\\n z-index: 1009;\\r\\n bottom: 0;\\r\\n right: -300px;\\r\\n}\\r\\n\\r\\n#right-sidebar-notifications.sidebar-open {\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n#right-sidebar-notifications.sidebar-open.sidebar-top {\\r\\n top: 0;\\r\\n border-top: none;\\r\\n}\\r\\n\\r\\n.vertical-align-middle {\\r\\n display: inline-block;\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.import-status-icon {\\r\\n display: inline-block;\\r\\n width: 15px;\\r\\n height: 15px;\\r\\n}\\r\\n\\r\\ninput[type=\\\"radio\\\"] {\\r\\n vertical-align: bottom;\\r\\n}\\r\\n\\r\\ninput[type=\\\"checkbox\\\"] {\\r\\n vertical-align: bottom;\\r\\n}\\r\\n\\r\\n.o-btn {\\r\\n display: inline-block;\\r\\n width: 100%;\\r\\n padding: 25px 0;\\r\\n border-radius: 2px;\\r\\n color: $fp-purple;\\r\\n border-color: $border-color;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.o-btn:hover {\\r\\n background-color: #f4f4f5;\\r\\n border-color: $border-color;\\r\\n}\\r\\n\\r\\n.save-report-modal-helper-text {\\r\\n color: $text-color;\\r\\n margin-bottom: 5px;\\r\\n font-size: 10px;\\r\\n}\\r\\n\\r\\noi-select .select-dropdown-optgroup-option.active:not(.disabled) {\\r\\n background-color: #f5f5f5;\\r\\n color: $text-color;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.no-data-to-display-message {\\r\\n color: #f0f0f0;\\r\\n font-size: 50px;\\r\\n padding-top: 60px;\\r\\n}\\r\\n\\r\\n.swal-confirm-button {\\r\\n background-color: $fp-purple !important;\\r\\n color: white !important;\\r\\n box-shadow: none !important;\\r\\n border-radius: 4px;\\r\\n border: 1px $fp-purple solid !important;\\r\\n}\\r\\n\\r\\n.swal-confirm-button:hover {\\r\\n background-color: #261769 !important;\\r\\n border-color: #261769;\\r\\n color: $delinea-green !important;\\r\\n}\\r\\n\\r\\n.swal-cancel-button {\\r\\n background-color: white !important;\\r\\n color: #121321 !important;\\r\\n box-shadow: none !important;\\r\\n border-radius: 4px;\\r\\n border: 1px #291971 solid !important;\\r\\n}\\r\\n\\r\\n.swal-cancel-button:hover {\\r\\n background-color: darken(white, 4%) !important;\\r\\n border-color: #291971;\\r\\n color: #121321 !important;\\r\\n}\\r\\n\\r\\n\\r\\n.swal2-modal {\\r\\n font-family: 'Manrope', 'Manrope', Helvetica, Arial, sans-serif;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.swal2-container {\\r\\n z-index: 99999;\\r\\n}\\r\\n\\r\\n.btn-group button {\\r\\n outline: none !important;\\r\\n}\\r\\n\\r\\n.modal-body-no-side-padding {\\r\\n padding-top: 20px;\\r\\n padding-bottom: 30px;\\r\\n}\\r\\n\\r\\n.overflow-visible {\\r\\n overflow: visible !important;\\r\\n}\\r\\n\\r\\n.dropdown-menu-text-color {\\r\\n color: #333;\\r\\n}\\r\\n\\r\\n.no-margin {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.btn-modalClose-white {\\r\\n color: #f2f2f2;\\r\\n background-color: transparent;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.btn-modalClose-white:hover {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.zendesk-modal-header {\\r\\n background-color: #03363D;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.zendesk-status-new {\\r\\n color: #F5CA00;\\r\\n}\\r\\n\\r\\n.zendesk-status-open {\\r\\n color: #E82A2A;\\r\\n}\\r\\n\\r\\n.zendesk-status-pending {\\r\\n color: #59BBE0;\\r\\n}\\r\\n\\r\\n.zendesk-status-solved {\\r\\n color: #828282;\\r\\n}\\r\\n\\r\\n.jira-cat-toDo {\\r\\n color: #4A6785;\\r\\n}\\r\\n\\r\\n.jira-cat-inProgress {\\r\\n color: #FFD351;\\r\\n}\\r\\n\\r\\n.jira-cat-done {\\r\\n color: #14892C\\r\\n}\\r\\n\\r\\n.jira-no-cat {\\r\\n color: #CCCCCC;\\r\\n}\\r\\n\\r\\n.fixed-btn-width {\\r\\n width: 50px;\\r\\n}\\r\\n\\r\\n.media-body {\\r\\n width: inherit;\\r\\n}\\r\\n\\r\\n.wrapper-content {\\r\\n min-height: 800px;\\r\\n}\\r\\n\\r\\n.drag-drop-pane {\\r\\n border: 2px dashed lightgray;\\r\\n border-radius: 4px;\\r\\n text-align: center;\\r\\n color: #A9B2BE;\\r\\n}\\r\\n\\r\\n.drag-drop-pane-open {\\r\\n border: 2px dashed lightgray;\\r\\n}\\r\\n\\r\\n.drag-drop-pane-active {\\r\\n border: 2px dashed gray;\\r\\n}\\r\\n\\r\\n.ibox-clickable {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.ibox-clickable:hover {\\r\\n cursor: pointer;\\r\\n background-color: #FAFBFC;\\r\\n}\\r\\n\\r\\n.ibox-list-item {\\r\\n padding: 15px 20px 15px 20px;\\r\\n border-top: solid 1px #C2C4CC;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.ibox-list-item > .pull-left {\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.ibox-muted-text {\\r\\n color: #d0d0d0\\r\\n}\\r\\n\\r\\n.tracking-template-table-physical-name {\\r\\n font-size: 10px;\\r\\n padding-left: 10px;\\r\\n color: darkgray;\\r\\n}\\r\\n\\r\\n.k-filtercell > .k-operator-hidden > label {\\r\\n font-weight: 400;\\r\\n padding-right: 15px;\\r\\n margin-bottom: -5px;\\r\\n}\\r\\n\\r\\n.k-filtercell > .k-operator-hidden > label:checked {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.k-filtercell > .k-operator-hidden > label > input {\\r\\n margin-left: 3px;\\r\\n}\\r\\n\\r\\n.new-record-list-item {\\r\\n border-left: 3px solid #5b91c0;\\r\\n}\\r\\n\\r\\n.saved-report-filter-counter {\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.text-toggle-on-color {\\r\\n color: $fp-purple;\\r\\n}\\r\\n\\r\\n.vAccordion--default v-pane-header {\\r\\n border-bottom: 1px solid $border-color;\\r\\n}\\r\\n\\r\\n.vAccordion--default v-pane-content > div {\\r\\n padding-bottom: 0;\\r\\n border-bottom: solid 1px $border-color;\\r\\n}\\r\\n\\r\\n.vAccordion--default v-pane-header::after, .vAccordion--default v-pane-header::before {\\r\\n background-color: $text-color; \\r\\n}\\r\\n\\r\\nv-pane-header::after {\\r\\n left: 20px !important;\\r\\n}\\r\\n\\r\\nv-pane-header::before {\\r\\n left: 20px !important;\\r\\n}\\r\\n\\r\\n.vAccordion--default v-pane-header {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.custom-vPane-header {\\r\\n padding: 20px;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\nlabel[disabled] {\\r\\n cursor: pointer;\\r\\n opacity: .65;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\na[disabled] {\\r\\n cursor: pointer;\\r\\n opacity: .65;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.list-item-row-button {\\r\\n height: 100%;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n right: 0;\\r\\n color: $text-color;\\r\\n background-color: #fff;\\r\\n border: none;\\r\\n border-left: solid 1px;\\r\\n border-color: #C2C4CC;\\r\\n width: 35px;\\r\\n padding: 4px;\\r\\n outline: none;\\r\\n}\\r\\n\\r\\n.list-item-row-button:hover {\\r\\n background-color: #e0e0e0;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.saved-message {\\r\\n background-color: transparent;\\r\\n border-color: transparent;\\r\\n cursor: default;\\r\\n pointer-events: none;\\r\\n color: #2ab27b;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.fadein,\\r\\n.fadeout {\\r\\n -webkit-transition: all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.0s;\\r\\n -moz-transition: all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.0s;\\r\\n -o-transition: all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.0s;\\r\\n transition: all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.0s;\\r\\n}\\r\\n\\r\\n.fadein.ng-hide-remove,\\r\\n.fadeout.ng-hide-add.ng-hide-add-active {\\r\\n opacity: 0;\\r\\n}\\r\\n\\r\\n.fadeout.ng-hide-add,\\r\\n.fadein.ng-hide-remove.ng-hide-remove-active {\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n\\r\\n.criteria-drop {\\r\\n padding: 10px 6px;\\r\\n width: 100%;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n -webkit-appearance: none;\\r\\n -webkit-box-shadow: none;\\r\\n -moz-appearance: none;\\r\\n background: white url('../Content/Images/SVG/icons8-Sort Down.svg') no-repeat 99% center;\\r\\n}\\r\\n\\r\\nselect:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.criteria-number {\\r\\n display: block;\\r\\n padding: 10px 6px;\\r\\n width: 90px;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n -webkit-appearance: none;\\r\\n -webkit-box-shadow: none;\\r\\n -moz-appearance: none;\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.criteria-text {\\r\\n display: block;\\r\\n padding: 10px 6px;\\r\\n width: 100%;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n -webkit-appearance: none;\\r\\n -webkit-box-shadow: none;\\r\\n -moz-appearance: none;\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.form-inline .criteria-time input.form-control {\\r\\n width: 50px;\\r\\n height: 39px;\\r\\n padding: 10px 6px;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\n.criteria-drop-date-pick {\\r\\n padding: 10px 6px;\\r\\n width: 100%;\\r\\n border: 1px solid #C2C4CC;\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\n.criteria-drop:focus {\\r\\n border-color: #C2C4CC !important;\\r\\n outline: 0;\\r\\n}\\r\\n\\r\\n.criteria-drop[disabled] {\\r\\n cursor: not-allowed;\\r\\n}\\r\\n\\r\\n.criteria-drop[disabled], .criteria-drop[readonly] {\\r\\n background-color: #eee;\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n.criteria-attached-button {\\r\\n padding: 8px;\\r\\n padding-bottom: 9px;\\r\\n border: 1px solid #C2C4CC;\\r\\n}\\r\\n\\r\\n.security-object-condition-container {\\r\\n padding: 6px 7px;\\r\\n border-radius: 6px;\\r\\n border: solid 1px #C2C4CC;\\r\\n background-color: #fafafa;\\r\\n border-left: solid #291972;\\r\\n}\\r\\n\\r\\n.disable-pointer-events {\\r\\n pointer-events: none;\\r\\n cursor: default;\\r\\n opacity: .40;\\r\\n}\\r\\n\\r\\n.help-icon-modal-header {\\r\\n font-size: 12px;\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.k-popup .k-list .k-state-focused {\\r\\n border-radius: 0;\\r\\n -webkit-box-shadow: none;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.k-popup .k-list .k-state-selected {\\r\\n border-radius: 0;\\r\\n -webkit-box-shadow: none;\\r\\n box-shadow: none;\\r\\n background-color: #ebebeb;\\r\\n color: $text-color;\\r\\n border: solid 1px #121321;\\r\\n}\\r\\n\\r\\n.k-popup .k-list .k-state-hover .k-state-selected {\\r\\n border-radius: 0;\\r\\n -webkit-box-shadow: none;\\r\\n box-shadow: none;\\r\\n color: $text-color;\\r\\n}\\r\\n\\r\\n.k-popup .k-list .k-state-hover {\\r\\n border-radius: 0;\\r\\n -webkit-box-shadow: none;\\r\\n background-color: #f5f5f5;\\r\\n cursor: pointer;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.k-calendar td.k-state-selected .k-link {\\r\\n border-color: $fp-purple;\\r\\n background-color: $fp-purple;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.k-popup.k-calendar-container, .k-popup.k-list-container {\\r\\n padding: 0px;\\r\\n border-width: 0px;\\r\\n}\\r\\n\\r\\n.k-dropdown-wrap.k-state-active.k-state-border-down, .k-numeric-wrap .k-link.k-state-selected, .k-pager-numbers.k-state-expanded .k-current-page .k-link, .k-picker-wrap.k-state-active.k-state-border-down {\\r\\n -webkit-box-shadow: none;\\r\\n box-shadow: none;\\r\\n border-radius: 0px;\\r\\n}\\r\\n\\r\\n.k-list-filter {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.btn-ax-security-designer {\\r\\n text-align: left;\\r\\n font-weight: 600;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.centered-btn-ax-security-designer {\\r\\n text-align: center;\\r\\n font-weight: 600;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.centered-text-left-btn-ax-security-designer {\\r\\n text-align: center;\\r\\n font-weight: 600;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.btn-block {\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.security-designer-card {\\r\\n /*display: inherit;*/\\r\\n border-radius: 4px;\\r\\n border: 1px solid #C2C4CC;\\r\\n padding: 30px 20px;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n margin-bottom: 8px;\\r\\n}\\r\\n\\r\\n.large-badge {\\r\\n padding: 2px 7px;\\r\\n border-radius: 360px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.large-badge:empty {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.ax-roles-badge-color {\\r\\n background-color: $fp-purple;\\r\\n color: white;\\r\\n border: 1px solid $text-color;\\r\\n}\\r\\n\\r\\n.ax-duties-badge-color {\\r\\n background-color: $fp-label-purple-bg;\\r\\n color: $fp-label-purple-text;\\r\\n border: 1px solid $fp-label-purple-border;\\r\\n}\\r\\n\\r\\n.ax-tables-badge-color {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n}\\r\\n\\r\\n.ax-table-fields-badge-color {\\r\\n background-color: $fp-label-green-bg;\\r\\n color: $fp-label-green-text;\\r\\n border: 1px solid $fp-label-green-border;\\r\\n}\\r\\n\\r\\n.ax-privileges-badge-color {\\r\\n background-color: $fp-label-blue-bg;\\r\\n color: $fp-label-blue-text;\\r\\n border: 1px solid $fp-label-blue-border;\\r\\n}\\r\\n\\r\\n.ax-subroles-badge-color {\\r\\n background-color: $fp-label-yellow-bg;\\r\\n color: $fp-label-yellow-text;\\r\\n border: 1px solid $fp-label-yellow-border;\\r\\n}\\r\\n\\r\\n.ax-menuitems-badge-color {\\r\\n background-color: $fp-label-gray-bg;\\r\\n color: $fp-label-gray-text;\\r\\n border: 1px solid $fp-label-gray-border;\\r\\n}\\r\\n\\r\\n.ax-dataentities-badge-color {\\r\\n background-color: $fp-label-blue-bg;\\r\\n color: $fp-label-blue-text;\\r\\n border: 1px solid $fp-label-blue-border;\\r\\n}\\r\\n\\r\\n.ax-serviceoperations-badge-color {\\r\\n background-color: $fp-label-pink-bg;\\r\\n color: $fp-label-pink-text;\\r\\n border: 1px solid $fp-label-pink-border;\\r\\n}\\r\\n\\r\\n.btn-success {\\r\\n background-color: #27ae60;\\r\\n border-color: #27ae60;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-success:disabled, .btn-success:disabled:hover {\\r\\n background-color: #27ae60;\\r\\n border-color: #27ae60;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-success:hover, .btn-success:active, .btn-success:focus {\\r\\n background-color: #25a75c;\\r\\n border-color: #25a75c;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n/*for font smoothing*/\\r\\n.icons8, [class^=\\\"icons8-\\\"]:before {\\r\\n font-weight: inherit;\\r\\n}\\r\\n\\r\\n.rounded-search-box {\\r\\n border-radius: 4px;\\r\\n max-width: 158px;\\r\\n display: inline-block;\\r\\n border-color: #4B4F66;\\r\\n}\\r\\n\\r\\n.inline-grid-dropdown {\\r\\n padding: 10px 2px;\\r\\n width: 100%;\\r\\n border: solid 1px #dbdbdb;\\r\\n -webkit-appearance: none;\\r\\n -webkit-box-shadow: none;\\r\\n -moz-appearance: none;\\r\\n background: transparent url('../Content/Images/SVG/icons8-Sort Down.svg') no-repeat 99% center;\\r\\n}\\r\\n\\r\\n.pagination {\\r\\n margin: 10px 0;\\r\\n}\\r\\n\\r\\n.emptyStateMessage {\\r\\n text-align: center;\\r\\n color: #A9B2BE;\\r\\n margin-top: 100px;\\r\\n}\\r\\n\\r\\n.large-transparent-dropdown-header {\\r\\n border: none;\\r\\n background-color: transparent;\\r\\n font-size: 20px;\\r\\n font-weight: 600;\\r\\n outline: none;\\r\\n padding: 6px;\\r\\n padding-right: 22px;\\r\\n -webkit-appearance: none;\\r\\n -webkit-box-shadow: none;\\r\\n -moz-appearance: none;\\r\\n background: transparent url('../Content/Images/SVG/icons8-Sort Down.svg') no-repeat 99% center;\\r\\n}\\r\\n\\r\\n.large-transparent-dropdown-header:hover {\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.large-transparent-dropdown-header:disabled {\\r\\n opacity: 0.65;\\r\\n}\\r\\n\\r\\n.security-designer-top-page-break {\\r\\n margin-top: 0px;\\r\\n border-color: #d3d3d3;\\r\\n}\\r\\n\\r\\n.netSuite-passedValidation {\\r\\n text-decoration: line-through;\\r\\n opacity: 0.4;\\r\\n}\\r\\n\\r\\n.netSuiteSecurityDesignerValidation {\\r\\n font-size: 25px;\\r\\n padding-left: 6px;\\r\\n margin-bottom: -30px;\\r\\n margin-left: -45px;\\r\\n}\\r\\n\\r\\n.disable-list-during-load {\\r\\n pointer-events: none;\\r\\n opacity: .8;\\r\\n}\\r\\n\\r\\n.is-modified-security-desiger-card {\\r\\n border-left: $fp-label-orange-border 5px solid;\\r\\n}\\r\\n\\r\\n.is-modified-security-designer-button {\\r\\n border-left: 4px solid $fp-label-orange-border !important;\\r\\n}\\r\\n\\r\\n.is-custom-security-desiger-card {\\r\\n border-left: $fp-label-green-border 5px solid;\\r\\n}\\r\\n\\r\\n.permission-level-label {\\r\\n text-transform: uppercase;\\r\\n font-size: 10px;\\r\\n font-weight: 700;\\r\\n padding-left: 8px;\\r\\n}\\r\\n\\r\\n.steps-completed-counter {\\r\\n color: white;\\r\\n white-space: nowrap;\\r\\n padding-left: 4px;\\r\\n padding-right: 4px;\\r\\n}\\r\\n\\r\\n.progress-bar[aria-valuenow=\\\"0\\\"] > .steps-completed-counter {\\r\\n color: #333;\\r\\n}\\r\\n\\r\\n.center-change-dot {\\r\\n text-align: center;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.action-revoke-security-designer-card {\\r\\n opacity: 0.5;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.center-icon {\\r\\n position: absolute;\\r\\n top: 50%;\\r\\n left: 50%;\\r\\n height: 50%;\\r\\n transform: translate(-50%, -50%);\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.center-info {\\r\\n position: absolute;\\r\\n top: 45%;\\r\\n left: 50%;\\r\\n height: 50%;\\r\\n transform: translate(-50%, -50%);\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.block-display {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.loading-text-for-spinner {\\r\\n display: flex;\\r\\n justify-content: center;\\r\\n padding-top: 8vh;\\r\\n}\\r\\n\\r\\n.center-cells {\\r\\n display: flex;\\r\\n justify-content: center;\\r\\n}\\r\\n\\r\\n.vcenter {\\r\\n position: absolute;\\r\\n left: 50%;\\r\\n top: 50%;\\r\\n}\\r\\n\\r\\n.tooltip-inner {\\r\\n word-break: break-word;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.security-designer-modifications-more-details {\\r\\n margin-right: -16px;\\r\\n margin-top: 6px;\\r\\n}\\r\\n\\r\\n\\r\\n.dashboard_card {\\r\\n /*margin-bottom: 16px;*/\\r\\n /*border: 1px solid #ddd;*/\\r\\n border-radius: 6px;\\r\\n background-color: white;\\r\\n box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.05);\\r\\n}\\r\\n\\r\\n.dashboard_card header {\\r\\n /*background: #f4f4f4;*/\\r\\n border-bottom: 1px solid #ddd;\\r\\n color: $fp-purple;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.dashboard_card header {\\r\\n border-top-left-radius: 6px;\\r\\n border-top-right-radius: 6px;\\r\\n position: relative;\\r\\n font-size: 16px;\\r\\n height: 45px;\\r\\n line-height: 45px;\\r\\n cursor: move;\\r\\n}\\r\\n\\r\\n.dashboard_card .dashboard_card_content {\\r\\n -webkit-align-items: center;\\r\\n -ms-flex-align: center;\\r\\n align-items: center;\\r\\n display: -webkit-flex;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-flex-direction: row;\\r\\n -ms-flex-direction: row;\\r\\n flex-direction: row;\\r\\n position: relative;\\r\\n background-color: #fff;\\r\\n border-bottom-left-radius: 6px;\\r\\n border-bottom-right-radius: 6px;\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\n.dashboard_card_icon {\\r\\n font-size: 40px;\\r\\n /*margin-bottom: 10px;*/\\r\\n color: #2675b3;\\r\\n}\\r\\n\\r\\n.dashboard_tile {\\r\\n /*color: #fff;*/\\r\\n /*background-color: #04476C;*/\\r\\n height: 102.5px;\\r\\n padding-top: 18px;\\r\\n /*border-radius: 6px;*/\\r\\n}\\r\\n\\r\\n.dashboard_tile_count {\\r\\n font-size: 28px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.dashboard_tile_percent {\\r\\n font-size: 14px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.card_selection_pane_icon {\\r\\n font-size: 26px;\\r\\n color: #5191C2;\\r\\n}\\r\\n\\r\\n/*[class$=\\\"-creditgroup\\\"] {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\n.card-selection-pane {\\r\\n position: absolute;\\r\\n right: 0px;\\r\\n top: 0px;\\r\\n width: 380px;\\r\\n height: 100%;\\r\\n background-color: #fff;\\r\\n border-left: 1px solid #C2C4CC;\\r\\n z-index: 1;\\r\\n bottom: 0;\\r\\n overflow: auto;\\r\\n overflow-x: hidden;\\r\\n /*margin-bottom: 40px;*/\\r\\n}\\r\\n\\r\\n\\r\\n.item {\\r\\n width: 500px;\\r\\n /*height: 200px;*/\\r\\n /*margin: 10px;*/\\r\\n /*background: pink;*/\\r\\n}\\r\\n\\r\\n.tile {\\r\\n width: 240px;\\r\\n /*margin: 10px;*/\\r\\n}\\r\\n\\r\\n/*.packery-drop-placeholder {\\r\\n outline: 1px dashed #ddd;\\r\\n outline-offset: -6px;\\r\\n -webkit-transition: -webkit-transform 0.1s;\\r\\n transition: transform 0.1s;\\r\\n}*/\\r\\n\\r\\n.is-pointer-down.is-dragging {\\r\\n z-index: 2;\\r\\n}\\r\\n\\r\\n.margin-bottom-last-card-selection {\\r\\n border-bottom: solid 1px #C2C4CC;\\r\\n margin-bottom: 30px;\\r\\n}\\r\\n\\r\\n.detailed-label {\\r\\n margin-left: 3px;\\r\\n opacity: 0.75;\\r\\n font-size: 9px;\\r\\n}\\r\\n\\r\\n.mini-navbar .detailed-label {\\r\\n display: block !important;\\r\\n}\\r\\n\\r\\n.affected-objects-item {\\r\\n margin-left: 2.5em;\\r\\n}\\r\\n\\r\\n.dropdown-on-top {\\r\\n z-index: 99999999999;\\r\\n}\\r\\n\\r\\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:focus, .dropdown-menu > .disabled > a:hover {\\r\\n color: #dadada;\\r\\n}\\r\\n\\r\\n.popover .arrow {\\r\\n visibility: hidden;\\r\\n}\\r\\n\\r\\n#AADExchange {\\r\\n background-image: url('../Content/Images/ApplicationLogos/Microsoft_logo.png');\\r\\n background-repeat: no-repeat;\\r\\n background-size: 45px;\\r\\n background-position: 4px;\\r\\n}\\r\\n\\r\\n#FastpathAccount {\\r\\n background-image: url(../Content/Images/SVG/fastpath-white-mono.svg);\\r\\n background-repeat: no-repeat;\\r\\n background-size: 42px;\\r\\n background-position: 5px;\\r\\n}\\r\\n\\r\\n.FastpathAccount {\\r\\n background-image: url(../Content/Images/SVG/fastpath-white-mono.svg);\\r\\n background-repeat: no-repeat;\\r\\n background-size: 42px;\\r\\n background-position: 5px;\\r\\n}\\r\\n\\r\\n.AADExchange {\\r\\n background-image: url('../Content/Images/ApplicationLogos/Microsoft_logo.png');\\r\\n background-repeat: no-repeat;\\r\\n background-size: 45px;\\r\\n background-position: 4px;\\r\\n}\\r\\n\\r\\n.SAML2 {\\r\\n background-image: url('../Content/Images/ApplicationLogos/SAML-logo.svg');\\r\\n background-repeat: no-repeat;\\r\\n background-size: 45px;\\r\\n background-position: 4px;\\r\\n}\\r\\n\\r\\n.user-type-selection {\\r\\n color: #434343;\\r\\n padding: 18px 60px;\\r\\n font-size: 12px;\\r\\n border-radius: 3px;\\r\\n cursor: pointer;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.user-type-selection:hover {\\r\\n background-color: rgba(0, 0, 0, 0.11);\\r\\n}\\r\\n\\r\\n.user-type-selection.active {\\r\\n color: #fafafa;\\r\\n background-color: $fp-purple;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.popover {\\r\\n font-size: 12px;\\r\\n border: solid 1px #eeeeee;\\r\\n}\\r\\n\\r\\n.popover-title {\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.side-margin-15 {\\r\\n margin: 0px 15px;\\r\\n}\\r\\n\\r\\n.side-margin-9 {\\r\\n margin: 0px 9px;\\r\\n}\\r\\n\\r\\n.text-align-left {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.row_cell {\\r\\n flex: 1\\r\\n}\\r\\n\\r\\n.row--top {\\r\\n align-items: flex-start\\r\\n}\\r\\n\\r\\n.row_cell--center {\\r\\n align-self: center\\r\\n}\\r\\n\\r\\n.row-flex {\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.row-template-bottom-padding {\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.pill-trash-spacing {\\r\\n margin-left: 0.75em;\\r\\n}\\r\\n\\r\\n.long-and-break-word {\\r\\n flex: 1;\\r\\n /*white-space: nowrap;*/\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.break-word {\\r\\n word-wrap: break-word;\\r\\n}\\r\\n\\r\\n.truncate-text {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n display: -webkit-box;\\r\\n -webkit-line-clamp: 2;\\r\\n -webkit-box-orient: vertical;\\r\\n}\\r\\n\\r\\n.max-w-87 {\\r\\n max-width: 87%;\\r\\n}\\r\\n/* ^ for panels with items in table / makes margins look equal and text doesn't extend under scrollbar */\\r\\n\\r\\n.deployed-badge {\\r\\n background-color: transparent;\\r\\n border: solid 1px #e6e6e6;\\r\\n color: #c3c3c3;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.deployed-disabled-button {\\r\\n background-color: transparent;\\r\\n border: solid 1px #e6e6e6;\\r\\n color: #c3c3c3;\\r\\n}\\r\\n\\r\\n.dimmed {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.dimmed:after {\\r\\n content: \\\" \\\";\\r\\n z-index: 10;\\r\\n display: block;\\r\\n position: absolute;\\r\\n height: 100%;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n background: rgba(0, 0, 0, 0.5);\\r\\n}\\r\\n\\r\\n.chart-details-quick-view {\\r\\n padding: 50px 16px 35px 35px;\\r\\n}\\r\\n\\r\\n.group-by-listview-height {\\r\\n height: 631px;\\r\\n}\\r\\n\\r\\n.select-listview-height-paged {\\r\\n height: 571px;\\r\\n}\\r\\n\\r\\n.select-listview-height {\\r\\n height: 622px;\\r\\n}\\r\\n\\r\\n.list-view-body.paged {\\r\\n height: 599px;\\r\\n}\\r\\n\\r\\n.list-view-body.filter-tab {\\r\\n height: 624px;\\r\\n}\\r\\n\\r\\n.list-view-body.filter-tab.paged {\\r\\n height: 547px;\\r\\n}\\r\\n\\r\\n.list-view-body.filter-tab.dropdown-filter {\\r\\n height: 615px;\\r\\n}\\r\\n\\r\\n.list-view-body.filter-tab.dropdown-filter.paged {\\r\\n height: 564px;\\r\\n}\\r\\n\\r\\n.my-reviews-standard-height-listview {\\r\\n background: white;\\r\\n height: 648px;\\r\\n}\\r\\n\\r\\n.review-status-badge {\\r\\n margin-left: auto;\\r\\n margin-top: -50px;\\r\\n}\\r\\n\\r\\n.review-status-badge-complete {\\r\\n color: gray;\\r\\n}\\r\\n\\r\\n.review-status-capitalized {\\r\\n text-transform: capitalize;\\r\\n}\\r\\n\\r\\n.review-assignment-tile {\\r\\n padding: 10px;\\r\\n /*width: 200px;*/\\r\\n background: white;\\r\\n /*display: inline-block;*/\\r\\n position: relative;\\r\\n border: solid 1px $border-color;\\r\\n}\\r\\n\\r\\n.review-assignment-icon-circle {\\r\\n border-radius: 90px;\\r\\n padding: 5px;\\r\\n border: solid 1px #e8e8e8;\\r\\n background-color: #f8f8f8;\\r\\n}\\r\\n\\r\\n.review-assignment-icon-circle.review-assignment-clickable.text-not-selected {\\r\\n border-color: #b3b3b3;\\r\\n}\\r\\n\\r\\n.text-success.review-assignment-icon-circle {\\r\\n border-color: #27ae60;\\r\\n}\\r\\n\\r\\n.text-danger.review-assignment-icon-circle {\\r\\n border-color: #e74c3c;\\r\\n}\\r\\n\\r\\n.review-assignment_Risk,\\r\\n.review-assignment_Risk {\\r\\n color: #FCC201;\\r\\n}\\r\\n\\r\\n.review-assignment_Roles,\\r\\n.review-assignment_SecurityRole {\\r\\n color: #8550B3\\r\\n}\\r\\n\\r\\n.review-assignment_Products,\\r\\n.review-assignment_Product {\\r\\n color: #ADBACB\\r\\n}\\r\\n\\r\\n.review-assignment_Manager {\\r\\n color: #36BFCE\\r\\n}\\r\\n\\r\\n.review-assignment_BusinessProcess {\\r\\n color: #E22159\\r\\n}\\r\\n\\r\\n.review-assignment-icons8 {\\r\\n /*color: white;*/\\r\\n font-size: 22px;\\r\\n font-weight: 300;\\r\\n}\\r\\n\\r\\n.review-assignment-tile-container {\\r\\n /*color: darkgray;*/\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.review-assignment-tile:hover {\\r\\n background: #e0e0e0;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.review-assignment-tile.active-tile {\\r\\n background: #e0e0e0;\\r\\n border: solid 1px #C2C4CC;\\r\\n /*cursor: pointer;*/\\r\\n}\\r\\n\\r\\n.review-tile-counter {\\r\\n position: absolute;\\r\\n bottom: 5px;\\r\\n width: 100%;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.list-view-no-hover > list-item:hover {\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.list-view-height {\\r\\n min-height: 700px;\\r\\n}\\r\\n\\r\\n.text-transparent {\\r\\n color: transparent;\\r\\n}\\r\\n\\r\\n.review-assignment-clickable.text-not-selected:hover {\\r\\n cursor: pointer;\\r\\n border-color: #cfcfcf;\\r\\n}\\r\\n\\r\\n.flexbox_container {\\r\\n height: 100%;\\r\\n display: -ms-flexbox;\\r\\n display: -webkit-box;\\r\\n display: -moz-box;\\r\\n display: -ms-box;\\r\\n display: box;\\r\\n -ms-flex-direction: row;\\r\\n -webkit-box-orient: horizontal;\\r\\n -moz-box-orient: horizontal;\\r\\n -ms-box-orient: horizontal;\\r\\n box-orient: horizontal;\\r\\n}\\r\\n\\r\\n.flexbox_icon_slot {\\r\\n width: 60px;\\r\\n -ms-flex: 0 40px;\\r\\n -webkit-box-flex: 0;\\r\\n -moz-box-flex: 0;\\r\\n -ms-box-flex: 0;\\r\\n box-flex: 0;\\r\\n}\\r\\n\\r\\n\\r\\n.flexbox_content_slot {\\r\\n -ms-flex: 1;\\r\\n -webkit-box-flex: 1;\\r\\n -moz-box-flex: 1;\\r\\n -ms-box-flex: 1;\\r\\n box-flex: 1;\\r\\n}\\r\\n\\r\\n.text-status-light {\\r\\n color: #7fb3e0;\\r\\n}\\r\\n\\r\\n.text-not-selected {\\r\\n color: #b3b3b3;\\r\\n}\\r\\n\\r\\n/*Grid-specific height settings*/\\r\\n#JiraTicketsGrid .k-grid-content {\\r\\n min-height: 330px;\\r\\n}\\r\\n\\r\\n#ZenDeskTicketsGrid .k-grid-content {\\r\\n min-height: 330px;\\r\\n}\\r\\n\\r\\n.revoked-role-offset {\\r\\n margin-right: 50%;\\r\\n}\\r\\n\\r\\n.loading-overlay span {\\r\\n position: relative;\\r\\n top: 50%;\\r\\n left: 50%;\\r\\n}\\r\\n\\r\\nlist-item.selected-item {\\r\\n background-color: #e0e0e0;\\r\\n}\\r\\n\\r\\n/*Container for non-criteria select elements with loading spinner*/\\r\\n.select-spinner-container {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.input-group-unstyled .input-group-addon {\\r\\n border: 0px;\\r\\n}\\r\\n\\r\\n@media (min-width: 992px) {\\r\\n .modal-xl {\\r\\n width: 1200px;\\r\\n }\\r\\n}\\r\\n\\r\\n/*Give kendo dropdowns using form control class similar appearance to standard select controls*/\\r\\n.form-control.input-sm span.k-dropdown-wrap {\\r\\n height: 100%\\r\\n}\\r\\n\\r\\n/* Flexbox */\\r\\n\\r\\n.flex-inline {\\r\\n display: -webkit-inline-box;\\r\\n display: -ms-inline-flexbox;\\r\\n display: inline-flex !important;\\r\\n}\\r\\n\\r\\n.flex-center {\\r\\n display: -webkit-box;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-box-align: center;\\r\\n -ms-flex-align: center;\\r\\n align-items: center;\\r\\n -webkit-box-pack: center;\\r\\n -ms-flex-pack: center;\\r\\n justify-content: center;\\r\\n flex-direction: row;\\r\\n}\\r\\n\\r\\n.flex-vcenter {\\r\\n display: -webkit-box;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-box-align: center;\\r\\n -ms-flex-align: center;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.flex-between {\\r\\n display: -webkit-box;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-box-pack: justify;\\r\\n -ms-flex-pack: justify;\\r\\n justify-content: space-between;\\r\\n flex-direction: row;\\r\\n}\\r\\n\\r\\n.flex-start {\\r\\n display: -webkit-box;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-box-orient: horizontal;\\r\\n -webkit-box-direction: normal;\\r\\n -ms-flex-direction: row;\\r\\n flex-direction: row;\\r\\n -webkit-box-align: start;\\r\\n -ms-flex-align: start;\\r\\n align-items: flex-start;\\r\\n}\\r\\n\\r\\n.flex-inline {\\r\\n display: -webkit-inline-box;\\r\\n display: -ms-inline-flexbox;\\r\\n display: inline-flex;\\r\\n}\\r\\n\\r\\n.flex-end {\\r\\n display: -webkit-box;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-box-pack: justify;\\r\\n -ms-flex-pack: justify;\\r\\n justify-content: flex-end;\\r\\n flex-direction: row;\\r\\n}\\r\\n\\r\\n.flex-wrap {\\r\\n display: -webkit-box;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -ms-flex-wrap: wrap;\\r\\n flex-wrap: wrap;\\r\\n}\\r\\n\\r\\n.flex-column {\\r\\n display: -webkit-box;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -webkit-box-orient: vertical;\\r\\n -webkit-box-direction: normal;\\r\\n -ms-flex-direction: column;\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n.flex-equal {\\r\\n -webkit-box-flex: 1;\\r\\n -ms-flex: 1;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n/* Word Break */\\r\\n\\r\\n.break-words {\\r\\n overflow-wrap: break-word;\\r\\n word-wrap: break-word;\\r\\n -ms-word-break: break-all;\\r\\n word-break: break-all;\\r\\n word-break: break-word;\\r\\n -ms-hyphens: auto;\\r\\n -moz-hyphens: auto;\\r\\n -webkit-hyphens: auto;\\r\\n hyphens: auto;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","export default __webpack_public_path__ + \"images/ALA_Logo.svg\";","export default __webpack_public_path__ + \"images/AcumaticaSVG.svg\";","export default __webpack_public_path__ + \"images/AribaLogoSVG.svg\";","export default __webpack_public_path__ + \"images/AuditBoardLogo.svg\";","export default __webpack_public_path__ + \"images/AzureActiveDirectory.svg\";","export default __webpack_public_path__ + \"images/AzureDevOpsLogoSVG.svg\";","export default __webpack_public_path__ + \"images/AzureSVG.svg\";","export default __webpack_public_path__ + \"images/CoupaSVG.svg\";","export default __webpack_public_path__ + \"images/Dynamics365SVG.svg\";","export default __webpack_public_path__ + \"images/Dynamics365SalesSVG.svg\";","export default __webpack_public_path__ + \"images/DynamicsAXSVG.svg\";","export default __webpack_public_path__ + \"images/DynamicsGPSVG.svg\";","export default __webpack_public_path__ + \"images/DynamicsNAVSVG.svg\";","export default __webpack_public_path__ + \"images/DynamicsNav2019BusinessCentral.svg\";","export default __webpack_public_path__ + \"images/DynamicsSLSVG.svg\";","export default __webpack_public_path__ + \"images/FreshserviceLogo.svg\";","export default __webpack_public_path__ + \"images/Dynamics365CustomerEngagementIMTile.svg\";","export default __webpack_public_path__ + \"images/Dynamics365IMTile.svg\";","export default __webpack_public_path__ + \"images/DynamicsAXIMTile.svg\";","export default __webpack_public_path__ + \"images/DynamicsGPIMTile.svg\";","export default __webpack_public_path__ + \"images/DynamicsNAVIMTile.svg\";","export default __webpack_public_path__ + \"images/NetSuiteIMTile.svg\";","export default __webpack_public_path__ + \"images/OracleCloudIMTile.svg\";","export default __webpack_public_path__ + \"images/OracleIMTile.svg\";","export default __webpack_public_path__ + \"images/PeopleSoftIMTile.svg\";","export default __webpack_public_path__ + \"images/SAPIMTile.svg\";","export default __webpack_public_path__ + \"images/UniversalProduct.svg\";","export default __webpack_public_path__ + \"images/IntacctLogoSVG.svg\";","export default __webpack_public_path__ + \"images/JiraLogoSVG.svg\";","export default __webpack_public_path__ + \"images/Microsoft_logo.png\";","export default __webpack_public_path__ + \"images/OracleCloudFinLogoSVG.svg\";","export default __webpack_public_path__ + \"images/OracleJDEdwardsSVG.svg\";","export default __webpack_public_path__ + \"images/OracleLogoSVG.svg\";","export default __webpack_public_path__ + \"images/PeopleSoftSVG.svg\";","export default __webpack_public_path__ + \"images/SAML-logo.svg\";","export default __webpack_public_path__ + \"images/SAPB1LogoSVG.svg\";","export default __webpack_public_path__ + \"images/SAPConcurLogo.svg\";","export default __webpack_public_path__ + \"images/SAPLogoSVG.svg\";","export default __webpack_public_path__ + \"images/SalesforceLogoSVG.svg\";","export default __webpack_public_path__ + \"images/WorkdaySVG.svg\";","export default __webpack_public_path__ + \"images/WorkivaLogoSVG.svg\";","export default __webpack_public_path__ + \"images/ZendeskLogoSVG.svg\";","export default __webpack_public_path__ + \"images/ZuoraLogoSVG.svg\";","export default __webpack_public_path__ + \"images/microsoftActiveDirectory.svg\";","export default __webpack_public_path__ + \"images/netsuite-oracle.svg\";","export default __webpack_public_path__ + \"images/service-now.svg\";","export default __webpack_public_path__ + \"images/csv-16.png\";","export default __webpack_public_path__ + \"images/csv-64.png\";","export default __webpack_public_path__ + \"images/default-16.png\";","export default __webpack_public_path__ + \"images/default-64.png\";","export default __webpack_public_path__ + \"images/docx_16.png\";","export default __webpack_public_path__ + \"images/docx_32.png\";","export default __webpack_public_path__ + \"images/docx_64.png\";","export default __webpack_public_path__ + \"images/pdf_16.png\";","export default __webpack_public_path__ + \"images/pdf_32.png\";","export default __webpack_public_path__ + \"images/pdf_64.png\";","export default __webpack_public_path__ + \"images/xlsx_16.png\";","export default __webpack_public_path__ + \"images/xlsx_32.png\";","export default __webpack_public_path__ + \"images/xlsx_64.png\";","export default __webpack_public_path__ + \"images/16Spinner.svg\";","export default __webpack_public_path__ + \"images/AccessRiskMonitorPurple.svg\";","export default __webpack_public_path__ + \"images/AccessRiskMonitorWhite.svg\";","export default __webpack_public_path__ + \"images/Application Shield.svg\";","export default __webpack_public_path__ + \"images/ArchiveDataCanges.svg\";","export default __webpack_public_path__ + \"images/CalendarPurple.svg\";","export default __webpack_public_path__ + \"images/CalendarWhite.svg\";","export default __webpack_public_path__ + \"images/Change ThemePurple.svg\";","export default __webpack_public_path__ + \"images/Change ThemeWhite.svg\";","export default __webpack_public_path__ + \"images/CollectDataChanges.svg\";","export default __webpack_public_path__ + \"images/CollectSnapshot.svg\";","export default __webpack_public_path__ + \"images/ConnectionsPurple.svg\";","export default __webpack_public_path__ + \"images/ConnectionsWhite.svg\";","export default __webpack_public_path__ + \"images/DataTransferPurple.svg\";","export default __webpack_public_path__ + \"images/DefaultMit.svg\";","export default __webpack_public_path__ + \"images/Electronic Identity CardPurple.svg\";","export default __webpack_public_path__ + \"images/Electronic Identity CardWhite.svg\";","export default __webpack_public_path__ + \"images/LinkClippedWithDrop.svg\";","export default __webpack_public_path__ + \"images/PurgeDataChanges.svg\";","export default __webpack_public_path__ + \"images/RestoreDataChanges.svg\";","export default __webpack_public_path__ + \"images/SecurityDesignerCircleOnlyIcon.svg\";","export default __webpack_public_path__ + \"images/SecurityDesignerIconPurple.svg\";","export default __webpack_public_path__ + \"images/SecurityDesignerIconWhite.svg\";","export default __webpack_public_path__ + \"images/SecurityDesignerRiskAnalysisResults.svg\";","export default __webpack_public_path__ + \"images/SecuritySetupPurple.svg\";","export default __webpack_public_path__ + \"images/SecuritySetupWhite.svg\";","export default __webpack_public_path__ + \"images/SettingsPurple.svg\";","export default __webpack_public_path__ + \"images/SettingsWhite.svg\";","export default __webpack_public_path__ + \"images/UploadPurple.svg\";","export default __webpack_public_path__ + \"images/XML.svg\";","export default __webpack_public_path__ + \"images/certificationsPurple.svg\";","export default __webpack_public_path__ + \"images/certificationsWhite.svg\";","export default __webpack_public_path__ + \"images/fastpath-white-mono.svg\";","export default __webpack_public_path__ + \"images/fp-circle-inactive.svg\";","export default __webpack_public_path__ + \"images/fp-circle-success.svg\";","export default __webpack_public_path__ + \"images/icons8-Info Squared.svg\";","export default __webpack_public_path__ + \"images/icons8-Ok.svg\";","export default __webpack_public_path__ + \"images/icons8-Sort Down.svg\";","export default __webpack_public_path__ + \"images/icons8-Submit Progress.svg\";","export default __webpack_public_path__ + \"images/icons8-Warning.svg\";","export default __webpack_public_path__ + \"images/icons8-WarningRed.svg\";","export default __webpack_public_path__ + \"images/icons8-surveyPurple.svg\";","export default __webpack_public_path__ + \"images/icons8-surveyWhite.svg\";","export default __webpack_public_path__ + \"images/icons8-info-fade.svg\";","export default __webpack_public_path__ + \"images/icons8-info.svg\";","export default __webpack_public_path__ + \"images/x-circle-12.svg\";","export default __webpack_public_path__ + \"images/Collection 1-b8f80e9f63.svg\";","export default __webpack_public_path__ + \"images/header-profile-skin-1.png\";","export default __webpack_public_path__ + \"images/header-profile-skin-2.png\";","export default __webpack_public_path__ + \"images/header-profile-skin-3.png\";","export default __webpack_public_path__ + \"images/header-profile.png\";","export default __webpack_public_path__ + \"images/shattered.png\";","export default __webpack_public_path__ + \"images/loading-image-spinner.gif\";","export default __webpack_public_path__ + \"fonts/dd9e2a49022a2a6b8a571fbba007cd2e.eot\";","export default __webpack_public_path__ + \"fonts/21c7da8db118835db36e0a984d72213a.ttf\";","export default __webpack_public_path__ + \"fonts/c57bec0105439af47b2412fd91d6a584.woff\";","export default \"data:application/font-woff;base64,d09GMgABAAAAACRwAAsAAAAAS5QAACQgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGVgCLXgr2TN8HATYCJAOCTAuBKAAEIAWFDgeIABtiPnWGnMcBgL15yf7/Twl0DBHrSQHvDAzhsuxpWYoollkYZJ/utduY9dQ/WI1Ek2d0IUF33STfzodCEvwEyWarS07zOHF2CVs4kDfPHauX8YnZGZINpYT+45793rO34EUFGGfQTAxZIPwffD7HpslxxwwkJHl+zKE6l6+tcKaq1nR4fm69z4glrKgRC2obIWxDJgj7MCIHm9uIjVRGp25kGZycEqdgYJ0JuPNAGwUrwTrPiCIApnKWtRLu3uWWZBgIGGiBubs1ELAHU+VJjsAf++4n1/0ENgdsHqLdoQDNbsKCg9f/6AGO8d6vyFUUgA9kKtMXAQTI2m6dUsXsTdEU2WZaH9b2pVB+2qLBF6qbaz+XudeCYDkLxEjC4XCumikczCRt94kcgjw0Iu3u8wFwTWITewTyQSFq4IXBeSGPOIgrVbMFJPNDyuuUp49F5TaXLsq7A0nxAIIiACqAUIJeHyB+AvmBlBwofea/cyhj7gDqA/kR/BRC55BLl3YXi879u/MXnbvSTd3bdMl6rXua0KMcjjHV+DPm/r8DYmNpZmZLUUlBSUnpSvut/zeEAYwD7PnQ8Q8Ml4I0O7k4FzTpAufZA9h+4snOSEsGeqgASuk4QAckZZGIj93oAZaWzAD4Bl/9vIAzgAQsQCCA4+StClgB7t+dYjXVoETUkG5+OoA9HgLGS56i+UzV/oBh5AUB7Cyy4BfIlQ4AO8UtOIHPSfs/ymMM4AABAQEkUEADAyxIgAMepCADAQERCZkxE6bMmKOwYMmKNSoaOgYbtkqiq6dvYGhkbGJqZm5haWVtY2tn7+Do5Ozi6ubuEYRRnKRZXpRV3bTP1/tjYNSZcBpD/2HUb3lgQGBQYEhgWGBEYFRgTGBcYEJgUmBKYFpgRmBWYE5gnsACgUUCSwSWCawQWCWwRmCdwAaBTQJbBLYJ7BDYJbBHYJ/AAYFDAkcEjgmcEDglcEbgnMAFgUsCVwhcJXCNwHUCNwjcJHCLwG0CdwjcJXCPwH0CDwg8JPCIwGMCTwg8JfCMwHMCLwi8FHgl8FrgjcBbgXcC7wU+CHwU+CTwWeCLwFeBbwLfBX4I/BT4pXp+wx9/IX8Hvln8R0G9wCH+DxQGRn7hyOAAII6EZpwck5D6OeUuAZGzeOluROYzIorVCMmi5YjyEkSFaxSUxBdyColEUI4eGV5OItgZONXZDTdrQh2ISIPfZGbQhqIjR5VB4vhy2NetWxFFM48Lg9DBRbqHRlTOkdq2FqqasRcxkqjaaIiwoaDuuEhJJ1uMDUlZ0uu6lCpUZzZ3rR3nAy3Y57y5H1mxtu7zYmGx92aOmMVcdJa0Wh6VxK+ks/yVMn03Hnrg75j5q+rk/FWF4gYdIaR8QLU2mYmKSmktKdij+sBEOG6MAk7XtMGkz5J3UetMspQrsjfthqkL9lSzzf4YtXhfKJrJk3QiGWglAUu+Nj9RGH4l/BPT72DZJ+TDleOeb68bBANNTTfbYy8v+uvhlVMb5764ZEuDZeXwkMWe3vQ98S1G0t7qCe/mDZMaZHCp5eO1kxbbC7b07JZ/xV+nigLgiQWtYWjTdLaNRpMVoA3DWpaxbXabQShnsohj5USUBxGKiZqWbEEdUsyi4JBPFs7LfLcyZw7NXaLvXhgeHduqOkABISSYsAqo0yoqpHWu3mhwoQASKAQ73sUUaGzM4k9rJIYIbAN4uonYtTnftCAfGyPsUb93zfzc0Jlzz231Gb3MI2T4OfIFZBsO+vOeaKxnMNY3OJDYkZOtYwtM/Vb9Y5fmgh0dUMpQise7EUlRdqjkhgUHgdmuC2Y6CCxyuuNE+e7AARMycG6XHePJPdnHiINHxgkTxYfrK+6p1N7cE0ihmSYtOCIPpO4qfosGD0A5pJVSZbG93XFuzVkEwTIPdGcxuE1ed5W4UKL1uYYUJauKKJ3PQd49VB0U25RdUC0mC7jhgZyff5Iby2KX2wYguwrq9Foz041GUNchNWPTikErkKzGKd5QriM3eiEatssFp6IAzasqD5Zx+ir94oCNoPm0HAROdyNdF/ScoMESSOwYyLlte647htKSTqD8/fGWvJ7aSK8lV/tPN7DCA0Lj1sNT7jJnJuWGM4sVucWZDX8duRNrYCeQ4aDOeyr1yo0zebeUz3OmBm0Fd9efIbcGLnquRCkAXUWuLvY1yopNDG3vS7eoztf08H1KHkj0EZMekq26yae4Fqepvo5+EfbjXz1Stps00rkfYRHWpPy5057O2DnWFwcUxCEhgUDFwCg9np+gNS+6s3OjGTumjR7jzmWMAyCwbSceI+lWpriQkVQU/QQqdk2gtoQ22RroBhQNNvqOxz57yaAjZ5/qJbQNm1Pa5CW2/YuMK8uOCIH224Ba2DO//PYch8Wm+tzHIdY6r/NUzeDrBOgAHhHbiIs39TaZAnXgygili1m+Cn6PabVKJpPlY+qSGNfzuVpctfqNOftWy1lQ8wIERoJ/MPVOG9e/hUXwF0/CjH/rQVT/0MRL/daKD+18d3g0MTSceKlfVu6NB4E09DTKQTReyPvk0lD8tLQzo33WZeNDw+dGRiUaP0ZTGECXfff08OjZoQG3gLx/5P3rlv1Tjym4R3lrg08rSZ7yKnK62K9rwkntZeiV/TgRFK+7rWEAUFB4EaKxishimgACjW3nWgUPnUWHLUPUdQ65h031v4JxNk1LgCpIvVYZ1Qi0WrRJHNVTwsj12h7Ky3WF/h09of7tGGXDOOp5wRvjESdDgSro8julJ1SV7HG6nLMiGQxzAiOYEirlRcSrPKVskC4qVDcP2NGvbiwceWDlvHTs2TUbcUiWGMefMAteNunmjRe+VTDdX14oE+P6i99v2WPMLUzKHGGOEVkxkKRaMu+pHX2MCS/+cLgfTX6cPRtBoNeQdBscpp5uwDFdn+mrAAhqQtNGN12tuCVBmEUxuDswIb4vSWn1ZKACE1mr0ams3J2IPYX7GgBavYOdd2jaaP2J0agZkYGoa2SrdE2wfOS86CtmkDru73nUfxjONLVhDKeHYEeSOxumcnMbEr8PzaUOziYcrxanJ/MRijNJJ0+oX3p8gqLih1PUKzExn3IJEvOQJycZQenpzTO8RO9jZzbpcFDC8Op1D4HZmadnBcIeia5cyu0WHkpU3Ljld9Mnk0NjLKs9/XPyJ/mX1K9x8NITOh1sOCDgjWDgTLh6BDA+9AfPhdpuxNFmKHw2UPNxJDPTc+PADZvdjr1xeDa2FpoyzBKIQmDrdqUT8k8AyqdXgSbG/sbpcUejowBOv7rSmxzSb475U12lUG7vemiWWZw5u84488tfi2ba7jbkxEsxtoYgEKGEi21cbzPdAlK1SOFQIhrj1IwfKMlt8SyRw7XEP1XvdbGB7hy04FbggEP6sC+lcKkuDg8xIRpdtmg4hXn5+HJk/PXi6w0n2HGqPL/Gm7UB2pE5rhw+XPE0AqvEsdNlnW2Far6ji8KTJxfpsO4q+W6cKe+y3/jYujoJwXBugW8nb7XKNzuLHQWHgwcrANexgqEj41AwVtABoJ3g4EZQ9VaPHNkMNju3lX+9dWzJXxfbbjHfxQlpQdCEnMsFNUFzcZqow8PCx10fd5fDK7EnDOJdLQeqY6RQkL+mejb79BBtsHdwTTYCDaMTKwA3gsUgWPZkJs9yYBxAfKwUap301QRzyLW72+68q9yVC2k+F5Q9CtaE2ukpJOtV6kTppjPryGDMq1i5EAks7/GEOWHjrTpV55a8mPePmJWBnKC1hCY17rCog8OHcp9MrZwtZQv2LGVg+GfA0udylJZdeVKhif1jwkOnSOC6wqOpUoEsl+RXWtxgxMCFW5BSeBEazQhQt8eMeZ6cS1AiPz97G3EZeDpSj/MNLFkAewY5AarmyVBlWgt1OKg0pYH92GQz3RYllQfZqCJVIzpnBIk0lWr1vMCh4oD6Atmj1xQCrr78bBKg3MKy3nKPQfLCsnEPNWH9pCb8cNNiEfDSMECbJrtnYfoTMeCnBWHDQhP4wLWql3DFNRVI3SCp+aQk71TMoSRmNVmb6NTMMz6Skg6p8axeWixEFJxxvOHY8ApmulvXU4Jh4nX1KYKUAe8DZNsMPWuLQ33fbHYyPVgSPwWvALkC2nPP/Sot/Hwg2wnZx/3jHfALu9t8SUq7u3d2DJUJrEkI1p0rFCrVMUIoGOFEDurUxtDOnpkzFm2NX/9yMCehbcf0T4cl9NVQG4emEi9NT73+u98mZAX3RDFAUflYD2oDxMGYqpcKfYMYoGmw6/YCSa+qok6lKHzvgCbj6PNHLRtM6+LLXaRHwZyiT3JJbyKuLvbrGsiBGpUrL346Vat1y0Zg2vZlTJRM9lgSpeFz1P4oQ6r3WfnEw5rcs2nwIGcLfHgPJzNdsVNJNRo9+qB2eYzvj+kmFkzeNAMi1WPobjrJ2UXfnraV9Zv2tLJuiAUFJMN9KvHyR1KYM4JJmx2N2J1aeUvlH6dP6WKzRwxVeaKE22RKdOMRVUYUgxCbr09u2INfmS3Ll4dp6WcHZiisMvuDTaoD0qG53BIg/ammEGt6YhjXPz84O1bKhEgWI7H7p88/ZXa0m0S6bMmkY551nzRfW60rg1+dWDUu68w59e2hkshK7zOzRsQH19wVyyNxa7NJ6uANVbCVyc5XNjaS++2nJvfVIgaWq3WBewdWCdc61Cs8nXX0tD0ptL6OKnLq3frRb4/vWTlGViMnps7FeliASiHyfMfT146Uu8nhjw4cK9HjE2fC6zTy+Eb3YmKoZ/CbTPTkzdykb3RIm8Kq02nOfzjPY/JQSjxHt+5AfwAK+IHG9V4VsGz0Z5yF5TE/sugQu08/XTJhwmoNByFKgadEKdbVabaJiqmaFi2rbbck1csCk/SS5cByLagyrffMEDtH488JkKY1RqLw89LHIZ0QjL8fYQmF+DekHBN46PSZYWlklAWHhgMjgpjYZr+dVrM0s0mkZ3PkS599+p7cSrXTzWSDbeXhLURBMmZK5nEr/2/5XP2FgYF9LA0IHO3Iz6RRoT+gITSWWI/Td3dLwy1jSO/xN/33L+5KKhBGLfPc+E9dHXvVak/q1viTXkx/qzDqMoKCuCIX/z6GFG4p3X33tAd2nHzO4YmiujjUchkJ+nfpJtdaaaZ3RNiSLjAfFuDmHRyTwW2Et0Jn/zgOtSyuVjxxOHfgctIOJPdwiDWLH794cXx+IPH5oSUfpSWcQzk7hoaw4xz5lo1zDAlxdLZekcLEHtiPLS5GnwNmmzUtotJSnp9lhJU4Os1BaRfX1hZnp3Q4D4RgW9te5qA8T3ESa1cZx+XFLlbccldwY2O5CvebgWKNubHuimy/cK+U0jLwx+RHj7i0LoHg7xtvJvcMaYbgJJDvrr/cBalF8ryLub1loSXoq3ehxWKUFiVB+lRTQkr2NmKmD8tHQigjUJH6EN+EujbhK8WHNLM38yH1ocJ6jRWdyTl1cHC+uZAGa2BaYfP8tmATfyq1cAgG8FAhYI/KF9jXw6I1rtjM+k1cutfJRAOd6PapgF/kYkiQEbyjwYp0MlIKrRtm2mfYrmAbB4FV25h2Kmbaap0gpJkOBK8ihFjhg+ucIJwJIsjG6DwbH77HHmL3G4U6Ys5XxV9g7nKv6YpqTNKPTxSMn0g38WG5hzn4uthl0GCPfaeuNN2b+YVrrS9viKaLF5lSOrY6bemgSCFg9uDVeycenx/q9P/xZuyRiXWDZUrpT1xYPyWxPr8ffyufhd1/ABu+y/tcVFoZh6+pFzCeEijvTE0T9hWbR0Fm7+Z1nPSYmbICs2XZhHL8sDnPnGrONe/2KHUfPYwvJ3xifm4pOoOOhk5yZvJj8gz5cXLmOJm4lKJXWIB3QGA2IzuXmdmXSE7ElN0xnjG+UxZzwq/B3mw7BKlcoqNxlW3EfQ6sYFZQKgvNujpW4lXZPune3uk+2T+J9Prp3tk+PyMR9UtLGd/98yTA8QAtwsNQ35VA+SPHPKr+kYtdt2e1gPj8DC2LbIad+cXy778EIw1fFLuXLC8m2EVbOn2j45i+VhmuwViykSm2tC5fm2Tm+IyOpHtbZXhFIU1cTDFjEmyb0KvXo9er0WNs611d/b2a8fDhqT51tVOaKDh1jQPc6/rOTide6+emW6axr2UOBfcLkm7OUn7SQ5Ib9LmT+A8jDwCPVUAFQ1yfdFzL9AQHhX1Hh73CIeEikdB6Y4V9gsNFimWatDjFM8nDI8kz5WmgCCZ57Kmfjh0ERhLjefpPWm/+T4wF1AWaZqqpGhrs9lUnwjQCd5uCJ9Vww4PGTywABQFTJjZQaFMWQ6NsmKBoRpgDB/FqgcaQYEiboo0WPer54YiGGhwDJ7g3BbsZAOU/YYJ4UYSzi8gl6giR0Fq0eFECP40+icX2odErHYsFiXFMlBVTGsgKYDr4s4K2BgoUaE+9bfzXMPjvN+avlJARRX9/EW2rHPT9ee3a7PXrfX0gtZJWNNA/Mrt1pczPt+/Ve62vn1b0JGR8vIOp5RoYcLXMjvGxkVxgjYCvm2W+IEm8SOTiIlokniLS64tcxIumMC9oLG59IgD3fRfQ5sE14V+vl6fKHyyub7T8fMd/cENRrP6wJ1hYiAqm+ltl5FgEbc2KVvRNC8OFDF/64VXw/fvwcmUwI5xx9UMsE9EXpp9Vj6CH2cjOw0VYpMfy5G5ucl7sRSKNlHNiuReBMJIj58ZeBEJGuVssL00QHeoYxGIFOYbuBkIwiLWn3j2OBwslu44pgdhmoLQAjnWUo7uO7gbkSeOtfwsNQWug4YNDQ/DqHCrWMlEAa2BA3h/0JbUzE7+sP9UGGI9n+c6YWZWqURXq4OdjFXCHJfucd2aw8KyxcS4GVcw1bglLwZbttwsaA+WAJbaK1eTAmT4+mXAOIBJaz50Dg4ilWpSlcI/hcmPcFdcDBY25q6a+jreI0WBN9JR1XGwMXcaNIctaWiTfUAZfgl4qghIPZouBRqZWg0CjdgF0VNZfZAgo8fcvCbimcQSOmmsBCx9S6S01rnPEomvya4uEsCeA+RVuLVGVQ202b86xbsbpi4sG0DvOFjOrnTKmsbtFaM9NnM4BQb379T3oAWBHMtlz/aoaEHA6fy2DCI3dnTFd7VTMPLsDPVCUrIfLjYsYh6oi6g+A5nRszQKVsVcGevyUgTA1+LHgEyMa5A1VRfNPgmGfJIBXCQLeq83AFIAHM9K8rZgEa+A4ajDSQbbCBHLjk0KEBnS+WqD2N7AQiXUhHSqRHR+Bkg45J2QqVidiZ8Bgv8ssOSAI01JTJdLW12tFVTUtN6sA8ixZrbYTkq5fD2dqO3Volk621SW98jQYr6KkQ2OVVb5HVBQYn1audynb6pTHBFkRgwlCCQk/BrCFhdiBH0JCECoGoyBPsHpyoWySCBdgnBUbm3UERbhQc6GeXzskwpZ3jlgWWx65g3GYaHrsmImAMkWRGT7U62xWq3/hZfi4YxaWpuJsX7GXZk5pmg+uFgJBIgwMEDSylnwfeYMEDqDRDJoN7oMHWjTeEwyPsP+EqOpJhXrSwMbovAtBIYC+BxRq+n8uVNUCWo9vYuA0hvQchHt+W6IhDdybnBL52cP2qxZ+G1V7GF7PShSNi1jwVnl5qSodqbAyfAkAdfLc5xVNCsgj3uIoa+aNMztzu/H2GUBZTgshJgypldSm2A1xkchQy1Ck0IprUlLVQ6blBzhl9J+9WhBOSjVO6p1LodvBX1/4xXnGcSL87eAU+lxvkjEpddjN78XXeI57tmMImx0id6RCeTh0D7Msyt0q4N6Crb26ea4PpaTDdCWqb65ZbW8L2z7OLZspM0+wg+0SzGFM7mNbeiL7a69RbfR6rG49ejYQH0V1TZy1ptgOI93NEjKX5YEKp+aZ5lWn7B5A4VOZsKlZcxuCjX4Uas03UR4p0gj+YNV5+ZioZ4z3uMkkABmhm6h/nkhbIABp0vSYO9YjOnZplfMHI19SZH7k1zoxSt+GgDq+7ZCfqxRoSDrZnSeBBsOH6Tt0xl9JLA/P0g+jkfPBwY1wYxnzarVc/s8i1q7s2+xbDTLPZD4/uYRIMZ6aUU16zEOtFy/2Au9H4MTw0mXAeZlrgyw9hkeVuOmsyTl1WQP71tPuumqqmqu4nz+TuSxlHARhAvbs+dt1SKKsipN/+iiLZMZXsRQvd3/bwsC8aGkA+DHtbapvNEd2htw+2hRKJLfVlRCHg3Mwrvf7kpc35zXEeI0I1HPXqzPyLmPIa06d9ySlAc9icEB7ztkU8RqbyzzLj6YhkRwXX8qNcBYAXbmZwd2cgXYDe1pFVHPUFygWC5gVREDCe75SxsgAtI7IsUboFLv9ajdTJzSPlrffaCdt8+kya/9FTyUxDWxGICBPV7xmQgQaseLIHVMBoDHnZ4bQ/Y/veCG3WEpW/WZmA1OxKbQByA/RKhX1M2v2URf3p3cB68ZDFgYTXJ9hSVgq75FHU5f739st2MYHjfAdCorHAuxfqb1OSnZRcFuK/RCH3K3n9C/PtyK4yDzURp/g62m86fvWatdfx6dxVreH64Ok1P/mDjN5HGXc9RuhMZxJr7+vMTmoqrKVoh8o3YYy3FCe6k9qZWypCHk1tXPxmsUbL74KyThE/BMRWFpsbYU56CtHmdgBqE+5nbz+y7T9CJac0rU4LudTYjuH6GGC/MbQ2EGujI/oI4xkeLy696dvmTA/pS24iK10CWa4VZ2qdZaD+sI1bh7lly0pf3pRFUHIVzXLBRgt1xDKCKwqfO8KNYpPkBOSvDp8lHpFL76KRSXA5/umZlYV63nl+rE6mZjDllVdSpaySvkHHom0pORo4I9jwM5GIt3BODFcQwcs2RzNtKZI5qZHurh17QFGpfQygv660hSk0XLrNo9thoQyRhl96a0e47jZ9fTXliYjcQ0dtSiPzY90E3NPQc0Oz1YyJVWSY8/Jw+RKB8lxyeb63cO7o4xSDyoYLliYqZJPn6jDVLCdlQAaIlpHZxXIht99qjIEOQu8uE9Ghk+OACBRn8jZq4lnSGniezp4EGLj2vDBlxQAyr9cDeWwo1w4rlKpK4c2XLhr19pgyzArSclyzyQ+P8lzeUnh4mT3BOWSBM/1eq4GiPlPB8qKinz7GSHhWu1e7vM8H87f210yvhRB+KlhHEpLkJ04p+/vvUqK1xK0KEws25Udi4mz0uKlXU7++hOPZXhbVuxI2z+7dv1bkz9KkEW7RMsIo/nqXe3KLMQtD/BGhoFCy0jTQdjDPdY4IjtfXzsRkd5LZAvD9kFL2Yk4Hg/u7QwBCamXFlYc4A1EZQFN86QGi4KI3Rr2oTX77tTeCTEw9TPuW9O6BVqNeNW5oUzOIwWSzOmGzleI1cTd/WQplDKOSPkkHRwfh1LmD97kxDw91u8sRaTg4GBrqclk2YKZo+Mp/DwFSR28P3ZOtLO0nyyTqPnwEMfqTq81h8pSdjMEh02PHJxLgaSJJcBeITN3r+mqXccLzzUBNES2/lbjlf4Kgv4fXl5C3FxMpHFY75TQ5rBtOeFUb5hxTCRuTujl9Ye+grDS33irXkQe1bhXn2P0+riQrSdi6oz4Yf0KvUr12ML3deAY6fcaA4bNUjSG/2xfgAnQ1TXkGv7DESGCaBTK48VYOmbSyi3CYYMQjSnklQqFcjJ5xtc3VSj8c+PFvuFLvbbGDJksFwrLuEWUfJVhi1Cogt3mSboqobCUV2hhCjDoIm4ek0qXNO8GU+r2AfPNQgrP3PtbBO3yxMYgSPWuMOUc85uE5P255SyWVTYitSgu6jAy2MOq9uyDm4aWumnLngxuQjWiNjFQWmR6BaDb9OXtXF92XLYtLy03pEHyJTHvts5dREA/vkoBd6EX6sQn4t5QDoPQody2TFzHHd3aIl90G3xGBwww+1XGkwiU+Vx3IgNAIykAXD+1K3RjvcxGR48UOwIBBjFaOcs22sv0COIxxetPEhLpp0oJb8xy+w6W7TD5H5fy0XJRHvPNW8YRusbxXAQUaHjgdc9ciL7JXM/rg4G4CKj1H2ItdHvyS9VyHwejrhU+lU8v3IZq/y1drsjR8ZuAVCYx/sQKy2whwSQWUk3o+OUopvXCjZZBIxNQslpqLB3BiZEqMj2fjcbnke/6nZrCjIyld5MZkAir8mD4TCGFS7mB6pzw4hJIHtXk0d9CBaJ45a5RZehgtf5m31Jz07uoy0UkGCA9kAYJCK7u4v1IAwHyyIwUGCBB51sNoypPfBjoD5gPkR2NRQdOGIpid+TWG9F3pKJBJyPZpPpdWO7q/mZn6u7ChIVhlhgQZOQ5AzPWfF9wrWmv6ntOJLTQ/gFKTGv5m8z7nxwtKPgZccu9f4O5d223A4sloKWwaGbYORJniopaL8QRJfWi3+Qj9RJS/O8lDcaz3BmQrZScw5+8ANh1jl+/ymJiZN+/a7dvP85tP2sxsuX/x0mFI9HtS7wONfzc2oEglloRrEoBZb+jfMcCyZE75AsLcmQBNIRj0XLPRD4/0XP54+q1TExcm6KceK7CdYncMwaVKUOJE5uD7EMdpMpI53DnlRo57hziYAs7K8VS1kK+4FNlW/VAv/bmzTMHAU3oSJiRhmfiGScZ+Mxkzre9eZxkl+TEnunn58Nn0veTM/Hh4TOMmbDk20D1dNkvcdTqtbn5+r7XGZng6igAbEWkHbkg2yEb7fLodun1fo6234nRJieBhS0Bymxa4FDk/Vqj3rWrqzNOkYTCcdQ3Gydv8vPfvAGu+16YUBM/0YxpnxKoZ35CTOLHUEKzDQ4S1oK1ZWwD66Jx66mOOLoFAzcMhgUdu5YIlAPkHKBPAZdWCvIW2nb7/WZhcnIhv/cBdAGRykLrPG4NAJzKFKCX3OOiY21M52BejtkB6L4FqMG4GE2zEDa22Wg2etVuLysJLgOuQvh0NtBp6FSjr76AP8nrV/OqAZP+544snBbTSY8qxGIdTdMIg9aUizKLQ6hzjVD5npQG1BbXHsmEFGgt5u73/UtaZCKPDILOmTpPRDR0bcpzOgoDt3rLWEmji2HcA2umR59FC395ZJoQMKr1pqo4GXEZeUc52US4rjNMBTjNtU74K29Y43XVY1pezUQdXYCuQc/+7iXBW8XaLWNAuClLpcaXxw3QwBeuRBgPPGElYmnkyEIIYZsJf/Pw1impzbU9eYfybwy86W6dItfcoWPg2pq3vkAXPGkTgIPhIboVacdzpYzRz9XkxX/o+nLZT/UFiUZL/zVGFzhYnVStVq0G8NfvfsbM/WctGWwK87Rg7nVCHzCdWu9p/F9Im67wdP4/y/uP/i13OgYwPpAOKDhGAONwhzMKoPLhrvrFOzPxqTty2xCgQAcEDozZde3hAhJwzV5db3CAFcnib6C0EiAAXRRgPHUPAEDdPuAgBX8Uaa6blMD1FgSoDiBZ6bIGC74h3homYDrQOmckCIZhnA7jT89Vnz4zEXrL9lnjgwRTJ5DTBjBUjqLbR7i4xk308B0rCr8Muk2PZnGMwmX8ZggJRDw24ZfFfdezWXu+W6Sa5rz2XF59FgTDME4HP/tPz1WfPjO5segtI7vx4TemPnxhIAxThN79P4pGnn99zxj78B3rsFEZE3WbHg2pcfTqC5fxGyLIIGJbaHTxha+2nnMY7fnOTRVZhXXtxWIeBO2crIO1eCHgAIFAgAQFGsy/1P4nOvCQQgYBQIQJZVxIpY11PgijOEmzvCirumm7fhineVm3/Tiv+3m/PwijOEmzvCirummfr/fn+5P6q5mAhIYuZiIMF4KRHXR2RkYKq/1aGojdBt5VYgi5JtdbAEM9MiyNQtMwc8GBpD1c+FmyWgF15ww72RfiabeQTqjvGoiKmbtwcZ5ymxgkpDoaZqQ25Bp5UBa7LJ3Miugw8p9v5ul8Fk94WrD2Yp16Yr858kBYA8jCBHReKlpaP79tuR6DGdbbYS5Xfka/KSCb88RVTf1LjvyFUHxpnhTh6pDUuuG8L2G0/OvhktNMsg6Nui5Krl1XkWVXt/HPAveJMIt4ekAKEI8nxb1RSDnCqoJJF4s31YYy1C9h6DXwILi25Yb1smQvrFyVKNx7pOOYdG5i3gwKWxzUsyorz9RL1WPjlAgd15PQHOORollrLlAXCUH0rLLlmD2oKWrAfbalsLB7lEOkpshzO1x0RXFNvwwFCK+nrrmiqpt6pq6hLggF2596LhM7P4PYRc1Gpbl2O0x3nJCTQJsPS33BPImeLNeR5xopezueJGP0oHgqRoUtJJkXiXjCC1Xytfu5NTPhpOLO7XK1bC61TyWba8J3Sah60rD6TM5yO9Jb8ViphnvU0DKpW6DSW3QNy94SV/AM9w1qcCDCuwvPRNAUD9Vhgg5GKhtFWe0VAA==\""],"sourceRoot":""}