{"version":3,"sources":["modules/selection/pages/portalList.js","modules/reports/pages/report.js","modules/users/pages/user.js","modules/localization/components/localeFields/localeFields.js","modules/localization/components/locales/locales.js","modules/localization/components/localeSections/localeSections.js","modules/localization/components/localeValues/localeValues.js","modules/localization/components/localeImport/localeImport.js","modules/localization/components/localeExport/localeExport.js","modules/emailSending/pages/email.js","modules/portals/pages/portal.js","modules/localization/pages/localization.js","common/components/header/header.js","common/components/portalDropdown/portalDropdown.js","modules/emailSending/components/blacklistedEmailSearch/blacklistedEmailSearch.js","modules/emailSending/components/bounceCategories/bounceCategories.js","modules/emailSending/components/bounceSettings/bounceSettings.js","modules/users/components/userGrid/userGrid.js","modules/portals/components/portalGrid/portalGrid.js","modules/selection/components/portalList/portalList.js","modules/reports/components/authReports/authReports.js","../node_modules/@assent-ux/assent-session/dist/session.js"],"names":["PortalList","Report","User","LocaleFields","$scope","__env","toastr","httpService","readCookie","columns","field","title","width","pageTitle","localeFieldsOptions","columnMenu","editable","filterable","extra","operators","string","contains","eq","groupable","pageable","scrollable","sortable","localeFieldsSource","type","error","e","transport","read","contentType","url","apiBaseUrlLocalization","beforeSend","req","setRequestHeader","getByName","sessionCookieName","schema","data","total","pageSize","serverPaging","serverSorting","serverFiltering","Locales","deleteLocale","deleteLocaleItem","localeId","asyncCall","then","response","localesGrid","dataSource","remove","deleteLocaleWindow","close","success","code","catch","status","deleteItem","preventDefault","this","dataItem","angular","element","document","find","currentTarget","closest","content","deleteLocaleTemplate","center","open","click","saveEvent","displayMode","model","updateLocale","addLocale","command","text","template","id","fields","name","nativeName","localesOptions","mode","kendo","html","edit","wrapper","css","editContainer","save","localesSource","addNewLocale","addRow","locale","at","set","refresh","cancelChanges","kendoWindow","visible","height","modal","LocaleSections","localeSectionsOptions","localeSectionsSource","LocaleValues","$q","$","deleteLocaleValueWindow","deleteLocaleValueTemplate","deleteLocaleValue","undefined","localeCode","sectionCode","fieldCode","value","sectionId","fieldId","addLocaleValue","updateLocaleValue","isAdd","defaultValue","localeValuesOptions","cancel","localeValuesGrid","getLocales","resolve","reject","locales","drpLocaleOptions","getSections","sections","drpSectionOptions","addNewLocaleValue","selectedSectionId","drpFieldOptions","localeValue","dataTextField","dataValueField","valuePrimitive","DataSource","options","optionLabel","filter","change","autoBind","init","promises","push","all","localeValuesSource","LocaleImport","$http","uploadedFile","$apply","files","length","fileRequired","csvFile","importLocaleValues","validationClass","fdata","FormData","append","fileName","multiPartDataCall","console","log","onRemove","localeExport","exportLocaleValues","window","location","assign","Email","perms","permissions","pagePermissions","i","write","$inject","module","component","templateUrl","controller","bindings","Portal","portalTypes","permissionPermissions","Localization","Header","$location","$log","portals","userOptions","acms","admins","menuOptions","currentUrl","secondaryMenuOptions","portalTypeId","portalName","baseUri","homePageRelativeUri","userEmail","emailCookieName","portalList","showSecondaryMenu","headerOptions","projectName","languages","createCookie","expires","cookie","domain","logout","Date","getTime","apiBaseUrl","href","loginPage","message","statusText","PortalDropdown","$on","setPageName","currentPath","absUrl","split","userPortalList","currentPage","getUserPortals","sessionKey","apiBaseUrlPortal","portalId","substring","targetPage","search","pg","BlacklistedEmailSearch","deleteEvent","email","emailAddress","deleteEmail","showResults","hidden","$parent","blacklistedOptions","blacklistedSource","apiBlacklistedEmails","addEmail","blacklistedEmail","blacklistedGrid","closeEmailList","searchEmail","operator","BounceCategories","deleteCategory","bounceCategoryId","updateCategory","addCategory","description","isHardBounce","categoriesOptions","categoriesSource","apiBounceCategories","addNewCategory","categoriesGrid","category","categoryId","BounceSettings","isLocked","bounceSettings","defaultBounceSettings","cancelBounceEdit","copy","editBounceSettings","getBounceSettings","consul","updateBounceSettings","UserGrid","confirm","deleteUser","userId","userGrid","deletePortalEvent","deletePortal","readError","updateUser","addUser","permissionChecks","modalEmail","permissionPerms","$ctrl","attributes","class","format","column","selectUsers","active","isEmailConfirmed","lastPasswordChangeDate","mustChangePassword","isLockoutEnabled","lockoutEndDateUtc","deactivated","userSource","apiBaseUrlUser","authCookieName","sort","dir","detailInit","editUser","selectable","portalColumns","portalModel","isPermissionVisible","portalSearchOptions","placeholder","toolbar","addNewUser","addPortalsToUsers","rows","select","users","userIds","portalIds","user","portal","parentRow","row","prev","grid","uid","portalTokens","portalToken","encodeURI","appendTo","detailCell","kendoGrid","getPermissions","apiPermissions","checked","is","addClass","removeClass","setPermission","checkbox","permissionId","permission","permissionDisplayName","replace","apiUserPermissions","showPermissions","button","permissionsWindow","toLowerCase","PortalGrid","portalTypeEditor","container","kendoDropDownList","removeUser","updatePortal","addPortal","showCheckbox","editor","grep","pop","portalTypeName","selectPortals","hostName","portalOptions","portalSource","userColumns","userModel","parameterMap","operation","JSON","stringify","userSearchOptions","addNewPortal","portalGrid","addUserToPortals","filterPortals","portalFilter","navToPortal","apiLogin","Administration","ACM","SUPO","ModuleManagement","DSLBuilder","ComplianceCentral","AAIM","AssentU","ACP","AuthReports","getCurrentDate","current","getFullYear","getMonth","getDate","sessionColumns","sessionModel","expiryUtc","sessionOptions","excel","sessionSource","apiBaseUrlReport","userAuditColumns","userAuditOptions","userAuditSource","Assent","session","a","apply","arguments","b","c","isInDebugMode","debug","d","f","g","concat","encodeURIComponent","cookieDomain","toUTCString","get","RegExp","exec","decodeURIComponent","toString","getJson","parse","setJson","top","sessionExpiryLogoutCookieRequired","sessionExpiryLogoutCookieName","logoutOverride","logoutUrl","dispose","indexOf","h","n","sessionNeedsRefresh","authTokenCookie","getAuthTokenCookie","j","XMLHttpRequest","authenticationApiUrl","send","portalHost","onreadystatechange","readyState","token","sessionExpiryUtc","secureCookie","sessionTokenCookie","sessionHasBeenChecked","k","m","CHECK","l","onExtendSession","EXTEND","previousUrl","o","route","interval","timerId","handler","start","setInterval","checkCookie","extendSession","Object","keys","forEach","clearInterval","initialize","setTimeout","addEventListener","removeEventListener"],"mappings":"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","file":"../../js/main-5f1c7368af.min.js","sourcesContent":["angular\n\t.module('app')\n\t.component('portalList', {\n\t\ttemplateUrl: 'modules/selection/pages/portalList.html',\n\t\tcontroller: PortalList\n\t});\n\nfunction PortalList() {}","angular\n\t.module('app')\n\t.component('report', {\n\t\ttemplateUrl: 'modules/reports/pages/report.html',\n\t\tcontroller: Report\n\t});\n\nfunction Report() {}","angular\n\t.module('app')\n\t.component('user', {\n\t\ttemplateUrl: 'modules/users/pages/user.html',\n\t\tcontroller: User,\n\t\tbindings: {\n\t\t\tpermissions: '<',\n permissionPermissions: '<',\n\t\t}\n\t});\n\n/**\n * gets a list of all permissions up front to populate permission modal\n *\n * @function \n */\nfunction User() { }","\nLocaleFields.$inject = ['$scope', '__env', 'toastr', 'httpService', 'readCookie'];angular\n\t.module('app')\n\t.component('localeFieldsComponent', {\n\t\ttemplateUrl: 'modules/localization/components/localefields/localeFields.html',\n\t\tcontroller: LocaleFields\n\t});\n\n/**\n * Code supporting the kendo grid that displays LocaleSections\n * and performs CRUD opperations\n *\n * @class Locales\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } readCookie - reads cookie variables\n */\nfunction LocaleFields($scope, __env, toastr, httpService, readCookie) {\t \t\n\n\t// columns of the grid\n\tvar columns = [\n\t\t{\n\t\t\tfield: 'sectionCode',\n\t\t\ttitle: 'Section Code',\n\t\t\twidth: '25%'\n\t\t},\n\t\t{\n\t\t\tfield: 'fieldCode',\n\t\t\ttitle: 'Field Code',\n\t\t\twidth: '25%'\n\t\t},\t\t \n\t\t{\n\t\t\tfield: 'description',\n\t\t\ttitle: 'Description',\n\t\t\twidth: '50%'\n\t\t}\t\t\n\t];\n\n\t$scope.pageTitle = 'Locale Fields';\n\n\t$scope.localeFieldsOptions = { \n columnMenu: false, \n columns: columns, \n editable: 'popup', \n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n }, \n groupable: false, \n pageable: true, \n scrollable: true, \n sortable: true \n };\t\n\n // commented until the endpoints exist\n $scope.localeFieldsSource = \n {\t\n \t//data: categories\t\t\n \ttype: 'aspnetmvc-ajax',\n error: function(e) { toastr.error('Could not get locale fields');},\t \n\t\ttransport: {\n\t\t\tread: {\t\t\t\t\n\t\t\t\ttype: 'get',\t\t\n\t\t\t\tcontentType: 'application/json',\t\n\t\t\t\turl: __env.apiBaseUrlLocalization + '/localefields/paged/kendo',\n\t\t\t\tbeforeSend: function(req) {\n\t\t\t\t req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t },\t\t\t\t\t \n\t\t\t}\n\t\t},\t\t\t\n\t\tschema: {\n data: 'data',\n total: 'total', \n }, \n pageSize: 10, \n serverPaging: true,\n serverSorting: true,\n serverFiltering: true \n\t};\n}","\nLocales.$inject = ['$scope', '__env', 'toastr', 'httpService', 'readCookie'];angular\n\t.module('app')\n\t.component('localesComponent', {\n\t\ttemplateUrl: 'modules/localization/components/locales/locales.html',\n\t\tcontroller: Locales\n\t});\n\n/**\n * Code supporting the kendo grid that displays locales\n * and performs CRUD opperations\n *\n * @class Locales\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } readCookie - reads cookie variables\n */\nfunction Locales($scope, __env, toastr, httpService, readCookie) {\t \t\n\n\t// columns of the grid\n\tvar columns = [\n\t\t{\n\t\t\tfield: 'code',\n\t\t\ttitle: 'Code',\n\t\t\twidth: '15%'\n\t\t}, \n\t\t{\n\t\t\tfield: 'name',\n\t\t\ttitle: 'Name',\n\t\t\twidth: '26%'\n\t\t}, \n\t\t{\n\t\t\tfield: 'nativeName',\n\t\t\ttitle: 'Native Name',\n\t\t\twidth: '26%'\n\t\t},\n\t\t{ \n\t\t\tcommand: ['edit', { text: 'Delete', click: deleteItem, template: \"Delete\" }], \n\t\t\ttitle: ' ', \n\t\t\twidth: '30%'}\n\t];\n\n\t// model to bind to\n\tvar model = { id: 'localeId', \n\t\t\t\t\tfields : {\n\t\t\t\t\t\t'code': { type: 'string' },\n\t\t\t\t\t\t'name': { type: 'string'},\n\t\t\t\t\t\t'nativeName': { type: 'string'}\n\t\t\t\t\t}\n\t\t\t\t}; \n\n\t$scope.pageTitle = 'Locales';\n\n\t$scope.localesOptions = { \n columnMenu: false, \n columns: columns, \n editable: {\n\t mode: 'popup',\n\t template: kendo.template(angular.element(document).find('#localeEditGridTemplate').html())\n\t },\n\t edit: function (e) \n\t\t{\n\t\t var editWindow = this.editable.element.data('kendoWindow');\n\t\t editWindow.wrapper.css({ width: 300 });\n\t\t //hack: change the edit-form-container width to 100% so window width is the actual width of whole window; else this defaults to 400px and scrolls within window\n\t\t editContainer = this.editable.element.find('.k-edit-form-container');\n\t\t editContainer.css({ width: '100%'});\n\t\t}, \n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false, \n pageable: true, \n save: saveEvent,\n scrollable: true, \n sortable: true \n };\t\n\n // commented until the endpoints exist\n $scope.localesSource = \n {\t\n \t//data: categories\t\t\n error: function(e) { toastr.error('Could not get locales');},\t \n\t\ttransport: {\n\t\t\tread: {\t\t\t\t\n\t\t\t\ttype: 'get',\n\t\t\t\tcontentType: 'application/json',\t\n\t\t\t\turl: __env.apiBaseUrlLocalization + '/locales',\n\t\t\t\tbeforeSend: function(req) {\n\t\t\t\t req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t },\t\n\t\t\t}\n\t\t},\t\t\t\n\t\tschema: {\n // data: 'data',\n // total: 'total', \n model: model, \n }, \n pageSize: 10, \n serverPaging: false,\n serverSorting: false,\n serverFiltering: false \n\t};\n\n\t/**\n * Triggers the new row add for a kendo grid.\n *\n * @function addNewLocale\n */\n\t$scope.addNewLocale = function() {\t\t\n\n\t\t// trigger the add event \n\t\tthis.localesGrid.addRow();\n\t};\n\n\t/**\n * Prepares the http request for adding a new locale. Handles callbacks\n *\n * @function \n * @param { object } locale - locale to be added\n */ \n\t$scope.addLocale = function(locale) {\n\t\tvar url = __env.apiBaseUrlLocalization + '/locales';\n\t\tvar type = 'post';\n\t\tvar data = locale;\n\n\t\thttpService.asyncCall(url, type, data)\n\t\t\t.then(function(response) {\t\t\n\t\t\t\tvar dataItem = $scope.localesGrid.dataSource.at(0);\t\t\n\t\t\t\tdataItem.set('localeId', response.data.localeId);\t\t\t\t\n\t\t\t\t$scope.localesGrid.refresh();\t\t\t\t\n\t\t\t\ttoastr.success('Locale successfully added');\t\t\t\t\n\t\t\t}).catch(function(e){\t\t\t\t\n\t\t\t\t$scope.localesGrid.cancelChanges();\n\t\t\t\ttoastr.error('The Locale could not be added');\n\t\t\t});\t\t\t\n\t};\n\n\tvar deleteLocaleTemplate = kendo.template(angular.element(document).find('#deleteLocaleTemplate').html());\n\tvar deleteLocaleWindow = angular.element(document).find('#deleteLocaleWindow').kendoWindow({\n\t title: 'Are you sure you want to delete this record?',\n\t visible: false, //the window will not appear before its .open method is called\n\t width: '450px',\n\t height: '120px',\n\t modal: true\n\t}).data('kendoWindow');\t\n\n\n\t/**\n * Prepares the http request for deleting a locale. Handles callbacks\n *\n * @function \n * @param { locale } deleteLocaleItem - locale to be deleted \n */ \n function deleteLocale(deleteLocaleItem) {\n \t\n \tvar url = __env.apiBaseUrlLocalization + '/locales/' + deleteLocaleItem.localeId;\n\t\tvar type = 'delete';\n\t\tvar data = '';\n\n\t\thttpService.asyncCall(url, type, data)\n\t\t\t.then(function(response) {\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t$scope.localesGrid.dataSource.remove(deleteLocaleItem);\t\t\t\t\n\t\t\t\t\tdeleteLocaleWindow.close();\t\t\n\t\t\t\t\ttoastr.success('Locale code: \"' + deleteLocaleItem.code + '\" successfully deleted');\n\t\t\t}).catch(function(e){\n\t\t\t\tdeleteLocaleWindow.close();\n\n\t\t\t\tif(e.status == 409)//conflict due to association with a field \n\t\t\t\t{\n\t\t\t\t\ttoastr.error('Locale code: \"' + deleteLocaleItem.code + '\" already associated with a field. It can not be deleted.');\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\ttoastr.error('The Locale code: \"' + deleteLocaleItem.code + '\" could not be deleted');\n\t\t\t});\t\t\t\t\n\t};\n\n\t/**\n * handles save delete for the locale grid.\n *\n * @function \n * @param { event } e - delete row event\n */ \n\tfunction deleteItem(e) {\n\t\te.preventDefault();\n\t\tvar deleteLocaleItem = this.dataItem(angular.element(document).find(e.currentTarget).closest('tr'));\n\t\tdeleteLocaleWindow.content(deleteLocaleTemplate(deleteLocaleItem)); //send the row data object to the template and render it\n deleteLocaleWindow.center().open();\n\n angular.element(deleteLocaleWindow.element).find('#btnOk').click(function(){\n deleteLocale(deleteLocaleItem); \n });\n\n angular.element(deleteLocaleWindow.element).find('#btnCancel').click(function(){\n deleteLocaleWindow.close();\n });\n\t}\t\n\n\t\n\n\t/**\n * handles save event for the locale grid.\n *\n * @function \n * @param { event } e - save row event\n */ \n\tfunction saveEvent(e) {\n\n\t\t$scope.displayMode = true; \n\n\t\t// stop kendo from being annoying\n\t\te.preventDefault();\n\n\t\tif(e.model.localeId > 0) {\n\n\t\t\t// locales with an id should be updated\t\t\t\n\t\t\t$scope.updateLocale(e.model);\n\t\t} else {\n\t\t\te.model.localeId = 0;\n\n\t\t\t// locales without an id should be added\n\t\t\t$scope.addLocale(e.model);\n\t\t}\n\t}\n\n\t/**\n * Prepares the http request for updating a locale. Handles callbacks.\n *\n * @function \n * @param { obj } locale - locale object\n */ \n $scope.updateLocale = function(locale) { \n \tvar url = __env.apiBaseUrlLocalization + '/locales/' + locale.localeId;\n\t\tvar type = 'put';\n\t\tvar data = locale;\n\n\t\thttpService.asyncCall(url, type, data)\n\t\t\t.then(function(response) {\t\t\t\t\n\t\t\t\t$scope.localesGrid.refresh();\t\t\t\t\n\t\t\t\ttoastr.success('Locale successfully updated');\t\t\t\t\n\t\t\t}).catch(function(e){\t\t\t\t\n\t\t\t\t$scope.localesGrid.cancelChanges();\t\t\t\t\n\t\t\t\ttoastr.error('The Locale could not be updated');\n\t\t\t});\t\t\n\t\t\n };\n}","\nLocaleSections.$inject = ['$scope', '__env', 'toastr', 'httpService', 'readCookie'];angular\n\t.module('app')\n\t.component('localeSectionsComponent', {\n\t\ttemplateUrl: 'modules/localization/components/localesections/localeSections.html',\n\t\tcontroller: LocaleSections\n\t});\n\n/**\n * Code supporting the kendo grid that displays LocaleSections\n * and performs CRUD opperations\n *\n * @class Locales\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } readCookie - reads cookie variables\n */\nfunction LocaleSections($scope, __env, toastr, httpService, readCookie) {\t \t\n\n\t// columns of the grid\n\tvar columns = [\n\t\t{\n\t\t\tfield: 'sectionCode',\n\t\t\ttitle: 'Section Code',\n\t\t\twidth: '30%'\n\t\t}, \n\t\t{\n\t\t\tfield: 'description',\n\t\t\ttitle: 'Description',\n\t\t\twidth: '50%'\n\t\t}\t\t\n\t];\n\n\t$scope.pageTitle = 'Locale Sections';\n\n\t$scope.localeSectionsOptions = { \n columnMenu: false, \n columns: columns, \n editable: 'popup', \n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false, \n pageable: true, \n scrollable: true, \n sortable: true \n };\t\n\n // commented until the endpoints exist\n $scope.localeSectionsSource = \n {\t\n \t//data: categories\t\t\n error: function(e) { toastr.error('Could not get locale sections');},\t \n\t\ttransport: {\n\t\t\tread: {\t\t\t\t\n\t\t\t\ttype: 'get',\n\t\t\t\tcontentType: 'application/json',\t\n\t\t\t\turl: __env.apiBaseUrlLocalization + '/localesections',\n\t\t\t\tbeforeSend: function(req) {\n\t\t\t\t req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t },\t\t\t\t\t \n\t\t\t}\n\t\t},\t\t\t \n pageSize: 10, \n serverPaging: false,\n serverSorting: false,\n serverFiltering: false \n\t};\n}","\nLocaleValues.$inject = ['$scope', '__env', 'toastr', 'httpService', 'readCookie', '$q'];angular\n .module('app')\n .component('localeValuesComponent', {\n templateUrl: 'modules/localization/components/localevalues/localeValues.html',\n controller: LocaleValues\n });\n\n/**\n * Code supporting the kendo grid that displays LocaleSections\n * and performs CRUD opperations\n *\n * @class Locales\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration.\n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } readCookie - reads cookie variables\n */\nfunction LocaleValues($scope, __env, toastr, httpService, readCookie, $q) {\n\n // columns of the grid\n var columns = [\n {\n field: 'localeCode',\n title: 'Locale Code',\n width: '12%',\n },\n {\n field: 'sectionCode',\n title: 'Section Code',\n width: '13%',\n },\n {\n field: 'fieldCode',\n title: 'Field Code',\n width: '17%',\n },\n {\n field: 'value',\n title: 'Value',\n width: '40%',\n },\n {\n command: ['edit', { text: 'Delete', click: deleteItem, template: \"Delete\" }],\n title: ' ',\n width: '16%',\n }\n ];\n\n var model = {\n fields: {\n localeId: { type:'number', defaultValue: null},\n sectionId: { type:'number', defaultValue: null},\n fieldId: { type:'number', defaultValue: null},\n value: { type:'string' },\n }\n };\n\n\n $scope.pageTitle = 'Locale Values';\n\n $scope.localeValuesOptions = {\n columnMenu: false,\n columns: columns,\n editable: {\n mode: 'popup',\n template: kendo.template($('#localeValueEditGridTemplate').html())\n },\n edit: function (e)\n {\n var editWindow = this.editable.element.data('kendoWindow');\n editWindow.wrapper.css({ width: 460 });\n },\n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false,\n pageable: true,\n save: saveEvent,\n cancel: function(e) {\n e.preventDefault();\n $scope.localeValuesGrid.cancelChanges();\n\n $scope.isAdd = false;\n },\n scrollable: true,\n sortable: true\n };\n\n /**\n * Sets up http request to get locale sections to use with grid edits.\n * On success, loads the sections array. Uses a promise to ensure\n * the sections are loaded before the grid.\n *\n * @function\n */\n $scope.getLocales = function() {\n\n // wait for the types to resolve\n return $q(function(resolve, reject) {\n\n var url = __env.apiBaseUrlLocalization + '/locales';\n var type = 'get';\n var data = '';\n\n\n httpService.asyncCall(url, type, data)\n .then(function(response) {\n $scope.locales = response.data;\n $scope.drpLocaleOptions.dataSource.read();\n resolve(true);\n\n }).catch(function(e){\n toastr.error('Did not get locales');\n reject(false);\n });\n\n });\n };\n\n /**\n * Sets up http request to get locale sections to use with grid edits.\n * On success, loads the sections array. Uses a promise to ensure\n * the sections are loaded before the grid.\n *\n * @function\n */\n $scope.getSections = function() {\n\n // wait for the types to resolve\n return $q(function(resolve, reject) {\n\n var url = __env.apiBaseUrlLocalization + '/localesections';\n var type = 'get';\n var data = '';\n\n\n httpService.asyncCall(url, type, data)\n .then(function(response) {\n $scope.sections = response.data;\n $scope.drpSectionOptions.dataSource.read();\n resolve(true);\n }).catch(function(e){\n toastr.error('Did not get locale sections');\n reject(false);\n });\n\n });\n };\n\n /**\n * Triggers the new row add for a kendo grid.\n *\n * @function addNewLocaleValue\n */\n $scope.addNewLocaleValue = function() {\n\n // trigger the add event\n this.localeValuesGrid.addRow();\n $scope.selectedSectionId = null;\n $scope.drpFieldOptions.dataSource.read();\n\n $scope.isAdd = true;\n };\n\n /**\n * Prepares the http request for adding a new locale. Handles callbacks\n *\n * @function\n * @param { object } locale - locale to be added\n */\n $scope.addLocaleValue = function(localeValue) {\n var url = __env.apiBaseUrlLocalization + '/localevalues';\n var type = 'post';\n var data = localeValue;\n\n httpService.asyncCall(url, type, data)\n .then(function(response) {\n $scope.localeValuesGrid.refresh();\n toastr.success('Locale value successfully added');\n\n }).catch(function(e){\n $scope.localeValuesGrid.cancelChanges();\n toastr.error('The Locale value could not be added');\n\n });\n };\n\n var deleteLocaleValueTemplate = kendo.template($('#deleteLocaleValueTemplate').html());\n var deleteLocaleValueWindow = $('#deleteLocaleValueWindow').kendoWindow({\n title: 'Are you sure you want to delete this record?',\n visible: false, //the window will not appear before its .open method is called\n width: '370px',\n height: '140px',\n modal: true\n }).data('kendoWindow');\n\n\n /**\n * Prepares the http request for deleting a locale. Handles callbacks\n *\n * @function\n * @param { object } locale - locale to be deleted\n */\n $scope.deleteLocaleValue = function(localeValue) {\n\n var url = __env.apiBaseUrlLocalization + '/localevalues/' + localeValue.localeId + '/' + localeValue.fieldId;\n var type = 'delete';\n var data = '';\n\n httpService.asyncCall(url, type, data)\n .then(function(response) {\n $scope.localeValuesGrid.dataSource.remove(localeValue);\n deleteLocaleValueWindow.close();\n toastr.success('Locale value successfully deleted');\n }).catch(function(e){\n deleteLocaleValueWindow.close();\n toastr.error('The Locale value could not be deleted');\n });\n };\n\n /**\n * handles delete for the locale grid.\n *\n * @function\n * @param { event } e - delete row event\n */\n function deleteItem(e) {\n e.preventDefault();\n var dataItem = this.dataItem($(e.currentTarget).closest('tr'));\n deleteLocaleValueWindow.content(deleteLocaleValueTemplate(dataItem)); //send the row data object to the template and render it\n deleteLocaleValueWindow.center().open();\n\n $('#deleteLocaleValueWindow #btnOk').click(function(){\n $scope.deleteLocaleValue(dataItem);\n });\n\n $('#deleteLocaleValueWindow #btnCancel').click(function(){\n deleteLocaleValueWindow.close();\n });\n }\n\n /**\n * handles save event for the locale value grid.\n *\n * @function\n * @param { event } e - save row event\n */\n function saveEvent(e) {\n\n $scope.displayMode = true;\n\n // stop kendo from being annoying\n e.preventDefault();\n\n var isAdd = (e.model.localeCode == undefined || e.model.sectionCode == undefined || e.model.fieldCode == undefined);\n\n if(isAdd) {\n //update the codes only when adding from the dropdowns as they dont get bind\n e.model.localeCode = angular.element(document).find('#drpLocale').data('kendoDropDownList').text();\n e.model.sectionCode = angular.element(document).find('#drpSection').data('kendoDropDownList').text();\n e.model.fieldCode = angular.element(document).find('#drpField').data('kendoDropDownList').text();\n\n //update the value of drps\n e.model.localeId = angular.element(document).find('#drpLocale').data('kendoDropDownList').value();\n e.model.sectionId = angular.element(document).find('#drpSection').data('kendoDropDownList').value();\n e.model.fieldId = angular.element(document).find('#drpField').data('kendoDropDownList').value();\n\n // locales without an id should be added\n $scope.addLocaleValue(e.model);\n } else {\n // locales value with an id should be updated\n $scope.updateLocaleValue(e.model);\n }\n\n $scope.isAdd = false;\n }\n\n /**\n * Prepares the http request for updating a locale value. Handles callbacks.\n *\n * @function\n * @param { obj } locale Value - locale object\n */\n $scope.updateLocaleValue = function(localeValue) {\n var url = __env.apiBaseUrlLocalization + '/localevalues/' + localeValue.localeId + '/' + localeValue.fieldId;\n var type = 'put';\n var data = localeValue;\n\n httpService.asyncCall(url, type, data)\n .then(function(response) {\n $scope.localeValuesGrid.refresh();\n toastr.success('Locale value successfully updated');\n }).catch(function(e){\n $scope.localeValuesGrid.cancelChanges();\n toastr.error('The Locale value could not be updated');\n });\n\n };\n\n //initially not in add mode\n $scope.isAdd = false;\n\n $scope.locales = {};\n $scope.sections = {};\n $scope.fields = {};\n\n $scope.drpLocaleOptions = {\n dataTextField: 'code',\n dataValueField: 'localeId',\n valuePrimitive: true,\n dataSource: new kendo.data.DataSource({\n transport: {\n read: function(options) {\n options.success($scope.locales);\n }\n }\n }),\n optionLabel: { code: 'Select locale...', localeId: '' },\n filter: 'startswith'\n };\n\n $scope.drpSectionOptions = {\n dataTextField: 'sectionCode',\n dataValueField: 'sectionId',\n valuePrimitive: true,\n dataSource: new kendo.data.DataSource({\n transport: {\n read: function(options) {\n options.success($scope.sections);\n }\n }\n }),\n optionLabel: { sectionCode: 'Select section...', sectionId: '' },\n filter: 'startswith',\n change: function(e) {\n $scope.selectedSectionId = this.value();\n $scope.drpFieldOptions.dataSource.read();\n }\n };\n\n $scope.drpFieldOptions = {\n autoBind: false,\n dataTextField: 'fieldCode',\n dataValueField: 'fieldId',\n valuePrimitive: true,\n dataSource: new kendo.data.DataSource({\n transport: {\n read: function(options) {\n if($scope.selectedSectionId == null)\n {\n options.success([]);\n return;\n }\n var url = __env.apiBaseUrlLocalization + '/localefields/section/' + $scope.selectedSectionId;\n httpService.asyncCall(url, 'get')\n .then(function(response) {\n options.success(response.data);\n }).catch(function(e){\n toastr.error('Could not get locale fields');\n });\n }\n }\n }),\n optionLabel: {fieldCode: 'Select field...', fieldId: ''},\n filter: 'startswith'\n };\n\n\n\n /**\n * Runs first on page load and loads required data.\n *\n * @function\n */\n $scope.init = function(){\n\n var promises = [];\n promises.push($scope.getLocales());\n promises.push($scope.getSections());\n\n //wait for all promises to finish before assigning kendo data source variable which will render the grid.\n $q.all(promises).then(function(){\n //only assign the localeValueSource once all promises finishes as the kendo grid has ng-delay on this variable.\n $scope.localeValuesSource =\n {\n type: 'aspnetmvc-ajax',\n error: function(e) { toastr.error('Could not get locale values');},\n transport: {\n read: {\n type: 'get',\n contentType: 'application/json',\n url: __env.apiBaseUrlLocalization + '/localevalues/paged/kendo',\n beforeSend: function(req) {\n req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n },\n }\n\n },\n schema: {\n data: 'data',\n total: 'total',\n model: model,\n },\n pageSize: 10,\n serverPaging: true,\n serverSorting: true,\n serverFiltering: true\n };\n });\n\n\n\n };\n\n $scope.init();\n}","\nLocaleImport.$inject = ['$scope', '__env', 'toastr', 'httpService', 'readCookie', '$q', '$http'];angular\n\t.module('app')\n\t.component('localeImportComponent', {\n\t\ttemplateUrl: 'modules/localization/components/localeImport/localeImport.html',\n\t\tcontroller: LocaleImport\n\t});\n\n/**\n * Locale import export controller; imports and exports the locale values per section\n *\n * @class Locales\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } readCookie - reads cookie variables\n */\nfunction LocaleImport($scope, __env, toastr, httpService, readCookie, $q, $http) {\t \t\n\n\t$scope.uploadedFile = function(element) {\n\t $scope.$apply(function($scope) {\n\t \tif (element.files.length > 0){\n\t \t\t$scope.fileRequired = false;\n\t \t\t$scope.csvFile = element.files[0];\t \t\t\n\t \t}\n\t });\n\t};\n\n\t$scope.importLocaleValues = function(){\n\n\t\tif($scope.fileRequired)\n\t\t\treturn;\n \n $scope.validationClass = 'valid';\n\n var url = __env.apiBaseUrlLocalization + '/localevalues/import/' + $scope.selectedSectionId;\n\t\tvar method = 'POST';\n\t\t\n\t\tvar fdata = new FormData();\n \tfdata.append('file', $scope.csvFile);\n \tvar fileName = $scope.csvFile.name;\n \t\n\t\thttpService.multiPartDataCall(url, method, fdata)\n\t\t.then(function(response) {\n\t\t\t\ttoastr.success('File imported: ' + fileName);\n\t\t\t\tconsole.log('File imported: ' + fileName);\n\t\t\t}).catch(function(e){\n\t\t\t\ttoastr.error('Could not import the file.');\t\t\t\t\n\t\t});\n\t};\n\n\t$scope.onRemove = function(e){\t\t\n\t\t$scope.$apply(function($scope) {\t \t\n\t \t$scope.fileRequired = true;\n\t });\n\t};\n\n\n\t$scope.drpSectionOptions = {\n\t // autoBind: false,\n\t dataTextField: 'sectionCode',\n\t dataValueField: 'sectionId',\n\t valuePrimitive: true,\n\t dataSource: new kendo.data.DataSource({\n\t transport: {\n\t read: function(options) {\n\t options.success($scope.sections);\n\t }\n\t }\n\t }),\n\t optionLabel: { sectionCode: 'Select section...', sectionId: '' },\n\t filter: 'startswith',\t \n\t};\n\n\t /**\n * Sets up http request to get locale sections to use with grid edits.\n * On success, loads the sections array. Uses a promise to ensure\n * the sections are loaded before the grid.\n *\n * @function \n */\n $scope.getSections = function() {\n\n \t// wait for the types to resolve\n \treturn $q(function(resolve, reject) {\n\n\t \tvar url = __env.apiBaseUrlLocalization + '/localesections';\n\t \tvar type = 'get';\n\t \tvar data = '';\n\t\t\t\n\n\t \thttpService.asyncCall(url, type, data)\n\t\t\t\t.then(function(response) {\t\t\t\t\t\n\t\t\t\t $scope.sections = response.data; \n\t\t\t\t $scope.drpSectionOptions.dataSource.read();\n\t\t\t\t\tresolve(true);\t\t\t\t\t \n\t\t\t\t}).catch(function(e){\n\t\t\t\t\ttoastr.error('Did not get locale sections');\n\t\t\t\t\treject(false);\n\t\t\t\t});\t\n\n\t\t}); \n }; \n\t\n\t/**\n * Runs first on page load and loads required data.\n *\n * @function \n */ \n $scope.init = function(){ \n\n \t$scope.selectedSectionId = null;\n \t$scope.fileRequired = true;\n\n \tvar promises = []; \t\n \tpromises.push($scope.getSections());\n\n \t//wait for all promises to finish before assigning kendo data source variable which will render the grid.\n \t$q.all(promises).then(function(){\n\n \t});\n\n };\n\n\t$scope.init();\n\t\n}","\nlocaleExport.$inject = ['$scope', '__env', 'toastr', 'httpService', 'readCookie', '$q', '$http'];angular\n\t.module('app')\n\t.component('localeExportComponent', {\n\t\ttemplateUrl: 'modules/localization/components/localeExport/localeExport.html',\n\t\tcontroller: localeExport\n\t});\n\n/**\n * Locale import export controller; imports and exports the locale values per section\n *\n * @class Locales\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } readCookie - reads cookie variables\n */\nfunction localeExport($scope, __env, toastr, httpService, readCookie, $q, $http) {\t \t\n\n\t$scope.exportLocaleValues = function(){\n \n $scope.validationClass = 'valid';\n\n \tvar url = __env.apiBaseUrlLocalization + '/localevalues/export/' + $scope.selectedSectionId;\n window.location.assign(url);\n\t};\n\n\t$scope.drpSectionOptions = {\n\t // autoBind: false,\n\t dataTextField: 'sectionCode',\n\t dataValueField: 'sectionId',\n\t valuePrimitive: true,\n\t dataSource: new kendo.data.DataSource({\n\t transport: {\n\t read: function(options) {\n\t options.success($scope.sections);\n\t }\n\t }\n\t }),\n\t optionLabel: { sectionCode: 'Select section...', sectionId: '' },\n\t filter: 'startswith',\n\t // change: function(e) {\n\t // $scope.selectedSectionId = this.value();\t \n\t // }\n\t};\n\n\n\t /**\n * Sets up http request to get locale sections to use with grid edits.\n * On success, loads the sections array. Uses a promise to ensure\n * the sections are loaded before the grid.\n *\n * @function \n */\n $scope.getSections = function() {\n\n \t// wait for the types to resolve\n \treturn $q(function(resolve, reject) {\n\n\t \tvar url = __env.apiBaseUrlLocalization + '/localesections';\n\t \tvar type = 'get';\n\t \tvar data = '';\n\n\t \thttpService.asyncCall(url, type, data)\n\t\t\t\t.then(function(response) {\t\t\t\t\t\n\t\t\t\t $scope.sections = response.data; \n\t\t\t\t $scope.drpSectionOptions.dataSource.read();\n\t\t\t\t\tresolve(true);\t\t\t\t\t \n\t\t\t\t}).catch(function(e){\n\t\t\t\t\ttoastr.error('Did not get locale sections');\n\t\t\t\t\treject(false);\n\t\t\t\t});\t\n\n\t\t}); \n }; \n\t\n\t/**\n * Runs first on page load and loads required data.\n *\n * @function \n */ \n $scope.init = function(){ \n\n \t$scope.selectedSectionId = null;\n \t$scope.fileRequired = true;\n\n \t$scope.getSections();\n\n };\n\n\t$scope.init();\n\t\n}","(function() {\n Email.$inject = ['$scope'];\n\n angular\n \t.module('app')\n \t.component('email', {\n \t\ttemplateUrl: 'modules/emailSending/pages/email.html',\n \t\tcontroller: Email,\n bindings: {\n permissions: '<'\n }\n \t});\n\n function Email($scope) { \n\n var perms = this.permissions;\n $scope.pagePermissions = [];\n\n // rewrite the permissions array to be easily checked\n for (var i = 0; i < perms.length; i++){ \n $scope.pagePermissions[perms[i]] = true;\n } \n\n if (typeof($scope.pagePermissions.write) == 'undefined'){\n \n $scope.pagePermissions.write = false;\n }\n }\n})();","(function() {\n \n angular\n \t.module('app')\n \t.component('portal', {\n \t\ttemplateUrl: 'modules/portals/pages/portal.html',\n \t\tcontroller: Portal,\n \t\tbindings: {\n \t\t\tpermissions: '<',\n portalTypes: '<'\n \t\t}\n \t});\n\n function Portal() {}\n \n})();","(function() {\n Localization.$inject = ['$scope'];\n\n\tangular\n\t\t.module('app')\n\t\t.component('localization', {\n\t\t\ttemplateUrl: 'modules/localization/pages/localization.html',\n\t\t\tcontroller: Localization,\n\t\t\t bindings: {\n permissions: '<'\n }\n\t\t});\n\n\tfunction Localization($scope) {\n\n\t\tvar perms = this.permissions;\n $scope.pagePermissions = [];\n\n // rewrite the permissions array to be easily checked\n for (var i = 0; i < perms.length; i++){ \n $scope.pagePermissions[perms[i]] = true;\n } \n\n if (typeof($scope.pagePermissions.write) == 'undefined'){\n \n $scope.pagePermissions.write = false;\n }\n\t}\n})();","(function() {\n Header.$inject = ['$scope', '$http', '$location', '__env', 'toastr', 'httpService', 'readCookie', '$log'];\n\n angular.module('app')\n .component('headerComponent', {\n templateUrl: 'common/components/header/header.html',\n controller: Header,\n bindings: {\n headerOptions: '=',\n userOptions: '='\n }\n });\n\n /**\n * Header file for admin controls\n *\n * @class Header\n * @param { Object } $scope - The scope of the controller.\n * @param { Object } $http - The Angular $http service.\n * @param { Object } $location - The Angular $location service.\n * @param { Object } $translate - The translation service.\n * @param { Object } __env - The environment configuration.\n * @param { Object } toastr - The third party toaster service.\n * @param { Object } httpService - The service to send http calls.\n * @param { service } $log - The service to log to console (or to file if needed).\n */\n function Header($scope, $http, $location, __env, toastr, httpService, readCookie, $log){\n 'ngInject';\n\n var portals = this.userOptions;\n $scope.acms = [];\n $scope.admins = [];\n $scope.menuOptions = [{name: 'Portal Selection', url: __env.currentUrl + '#/portalList'}];\n $scope.secondaryMenuOptions = [];\n\n for (var i = 0; i < portals.length; i++) {\n if (portals[i].portalTypeId === 2) {\n $scope.acms.push(portals[i]);\n } else if (portals[i].portalTypeId === 1) {\n $scope.admins.push(portals[i]);\n\n // set the menu based on portals user can access\n // this can be cleaned up\n if (portals[i].portalName === 'User Management' ||\n portals[i].portalName === 'Portal Management' ||\n portals[i].portalName === 'Report Portal') {\n\n $scope.menuOptions.push({\n name: portals[i].portalName,\n url: portals[i].baseUri + portals[i].homePageRelativeUri\n });\n } else {\n $scope.secondaryMenuOptions.push({\n name: portals[i].portalName,\n url: portals[i].baseUri + portals[i].homePageRelativeUri\n });\n }\n }\n }\n\n $scope.userEmail = readCookie.getByName(__env.emailCookieName);\n $scope.portalList = {};\n $scope.showSecondaryMenu = false;\n $scope.pageTitle = this.headerOptions.projectName;\n $scope.languages = this.headerOptions.languages;\n\n if ($scope.secondaryMenuOptions.length > 0) {\n $scope.showSecondaryMenu = true;\n }\n\n /**\n * Creates the cookie used for authentication\n *\n * @function createCookie\n * @param { string } name - name of the cookie\n * @param { string } value - value of the cookie\n * @param { string } expires - When the cookie will expires\n */\n $scope.createCookie = function(name, value, expires) {\n // Domain -- This should likely be .dev.assentcompliance.com for dev instances instead of a catch-all\n console.log('code', __env);\n document.cookie = name + '=' + value + ';expires=' + expires + ';domain=' + __env.domain + ';';\n };\n\n\n /**\n * clears the cookies and logs the user out. Redirects to login page on\n * success or failure\n *\n * @function\n * @param { string } name - name of the cookie\n */\n $scope.logout = function () {\n // set the expiry on the cookie\n $scope.createCookie('sessionKey', '', new Date().getTime());\n $scope.createCookie('email', '', new Date().getTime());\n\n var url = __env.apiBaseUrl + '/login/logout/' + readCookie.getByName(__env.sessionCookieName);\n var type = 'post';\n var data = '';\n\n httpService.asyncCall(url, type, data)\n .then(function (response) {\n location.href = __env.loginPage;\n }).catch(function (e) {\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n $log.error(message);\n location.href = __env.loginPage;\n });\n };\n };\n})();\n","(function() {\n PortalDropdown.$inject = ['$scope', '$location', '$q', 'toastr', '__env', 'httpService', 'readCookie'];\n\n angular\n .module('app')\n .component('portalDropdown', {\n templateUrl: 'common/components/portalDropdown/portalDropdown.html',\n controller: PortalDropdown,\n bindings: {}\n });\n\n /** @ngInject */\n /**\n * PortalDropdown\n *\n * @function createCookie\n * @param { service } $scope - the scope of the this controller\n * @param { service } $location - service to provide locations support\n * @param { service } $q - provides deferred promises support\n * @param { service } __env - The environment configuration. \n * @param { service } httpService - provides async http requests\n * @param { service } readCookie - read cookie variables\n */\n\n function PortalDropdown($scope, $location, $q, toastr, __env, httpService, readCookie) {\n\n\n $scope.$on('$locationChangeSuccess', function(){\n $scope.setPageName();\n \n });\n\n /** \n * Sets the menu name to the current page name based on the current url \n *\n * @function setPageName \n */\n $scope.setPageName = function() {\n\n // remove the parameters from the absolute path\n var currentPath = $location.absUrl().split('?')[0];\n var portals = $scope.userPortalList;\n\n // loop through portals and check for a match against the current page\n for(var i = 0; i < portals.length; i++){ \n\n if (currentPath == portals[i].baseUri) {\n\n // set the page name\n $scope.currentPage = portals[i].portalName;\n }\n\n } \n };\n\n /** \n * gets a list of all portals the user can see up front for the dropdown\n * navigation\n *\n * @function \n */\n $scope.getUserPortals = function() { \n\n return $q(function(resolve, reject) {\n sessionKey = readCookie.getByName(__env.sessionCookieName);\n $scope.userPortalList = [];\n $scope.currentPage = '';\n\n var currentPath = $location.absUrl();\n \n var url = __env.apiBaseUrlPortal + '/portals/session/' + sessionKey;\n var data = '';\n var type = 'get';\n\n httpService.asyncCall(url, type, data)\n .then(function(response) {\n\n var portals = response.data.data;\n\n portals.push({\n 'portalId': 0,\n 'portalName': 'Portal Selection', \n 'baseUri': __env.currentUrl.substring(0, __env.currentUrl.length - 1), \n 'homePageRelativeUri': '/#/',\n 'portalTypeId': 1\n });\n \n for(var i = 0; i < portals.length; i++){\n\n if (portals[i].portalTypeId === 2) {\n portals[i].baseUri += '/' + $scope.targetPage;\n } else if (portals[i].portalTypeId === 1) {\n portals[i].baseUri += portals[i].homePageRelativeUri;\n }\n\n \n if (currentPath == portals[i].baseUri) {\n $scope.currentPage = portals[i].portalName;\n } \n\n $scope.userPortalList.push(portals[i]);\n } \n\n resolve(); \n \n\n }).catch(function(e){\n \n reject(); \n }); \n });\n \n };\n\n /**\n * Runs first on page load and loads required data.\n *\n * @function \n */ \n var init = function() { \n\n var promise = $scope.getUserPortals();\n \n promise.then(function() {\n $scope.setPageName();\n }, function() {\n toastr.error('Could not retrieve your portals');\n });\n\n \n if($location.search().pg == 'undefined' || typeof($location.search().pg) == 'undefined'){\n $scope.targetPage = ''; \n } else {\n $scope.targetPage = $location.search().pg;\n }\n\n };\n\n init();\n \n }\n})();","(function() {\n BlacklistedEmailSearch.$inject = ['$scope', '__env', 'toastr', 'httpService', '$log'];\n\n angular\n \t.module('app')\n \t.component('blacklistedEmailSearchComponent', {\n \t\ttemplateUrl: 'modules/emailSending/components/blacklistedEmailSearch/blacklistedEmailSearch.html',\n \t\tcontroller: BlacklistedEmailSearch\n \t});\n\n /**\n * Searches for, adds and removes emails from the black list\n *\n * @class BlackListedEmailSearch\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } $log - The service to log to console (or to file if needed).\n */\n function BlacklistedEmailSearch($scope, __env, toastr, httpService, $log) {\n\n\n \t///////////////////////////////////////////////////////////////////////////\n \t// Members\n \t///////////////////////////////////////////////////////////////////////////\t\n \t$scope.showResults = false;\n \t$scope.pageTitle = 'Blacklisted Emails';\n \t\n\n \t///////////////////////////////////////////////////////////////////////////\n \t// Functions\n \t///////////////////////////////////////////////////////////////////////////\t\n\n \t// columns of the grid\n \tvar columns = [\n \t\t{\n \t\t\tfield: 'emailAddress',\n \t\t\ttitle: 'Email',\n \t\t\twidth: '30%'\n \t\t}, \n \t\t{\n \t\t\tfield: 'blacklistedDate',\n \t\t\ttitle: 'Date Blacklisted',\n \t\t\twidth: '30%'\n \t\t},\n \t\t{ \n \t\t\tcommand: ['destroy'], \n hidden: !$scope.$parent.pagePermissions.write,\n \t\t\ttitle: ' ', \n \t\t\twidth: '18%'}\n \t];\n\n \t// model to bind to\n \tvar model = {fields : {\n \t\t\t\t\t\t'emailAddress': { type: 'string' }\t\t\t\t\t\t\n \t\t\t\t\t}}; \n\n \t$scope.blacklistedOptions = { \t\n \t\tautoBind: false,\t\n columnMenu: false, \n columns: columns, \n editable: true, \n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false, \n pageable: true,\n remove: deleteEvent, \n scrollable: true, \n sortable: true \n };\t\n\n // commented until the endpoints exist\n $scope.blacklistedSource = \n {\t \t\n \t//data: categories\n \t\ttype: 'aspnetmvc-ajax',\t\t\n error: function(e) { toastr.error('Could not get blacklisted emails');},\t \n \t\ttransport: {\n \t\t\tread: {\t\t\t\t\n \t\t\t\ttype: 'get',\n \t\t\t\tcontentType: 'application/json',\t\n \t\t\t\turl: __env.apiBlacklistedEmails + 'paged/kendo'\t\t\t\t \n \t\t\t}\n \t\t},\t\t\t\n \t\tschema: {\n data: 'data',\n total: 'total', \n model: model, \n }, \n pageSize: 10, \n serverPaging: true,\n serverSorting: true,\n serverFiltering: true \n \t};\n\n \t/**\n * Adds a new email to the blacklist.\n *\n * @function addEmail\n */\n \t$scope.addEmail = function() {\t\n\n \t\t// send the new email\n \t\tvar email = {\n \t\t\temailAddress: $scope.blacklistedEmail\n \t\t};\n\n \t\t// clear the field\n \t\t$scope.blacklistedEmail = '';\n\n \t\tvar url = __env.apiBlacklistedEmails;\n \t\tvar data = email;\n \t\tvar type = 'post';\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\t// add the email here\n \t\t\t\ttoastr.success('Email has been successfully added to the blacklist.');\t\n \t\t\t\t$scope.blacklistedGrid.dataSource.read();\n\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('Email could not be added to the blacklist.');\t\t\t\t\n \t\t\t});\t\t\t\n\n \t\t$scope.showResults = true;\n \t};\n\n /**\n * Hides the email list\n *\n * @function closeEmailList\n */\n $scope.closeEmailList = function() {\n $scope.showResults = false;\n };\n\n \t/**\n * Removes an email from the black list\n *\n * @function removeEmail\n * @param { string } email - the email to be deleted\n */\n \t$scope.deleteEmail = function(email) {\t\t\n\n \t\tvar url = __env.apiBlacklistedEmails + email;\n \t\tvar data = '';\n \t\tvar type = 'delete';\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\t\t\t\t\n \t\t\t\ttoastr.success('Email has been successfully removed from the blacklist.');\t\t\t\t\n \t\t\t\t//remove the email here\n \t\t\t}).catch(function(e){\n var message = 'Status: ' + e.status + \n '; Error:' + e.statusText;\n \n \n $log.error(message); \n \t\t\t\ttoastr.error('Email could not be removed from the blacklist.');\t\t\t\t\n \t\t\t});\t\n \t};\n\n \t/**\n * Handles the delete event fired from the kendo grid\n *\n * @function removeEmail\n * @param { event } e - the kendo delete event\n */\n \tfunction deleteEvent(e) {\n \t\te.preventDefault();\n\n \t\temail = e.model.emailAddress;\n \t\t$scope.deleteEmail (email);\n \t}\n \t\n \t/**\n * Searches the black list for an email\n *\n * @function searchEmail\n */\n \t$scope.searchEmail = function() {\t\t\n \t\t\n \t\tvar email = this.blacklistedEmail;\t\n \t\tthis.blacklistedEmail = '';\n\n \t\tif (typeof(email) != 'undefined' && email.length > 0) {\n \t\t\t\n\n \t\t\t$scope.blacklistedGrid.dataSource.filter(\n \t\t\t{\t\t\t\t\t\n \t\t\t\tfield: 'emailAddress', \n \t\t\t\toperator: 'contains', \n \t\t\t\tvalue: email\n \t\t\t}); \n \t\t} else {\n \t\t\t// clear the search and return all fields\n \t\t\t$scope.blacklistedGrid.dataSource.filter({});\n \t\t}\n\n \t\t$scope.showResults = true;\t\n \t\t\n \t};\n }\n})();","(function() {\n BounceCategories.$inject = ['$scope', '__env', 'toastr', 'httpService', '$log'];\n\n angular\n \t.module('app')\n \t.component('bounceCategoriesComponent', {\n \t\ttemplateUrl: 'modules/emailSending/components/bounceCategories/bounceCategories.html',\n \t\tcontroller: BounceCategories\n \t});\n\n /**\n * Code supporting the kendo grid that displays bounce categories \n * and performs CRUD opperations\n *\n * @class BounceCategories\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n */\n function BounceCategories($scope, __env, toastr, httpService, $log) {\t\n\n \n \t// columns of the grid\n \tvar columns = [\n \t\t{\n \t\t\tfield: 'code',\n \t\t\ttitle: 'Code',\n \t\t\twidth: '30%'\n \t\t}, \n \t\t{\n \t\t\tfield: 'description',\n \t\t\ttitle: 'Description',\n \t\t\twidth: '30%'\n \t\t}, \n \t\t{\n \t\t\tfield: 'isHardBounce',\n \t\t\ttitle: 'Hard Bounce',\n \t\t\twidth: '12%'\n \t\t},\n \t\t{ \n \t\t\tcommand: ['edit', 'destroy'], \n \t\t\ttitle: ' ',\n hidden: !$scope.$parent.pagePermissions.write,\n \t\t\twidth: '18%'}\n \t];\n\n \t// model to bind to\n \tvar model = { id: 'id', \n \t\t\t\t\tfields : {\n \t\t\t\t\t\t'code': { type: 'string' },\n \t\t\t\t\t\t'description': { type: 'string' },\n \t\t\t\t\t\t'isHardBounce': { type: 'boolean' }\n \t\t\t\t\t}}; \n\n \t$scope.pageTitle = 'Bounce Categories';\n\n \t$scope.categoriesOptions = { \n columnMenu: false, \n columns: columns, \n editable: 'popup', \n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false, \n pageable: true,\n remove: deleteEvent,\n save: saveEvent,\n scrollable: true, \n sortable: true \n };\t\n\n // commented until the endpoints exist\n $scope.categoriesSource = \n {\t\n \t//data: categories\n \t\ttype: 'aspnetmvc-ajax',\t\t\n error: function(e) { toastr.error('Could not get categories');},\t \n \t\ttransport: {\n \t\t\tread: {\t\t\t\t\n \t\t\t\ttype: 'get',\n \t\t\t\tcontentType: 'application/json',\t\n \t\t\t\turl: __env.apiBounceCategories + 'paged/kendo'\t\t\t\t \n \t\t\t}\n \t\t},\t\t\t\n \t\tschema: {\n data: 'data',\n total: 'total', \n model: model, \n }, \n pageSize: 20, \n serverPaging: true,\n serverSorting: true,\n serverFiltering: true \n \t};\n\n \t/**\n * Triggers the new row add for a kendo grid.\n *\n * @function addNewCategory\n */\n \t$scope.addNewCategory = function() {\t\t\n\n \t\t// trigger the add event \n \t\tthis.categoriesGrid.addRow();\n \t};\n\n \t/**\n * Prepares the http request for adding a new category. Handles callbacks\n *\n * @function \n * @param { object } category - category to be added\n */ \n \t$scope.addCategory = function(category) {\n \t\tvar url = __env.apiBounceCategories;\n \t\tvar type = 'post';\n \t\tvar data = category;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Category successfully added');\t\t\t\t\n \t\t\t\t$scope.categoriesGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The Category could not be added');\n var message = 'Status: ' + e.status + \n '; Error:' + e.statusText;\n \n \n $log.error(message); \n \t\t\t\t$scope.categoriesGrid.dataSource.read();\n \t\t\t});\t\t\t\n \t};\n\n \t/**\n * Prepares the http request for deleting a category. Handles callbacks\n *\n * @function \n * @param { int } categoryId - id of category to be deleted\n */ \n $scope.deleteCategory = function(categoryId) {\n\n \tvar url = __env.apiBounceCategories + categoryId;\n \t\tvar type = 'delete';\n \t\tvar data = '';\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Category successfully deleted');\t\t\t\t\n \t\t\t\t$scope.categoriesGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The Category could not be deleted');\n var message = 'Status: ' + e.status + \n '; Error:' + e.statusText;\n \n \n $log.error(message); \n \t\t\t\t$scope.categoriesGrid.dataSource.read();\n \t\t\t});\t\t\t\t\n \t};\n\n \t/**\n * handles save delete for the category grid.\n *\n * @function \n * @param { event } e - delete row event\n */ \n \tfunction deleteEvent(e) {\n \t\te.preventDefault();\n\n \t\t$scope.deleteCategory(e.model.bounceCategoryId); \n \t}\n\n \t/**\n * handles save event for the category grid.\n *\n * @function \n * @param { event } e - save row event\n */ \n \tfunction saveEvent(e) {\n\n \t\t$scope.displayMode = true; \n\n \t\t// stop kendo from being annoying\n \t\te.preventDefault();\n\n \t\tif(e.model.bounceCategoryId > 0) {\n\n \t\t\t// categories with an id should be updated\t\t\t\n \t\t\t$scope.updateCategory(e.model);\n \t\t} else {\n \t\t\te.model.bounceCategoryId = 0;\n\n \t\t\t// categories without an id should be added\n \t\t\t$scope.addCategory(e.model);\n \t\t}\n \t}\n\n \t/**\n * Prepares the http request for updating a category. Handles callbacks.\n *\n * @function \n * @param { obj } category - category object\n */ \n $scope.updateCategory = function(category) { \n \tvar url = __env.apiBounceCategories + category.bounceCategoryId;\n \t\tvar type = 'put';\n \t\tvar data = category;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Category successfully updated');\t\t\t\t\n \t\t\t\t$scope.categoriesGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The Category could not be updated');\n var message = 'Status: ' + e.status + \n '; Error:' + e.statusText;\n \n \n $log.error(message); \n \t\t\t\t$scope.categoriesGrid.dataSource.read();\n \t\t\t});\t\t\n \t\t\n };\n }\n})();","(function() {\n BounceSettings.$inject = ['$scope', '__env', 'toastr', 'httpService', '$log'];\n\n angular\n \t.module('app')\n \t.component('bounceSettingsComponent', {\n \t\ttemplateUrl: 'modules/emailSending/components/bounceSettings/bounceSettings.html',\n \t\tcontroller: BounceSettings\n \t});\n\n /**\n * Retrieves and updates Bounce settings.\n *\n * @class BounceSettings\n * @param { service } $scope - The scope of the component.\n * @param { service } __env - The environment configuration. \n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The http service used to make asynchronous rest calls\n * @param { service } $log - The service to log to console (or to file if needed)\n */\n function BounceSettings($scope, __env, toastr, httpService, $log) {\n \t///////////////////////////////////////////////////////////////////////////\n \t// Members\n \t///////////////////////////////////////////////////////////////////////////\t\n\n \t$scope.$parent.pageTitle = 'Email Management Portal';\n \t$scope.isLocked = true;\n \t$scope.bounceSettings = {};\n \t$scope.defaultBounceSettings = {};\n \t\n \t$scope.pageTitle = 'Bounce Settings';\n\n \t\n\n \t///////////////////////////////////////////////////////////////////////////\n \t// Functions\n \t///////////////////////////////////////////////////////////////////////////\t\n\n \t/**\n * Cancel button click handler that disables the fields and resets the values\n * to the default values\n *\n * @function cancelBounceEdit\n */\n \t$scope.cancelBounceEdit = function() {\t\t\t\n \t\t$scope.bounceSettings = angular.copy($scope.defaultBounceSettings);\t\n \t\t$scope.isLocked = true;\n \t};\n\n \t/**\n * Edit button click handler that enables or disables editing\n *\n * @function editBounceSettings\n */\n \t$scope.editBounceSettings = function() {\n \t\tif($scope.isLocked) {\n \t\t\t$scope.defaultBounceSettings = angular.copy($scope.bounceSettings);\n \t\t\t$scope.isLocked = false;\n \t\t} else {\n \t\t\t$scope.cancelBounceEdit();\n \t\t}\n \t};\n\n \t//this is the key I'm using: services/sendingservice/v1/emailstore\n\n \t/**\n * Gets the bounce settings from the server to be displayed\n *\n * @function getBounceSettings\n */\n \t$scope.getBounceSettings = function() {\n \t\tvar url = __env.consul;\n \t\tvar data = '';\n \t\tvar type = 'get';\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n\n \t\t\t\t// set the variable that shows on the ui\n \t\t\t\t$scope.bounceSettings = response.data;\t\t\t\t\t\n\n \t\t\t}).catch(function(e){\n\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n \n \n \n $log.error(message); \n \t\t\t\ttoastr.error('Your request for bounce settings bounced. Sorry!');\t\t\t\t\n \t\t\t});\t\n \t};\n\n \t/**\n * Sends the new bounce settings to server to be updated\n *\n * @function updateBounceSettings\n */\n \t$scope.updateBounceSettings = function() {\n \t\t// send the new bounce settings\n \t\tvar url = __env.consul;\n \t\tvar data = this.bounceSettings;\n \t\tvar type = 'put';\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\t\t\t\t\n \t\t\t\t$scope.isLocked = true;\n\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('Could not update the bounce settings.');\t\t\n var message = 'Status: ' + e.status + \n '; Error:' + e.statusText;\n \n $log.error(message); \n \t\t\t\t$scope.cancelBounceEdit();\t\t\n \t\t\t});\t\n \t};\n\n \t$scope.init = function(){\n \t\t$scope.getBounceSettings();\n \t};\n\n \t$scope.init();\n }\n})();","(function() {\n UserGrid.$inject = ['$scope', '$http', '$location', '__env', 'toastr', 'httpService', 'readCookie', '$log'];\n\n angular\n \t.module('app')\n \t.component('userGridComponent', {\n \t\ttemplateUrl: 'modules/users/components/userGrid/userGrid.html',\n \t\tcontroller: UserGrid\n \t});\n\n /**\n * Constructor for userPortalController\n *\n * @class userPortalController\n * @param { Object } $scope - The scope of the controller.\n * @param { Object } $http - The Angular $http service.\n * @param { Object } $location - The Angular $location service.\n * @param { Object } __env - The environment configuration.\n * @param { Array } auth - The resolved response from the auth check in the module.\n * @param { Array } permissionPermissions - The The resolved response from the permission check in the module.\n * @param { Object } toastr - The third party toaster service.\n * @param { Object } httpService - The service to send http calls.\n * @param { service } $log - The service to log to console (or to file if needed)\n */\n function UserGrid($scope, $http, $location, __env, toastr, httpService, readCookie, $log){\n \t///////////////////////////////////////////////////////////////////////////\n \t// Members\n \t///////////////////////////////////////////////////////////////////////////\n\n \t$scope.permissionChecks = {};\n \t$scope.pagePermissions = {};\n $scope.permissionPermissions = {};\n\n \t$scope.pageTitle = 'User Management';\n \t$scope.modalEmail = '';\n\n var permissionPerms = $scope.$parent.$ctrl.permissionPermissions;\n\n // rewrite permission permissions to be easily checked\n for (var i = 0; i < permissionPerms.length; i++){\n $scope.permissionPermissions[permissionPerms[i]] = true;\n }\n\n var perms = $scope.$parent.$ctrl.permissions.data;\n\n \t// rewrite the permissions array to be easily checked\n \tfor (var i = 0; i < perms.length; i++){\n \t\t$scope.pagePermissions[perms[i]] = true;\n \t}\n\n \t// USER GRID SETUP ---------------------------------------------------------------//\n \t// column properties for the user grid\n \tvar columns = [\n \t {\n \t field: 'email',\n \t title: 'Email',\n \t width: '100px',\n \t },\n \t {\n \t \tfield: 'isEmailConfirmed',\n \t \ttitle: 'Email Confirmed',\n \t \twidth: '35px',\n \t \tattributes:{ class:'center' },\n groupable: false,\n filterable: false,\n template: ''\n \t },\n \t {\n \t \tfield: 'lastPasswordChangeDate',\n \t \ttitle: 'Last Password Change',\n \t \twidth: '50px',\n \t \ttemplate: '#= lastPasswordChangeDate != null ? kendo.toString(kendo.parseDate(lastPasswordChangeDate), \"yyyy-MM-dd\") : \"\"#'\n \t },\n \t {\n \t \tfield: 'mustChangePassword',\n \t \ttitle: 'Force Password Change',\n \t \twidth: '30px',\n \t \tattributes:{ class:'center' },\n groupable: false,\n filterable: false,\n template: ''\n \t },\n \t {\n \t \tfield: 'isLockoutEnabled',\n \t \ttitle: 'Allow Lock Out',\n \t \twidth: '30px',\n \t \tattributes:{ class:'center' },\n groupable: false,\n filterable: false,\n template: ''\n \t },\n \t {\n \t \tfield: 'lockoutEndDateUtc',\n \t \ttitle: 'Locked Until (UTC)',\n \t \twidth: '45px',\n \t \tformat: '{0:yyyy-MM-dd h:mm tt}',\n \t \ttemplate: '#= lockoutEndDateUtc != null ? kendo.toString(kendo.parseDate(lockoutEndDateUtc), \"yyyy-MM-dd h:mm tt\") : \"\"#'\n \t },\n \t {\n \t \tfield: 'deactivated',\n\t\t\t\t\ttitle: 'User Status',\n\t\t\t\t\tattributes:{ class:'center' },\n \t \twidth: '40px',\n \t \ttemplate: '#= deactivated ? \"Deactivated\" : \"Active\"#'\n \t }\n \t ];\n\n \t// create the edit column\n column = {\n \tcommand: [],\n \ttitle: ' ',\n \twidth: '100px'\n };\n\n // if the user can read permissions, add permissions to the command\n if($scope.permissionPermissions.read || $scope.permissionPermissions.write){\n \tcolumn.command.push({\n \t\t\ttemplate: ''\n \t\t});\n }\n\n if($scope.pagePermissions.write){\n \tcolumn.command.push('edit');\n \tcolumn.command.push('destroy');\n }\n\n if(column.command.length > 0) {\n \tcolumns.push(column);\n }\n\n // model kendo uses to bind the data to the grid\n\t\tvar model = {\n\t\t\tid: 'userId',\n\t\t\tfields: {\n\t\t\t\t'selectUsers': { editable: false },\n\t\t\t\t'email': { type: 'string' },\n\t\t\t\t'active': { type: 'boolean' },\n\t\t\t\t'isEmailConfirmed': { type: 'boolean' },\n\t\t\t\t'lastPasswordChangeDate': { type: 'date', editable: false },\n\t\t\t\t'mustChangePassword': { type: 'boolean', defaultValue: true },\n\t\t\t\t'isLockoutEnabled': { type: 'boolean', defaultValue: true },\n\t\t\t\t'lockoutEndDateUtc': { type: 'date', defaultValue: '' },\n\t\t\t\t'deactivated' : { type: 'boolean', defaultValue: false }\n\t\t\t}\n\t\t};\n\n // kendo data source for the User Grid\n \t$scope.userSource = {\n \t\ttype: 'aspnetmvc-ajax',\n error: readError,\n \t\ttransport: {\n \t\t\tread: {\n \t\t\t\ttype: 'get',\n \t\t\t\tcontentType: 'application/json',\n \t\t\t\turl: __env.apiBaseUrlUser + 'users/paged/kendo',\n \t\t\t\tbeforeSend: function(req) {\n \t\t req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t\t req.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n\t\t\t\t\t},\n \t\t\t},\n \t\t},\n \t\tschema: {\n data: 'data',\n total: 'total',\n model: model,\n },\n pageSize: 20,\n serverPaging: true,\n serverSorting: true,\n serverFiltering: true,\n sort: {\n field: 'email',\n dir: 'asc'\n }\n \t};\n\n \t// kendo grid options for the User grid\n $scope.userOptions = {\n \tcancel: function(e){ $scope.displayMode = true; },\n columnMenu: false,\n columns: columns,\n detailInit: function(e){ $scope.detailInit(e); },\n edit: function(e){ $scope.editUser(e); },\n\t\t\teditable: {\n\t\t\t\tmode: 'popup',\n\t\t\t\ttemplate: kendo.template($('#userEdit').html())\n\t\t\t},\n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false,\n pageable: true,\n remove: deleteEvent,\n save: saveEvent,\n scrollable: true,\n selectable: 'multiple',\n sortable: true\n };\n // END USER GRID SETUP -------------------------------------------------------------//\n\n // PORTAL GRID SETUP ---------------------------------------------------------------//\n // columns for the portal table\n\t\tvar portalColumns = [\n\t\t\t{\n\t\t\t\tfield: 'portalName',\n\t\t\t\ttitle: 'Portal Name',\n\t\t\t\teditable: false,\n\t\t\t\twidth: 75\n\t\t\t},\n\t\t\t{\n\t\t\t\tfield: 'baseUri',\n\t\t\t\ttitle: 'Portal URI',\n\t\t\t\teditable: false,\n\t\t\t\twidth: 75\n\t\t\t},\n\t\t\t{\n\t\t\t\tfield: 'homePageRelativeUri',\n\t\t\t\ttitle: 'Relative URI',\n\t\t\t\teditable: false,\n\t\t\t\twidth: 75\n\t\t\t}\n\t\t];\n\n if($scope.pagePermissions.write) {\n\t\t\tportalColumns.push(\n\t\t\t\t{\n\t\t\t\t\tcommand: [{ name: 'destroy', text: 'Remove' }],\n\t\t\t\t\ttitle: ' ',\n\t\t\t\t\twidth: 45\n\t\t\t\t});\n }\n\n\t\tvar portalModel = {\n\t\t\tid: 'portalid',\n\t\t\tfields: {\n\t\t\t\t'portalName': { type: 'string' },\n\t\t\t\t'baseUri': { type: 'string' },\n\t\t\t\t'homePageRelativeUri': { type: 'string' }\n\t\t\t}\n\t\t};\n\n $scope.isPermissionVisible = false;\n $scope.displayMode = true;\n\n // kendo multiselect options for the portal dropdown\n $scope.portalSearchOptions = {\n \t\tplaceholder: 'Select Portals...',\n dataTextField: 'portalName',\n dataValueField: 'portalId',\n valuePrimitive: true,\n autoBind: false,\n dataSource: {\n type: 'aspnetmvc-ajax',\n serverFiltering: true,\n transport: {\n read: {\n type: 'get',\n contentType: 'application/json',\n url: __env.apiBaseUrlPortal + 'portals/paged/kendo',\n \t\t\t\t\tbeforeSend: function(req) {\n \t\t\t req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t\t\t req.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n\t\t\t\t\t\t}\n }\n },\n schema: {\n data: 'data',\n total: 'total'\n },\n sort: {\n field: 'portalName',\n dir: 'asc'\n }\n }\n \t};\n\n \t// END PORTAL GRID SETUP ---------------------------------------------------------------//\n\n if($scope.pagePermissions.write) {\n \t$scope.userOptions.toolbar = [\n \t\t{ template: kendo.template($('#portalSearch').html()) }\n \t\t];\n }\n\n ///////////////////////////////////////////////////////////////////////////\n \t// Functions\n \t///////////////////////////////////////////////////////////////////////////\n\n \t/**\n * handles delete event for the user grid.\n *\n * @function\n * @param { event } e - delete row event\n */\n\t\tfunction deleteEvent(e) {\n\t\t\te.preventDefault();\n\t\t\tif (confirm('Are you sure you want to delete the user?')) {\n\t\t\t\t$scope.deleteUser(e.model.userId);\n\t\t\t} else {\n\t\t\t\t$scope.userGrid.dataSource.read();\n\t\t\t}\n \t}\n\n \t/**\n * handles delete event for the portal grid.\n *\n * @function\n * @param { event } e - delete portal event\n */\n \tfunction deletePortalEvent(e) {\n \t\te.preventDefault();\n\n \t\t$scope.deletePortal(e.model, e);\n \t}\n\n \t$scope.editUser = function(e) {\n \t\t$scope.displayMode = false;\n \t\te.model.lockoutEndDateUtc = null;\n \t};\n\n \t/**\n * handles read error event for the user grid.\n *\n * @function\n * @param { event } e - read error event\n */\n \tfunction readError(e) {\n \t\ttoastr.error('Something went wrong with the read request');\n \t}\n\n \t/**\n * handles save event for the user grid.\n *\n * @function\n * @param { event } e - save row event\n */\n \tfunction saveEvent(e) {\n\n \t\t$scope.displayMode = true;\n\n \t\t// stop kendo from being annoying\n \t\te.preventDefault();\n\n \t\tif(e.model.userId > 0) {\n\n \t\t\t// users with an id should be updated\n \t\t\t$scope.updateUser(e.model);\n \t\t} else {\n \t\t\te.model.userId = 0;\n\n \t\t\t// users without an id should be added\n \t\t\t$scope.addUser(e.model);\n \t\t}\n \t}\n\n \t$scope.addNewUser = function() {\n \t\t$scope.userGrid.addRow();\n \t};\n\n \t/**\n * Prepares the http request for updating adding a group of portals\n * to a group of users. Handles callbacks.\n *\n * @function\n */\n $scope.addPortalsToUsers = function() {\n \t// get selected rows\n \tvar rows = $scope.userGrid.select();\n\n \tvar users = [];\n\n \t// loop through and put the ids in an array\n \tfor (var i = 0; i < rows.length; i++) {\n\n \t\tusers.push($scope.userGrid.dataItem(rows[i]).userId);\n \t}\n\n \tvar data = {'userIds': users, 'portalIds': $scope.portalIds };\n \tvar type = 'post';\n \tvar url = __env.apiBaseUrlUser + 'userportals/';\n\n \thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Portals have been added for selected users');\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The portals could not be added for the requested users');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n\n $log.error(message);\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t});\n\n $scope.portalIds = [];\n };\n\n \t/**\n * Prepares the http request for adding a new user.\n *\n * @function\n * @param { obj } user - user object to be added\n */\n \t$scope.addUser = function(user) {\n var url = __env.apiBaseUrlUser + 'users/';\n \t\tvar type = 'post';\n \t\tvar data = user;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('User successfully added');\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The User could not be added');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n\n $log.error(message);\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t});\n };\n\n \t/**\n * Prepares the http request for deleting a user. Handles callbacks\n *\n * @function\n * @param { int } userId - id of user to be deleted\n */\n $scope.deleteUser = function(userId) {\n \tvar url = __env.apiBaseUrlUser + 'users/' + userId;\n \t\tvar type = 'delete';\n \t\tvar data = '';\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('User successfully deleted');\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The User could not be deleted');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n\n $log.error(message);\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t});\n \t};\n\n \t/**\n * Prepares the http request for removing a portal from a user.\n *\n * @function\n * @param { obj } portal - portal to be deleted\n * @param { event } e - kendo remove button click event\n */\n $scope.deletePortal = function(portal, e) {\n \t// get the master row for the detail\n \tvar parentRow = e.row.closest('.k-detail-row').prev();\n\n \t// get the coresponding user\n \tvar user = $scope.userGrid.dataItem(parentRow);\n\n \t// find the grid so that the datasource can be refreshed\n \tvar grid = $('#portal-' + user.uid).data('kendoGrid');\n\n \t// get the data to be sent\n \tvar data = {'portalTokens': [portal.portalToken]};\n\n \tvar url = __env.apiBaseUrlUser + 'userportals/' + encodeURI(user.email) + '/portals';\n \t\tvar type = 'delete';\n \t\tvar data = data;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Portal successfully removed from user');\n \t\t\t\tgrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The portal could not be removed');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n $log.error(message);\n \t\t\t\tgrid.dataSource.read();\n \t\t\t});\n \t};\n\n \t/**\n * Inner grid displaying portals that users belong to on click.\n *\n * @function\n * @param { event } e - open grid row event\n */\n $scope.detailInit = function(e) {\n \t$('
').appendTo(e.detailCell).kendoGrid({\n \t\t//error: function(e) {debugger;},\n \t\tdataSource: {\n \t\t\ttype: 'aspnetmvc-ajax',\n \t\t\t\ttransport: {\n \t\t\t\t\tread: {\n \t\t\t\t\t\ttype: 'get',\n \t\t\t\t\t\tcontentType: 'application/json',\n \t\t\t\t\t\tbeforeSend: function(req) {\n\t\t\t\t\t\t\t\treq.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t\t\t\t\treq.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n \t\t\t\t \t},\n \t\t\t\t\t\turl: __env.apiBaseUrlUser + 'userportals/' + e.data.id + '/paged/portals'\n \t\t\t\t\t},\n \t\t\t\t},\n \t\t\t\tschema: {\n \t\t data: 'data',\n \t\t total: 'total',\n \t\t model: portalModel\n \t\t },\n \t\t pageSize: 20,\n \t\t serverPaging: true,\n \t\t serverSorting: true,\n \t\t serverFiltering: true,\n \t\t sort: {\n \t\t field: 'portalName',\n \t\t dir: 'asc'\n \t\t }\n \t\t\t},\n \t columns: portalColumns,\n \t editable: true,\n \t filterable: {\n \t extra: false,\n \t operators: {\n \t string: {\n \t contains: 'Contains',\n \t eq: 'Is equal to'\n \t }\n \t }\n \t },\n \t groupable: false,\n \t remove: deletePortalEvent,\n \t pageable: true,\n \t scrollable: true,\n \t sortable: true\n \t});\n };\n\n /**\n * gets a list of all permissions up front to populate permission modal\n *\n * @function\n */\n \t$scope.getPermissions = function() {\n \t\tvar url = __env.apiPermissions;\n \t\tvar type = 'get';\n \t\tvar data = '';\n\n httpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\t$scope.permissions = response.data;\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('Could not retrieve permission list');\n\t\t\t\t\tvar message = 'Status: ' + e.status +\n\t\t\t\t\t\t'; Error:' + e.statusText;\n\n $log.error(message);\n \t\t\t});\n \t};\n\n /**\n \t * Binds the kendo selected values to the checkbox\n \t * @function\n \t * e {event} - click event for the checkbox\n \t */\n\t\t$scope.selectUsers = function (e) {\n\t\t\tvar grid = $scope.userGrid;\n\n\t\t\tvar element = $(e.currentTarget);\n\n\t\t\tvar checked = element.is(':checked'),\n\t\t\trow = element.closest('tr'),\n\t\t\t\tdataItem = grid.dataItem(row);\n\n\t\t\tif (checked) {\n\t\t\t\trow.addClass('k-state-selected');\n\t\t\t} else {\n\t\t\t\trow.removeClass('k-state-selected');\n\t\t\t}\n\t\t};\n\n /**\n * Prepares the http request for setting or removing permission for a user.\n * On success\n *\n * @function\n * @param { event } e - checkbox click event\n * @param { element } checkbox - checkbox that was clicked\n */\n $scope.setPermission = function(e, checkbox) {\n\n \tvar permissionId = checkbox.permission.permissionId;\n \tvar permissionDisplayName = checkbox.permission.permissionDisplayName;\n\n \tvar email = $scope.modalEmail.replace('+', ' ');\n \tvar url = __env.apiUserPermissions + '/user/' + encodeURI(email) + '/permission/' + permissionId;\n \tvar data = '';\n\n \tif(this.permissionChecks[permissionDisplayName]) {\n var type = 'put';\n \t} else {\n \t\tvar type = 'delete';\n \t}\n\n\t\t\thttpService.asyncCall(url, type, data)\n\t\t\t\t.then(function (response) {\n\n\t\t\t\t}).catch(function (e) {\n\t\t\t\t\ttoastr.error('Permission was not updated');\n\t\t\t\t\tvar message = 'Status: ' + e.status +\n\t\t\t\t\t\t'; Error:' + e.statusText;\n\n\t\t\t\t\t$log.error(message);\n\t\t\t\t\t$scope.userGrid.dataSource.read();\n\t\t\t\t});\n };\n\n /**\n * Prepares the http request for getting permission for a user.\n * On success, sets the permission checkboxes\n *\n * @function\n * @param { element } button - button that fired the click event\n */\n $scope.showPermissions = function(button) {\n \t$scope.modalEmail = button.dataItem.email;\n\n \t$scope.permissionChecks = {};\n \tvar email = $scope.modalEmail.replace('+', ' ');\n\n var url = __env.apiPermissions + '/user/' + encodeURI(email);\n var type = 'get';\n var data = null;\n\n httpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\tfor(var i = 0; i < response.data.length; i++) {\n \t$scope.permissionChecks[response.data[i].permissionDisplayName] = true;\n }\n\n \t\t\t}).catch(function(e){\n\n\t\t\t\t});\n\n \t\t$scope.permissionsWindow.center().open();\n };\n\n \t/**\n * Prepares the http request for updating a user. Handles callbacks.\n *\n * @function\n * @param { obj } user - user object\n */\n $scope.updateUser = function(user) {\n \tvar url = __env.apiBaseUrlUser + 'users/' + user.userId;\n \t\tvar type = 'put';\n\t\t\tuser.email = user.email.toLowerCase();\n \t\tvar data = user;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('User successfully updated');\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The User could not be updated');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n $log.error(message);\n \t\t\t\t$scope.userGrid.dataSource.read();\n \t\t\t});\n\n\t\t};\n\n $scope.init = function() {\n \t// load all permissions on page load to populate modal\n \t$scope.getPermissions();\n };\n\n \t$scope.init();\n\t};\n})();\n","(function() {\n PortalGrid.$inject = ['$scope', '$http', '$location', '$q', '__env', 'toastr', 'httpService', 'readCookie', '$log'];\n\n angular\n \t.module('app')\n \t.component('portalGridComponent', {\n \t\ttemplateUrl: 'modules/portals/components/portalGrid/portalGrid.html',\n \t\tcontroller: PortalGrid\n \t});\n\n /**\n * Functionality for the portal grid\n *\n * @class PortalGrid\n * @param { service } $scope - The scope of the controller.\n * @param { service } $http - The Angular $http service.\n * @param { service } $location - The Angular $location service.\n * @param { service } __env - The environment configuration.\n * @param { service } toastr - The third party toaster service.\n * @param { service } httpService - The service to send http calls.\n * @param { service } $log - The service to log to console (or to file if needed)\n */\n function PortalGrid($scope, $http, $location, $q, __env, toastr, httpService, readCookie, $log){\n \t///////////////////////////////////////////////////////////////////////////\n \t// Members\n \t///////////////////////////////////////////////////////////////////////////\tgi\n\n \t$scope.pageTitle = 'Portal Management Portal';\n \t$scope.showCheckbox = true;\n \t$scope.pagePermissions = {};\n\n \tvar perms = $scope.$parent.$ctrl.permissions.data;\n \t$scope.portalTypes = $scope.$parent.$ctrl.portalTypes;\n\n \t// rewrite the permissions array to be easily checked\n \tfor (var i = 0; i < perms.length; i++){\n \t\t$scope.pagePermissions[perms[i]] = true;\n \t}\n\n \t// PORTAL GRID SETUP ---------------------------------------------------------------//\n // columns for the portal table\n var portalColumns = [\n \t\t\t\t\t {\n \t\t\t\t\t field: 'portalName',\n \t\t\t\t\t title: 'Portal Name',\n \t\t\t\t\t width: '50px'\n \t\t\t\t\t },\n \t\t\t\t\t {\n \t\t\t\t \t\tfield: 'baseUri',\n \t\t\t\t\t title: 'Portal URI',\n \t\t\t\t\t width: '90px'\n \t\t\t\t\t },\n \t\t\t\t\t {\n \t\t\t\t \t\tfield: 'homePageRelativeUri',\n \t\t\t\t\t title: 'Relative URI',\n \t\t\t\t\t width: '50px'\n \t\t\t\t\t },\n {\n field: 'hostName',\n title: 'Host Name',\n width: '75px'\n },\n \t\t\t\t\t {\n \t\t\t\t\t \tfield: 'portalTypeId',\n \t\t\t\t\t \ttitle: 'Portal Type',\n \t\t\t\t\t \twidth: '50px',\n \t\t\t\t\t \teditor: portalTypeEditor,\n \t\t\t\t\t \tfilterable: false,\n \t\t\t\t\t \ttemplate: function(dataItem) {\n \t\t\t\t\t\t\t\treturn $.grep($scope.portalTypes, function(e){ return e.portalTypeId == dataItem.portalTypeId; }).pop().portalTypeName;\n \t\t\t\t\t \t}\n \t\t\t\t\t },\n \t\t\t\t\t {\n \t\t\t\t \t\tfield: 'portalToken',\n \t\t\t\t\t title: 'Portal Token',\n \t\t\t\t\t width: '100px'\n \t\t\t\t\t }\n \t\t\t\t ];\n\n // check the write permission before giving edit buttons\n if($scope.pagePermissions.write) {\n \tportalColumns.push({\n \t\t\t\t\t \tcommand: ['edit','destroy'],\n \t\t\t\t\t \ttitle: ' ',\n \t \t\t\t\t\twidth: '70px'\n \t\t\t\t\t });\n }\n\n // kendo model for portals\n var portalModel = { id: 'portalId',\n \t\t\t\t\t\tfields : {\n \t\t\t\t\t\t\t'selectPortals': { editable: false },\n \t\t\t\t\t\t\t'portalName': { type: 'string' },\n \t\t\t\t\t\t\t'baseUri': { type: 'string' },\n \t\t\t\t\t\t\t'homePageRelativeUri': { type: 'string' },\n 'hostName': { type: 'string' },\n \t\t\t\t\t\t\t'portalToken': { type: 'string', editable: false },\n \t\t\t\t\t\t\t'portalTypeId': {defaultValue: 1}\n \t\t\t\t\t\t}};\n\n\n\n \t// kendo grid options for the Portal grid\n $scope.portalOptions = {\n columnMenu: false,\n columns: portalColumns,\n detailInit: function(e){ $scope.detailInit(e); },\n editable: 'popup',\n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false,\n pageable: true,\n remove: deleteEvent,\n save: saveEvent,\n scrollable: true,\n selectable: 'multiple',\n sortable: true\n };\n\n if($scope.pagePermissions.write) {\n \t$scope.portalOptions.toolbar = [\n \t \t\t{ template: kendo.template($('#userSearch').html()) }\n \t \t\t];\n\n \t}\n\n // kendo data source for the Portal Grid\n \t$scope.portalSource = {\n \t\ttype: 'aspnetmvc-ajax',\n error: readError,\n \t\ttransport: {\n \t\t\tread: {\n \t\t\t\ttype: 'get',\n \t\t\t\tcontentType: 'application/json',\n \t\t\t\turl: __env.apiBaseUrlPortal + 'portals/paged/kendo',\n \t\t\t\tbeforeSend: function(req) {\n\t\t\t\t\t\treq.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t\t\treq.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n \t\t },\n \t\t\t},\n\n \t\t},\n \t\tschema: {\n data: 'data',\n total: 'total',\n model: portalModel,\n },\n pageSize: 20,\n serverPaging: true,\n serverSorting: true,\n serverFiltering: true,\n sort: {\n field: 'portalName',\n dir: 'asc'\n }\n \t};\n \t// END PORTAL GRID SETUP ----------------------------------------------------------//\n\n\n \t// USER GRID SETUP ---------------------------------------------------------------//\n \t// user grid columns\n \tvar userColumns = [\n\n \t {\n \t field: 'email',\n \t title: 'Email',\n editable: false,\n \t width: '100px',\n \t },\n \t {\n \t \tfield: 'isEmailConfirmed',\n \t \ttitle: 'Email Confirmed',\n \t \twidth: '35px',\n groupable: false,\n filterable: false,\n template: ''\n \t },\n \t {\n \t \tfield: 'lastPasswordChangeDate',\n \t \ttitle: 'Last Password Change',\n editable: false,\n \t \twidth: '50px',\n \t \ttemplate: '#= lastPasswordChangeDate != null ? kendo.toString(kendo.parseDate(lastPasswordChangeDate, \"yyyy-MM-dd\"), \"yyyy-M-d h:mm tt\") : \"\"#'\n \t },\n \t {\n \t \tfield: 'mustChangePassword',\n \t \ttitle: 'Force Password Change',\n \t \twidth: '35px',\n groupable: false,\n filterable: false,\n template: ''\n \t },\n \t {\n \t \tfield: 'isLockoutEnabled',\n \t \ttitle: 'Locked Out',\n \t \twidth: '35px',\n groupable: false,\n filterable: false,\n template: ''\n \t },\n \t {\n \t \tfield: 'lockoutEndDateUtc',\n \t \ttitle: 'Locked Until (UTC)',\n \t \twidth: '50px',\n editable: false,\n \t \ttemplate: '#= lockoutEndDateUtc != null ? kendo.toString(kendo.parseDate(lockoutEndDateUtc, \"yyyy-MM-dd\"), \"yyyy-M-d h:mm tt\") : \"\"#'\n \t },\n \t {\n \t \tfield: 'deactivated',\n\t\t\t\t\ttitle: 'User Status',\n\t\t\t\t\tattributes:{ class:'center' },\n \t \twidth: '40px',\n \t \ttemplate: '#= deactivated ? \"Deactivated\" : \"Active\"#'\n \t }\n \t ];\n\n if($scope.pagePermissions.write) {\n userColumns.push({\n command: [{ name: 'destroy', text: 'Remove' }],\n title: ' ',\n width: '40px'\n });\n }\n\n // model kendo uses to bind the data to the grid\n\t\tvar userModel = {\n\t\t\tid: 'userId',\n\t\t\tfields: {\n\t\t\t\t'email': { type: 'string' },\n\t\t\t\t'active': { type: 'boolean' },\n\t\t\t\t'isEmailConfirmed': { type: 'boolean' },\n\t\t\t\t'lastPasswordChangeDate': { type: 'date' },\n\t\t\t\t'mustChangePassword': { type: 'boolean' },\n\t\t\t\t'isLockoutEnabled': { type: 'boolean' },\n\t\t\t\t'lockoutEndDateUtc': { type: 'date' },\n\t\t\t\t'deactivated': { type: 'boolean' }\n\t\t\t}\n\t\t};\n\n \t$scope.userSource = {\n serverFiltering: true,\n serverPaging: true,\n pageSize: 20,\n transport: {\n read: {\n \t\t\t\ttype: 'post',\n \t\t\t\tcontentType: 'application/json',\n \t\t\t\turl: __env.apiBaseUrlPortal + 'users/startswith/',\n \t\t\t\tbeforeSend: function(req) {\n\t\t\t\t\t\treq.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t\t\treq.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n \t\t },\n \t\t\t},\n \t\t\tparameterMap: function(options, operation) {\n\n \t\t\t\tif(operation == 'read') {\n\n \t\t\t\t\treturn JSON.stringify(options);\n \t\t\t\t}\n \t\t\t}\n }\n\n };\n\n // END USER GRID SETUP -----------------------------------------------------------//\n\n\n \t // kendo multiselect options for the portal dropdown\n $scope.userSearchOptions = {\n \t\tplaceholder: 'Select User...',\n dataTextField: 'email',\n dataValueField: 'userId',\n valuePrimitive: false,\n autoBind: false,\n\n \t};\n\n \t///////////////////////////////////////////////////////////////////////////\n \t// Functions\n \t///////////////////////////////////////////////////////////////////////////\n\n \t$scope.addNewPortal = function() {\n \t\t$scope.portalGrid.addRow();\n \t};\n\n \t/**\n * handles delete event for the portal grid.\n *\n * @function\n * @param { event } e - delete row event\n */\n \tfunction deleteEvent(e) {\n \t\te.preventDefault();\n\n \t\t$scope.deletePortal(e.model.portalId);\n \t}\n\n \tfunction portalTypeEditor(container, options) {\n \t\t$('')\n .appendTo(container)\n .kendoDropDownList({\n autoBind: false,\n dataTextField: 'portalTypeName',\n dataValueField: 'portalTypeId',\n dataSource: $scope.portalTypes\n });\n \t}\n\n \t/**\n * handles read error event for the portal grid.\n *\n * @function\n * @param { event } e - read error event\n */\n \tfunction readError(e) {\n \t\ttoastr.error('Grid data could not be retrieved. Please report this to Site Administrator.');\n \t}\n\n \tfunction removeUser(e) {\n \t\te.preventDefault();\n\n \t\t$scope.removeUser(e.model, e);\n \t}\n\n \t/**\n * handles save event for the portal grid.\n *\n * @function\n * @param { event } e - save row event\n */\n \tfunction saveEvent(e) {\n\n \t\t// stop kendo from being annoying\n \t\te.preventDefault();\n\n \t\tif(e.model.portalId > 0) {\n\n \t\t\t// portals with an id should be updated\n \t\t\t$scope.updatePortal(e.model);\n \t\t} else {\n \t\t\te.model.portalId = 0;\n\n \t\t\t// portals without an id should be added\n \t\t\t$scope.addPortal(e.model);\n \t\t}\n \t}\n\n \t/**\n * Prepares the http request for adding a new portal and handles callback.\n * On sucess, refreshes the kendo grid\n *\n * @function\n * @param { obj } portal - portal object to be added\n */\n \t$scope.addPortal = function(portal) {\n\n \t\tdelete portal.portalToken;\n \t\tdelete portal.selectPortals;\n\n var url = __env.apiBaseUrlPortal + 'portals/';\n \t\tvar type = 'post';\n \t\tvar data = portal;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Portal successfully added');\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('Portal could not be added');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n $log.error(message);\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t});\n\n };\n\n /**\n * Prepares the http request for adding a new user\n * to selected portals and handles callback\n *\n * @function\n */\n $scope.addUserToPortals = function(){\n \t// get selected rows\n \tvar rows = $scope.portalGrid.select();\n\n \t// there can be only one user, so get the first\n \tvar userIds = [$scope.user[0].userId];\n\n \tvar portals = [];\n\n \t// loop through and put the ids in an array\n \tfor (var i = 0; i < rows.length; i++) {\n\n \t\tportals.push($scope.portalGrid.dataItem(rows[i]).portalId);\n \t}\n\n \tvar data = {'userIds': userIds, 'portalIds': portals };\n \tvar type = 'post';\n \tvar url = __env.apiBaseUrlPortal + 'userportals/';\n\n \thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('User portals have been added for users');\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The portals could not be added to the requested users');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n\n $log.error(message);\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t});\n };\n\n\n \t/**\n * Prepares the http request for deleting a portal and handles callback.\n *\n * @function\n * @param { int } portalId - id of portal to be deleted\n */\n $scope.deletePortal = function(portalId) {\n\n \tvar url = __env.apiBaseUrlPortal + 'portals/' + portalId;\n \t\tvar type = 'delete';\n \t\tvar data = '';\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Portal successfully deleted');\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The Portal could not be deleted');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n\n $log.error(message);\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t});\n\n \t};\n\n \t/**\n * Click event that opens an inner grid displaying users that have access to the\n * given portal.\n *\n * @function\n * @param { event } e - open grid row event\n */\n $scope.detailInit = function(e) {\n\n \t$('
').appendTo(e.detailCell).kendoGrid({\n \t\t//error: function(e) {debugger;},\n \t\tdataSource: {\n \t\t\ttype: 'aspnetmvc-ajax',\n \t\t\t\ttransport: {\n \t\t\t\t\tread: {\n \t\t\t\t\t\ttype: 'get',\n \t\t\t\t\t\tcontentType: 'application/json',\n \t\t\t\t\t\turl: __env.apiBaseUrlUser + 'userportals/' + e.data.portalId + '/paged/users',\n \t\t\t\t\t\tbeforeSend: function(req) {\n\t\t\t\t\t\t\t\treq.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n\t\t\t\t\t\t\t\treq.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n \t\t\t\t },\n \t\t\t\t\t},\n \t\t\t\t},\n \t\t\t\tschema: {\n \t\t data: 'data',\n \t\t total: 'total',\n \t\t model: userModel\n \t\t },\n \t\t pageSize: 20,\n \t\t serverPaging: true,\n \t\t serverSorting: true,\n \t\t serverFiltering: true,\n \t\t sort: {\n \t\t field: 'email',\n \t\t dir: 'asc'\n \t\t }\n \t\t\t},\n \t columns: userColumns,\n \t editable: true,\n \t filterable: {\n \t extra: false,\n \t operators: {\n \t string: {\n \t contains: 'Contains',\n \t eq: 'Is equal to'\n \t }\n \t }\n \t },\n \t groupable: false,\n \t pageable: true,\n \t remove: removeUser,\n \t scrollable: true,\n \t sortable: true\n \t});\n };\n\n\n\n\n /**\n * Sets up http request to remove a user from a given portal.\n * Handles callbacks\n *\n * @function\n * @param { event } e - kendo click event\n * @param { obj } user - user object\n */\n $scope.removeUser = function(user, e) {\n \t// get the master row for the detail\n \tvar parentRow = e.row.closest('.k-detail-row').prev();\n\n \t// get the coresponding user\n \tvar portal = $scope.portalGrid.dataItem(parentRow);\n\n \tvar grid = $('#user-' + portal.uid).data('kendoGrid');\n\n \t// get the data to be sent\n \tvar data = {'portalTokens': [portal.portalToken]};\n\n \tvar url = __env.apiBaseUrlPortal + 'userportals/' + encodeURI(user.email) + '/portals';\n \t\tvar type = 'delete';\n \t\tvar data = data;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('User successfully removed from portal');\n \t\t\t\tgrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The user could not be removed from portal');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n\n $log.error(message);\n \t\t\t\tgrid.dataSource.read();\n \t\t\t});\n };\n\n /**\n \t * Binds the kendo selected values to the checkbox\n \t * @function\n \t * e {event} - click event for the checkbox\n \t */\n \t$scope.selectPortals = function(e) {\n \t\tvar grid = $scope.portalGrid;\n\n \t\tvar element = $(e.currentTarget);\n\n \t\tvar checked = element.is(':checked'),\n \trow = element.closest('tr'),\n \tdataItem = grid.dataItem(row);\n\n \t\tif (checked) {\n \t\t\trow.addClass('k-state-selected');\n \t\t} else {\n \t\t\trow.removeClass('k-state-selected');\n \t\t}\n \t};\n\n\n \t/**\n * Prepares the http request for updating a user and handles callbacks.\n *\n * @function\n * @param { obj } portal - portal object\n */\n $scope.updatePortal = function(portal) {\n \tvar url = __env.apiBaseUrlPortal + 'portals/';\n \t\tvar type = 'put';\n \t\tvar data = portal;\n\n \t\thttpService.asyncCall(url, type, data)\n \t\t\t.then(function(response) {\n \t\t\t\ttoastr.success('Portal successfully updated');\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t}).catch(function(e){\n \t\t\t\ttoastr.error('The Portal could not be updated');\n var message = 'Status: ' + e.status +\n '; Error:' + e.statusText;\n\n\n $log.error(message);\n \t\t\t\t$scope.portalGrid.dataSource.read();\n \t\t\t});\n };\n\n\n };\n})();\n","(function () {\n PortalList.$inject = ['$scope', '$http', '$location', 'toastr', '__env', 'readCookie'];\n\n\n\n angular\n .module('app')\n .component('portalListComponent', {\n templateUrl: 'modules/selection/components/portalList/portalList.html',\n controller: PortalList\n });\n\n function PortalList($scope, $http, $location, toastr, __env, readCookie) {\n\n $scope.pageTitle = 'Portal Selection';\n\n $scope.filterPortals = function (e) {\n if ($scope.portalFilter == '' || $scope.portalFilter === undefined) {\n $scope.portalSource.filter([]);\n } else {\n $scope.portalSource.filter({ 'field': 'portalName', 'operator': 'startswith', 'value': $scope.portalFilter });\n }\n\n };\n\n $scope.navToPortal = function () {\n location.href = this.dataItem.baseUri;\n };\n\n // kendo data source for the Portal Grid\n $scope.portalSource = new kendo.data.DataSource({\n type: 'aspnetmvc-ajax',\n transport: {\n read: {\n type: 'get',\n contentType: 'application/json',\n url: __env.apiLogin + 'session/' + readCookie.getByName(__env.sessionCookieName),\n beforeSend: function (req) {\n req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n req.setRequestHeader('Authorization', 'Bearer ' + readCookie.getByName(__env.authCookieName));\n },\n },\n parameterMap: function (options, operation) {\n\n if (operation == 'read') {\n return JSON.stringify(options);\n }\n }\n\n },\n schema: {\n data: function (response) {\n var portalTypes = { Administration: 1, ACM: 2, SUPO: 3, ModuleManagement: 4, DSLBuilder: 5, ComplianceCentral: 6, AAIM: 7, AssentU: 8, ACP: 9 };\n\n for (var i = 0; i < response.data.length; i++) {\n\n if (response.data[i].portalTypeId === portalTypes.ACM) {\n response.data[i].baseUri += '/' + $scope.targetPage;\n } else if (response.data[i].portalTypeId === portalTypes.Administration || response.data[i].portalTypeId === portalTypes.ACP) {\n response.data[i].baseUri += response.data[i].homePageRelativeUri;\n }\n }\n\n return response.data;\n },\n total: 'total'\n },\n\n pageSize: 20,\n serverPaging: true,\n serverSorting: true,\n serverFiltering: true,\n sort: {\n field: 'portalName',\n dir: 'asc'\n }\n });\n\n var init = function () {\n\n if ($location.search().pg == 'undefined' || typeof ($location.search().pg) == 'undefined') {\n $scope.targetPage = '';\n } else {\n $scope.targetPage = $location.search().pg;\n }\n\n };\n\n init();\n };\n})();\n","(function(){\n AuthReports.$inject = ['$scope', '$location', 'toastr', '__env', 'readCookie'];\n\n angular\n .module('app')\n .component('authReportsComponent', {\n templateUrl: 'modules/reports/components/authReports/authReports.html',\n controller: AuthReports\n });\n\n /**\n * Functionality for the portal grid\n *\n * @class PortalGrid\n * @param { service } $scope - The scope of the controller.\n * @param { service } $location - The Angular $location service.\n * @param { service } toastr - The third party toaster service.\n * @param { service } __env - The environment configuration.\n */\n\n function AuthReports($scope, $location, toastr, __env, readCookie){\n\n $scope.$parent.pageTitle = 'Report Management';\n\n /**\n * provides a new current date in yyyy-mm-dd format\n *\n * @function\n * @return { string } - current date in yyyy-mm-dd format\n */\n \t$scope.getCurrentDate = function() {\n \tvar current = new Date();\n \tvar dateString = current.getFullYear() + '-' + current.getMonth() + '-' + current.getDate();\n\n \treturn dateString;\n };\n\n \t// column properties for the kendo grid\n \tvar sessionColumns = [\n\n \t {\n \t field: 'email',\n \t title: 'Email',\n \t width: '100px'\n \t },\n \t {\n \t field: 'expiryUtc',\n \t title: 'Session Expires (UTC)',\n \t width: '100px',\n \t template: '#= kendo.toString(kendo.parseDate(expiryUtc), \"yyyy-MM-dd h:mm tt\") #'\n \t },\n \t {\n \t field: 'sessionKey',\n \t title: 'Session Key',\n \t width: '100px'\n \t }\n \t ];\n\n // model kendo uses to bind the data to the grid\n \tvar sessionModel = { id: 'userId',\n \t fields: {\n \t 'email': { type: 'string' },\n \t 'expiryUtc': { type: 'string' },\n \t 'sessionKey': { type: 'string' }\n \t }};\n\n // kendo grid options for the Portal grid\n $scope.sessionOptions = {\n columnMenu: true,\n columns: sessionColumns,\n editable: 'inline',\n excel: {\n fileName: 'Session-' + $scope.getCurrentDate() + '.xlsx',\n filterable: true\n },\n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false,\n pageable: true,\n scrollable: true,\n selectable: false,\n sortable: true,\n toolbar: ['excel']\n };\n\n\n // kendo data source for the Portal Grid\n \t$scope.sessionSource = {\n type: 'aspnetmvc-ajax',\n error: function(e) { toastr.error('Could not get session data for the report. Please \\'report\\' this error.');},\n \t\ttransport: {\n \t\t\tread: {\n \t\t\t\ttype: 'get',\n \t\t\t\tcontentType: 'application/json',\n \t\t\t\turl: __env.apiBaseUrlReport + 'session',\n beforeSend: function(req) {\n req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n req.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n },\n \t\t\t},\n\n \t\t},\n \t\tschema: {\n data: 'data',\n total: 'total',\n model: sessionModel,\n },\n pageSize: 20,\n serverPaging: true,\n serverSorting: true,\n serverFiltering: true,\n sort: {\n field: 'expiryUtc',\n dir: 'desc'\n }\n \t};\n\n\n\n \t/****************** USER AUDIT REPORT **************************************************/\n\n \t// column properties for the kendo grid\n \tvar userAuditColumns = [\n\n \t {\n \t field: 'email',\n \t title: 'Email',\n \t width: '75px'\n \t },\n \t {\n \t field: 'portalName',\n \t title: 'Portal Name',\n \t width: '75px'\n \t },\n \t {\n \t \tfield: 'userAuditType',\n \t \ttitle: 'Audit Type',\n \t \twidth: '75px'\n \t },\n \t {\n \t field: 'message',\n \t title: 'Message',\n \t width: '50px'\n \t },\n \t {\n \t field: 'auditTimeUtc',\n \t title: 'Audit Time (UTC)',\n \t width: '100px',\n \t template: '#= kendo.toString(kendo.parseDate(auditTimeUtc), \"yyyy-MM-dd h:mm tt\") #'\n \t }\n \t ];\n\n // model kendo uses to bind the data to the grid\n \tvar userAuditModel = { id: 'userAuditId',\n \t fields: {\n \t 'email': { type: 'string' },\n \t 'portalName': { type: 'string' },\n \t 'userAuditType': { type: 'string' },\n \t 'message': { type: 'string' },\n \t 'auditTimeUtc': { type: 'date' }\n \t }};\n\n // kendo grid options for the Portal grid\n $scope.userAuditOptions = {\n columnMenu: true,\n columns: userAuditColumns,\n editable: 'inline',\n excel: {\n fileName: 'User-Audit-' + $scope.getCurrentDate() + '.xlsx',\n filterable: true\n },\n filterable: {\n extra: false,\n operators: {\n string: {\n contains: 'Contains',\n eq: 'Is equal to'\n }\n }\n },\n groupable: false,\n pageable: true,\n scrollable: true,\n selectable: false,\n sortable: true,\n toolbar: ['excel']\n };\n\n\n // kendo data source for the Portal Grid\n \t$scope.userAuditSource = {\n \ttype: 'aspnetmvc-ajax',\n error: function(e) { toastr.error('Could not get user audit data for the report. Please \\'report\\' this error.');},\n \t\ttransport: {\n \t\t\tread: {\n \t\t\t\ttype: 'get',\n \t\t\t\tcontentType: 'application/json',\n \t\t\t\turl: __env.apiBaseUrlReport + 'useraudits',\n beforeSend: function(req) {\n req.setRequestHeader('UserToken', readCookie.getByName(__env.sessionCookieName));\n req.setRequestHeader('Authorization','Bearer ' + readCookie.getByName(__env.authCookieName));\n },\n \t\t\t},\n\n \t\t},\n \t\tschema: {\n data: 'data',\n total: 'total',\n model: sessionModel,\n },\n pageSize: 20,\n serverPaging: true,\n serverSorting: true,\n serverFiltering: true,\n sort: {\n field: 'auditTimeUtc',\n dir: 'desc'\n }\n \t};\n\n\n };\n})();","\"use strict\";window.Assent=window.Assent||{},window.Assent.session=function(){function a(a){return function(){try{a.apply(void 0,arguments)}catch(a){b.error(\"Error: \",a)}}}var b=function(){function a(a,b){c&&(c.isInDebugMode||window.Assent.debug)&&console.log(\"Assent Session: \"+a,b||{})}return{debug:a,error:function(a,b){console.error(\"Assent Session: \"+a,b||{})}}}(),c=null,d={set:function h(a,d,e){var f=!!(3this.status,e=this.readyState===4&&(401===this.status||403===this.status);if(a){var f=JSON.parse(this.response);c.getAuthTokenCookie||d.set(c.authTokenCookie,f.token,new Date(f.sessionExpiryUtc),c.secureCookie),!c.getAuthTokenCookie&&c.sessionTokenCookie&&d.set(c.sessionTokenCookie,f.sessionKey,new Date(f.sessionExpiryUtc),c.secureCookie),n.sessionNeedsRefresh=!1,n.sessionHasBeenChecked=!0}else e&&(b.error(\"Request is unauthorized. Logging out.\"),g())}):(b.error(\"Session token is null. Logging out.\"),n.sessionNeedsRefresh=!1,void g())}function k(){b.debug(\"calling checkSession\"),j(m.CHECK)}function l(){b.debug(\"calling extendSession\"),c.onExtendSession&&c.onExtendSession(),j(m.EXTEND)}var m={CHECK:\"check\",EXTEND:\"extend\"},n={sessionNeedsRefresh:!0,previousUrl:f(),sessionHasBeenChecked:!1},o={route:{interval:1000,timerId:null,handler:a(function(){var a=f();n.previousUrl!==a&&(b.debug(\"url changed\"),n.sessionNeedsRefresh=!0),n.previousUrl=a}),start:function a(){b.debug(\"adding route timer\"),o.route.timerId=setInterval(o.route.handler,o.route.interval)}},checkCookie:{interval:2000,timerId:null,handler:a(function(){if(n.sessionHasBeenChecked){var a=i();a||(b.error(\"Auth token is missing. Logging out.\"),g())}}),start:function a(){b.debug(\"adding checkCookie timer\"),o.checkCookie.timerId=setInterval(o.checkCookie.handler,o.checkCookie.interval)}},extendSession:{interval:30000,timerId:null,handler:a(function(){n.sessionNeedsRefresh?l():k()}),start:function a(){b.debug(\"adding extendSession timer\"),o.extendSession.timerId=setInterval(o.extendSession.handler,o.extendSession.interval)}},start:function a(){b.debug(\"starting timers\"),Object.keys(o).forEach(function(a){\"function\"==typeof o[a].start&&o[a].start()})},dispose:function a(){Object.keys(o).forEach(function(a){var b=o[a];b&&b.timerId&&clearInterval(b.timerId)})}};return{initialize:function a(){setTimeout(function(){o.start(),k(),b.debug(\"adding click event listener\"),window.addEventListener(\"click\",h)},2e3)},dispose:function a(){window.removeEventListener(\"click\",h),o.dispose()}}}(),f=function(){function a(a){return a?a.cookieDomain?a.authTokenCookie?a.authenticationApiUrl?a.logoutUrl||a.logoutOverride?(b.debug(\"configuration validated\"),!0):(b.error(\"config error: missing logoutUrl and logoutOverride\"),!1):(b.error(\"config error: missing authenticationApiUrl\"),!1):(b.error(\"config error: missing session cookie name\"),!1):(b.error(\"config error: missing cookie domain\"),!1):(b.error(\"config error: missing configuration object\"),!1)}return{initialize:function d(b){a(b)&&(c=b,e.initialize())},dispose:e.dispose}}();return{initialize:f.initialize,dispose:f.dispose}}();"]}