{"version":3,"sources":["app.js","applications/applications-module.js","inspections/inspections-module.js","link-page/link-page-module.js","login/login-module.js","lookup/lookup-module.js","react/react-module.js","services/services-module.js","components/copyright/copyright.js","components/footer/footer.js","components/header/header.js","components/navigation/navigation.js","components/offline-top/offline-top.js","components/timeout-notify/timeout-notify-modal.js","components/timeout-notify/timeout-notify.js","components/top/top.js","applications/components/application-checkout/application-checkout.js","applications/components/application-checkout-payment/application-checkout-payment.js","applications/components/application-response/application-response.js","applications/components/applications/applications.js","inspections/components/inspection/inspection.js","inspections/components/inspections/inspections.js","inspections/components/invalid-modal/invalid-modal.js","inspections/components/override-modal/override-modal.js","inspections/components/signature-modal/signature-modal.js","link-page/components/link-page/link-page.js","login/components/create-account/create-account.js","login/components/forgot-password/forgot-password.js","login/components/forgot-username/forgot-username.js","login/components/login/login.js","login/components/reset-password/reset-password.js","lookup/components/fire-drill-lookup/fire-drill-lookup.js","lookup/components/lookup/lookup.js","lookup/components/service-lookup/service-lookup-detail.js","lookup/components/service-lookup/service-lookup.js","lookup/components/user-lookup/user-lookup-detail.js","lookup/components/user-lookup/user-lookup.js","react/components/application/application.js","react/components/education/education.js","react/components/exams/exams.js","react/components/investigations/investigationsForm.js","react/components/myAccount/myAccount.js","services/components/clinicians/clinicians.js","services/components/inspections/inspections.js","services/components/service/service.js","services/components/vouchers/vouchers.js"],"names":["angular","module","config","$stateProvider","$urlRouterProvider","$httpProvider","localStorageServiceProvider","$locationProvider","hashPrefix","interceptors","push","defaults","headers","get","otherwise","setPrefix","state","abstract","templateUrl","paths","app","data","isPortal","messages","controller","$scope","$rootScope","CMSPages","site","portal_pages","forEach","p","undefined","page","site_id","id","address","resolve","userAccount","Account","loadingUserAccount","$state","current","this","self","portal","then","account","enterprise","$q","$location","Enterprise","CMSSites","gRecaptcha","d","defer","portalAbsUrl","absUrl","portalUrl","url","substring","indexOf","lastIndexOf","loadingEnterprise","enterpriseID","getByAddress","loadingSite","recaptcha_enabled","initialize","key","recaptcha_site_key_v3","promise","getByEnterprise","site2","all","run","localStorageService","$window","Session","Utils","now","Date","offline","navigator","onLine","noTimeoutModalStates","addEventListener","$apply","document","visibilityState","includes","name","IsSessionAlive","session","DeleteSessionCookie","expireSession","remove","go","response","$on","event","toState","resolving","authenticatedPage","to","from","fromParams","params","checkIn","nav","element","querySelector","css","mobileTab","hasClass","removeClass","isStringSafe","string","loginRequired","permission","PortalPermissions","view","access","review","serviceId","application","responseID","fireStartTrigger","$stateParams","LicenseRequests","redirectImmediately","checkoutAccess","actionString","visit","inspection","hideMenus","keepMessages","errorCode","surpressRedirect","statusId","autofill","token","cameFromProfile","lookup_object","priorState","user","service","path","splitAddress","split","length","edit","regex","test","i","viewByAddress","accessObject","requiredLogin","startsWith","directive","restrict","currentYear","getFullYear","replace","link","scope","elem","attrs","ctrl","$sce","Format","editing","public_portal_footer","$watch","newValue","oldValue","renderHtml","htmlCode","trustAsHtml","isInIframe","parent","window","location","href","site_location","close","saveFooter","footerSaving","save","result","EnterpriseLinkService","portalCSS","public_portal_css","buildCSS","portalURL","website","public_portal_header","getMenu","is_public","pages","links","menuPages","underscore","phrase","customPage","linkId","loading","saveHeader","headerSaving","toggleMenu","toggleClass","Authentication","loggedIn","permissions","loadingMenu","examsModuleOn","inspectionsModuleOn","clinicianImportOn","manageRoute","loadingRoute","getEnterprise","exams_module","inspections_module","educationModuleOn","education_module","clinicians_import","voucherPayOn","settings","voucher_pay","getPermission","exam_examiner","exam_coordinator","education_coordinator","education_instructor","medical_director","service_director","setupPermissions","promises","isEmpty","getPermissions","portalPermissions","authData","getAppCounts","counts_retrieved","getApplicationCounts","userID","counts","continue_count","review_count","checkout_count","visible","required_login","educationRoute","getEducationPermission","getName","checkDocumentLoad","getElementById","className","toParams","fromState","logout","stayLoggedIn","Idle","$modal","loadTimeoutInfo","getlogoutSettings","setTimeout","public_length","setIdle","public_session_length","message","public_warning_text","warningCountdown","timeoutInfoLoaded","watch","unwatch","closeModals","warning","timedout","showCountdown","open","windowClass","backdrop","keyboard","IdleProvider","KeepaliveProvider","interrupt","idle","timeout","interval","Alerts","Saml","UserStatuses","loadAlerts","getDashboardAlerts","user_id","alerts","a","color","showAccountAlerts","hideAlerts","variable","stateName","portal_page","content","alertsCount","getAlertsCount","count","has_identity_provider","redirectURL","origin","idpSignOut","ret","redirectUrl","reload","goToProfile","toggle","x","innerHTML","style","display","acceptedMessages","errorMessage","getUserStatusLockedMessage","lockedText","getDuplicatePreventionText","duplicateText","generatingPDF","onbeforeunload","e","returnValue","$filter","Payments","Regions","Resource","applicationID","applicationLoading","getByID","FBForms","FBResponses","Cache","Triggers","$timeout","Documents","getServiceApplicationVehicles","appLoading","licenseRequestIds","applications","dataSet","licenseRequestsAndVehicles","reduce","acc","license_request_id","vehicle_count","applicationIdx","findIndex","item","hasOwnProperty","vehicle","call_sign","serial_number","unit_number","vehicle_unit_number","serviceVehicleDataSet","bulkActionApplications","showBulkAction","listParams","currentPage","numPerPage","statusFilterParameters","publicOnly","serviceLabel","serviceLabels","CheckSession","validSession","userOnly","reviewOnly","userId","records","getState","sortBy","reverse","search","cacheList","setState","old","newie","clear","startResponse","starting","saveResponse","copy","progress","started_on","savedResponse","form","start_trigger_name","fire","triggerID","start_trigger_id","licenseRequestID","continueResponse","greaterThan","prop","val","formCountText","total","completed","packages","pack","responses","r","completed_On","viewPdf","logAccess","documentId","toUpperCase","documentCode","stop","checkApplicationTriggers","currentTriggersFiringCount","modifiedOn","isDefined","setCurrentTriggerCount","cancel","entityIdx","entities","categoryIdx","categories","len","fields","callSignName","label","useCallSign","public_portal","serialNumberName","useSerialNumber","unitNumberName","useUnitNumber","checkAllApplications","checkAll","stopImmediatePropagation","inBulkApply","applyOne","index","splice","payApplications","bulkApply","applicationIds","join","isOpen","alert","$element","saving","notInCache","inspectionID","showSaved","validationSuccess","validationMessage","checklist","deficiencyScore","score","deficiencies","fail","pass","ignore","documents","the_form","isFormValid","saveInspection","saveTimeout","validationTimeout","saveAndExit","timer","animation","signature","signature_photo_source","toDataURL","deficiencies_fail","deficiencies_pass","deficiencies_ignore","template","require_responsible_party_signoff","virtual_signature","signature_type_in_person","checklist_signed","complete","failed","reinspect","outcome","inspector_id","inspector","submitted","valid","$valid","require_responsible_party_signature","deficiencies_total","passing_score_type","passing_score","auto_fail","passingChecklist","reinspection_date","setHours","reinspection","setDate","getDate","console","log","resize","canvas","offsetWidth","offsetHeight","getContext","ratio","Math","max","devicePixelRatio","width","height","scale","canvasScope","$destroy","off","clearSignature","signature_first_name","signature_last_name","signature_certification_number","getDocumentsByInspection","code","IPVisits","IPCheckoutLogs","IPInspections","TGTriggers","submitting","months","getYears","years","inspectionColumns","vehicleLabels","field","disabled","info","icon","title","show","type","canDownload","download","inspections","status","allow_checkout","getVisits","month","year","getAll","visits","visitInspection","deficiencies_fail_show","inspector_show","indicator","deficenciesComplete","resetting","downloading","checked_out","cacheVisit","caches","keys","cachelist","worker","cache","fetch","put","add","newStatus","oldStatus","getMonth","downloadVisit","checkout_log_id","visit_id","checkoutLog","resetVisit","overwrite","cacheInspections","inspectionIDs","checkedOutInspectionIDs","cachedVisit","invalidInspections","visitInspections","prepareInspections","cached","inspectionNotCheckedOut","prepareInspection","prepareInspectionResponse","response_id","Form_ID","form_id","submitVisit","uploadStarted","inspectionsCompleted","submissionChecklistCount","handleOverride","ignoreInspectionIDs","handleValidation","invalidInspection","handleSignature","signed","handleSubmit","success","checkinVisit","arr","visitSuccessful","allInspectionIDs","filter","chunkedInspectionIDs","chunkArray","sort","b","promiseChain","value","checkinInspections","$evalAsync","promiseFunc","checkinInspection","cachedInspection","require_signature","submit","cachedInspections","cachedInspectionsCopy","submitBatch","updatePromises","getSignatureArray","signatures","validateVisit","getOverrideArray","overrides","checkOverride","next","confirm","preventDefault","$modalInstance","yes","no","credentials","continuing","disregarding","invalid","validate","password","user_name","disregard","dismiss","getLink","page_content","EntityEnterpriseFields","Users","IntegrationMethods","Countries","EnterpriseLoginCriteria","fillAutoCompleteForFields","alias","lookup","showEliteLookup","looking_up","USDefault","countries","c","entity_categories","parameters","fieldsByCode","failedMessages","user_public_addresses","eliteSignature","username","authenticate","$broadcast","public_address","primary_address","email","verify_email","getNewUser","ssn_generation_type","ssn_dec","verify_ssn","recaptchaMessage","isSsnMasked","forEliteLookup","results","category","json","user_name_generation_type","addressLabel","publicAddressLabel","autoComplete","question_type_code","global_id","guid","setupAddress","country_id","street_1","street_2","postal_code","municipality","county","region_id","same_as_primary","copyAddress","showAddress","showSameAsAddress","addr1","addr2","public_email_same_as_primary","public_email","showEmail","toggleLookup","getEliteData","eliteLookup","error_message","validationMessages","validation","customFunctionFailed","customFunctionMessage","birth_date","today","age","National_EMS_ID","max_length","addressValidation","login_criteria","scrollTo","method","account_creation_alert_message","recaptchaSubmit","grecaptcha","ready","execute","action","getRecaptchaResponse","error","focusQuestion","elements","getElementsByName","scrollIntoView","behavior","block","inline","findLabelFromAlias","numberCheck","keyEvent","isNaN","hasPublicIdentityProviders","disablePasswordLogin","displayForm","widgetId","reset_object","enterprise_id","getEnterpriseDisablePasswordLogin","disable","listPublicEnterpriseIdentityProvider","idpList","setDisplayForm","reset","forgotPassword","newEmail","changeEmail","email_object","lookupUsername","userid","no_email","change_email","existing_email","emailDomain","maskedEmail","substr","saveEmail","new_email","idpLoading","showPassword","showForceLogin","forgot_link","forgot_username","forgot_password","create_account","goto_forgot_username","goto_forgot_password","goto_create_account","idpSignIn","entityId","metadataUrl","login","redirect_url","error_description","transitionTo","inherit","notify","createAccount","loadingRequirements","tokenID","unauthorized","expired","requirements","locked","enterpriseLoginCriteria","getResetToken","suspended","suspended_on","unsuspended","getPasswordRequirements","minutes_locked","timeDifference","revertTimeZone","getTime","hrs","floor","mins","secs","countdown","onTimeout","numeric_chars","uppercase","special_chars","not_username","min_length","number_of_passwords","checkPasswordHistory","top","resetPassword","returnToProfile","FireDrill","show_search_results","schoolSystems","schools","filters","fireDrills","currentState","getPublicSchoolSystems","onSystemFilterChange","getPublicSchools","onSchoolFilterChange","isUndefined","SchoolSystemId","SchoolId","getPublicYears","yearObjs","columns","getPublicFireDrills","clearFilter","EnterprisePublicLookup","submitSwitch","lookup_option","lookup_options","license_label","filterFound","recaptcha_passed","userLabel","userLabels","userLookupPage","show_menu","serviceLookupPage","selectShow","filtersAlias","userFilters","col","entity","serviceFilters","enterpriseId","search_columns","some","Services","Vehicles","getService","serviceID","PublicLookupService","pop","detail_columns","result_columns_vehicles","vehicle_columns","result_columns_service_users","service_user_columns","certification_columns","cert_attribute_columns","old_lookup_object","records_offset","records_total","sort_fields","sort_direction","from_search","entity_type","result_columns","singular_relationship","result_columns_certifications","column","format_type","toLowerCase","table_name","websiteUrl","alert_count","getServiceAlerts","alerts_concat","vehicles","service_vehicles_list_loading","service_id","for_lookup","certifications","certifications_list_loading","getServiceCertifications","service_users","service_users_list_loading","getPublicSearchUser","externalOnly","forService","inactiveServiceUsers","forServiceLookup","map","toggleService","search_columns_vehicles","search_columns_certifications","search_columns_service_users","getCount","getServiceLookupCount","record_count","services","search_header_columns","perPages","sort_direciton","sortable","slice","search_columns_singular","determineClasses","record","classes","mod","setCurrentPage","setNumPerPage","setPages","numOfPages","ceil","Complaints","getUser","publicLookupUser","include_suffix","include_middle","s","userAlertsUsed","last_name","suffix","first_name","middle_name","getUserAlerts","getEnterpriseUserPublicAddresses","userPublicAddresses","investigation_columns","application_columns","user_services_columns","result_columns_investigations","result_columns_applications","result_columns_services","courseListColumn","find","courseList","courseListLabel","educationReportColumn","restricted","educationReport","educationReportLabel","userInfo","getEducationReportLookupPermission","educationReportPermission","getUserCertifications","applications_list_loading","getByUserID","investigations","investigations_list_loading","services_list_loading","getUserEMSLevels","EMSLevels","getUserEndorsements","endorsements","getUserInstructorLevels","instructorLevels","getUserEvaluatorLevels","evaluatorLevels","getUserInstructingTopics","instructingTopics","userPublicAddressCheck","toggleUser","search_columns_applications","search_columns_investigations","search_columns_services","getUserLookupCount","users","ngReactBridge","resource","basename","reactReady","initializeAsync","err","reactError","renderFunc","imagetrend","lms","renderPortalApp","cleanupFunc","cleanupPortalApp","createNgReactDirective","resetService","bulkActionItems","assigning","payInspectionFees","bulkAction","hideAction","dateTimeFlag","masterService","serviceLoading","setMasterService"],"mappings":"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","file":"portal-25.3.0.0.min.js","sourcesContent":["'use strict';\r\n\r\nangular.module('licensure.portal', [\r\n // angular modules\r\n 'ui.router',\r\n 'LocalStorageModule',\r\n 'ui.bootstrap',\r\n 'ngAnimate',\r\n 'ngSignaturePad',\r\n 'ngFileUpload',\r\n 'ngIdle',\r\n 'gRecaptcha.v3',\r\n\r\n // imagetrend modules\r\n 'imagetrend.components',\r\n 'licensure.helpers',\r\n 'licensure.services',\r\n\r\n // portal modules\r\n 'portal.applications',\r\n 'portal.inspections',\r\n 'portal.services',\r\n 'portal.login',\r\n 'portal.lookup',\r\n 'portal.react',\r\n 'portal.linkpage',\r\n])\r\n .config([\r\n '$stateProvider',\r\n '$urlRouterProvider',\r\n '$httpProvider',\r\n 'localStorageServiceProvider',\r\n //'$qProvider',\r\n '$locationProvider',\r\n function (\r\n $stateProvider,\r\n $urlRouterProvider,\r\n $httpProvider,\r\n localStorageServiceProvider,\r\n //$qProvider,\r\n $locationProvider\r\n ) {\r\n //$qProvider.errorOnUnhandledRejections(false); // this hides the first 4 errors that throw on each angularJs page load\r\n $locationProvider.hashPrefix(''); // otherwise starts as '!'\r\n\r\n $httpProvider.interceptors.push('ApiIntercepter');\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n $urlRouterProvider.otherwise('/login');\r\n localStorageServiceProvider.setPrefix('licensure');\r\n\r\n $stateProvider\r\n // public routings\r\n .state('portal', {\r\n abstract: true,\r\n templateUrl: paths.app + 'components/portal/portal.html',\r\n data: {\r\n isPortal: true,\r\n messages: []\r\n },\r\n controller: ['$scope', '$rootScope', 'CMSPages', function ($scope, $rootScope, CMSPages) {\r\n $scope.site = $rootScope.site;\r\n // buid an array of portal_pages indexed by state for easy access\r\n $scope.portal_pages = [];\r\n $scope.site.portal_pages.forEach(function (p) {\r\n if ($scope.portal_pages[p.state] === undefined || $scope.portal_pages[p.state] == null) {\r\n $scope.portal_pages[p.state] = p;\r\n }\r\n });\r\n $rootScope.portal_pages = $scope.portal_pages;\r\n\r\n // get the default cms page\r\n $scope.page = CMSPages.get({ site_id: $scope.site.id, address: \"\" })\r\n }],\r\n resolve: {\r\n userAccount: ['$rootScope', 'Account', function ($rootScope, Account) {\r\n if ($rootScope.userAccount == null || $rootScope.userAccount == undefined) {\r\n $rootScope.loadingUserAccount = true;\r\n $rootScope.$state.current = this.self;\r\n return Account.get({ portal: true }).then(function (account) {\r\n $rootScope.userAccount = account;\r\n $rootScope.loadingUserAccount = false;\r\n });\r\n }\r\n else {\r\n return $rootScope.userAccount;\r\n }\r\n }],\r\n\r\n enterprise: ['$q', '$rootScope', '$location', 'Enterprise', 'CMSSites', 'gRecaptcha', function ($q, $rootScope, $location, Enterprise, CMSSites, gRecaptcha) {\r\n var d = $q.defer();\r\n if ($rootScope.enterprise === undefined || $rootScope.enterprise == null) {\r\n var portalAbsUrl = $location.absUrl();\r\n var portalUrl = $location.url();\r\n portalUrl = portalAbsUrl.substring(0, portalAbsUrl.indexOf(portalUrl));\r\n portalUrl = portalUrl.substring(0, portalUrl.lastIndexOf(\"/\")+1);\r\n $rootScope.loadingEnterprise = true;\r\n $rootScope.$state.current = this.self;\r\n if ($rootScope.enterpriseID === undefined || $rootScope.enterpriseID != null) {\r\n return Enterprise.getByAddress(portalUrl).then(function (enterprise) {\r\n if (enterprise != null) {\r\n $rootScope.enterprise = enterprise;\r\n $rootScope.enterpriseID = enterprise.id;\r\n $rootScope.loadingEnterprise = false;\r\n $rootScope.loadingSite = true;\r\n\r\n if (enterprise) {\r\n //Recaptcha\r\n if (enterprise.recaptcha_enabled) {\r\n gRecaptcha.initialize({ key: enterprise.recaptcha_site_key_v3})\r\n }\r\n }\r\n\r\n var promise = CMSSites.getByEnterprise(enterprise.id).then(function (site2) {\r\n $rootScope.site = site2;\r\n $rootScope.loadingSite = false;\r\n });\r\n return $q.all([enterprise, promise]);\r\n }\r\n });\r\n }\r\n else {\r\n return Enterprise.get().then(function (enterprise) {\r\n if (enterprise != null) {\r\n $rootScope.enterprise = enterprise;\r\n $rootScope.loadingEnterprise = false;\r\n $rootScope.loadingSite = true;\r\n\r\n if (enterprise) {\r\n //Recaptcha\r\n if (enterprise.recaptcha_enabled) {\r\n gRecaptcha.initialize({ key: enterprise.recaptcha_site_key_v3 })\r\n }\r\n }\r\n\r\n var promise = CMSSites.getByEnterprise(enterprise.id).then(function (site2) {\r\n $rootScope.site = site2;\r\n $rootScope.loadingSite = false;\r\n });\r\n return $q.all([enterprise, promise]);\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n d.resolve($rootScope.enterprise);\r\n }\r\n return d.promise;\r\n }],\r\n\r\n site: ['$rootScope', 'CMSSites', function ($rootScope, CMSSites) {\r\n if ($rootScope.site == null) {\r\n $rootScope.loadingSite = true;\r\n $rootScope.$state.current = this.self;\r\n return CMSSites.get().then(function (site) {\r\n if (site != null) {\r\n $rootScope.site = site;\r\n $rootScope.loadingSite = false;\r\n }\r\n else {\r\n return CMSSites.getByEnterprise($rootScope.enterpriseID).then(function (site2) {\r\n $rootScope.site = site2;\r\n $rootScope.loadingSite = false;\r\n });\r\n } \r\n });\r\n }\r\n else {\r\n return $rootScope.site;\r\n }\r\n }]\r\n }\r\n })\r\n .state('portal.menus', {\r\n abstract: true,\r\n templateUrl: paths.app + \"layouts/menus.html\"\r\n })\r\n .state('portal.menus.denied', {\r\n url: '/denied',\r\n templateUrl: paths.app + \"layouts/denied.html\"\r\n })\r\n }])\r\n .run(['$rootScope', '$state', 'localStorageService', '$window', 'Session', 'Utils', function ($rootScope, $state, localStorageService, $window, Session, Utils) {\r\n $rootScope.now = new Date();\r\n\r\n $rootScope.offline = !navigator.onLine;\r\n const noTimeoutModalStates = ['portal.menus.login', 'portal.menus.createaccount', 'portal.menus.forgotusername', 'portal.menus.forgotpassword'];\r\n\r\n $window.addEventListener(\"offline\", function () {\r\n $rootScope.$apply(function () {\r\n $rootScope.offline = true;\r\n });\r\n }, false);\r\n $window.addEventListener(\"online\", function () {\r\n $rootScope.$apply(function () {\r\n $rootScope.offline = false;\r\n });\r\n }, false);\r\n document.addEventListener(\"visibilitychange\", function () {\r\n if (document.visibilityState === 'visible' && $rootScope.userAccount !== null && !noTimeoutModalStates.includes($state.current.name)) {\r\n //Check their session in case the user closes their computer, reopens and their session is expired\r\n Session.IsSessionAlive().then(function (session) {\r\n //If session is expired, log them out\r\n if (!session) {\r\n Utils.DeleteSessionCookie(true);\r\n Session.expireSession(true);\r\n localStorageService.remove('portalAuthorizationData');\r\n $rootScope.userAccount = null;\r\n $state.go(\"portal.menus.login\", { messages: [\"You have successfully logged out\"] });\r\n }\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n }\r\n }); \r\n\r\n $rootScope.$state = $state;\r\n $rootScope.$on('$stateChangeStart', function (event, toState) {\r\n if (toState.resolve) {\r\n $rootScope.resolving = true;\r\n\r\n $rootScope.authenticatedPage = !noTimeoutModalStates.includes(toState.name);\r\n }\r\n });\r\n $rootScope.$on('$stateChangeSuccess', function (to, from, fromParams) {\r\n $rootScope.$state = $state;\r\n $rootScope.$state.from = from;\r\n $rootScope.$state.from.params = fromParams;\r\n Session.checkIn();\r\n if (to.resolve) {\r\n $rootScope.resolving = false;\r\n }\r\n\r\n //Close the mobile nav if needed\r\n var nav = angular.element(document.querySelector(\"#licensure .navigation\"));\r\n if (nav.css('display') == 'block') {\r\n nav.css('display', 'none');\r\n var mobileTab = angular.element(document.querySelector(\"#licensure .menu.mobile\"));\r\n if (mobileTab.hasClass('expand')) {\r\n mobileTab.removeClass('expand');\r\n }\r\n }\r\n });\r\n\r\n $rootScope.isStringSafe = function (string) {\r\n return !string.includes(\"<\") && !string.includes(\">\");\r\n }\r\n}]);","'use strict';\r\n\r\nangular.module('portal.applications', [])\r\n .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\r\n $stateProvider\r\n // portal routings\r\n // applications tab\r\n .state('portal.menus.applicationsStart', {\r\n url: '/applications/start',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.applications', {\r\n url: '/applications/continue',\r\n templateUrl: paths.app + 'applications/components/applications/applications.html',\r\n controller: 'PortalApplications',\r\n params: {\r\n review: false,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.applicationsContinueList', {\r\n url: '/applications/continue/list',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.applicationsList', {\r\n url: '/applications/mylist',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.applicationsServiceList', {\r\n url: '/applications/servicelist?serviceId',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n loginRequired: true,\r\n serviceId: null\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.application', {\r\n url: '/application/:id/response/:responseID/:fireStartTrigger',\r\n templateUrl: paths.app + 'applications/components/application-response/application-response.html',\r\n controller: 'PortalApplicationResponse',\r\n params: {\r\n id: null,\r\n application: null,\r\n responseID: null,\r\n response: null,\r\n fireStartTrigger: null,\r\n review: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$q', '$state', '$stateParams', '$rootScope', 'LicenseRequests', 'PortalPermissions', function ($q, $state, $stateParams, $rootScope, LicenseRequests, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n PortalPermissions.view('portal.menus.applications').then(function (access) {\r\n if (!access) {\r\n //Old continue page or new continue page must be turned on\r\n PortalPermissions.view('portal.menus.applicationsContinueList').then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.review', {\r\n url: '/applications/review',\r\n templateUrl: paths.app + 'applications/components/applications/applications.html',\r\n controller: 'PortalApplications',\r\n params: {\r\n review: true,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.checkout', {\r\n url: '/applications/checkout',\r\n templateUrl: paths.app + 'applications/components/application-checkout/application-checkout.html',\r\n controller: 'PortalApplicationsCheckout',\r\n params: {\r\n redirectImmediately: false,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n //Need permission to old checkout page or new checkout page\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n PortalPermissions.view('portal.menus.checkoutlist').then(function (checkoutAccess) {\r\n if (!checkoutAccess) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.checkoutlist', {\r\n url: '/applications/checkout/list',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.payment', {\r\n url: '/applications/checkout/payment',\r\n templateUrl: paths.app + 'applications/components/application-checkout-payment/application-checkout-payment.html',\r\n controller: 'PortalApplicationsCheckoutPayment',\r\n params: {\r\n review: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.payment2', {\r\n url: '/applications/payments/checkout',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n review: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n PortalPermissions.view('portal.menus.payment').then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.paymentResponse', {\r\n url: '/applications/payments/response/:actionString',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n actionString: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$rootScope', function ($rootScope) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n .state('portal.menus.paymentResponseNoAction', {\r\n url: '/applications/payments/response',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n actionString: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$rootScope', function ($rootScope) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n .state('portal.menus.applicationsHistory', {\r\n url: '/applications/history',\r\n templateUrl: paths.app + 'react/components/application/application.html',\r\n controller: 'PortalApplicationsCheckout2',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.inspections', [])\r\n .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\r\n $stateProvider\r\n // portal routings\r\n // inspections tab\r\n .state('portal.menus.inspections', {\r\n url: '/inspections',\r\n templateUrl: paths.app + 'inspections/components/inspections/inspections.html',\r\n controller: 'PortalInspections',\r\n params: {\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.visit', {\r\n url: '/visit/:id',\r\n templateUrl: 'templates/inspection-visit/inspection-visit.html',\r\n controller: 'InspectionVisit',\r\n params: {\r\n id: null,\r\n visit: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view('portal.menus.inspections').then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.inspection', {\r\n url: '/inspection/:id',\r\n templateUrl: paths.app + 'inspections/components/inspection/inspection.html',\r\n controller: 'PortalInspection',\r\n params: {\r\n id: null,\r\n inspection: null\r\n },\r\n data: {\r\n hideMenus: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view('portal.menus.inspections').then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n // scheduling tab\r\n .state('portal.menus.scheduling', {\r\n url: '/scheduling',\r\n templateUrl: 'templates/inspections-scheduling/inspections-scheduling.html',\r\n controller: 'InspectionsScheduling',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.schedule', {\r\n url: '/schedule',\r\n templateUrl: 'templates/inspections-schedule/inspections-schedule.html',\r\n controller: 'InspectionsSchedule',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view('portal.menus.scheduling').then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.linkpage', [])\r\n .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\r\n $stateProvider\r\n // portal routings\r\n // link page\r\n .state('portal.menus.linkpage', {\r\n url: '/linkpage/:id',\r\n templateUrl: paths.app + 'link-page/components/link-page/link-page.html',\r\n controller: 'LinkPage',\r\n params: {\r\n id: null\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.login', [])\r\n .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\r\n $stateProvider\r\n // portal routings\r\n // login page\r\n .state('portal.menus.login', {\r\n url: '/login?errorCode&surpressRedirect&statusId',\r\n templateUrl: paths.app + 'login/components/login/login.html',\r\n controller: 'Login',\r\n params: {\r\n review: false,\r\n messages: [],\r\n keepMessages: false,\r\n errorCode: null,\r\n surpressRedirect: null,\r\n statusId: null,\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n .state('portal.menus.createaccount', {\r\n url: '/account/create?autofill',\r\n templateUrl: paths.app + 'login/components/create-account/create-account.html',\r\n controller: 'CreateAccount',\r\n params: {\r\n messages: [],\r\n autofill: \"false\",\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n .state('portal.menus.forgotusername', {\r\n url: '/forgot/username',\r\n templateUrl: paths.app + 'login/components/forgot-username/forgot-username.html',\r\n controller: 'ForgotUsername',\r\n params: {\r\n messages: []\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n .state('portal.menus.forgotpassword', {\r\n url: '/forgot/password',\r\n templateUrl: paths.app + 'login/components/forgot-password/forgot-password.html',\r\n controller: 'ForgotPassword',\r\n params: {\r\n messages: []\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n .state('portal.menus.resetpassword', {\r\n url: '/reset/:token/:cameFromProfile',\r\n templateUrl: paths.app + 'login/components/reset-password/reset-password.html',\r\n controller: 'ResetPassword',\r\n params: {\r\n messages: [],\r\n token: null,\r\n cameFromProfile: 'false',\r\n keepMessages: false\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n }]\r\n }\r\n })\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.lookup', [])\r\n .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\r\n $stateProvider\r\n // portal routings\r\n // main lookup page\r\n .state('portal.menus.lookup', {\r\n url: '/lookup',\r\n templateUrl: paths.app + 'lookup/components/lookup/lookup.html',\r\n controller: 'Lookup',\r\n params: {\r\n review: false,\r\n messages: []\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.userlookup', {\r\n url: '/lookup/user',\r\n templateUrl: paths.app + 'lookup/components/user-lookup/user-lookup.html',\r\n controller: 'UserLookup',\r\n params: {\r\n review: false,\r\n messages: [],\r\n lookup_object: null,\r\n priorState: ''\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.userlookupdetail', {\r\n url: '/lookup/user/detail/:id',\r\n templateUrl: paths.app + 'lookup/components/user-lookup/user-lookup-detail.html',\r\n controller: 'UserLookupDetail',\r\n params: {\r\n review: false,\r\n messages: [],\r\n id: null,\r\n user: null,\r\n lookup_object: null,\r\n priorState: ''\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.servicelookup', {\r\n url: '/lookup/service',\r\n templateUrl: paths.app + 'lookup/components/service-lookup/service-lookup.html',\r\n controller: 'ServiceLookup',\r\n params: {\r\n review: false,\r\n messages: [],\r\n lookup_object: null,\r\n priorState: ''\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.servicelookupdetail', {\r\n url: '/lookup/service/detail/:id',\r\n templateUrl: paths.app + 'lookup/components/service-lookup/service-lookup-detail.html',\r\n controller: 'ServiceLookupDetail',\r\n params: {\r\n review: false,\r\n messages: [],\r\n id: null,\r\n service: null,\r\n lookup_object: null,\r\n priorState: ''\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.schooldrills', {\r\n url: '/lookup/schooldrills',\r\n templateUrl: paths.app + 'lookup/components/fire-drill-lookup/fire-drill-lookup.html',\r\n controller: 'FireDrillLookup',\r\n params: {\r\n review: false,\r\n messages: [],\r\n lookup_object: null,\r\n priorState: ''\r\n },\r\n resolve: {\r\n permission: ['$state', '$rootScope', 'PortalPermissions', function ($state, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.react', [])\r\n .config(['$stateProvider', function ($stateProvider) {\r\n $stateProvider\r\n //On some exams and education pages, login is not required\r\n\r\n //Default route for exams pages, with permission checks\r\n .state('portal.menus.exams', {\r\n url: '/exams{path:(?:/.*)|$}',\r\n templateUrl: paths.app + 'react/components/exams/exams.html',\r\n controller: 'PortalExams',\r\n params: {\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n $rootScope.$state.current.data.loginRequired = false;\r\n\r\n var address = \"exams\" + $stateParams.path;\r\n var splitAddress = address.split('/');\r\n if (splitAddress.length > 2) {\r\n address = '';\r\n var edit = false;\r\n var regex = /^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i;\r\n if (regex.test(splitAddress[splitAddress.length - 1]) && splitAddress[splitAddress.length - 2] === \"edit\") {\r\n edit = true;\r\n }\r\n for (var i = 0; i < splitAddress.length; i++) {\r\n if (regex.test(splitAddress[i]) || (edit === false && splitAddress[i] === 'edit')) { continue; }\r\n address += splitAddress[i] + ((i === splitAddress.length - 1 || ((edit === true && splitAddress[i] === 'edit'))) ? '' : '/');\r\n }\r\n }\r\n\r\n return PortalPermissions.viewByAddress(address).then(function (accessObject) {\r\n //No access\r\n if (accessObject && !accessObject.access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n //Login required (will be used in api intercepter)\r\n else if (accessObject && accessObject.requiredLogin) {\r\n $rootScope.$state.current.data.loginRequired = true;\r\n }\r\n else if (!accessObject && ($stateParams.path.startsWith(\"/manage/sessions/\") || $stateParams.path.startsWith(\"/sessions/\"))) {\r\n //Manage exams tabs, require login\r\n $rootScope.$state.current.data.loginRequired = true;\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n\r\n //Default route for education pages, with permission checks\r\n .state('portal.menus.education', {\r\n url: '/education{path:(?:/.*)|$}',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation',\r\n params: {\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n $rootScope.$state.current.data.loginRequired = false;\r\n var address = \"education\" + $stateParams.path;\r\n if (address.startsWith(\"education/user/\")) {\r\n address = \"service/personnel/report\"; //Service Personnel Education Report\r\n }\r\n return PortalPermissions.viewByAddress(address).then(function (accessObject) {\r\n //No access\r\n if (accessObject && !accessObject.access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n //Login required (will be used in api intercepter)\r\n else if (accessObject && accessObject.requiredLogin) {\r\n $rootScope.$state.current.data.loginRequired = true;\r\n }\r\n else if (!accessObject && address.startsWith(\"education/courses/\")) {\r\n //Manage courses tabs, which are managed by course type instead of portal_pages, but require login\r\n $rootScope.$state.current.data.loginRequired = true;\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n\r\n //Default route for account pages, with permission checks\r\n .state('portal.menus.myAccount', {\r\n url: '/account{path:(?:/.*)|$}',\r\n templateUrl: paths.app + 'react/components/myAccount/myAccount.html',\r\n controller: 'PortalMyAccount',\r\n params: {\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.viewByAddress(\"account\" + $stateParams.path).then(function (accessObject) {\r\n //No access\r\n if (accessObject && !accessObject.access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n\r\n .state('portal.menus.manage', {\r\n url: '/exams/manage/sessions',\r\n templateUrl: paths.app + 'react/components/exams/exams.html'\r\n })\r\n .state('portal.menus.examsManageSessions', {\r\n url: '/exams/manage/sessions',\r\n templateUrl: paths.app + 'react/components/exams/exams.html'\r\n })\r\n .state('portal.menus.examsExaminerSessions', {\r\n url: '/exams/sessions',\r\n templateUrl: paths.app + 'react/components/exams/exams.html'\r\n })\r\n .state('portal.menus.examsMySessions', {\r\n url: '/exams/mysessions',\r\n templateUrl: paths.app + 'react/components/exams/exams.html'\r\n })\r\n\r\n .state('portal.menus.userLookupEducationReport', {\r\n url: '/education/lookup/user/educationReport/:id',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.userLookupEducationCourseList', {\r\n url: '/education/lookup/user/courseList/:id',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n\r\n .state('portal.menus.educationServiceReport', {\r\n url: '/education/user/:userId',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationServiceCourseList', {\r\n url: '/education/user/:userId/courseList',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationMyReport', {\r\n url: '/education/myreports',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationFindCourses', {\r\n url: '/education/findcourses',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationMyCourses', {\r\n url: '/education/mycourses',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationManageCourses', {\r\n url: '/education/manage/courses',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationManageCoursesNew', {\r\n url: '/education/manage/courses/:statusId',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationManageCoursesUpcoming', {\r\n url: '/education/manage/courses/upcoming',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.educationManageCoursesTests', {\r\n url: '/education/manage/courses/tests',\r\n templateUrl: paths.app + 'react/components/education/education.html',\r\n controller: 'PortalEducation'\r\n })\r\n .state('portal.menus.accountDashboard', {\r\n url: '/account/dashboard',\r\n templateUrl: paths.app + 'react/components/myAccount/myAccount.html',\r\n controller: 'PortalMyAccount'\r\n })\r\n .state('portal.menus.accountCertifications', {\r\n url: '/account/certifications',\r\n templateUrl: paths.app + 'react/components/myAccount/myAccount.html',\r\n controller: 'PortalMyAccount'\r\n })\r\n .state('portal.menus.accountProfileNew', {\r\n url: '/account/profile',\r\n templateUrl: paths.app + 'react/components/myAccount/myAccount.html',\r\n controller: 'PortalMyAccount'\r\n })\r\n .state('portal.menus.accountContactProfiles', {\r\n url: '/account/contact_profiles',\r\n templateUrl: paths.app + 'react/components/myAccount/myAccount.html',\r\n controller: 'PortalMyAccount'\r\n })\r\n .state('portal.menus.accountDocumentNew', {\r\n url: '/account/documents',\r\n templateUrl: paths.app + 'react/components/myAccount/myAccount.html',\r\n controller: 'PortalMyAccount'\r\n })\r\n .state('portal.menus.investigations', {\r\n url: '/complaints/publicform',\r\n templateUrl: paths.app + 'react/components/investigations/investigationsForm.html',\r\n controller: 'PortalInvestigationForm',\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.complaintReceived', {\r\n url: '/complaints/received',\r\n templateUrl: paths.app + 'react/components/investigations/investigationsForm.html',\r\n controller: 'PortalInvestigationForm',\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view('portal.menus.investigations').then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n\r\n .state('portal.menus.signatureCapture', {\r\n url: '/signature_capture/:id',\r\n templateUrl: paths.app + 'react/components/investigations/investigationsForm.html',\r\n controller: 'PortalInvestigationForm',\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n //No access\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n\r\n .state('portal.menus.signatureCaptureResponse', {\r\n url: '/signature_capture_response/:id',\r\n templateUrl: paths.app + 'react/components/investigations/investigationsForm.html',\r\n controller: 'PortalInvestigationForm',\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n // The access permission of 'signature capture response' page depends on 'signature capture' page:\r\n return PortalPermissions.view('portal.menus.signatureCapture').then(function (access) {\r\n //No access\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.services', [])\r\n .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\r\n $stateProvider\r\n // portal routings\r\n // services tab\r\n .state('portal.menus.service', {\r\n abstract: true,\r\n templateUrl: paths.app + 'services/components/service/service.html',\r\n controller: 'PortalService',\r\n params: {\r\n id: null,\r\n service: null\r\n }\r\n })\r\n .state('portal.menus.service.inspections', {\r\n url: '/service/:id/inspections',\r\n templateUrl: paths.app + 'services/components/inspections/inspections.html',\r\n controller: 'PortalServiceInspections',\r\n params: {\r\n id: null,\r\n service: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.service.clinicians', {\r\n url: '/service/:id/clinicians',\r\n templateUrl: paths.app + 'services/components/clinicians/clinicians.html',\r\n controller: 'PortalClinicians',\r\n params: {\r\n id: null,\r\n service: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n .state('portal.menus.service.vouchers', {\r\n url: '/service/:id/vouchers',\r\n templateUrl: paths.app + 'services/components/vouchers/vouchers.html',\r\n controller: 'PortalVouchers',\r\n params: {\r\n id: null,\r\n service: null,\r\n loginRequired: true\r\n },\r\n resolve: {\r\n permission: ['$state', '$stateParams', '$rootScope', 'PortalPermissions', function ($state, $stateParams, $rootScope, PortalPermissions) {\r\n $rootScope.$state.current = this.self;\r\n return PortalPermissions.view(this.self.name).then(function (access) {\r\n if (!access) {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n }]\r\n }\r\n })\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .directive('portalCopyright', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: paths.app + 'components/copyright/copyright.html',\r\n controller: ['$scope', function ($scope) {\r\n $scope.currentYear = (new Date()).getFullYear();\r\n }],\r\n replace: true,\r\n link: function (scope, elem, attrs, ctrl) {\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .directive('portalFooter', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: paths.app + 'components/footer/footer.html',\r\n controller: ['$scope', '$rootScope', '$sce', 'CMSSites', 'CMSPages', 'Format', function ($scope, $rootScope, $sce, CMSSites, CMSPages, Format) {\r\n\r\n $scope.editing = false;\r\n\r\n if ($rootScope.site) {\r\n $scope.site = $rootScope.site;\r\n }\r\n \r\n if (!$scope.site) {\r\n $scope.site = {};\r\n }\r\n\r\n if (!$scope.site.public_portal_footer) {\r\n $scope.site.public_portal_footer = \"\";\r\n }\r\n\r\n $rootScope.$watch('loadingSite', function (newValue, oldValue) {\r\n if (!newValue) {\r\n $scope.site = $rootScope.site;\r\n }\r\n });\r\n\r\n $scope.renderHtml = function (htmlCode) {\r\n if (typeof htmlCode == \"string\") {\r\n return $sce.trustAsHtml(htmlCode);\r\n }\r\n return \"\";\r\n }\r\n\r\n $scope.edit = function () {\r\n var isInIframe = (parent !== window);\r\n if (isInIframe) {\r\n if (window.parent.location.href.includes($rootScope.enterprise.site_location + \"license/admin/public_portal/layout.cfm\")){\r\n $scope.editing = true;\r\n }\r\n }\r\n }\r\n\r\n $scope.close = function () {\r\n $scope.editing = false;\r\n }\r\n\r\n $scope.saveFooter = function () {\r\n $scope.footerSaving = true;\r\n CMSSites.save($scope.site).then(function (result) {\r\n $scope.footerSaving = false;\r\n $scope.editing = false;\r\n });\r\n }\r\n }],\r\n replace: true,\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .directive('portalHeader', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: paths.app + 'components/header/header.html',\r\n controller: ['$scope', '$state', '$rootScope', '$sce', 'CMSSites', 'CMSPages', 'Format', 'EnterpriseLinkService', function ($scope, $state, $rootScope, $sce, CMSSites, CMSPages, Format, EnterpriseLinkService) {\r\n\r\n $scope.editing = false;\r\n\r\n if ($rootScope.site) {\r\n $scope.site = $rootScope.site;\r\n if ($rootScope.portalCSS) {\r\n $scope.site.public_portal_css = $rootScope.portalCSS;\r\n }\r\n else {\r\n // render the CSS\r\n $scope.site.public_portal_css = Format.buildCSS($scope.site.public_portal_css, true);\r\n }\r\n }\r\n\r\n if ($rootScope.enterprise) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n if ($rootScope.portalURL) {\r\n $scope.portalURL = $rootScope.portalURL;\r\n }\r\n else {\r\n $scope.portalURL = $scope.enterprise.website;\r\n $rootScope.portalURL = $scope.enterprise.website;\r\n }\r\n }\r\n\r\n if ($scope.site) {\r\n if (!$scope.site.public_portal_header) {\r\n $scope.site.public_portal_header = \"\";\r\n }\r\n CMSPages.getMenu({ site_id: $scope.site.id, is_public: true }).then(function (pages) {\r\n EnterpriseLinkService.get().then(function (links) {\r\n $scope.menuPages = pages;\r\n $scope.links = links;\r\n });\r\n });\r\n }\r\n else {\r\n $scope.site = {};\r\n }\r\n\r\n if (!$scope.site.public_portal_header) {\r\n $scope.site.public_portal_header = \"\";\r\n }\r\n\r\n $scope.renderHtml = function (htmlCode) {\r\n if (typeof htmlCode == \"string\") {\r\n return $sce.trustAsHtml(htmlCode);\r\n }\r\n return \"\";\r\n }\r\n $scope.underscore = function (phrase) {\r\n return Format.underscore(phrase);\r\n }\r\n\r\n $scope.edit = function () {\r\n var isInIframe = (parent !== window);\r\n if (isInIframe) {\r\n if (window.parent.location.href.includes($rootScope.enterprise.site_location + \"license/admin/public_portal/layout.cfm\")) {\r\n $scope.editing = true;\r\n }\r\n }\r\n }\r\n\r\n $scope.close = function () {\r\n $scope.editing = false;\r\n }\r\n\r\n $scope.customPage = function (linkId) {\r\n $scope.loading = true;\r\n $state.go('portal.menus.linkpage', { id: linkId });\r\n }\r\n\r\n $scope.saveHeader = function () {\r\n $scope.headerSaving = true;\r\n CMSSites.save($scope.site).then(function (result) {\r\n $scope.headerSaving = false;\r\n $scope.editing = false;\r\n });\r\n }\r\n }],\r\n replace: true,\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.toggleMenu = function () {\r\n var nav = angular.element(document.querySelector(\"#licensure .navigation\"));\r\n if (nav.css('display') == 'none' || nav.css('display') == '') {\r\n nav.css('display', 'block');\r\n }\r\n else {\r\n nav.css('display', 'none')\r\n }\r\n\r\n angular.element(document.querySelector(\"#licensure .menu.mobile\")).toggleClass('expand');\r\n }\r\n }\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .directive('portalNavigation', ['$rootScope', 'PortalPermissions', function ($rootScope, PortalPermissions) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: paths.app + 'components/navigation/navigation.html',\r\n controller: ['$q', '$scope', 'Account', 'Authentication', 'Enterprise', '$state', function ($q, $scope, Account, Authentication, Enterprise, $state) {\r\n $scope.loggedIn = false;\r\n $scope.pages = [];\r\n $scope.permissions = [];\r\n $scope.loadingMenu = true;\r\n $scope.examsModuleOn = false;\r\n $scope.inspectionsModuleOn = false;\r\n $scope.clinicianImportOn = false;\r\n $scope.manageRoute = null;\r\n $scope.loadingRoute = true;\r\n\r\n $scope.getEnterprise = function () {\r\n Enterprise.get().then(function (enterprise) {\r\n if (enterprise != null) {\r\n $scope.examsModuleOn = (enterprise.exams_module == null ? false : enterprise.exams_module);\r\n $scope.inspectionsModuleOn = (enterprise.inspections_module == null ? false : enterprise.inspections_module);\r\n $scope.educationModuleOn = (enterprise.education_module == null ? false : enterprise.education_module);\r\n $scope.clinicianImportOn = (enterprise.clinicians_import == null ? false : enterprise.clinicians_import);\r\n $scope.voucherPayOn = (enterprise.settings.voucher_pay == null ? false : enterprise.settings.voucher_pay);\r\n }\r\n if ($rootScope.userAccount != null) {\r\n if ($scope.examsModuleOn && $scope.getPermission('portal.menus.examsManageSessions') && ($rootScope.userAccount.exam_examiner || $rootScope.userAccount.exam_coordinator || $rootScope.userAccount.super)) {\r\n $scope.manageRoute = \"portal.menus.examsManageSessions\"\r\n } else if ($scope.educationModuleOn && $scope.getPermission('portal.menus.educationManageCourses') && ($rootScope.userAccount.education_coordinator || $rootScope.userAccount.education_instructor || $rootScope.userAccount.super || $rootScope.userAccount.medical_director || $rootScope.userAccount.service_director)) {\r\n $scope.manageRoute = \"portal.menus.educationManageCourses\"\r\n }\r\n }\r\n $scope.loadingRoute = false;\r\n })\r\n }\r\n $scope.setupPermissions = function () {\r\n var promises = [];\r\n if (isEmpty($scope.permissions)) {\r\n promises.push(PortalPermissions.getPermissions().then(function (portalPermissions) {\r\n $scope.permissions = portalPermissions;\r\n }));\r\n }\r\n\r\n promises.push(Authentication.get(true).then(function (authData) {\r\n if (authData) {\r\n $scope.loggedIn = true;\r\n }\r\n else {\r\n Account.get({ portal: true }).then(function (account) {\r\n //Also using user account to check if logged in, since local storage might not be set when redirecting from .net\r\n if (account) {\r\n $scope.loggedIn = true;\r\n $rootScope.userAccount = account;\r\n }\r\n });\r\n }\r\n }));\r\n $scope.getEnterprise();\r\n $q.all(promises).then(function () {\r\n $scope.loadingMenu = false;\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n }\r\n $scope.setupPermissions();\r\n\r\n $scope.getAppCounts = function () {\r\n if ($rootScope.userAccount != null && typeof ($rootScope.userAccount.counts_retrieved) != \"undefined\" && !$rootScope.userAccount.counts_retrieved) {\r\n Account.getApplicationCounts({ userID: $rootScope.userID }).then(function (counts) {\r\n $rootScope.userAccount.counts_retrieved = true;\r\n $rootScope.userAccount.continue_count = counts.continue_count;\r\n $rootScope.userAccount.review_count = counts.review_count;\r\n $rootScope.userAccount.checkout_count = counts.checkout_count;\r\n });\r\n }\r\n }\r\n $scope.getAppCounts();\r\n\r\n $scope.getPermission = function (state) {\r\n if (!isEmpty($scope.permissions) && $scope.permissions[state] !== undefined) {\r\n return (($rootScope.userAccount != null && $rootScope.userAccount.super) || $scope.permissions[state].visible) && (($scope.loggedIn && $scope.permissions[state].required_login != false) || $scope.permissions[state].required_login != true);\r\n }\r\n return false;\r\n }\r\n \r\n $scope.$watch('$state.current.name', function (newValue, oldValue) {\r\n if (newValue != 'portal.menus.login') {\r\n if ($rootScope.userAccount == null) {\r\n Account.get({ portal: true }).then(\r\n function (account) {\r\n $rootScope.userAccount = account;\r\n $scope.getEnterprise();\r\n $scope.getAppCounts();\r\n }\r\n );\r\n }\r\n else {\r\n $scope.getEnterprise();\r\n }\r\n }\r\n });\r\n \r\n $scope.educationRoute = null;\r\n $scope.getEducationPermission = function () {\r\n if ($scope.getPermission('portal.menus.educationFindCourses')) {\r\n $scope.educationRoute = 'portal#/education/findcourses';\r\n } else if ($scope.getPermission('portal.menus.educationMyCourses')) {\r\n $scope.educationRoute = 'portal#/education/mycourses';\r\n } else if ($scope.getPermission('portal.menus.educationMyReport')) {\r\n $scope.educationRoute = 'portal#/education/myreports';\r\n }\r\n return $scope.educationRoute != null;\r\n }\r\n \r\n $scope.getName = function (state) {\r\n if (!isEmpty($scope.permissions) && $scope.permissions[state] !== undefined) {\r\n return $scope.permissions[state].name || null;\r\n }\r\n return null;\r\n }\r\n\r\n $scope.checkDocumentLoad = function () {\r\n //if we are loading a document on the react side hide the menu and expand the view size to fill the entire space available. We are doing this so we can use the same document page for all react document links.\r\n if (typeof $state.params.path !== 'undefined' && $state.params.path.indexOf('openDocument') > 0) {\r\n document.getElementById(\"licensureNavMenu\").remove();\r\n document.getElementById(\"licensureView\").className = \"col-sm-12 col-md-12\";\r\n }\r\n }\r\n $scope.checkDocumentLoad();\r\n }],\r\n replace: true,\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n $rootScope.$on('$stateChangeSuccess',\r\n function (event, toState, toParams, fromState, fromParams) {\r\n scope.loggedIn = false;\r\n scope.setupPermissions();\r\n }\r\n );\r\n $rootScope.$on('AuthenticationFromSSO:finish', function () {\r\n scope.setupPermissions();\r\n });\r\n }\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .directive('portalOfflineTop', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: paths.app + 'components/offline-top/offline-top.html',\r\n replace: true,\r\n link: function (scope, elem, attrs, ctrl) {\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .controller(\r\n 'PublicTimeoutNotifyModalController', function ($scope, logout, stayLoggedIn) {\r\n $scope.logout = logout;\r\n $scope.stayLoggedIn = stayLoggedIn;\r\n })","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .controller(\r\n 'PortalTimeoutNotifyController', function ($rootScope, Idle, $modal, Utils, localStorageService, $state, Enterprise, Session) {\r\n $rootScope.message = \"You are about to be logged out for inactivity. Interact with the webpage to stay logged in.\";\r\n $rootScope.warningCountdown = 300;\r\n $rootScope.showCountdown = true;\r\n $rootScope.timeoutInfoLoaded = false;\r\n\r\n Enterprise.getlogoutSettings($rootScope.enterpriseID).then(function (enterprise) {\r\n if (enterprise != null) {\r\n Idle.setTimeout(enterprise.public_length);\r\n Idle.setIdle((enterprise.public_session_length - 10) - enterprise.public_length);\r\n $rootScope.message = enterprise.public_warning_text;\r\n $rootScope.warningCountdown = enterprise.public_length;\r\n $rootScope.timeoutInfoLoaded = true;\r\n }\r\n if ($rootScope.authenticatedPage) {\r\n Idle.watch();\r\n } else {\r\n Idle.unwatch();\r\n }\r\n });\r\n\r\n function loadTimeoutInfo() {\r\n Enterprise.getlogoutSettings($rootScope.enterpriseID).then(function (enterprise) {\r\n if (enterprise != null) {\r\n Idle.setTimeout(enterprise.public_length);\r\n Idle.setIdle((enterprise.public_session_length - 10) - enterprise.public_length);\r\n $rootScope.message = enterprise.public_warning_text;\r\n $rootScope.warningCountdown = enterprise.public_length;\r\n $rootScope.timeoutInfoLoaded = true;\r\n }\r\n if ($rootScope.authenticatedPage) {\r\n Idle.watch();\r\n } else {\r\n Idle.unwatch();\r\n }\r\n });\r\n }\r\n\r\n function closeModals() {\r\n if ($rootScope.warning) {\r\n $rootScope.warning.close();\r\n $rootScope.warning = null;\r\n }\r\n\r\n if ($rootScope.timedout) {\r\n $rootScope.timedout.close();\r\n $rootScope.timedout = null;\r\n }\r\n }\r\n\r\n $rootScope.$on('IdleStart', function () {\r\n closeModals();\r\n $rootScope.warning = $modal.open({\r\n templateUrl: paths.app + 'components/timeout-notify/timeout-notify.html',\r\n controller: 'PublicTimeoutNotifyModalController',\r\n windowClass: 'modal-warning',\r\n backdrop: 'static', //This prevents the modal from closing when clicking outside \r\n keyboard: false, //This prevents the modal from closing when pressing ESC\r\n resolve: {\r\n logout: function () {\r\n return function () {\r\n Idle.unwatch();\r\n closeModals();\r\n Utils.DeleteSessionCookie(true);\r\n Session.expireSession(true);\r\n localStorageService.remove('portalAuthorizationData');\r\n $rootScope.userAccount = null;\r\n $state.go(\"portal.menus.login\", { messages: [\"You have successfully logged out\"] });\r\n }\r\n },\r\n stayLoggedIn: function () {\r\n return function () {\r\n Idle.watch();\r\n Session.checkIn();\r\n closeModals();\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n $rootScope.$on('IdleTimeout', function () {\r\n Session.IsSessionAlive().then(function (session) {\r\n closeModals();\r\n\r\n // If session was NOT kept alive by another tab, logout\r\n if (!session) {\r\n Idle.unwatch();\r\n Utils.DeleteSessionCookie(true);\r\n Session.expireSession(true);\r\n localStorageService.remove('portalAuthorizationData');\r\n $rootScope.userAccount = null;\r\n $state.go(\"portal.menus.login\", { messages: [\"You have successfully logged out\"] });\r\n } else {\r\n Idle.watch();\r\n }\r\n });\r\n });\r\n\r\n //Resetting idle time when state is changed\r\n $rootScope.$on('$stateChangeStart', function () {\r\n closeModals();\r\n\r\n if ($rootScope.timeoutInfoLoaded) {\r\n if ($rootScope.authenticatedPage) {\r\n Idle.watch();\r\n } else {\r\n Idle.unwatch();\r\n }\r\n }\r\n else\r\n loadTimeoutInfo();\r\n });\r\n })\r\n\r\n .config(function (IdleProvider, KeepaliveProvider) {\r\n IdleProvider.interrupt('');\r\n IdleProvider.idle(1200);\r\n IdleProvider.timeout(300);\r\n KeepaliveProvider.interval(60);\r\n })","'use strict';\r\n\r\nangular.module('licensure.portal')\r\n .directive('portalTop', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: paths.app + 'components/top/top.html',\r\n replace: true,\r\n controller: ['$scope', '$rootScope', '$stateParams', '$state', '$sce', 'Utils', 'localStorageService', 'Alerts', '$window', 'PortalPermissions', 'Saml', 'Session', 'UserStatuses', 'Enterprise', function ($scope, $rootScope, $stateParams, $state, $sce, Utils, localStorageService, Alerts, $window, PortalPermissions, Saml, Session, UserStatuses, Enterprise) {\r\n $scope.messages = $stateParams.messages || [];\r\n\r\n $scope.getPermission = function (state, variable) {\r\n PortalPermissions.view(state).then(function (access) {\r\n $scope[variable] = access;\r\n })\r\n }\r\n\r\n //Params for SSO\r\n $scope.errorCode = $stateParams.errorCode;\r\n $scope.statusId = $stateParams.statusId;\r\n\r\n $scope.stateName = $state.current.name;\r\n $scope.loginRequired = $stateParams.loginRequired;\r\n $scope.portal_page = $rootScope.portal_pages[$scope.stateName];\r\n $scope.hideAlerts = true;\r\n $scope.showAccountAlerts = false; \r\n if (($scope.portal_page !== undefined || $scope.portal_page != null) && typeof ($scope.portal_page.content) == \"string\") {\r\n $scope.portal_page.content = $sce.trustAsHtml($scope.portal_page.content);\r\n }\r\n $scope.alertsCount = {length: 0};\r\n $scope.$watch('showAccountAlerts', function (newValue, oldValue) {\r\n if (newValue == true && $state.params.path == \"/dashboard\") {\r\n Alerts.getAlertsCount({ user_id: $rootScope.userID || $rootScope.userAccount.id }).then(function (count) {\r\n $scope.alertsCount = { length: count };\r\n });\r\n }\r\n });\r\n $scope.$watch('$state.current.name', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n if ($stateParams.keepMessages) {\r\n $scope.messages = $stateParams.messages;\r\n }\r\n else if ($state.params && $state.params.keepMessages) {\r\n $scope.messages = $state.params.messages;\r\n }\r\n else {\r\n $scope.messages = [];\r\n }\r\n $scope.stateName = $state.current.name;\r\n $scope.loginRequired = $stateParams.loginRequired;\r\n $scope.portal_page = $rootScope.portal_pages[$scope.stateName];\r\n if (($scope.portal_page !== undefined || $scope.portal_page != null) && typeof ($scope.portal_page.content) == \"string\") {\r\n $scope.portal_page.content = $sce.trustAsHtml($scope.portal_page.content);\r\n }\r\n }\r\n });\r\n\r\n $scope.$watch('$state.params.path', function (newValue) {\r\n if (newValue == \"/dashboard\") {\r\n $scope.showAccountAlerts = true;\r\n }\r\n else {\r\n $scope.showAccountAlerts = false;\r\n $scope.hideAlerts = true;\r\n }\r\n });\r\n\r\n $scope.$watch('$state.params.messages', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n if ($state.params.keepMessages) {\r\n $scope.messages = $state.params.messages;\r\n }\r\n }\r\n });\r\n\r\n $scope.logout = function () {\r\n //Identity Provider Logout\r\n if ($rootScope.userAccount && $rootScope.userAccount.has_identity_provider) {\r\n var redirectURL = $rootScope.portalURL;\r\n //Make sure the portal URL is a relative URL (sometimes it's the full url)\r\n if (redirectURL.startsWith($window.location.origin)) {\r\n redirectURL = redirectURL.replace($window.location.origin, \"\");\r\n }\r\n Saml.idpSignOut(redirectURL).then(function (ret) {\r\n expireSession();\r\n if (ret && ret.redirectUrl) {\r\n window.location.href = ret.redirectUrl;\r\n }\r\n else {\r\n $state.go(\"portal.menus.login\", { messages: [\"You have successfully logged out\"] }, { reload: true });\r\n }\r\n });\r\n }\r\n //Regular Logout\r\n else {\r\n expireSession();\r\n $state.go(\"portal.menus.login\", { messages: [\"You have successfully logged out\"] }, {reload: true});\r\n }\r\n };\r\n\r\n function expireSession() {\r\n // remove existing cookie and token from local storage\r\n Utils.DeleteSessionCookie(true);\r\n // expire any existing session\r\n Session.expireSession(true);\r\n localStorageService.remove('portalAuthorizationData');\r\n $rootScope.userAccount = null;\r\n }\r\n\r\n $scope.goToProfile = function () {\r\n if ($state.params.path != '/profile') {\r\n $state.go('portal.menus.accountProfileNew');\r\n }\r\n };\r\n\r\n function loadAlerts() {\r\n Alerts.getDashboardAlerts({ user_id: $rootScope.userID }).then(function (alerts) {\r\n for (var a = 0; a < alerts.length; a++) {\r\n if (alerts[a].color == null) {\r\n alerts[a].color = 'fff6cf'; // default color\r\n }\r\n }\r\n\r\n $scope.alerts = alerts;\r\n if ($scope.alerts.length > 0) {\r\n $scope.showAccountAlerts = true;\r\n $scope.hideAlerts = false;\r\n }\r\n });\r\n }\r\n $scope.toggle = function () {\r\n var x = document.getElementById(\"alertList\");\r\n if ($scope.hideAlerts == true) {\r\n document.getElementById(\"alert\").innerHTML = '   Your account has ' + $scope.alertsCount.length + ' active alert(s)';\r\n if ($scope.alerts == null) {\r\n loadAlerts();\r\n }\r\n $scope.hideAlerts = false; \r\n x.style.display = \"block\";\r\n } else {\r\n document.getElementById(\"alert\").innerHTML = '   Your account has ' + $scope.alertsCount.length + ' active alert(s)';\r\n $scope.hideAlerts = true; \r\n x.style.display = \"none\";\r\n } \r\n }\r\n\r\n $scope.acceptedMessages = [\r\n \"An error occurred during the login process - the NameIdentifier is missing or invalid. Please try again later or contact your system administrator.\",\r\n \"There was not enough information to create your account. Please try again later or contact your system administrator.\",\r\n \"There was an error when trying to create your account. Please try again later or contact your system administrator.\",\r\n \"An error occured during the login process. Please try again later or contact your system administrator.\",\r\n \"Your credentials are managed by a SSO. If you are unable to login via your Single Sign On service, please contact your system administrator.\",\r\n \"You have reached the maximum number of concurrent sessions possible. Please logout from other devices and try again.\",\r\n \"Missing enterprise id\",\r\n \"This user account is inactive\",\r\n \"This user account does not have access to the site\",\r\n \"This user account does not belong to enterprise\",\r\n \"This user account is in a status that is locked\",\r\n \"This user account has exceeded the number of allowed inactive days and is suspended\",\r\n \"Account creation failed - user with identical email already exists.\",\r\n \"Internal server error\",\r\n \"Operation canceled\",\r\n \"lockedMessage\",\r\n \"duplicatePreventionText\",\r\n ];\r\n\r\n if ($scope.errorCode) {\r\n //Passing messages from .net to frontend\r\n //Have to sanitize the message because of javascript injection - some of these messages might be html\r\n if ($scope.errorCode < $scope.acceptedMessages.length) {\r\n var errorMessage = $scope.acceptedMessages[$scope.errorCode];\r\n if (!$scope.messages) { $scope.messages = []; }\r\n if (errorMessage === \"lockedMessage\") {\r\n if ($scope.statusId) {\r\n //Get the status locked message\r\n UserStatuses.getUserStatusLockedMessage($scope.statusId).then(function (lockedText) {\r\n errorMessage = lockedText;\r\n $scope.messages.push(errorMessage);\r\n });\r\n }\r\n }\r\n else if (errorMessage === \"duplicatePreventionText\") {\r\n //Get the duplicate prevention message\r\n Enterprise.getDuplicatePreventionText().then(function (duplicateText) {\r\n errorMessage = duplicateText;\r\n $scope.messages.push(errorMessage);\r\n });\r\n }\r\n else {\r\n $scope.messages.push(errorMessage);\r\n }\r\n }\r\n }\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.applications')\r\n .controller('PortalApplicationsCheckout', ['$scope', '$rootScope', '$stateParams', '$state', function ($scope, $rootScope, $stateParams, $state) {\r\n $scope.redirectImmediately = $stateParams.redirectImmediately;\r\n\r\n $rootScope.$on('generate:pdf', function () {\r\n $rootScope.generatingPDF = true;\r\n });\r\n\r\n if ($scope.redirectImmediately == true) {\r\n $rootScope.generatingPDF = false;\r\n $state.go('portal.menus.checkoutlist');\r\n }\r\n\r\n $rootScope.$on('reset:application', function () {\r\n $rootScope.generatingPDF = false;\r\n $state.go('portal.menus.checkoutlist');\r\n });\r\n\r\n window.onbeforeunload = function (e) {\r\n if ($rootScope.generatingPDF) {\r\n var message = \"\", e = e || window.event;\r\n // For IE and Firefox\r\n if (e) {\r\n e.returnValue = message;\r\n }\r\n\r\n // For Safari\r\n return message;\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.applications')\r\n .controller('PortalApplicationsCheckoutPayment', ['$q', '$scope', '$window', '$filter', '$rootScope', 'Payments', 'Regions', 'Resource', 'Format', function ($q, $scope, $window, $filter, $rootScope, Payments, Regions, Resource, Format) {\r\n\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.applications')\r\n .controller('PortalApplicationResponse', ['$scope', '$stateParams', 'LicenseRequests', function ($scope, $stateParams, LicenseRequests) {\r\n $scope.response = $stateParams.response;\r\n $scope.responseID = $stateParams.responseID;\r\n $scope.fireStartTrigger = $stateParams.fireStartTrigger;\r\n $scope.applicationID = $stateParams.id;\r\n $scope.application = $stateParams.application;\r\n $scope.review = $stateParams.review;\r\n $scope.applicationLoading = true;\r\n\r\n if ($stateParams.id != null) {\r\n LicenseRequests.getByID($stateParams.id).then(function (application) {\r\n $scope.application = application;\r\n $scope.applicationLoading = false;\r\n })\r\n }\r\n else {\r\n $scope.application = {};\r\n $scope.applicationLoading = false;\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.applications')\r\n .controller('PortalApplications', ['$scope', 'LicenseRequests', 'FBForms', 'FBResponses', 'Cache', '$state', '$stateParams', '$rootScope', '$window', '$filter', 'Triggers', '$timeout', 'Documents', 'Session', 'PortalPermissions',\r\n function ($scope, LicenseRequests, FBForms, FBResponses, Cache, $state, $stateParams, $rootScope, $window, $filter, Triggers, $timeout, Documents, Session, PortalPermissions) {\r\n $scope.review = $stateParams.review;\r\n $scope.loading = true;\r\n $scope.appLoading = true;\r\n $scope.serviceVehicleDataSet = [];\r\n $scope.bulkActionApplications = [];\r\n $scope.showBulkAction = false;\r\n $scope.listParams = {\r\n currentPage: 0,\r\n numPerPage: 10\r\n }\r\n $scope.statusFilterParameters = {\r\n publicOnly: true // hardcoded for now, get only public statuses\r\n }\r\n\r\n $scope.enterprise = $rootScope.enterprise;\r\n // Get the entity label\r\n $scope.serviceLabel = $scope.enterprise.serviceLabels[\"SERVICE\"];\r\n \r\n Session.CheckSession().then(function (validSession) {\r\n $scope.appLoading = true;\r\n if (validSession) {\r\n LicenseRequests.get({ userOnly: !$scope.review, reviewOnly: $scope.review, userId: $rootScope.userID }).then(function (applications) {\r\n if (applications != null) {\r\n $scope.applications = applications.records;\r\n getServiceApplicationVehicles();\r\n }\r\n $scope.loading = false;\r\n });\r\n }\r\n });\r\n\r\n PortalPermissions.getPermissions().then(function (portalPermissions) {\r\n if (portalPermissions && portalPermissions[\"portal.menus.reviewPayment\"] && portalPermissions[\"portal.menus.reviewPayment\"].visible) {\r\n $scope.showBulkAction = true;\r\n }\r\n })\r\n\r\n Cache.getState('list').then(function (state) {\r\n if (state != null) {\r\n $scope.sortBy = state.sortBy;\r\n $scope.reverse = state.reverse;\r\n $scope.search = state.search;\r\n $scope.listParams.currentPage = state.currentPage;\r\n $scope.listParams.numPerPage = state.numPerPage;\r\n }\r\n else {\r\n $scope.listParams.currentPage = 0;\r\n $scope.listParams.numPerPage = 10;\r\n }\r\n });\r\n\r\n $scope.cacheList = function () {\r\n var state = {\r\n sortBy: $scope.sortBy,\r\n reverse: $scope.reverse,\r\n search: $scope.search,\r\n currentPage: $scope.listParams.currentPage,\r\n numPerPage: $scope.listParams.numPerPage\r\n }\r\n\r\n Cache.setState('list', state);\r\n }\r\n\r\n $scope.$watch('search', function (old, newie) {\r\n if (old != newie) {\r\n $scope.listParams.currentPage = 0;\r\n $scope.cacheList();\r\n }\r\n });\r\n\r\n $scope.$watch('listParams.currentPage + listParams.numPerPage + sortBy + reverse', function (old, newie) {\r\n if (old != newie) {\r\n $scope.cacheList();\r\n }\r\n });\r\n\r\n $scope.clear = function () {\r\n $scope.search = '';\r\n $scope.listParams.currentPage = 0;\r\n $scope.cacheList();\r\n }\r\n\r\n $scope.startResponse = function (application, response) {\r\n response.starting = true;\r\n var saveResponse = angular.copy(response);\r\n saveResponse.progress = 1;\r\n saveResponse.started_on = new Date();\r\n FBResponses.save(saveResponse, null, false).then(function (savedResponse) {\r\n if (savedResponse != null && savedResponse.form.start_trigger_name != null && savedResponse.form.start_trigger_name != \"\") {\r\n Triggers.fire({\r\n name: savedResponse.form.start_trigger_name,\r\n triggerID: savedResponse.form.start_trigger_id,\r\n licenseRequestID: savedResponse.license_request_id\r\n });\r\n }\r\n $state.go('portal.menus.application', { id: application.id, application: application, responseID: response.id, response: response, review: $scope.review });\r\n response.starting = false;\r\n });\r\n }\r\n\r\n $scope.continueResponse = function (application, response) {\r\n $state.go('portal.menus.application', { id: application.id, application: application, responseID: response.id, response: response, review: $scope.review });\r\n }\r\n\r\n $scope.greaterThan = function (prop, val) {\r\n return function (item) {\r\n return item[prop] > val;\r\n }\r\n }\r\n\r\n $scope.formCountText = function (application) {\r\n var total = 0;\r\n var completed = 0;\r\n\r\n if (application.packages != null && application.packages.length > 0) {\r\n application.packages.forEach(function (pack) {\r\n if (pack.responses != null && pack.responses.length > 0) {\r\n total += pack.responses.length;\r\n completed += $filter('filter')(pack.responses, function (r) { return r.completed_On != null }).length;\r\n }\r\n });\r\n }\r\n if (application.responses != null && application.responses.length > 0) {\r\n total += application.responses.length;\r\n completed += $filter('filter')(application.responses, function (r) { return r.completed_On != null }).length;\r\n }\r\n\r\n return completed + \" of \" + total + \" completed\";\r\n }\r\n\r\n $scope.viewPdf = function (response) {\r\n Documents.logAccess(response.documentId);\r\n $window.open($rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + response.documentId.toUpperCase() + '&code=' + response.documentCode, '_blank');\r\n }\r\n\r\n var stop;\r\n $scope.checkApplicationTriggers = function (application) {\r\n if (application.currentTriggersFiringCount != null && application.currentTriggersFiringCount > 0) {\r\n // check if the application was modified in the last 45 seconds first\r\n if (application.modifiedOn != null && (((new Date) - application.modifiedOn) < (45 * 1000))) {\r\n if (angular.isDefined(stop)) return;\r\n\r\n stop = $timeout(function () {\r\n LicenseRequests.get({ userOnly: !$scope.review, reviewOnly: $scope.review }).then(function (applications) {\r\n stop = undefined;\r\n $scope.applications = applications;\r\n getServiceApplicationVehicles();\r\n })\r\n }, 5000);\r\n }\r\n else {\r\n // set the trigger fire count to 0\r\n application.currentTriggersFiringCount = 0;\r\n LicenseRequests.setCurrentTriggerCount(application.id, 0);\r\n }\r\n }\r\n }\r\n\r\n $rootScope.$on('generate:pdf', function () {\r\n $rootScope.generatingPDF = true;\r\n });\r\n\r\n $rootScope.$on('reset:application', function () {\r\n LicenseRequests.get({ userOnly: !$scope.review, reviewOnly: $scope.review }).then(function (applications) {\r\n $rootScope.generatingPDF = false;\r\n $scope.applications = applications;\r\n getServiceApplicationVehicles();\r\n })\r\n });\r\n\r\n window.onbeforeunload = function (e) {\r\n if ($rootScope.generatingPDF) {\r\n var message = \"\", e = e || window.event;\r\n // For IE and Firefox\r\n if (e) {\r\n e.returnValue = message;\r\n }\r\n // For Safari\r\n return message;\r\n }\r\n };\r\n\r\n $scope.$on('$destroy', function () {\r\n if (angular.isDefined(stop)) {\r\n $timeout.cancel(stop);\r\n stop = undefined;\r\n }\r\n });\r\n\r\n // Get Vehicle entity fields (call sign, serial_number, unit_number)\r\n $scope.vehicle = {};\r\n var entityIdx = $scope.enterprise.entities.findIndex(function (item) {\r\n return item.id === '774e4ce2-2d43-43fa-b64d-c70eb53e81ee'; // vehicles id in Entity_Enterprise_Fields\r\n });\r\n var categoryIdx = $scope.enterprise.entities[entityIdx].categories.findIndex(function (item) {\r\n return item.id === 'ca1379c4-3660-4d31-9fda-d1ee60c7b807'; // details id in Entity_Categories\r\n });\r\n const len = $scope.enterprise.entities[entityIdx].categories[categoryIdx].fields.length;\r\n const fields = $scope.enterprise.entities[entityIdx].categories[categoryIdx].fields;\r\n\r\n for (var i = 0; i < len; i++) {\r\n if (fields[i].name === 'call_sign') {\r\n $scope.vehicle.callSignName = fields[i].label;\r\n $scope.vehicle.useCallSign = fields[i].public_portal;\r\n } else if (fields[i].name === 'serial_number') {\r\n $scope.vehicle.serialNumberName = fields[i].label;\r\n $scope.vehicle.useSerialNumber = fields[i].public_portal;\r\n } else if (fields[i].name === 'unit_number') {\r\n $scope.vehicle.unitNumberName = fields[i].label;\r\n $scope.vehicle.useUnitNumber = fields[i].public_portal;\r\n }\r\n }\r\n\r\n function getServiceApplicationVehicles() {\r\n $scope.appLoading = true;\r\n var licenseRequestIds = [];\r\n\r\n // If there's a service, grab formIds to see if they have 'service_vehicles' data set\r\n if ($scope.applications) {\r\n for (var i = 0; i < $scope.applications.length; i++) {\r\n if ($scope.applications[i].serviceId != null) {\r\n licenseRequestIds.push($scope.applications[i].id);\r\n }\r\n }\r\n\r\n // Find which forms have vehicles & collect the data\r\n (function () {\r\n FBResponses.getServiceApplicationVehicles(licenseRequestIds).then(function (dataSet) {\r\n if (dataSet != null) {\r\n // Create a dictionary of license_request_id's & the vehicle_count\r\n var licenseRequestsAndVehicles = dataSet.reduce(function (acc, data) {\r\n if (acc[data.license_request_id]) {\r\n acc[data.license_request_id] += data.vehicle_count;\r\n } else {\r\n acc[data.license_request_id] = data.vehicle_count;\r\n }\r\n return acc;\r\n }, {});\r\n\r\n for (var i = 0; i < dataSet.length; i++) {\r\n // find index of application that needs vehicle data \r\n var applicationIdx = $scope.applications.findIndex(function (item) {\r\n return item.id === dataSet[i].license_request_id;\r\n });\r\n\r\n // If license_request_id is in dictionary, add vehicle data\r\n if (licenseRequestsAndVehicles.hasOwnProperty(dataSet[i].license_request_id)) {\r\n $scope.applications[applicationIdx].vehicle = {};\r\n $scope.applications[applicationIdx].vehicle.vehicle_count = licenseRequestsAndVehicles[dataSet[i].license_request_id];\r\n if (dataSet[i].vehicle_count === 1) {\r\n $scope.applications[applicationIdx].vehicle.call_sign = dataSet[i].call_sign\r\n $scope.applications[applicationIdx].vehicle.serial_number = dataSet[i].serial_number\r\n $scope.applications[applicationIdx].vehicle.unit_number = dataSet[i].vehicle_unit_number\r\n }\r\n }\r\n }\r\n }\r\n $scope.appLoading = false;\r\n });\r\n })(i);\r\n }\r\n }\r\n\r\n $scope.checkAllApplications = function (event, checkAll, applications) {\r\n event.stopImmediatePropagation();\r\n applications.forEach(function (application) {\r\n application.inBulkApply = checkAll;\r\n if (checkAll) {\r\n //Add everything to bulk action if doesn't exist\r\n if (!$scope.bulkActionApplications.includes(application.id)) {\r\n $scope.bulkActionApplications.push(application.id);\r\n }\r\n }\r\n })\r\n if (!checkAll) {\r\n //Clear everything\r\n $scope.bulkActionApplications = [];\r\n }\r\n };\r\n\r\n $scope.applyOne = function (event, application) {\r\n event.stopImmediatePropagation();\r\n if (application.inBulkApply) {\r\n //Add to bulk action list\r\n $scope.bulkActionApplications.push(application.id);\r\n } else {\r\n //Remove from bulk action list\r\n var index = $scope.bulkActionApplications.indexOf(application.id);\r\n $scope.bulkActionApplications.splice(index, 1);\r\n }\r\n };\r\n\r\n $scope.payApplications = function (bulkApply) {\r\n if ($scope.bulkActionApplications.length > 0) {\r\n var applicationIds = $scope.bulkActionApplications.join(\",\");\r\n $scope.bulkActionApplications = [];\r\n bulkApply.isOpen = false;\r\n $window.open($rootScope.portalURL + 'controller.cfm?method=public.reviewApplicationsPayment&bulkActionApplicationIds=' + applicationIds, '_self');\r\n }\r\n else {\r\n alert(\"Please select one or more applications to pay for.\");\r\n }\r\n };\r\n }])\r\n ;\r\n","'use strict';\r\n\r\nangular.module('portal.inspections')\r\n .controller('PortalInspection', ['$scope', 'Cache', '$stateParams', '$element', '$q', '$timeout', '$modal', '$state', '$filter', '$rootScope', 'Documents', 'Session',\r\n function ($scope, Cache, $stateParams, $element, $q, $timeout, $modal, $state, $filter, $rootScope, Documents, Session) {\r\n\r\n $scope.loading = true;\r\n $scope.saving = false;\r\n $scope.notInCache = false;\r\n $scope.inspectionID = $stateParams.id;\r\n $scope.inspection = $stateParams.inspection;\r\n $scope.showSaved = false;\r\n $scope.validationSuccess = false;\r\n $scope.validationMessage = null;\r\n $scope.checklist = {};\r\n $scope.deficiencyScore = { score: 0 };\r\n $scope.deficiencies = {\r\n fail: 0,\r\n pass: 0,\r\n ignore: 0\r\n }\r\n $scope.documents = [];\r\n\r\n $scope.save = function (the_form) {\r\n Session.checkIn();\r\n $scope.saving = true;\r\n $scope.validationMessage = null;\r\n $scope.validationSuccess = false;\r\n $scope.showSaved = false;\r\n $scope.inspection.checklist.isFormValid = $scope.isFormValid(the_form, $scope.inspection, $scope.checklist);\r\n\r\n $scope.saveInspection($scope.inspection, $scope.checklist, $scope.deficiencies).then(function () {\r\n //make the saving spinner stay for a bit, otherwise it's so fast you can't even see it\r\n var saveTimeout = $timeout(function () {\r\n $scope.saving = false;\r\n $scope.showSaved = true;\r\n }, 500);\r\n\r\n if ($scope.inspection.checklist.isFormValid) {\r\n $scope.validationMessage = \"All required information has been supplied\";\r\n $scope.validationSuccess = true;\r\n }\r\n else {\r\n $scope.validationMessage = \"Checklist saved, but required information is missing\";\r\n $scope.validationSuccess = false;\r\n }\r\n\r\n var validationTimeout = $timeout(function () {\r\n $scope.validationMessage = null;\r\n $scope.validationSuccess = false;\r\n $scope.showSaved = false;\r\n }, 3000);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(saveTimeout);\r\n $timeout.cancel(validationTimeout);\r\n });\r\n })\r\n }\r\n\r\n $scope.saveAndExit = function (the_form) {\r\n $scope.saving = true;\r\n $scope.validationMessage = null;\r\n $scope.validationSuccess = false;\r\n $scope.showSaved = false;\r\n $scope.inspection.checklist.isFormValid = $scope.isFormValid(the_form, $scope.inspection, $scope.checklist);\r\n\r\n $scope.saveInspection($scope.inspection, $scope.checklist, $scope.deficiencies).then(function () {\r\n if ($scope.inspection.checklist.isFormValid) {\r\n var timer = $timeout(function () {\r\n $scope.saving = false;\r\n $state.go('portal.menus.inspections');\r\n }, 100);\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n }\r\n else {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n return \"Required fields are missing. Do you still want to leave?\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n var timer = $timeout(function () {\r\n $scope.saving = false;\r\n $state.go('portal.menus.inspections');\r\n }, 100);\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n }\r\n else {\r\n $scope.saving = false;\r\n }\r\n }, function () {\r\n $scope.saving = false;\r\n });\r\n }\r\n });\r\n }\r\n\r\n $scope.saveInspection = function (inspection, checklist, deficiencies) {\r\n var d = $q.defer();\r\n\r\n if (checklist.signature != null) {\r\n inspection.checklist.signature_photo_source = checklist.signature.toDataURL();\r\n }\r\n inspection.checklist.deficiencies_fail = deficiencies.fail;\r\n inspection.checklist.deficiencies_pass = deficiencies.pass;\r\n inspection.checklist.deficiencies_ignore = deficiencies.ignore;\r\n\r\n if ($scope.inspection.checklist.template.require_responsible_party_signoff === true\r\n && ($scope.inspection.checklist.template.virtual_signature === false || ($scope.inspection.checklist.template.virtual_signature === true && $scope.inspection.checklist.signature_type_in_person === true))) {\r\n $scope.inspection.checklist.checklist_signed = true;\r\n }\r\n\r\n if (!$scope.complete() || !$scope.failed()) {\r\n inspection.reinspect = false;\r\n }\r\n if ($scope.complete()) {\r\n inspection.outcome = !$scope.failed();\r\n }\r\n else {\r\n inspection.outcome = null;\r\n }\r\n inspection.inspector_id = $rootScope.userAccount.inspector_id;\r\n inspection.inspector = {\r\n id: $rootScope.userAccount.inspector_id,\r\n name: $rootScope.userAccount.name\r\n }\r\n inspection.submitted = false;\r\n\r\n Cache.save('inspection', inspection).then(function () {\r\n d.resolve();\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.isFormValid = function (the_form, inspection, checklist) {\r\n var valid = the_form.$valid;\r\n\r\n if (valid && inspection.checklist.template.require_responsible_party_signature) {\r\n if (checklist.signature != null && checklist.signature.isEmpty()) {\r\n valid = false;\r\n }\r\n else {\r\n valid = true;\r\n }\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n $scope.complete = function () {\r\n // This hasn't changed with the addition of scoring (170495). We can still use this to determine completeness even if it's being evaluated based on score.\r\n return $scope.deficiencies.fail + $scope.deficiencies.pass + $scope.deficiencies.ignore == $scope.inspection.checklist.template.deficiencies_total;\r\n }\r\n\r\n $scope.failed = function () {\r\n if ($scope.inspection.checklist.template.passing_score_type) {\r\n return $scope.inspection.checklist.template.passing_score > $scope.deficiencyScore.score;\r\n }\r\n else {\r\n return $scope.deficiencies.fail >= $scope.inspection.checklist.template.auto_fail;\r\n }\r\n }\r\n\r\n Cache.get('inspection', $stateParams.id).then(function (inspection) {\r\n if (inspection != null) {\r\n $scope.inspection = inspection;\r\n $scope.deficiencies.fail = inspection.checklist.deficiencies_fail != null ? inspection.checklist.deficiencies_fail : 0;\r\n $scope.deficiencies.pass = inspection.checklist.deficiencies_pass != null ? inspection.checklist.deficiencies_pass : 0;\r\n $scope.deficiencies.ignore = inspection.checklist.deficiencies_ignore != null ? inspection.checklist.deficiencies_ignore : 0;\r\n $scope.passingChecklist = $scope.inspection.checklist.template;\r\n $scope.passingChecklist.inspectionID = $scope.inspectionID;\r\n\r\n if ($scope.inspection.reinspection_date == null) {\r\n $scope.inspection.reinspection_date = new Date();\r\n $scope.inspection.reinspection_date.setHours(0, 0, 0, 0);\r\n if ($scope.inspection.checklist.template.reinspection != null) {\r\n $scope.inspection.reinspection_date.setDate($scope.inspection.reinspection_date.getDate() + $scope.inspection.checklist.template.reinspection);\r\n }\r\n }\r\n\r\n if ($scope.inspection.checklist.template.require_responsible_party_signoff === true && ($scope.inspection.checklist.signature_type_in_person === null || $scope.inspection.checklist.signature_type_in_person === undefined)) {\r\n $scope.inspection.checklist.signature_type_in_person = true;\r\n }\r\n\r\n $scope.loading = false;\r\n }\r\n else {\r\n console.log('Inspection is not in cache');\r\n $scope.loading = false;\r\n $scope.notInCache = true;\r\n }\r\n });\r\n\r\n $scope.resize = function () {\r\n if (document != null && document.querySelector != null) {\r\n $scope.canvas = document.querySelector('canvas.pad');\r\n\r\n if ($scope.canvas != null && $scope.canvas.offsetWidth != null && $scope.canvas.offsetHeight != null && $scope.canvas.getContext != null) {\r\n var ratio = Math.max(window.devicePixelRatio || 1, 1);\r\n $scope.canvas.width = $scope.canvas.offsetWidth * ratio;\r\n $scope.canvas.height = $scope.canvas.offsetHeight * ratio;\r\n $scope.canvas.getContext(\"2d\").scale(ratio, ratio);\r\n }\r\n }\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n // should maybe give this canvas an id\r\n var canvasScope = angular.element(document.querySelector('canvas.pad')).scope();\r\n if (canvasScope) {\r\n canvasScope.$destroy();\r\n }\r\n angular.element(document.querySelector('canvas.pad')).remove();\r\n $scope.canvas = undefined;\r\n canvasScope = undefined;\r\n $scope.inspection = undefined;\r\n if ($scope.checklist.signature) {\r\n $scope.checklist.signature.off();\r\n $scope.checklist.signature = undefined;\r\n }\r\n });\r\n\r\n $scope.clearSignature = function () {\r\n // we need to clear out the values if we select \"virtual\" for signature, but we don't want to clear it out if its already signed\r\n if ($scope.inspection.checklist.signature_type_in_person == false && $scope.inspection.checklist.checklist_signed != true) {\r\n $scope.inspection.checklist.signature_first_name = null;\r\n $scope.inspection.checklist.signature_last_name = null;\r\n $scope.inspection.checklist.signature_certification_number = null;\r\n $scope.inspection.checklist.signature_photo_source = null;\r\n $scope.checklist.signature = null;\r\n }\r\n }\r\n\r\n Documents.getDocumentsByInspection($scope.inspectionID).then(function (documents) {\r\n $scope.documents = documents;\r\n\r\n for (var i = 0; i < $scope.documents.length; i++) {\r\n $scope.documents[i].link = $rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + $scope.documents[i].id.toUpperCase() + '&code=' + $scope.documents[i].code;\r\n }\r\n });\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.inspections')\r\n .controller('PortalInspections', ['$scope', 'IPVisits', 'FBResponses', '$rootScope', 'Resource', 'Cache', '$q', 'IPCheckoutLogs', '$modal', 'IPInspections', '$filter', 'TGTriggers', '$window',\r\n function ($scope, IPVisits, FBResponses, $rootScope, Resource, Cache, $q, IPCheckoutLogs, $modal, IPInspections, $filter, TGTriggers, $window) {\r\n $scope.loading = true;\r\n $scope.submitting = false;\r\n $scope.months = Resource.months();\r\n $scope.listParams = {\r\n currentPage: 0,\r\n numPerPage: 10\r\n }\r\n\r\n IPVisits.getYears().then(function (years) {\r\n $scope.years = years;\r\n });\r\n\r\n $scope.inspectionColumns = [\r\n {\r\n label: $rootScope.enterprise.serviceLabels['SERVICE'] + '/' + $rootScope.enterprise.vehicleLabels['VEHICLE'],\r\n field: 'name',\r\n link: {\r\n state: 'portal.inspection',\r\n params: [\r\n {\r\n name: 'id',\r\n field: 'id'\r\n },\r\n {\r\n name: 'inspection',\r\n field: ''\r\n }\r\n ],\r\n disabled: 'inspectionNotCheckedOut'\r\n },\r\n document: {\r\n id: 'checklist.document.id',\r\n code: 'checklist.document.code',\r\n url: $rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument'\r\n },\r\n info: [\r\n {\r\n label: 'Unit Number',\r\n field: 'vehicle.unit_number'\r\n },\r\n {\r\n label: 'Call Sign',\r\n field: 'vehicle.call_sign'\r\n }\r\n ],\r\n icon: {\r\n field: 'indicator.field', // values include not opened, complete, and incomplete (invalid, required fields not filled out)\r\n title: 'indicator.title',\r\n show: 'indicator.show'\r\n }\r\n },\r\n {\r\n label: 'Number',\r\n field: 'number'\r\n },\r\n {\r\n label: 'Inspector',\r\n field: 'inspector_show'\r\n },\r\n {\r\n label: 'Status',\r\n field: 'status.name'\r\n },\r\n {\r\n label: 'Failures',\r\n field: 'checklist.deficiencies_fail_show',\r\n type: 'deficiency_total'\r\n }\r\n ];\r\n\r\n $scope.canDownload = function (visit) {\r\n var download = false;\r\n\r\n visit.inspections.forEach(function (inspection) {\r\n if ((inspection.inspector_id == $rootScope.userAccount.inspector_id || inspection.inspector_id == null) &&\r\n inspection.checklist != null && inspection.checklist.template != null &&\r\n (inspection.status == null || inspection.status.allow_checkout)) {\r\n download = true;\r\n }\r\n });\r\n\r\n return download;\r\n }\r\n\r\n $scope.getVisits = function (month, year) {\r\n $scope.loading = true;\r\n\r\n if ($rootScope.offline) {\r\n Cache.getAll('visit').then(function (visits) {\r\n if (month == $scope.month && year == $scope.year) {\r\n $scope.visits = $filter('month')($filter('year')(visits, year, 'inspection_date'), month, 'inspection_date');\r\n\r\n // just to get indicators to load properly\r\n if ($scope.visits != null) {\r\n $scope.visits.forEach(function (visit) {\r\n if (visit != null && visit.inspections != null) {\r\n visit.inspections.forEach(function (visitInspection) {\r\n if (visitInspection != null) {\r\n Cache.get('inspection', visitInspection.id).then(function (inspection) {\r\n if (inspection != null && inspection.checklist != null) {\r\n visitInspection.checklist.deficiencies_fail_show = inspection.checklist.deficiencies_fail;\r\n visitInspection.inspector_show = inspection.inspector == null ? null : inspection.inspector.name;\r\n visitInspection.indicator = inspection.checklist.isFormValid == null ? { field: 'empty', title: 'Not Started' } : (inspection.checklist.isFormValid && $scope.deficenciesComplete(inspection.checklist)) ? { field: 'full', title: 'Complete' } : { field: 'half', title: 'Incomplete' };\r\n visitInspection.inspector_show ? visitInspection.indicator.show = true : visitInspection.indicator.show = false;\r\n if (visitInspection.indicator.show) visitInspection.checklist.document = null; // just to get rid of icon\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n $scope.loading = false;\r\n }\r\n });\r\n }\r\n else {\r\n IPVisits.get(true, month, year).then(function (visits) {\r\n if (month == $scope.month && year == $scope.year) {\r\n $scope.visits = visits;\r\n\r\n // need to ensure checked out visits are cached\r\n $scope.visits.forEach(function (visit) {\r\n visit.loading = false;\r\n visit.resetting = false;\r\n visit.downloading = false;\r\n visit.submitting = false;\r\n\r\n if (visit.checked_out) {\r\n visit.loading = true;\r\n\r\n $scope.cacheVisit(visit, false).then(function () {\r\n //if we are downloading an inspection pre cache the form edit pages.\r\n caches.keys().then(function (cachelist) {\r\n cachelist.forEach(function (worker) {\r\n //if we are downloading an inspection pre cache the form edit pages.\r\n caches.open(worker).then(function (cache) {\r\n var url = paths.app + 'inspection/' + visit.id;\r\n fetch(url).then(function (response) {\r\n cache.put(url, response);\r\n })\r\n cache.add(paths.app + 'inspections/components/inspection/inspection.html');\r\n });\r\n });\r\n });\r\n visit.loading = false;\r\n });\r\n }\r\n });\r\n\r\n $scope.loading = false;\r\n }\r\n });\r\n }\r\n }\r\n\r\n $scope.$watch('offline', function (newStatus, oldStatus) {\r\n if (newStatus != oldStatus) {\r\n $scope.getVisits($scope.month, $scope.year);\r\n }\r\n });\r\n\r\n Cache.getState('list').then(function (state) {\r\n if (state != null) {\r\n $scope.sortBy = state.sortBy;\r\n $scope.reverse = state.reverse;\r\n $scope.search = state.search;\r\n $scope.listParams.currentPage = state.currentPage;\r\n $scope.listParams.numPerPage = state.numPerPage;\r\n $scope.status = state.status;\r\n $scope.month = state.month;\r\n $scope.year = state.year;\r\n }\r\n else {\r\n $scope.month = new Date().getMonth();\r\n $scope.year = new Date().getFullYear();\r\n $scope.listParams.currentPage = 0;\r\n $scope.listParams.numPerPage = 10;\r\n }\r\n\r\n $scope.getVisits($scope.month, $scope.year);\r\n });\r\n\r\n $scope.cacheList = function () {\r\n var state = {\r\n sortBy: $scope.sortBy,\r\n reverse: $scope.reverse,\r\n search: $scope.search,\r\n currentPage: $scope.listParams.currentPage,\r\n numPerPage: $scope.listParams.numPerPage,\r\n status: $scope.status,\r\n month: $scope.month,\r\n year: $scope.year\r\n }\r\n\r\n Cache.setState('list', state);\r\n }\r\n\r\n $scope.$watch('search + status + month + year', function (old, newie) {\r\n if (old != newie) {\r\n $scope.listParams.currentPage = 0;\r\n $scope.cacheList();\r\n }\r\n });\r\n\r\n $scope.$watch('listParams.currentPage + listParams.numPerPage + sortBy + reverse', function (old, newie) {\r\n if (old != newie) {\r\n $scope.cacheList();\r\n }\r\n });\r\n\r\n $scope.clear = function () {\r\n $scope.search = '';\r\n $scope.listParams.currentPage = 0;\r\n $scope.status = null;\r\n $scope.cacheList();\r\n }\r\n\r\n $scope.downloadVisit = function (visit) {\r\n visit.loading = true;\r\n visit.downloading = true;\r\n visit.resetting = false;\r\n visit.submitting = false;\r\n\r\n //if we have downloaded inspections pre cache the form edit pages on page load incase they downloaded them from a previous session.\r\n caches.keys().then(function (cachelist) {\r\n cachelist.forEach(function (worker) {\r\n caches.open(worker).then(function (cache) {\r\n var url = paths.app + 'inspection/' + visit.service.id;\r\n fetch(url).then(function (response) {\r\n cache.put(url, response);\r\n })\r\n cache.add(paths.app + 'inspections/components/inspection/inspection.html');\r\n });\r\n });\r\n });\r\n\r\n $scope.cacheVisit(visit, true).then(function () {\r\n IPCheckoutLogs.save({\r\n id: visit.checkout_log_id != null ? visit.checkout_log_id : undefined,\r\n visit_id: visit.id,\r\n inspector_id: $rootScope.userAccount.inspector_id,\r\n checked_out: true\r\n }).then(function (checkoutLog) {\r\n visit.checkout_log_id = checkoutLog.id;\r\n setTimeout(function () {\r\n visit.checked_out = true;\r\n visit.loading = false;\r\n visit.downloading = false;\r\n $scope.$apply();\r\n }, 5000);\r\n });\r\n });\r\n }\r\n\r\n $scope.resetVisit = function (visit) {\r\n visit.loading = true;\r\n visit.resetting = true;\r\n visit.downloading = false;\r\n visit.submitting = false;\r\n\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n return \"This will reset your checklists to the most recently checked in checklist for each inspection. You will lose any changes you have made since your last download. Do you want to continue?\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n $scope.cacheVisit(visit, true).then(function () {\r\n visit.loading = false;\r\n visit.resetting = false;\r\n });\r\n }\r\n else {\r\n visit.loading = false;\r\n visit.resetting = false;\r\n }\r\n }, function () {\r\n visit.loading = false;\r\n visit.resetting = false;\r\n });\r\n }\r\n\r\n $scope.cacheVisit = function (visit, overwrite) {\r\n var d = $q.defer();\r\n\r\n $scope.cacheInspections(visit.inspections, overwrite).then(function (inspectionIDs) {\r\n visit.checkedOutInspectionIDs = inspectionIDs;\r\n\r\n var cachedVisit = angular.copy(visit);\r\n cachedVisit.checked_out = true;\r\n cachedVisit.loading = false;\r\n cachedVisit.resetting = false;\r\n cachedVisit.downloading = false;\r\n cachedVisit.invalidInspections = [];\r\n Cache.save('visit', cachedVisit).then(function () {\r\n d.resolve();\r\n });\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.cacheInspections = function (visitInspections, overwrite) {\r\n var d = $q.defer();\r\n var promises = [];\r\n var inspectionIDs = [];\r\n\r\n $scope.prepareInspections(visitInspections, overwrite).then(function (inspections) {\r\n inspections.forEach(function (inspection) {\r\n inspectionIDs.push(inspection.id);\r\n if (!inspection.cached) {\r\n promises.push(Cache.save('inspection', inspection));\r\n promises.push(TGTriggers.fire('Inspections.PerformingInspections.ChecklistsDownloaded', inspection.id));\r\n }\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n d.resolve(inspectionIDs);\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.prepareInspections = function (visitInspections, overwrite) {\r\n var d = $q.defer();\r\n var promises = [];\r\n var inspections = [];\r\n\r\n visitInspections.forEach(function (visitInspection) {\r\n visitInspection.inspectionNotCheckedOut = true;\r\n if ((visitInspection.inspector_id == $rootScope.userAccount.inspector_id || visitInspection.inspector_id == null) &&\r\n visitInspection.checklist != null && visitInspection.checklist.template != null &&\r\n (visitInspection.status == null || visitInspection.status.allow_checkout)) {\r\n promises.push($scope.prepareInspection(visitInspection, overwrite).then(function (inspection) {\r\n if (inspection != null) {\r\n visitInspection.inspectionNotCheckedOut = false;\r\n inspections.push(inspection);\r\n }\r\n }));\r\n }\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n d.resolve(inspections);\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.prepareInspection = function (visitInspection, overwrite) {\r\n var d = $q.defer();\r\n\r\n if (!overwrite) {\r\n Cache.get('inspection', visitInspection.id).then(function (inspection) {\r\n if (inspection != null && inspection.checklist != null) {\r\n visitInspection.cached = true;\r\n visitInspection.checklist.deficiencies_fail_show = inspection.checklist.deficiencies_fail;\r\n visitInspection.inspector_show = inspection.inspector == null ? null : inspection.inspector.name;\r\n visitInspection.indicator = inspection.checklist.isFormValid == null ? { field: 'empty', title: 'Not Started' } : (inspection.checklist.isFormValid && $scope.deficenciesComplete(inspection.checklist)) ? { field: 'full', title: 'Complete' } : { field: 'half', title: 'Incomplete' };\r\n visitInspection.inspector_show ? visitInspection.indicator.show = true : visitInspection.indicator.show = false;\r\n if (visitInspection.indicator.show) visitInspection.checklist.document = null; // just to get rid of icon\r\n d.resolve(visitInspection);\r\n }\r\n else {\r\n $scope.prepareInspectionResponse(visitInspection).then(function (inspection) {\r\n inspection.cached = false;\r\n visitInspection.checklist.deficiencies_fail_show = inspection.checklist.deficiencies_fail;\r\n visitInspection.inspector_show = inspection.inspector == null ? null : inspection.inspector.name;\r\n visitInspection.indicator = inspection.checklist.isFormValid == null ? { field: 'empty', title: 'Not Started' } : (inspection.checklist.isFormValid && $scope.deficenciesComplete(inspection.checklist)) ? { field: 'full', title: 'Complete' } : { field: 'half', title: 'Incomplete' };\r\n visitInspection.inspector_show ? visitInspection.indicator.show = true : visitInspection.indicator.show = false;\r\n if (visitInspection.indicator.show) visitInspection.checklist.document = null; // just to get rid of icon\r\n d.resolve(inspection);\r\n });\r\n }\r\n });\r\n }\r\n else {\r\n $scope.prepareInspectionResponse(visitInspection).then(function (inspection) {\r\n inspection.cached = false;\r\n visitInspection.checklist.deficiencies_fail_show = inspection.checklist.deficiencies_fail;\r\n visitInspection.inspector_show = inspection.inspector == null ? null : inspection.inspector.name;\r\n visitInspection.indicator = inspection.checklist.isFormValid == null ? { field: 'empty', title: 'Not Started' } : (inspection.checklist.isFormValid && $scope.deficenciesComplete(inspection.checklist)) ? { field: 'full', title: 'Complete' } : { field: 'half', title: 'Incomplete' };\r\n visitInspection.inspector_show ? visitInspection.indicator.show = true : visitInspection.indicator.show = false;\r\n if (visitInspection.indicator.show) visitInspection.checklist.document = null; // just to get rid of icon\r\n d.resolve(inspection);\r\n });\r\n }\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.deficenciesComplete = function (checklist) {\r\n return checklist.template.deficiencies_total == (checklist.deficiencies_fail + checklist.deficiencies_ignore + checklist.deficiencies_pass);\r\n }\r\n\r\n $scope.prepareInspectionResponse = function (visitInspection) {\r\n var d = $q.defer();\r\n\r\n if (visitInspection.checklist.response_id != null) {\r\n FBResponses.getByID(visitInspection.checklist.response_id).then(function (response) {\r\n var inspection = angular.copy(visitInspection);\r\n inspection.checklist.response = response;\r\n d.resolve(inspection);\r\n });\r\n }\r\n else {\r\n FBResponses.save({ Form_ID: visitInspection.checklist.template.form_id }, visitInspection.checklist.id).then(function (response) {\r\n visitInspection.checklist.response_id = response.id;\r\n var inspection = angular.copy(visitInspection);\r\n inspection.checklist.response = response;\r\n d.resolve(inspection);\r\n });\r\n }\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.submitVisit = function (visit) {\r\n visit.loading = true;\r\n visit.resetting = false;\r\n visit.downloading = false;\r\n visit.submitting = true;\r\n visit.uploadStarted = false;\r\n visit.inspectionsCompleted = 1;\r\n visit.submissionChecklistCount = 0;\r\n $scope.submitting = true;\r\n\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n return \"You are about to upload all your inspection checklist data in this visit and will not be able to edit afterward. Do you want to continue?\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n Cache.get('visit', visit.id).then(function (cachedVisit) {\r\n if (cachedVisit != null) {\r\n $scope.handleOverride(cachedVisit).then(function (ignoreInspectionIDs) {\r\n if (ignoreInspectionIDs != null) {\r\n $scope.handleValidation(cachedVisit, ignoreInspectionIDs).then(function (invalidInspections) {\r\n if (invalidInspections != null) {\r\n invalidInspections.forEach(function (invalidInspection) {\r\n cachedVisit.invalidInspections.push(invalidInspection.id);\r\n });\r\n $scope.handleSignature(cachedVisit, ignoreInspectionIDs).then(function (signed) {\r\n if (signed != null) {\r\n cachedVisit.signed = signed;\r\n $scope.handleSubmit(cachedVisit, ignoreInspectionIDs, visit).then(function (success) {\r\n // show success/fail message\r\n visit.loading = false;\r\n visit.submitting = false;\r\n $scope.submitting = false;\r\n visit.uploadStarted = false;\r\n $scope.getVisits($scope.month, $scope.year);\r\n });\r\n }\r\n else {\r\n visit.loading = false;\r\n visit.submitting = false;\r\n $scope.submitting = false;\r\n visit.uploadStarted = false;\r\n }\r\n });\r\n }\r\n else {\r\n visit.loading = false;\r\n visit.submitting = false;\r\n $scope.submitting = false;\r\n visit.uploadStarted = false;\r\n }\r\n });\r\n }\r\n else {\r\n visit.loading = false;\r\n visit.submitting = false;\r\n $scope.submitting = false;\r\n visit.uploadStarted = false;\r\n }\r\n });\r\n }\r\n else {\r\n console.log('Visit is not cached');\r\n visit.loading = false;\r\n visit.submitting = false;\r\n $scope.submitting = false;\r\n visit.uploadStarted = false;\r\n }\r\n });\r\n }\r\n else {\r\n visit.loading = false;\r\n visit.submitting = false;\r\n $scope.submitting = false;\r\n visit.uploadStarted = false;\r\n }\r\n }, function () {\r\n visit.loading = false;\r\n visit.submitting = false;\r\n $scope.submitting = false;\r\n visit.uploadStarted = false;\r\n });\r\n }\r\n\r\n $scope.handleSubmit = function (cachedVisit, ignoreInspectionIDs, visit) {\r\n var d = $q.defer();\r\n\r\n $scope.checkinVisit(cachedVisit, ignoreInspectionIDs, visit).then(function (success) {\r\n if (success) {\r\n IPCheckoutLogs.save({\r\n id: visit.checkout_log_id != null ? visit.checkout_log_id : undefined,\r\n visit_id: visit.id,\r\n inspector_id: $rootScope.userAccount.inspector_id,\r\n checked_out: false\r\n }).then(function (checkoutLog) {\r\n if (checkoutLog != null) {\r\n visit.checkout_log_id = checkoutLog.id;\r\n visit.checked_out = false;\r\n\r\n var promises = [];\r\n\r\n cachedVisit.checkedOutInspectionIDs.forEach(function (inspectionID) {\r\n promises.push(Cache.remove('inspection', inspectionID));\r\n });\r\n\r\n promises.push(Cache.remove('visit', cachedVisit.id));\r\n\r\n $q.all(promises).then(function (arr) {\r\n d.resolve(true);\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n }\r\n else {\r\n console.log('visit unsucessfully checked in');\r\n d.resolve(false);\r\n }\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n }\r\n else {\r\n console.log('visit unsucessfully submitted');\r\n d.resolve(false);\r\n }\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.checkinVisit = function (cachedVisit, ignoreInspectionIDs, visit) {\r\n var d = $q.defer();\r\n var promises = [];\r\n var visitSuccessful = true;\r\n\r\n var allInspectionIDs = cachedVisit.checkedOutInspectionIDs.filter(function (inspectionID) {\r\n return ignoreInspectionIDs.indexOf(inspectionID) == -1;\r\n });\r\n\r\n visit.submissionChecklistCount = allInspectionIDs.length;\r\n\r\n var chunkedInspectionIDs = chunkArray(allInspectionIDs, 2);\r\n chunkedInspectionIDs.sort(function (a, b) {\r\n return a.length - b.length;\r\n });\r\n\r\n /*chunkedInspectionIDs.forEach(function (inspectionIDs) {\r\n promises.push($scope.checkinInspections(inspectionIDs, cachedVisit).then(function (success) {\r\n $scope.$evalAsync(function () {\r\n visit.inspectionsCompleted += inspectionIDs.length;\r\n });\r\n visitSuccessful = visitSuccessful && success;\r\n }));\r\n })\r\n \r\n $q.all(promises).then(function () {\r\n d.resolve(visitSuccessful);\r\n });*/\r\n\r\n // This code is an alternative to the chunkedInspectionIDs.forEach bit - rather than firing off all inspections at the same time, it will process the chunks of inspections sequentially, waiting for each promise to complete before firing off the next one\r\n visit.uploadStarted = true;\r\n\r\n var promise = chunkedInspectionIDs.reduce(\r\n function reducer(promiseChain, value) {\r\n return promiseChain.then(function (result) {\r\n return $scope.checkinInspections(value, cachedVisit).then(function (success) {\r\n $scope.$evalAsync(function () {\r\n visit.inspectionsCompleted += value.length;\r\n })\r\n visitSuccessful = visitSuccessful && success;\r\n });\r\n })\r\n },\r\n promiseFunc()\r\n );\r\n\r\n promise.then(function () {\r\n d.resolve(visitSuccessful);\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n var promiseFunc = function () {\r\n var p = $q.defer();\r\n\r\n $scope.$evalAsync(function () {\r\n p.resolve();\r\n });\r\n\r\n return p.promise;\r\n }\r\n\r\n $scope.checkinInspection = function (inspectionID, cachedVisit) {\r\n var d = $q.defer();\r\n\r\n Cache.get('inspection', inspectionID).then(function (cachedInspection) {\r\n if (cachedInspection != null) {\r\n if (cachedInspection.inspector_id == $rootScope.userAccount.inspector_id\r\n && !(cachedInspection.checklist.template.require_signature && !cachedVisit.signed)\r\n && (cachedVisit.invalidInspections.indexOf(inspectionID) == -1)) {\r\n IPInspections.submit(cachedInspection, true).then(function (success) {\r\n d.resolve(success);\r\n });\r\n }\r\n else {\r\n console.log('Ignore inspection');\r\n d.resolve(true);\r\n }\r\n }\r\n else {\r\n console.log('Inspection not in cache');\r\n d.resolve(true);\r\n }\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.checkinInspections = function (inspectionIDs, cachedVisit) {\r\n var d = $q.defer();;\r\n\r\n var promises = [];\r\n var cachedInspections = [];\r\n\r\n // get all of our inspections\r\n inspectionIDs.forEach(function (inspectionID) {\r\n promises.push(Cache.get('inspection', inspectionID).then(function (cachedInspection) {\r\n if (cachedInspection != null) {\r\n if (cachedInspection.inspector_id == $rootScope.userAccount.inspector_id\r\n && !(cachedInspection.checklist.template.require_signature && !cachedVisit.signed)\r\n && !(cachedInspection.submitted !== undefined && cachedInspection.submitted == true)\r\n && (cachedVisit.invalidInspections.indexOf(inspectionID) == -1)) {\r\n cachedInspections.push(cachedInspection);\r\n }\r\n else {\r\n console.log('Ignore inspection');\r\n }\r\n }\r\n else {\r\n console.log('Inspection not in cache');\r\n }\r\n }));\r\n });\r\n\r\n $q.all(promises).then(function (result) {\r\n var cachedInspectionsCopy = angular.copy(cachedInspections);\r\n IPInspections.submitBatch(cachedInspections, true).then(function (success) {\r\n // update the cached inspection with a flag indicating it finished uploading\r\n var updatePromises = [];\r\n cachedInspections = null;\r\n cachedInspectionsCopy.forEach(function (cachedInspection) {\r\n if (cachedInspection != null) {\r\n cachedInspection.submitted = true;\r\n promises.push(Cache.save('inspection', cachedInspection));\r\n }\r\n });\r\n $q.all(updatePromises).then(function (result) {\r\n cachedInspectionsCopy = [];\r\n d.resolve(success);\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n });\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.handleSignature = function (cachedVisit, ignoreInspectionIDs) {\r\n var d = $q.defer();\r\n\r\n $scope.getSignatureArray(cachedVisit, ignoreInspectionIDs).then(function (signatures) {\r\n if (signatures != null && signatures.length > 0) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: paths.app + 'inspections/components/signature-modal/signature-modal.html',\r\n controller: 'PortalInspectionsSignatureModal',\r\n resolve: {\r\n inspections: function () {\r\n return signatures;\r\n }\r\n }\r\n }).result.then(function (result) {\r\n d.resolve(result);\r\n }, function () {\r\n d.resolve(null);\r\n });\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.getSignatureArray = function (cachedVisit, ignoreInspectionIDs) {\r\n var d = $q.defer();\r\n var promises = [];\r\n var signatures = [];\r\n\r\n cachedVisit.checkedOutInspectionIDs.forEach(function (inspectionID) {\r\n if (ignoreInspectionIDs.indexOf(inspectionID) == -1) {\r\n promises.push(Cache.get('inspection', inspectionID).then(function (cachedInspection) {\r\n if (cachedInspection != null) {\r\n if (cachedInspection.checklist.template.require_signature && cachedInspection.inspector_id == $rootScope.userAccount.inspector_id) {\r\n signatures.push(cachedInspection);\r\n }\r\n }\r\n else {\r\n console.log('Inspection not in cache');\r\n }\r\n }));\r\n }\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n d.resolve(signatures);\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.handleValidation = function (cachedVisit, ignoreInspectionIDs) {\r\n var d = $q.defer();\r\n\r\n $scope.validateVisit(cachedVisit, ignoreInspectionIDs).then(function (invalidInspections) {\r\n if (invalidInspections != null && invalidInspections.length > 0) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: paths.app + 'inspections/components/invalid-modal/invalid-modal.html',\r\n controller: 'PortalInspectionsInvalidModal',\r\n resolve: {\r\n inspections: function () {\r\n return invalidInspections;\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result == true) {\r\n d.resolve(invalidInspections);\r\n }\r\n else {\r\n d.resolve(null);\r\n };\r\n }, function () { d.resolve(null); });\r\n }\r\n else {\r\n d.resolve(invalidInspections);\r\n }\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.validateVisit = function (cachedVisit, ignoreInspectionIDs) {\r\n var d = $q.defer();\r\n var promises = [];\r\n var invalidInspections = [];\r\n\r\n cachedVisit.checkedOutInspectionIDs.forEach(function (inspectionID) {\r\n if (ignoreInspectionIDs.indexOf(inspectionID) == -1) {\r\n promises.push(Cache.get('inspection', inspectionID).then(function (cachedInspection) {\r\n if (cachedInspection != null) {\r\n if (cachedInspection.inspector_id == $rootScope.userAccount.inspector_id) {\r\n if (!cachedInspection.checklist.isFormValid) {\r\n invalidInspections.push(cachedInspection);\r\n }\r\n }\r\n }\r\n else {\r\n console.log('Inspection not in cache');\r\n }\r\n }));\r\n }\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n d.resolve(invalidInspections);\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.handleOverride = function (cachedVisit) {\r\n var d = $q.defer();\r\n var ignoreInspectionIDs = [];\r\n\r\n $scope.getOverrideArray(cachedVisit).then(function (overrides) {\r\n if (overrides != null && overrides.length > 0) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: paths.app + 'inspections/components/override-modal/override-modal.html',\r\n controller: 'PortalInspectionsOverrideModal',\r\n resolve: {\r\n inspections: function () {\r\n return overrides;\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n overrides.forEach(function (inspection) {\r\n ignoreInspectionIDs.push(inspection.id);\r\n });\r\n\r\n d.resolve(ignoreInspectionIDs);\r\n }\r\n else {\r\n d.resolve(null);\r\n }\r\n }, function () {\r\n d.resolve(null);\r\n });\r\n }\r\n else {\r\n d.resolve(ignoreInspectionIDs);\r\n }\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.getOverrideArray = function (cachedVisit) {\r\n var d = $q.defer();\r\n var promises = [];\r\n var overrides = [];\r\n\r\n cachedVisit.checkedOutInspectionIDs.forEach(function (inspectionID) {\r\n promises.push($scope.checkOverride(inspectionID).then(function (inspection) {\r\n if (inspection != null) {\r\n overrides.push(inspection);\r\n }\r\n }));\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n d.resolve(overrides);\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.checkOverride = function (inspectionID) {\r\n var d = $q.defer();\r\n\r\n Cache.get('inspection', inspectionID).then(function (cachedInspection) {\r\n if (cachedInspection != null) {\r\n if (cachedInspection.inspector_id == $rootScope.userAccount.inspector_id) {\r\n IPInspections.getByID(inspectionID, true).then(function (inspection) {\r\n if (inspection != null && inspection.inspector_id != $rootScope.userAccount.inspector_id && inspection.inspector_id != null && (inspection.submitted === undefined || inspection.submitted == true)) {\r\n d.resolve(inspection);\r\n }\r\n else {\r\n d.resolve(null);\r\n }\r\n });\r\n }\r\n else {\r\n d.resolve(null);\r\n }\r\n }\r\n else {\r\n d.resolve(null);\r\n console.log('Inspection not in cache');\r\n }\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n $window.onbeforeunload = function (e) {\r\n if ($scope.submitting) {\r\n e.returnValue = \"Please do not leave this page. If you do, you will lose your progress uploading your visit. Are you sure you want to leave?\";\r\n return \"Please do not leave this page. If you do, you will lose your progress uploading your visit. Are you sure you want to leave?\";\r\n }\r\n };\r\n $scope.$on('$stateChangeStart', function (event, next, current) {\r\n if ($scope.submitting) {\r\n if (!confirm(\"Please do not leave this page. If you do, you will lose your progress uploading your visit. Are you sure you want to leave?\")) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n $scope.$on('$destroy', function () {\r\n $window.onbeforeunload = undefined;\r\n });\r\n }]);","'use strict';\r\n\r\nangular.module('portal.inspections')\r\n .controller('PortalInspectionsInvalidModal', ['$scope', '$modalInstance', 'inspections', function ($scope, $modalInstance, inspections) {\r\n\r\n $scope.inspections = inspections;\r\n\r\n $scope.yes = function () {\r\n $modalInstance.close(true);\r\n }\r\n\r\n $scope.no = function () {\r\n $modalInstance.close(false);\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n });\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.inspections')\r\n .controller('PortalInspectionsOverrideModal', ['$scope', '$modalInstance', 'inspections', function ($scope, $modalInstance, inspections) {\r\n\r\n $scope.inspections = inspections;\r\n\r\n $scope.yes = function () {\r\n $modalInstance.close(true);\r\n }\r\n\r\n $scope.no = function () {\r\n $modalInstance.close(false);\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n });\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.inspections')\r\n .controller('PortalInspectionsSignatureModal', ['$scope', '$rootScope', '$modalInstance', 'inspections', '$modal', 'Account', function ($scope, $rootScope, $modalInstance, inspections, $modal, Account) {\r\n\r\n $scope.inspections = inspections;\r\n $scope.credentials = {};\r\n $scope.continuing = false;\r\n $scope.disregarding = false;\r\n $scope.invalid = false;\r\n\r\n $scope.save = function () {\r\n $scope.continuing = true;\r\n $scope.invalid = false;\r\n\r\n Account.validate($scope.credentials.password, $rootScope.userAccount.user_name).then(function (data) {\r\n $scope.continuing = false;\r\n\r\n if (data != null) {\r\n if (data.valid) {\r\n $scope.invalid = false;\r\n $modalInstance.close(true);\r\n }\r\n else {\r\n $scope.invalid = true;\r\n }\r\n }\r\n else {\r\n $scope.invalid = true;\r\n }\r\n });\r\n }\r\n\r\n $scope.disregard = function () {\r\n $scope.disregarding = true;\r\n\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n return \"You are about to diregard and lose the data for the checklists listed below that require a signature. All other inspections in the visit will be checked in.\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n $modalInstance.close(false);\r\n }\r\n else {\r\n $scope.disregarding = false;\r\n }\r\n }, function () {\r\n $scope.disregarding = false;\r\n });\r\n }\r\n\r\n $scope.close = function () {\r\n $modalInstance.dismiss('cancel');\r\n $scope.$destroy();\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n });\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.linkpage')\r\n .controller('LinkPage', ['$scope', '$state', '$stateParams', 'EnterpriseLinkService', '$sce', function ($scope, $state, $stateParams, EnterpriseLinkService, $sce) {\r\n EnterpriseLinkService.getLink($stateParams.id).then(function (link) {\r\n if ((link !== undefined || link != null) && typeof (link.page_content) == \"string\") {\r\n link.page_content = $sce.trustAsHtml(link.page_content);\r\n }\r\n $scope.link = link;\r\n });\r\n }]);","'use strict';\r\n\r\nangular.module('portal.login')\r\n .controller('CreateAccount', ['$scope', '$state', '$stateParams', '$rootScope', '$window', 'EntityEnterpriseFields', 'Users', 'Enterprise', 'IntegrationMethods', 'Countries', 'EnterpriseLoginCriteria', 'Authentication', 'Account', function ($scope, $state, $stateParams, $rootScope, $window, EntityEnterpriseFields, Users, Enterprise, IntegrationMethods, Countries, EnterpriseLoginCriteria, Authentication, Account) {\r\n\r\n $scope.loading = true;\r\n $scope.saving = false;\r\n $scope.lookup = false;\r\n $scope.showEliteLookup = false;\r\n $scope.looking_up = false;\r\n $scope.promises = [];\r\n $scope.USDefault = '';\r\n //Autofilling the existing user info when coming from SSO\r\n $scope.autofill = $stateParams.autofill == \"true\" || false;\r\n\r\n // Finds US's id to default to US\r\n Countries.get().then(function (countries) {\r\n angular.forEach(countries, function (c) {\r\n if (c.name == 'United States') {\r\n $scope.USDefault = c.id;\r\n }\r\n });\r\n });\r\n\r\n $scope.entity_categories = {\r\n\r\n };\r\n $scope.parameters = {\r\n enterpriseID: $rootScope.enterpriseID\r\n };\r\n $scope.fieldsByCode = {};\r\n $scope.failedMessages = [];\r\n\r\n $scope.user_public_addresses = $rootScope.enterprise.settings.user_public_addresses;\r\n\r\n $scope.eliteSignature = {\r\n username: null,\r\n pass: null\r\n }\r\n\r\n \r\n $scope.user = {};\r\n if ($scope.autofill) {\r\n //Fill in existing values so the SSO user can \"finish\" creating their account.\r\n //Have to authenticate first because coming from net won't have portalAuthorizationData set.\r\n $scope.failedMessages = [\"Please enter in any missing information and finish creating your account.\"];\r\n Authentication.authenticate(true).then(function (authData) {\r\n if (authData) {\r\n Account.get({ portal: true }).then(function (account) {\r\n if (account) {\r\n $rootScope.userAccount = account;\r\n $rootScope.$broadcast('AuthenticationFromSSO:finish');\r\n\r\n Users.getByID($rootScope.userAccount.id, false, true).then(function (user) {\r\n //Users created through SSO won't have much info, so just filling in most of the core record values\r\n if (!user.public_address) { user.public_address = {} }\r\n if (!user.primary_address) { user.primary_address = {} }\r\n if (user.email) { user.verify_email = user.email }\r\n $scope.user = user;\r\n });\r\n }\r\n else {\r\n // Get a new, empty user\r\n Users.getNewUser().then(function (user) { $scope.user = user; });\r\n }\r\n });\r\n }\r\n else {\r\n // Get a new, empty user\r\n Users.getNewUser().then(function (user) { $scope.user = user; });\r\n }\r\n });\r\n }\r\n else {\r\n // Get a new, empty user\r\n Users.getNewUser().then(function (user) { $scope.user = user; });\r\n }\r\n\r\n $scope.enterprise = {};\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n if ($scope.enterprise.ssn_generation_type == \"Masked\") {\r\n $scope.user.ssn_dec = \"•••-••-\";\r\n $scope.user.verify_ssn = \"•••-••-\";\r\n }\r\n } else {\r\n Enterprise.get({ enterpriseID: $rootScope.enterpriseID }).then(function (result) {\r\n $scope.enterprise = result;\r\n if ($scope.enterprise.ssn_generation_type == \"Masked\") {\r\n $scope.user.ssn_dec = \"•••-••-\";\r\n $scope.user.verify_ssn = \"•••-••-\";\r\n }\r\n });\r\n }\r\n\r\n //recaptcha vars\r\n $scope.recaptchaMessage = $scope.enterprise.recaptcha_site_key_v3 != null ? \"\" : \"There was an issue loading recaptcha, please try again or contact system administrator.\"; //message to display\r\n\r\n $scope.isSsnMasked = function () {\r\n return $scope.enterprise.ssn_generation_type == \"Masked\";\r\n\r\n }\r\n\r\n // See if the Elite Lookup button should show\r\n IntegrationMethods.get({ forEliteLookup: true, enterpriseID: $rootScope.enterpriseID }).then(function (results) {\r\n if (results != null && results.length) {\r\n $scope.showEliteLookup = true;\r\n }\r\n });\r\n\r\n\r\n // Get the entity fields\r\n EntityEnterpriseFields.get({ category: \"CreateAccount\", enterpriseID: $rootScope.enterpriseID }).then(function (results) {\r\n if (results != null) {\r\n $scope.entity_categories = results;\r\n angular.forEach($scope.entity_categories, function (c) {\r\n angular.forEach(c.fields, function (field) {\r\n if (field.json != null && $scope.user[field.json] === undefined) {\r\n $scope.user[field.json] = null;\r\n }\r\n // Don't include the user_name field on the page if it's supposed to be auto-generated\r\n if (field.alias == 'user_name' && $scope.enterprise.user_name_generation_type != \"None\") {\r\n field.visible = false;\r\n }\r\n if (field.alias == 'address') {\r\n field.label == null ? $scope.addressLabel = field.name : $scope.addressLabel = field.label;\r\n }\r\n if (field.alias == 'public_address') {\r\n field.label == null ? $scope.publicAddressLabel = field.name : $scope.publicAddressLabel = field.label;\r\n }\r\n \r\n field.autoComplete = \"off\";\r\n switch (field.question_type_code) {\r\n case \"date\":\r\n case \"phone\":\r\n case \"text\":\r\n field.autoComplete = fillAutoCompleteForFields(field);\r\n break;\r\n case \"email\":\r\n field.autoComplete = 'email';\r\n case \"postal_code\":\r\n default:\r\n break;\r\n }\r\n $scope.fieldsByCode[field.alias] = field;\r\n\r\n });\r\n });\r\n $scope.global_id = guid();\r\n $scope.loading = false;\r\n }\r\n });\r\n\r\n // Get the Elite Integration Method\r\n\r\n $scope.setupAddress = function (field) {\r\n var address = {\r\n country_id: null,\r\n street_1: null,\r\n street_2: null,\r\n postal_code: null,\r\n municipality: null,\r\n county: null,\r\n region_id: null\r\n };\r\n // we need to track the two addresses for the \"same as primary\" functionality\r\n if (field.alias == 'address' && ($scope.user.primary_address === undefined || $scope.user.primary_address == null)) {\r\n $scope.user.primary_address = address;\r\n } else if (field.alias == 'public_address' && ($scope.user.public_address === undefined || $scope.user.public_address == null)) {\r\n address.same_as_primary = false;\r\n $scope.user.public_address = address;\r\n }\r\n }\r\n\r\n $scope.$watch('user.primary_address', function (newValue, oldValue) {\r\n if ($scope.user.public_address && $scope.user.public_address.same_as_primary && newValue !== oldValue) {\r\n $scope.copyAddress($scope.user.public_address, $scope.user.primary_address);\r\n }\r\n }, true);\r\n $scope.$watch('user.public_address.same_as_primary', function (newValue, oldValue) {\r\n if (newValue !== oldValue && newValue) {\r\n $scope.copyAddress($scope.user.public_address, $scope.user.primary_address);\r\n }\r\n });\r\n\r\n $scope.showAddress = function (field) {\r\n return ((field.alias == 'address') || (field.alias == 'public_address' && $scope.user_public_addresses && !$scope.user.public_address.same_as_primary));\r\n }\r\n\r\n $scope.showSameAsAddress = function () {\r\n return ($scope.fieldsByCode.address !== undefined && $scope.fieldsByCode.public_address !== undefined && $scope.user_public_addresses);\r\n }\r\n\r\n $scope.copyAddress = function (addr1, addr2) {\r\n addr1.country_id = addr2.country_id;\r\n addr1.street_1 = addr2.street_1;\r\n addr1.street_2 = addr2.street_2;\r\n addr1.postal_code = addr2.postal_code;\r\n addr1.municipality = addr2.municipality;\r\n addr1.county = addr2.county;\r\n addr1.region_id = addr2.region_id;\r\n }\r\n\r\n $scope.$watch('user.email', function (newValue, oldValue) {\r\n if ($scope.user.public_email_same_as_primary && newValue !== oldValue) {\r\n $scope.user.public_email = $scope.user.email;\r\n }\r\n }, true);\r\n $scope.$watch('user.public_email_same_as_primary', function (newValue, oldValue) {\r\n if (newValue !== oldValue && newValue) {\r\n $scope.user.public_email = $scope.user.email;\r\n }\r\n });\r\n $scope.showEmail = function (field) {\r\n return ((field.alias == 'email') || (field.alias == 'public_email' && !$scope.user.public_email_same_as_primary));\r\n }\r\n\r\n // ========================== //\r\n // Elite account import stuff //\r\n // ========================== //\r\n\r\n $scope.toggleLookup = function () {\r\n $scope.lookup = !$scope.lookup;\r\n }\r\n\r\n $scope.getEliteData = function () {\r\n $scope.failedMessages = [];\r\n if ($scope.eliteSignature.username == null || $scope.eliteSignature.username == \"\" || $scope.eliteSignature.pass == null || $scope.eliteSignature.pass == \"\") {\r\n $scope.failedMessages = [\"Please provide both your username and password\"];\r\n } else {\r\n $scope.looking_up = true;\r\n Users.eliteLookup($scope.eliteSignature).then(function (result) {\r\n if (result != null) {\r\n if (result.error_message != null) {\r\n $scope.failedMessages = [result.error_message];\r\n } else if (result.global_id != null) {\r\n $scope.user = result;\r\n $scope.lookup = false;\r\n }\r\n }\r\n $scope.looking_up = false;\r\n });\r\n }\r\n }\r\n\r\n // Save\r\n $scope.save = function () {\r\n var failed = false;\r\n $scope.saving = true;\r\n $scope.failedMessages = [];\r\n $scope.validationMessages = [];\r\n\r\n // Check that any \"verify\" fields check out\r\n if ($scope.user.ssn_dec !== undefined && $scope.user.ssn_dec != null && $scope.user.ssn_dec.length > 0) {\r\n if ($scope.fieldsByCode.verify_ssn !== undefined) {\r\n if ($scope.fieldsByCode.verify_ssn.validation === undefined || $scope.fieldsByCode.verify_ssn.validation == null) {\r\n $scope.fieldsByCode.verify_ssn.validation = {};\r\n }\r\n if ($scope.user.verify_ssn === undefined || $scope.user.verify_ssn != $scope.user.ssn_dec) {\r\n failed = true;\r\n $scope.fieldsByCode.verify_ssn.validation.customFunctionFailed = true;\r\n $scope.fieldsByCode.verify_ssn.validation.customFunctionMessage = \"Social Security Numbers must match!\";\r\n $scope.validationMessages.push(\"verify_ssn\");\r\n } else {\r\n $scope.fieldsByCode.verify_ssn.validation.customFunctionFailed = false;\r\n }\r\n }\r\n }\r\n if ($scope.user.email !== undefined && $scope.user.email != null && $scope.user.email.length > 0) {\r\n if ($scope.fieldsByCode.verify_email !== undefined) {\r\n if ($scope.fieldsByCode.verify_email.validation === undefined || $scope.fieldsByCode.verify_email.validation == null) {\r\n $scope.fieldsByCode.verify_email.validation = {};\r\n }\r\n if ($scope.user.verify_email === undefined || $scope.user.verify_email != $scope.user.email) {\r\n failed = true;\r\n $scope.fieldsByCode.verify_email.validation.customFunctionFailed = true;\r\n $scope.fieldsByCode.verify_email.validation.customFunctionMessage = \"Emails must match!\";\r\n $scope.validationMessages.push(\"verify_email\");\r\n } else {\r\n $scope.fieldsByCode.verify_email.validation.customFunctionFailed = false;\r\n }\r\n }\r\n }\r\n if ($scope.user.birth_date) {\r\n if (!$scope.fieldsByCode.birth_date.validation) {\r\n $scope.fieldsByCode.birth_date.validation = {};\r\n }\r\n var today = new Date();\r\n var age = today.getFullYear() - $scope.user.birth_date.getFullYear();\r\n var month = today.getMonth() - $scope.user.birth_date.getMonth();\r\n if (month < 0 || (month === 0 && today.getDate() < $scope.user.birth_date.getDate())) {\r\n age--;\r\n }\r\n if (age < 10) {\r\n failed = true;\r\n $scope.fieldsByCode.birth_date.validation.customFunctionFailed = true;\r\n $scope.fieldsByCode.birth_date.validation.customFunctionMessage = \"Invalid \" + ($scope.fieldsByCode.birth_date.label || $scope.fieldsByCode.birth_date.name);\r\n $scope.validationMessages.push(\"birth_date\");\r\n } else {\r\n $scope.fieldsByCode.birth_date.validation.customFunctionFailed = false;\r\n }\r\n }\r\n \r\n //Validate EMS ID length\r\n if ($scope.user.National_EMS_ID) {\r\n if (!$scope.fieldsByCode.National_EMS_ID.validation) {\r\n $scope.fieldsByCode.National_EMS_ID.validation = {};\r\n }\r\n // Require it to be full length (set in db) and digits only\r\n if ($scope.user.National_EMS_ID.length != $scope.fieldsByCode.National_EMS_ID.max_length || !(/^\\d+$/.test($scope.user.National_EMS_ID))) {\r\n failed = true;\r\n $scope.fieldsByCode.National_EMS_ID.validation.customFunctionFailed = true;\r\n $scope.fieldsByCode.National_EMS_ID.validation.customFunctionMessage = \"Invalid \" + ($scope.fieldsByCode.National_EMS_ID.label || $scope.fieldsByCode.National_EMS_ID.name);\r\n $scope.validationMessages.push(\"National_EMS_ID\");\r\n }\r\n else {\r\n $scope.fieldsByCode.National_EMS_ID.validation.customFunctionFailed = false;\r\n }\r\n }\r\n\r\n // Anti XSS Validation\r\n for (var code in $scope.fieldsByCode) {\r\n var field = $scope.fieldsByCode[code];\r\n var value = $scope.user[field.json];\r\n // If a text field is filled, validate it\r\n if (value) {\r\n if (field.question_type_code === \"text\") {\r\n // Validate the string\r\n if (!$rootScope.isStringSafe(value)) {\r\n // Block submission\r\n failed = true;\r\n // Show error message under field\r\n if (!$scope.fieldsByCode[code].validation) {\r\n $scope.fieldsByCode[code].validation = {};\r\n }\r\n $scope.fieldsByCode[code].validation.customFunctionFailed = true;\r\n $scope.fieldsByCode[code].validation.customFunctionMessage = \"Invalid \" + field.label;\r\n // Show validation error at top of form\r\n $scope.validationMessages.push(field.alias);\r\n }\r\n } //Special case for addresses\r\n else if (field.alias === \"address\" || (field.alias === \"public_address\" && !$scope.user.public_address.same_as_primary)) {\r\n // Setup validation result data\r\n if (!$scope.fieldsByCode[code].addressValidation) {\r\n $scope.fieldsByCode[code].addressValidation = {\r\n street_1: {},\r\n street_2: {},\r\n postal_code: {},\r\n municipality: {},\r\n county: {}\r\n };\r\n }\r\n\r\n // Validate street 1\r\n if (value.street_1) {\r\n if (!$rootScope.isStringSafe(value.street_1)) {\r\n failed = true;\r\n $scope.fieldsByCode[code].addressValidation.street_1.customFunctionFailed = true;\r\n $scope.fieldsByCode[code].addressValidation.street_1.customFunctionMessage = \"Invalid Address\";\r\n $scope.validationMessages.push(field.name + \"_line1\");\r\n }\r\n }\r\n // Validate street 2\r\n if (value.street_2) {\r\n if (!$rootScope.isStringSafe(value.street_2)) {\r\n failed = true;\r\n $scope.fieldsByCode[code].addressValidation.street_2.customFunctionFailed = true;\r\n $scope.fieldsByCode[code].addressValidation.street_2.customFunctionMessage = \"Invalid Address\";\r\n // This is also listed as Address, avoid listing field twice\r\n if (!$scope.validationMessages.includes(field.name + \"_line2\")) {\r\n $scope.validationMessages.push(field.name + \"_line2\");\r\n }\r\n }\r\n }\r\n // Validate postal code\r\n if (value.postal_code) {\r\n if (!$rootScope.isStringSafe(value.postal_code)) {\r\n failed = true;\r\n $scope.fieldsByCode[code].addressValidation.postal_code.customFunctionFailed = true;\r\n $scope.fieldsByCode[code].addressValidation.postal_code.customFunctionMessage = \"Invalid Postal Code\";\r\n $scope.validationMessages.push(field.name + \"_zip\");\r\n }\r\n }\r\n // Validate city, mainly applicable to International\r\n if(value.municipality) {\r\n if (!$rootScope.isStringSafe(value.municipality)) {\r\n failed = true;\r\n $scope.fieldsByCode[code].addressValidation.municipality.customFunctionFailed = true;\r\n $scope.fieldsByCode[code].addressValidation.municipality.customFunctionMessage = \"Invalid City\";\r\n $scope.validationMessages.push(field.name + \"_city\");\r\n }\r\n }\r\n // Validate county, mainly applicable to International\r\n if(value.county) {\r\n if (!$rootScope.isStringSafe(value.county)) {\r\n failed = true;\r\n $scope.fieldsByCode[code].addressValidation.county.customFunctionFailed = true;\r\n $scope.fieldsByCode[code].addressValidation.county.customFunctionMessage = \"Invalid County\";\r\n $scope.validationMessages.push(field.name + \"_county\");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Get Login Criteria\r\n EnterpriseLoginCriteria.get($scope.parameters).then(function (results) {\r\n if (results != null) {\r\n $scope.login_criteria = results;\r\n }\r\n });\r\n\r\n // Save user\r\n if (!failed) {\r\n if (!$scope.autofill) {\r\n delete $scope.user.id;\r\n }\r\n Users.save($scope.user, $rootScope.enterpriseID).then(function (result) {\r\n if (result != null) {\r\n if (result.message != undefined && result.message.length > 0) {\r\n if (result.method != undefined && result.method.length > 0) {\r\n if (result.method === \"warnOnly\") {\r\n if ($scope.autofill) {\r\n $state.go('portal.menus.accountDashboard', { messages: [result.message], keepMessages: true });\r\n }\r\n else {\r\n $state.go('portal.menus.login', { messages: [result.message, $scope.login_criteria.account_creation_alert_message], keepMessages: true });\r\n }\r\n }\r\n }\r\n else {\r\n // Creation failed for a definite reason (usually duplicate email or username). Should get a message back, and the relevant field to show the error message on.\r\n failed = true;\r\n if (result.field != undefined && result.field.length > 0) {\r\n if ($scope.fieldsByCode[result.field].validation === undefined || $scope.fieldsByCode[result.field].validation == null) {\r\n $scope.fieldsByCode[result.field].validation = {};\r\n }\r\n $scope.fieldsByCode[result.field].validation.customFunctionFailed = true;\r\n $scope.fieldsByCode[result.field].validation.customFunctionMessage = result.message;\r\n $scope.failedMessages.push(result.message);\r\n $window.scrollTo(0, 0);\r\n }\r\n else {\r\n // if no field, just display the message at the top of the screen\r\n $scope.failedMessages.push(result.message);\r\n $window.scrollTo(0, 0);\r\n }\r\n }\r\n } else if (result.id !== undefined) {\r\n // User object returned\r\n if ($scope.autofill) {\r\n $state.go('portal.menus.accountDashboard', {});\r\n }\r\n else {\r\n $state.go('portal.menus.login', { messages: [$scope.login_criteria.account_creation_alert_message], keepMessages: true });\r\n }\r\n }\r\n }\r\n else {\r\n // Something errored\r\n $scope.failedMessages.push(\"There was an error creating your account. Please ensure you have entered all information correctly. If this problem persists, please contact your system administrator.\");\r\n $window.scrollTo(0, 0);\r\n }\r\n $scope.saving = false;\r\n });\r\n } else {\r\n $scope.saving = false;\r\n $window.scrollTo(0, 0);\r\n }\r\n }\r\n\r\n $scope.recaptchaSubmit = function () {\r\n $scope.saving = true; //if there is a loading type var for display\r\n if ($scope.enterprise.recaptcha_enabled) {\r\n if ($scope.enterprise.recaptcha_site_key_v3 != null) {\r\n grecaptcha.ready(function () {\r\n try {\r\n grecaptcha.execute($scope.enterprise.recaptcha_site_key_v3, { action: 'publicCreateAccount' }).then(function (token) { //execute returns a token\r\n return Enterprise.getRecaptchaResponse(\"publicCreateAccount\", token) // send action, token, score to pass over to server for validation, returns a response object\r\n }).then(function (response) { // take the response and update variables\r\n if (response.success == false) {\r\n $scope.recaptchaMessage = 'Recaptcha Error: ' + response.error;\r\n $scope.saving = false; //if there is a loading type var for display\r\n } else {\r\n $scope.recaptchaMessage = \"\";\r\n };\r\n }).then(function () {\r\n if ($scope.recaptchaMessage == \"\") {\r\n $scope.save(); //put function here if passed to continue normal \"submit\" is recaptcha passed\r\n } else {\r\n $scope.$apply(); //update dom so error message displays if recaptcha failed\r\n };\r\n })\r\n } catch (error) {\r\n $scope.recaptchaMessage = \"There was an issue loading recaptcha, please try again or contact system administrator.\";\r\n $scope.saving = false; //if there is a loading type var for display\r\n }\r\n });\r\n } else {\r\n return;\r\n }\r\n } else {\r\n $scope.save(); //put function here to continue normal \"submit\" if recaptcha is turned off\r\n };\r\n };\r\n\r\n $scope.focusQuestion = function (name) {\r\n var elements = document.getElementsByName(name);\r\n if (elements && elements[0]) {\r\n elements[0].scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"start\",\r\n inline: \"nearest\"\r\n });\r\n }\r\n };\r\n\r\n $scope.findLabelFromAlias = function (alias) {\r\n if (alias) {\r\n //Account for some fields that have mismatching names and aliases, or use hidden aliases for validation instead\r\n switch (alias) {\r\n case 'Address_street1':\r\n case 'Address_line1':\r\n case 'Address_street2':\r\n case 'Address_line2':\r\n alias = 'address';\r\n break;\r\n case 'Public Address_street1':\r\n case 'Public Address_line1':\r\n case 'Public Address_street2':\r\n case 'Public Address_line2':\r\n alias = 'public_address';\r\n break;\r\n case 'Public Address_zip':\r\n return 'Postal Code';\r\n case 'Address_zip':\r\n return 'Postal Code';\r\n case 'Address_state':\r\n return 'State';\r\n case 'Address_city':\r\n return 'City';\r\n case 'Address_county':\r\n return 'County';\r\n case 'Public Address_state':\r\n return 'State';\r\n case 'Public Address_city':\r\n return 'City';\r\n case 'Public Address_county':\r\n return 'County';\r\n case 'date':\r\n return;\r\n case 'slushbox':\r\n return;\r\n case 'phone':\r\n return;\r\n case 'driversLicenseNumber':\r\n return;\r\n case 'input':\r\n return;\r\n default:\r\n break;\r\n };\r\n var field = $scope.fieldsByCode[alias];\r\n if (field) {\r\n return field.label || field.name;\r\n }\r\n return;\r\n }\r\n return;\r\n };\r\n\r\n $scope.cancel = function () {\r\n $scope.loading = true;\r\n $state.go('portal.menus.login', {});\r\n }\r\n\r\n $scope.numberCheck = function (keyEvent) {\r\n if (isNaN(keyEvent.key) || keyEvent.key === ' ' || keyEvent.key === '') {\r\n keyEvent.returnValue = '';\r\n }\r\n }\r\n\r\n function fillAutoCompleteForFields(field) {\r\n const name = field.alias;\r\n if (name.includes('birth_date')) {\r\n return 'bday';\r\n } else if (name.includes('first_name')) {\r\n return 'given-name';\r\n } else if (name.includes('last_name')) {\r\n return 'family-name';\r\n } else if (name.includes('middle_name')) {\r\n return 'additional-name';\r\n } else if (name.includes('occupation_employer')) {\r\n return 'organization';\r\n } else if (name.includes('occupation')) {\r\n return 'organziation-title';\r\n } else if (name.includes('drivers_license_number') || name.includes('prefix') || name.includes('suffix')) {\r\n return 'off';\r\n }\r\n }\r\n\r\n }])\r\n ;\r\n","\"use strict\";\r\n\r\nangular.module(\"portal.login\").controller(\"ForgotPassword\", [\r\n \"$q\",\r\n \"$scope\",\r\n \"$state\",\r\n \"$rootScope\",\r\n \"Users\",\r\n \"Enterprise\",\r\n \"EnterpriseLoginCriteria\",\r\n function (\r\n $q,\r\n $scope,\r\n $state,\r\n $rootScope,\r\n Users,\r\n Enterprise,\r\n EnterpriseLoginCriteria\r\n ) {\r\n $scope.loading = true;\r\n $scope.resetting = false;\r\n $scope.hasPublicIdentityProviders = false;\r\n $scope.disablePasswordLogin = false;\r\n $scope.displayForm = false;\r\n $scope.widgetId = null;\r\n $scope.failedMessages = [];\r\n $scope.login_criteria = {};\r\n $scope.parameters = { enterpriseID: $rootScope.enterpriseID };\r\n $scope.reset_object = {\r\n enterprise_id: $rootScope.enterpriseID,\r\n is_public: true\r\n };\r\n\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n } else {\r\n Enterprise.get({ enterpriseID: $rootScope.enterpriseID }).then(\r\n function (result) {\r\n $scope.enterprise = result;\r\n }\r\n );\r\n }\r\n\r\n //recaptcha vars\r\n $scope.recaptchaMessage = $scope.enterprise.recaptcha_site_key_v3 != null ? \"\" : \"There was an issue loading recaptcha, please try again or contact system administrator.\"; //message to display\r\n\r\n var promises = [];\r\n\r\n // Get the login criteria\r\n promises.push(EnterpriseLoginCriteria.get($scope.parameters).then(function (results) {\r\n if (results != null) {\r\n $scope.login_criteria = results;\r\n }\r\n }));\r\n\r\n //Checking if login via password is disabled\r\n promises.push(EnterpriseLoginCriteria.getEnterpriseDisablePasswordLogin().then(function (disable) {\r\n $scope.disablePasswordLogin = disable;\r\n }));\r\n\r\n //Checking if there are any identity providers set up for public portal\r\n promises.push(Enterprise.listPublicEnterpriseIdentityProvider().then(function (idpList) {\r\n $scope.hasPublicIdentityProviders = idpList && idpList.length > 0;\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n $scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n $scope.setDisplayForm = function () {\r\n $scope.displayForm = true;\r\n }\r\n\r\n $scope.reset = function () {\r\n $scope.failedMessages = [];\r\n $scope.resetting = true;\r\n Users.forgotPassword($scope.reset_object).then(function (result) {\r\n if (result != null) {\r\n $state.go(\"portal.menus.login\", {\r\n messages: result.messages,\r\n keepMessages: true\r\n });\r\n }\r\n $scope.resetting = false;\r\n });\r\n };\r\n\r\n $scope.recaptchaSubmit = function () {\r\n $scope.resetting = true; //if there is a loading type var for display\r\n if ($scope.enterprise.recaptcha_enabled) {\r\n if ($scope.enterprise.recaptcha_site_key_v3 != null) {\r\n grecaptcha.ready(function () {\r\n try {\r\n grecaptcha.execute($scope.enterprise.recaptcha_site_key_v3, { action: 'publicForgotPassword' }).then(function (token) { //execute returns a token\r\n return Enterprise.getRecaptchaResponse(\"publicForgotPassword\", token) // send action, token, score to pass over to server for validation, returns a response object\r\n }).then(function (response) { // take the response and update variables\r\n if (response.success == false) {\r\n $scope.recaptchaMessage = 'Recaptcha Error: ' + response.error;\r\n $scope.resetting = false; //if there is a loading type var for display\r\n } else {\r\n $scope.recaptchaMessage = \"\";\r\n };\r\n }).then(function () {\r\n if ($scope.recaptchaMessage == \"\") {\r\n $scope.reset(); //put function here if passed to continue normal \"submit\" is recaptcha passed\r\n } else {\r\n $scope.$apply(); //update dom so error message displays if recaptcha failed\r\n };\r\n })\r\n } catch (error) {\r\n $scope.recaptchaMessage = \"There was an issue loading recaptcha, please try again or contact system administrator.\";\r\n $scope.resetting = false; //if there is a loading type var for display\r\n }\r\n });\r\n } else {\r\n return;\r\n }\r\n } else {\r\n $scope.reset(); //put function here to continue normal \"submit\" if recaptcha is turned off\r\n };\r\n };\r\n\r\n\r\n $scope.cancel = function () {\r\n $scope.loading = true;\r\n $state.go(\"portal.menus.login\", {});\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"portal.login\").controller(\"ForgotUsername\", [\r\n \"$q\",\r\n \"$scope\",\r\n \"$state\",\r\n \"$rootScope\",\r\n \"Users\",\r\n \"Enterprise\",\r\n \"EnterpriseLoginCriteria\",\r\n function (\r\n $q,\r\n $scope,\r\n $state,\r\n $rootScope,\r\n Users,\r\n Enterprise,\r\n EnterpriseLoginCriteria\r\n ) {\r\n $scope.loading = true;\r\n $scope.looking_up = false;\r\n $scope.newEmail = false;\r\n $scope.changeEmail = false;\r\n $scope.hasPublicIdentityProviders = false;\r\n $scope.disablePasswordLogin = false;\r\n $scope.displayForm = false;\r\n $scope.success = false;\r\n $scope.promises = [];\r\n $scope.widgetId = null;\r\n $scope.parameters = {\r\n enterpriseID: $rootScope.enterpriseID\r\n };\r\n $scope.failedMessages = [];\r\n $scope.login_criteria = {};\r\n $scope.lookup_object = { enterprise_id: $rootScope.enterpriseID };\r\n $scope.email_object = { enterprise_id: $rootScope.enterpriseID };\r\n\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n } else {\r\n Enterprise.get({ enterpriseID: $rootScope.enterpriseID }).then(\r\n function (result) {\r\n $scope.enterprise = result;\r\n }\r\n );\r\n }\r\n\r\n //recaptcha vars\r\n $scope.recaptchaMessage = $scope.enterprise.recaptcha_site_key_v3 != null ? \"\" : \"There was an issue loading recaptcha, please try again or contact system administrator.\"; //message to display\r\n\r\n var promises = [];\r\n\r\n // Get the input fields\r\n promises.push(EnterpriseLoginCriteria.get($scope.parameters).then(function (results) {\r\n if (results != null) {\r\n $scope.login_criteria = results;\r\n }\r\n }));\r\n\r\n //Checking if login via password is disabled\r\n promises.push(EnterpriseLoginCriteria.getEnterpriseDisablePasswordLogin().then(function (disable) {\r\n $scope.disablePasswordLogin = disable;\r\n }));\r\n\r\n //Checking if there are any identity providers set up for public portal\r\n promises.push(Enterprise.listPublicEnterpriseIdentityProvider().then(function (idpList) {\r\n $scope.hasPublicIdentityProviders = idpList && idpList.length > 0;\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n $scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n $scope.setDisplayForm = function () {\r\n $scope.displayForm = true;\r\n }\r\n\r\n $scope.lookup = function () {\r\n $scope.failedMessages = [];\r\n $scope.looking_up = true;\r\n Users.lookupUsername($scope.lookup_object).then(function (result) {\r\n if (result != null) {\r\n $scope.success = result.success;\r\n if (result.messages != null) {\r\n $scope.failedMessages = result.messages;\r\n }\r\n if (result.success) {\r\n $scope.email_object.user_id = result.userid;\r\n $scope.success = true;\r\n if (result.no_email) {\r\n $scope.newEmail = true;\r\n } else if (result.change_email) {\r\n var email = result.existing_email;\r\n var emailDomain = email.split(\"@\")[1];\r\n $scope.maskedEmail =\r\n email.substr(0, 2) + \"*******@\" + emailDomain;\r\n $scope.changeEmail = true;\r\n } else {\r\n $state.go(\"portal.menus.login\", {\r\n messages: result.messages,\r\n keepMessages: true\r\n });\r\n }\r\n } else {\r\n $state.go(\"portal.menus.login\", {\r\n messages: result.messages,\r\n keepMessages: true\r\n });\r\n }\r\n }\r\n $scope.looking_up = false;\r\n });\r\n };\r\n\r\n $scope.recaptchaSubmit = function () {\r\n $scope.looking_up = true; //if there is a loading type var for display\r\n if ($scope.enterprise.recaptcha_enabled) {\r\n if ($scope.enterprise.recaptcha_site_key_v3 != null) {\r\n grecaptcha.ready(function () {\r\n try {\r\n grecaptcha.execute($scope.enterprise.recaptcha_site_key_v3, { action: 'publicForgotUsername' }).then(function (token) { //execute returns a token\r\n return Enterprise.getRecaptchaResponse(\"publicForgotUsername\", token) // send action, token, score to pass over to server for validation, returns a response object\r\n }).then(function (response) { // take the response and update variables\r\n if (response.success == false) {\r\n $scope.recaptchaMessage = 'Recaptcha Error: ' + response.error;\r\n $scope.looking_up = false; //if there is a loading type var for display\r\n } else {\r\n $scope.recaptchaMessage = \"\";\r\n };\r\n }).then(function () {\r\n if ($scope.recaptchaMessage == \"\") {\r\n $scope.lookup(); //put function here if passed to continue normal \"submit\" is recaptcha passed\r\n } else {\r\n $scope.$apply(); //update dom so error message displays if recaptcha failed\r\n };\r\n })\r\n } catch (error) {\r\n $scope.recaptchaMessage = \"There was an issue loading recaptcha, please try again or contact system administrator.\";\r\n $scope.looking_up = false; //if there is a loading type var for display\r\n }\r\n });\r\n } else {\r\n return;\r\n }\r\n } else {\r\n $scope.lookup(); //put function here to continue normal \"submit\" if recaptcha is turned off\r\n };\r\n };\r\n\r\n $scope.saveEmail = function () {\r\n if (\r\n $scope.email_object.new_email == null ||\r\n $scope.email_object.new_email == \"\"\r\n ) {\r\n $scope.failedMessages = [\"Please enter an email address\"];\r\n } else {\r\n $scope.loading = true;\r\n Users.saveEmail($scope.email_object).then(function (result) {\r\n if (result != null) {\r\n if (result) {\r\n $scope.newEmail = false;\r\n $scope.changeEmail = false;\r\n $scope.failedMessages = [];\r\n var emailDomain = $scope.email_object.new_email.split(\r\n \"@\"\r\n )[1];\r\n $scope.maskedEmail =\r\n $scope.email_object.new_email.substr(0, 2) +\r\n \"*******@\" +\r\n emailDomain;\r\n } else {\r\n $scope.failedMessages = [\r\n \"That email is already in use by an existing user account!\"\r\n ];\r\n }\r\n }\r\n $scope.loading = false;\r\n });\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n $scope.loading = true;\r\n $state.go(\"portal.menus.login\", {});\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('portal.login')\r\n .controller('Login', ['$scope', '$state', '$stateParams', '$rootScope', '$window', 'Utils', 'Authentication', 'PortalPermissions', 'localStorageService', 'Account', 'EnterpriseLoginCriteria', 'Enterprise', 'Saml', 'Session', function ($scope, $state, $stateParams, $rootScope, $window, Utils, Authentication, PortalPermissions, localStorageService, Account, EnterpriseLoginCriteria, Enterprise, Saml, Session) {\r\n $scope.loading = false;\r\n $scope.idpLoading = false;\r\n $scope.showPassword = false;\r\n $scope.disablePasswordLogin = false;\r\n $scope.idpList = [];\r\n $scope.surpressRedirect = $stateParams.surpressRedirect == \"true\" || false;\r\n $scope.showForceLogin = false;\r\n if ($stateParams.messages && $stateParams.messages.length > 0 && $stateParams.messages[0] == \"You have reached the maximum number of concurrent sessions possible. Please logout from other devices and try again.\") {\r\n $scope.showForceLogin = true;\r\n }\r\n\r\n $scope.signature = {\r\n isPortal: true,\r\n username: null,\r\n pass: null\r\n }\r\n $scope.forgot_link = \"\";\r\n\r\n PortalPermissions.view(\"portal.menus.forgotusername\").then(function (access) {\r\n $scope.forgot_username = access;\r\n });\r\n PortalPermissions.view(\"portal.menus.forgotpassword\").then(function (access) {\r\n $scope.forgot_password = access;\r\n });\r\n PortalPermissions.view(\"portal.menus.createaccount\").then(function (access) {\r\n $scope.create_account = access;\r\n });\r\n $scope.goto_forgot_username = function() {\r\n $state.go('portal.menus.forgotusername');\r\n }\r\n $scope.goto_forgot_password = function () {\r\n $state.go('portal.menus.forgotpassword');\r\n }\r\n $scope.goto_create_account = function () {\r\n $state.go('portal.menus.createaccount');\r\n }\r\n\r\n EnterpriseLoginCriteria.getEnterpriseDisablePasswordLogin().then(function (disable) {\r\n $scope.disablePasswordLogin = disable;\r\n });\r\n\r\n Enterprise.listPublicEnterpriseIdentityProvider().then(function (idpList) {\r\n $scope.idpList = idpList;\r\n\r\n if (!$scope.surpressRedirect && $scope.disablePasswordLogin && $scope.idpList.length == 1) {\r\n Saml.idpSignIn($scope.idpList[0].entityId || $scope.idpList[0].metadataUrl).then(function (ret) {\r\n if (ret && ret.redirectUrl) {\r\n $window.location = ret.redirectUrl;\r\n }\r\n });\r\n }\r\n });\r\n\r\n $scope.idpSignIn = function (entityId) {\r\n $scope.idpLoading = true;\r\n Saml.idpSignIn($scope.idpList[entityId].entityId || $scope.idpList[entityId].metadataUrl).then(function (ret) {\r\n if (ret && ret.redirectUrl) {\r\n $window.location = ret.redirectUrl;\r\n }\r\n else {\r\n $scope.idpLoading = false;\r\n }\r\n });\r\n }\r\n\r\n // remove existing cookie and token from local storage\r\n Utils.DeleteSessionCookie(true);\r\n // expire any existing session\r\n Session.expireSession(true);\r\n localStorageService.remove('portalAuthorizationData');\r\n $rootScope.userAccount = null;\r\n \r\n $scope.login = function () {\r\n $scope.loading = true;\r\n Authentication.login($scope.signature).then(function(response) {\r\n if (response != null) {\r\n Account.get({ portal: true }).then(function (account) {\r\n $rootScope.userAccount = account;\r\n $rootScope.loadingUserAccount = false;\r\n });\r\n if (response.user_id !== undefined && response.user_id.length) {\r\n if (response.redirect_url.indexOf('portal.') == 0) {\r\n $state.go(response.redirect_url);\r\n } else {\r\n $window.location = response.redirect_url;\r\n }\r\n } else {\r\n if (response.redirect_url) {\r\n $window.location = response.redirect_url;\r\n }\r\n else {\r\n //We're staying on the same page, but we need to \"reload\" to get any error messages loaded in\r\n var params = $rootScope.$state.current.params;\r\n params.messages = [response.error_description || \"Invalid Username or Password\"];\r\n $rootScope.$state.transitionTo($rootScope.$state.current, params, {\r\n reload: true,\r\n inherit: false,\r\n notify: true\r\n });\r\n }\r\n $scope.loading = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.createAccount = function () {\r\n $scope.loading = true;\r\n $state.go('portal.menus.createaccount');\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.login')\r\n .controller('ResetPassword', ['$q', '$scope', '$state', '$stateParams', '$rootScope', '$window', '$timeout', 'localStorageService', 'Users', 'Authentication', 'Enterprise', 'EnterpriseLoginCriteria', 'Utils', 'Session', function ($q, $scope, $state, $stateParams, $rootScope, $window, $timeout, localStorageService, Users, Authentication, Enterprise, EnterpriseLoginCriteria, Utils, Session) {\r\n $scope.loading = true;\r\n $scope.loadingRequirements = true;\r\n $scope.resetting = false;\r\n $scope.success = false;\r\n $scope.disablePasswordLogin = false;\r\n $scope.has_identity_provider = false;\r\n $scope.failedMessages = [];\r\n $scope.login_criteria = {};\r\n $scope.parameters = { enterpriseID: $rootScope.enterpriseID };\r\n $scope.reset_object = { enterprise_id: $rootScope.enterpriseID, is_public: true};\r\n $scope.tokenID = $stateParams.token;\r\n $scope.unauthorized = ($scope.tokenID == null || $scope.tokenID == \"\");\r\n $scope.cameFromProfile = $stateParams.cameFromProfile;\r\n $scope.expired = false;\r\n $scope.requirements = {};\r\n $scope.user_id = null;\r\n $scope.promises = [];\r\n $scope.locked = false;\r\n\r\n $scope.promises.push(EnterpriseLoginCriteria.get({ enterpriseID: $rootScope.enterpriseID }).then(function (result) {\r\n $scope.enterpriseLoginCriteria = result;\r\n }));\r\n\r\n // Logout any existing session first\r\n if ($scope.cameFromProfile != 'true') {\r\n Utils.DeleteSessionCookie(true);\r\n Session.expireSession(true);\r\n localStorageService.remove('portalAuthorizationData');\r\n $rootScope.userAccount = null;\r\n }\r\n\r\n if (!$scope.unauthorized) {\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n } else {\r\n $scope.promises.push(Enterprise.get({\r\n enterpriseID: $rootScope.enterpriseID }).then(function (result) {\r\n $scope.enterprise = result;\r\n }));\r\n }\r\n\r\n // Get the auth token, and specifically the user ID we're here for\r\n $scope.promises.push(Users.getResetToken({ key: $scope.tokenID, enterprise_id: $rootScope.enterpriseID }).then(function (result) {\r\n if (result != null) {\r\n if (result.success != true) {\r\n $scope.failedMessages.push(result.message);\r\n $scope.unauthorized = true;\r\n } else {\r\n $scope.user_id = result.user_id;\r\n $scope.reset_object.user_id = result.user_id;\r\n $scope.reset_object.username = result.user_name;\r\n $scope.suspended = result.suspended;\r\n $scope.suspended_on = result.suspended_on;\r\n $scope.unsuspended = result.unsuspended;\r\n $scope.has_identity_provider = result.has_identity_provider;\r\n // Get the strictest access control settings for this user\r\n $scope.promises.push(Users.getPasswordRequirements({ user_id: result.user_id }).then(function(requirements) {\r\n if (requirements != null) {\r\n $scope.requirements = requirements;\r\n }\r\n $scope.loadingRequirements = false;\r\n }));\r\n }\r\n } else {\r\n $scope.failedMessages.push(\"Error verifying reset link.\");\r\n $scope.unauthorized = true;\r\n }\r\n }));\r\n\r\n // Get the login criteria\r\n $q.all($scope.promises).then(function () {\r\n //Determine if the account is suspended and is still locked out\r\n if ($scope.suspended && $scope.suspended_on && $scope.enterpriseLoginCriteria && $scope.enterpriseLoginCriteria.minutes_locked) {\r\n var timeDifference = (new Date($scope.suspended_on.revertTimeZone().getTime() + $scope.enterpriseLoginCriteria.minutes_locked * 60000) - new Date());\r\n if (timeDifference > 0) {\r\n $scope.locked = true;\r\n\r\n //Display the locked out time remaining\r\n timeDifference = timeDifference / 1000;\r\n var hrs = Math.floor(timeDifference / 3600);\r\n var mins = Math.floor((timeDifference % 3600) / 60);\r\n var secs = Math.floor(timeDifference % 60);\r\n var result = \"\";\r\n\r\n if (hrs > 0) {\r\n result += \"\" + hrs + \":\" + (mins < 10 ? \"0\" : \"\");\r\n }\r\n\r\n result += \"\" + mins + \":\" + (secs < 10 ? \"0\" : \"\");\r\n result += \"\" + secs;\r\n\r\n $scope.countdown = result;\r\n \r\n $scope.onTimeout = function () {\r\n var timeDifference = (new Date($scope.suspended_on.revertTimeZone().getTime() + $scope.enterpriseLoginCriteria.minutes_locked * 60000) - new Date()) / 1000\r\n if (timeDifference > 0) {\r\n var hrs = Math.floor(timeDifference / 3600);\r\n var mins = Math.floor((timeDifference % 3600) / 60);\r\n var secs = Math.floor(timeDifference % 60);\r\n var result = \"\";\r\n\r\n if (hrs > 0) {\r\n result += \"\" + hrs + \":\" + (mins < 10 ? \"0\" : \"\");\r\n }\r\n\r\n result += \"\" + mins + \":\" + (secs < 10 ? \"0\" : \"\");\r\n result += \"\" + secs;\r\n $scope.countdown = result;\r\n\r\n timer = $timeout($scope.onTimeout, 1000);\r\n }\r\n else {\r\n //Countdown has passed, user can now reset their password to unsuspend their account\r\n $timeout.cancel(timer);\r\n $scope.locked = false;\r\n }\r\n }\r\n //Recalculate the time remaining every second\r\n var timer = $timeout($scope.onTimeout, 1000);\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n }\r\n }\r\n $scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n\r\n $scope.reset = function() {\r\n $scope.failedMessages = [];\r\n $scope.promises = [];\r\n var valid = true;\r\n \r\n // check password validity\r\n if ($scope.reset_object.confirm != $scope.reset_object.password) {\r\n valid = false;\r\n $scope.failedMessages.push(\"Passwords must match!\");\r\n }\r\n if ($scope.requirements.numeric_chars && ($scope.reset_object.password.search(/^.*(?=.*\\d).*$/) == -1)) {\r\n valid = false;\r\n $scope.failedMessages.push(\"Your password must contain at least one numeric character.\");\r\n }\r\n if ($scope.requirements.uppercase && ($scope.reset_object.password.search(/^.*(?=.*[A-Z]).*$/) == -1)) {\r\n valid = false;\r\n $scope.failedMessages.push(\"Your password must contain at least one uppercase character.\");\r\n }\r\n if ($scope.requirements.special_chars && ($scope.reset_object.password.search(/^.*[!@##\\$%\\^\\&\\*\\(\\)\\?].*$/) == -1)) {\r\n valid = false;\r\n $scope.failedMessages.push(\"Your password must contain at least one special character.\");\r\n }\r\n if ($scope.requirements.not_username && ($scope.reset_object.password == $scope.reset_object.username)) {\r\n valid = false;\r\n $scope.failedMessages.push(\"Your password and username cannot match.\");\r\n }\r\n if ($scope.requirements.min_length > 0 && ($scope.reset_object.password.length < $scope.requirements.min_length)) {\r\n valid = false;\r\n $scope.failedMessages.push(\"Your password must be at least \" + $scope.requirements.min_length + \" characters long.\");\r\n }\r\n if ($scope.requirements.number_of_passwords > 0) {\r\n // Get history\r\n $scope.resetting = true;\r\n $scope.promises.push(Users.checkPasswordHistory({ user_id: $scope.user_id, pass: $scope.reset_object.password, top: $scope.requirements.number_of_passwords }).then(function (clear) {\r\n if (!clear) {\r\n valid = false;\r\n if ($scope.requirements.number_of_passwords == 1) {\r\n $scope.failedMessages.push(\"Your new password cannot match your last password.\");\r\n } else {\r\n $scope.failedMessages.push(\"Your new password cannot match any of your last \" + $scope.requirements.number_of_passwords + \" passwords.\");\r\n }\r\n }\r\n }));\r\n }\r\n\r\n // Now do the save\r\n $q.all($scope.promises).then(function () {\r\n if (valid) {\r\n $scope.resetting = true;\r\n Users.resetPassword($scope.reset_object).then(function(result) {\r\n if (result != null) {\r\n $scope.success = result.success;\r\n if (result.messages != null) {\r\n $scope.failedMessages = result.messages;\r\n }\r\n if (result.success) {\r\n // saved new password, now log them in\r\n $scope.signature = { username: $scope.reset_object.username, pass: $scope.reset_object.password, isPortal: true };\r\n Authentication.login($scope.signature).then(function(response) {\r\n if (response != null) {\r\n if (response.user_id !== undefined && response.user_id.length) {\r\n if (response.redirect_url.indexOf('portal.') == 0) {\r\n $state.go(response.redirect_url, { messages: [\"New password saved\"] });\r\n } else {\r\n $window.location = response.redirect_url;\r\n }\r\n } else {\r\n $state.go('portal.menus.login', { messages: [\"New password saved\"] });\r\n }\r\n }\r\n });\r\n } else {\r\n $scope.resetting = false;\r\n }\r\n } else {\r\n $scope.resetting = false;\r\n }\r\n });\r\n } else {\r\n $scope.resetting = false;\r\n }\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n }\r\n }\r\n\r\n $scope.cancel = function () {\r\n $scope.loading = true;\r\n $state.go('portal.menus.login', {});\r\n }\r\n\r\n $scope.returnToProfile = function () {\r\n $state.go('portal.menus.accountProfileNew');\r\n }\r\n }])\r\n;\r\n","\"use strict\";\r\n\r\nangular.module(\"portal.lookup\").controller(\"FireDrillLookup\", [\r\n \"$scope\",\r\n \"$state\",\r\n \"$stateParams\",\r\n \"$rootScope\",\r\n \"Enterprise\",\r\n \"FireDrill\",\r\n function (\r\n $scope,\r\n $state,\r\n $stateParams,\r\n $rootScope,\r\n Enterprise,\r\n FireDrill\r\n ) {\r\n $scope.loading = true;\r\n $scope.looking_up = false;\r\n $scope.promises = [];\r\n $scope.parameters = {\r\n enterpriseID: $rootScope.enterpriseID\r\n };\r\n $scope.show_search_results = false;\r\n\r\n $scope.schoolSystems = [];\r\n $scope.schools = [];\r\n $scope.years = [];\r\n\r\n $scope.filters = {};\r\n\r\n $scope.fireDrills = [];\r\n\r\n $scope.currentState = $state.current.name;\r\n if ($stateParams.priorState) {\r\n $scope.priorState = $stateParams.priorState;\r\n }\r\n\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n $scope.loading = false;\r\n } else {\r\n Enterprise.get($scope.parameters).then(function (result) {\r\n $scope.enterprise = result;\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n //recaptcha vars\r\n $scope.recaptchaMessage = $scope.enterprise.recaptcha_site_key_v3 != null ? \"\" : \"There was an issue loading recaptcha, please try again or contact system administrator.\"; //message to display\r\n\r\n FireDrill.getPublicSchoolSystems().then(function (result) {\r\n if (result != null) {\r\n $scope.schoolSystems = result;\r\n }\r\n });\r\n\r\n\r\n $scope.onSystemFilterChange = function () {\r\n $scope.schools = []\r\n $scope.years = []\r\n FireDrill.getPublicSchools($scope.filters).then(function (result) {\r\n if (result != null) {\r\n $scope.schools = result;\r\n }\r\n });\r\n }\r\n\r\n $scope.onSchoolFilterChange = function () {\r\n $scope.years = []\r\n if (!(isUndefined($scope.filters.SchoolSystemId) || isUndefined($scope.filters.SchoolId))) {\r\n FireDrill.getPublicYears($scope.filters).then(function (result) {\r\n if (result != null) {\r\n var yearObjs = []\r\n for (var x in result) {\r\n yearObjs.push({ id: result[x], name: result[x] })\r\n }\r\n $scope.years = yearObjs;\r\n }\r\n });\r\n }\r\n }\r\n\r\n $scope.onSystemFilterChange();\r\n\r\n $scope.columns = [\r\n {\r\n label: \"Drill Date\",\r\n field: \"drillDate\",\r\n type: 'date'\r\n },\r\n {\r\n label: \"Number of People\",\r\n field: \"numOfPeople\"\r\n },\r\n {\r\n label: \"Response Time\",\r\n field: \"responseTime\"\r\n },\r\n {\r\n label: \"Drill Type\",\r\n field: \"drillType\"\r\n }\r\n ];\r\n\r\n $scope.search = function search() {\r\n\r\n if (isUndefined($scope.filters.SchoolSystemId) || isUndefined($scope.filters.SchoolId)) {\r\n return;\r\n }\r\n\r\n $scope.looking_up = true;\r\n $scope.show_search_results = false;\r\n FireDrill.getPublicFireDrills($scope.filters).then(function (result) {\r\n if (result != null) {\r\n $scope.fireDrills = result;\r\n }\r\n $scope.looking_up = false;\r\n $scope.show_search_results = true;\r\n });\r\n }\r\n\r\n $scope.clearFilter = function () {\r\n $scope.fireDrills = [];\r\n $scope.filters = {};\r\n }\r\n\r\n $scope.recaptchaSubmit = function () {\r\n $scope.looking_up = true; //if there is a loading type var for display\r\n if ($scope.enterprise.recaptcha_enabled) {\r\n if ($scope.enterprise.recaptcha_site_key_v3 != null) {\r\n grecaptcha.ready(function () {\r\n try {\r\n grecaptcha.execute($scope.enterprise.recaptcha_site_key_v3, { action: 'fireDrillLookup' }).then(function (token) { //execute returns a token\r\n return Enterprise.getRecaptchaResponse(\"fireDrillLookup\", token) // send action, token, score to pass over to server for validation, returns a response object\r\n }).then(function (response) { // take the response and update variables\r\n if (response.success == false) {\r\n $scope.recaptchaMessage = 'Recaptcha Error: ' + response.error;\r\n $scope.looking_up = false; //if there is a loading type var for display\r\n } else {\r\n $scope.recaptchaMessage = \"\";\r\n };\r\n }).then(function () {\r\n if ($scope.recaptchaMessage == \"\") {\r\n $scope.search(); //put function here if passed to continue normal \"submit\" is recaptcha passed\r\n } else {\r\n $scope.$apply(); //update dom so error message displays if recaptcha failed\r\n };\r\n })\r\n } catch (error) {\r\n $scope.recaptchaMessage = \"There was an issue loading recaptcha, please try again or contact system administrator.\";\r\n $scope.looking_up = false; //if there is a loading type var for display\r\n }\r\n });\r\n } else {\r\n return;\r\n }\r\n } else {\r\n $scope.search(); //put function here to continue normal \"submit\" if recaptcha is turned off\r\n };\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"portal.lookup\").controller(\"Lookup\", [\r\n \"$scope\",\r\n \"$state\",\r\n \"$rootScope\",\r\n \"Enterprise\",\r\n \"EnterprisePublicLookup\",\r\n function (\r\n $scope,\r\n $state,\r\n $rootScope,\r\n Enterprise,\r\n EnterprisePublicLookup\r\n ) {\r\n $scope.loading = true;\r\n $scope.looking_up = false;\r\n $scope.promises = [];\r\n $scope.parameters = {\r\n enterpriseID: $rootScope.enterpriseID\r\n };\r\n $scope.lookup_options = []; // types of lookup\r\n $scope.lookup_object = { lookup_option: \"users\" }; // input values for lookup\r\n $scope.license_label = \"License\";\r\n $scope.filterFound = false;\r\n $scope.messages = [\"Please enter a value into one of the filter fields to search.\"];\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n $scope.loading = false;\r\n } else {\r\n Enterprise.get($scope.parameters).then(function (result) {\r\n $scope.enterprise = result;\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n //recaptcha vars\r\n $scope.lookup_object.recaptcha_passed = $scope.enterprise.recaptcha_enabled ? false : true; //to gatekeep intended function, make true if recaptcha is off\r\n $scope.recaptchaMessage = $scope.enterprise.recaptcha_site_key_v3 != null ? \"\" : \"There was an issue loading recaptcha, please try again or contact system administrator.\"; //message to display\r\n\r\n // Get the entity labels\r\n $scope.userLabel = $scope.enterprise.userLabels[\"USER\"];\r\n $scope.serviceLabel = $scope.enterprise.serviceLabels[\"SERVICE\"];\r\n\r\n // Get the specific lookup page(s) that are turned on, so we only do that/those kind(s) of lookup\r\n var userLookupPage = $rootScope.portal_pages[\"portal.menus.userlookup\"];\r\n if (\r\n userLookupPage != null &&\r\n userLookupPage.visible &&\r\n userLookupPage.show_menu\r\n ) {\r\n $scope.lookup_options.push({ id: \"users\", name: $scope.userLabel });\r\n }\r\n var serviceLookupPage =\r\n $rootScope.portal_pages[\"portal.menus.servicelookup\"];\r\n if (\r\n serviceLookupPage != null &&\r\n serviceLookupPage.visible &&\r\n serviceLookupPage.show_menu\r\n ) {\r\n $scope.lookup_options.push({\r\n id: \"services\",\r\n name: $scope.serviceLabel\r\n });\r\n }\r\n $scope.lookup_object.lookup_option = $scope.lookup_options[0].id;\r\n\r\n // Get the lookup filters\r\n EnterprisePublicLookup.get({\r\n enterpriseID: $rootScope.enterpriseID,\r\n code: \"filter\"\r\n }).then(function (result) {\r\n if (result != null) {\r\n result.forEach(function (filter) {\r\n if (filter.alias == \"application_level_id\" || filter.alias == \"certification_level_id\") {\r\n filter.selectShow = \"combined_name\";\r\n } else {\r\n filter.selectShow = \"name\";\r\n }\r\n });\r\n $scope.filters = result;\r\n $scope.filtersAlias = [];\r\n result.forEach(function (filter) {\r\n $scope.filtersAlias.push(filter.alias);\r\n });\r\n $scope.userFilters = result.filter(function (col) {\r\n return col.entity == \"User\";\r\n });\r\n $scope.serviceFilters = result.filter(function (col) {\r\n return col.entity == \"Services\";\r\n });\r\n }\r\n });\r\n\r\n // Get the lookup search columns\r\n EnterprisePublicLookup.get({\r\n enterpriseId: $rootScope.enterpriseID,\r\n code: \"search\"\r\n }).then(function (result) {\r\n if (result != null) {\r\n $scope.search_columns = result;\r\n }\r\n });\r\n\r\n function submitSwitch() {\r\n switch ($scope.lookup_object.lookup_option) {\r\n case \"users\":\r\n $state.go(\"portal.menus.userlookup\", {\r\n lookup_object: $scope.lookup_object\r\n });\r\n break;\r\n case \"services\":\r\n $state.go(\"portal.menus.servicelookup\", {\r\n lookup_object: $scope.lookup_object\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n $scope.looking_up = true;\r\n };\r\n\r\n $scope.submitSwitch = submitSwitch;\r\n\r\n $scope.search = function () {\r\n if ($scope.enterprise.recaptcha_enabled) {\r\n if ($scope.enterprise.recaptcha_site_key_v3 != null) {\r\n $scope.loading = true;\r\n grecaptcha.ready(function () {\r\n try {\r\n grecaptcha.execute($scope.enterprise.recaptcha_site_key_v3, { action: 'publicLookup' }).then(function (token) { //execute returns a token\r\n return Enterprise.getRecaptchaResponse(\"publicLookup\", token) // send action, token, score to pass over to server for validation, returns a response object\r\n }).then(function (response) { // take the response and update variables\r\n if (response.success == false) {\r\n $scope.lookup_object.recaptcha_passed = response.success;\r\n $scope.recaptchaMessage = 'Recaptcha Error: ' + response.error;\r\n $scope.loading = false;\r\n } else {\r\n $scope.lookup_object.recaptcha_passed = response.success;\r\n $scope.recaptchaMessage = \"\";\r\n };\r\n }).then(function () {\r\n if ($scope.lookup_object.recaptcha_passed == true) {\r\n $scope.submitSwitch(); //continue \r\n } else {\r\n $scope.$apply(); //update dom so error message displays\r\n };\r\n })\r\n } catch(error) {\r\n $scope.recaptchaMessage = \"There was an issue loading recaptcha, please try again or contact system administrator.\";\r\n $scope.loading = false;\r\n }\r\n });\r\n } else {\r\n return;\r\n }\r\n } else {\r\n $scope.submitSwitch();\r\n };\r\n };\r\n\r\n // Ensure there is a filter with a value in the lookup\r\n $scope.$watch(\"lookup_object\", function () {\r\n if ($scope.filtersAlias && $scope.filtersAlias.length > 0) {\r\n $scope.filterFound = $scope.filtersAlias.some(function (name) {\r\n return $scope.lookup_object.hasOwnProperty(name) && $scope.lookup_object[name] && $scope.lookup_object[name] != '';\r\n });\r\n }\r\n }, true);\r\n }\r\n]);","\"use strict\";\r\n\r\nangular.module(\"portal.lookup\").controller(\"ServiceLookupDetail\", [\r\n \"$q\",\r\n \"$scope\",\r\n \"Cache\",\r\n \"$state\",\r\n \"$stateParams\",\r\n \"$rootScope\",\r\n \"$timeout\",\r\n \"Enterprise\",\r\n \"EnterprisePublicLookup\",\r\n \"Format\",\r\n \"Services\",\r\n \"Users\",\r\n \"Vehicles\",\r\n function(\r\n $q,\r\n $scope,\r\n Cache,\r\n $state,\r\n $stateParams,\r\n $rootScope,\r\n $timeout,\r\n Enterprise,\r\n EnterprisePublicLookup,\r\n Format,\r\n Services,\r\n Users,\r\n Vehicles\r\n ) {\r\n $scope.loading = true;\r\n $scope.looking_up = false;\r\n $scope.promises = [];\r\n\r\n $scope.license_label = \"License\";\r\n\r\n $scope.detail_columns = [];\r\n $scope.result_columns_vehicles = [];\r\n $scope.vehicle_columns = [];\r\n $scope.result_columns_service_users = [];\r\n $scope.service_user_columns = [];\r\n $scope.certification_columns = [];\r\n $scope.cert_attribute_columns = [];\r\n $scope.service = $stateParams.service;\r\n\r\n if ($stateParams.lookup_object) {\r\n $scope.old_lookup_object = $stateParams.lookup_object;\r\n }\r\n\r\n if ($stateParams.priorState) {\r\n $scope.priorState = $stateParams.priorState;\r\n }\r\n\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n $scope.loading = false;\r\n } else {\r\n Enterprise.get($scope.parameters).then(function(result) {\r\n $scope.enterprise = result;\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n // Get the entity labels\r\n $scope.serviceLabel = $scope.enterprise.serviceLabels[\"SERVICE\"];\r\n $scope.userLabel = $scope.enterprise.userLabels[\"USER\"];\r\n\r\n if (!$scope.lookup_object) {\r\n $scope.lookup_object = {\r\n serviceID:\r\n ($scope.old_lookup_object &&\r\n $scope.old_lookup_object.serviceID) ||\r\n $stateParams.id,\r\n enterprise_id: $rootScope.enterpriseID,\r\n records_offset: 0,\r\n records_total: 1,\r\n sort_fields: null,\r\n sort_direction: \" asc\",\r\n from_search: true\r\n };\r\n }\r\n\r\n // Get the service lookup detail columns, then check passed in service for existing columns\r\n EnterprisePublicLookup.get({\r\n enterpriseId: $rootScope.enterpriseID,\r\n code: \"result\",\r\n entity_type: \"service\"\r\n }).then(function(result) {\r\n if (result != null) {\r\n $scope.result_columns = result.filter(function(c) {\r\n return c.category !== \"certification\";\r\n });\r\n\r\n // remove application and complaint columns from main list\r\n $scope.result_columns = $scope.result_columns.filter(function(\r\n c\r\n ) {\r\n return c.singular_relationship;\r\n });\r\n $scope.result_columns_certifications = result.filter(function (c) {\r\n return (\r\n !c.singular_relationship && c.category == \"Certification List\"\r\n );\r\n });\r\n\r\n $scope.result_columns_certifications.forEach(function (column) {\r\n // create columns for list directive\r\n $scope.certification_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone:\r\n column.format_type == \"date\"\r\n ? column.field.toLowerCase() == \"issue_date\" ||\r\n column.field.toLowerCase() ==\r\n \"expiration_date\" ||\r\n column.field.toLowerCase() ==\r\n \"initial_issue_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Name\",\r\n field: \"name\",\r\n type: \"string\"\r\n });\r\n\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Value\",\r\n field: \"value\",\r\n type: \"string\"\r\n });\r\n\r\n $scope.result_columns_vehicles = result.filter(function(c) {\r\n return (\r\n !c.singular_relationship && c.table_name == \"vehicles\"\r\n );\r\n });\r\n\r\n $scope.result_columns_vehicles.forEach(function(c) {\r\n $scope.vehicle_columns.push({\r\n label: c.label,\r\n field: c.alias,\r\n type: c.format_type\r\n });\r\n });\r\n\r\n $scope.result_columns_service_users = result.filter(function(\r\n c\r\n ) {\r\n return (\r\n !c.singular_relationship &&\r\n c.table_name == \"service_users\"\r\n );\r\n });\r\n\r\n $scope.result_columns_service_users.forEach(function(c) {\r\n $scope.service_user_columns.push({\r\n label: c.label,\r\n field: c.alias,\r\n type: c.format_type,\r\n link:\r\n c.field == \"full_name\"\r\n ? {\r\n // conditionally add link property\r\n state: \"portal.menus.userlookupdetail\",\r\n params: [\r\n {\r\n name: \"id\",\r\n field: \"id\"\r\n },\r\n {\r\n name: \"priorState\",\r\n field: \"priorState\" // these are annoying\r\n },\r\n {\r\n name: \"lookup_object\",\r\n field: \"lookup_object\"\r\n }\r\n ]\r\n }\r\n : undefined,\r\n revertTimeZone:\r\n c.format_type == \"date\"\r\n ? c.field.toLowerCase() == \"issue_date\" ||\r\n c.field.toLowerCase() == \"expiration_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n getService().then(function(result) {\r\n $scope.service = result;\r\n\r\n if ($scope.service) {\r\n if ($scope.service.website) {\r\n $scope.service.websiteUrl = Format.url(\r\n $scope.service.website\r\n );\r\n }\r\n\r\n if ($scope.service.alert_count > 0) {\r\n Services.getServiceAlerts({\r\n serviceID: $scope.service.id,\r\n is_public: true\r\n }).then(function(result) {\r\n $scope.service.alerts = result;\r\n if (\r\n $scope.service.alerts != null &&\r\n $scope.service.alerts.length > 0\r\n ) {\r\n $scope.service.alerts_concat = \"\";\r\n $scope.service.alerts.forEach(function(\r\n alert\r\n ) {\r\n // slightly faster than using .reduce\r\n $scope.service.alerts_concat +=\r\n \", \" + alert.message;\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (\r\n $scope.result_columns_vehicles.length > 0 &&\r\n !$scope.service.vehicles\r\n ) {\r\n $scope.service.service_vehicles_list_loading = true;\r\n Vehicles.get({\r\n service_id: $scope.service.id,\r\n for_lookup: true,\r\n enterpriseID: $rootScope.enterpriseID\r\n }).then(function(result) {\r\n if (result != null) {\r\n $scope.service.vehicles = result;\r\n }\r\n $scope.service.service_vehicles_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.result_columns_certifications.length > 0 &&\r\n !$scope.service.certifications\r\n ) {\r\n $scope.service.certifications_list_loading = true;\r\n Services.getServiceCertifications(\r\n $scope.service.id,\r\n false,\r\n $rootScope.enterpriseID\r\n ).then(function (result) {\r\n $scope.service.certifications = result;\r\n $scope.service.certifications_list_loading = false;\r\n });\r\n }\r\n\r\n $scope.service.priorState = $state.current.name;\r\n if (\r\n $scope.result_columns_service_users.length > 0 &&\r\n $scope.service &&\r\n !$scope.service.service_users\r\n ) {\r\n $scope.service.service_users_list_loading = true;\r\n Users.getPublicSearchUser({\r\n externalOnly: false,\r\n service_id: $scope.service.id,\r\n forService: true,\r\n inactiveServiceUsers: true,\r\n forServiceLookup: true,\r\n enterpriseID: $rootScope.enterpriseID\r\n }).then(function (result) {\r\n $scope.service.service_users = result.map(\r\n function(user) {\r\n user.priorState = $state.current.name;\r\n user.lookup_object =\r\n $scope.lookup_object;\r\n return user;\r\n }\r\n );\r\n $scope.service.service_users_list_loading = false;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n function getService() {\r\n var d = $q.defer();\r\n\r\n if (!$stateParams.service) {\r\n if (!$scope.lookup_object.serviceID) {\r\n $scope.lookup_object.serviceID = $stateParams.id; // use the id if no service\r\n }\r\n Services.PublicLookupService($scope.lookup_object).then(function(\r\n result\r\n ) {\r\n var service = result && result.pop();\r\n d.resolve(service);\r\n });\r\n } else {\r\n d.resolve($stateParams.service); // just return the service we got in state params\r\n }\r\n\r\n return d.promise;\r\n }\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"portal.lookup\").controller(\"ServiceLookup\", [\r\n \"$scope\",\r\n \"$state\",\r\n \"$stateParams\",\r\n \"$rootScope\",\r\n \"Enterprise\",\r\n \"EnterprisePublicLookup\",\r\n \"Format\",\r\n \"Services\",\r\n \"Users\",\r\n \"Vehicles\",\r\n function(\r\n $scope,\r\n $state,\r\n $stateParams,\r\n $rootScope,\r\n Enterprise,\r\n EnterprisePublicLookup,\r\n Format,\r\n Services,\r\n Users,\r\n Vehicles\r\n ) {\r\n $scope.loading = true;\r\n $scope.looking_up = false;\r\n $scope.promises = [];\r\n $scope.parameters = {\r\n enterpriseID: $rootScope.enterpriseID\r\n };\r\n $scope.license_label = \"License\";\r\n $scope.show_search_results = false;\r\n $scope.filters = [];\r\n $scope.search_columns = [];\r\n $scope.search_header_columns = [];\r\n $scope.vehicle_columns = [];\r\n $scope.services = [];\r\n $scope.reverse = false;\r\n\r\n $scope.currentPage;\r\n $scope.numPerPage = 10;\r\n $scope.perPages = [\r\n { id: 10, name: 10 },\r\n { id: 15, name: 15 },\r\n { id: 20, name: 20 },\r\n { id: 25, name: 25 },\r\n { id: 50, name: 50 }\r\n ];\r\n $scope.record_count = 0;\r\n $scope.filterFound = false;\r\n $scope.messages = [\"Please enter a value into one of the filter fields to search.\"];\r\n\r\n //recaptcha vars\r\n $scope.recaptchaMessage = $scope.enterprise.recaptcha_site_key_v3 != null ? \"\" : \"There was an issue loading recaptcha, please try again or contact system administrator.\"; //message to display\r\n\r\n if (!$stateParams.lookup_object) {\r\n $scope.lookup_object = {\r\n enterprise_id: $rootScope.enterpriseID,\r\n records_offset: 0,\r\n records_total: 10,\r\n sort_fields: null,\r\n recaptcha_passed: $scope.enterprise.recaptcha_enabled ? false : true, //to gatekeep intended function, make true if recaptcha is off, if passed from the base lookup page, will have already checked recaptcha\r\n\r\n };\r\n } else {\r\n $scope.lookup_object = $stateParams.lookup_object; // this will contain data like first_name, etc. from base lookup\r\n $scope.lookup_object.enterprise_id = $rootScope.enterpriseID;\r\n if (!$scope.lookup_object.records_offset)\r\n $scope.lookup_object.records_offset = 0;\r\n if (!$scope.lookup_object.records_total)\r\n $scope.lookup_object.records_total = 10;\r\n if (!$scope.lookup_object.sort_fields)\r\n $scope.lookup_object.sort_fields = null;\r\n if (!$scope.lookup_object.sort_fields)\r\n $scope.lookup_object.sort_direciton = \" asc\";\r\n\r\n getCount(search); // state params are not null, first time around, need to get count\r\n }\r\n\r\n $scope.lookup_object.from_search = true;\r\n\r\n $scope.currentState = $state.current.name;\r\n if ($stateParams.priorState) {\r\n $scope.priorState = $stateParams.priorState;\r\n }\r\n\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n $scope.loading = false;\r\n } else {\r\n Enterprise.get($scope.parameters).then(function(result) {\r\n $scope.enterprise = result;\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n // Get the entity labels\r\n $scope.serviceLabel = $scope.enterprise.serviceLabels[\"SERVICE\"];\r\n\r\n // Get the service lookup filters columns\r\n EnterprisePublicLookup.get({\r\n enterpriseId: $rootScope.enterpriseID,\r\n code: \"filter\",\r\n entity_type: \"service\"\r\n }).then(function(result) {\r\n if (result != null) {\r\n $scope.filters = result;\r\n $scope.filtersAlias = [];\r\n result.forEach(function (filter) {\r\n $scope.filtersAlias.push(filter.alias);\r\n });\r\n $scope.filterFound = $scope.filtersAlias.some(function (name) {\r\n return $scope.lookup_object.hasOwnProperty(name) && $scope.lookup_object[name] && $scope.lookup_object[name] != '';\r\n });\r\n }\r\n });\r\n\r\n // get the service lookup search columns\r\n EnterprisePublicLookup.get({\r\n enterpriseId: $rootScope.enterpriseID,\r\n code: \"search\",\r\n entity_type: \"service\"\r\n }).then(function(result) {\r\n $scope.search_columns = [];\r\n $scope.search_header_columns = [];\r\n $scope.search_columns_vehicles = [];\r\n $scope.vehicle_columns = []; // the service lookup does not have a drop down (yet) so no need to use these\r\n $scope.search_columns_service_users = [];\r\n $scope.service_user_columns = [];\r\n $scope.certification_columns = [];\r\n $scope.cert_attribute_columns = [];\r\n\r\n if (result != null) {\r\n $scope.search_header_columns = result\r\n .filter(function(c) {\r\n // column may be a header column but not sortable, in that case sort button is removed\r\n return c.sortable && c.alias != \"service_name\"; // taking care of the service name by itself as it includes a link...kinda dumb\r\n })\r\n .slice(0, 7); // let's just get the first 7 columns\r\n\r\n $scope.search_columns_singular = result.filter(function(c) {\r\n // drop down detail columns\r\n return c.singular_relationship && !c.sortable;\r\n });\r\n\r\n $scope.search_columns_vehicles = result.filter(function(c) {\r\n return (\r\n !c.singular_relationship && c.table_name == \"vehicles\"\r\n );\r\n });\r\n\r\n $scope.search_columns_vehicles.forEach(function(c) {\r\n $scope.vehicle_columns.push({\r\n label: c.label,\r\n field: c.alias,\r\n type: c.format_type\r\n });\r\n });\r\n\r\n $scope.search_columns_service_users = result.filter(function(\r\n c\r\n ) {\r\n return (\r\n !c.singular_relationship &&\r\n c.table_name == \"service_users\"\r\n );\r\n });\r\n $scope.search_columns_certifications = result.filter(function (c) {\r\n return (\r\n !c.singular_relationship && c.category == \"Certification List\"\r\n );\r\n });\r\n\r\n $scope.search_columns_certifications.forEach(function (column) {\r\n // create columns for list directive\r\n $scope.certification_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone:\r\n column.format_type == \"date\"\r\n ? column.field.toLowerCase() == \"issue_date\" ||\r\n column.field.toLowerCase() ==\r\n \"expiration_date\" || column.field.toLowerCase() == \"initial_issue_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Name\",\r\n field: \"name\",\r\n type: \"string\"\r\n });\r\n\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Value\",\r\n field: \"value\",\r\n type: \"string\"\r\n });\r\n\r\n $scope.search_columns_service_users.forEach(function(c) {\r\n $scope.service_user_columns.push({\r\n label: c.label,\r\n field: c.alias,\r\n type: c.format_type,\r\n link:\r\n c.field == \"full_name\"\r\n ? {\r\n // conditionally add link property\r\n state: \"portal.menus.userlookupdetail\",\r\n params: [\r\n {\r\n name: \"id\",\r\n field: \"id\"\r\n },\r\n {\r\n name: \"priorState\",\r\n field: \"priorState\"\r\n },\r\n {\r\n name: \"lookup_object\",\r\n field: \"lookup_object\"\r\n }\r\n ]\r\n }\r\n : undefined,\r\n revertTimeZone:\r\n c.format_type == \"date\"\r\n ? c.field.toLowerCase() == \"issue_date\" ||\r\n c.field.toLowerCase() == \"expiration_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n }\r\n });\r\n\r\n function toggleService(service) {\r\n service.isOpen = !service.isOpen;\r\n if (service.isOpen) {\r\n if (service.alert_count > 0) {\r\n Services.getServiceAlerts({\r\n serviceID: service.id,\r\n is_public: true\r\n }).then(function(result) {\r\n service.alerts = result;\r\n\r\n if (\r\n service.alerts != null &&\r\n service.alerts.length > 0\r\n ) {\r\n service.alerts_concat = \"\";\r\n service.alerts.forEach(function(alert) {\r\n // slightly faster than using .reduce\r\n service.alerts_concat += \", \" + alert.message;\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (\r\n $scope.search_columns_vehicles.length > 0 &&\r\n !service.vehicles\r\n ) {\r\n service.service_vehicles_list_loading = true;\r\n Vehicles.get({\r\n service_id: service.id,\r\n for_lookup: true,\r\n enterpriseID: $rootScope.enterpriseID\r\n }).then(function(result) {\r\n if (result != null) {\r\n service.vehicles = result;\r\n }\r\n service.service_vehicles_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.search_columns_certifications.length > 0 &&\r\n !service.certifications\r\n ) {\r\n service.certifications_list_loading = true;\r\n Services.getServiceCertifications(\r\n service.id,\r\n false,\r\n $rootScope.enterpriseID\r\n ).then(function (result) {\r\n service.certifications = result;\r\n service.certifications_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.search_columns_service_users.length > 0 &&\r\n !service.service_users\r\n ) {\r\n service.service_users_list_loading = true;\r\n Users.getPublicSearchUser({\r\n externalOnly: true,\r\n service_id: service.id,\r\n forService: true,\r\n inactiveServiceUsers: false,\r\n forServiceLookup: true,\r\n enterpriseID: $rootScope.enterpriseID\r\n }).then(function(result) {\r\n if (result != null) {\r\n service.service_users = result.map(function(user) {\r\n user.priorState = $state.current.name;\r\n user.lookup_object = $scope.lookup_object;\r\n return user;\r\n });\r\n }\r\n service.service_users_list_loading = false;\r\n });\r\n }\r\n }\r\n }\r\n\r\n $scope.toggleService = toggleService;\r\n\r\n function getCount(search) {\r\n $scope.looking_up = true;\r\n Services.getServiceLookupCount($scope.lookup_object).then(function(\r\n result\r\n ) {\r\n $scope.record_count = result;\r\n if (search) {\r\n search();\r\n } else {\r\n $scope.looking_up = false;\r\n }\r\n });\r\n }\r\n\r\n $scope.getCount = getCount;\r\n\r\n function search() {\r\n $scope.looking_up = true;\r\n Services.PublicLookupService($scope.lookup_object).then(function(result) {\r\n if (result != null) {\r\n $scope.services = result.map(function(service) {\r\n service.isOpen = false;\r\n\r\n service.websiteUrl = Format.url(service.website);\r\n\r\n return service;\r\n });\r\n }\r\n\r\n $scope.looking_up = false;\r\n $scope.show_search_results = true;\r\n });\r\n }\r\n\r\n $scope.search = search;\r\n\r\n $scope.recaptchaSubmit = function () {\r\n $scope.looking_up = true; //if there is a loading type var for display\r\n if ($scope.enterprise.recaptcha_enabled && $scope.lookup_object.recaptcha_passed != true) {\r\n if ($scope.enterprise.recaptcha_site_key_v3 != null) {\r\n grecaptcha.ready(function () {\r\n try {\r\n grecaptcha.execute($scope.enterprise.recaptcha_site_key_v3, { action: 'publicUserLookup' }).then(function (token) { //execute returns a token\r\n return Enterprise.getRecaptchaResponse(\"publicUserLookup\", token) // send action, token, score to pass over to server for validation, returns a response object\r\n }).then(function (response) { // take the response and update variables\r\n if (response.success == false) {\r\n $scope.recaptchaMessage = 'Recaptcha Error: ' + response.error;\r\n $scope.looking_up = false; //if there is a loading type var for display\r\n } else {\r\n $scope.recaptchaMessage = \"\";\r\n };\r\n }).then(function () {\r\n if ($scope.recaptchaMessage == \"\") {\r\n $scope.getCount(search); //put function here if passed to continue normal \"submit\" is recaptcha passed\r\n } else {\r\n $scope.$apply(); //update dom so error message displays if recaptcha failed\r\n };\r\n }).catch(function (response) {\r\n // handle error\r\n });\r\n } catch (error) {\r\n $scope.recaptchaMessage = \"There was an issue loading recaptcha, please try again or contact system administrator.\";\r\n $scope.looking_up = false; //if there is a loading type var for display\r\n }\r\n });\r\n } else {\r\n return;\r\n }\r\n } else {\r\n $scope.getCount(search); //put function here to continue normal \"submit\" if recaptcha is turned off\r\n };\r\n };\r\n\r\n\r\n function clearFilter() {\r\n $scope.filters.forEach(function(filter) {\r\n delete $scope.lookup_object[filter.alias];\r\n });\r\n\r\n $scope.services = [];\r\n $scope.record_count = 0;\r\n }\r\n\r\n $scope.clearFilter = clearFilter;\r\n\r\n function sort(column) {\r\n $scope.reverse = !$scope.reverse;\r\n $scope.lookup_object.sort_fields = column.alias;\r\n $scope.lookup_object.sort_direction = $scope.reverse\r\n ? \" asc\"\r\n : \"desc\";\r\n $scope.search();\r\n }\r\n\r\n $scope.sort = sort;\r\n\r\n $scope.determineClasses = function(index, length, column, record) {\r\n var classes = \"\";\r\n\r\n var value = Math.floor(12 / length);\r\n var mod = 12 % length;\r\n if (index < mod) {\r\n value += 1;\r\n }\r\n classes = \"col-xs-\" + value;\r\n\r\n return classes;\r\n };\r\n\r\n $scope.setCurrentPage = function(page) {\r\n $scope.lookup_object.records_offset = page * $scope.numPerPage;\r\n $scope.search();\r\n $scope.currentPage = angular.copy($scope.pages[page]);\r\n };\r\n\r\n $scope.setNumPerPage = function(numPerPage) {\r\n $scope.numPerPage = numPerPage;\r\n $scope.lookup_object.records_total = numPerPage;\r\n $scope.setPages($scope.record_count);\r\n $scope.search();\r\n };\r\n\r\n $scope.numOfPages = function(length) {\r\n return Math.ceil(length / $scope.numPerPage) - 1;\r\n };\r\n\r\n $scope.setPages = function(length) {\r\n $scope.pages = [];\r\n\r\n if (length > 0) {\r\n var i = 0;\r\n for (i = 0; i <= $scope.numOfPages(length); i++) {\r\n $scope.pages.push({ id: i, name: i + 1 });\r\n }\r\n } else {\r\n $scope.pages.push({ id: 0, name: 0 });\r\n }\r\n\r\n $scope.lookup_object.records_offset = 0;\r\n $scope.currentPage = angular.copy($scope.pages[0]);\r\n };\r\n\r\n $scope.$watch(\"record_count\", function(length) {\r\n $scope.setPages(length);\r\n });\r\n\r\n // Ensure there is a filter with a value in the lookup\r\n $scope.$watch(\"lookup_object\", function () {\r\n if ($scope.filtersAlias && $scope.filtersAlias.length > 0) {\r\n $scope.filterFound = $scope.filtersAlias.some(function (name) {\r\n return $scope.lookup_object.hasOwnProperty(name) && $scope.lookup_object[name] && $scope.lookup_object[name] != '';\r\n });\r\n }\r\n }, true);\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"portal.lookup\").controller(\"UserLookupDetail\", [\r\n \"$q\",\r\n \"$scope\",\r\n \"Cache\",\r\n \"$state\",\r\n \"$stateParams\",\r\n \"$rootScope\",\r\n \"$timeout\",\r\n \"Complaints\",\r\n \"Enterprise\",\r\n \"EnterprisePublicLookup\",\r\n \"LicenseRequests\",\r\n \"Services\",\r\n \"Users\",\r\n function (\r\n $q,\r\n $scope,\r\n Cache,\r\n $state,\r\n $stateParams,\r\n $rootScope,\r\n $timeout,\r\n Complaints,\r\n Enterprise,\r\n EnterprisePublicLookup,\r\n LicenseRequests,\r\n Services,\r\n Users\r\n ) {\r\n $scope.loading = true;\r\n $scope.looking_up = false;\r\n $scope.promises = [];\r\n\r\n $scope.license_label = \"License\";\r\n\r\n $scope.detail_columns = [];\r\n $scope.user = $stateParams.user;\r\n\r\n Enterprise.getEnterpriseUserPublicAddresses().then(function (show) {\r\n if (show) {\r\n $scope.userPublicAddresses = true;\r\n } else {\r\n $scope.userPublicAddresses = false;\r\n }\r\n });\r\n\r\n if ($stateParams.lookup_object) {\r\n $scope.old_lookup_object = $stateParams.lookup_object;\r\n }\r\n\r\n if ($stateParams.priorState) {\r\n $scope.priorState = $stateParams.priorState;\r\n }\r\n\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n } else {\r\n Enterprise.get($scope.parameters).then(function (result) {\r\n $scope.enterprise = result;\r\n });\r\n }\r\n\r\n // Get the entity labels\r\n $scope.userLabel = $scope.enterprise.userLabels[\"USER\"];\r\n $scope.serviceLabel = $scope.enterprise.serviceLabels[\"SERVICE\"];\r\n\r\n if (!$scope.lookup_object) {\r\n $scope.lookup_object = {\r\n userID:\r\n ($scope.old_lookup_object &&\r\n $scope.old_lookup_object.userID) ||\r\n $stateParams.id,\r\n enterprise_id: $rootScope.enterpriseID,\r\n records_offset: 0,\r\n records_total: 1,\r\n sort_fields: null,\r\n from_search: false\r\n };\r\n }\r\n\r\n // Get the user lookup detail columns, then check passed in user for existing columns\r\n EnterprisePublicLookup.get({\r\n enterpriseId: $rootScope.enterpriseID,\r\n code: \"result\",\r\n entity_type: \"user\"\r\n }).then(function (result) {\r\n $scope.result_columns = [];\r\n $scope.investigation_columns = [];\r\n $scope.certification_columns = [];\r\n $scope.cert_attribute_columns = [];\r\n $scope.application_columns = [];\r\n $scope.user_services_columns = [];\r\n\r\n if (result != null) {\r\n result = result.map(function (c) {\r\n return c;\r\n });\r\n\r\n $scope.result_columns = result.filter(function (c) {\r\n return c.singular_relationship;\r\n });\r\n\r\n $scope.result_columns_investigations = result.filter(function (c) {\r\n return (\r\n !c.singular_relationship &&\r\n c.category == \"Investigation\"\r\n );\r\n });\r\n\r\n $scope.result_columns_applications = result.filter(function (c) {\r\n return (\r\n !c.singular_relationship && c.category == \"Application\"\r\n );\r\n });\r\n\r\n $scope.result_columns_investigations.forEach(function (column) {\r\n // create columns for list directive\r\n $scope.investigation_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone: true\r\n });\r\n });\r\n\r\n $scope.result_columns_applications.forEach(function (column) {\r\n // create columns for list directive\r\n $scope.application_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone:\r\n column.format_type == \"date\"\r\n ? column.field.toLowerCase() == \"issue_date\" ||\r\n column.field.toLowerCase() ==\r\n \"expiration_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n $scope.result_columns_certifications = result.filter(function (c) {\r\n return (\r\n !c.singular_relationship && c.category == \"Certification List\"\r\n );\r\n });\r\n\r\n $scope.result_columns_certifications.forEach(function (column) {\r\n // create columns for list directive\r\n $scope.certification_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone:\r\n column.format_type == \"date\"\r\n ? column.field.toLowerCase() == \"issue_date\" ||\r\n column.field.toLowerCase() ==\r\n \"expiration_date\" ||\r\n column.field.toLowerCase() ==\r\n \"initial_issue_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Name\",\r\n field: \"name\",\r\n type: \"string\"\r\n });\r\n\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Value\",\r\n field: \"value\",\r\n type: \"string\"\r\n });\r\n\r\n $scope.result_columns_services = result.filter(function (c) {\r\n return (\r\n !c.singular_relationship &&\r\n c.table_name == \"user_services\"\r\n );\r\n });\r\n\r\n $scope.courseListColumn = result.find(function (c) {\r\n return (\r\n c.id == \"e1b58668-38f3-4690-bc85-83c205751113\" &&\r\n c.field == \"course_list\" &&\r\n c.alias == \"course_list\"\r\n );\r\n });\r\n if ($scope.courseListColumn && $scope.enterprise.education_module == true) {\r\n $scope.courseList = true;\r\n $scope.courseListLabel = $scope.courseListColumn.label;\r\n }\r\n $scope.educationReportColumn = result.find(function (c) {\r\n return (\r\n c.id == \"6819d430-afc5-4a9e-a3ad-477742321ea5\" &&\r\n c.field == \"education_report\" &&\r\n c.alias == \"education_report\" &&\r\n c.restricted == false\r\n );\r\n })\r\n if ($scope.educationReportColumn && $scope.enterprise.education_module == true) {\r\n $scope.educationReport = true;\r\n $scope.educationReportLabel = $scope.educationReportColumn.label;\r\n }\r\n\r\n $scope.result_columns_services.forEach(function (c) {\r\n $scope.user_services_columns.push({\r\n label: c.label,\r\n field: c.alias,\r\n type: c.format_type,\r\n link:\r\n c.field == \"name\"\r\n ? {\r\n // conditionally add link property\r\n state: \"portal.menus.servicelookupdetail\",\r\n params: [\r\n {\r\n name: \"id\",\r\n field: \"id\"\r\n },\r\n {\r\n name: \"priorState\",\r\n field: \"priorState\"\r\n },\r\n {\r\n name: \"lookup_object\",\r\n field: \"lookup_object\"\r\n }\r\n ]\r\n }\r\n : undefined,\r\n revertTimeZone:\r\n c.format_type == \"date\"\r\n ? c.field.toLowerCase() == \"issue_date\" ||\r\n c.field.toLowerCase() == \"expiration_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n getUser().then(function (userInfo) {\r\n $scope.user = userInfo;\r\n\r\n if ($scope.user) {\r\n if (!$scope.educationReport && $scope.enterprise.education_module == true) {\r\n EnterprisePublicLookup.getEducationReportLookupPermission($scope.user.id).then(function (educationReportPermission) {\r\n\r\n $scope.educationReportColumn = result.find(function (c) {\r\n return (\r\n c.id == \"6819d430-afc5-4a9e-a3ad-477742321ea5\" &&\r\n c.field == \"education_report\" &&\r\n c.alias == \"education_report\" &&\r\n c.restricted == true\r\n );\r\n });\r\n if ($scope.educationReportColumn && educationReportPermission) {\r\n $scope.educationReport = true;\r\n $scope.educationReportLabel = $scope.educationReportColumn.label;\r\n }\r\n });\r\n }\r\n if (\r\n $scope.result_columns_certifications.length > 0 &&\r\n !$scope.user.certifications\r\n ) {\r\n $scope.user.certifications_list_loading = true;\r\n Users.getUserCertifications(\r\n $scope.user.id,\r\n true,\r\n $rootScope.enterpriseID\r\n ).then(function (result) {\r\n $scope.user.certifications = result;\r\n $scope.user.certifications_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.result_columns_applications.length > 0 &&\r\n !$scope.user.applications\r\n ) {\r\n $scope.user.applications_list_loading = true;\r\n LicenseRequests.getByUserID(\r\n $scope.user.id,\r\n true,\r\n $rootScope.enterpriseID\r\n ).then(function (result) {\r\n $scope.user.applications = result;\r\n $scope.user.applications_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.result_columns_investigations.length > 0 &&\r\n !$scope.user.investigations\r\n ) {\r\n $scope.user.investigations_list_loading = true;\r\n Complaints.getByUserID(\r\n $scope.user.id,\r\n true,\r\n $rootScope.enterpriseID\r\n ).then(function (result) {\r\n $scope.user.investigations = result;\r\n $scope.user.investigations_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.result_columns_services.length > 0 &&\r\n !$scope.user.services\r\n ) {\r\n $scope.user.services_list_loading = true;\r\n Services.getByUserID(\r\n $scope.user.id,\r\n true,\r\n $rootScope.enterpriseID\r\n ).then(function (result) {\r\n $scope.user.services = result.map(function (\r\n service\r\n ) {\r\n service.priorState = $state.current.name;\r\n service.lookup_object =\r\n $scope.lookup_object;\r\n return service;\r\n });\r\n $scope.user.services_list_loading = false;\r\n });\r\n }\r\n\r\n $scope.promises.push(\r\n Users.getUserEMSLevels({\r\n userID: $scope.user.id\r\n }).then(function (EMSLevels) {\r\n $scope.user.EMSLevels = EMSLevels;\r\n })\r\n );\r\n\r\n $scope.promises.push(\r\n Users.getUserEndorsements({\r\n userID: $scope.user.id\r\n }).then(function (endorsements) {\r\n $scope.user.endorsements = endorsements;\r\n })\r\n );\r\n\r\n $scope.promises.push(\r\n Users.getUserInstructorLevels({\r\n userID: $scope.user.id\r\n }).then(function (instructorLevels) {\r\n $scope.user.instructorLevels = instructorLevels;\r\n })\r\n );\r\n\r\n $scope.promises.push(\r\n Users.getUserEvaluatorLevels({\r\n userID: $scope.user.id\r\n }).then(function (evaluatorLevels) {\r\n $scope.user.evaluatorLevels = evaluatorLevels;\r\n })\r\n );\r\n\r\n $scope.promises.push(\r\n Users.getUserInstructingTopics({\r\n userID: $scope.user.id\r\n }).then(function (instructingTopics) {\r\n $scope.user.instructingTopics = instructingTopics;\r\n })\r\n );\r\n\r\n $q.all($scope.promises).then(function () {\r\n $scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n }); \r\n }\r\n });\r\n }\r\n });\r\n\r\n function getUser() {\r\n var d = $q.defer();\r\n\r\n // THIS WAS A BAD IDEA, JUST LOOK UP THE USER\r\n // if (!$stateParams.user) {\r\n if (!$scope.lookup_object.userID) {\r\n $scope.lookup_object.userID = $stateParams.id; // use the id if no user\r\n }\r\n\r\n Users.publicLookupUser($scope.lookup_object).then(function (result) {\r\n var user = result && result.pop();\r\n\r\n $scope.include_suffix = false;\r\n $scope.include_middle = false;\r\n\r\n $scope.result_columns.forEach(function (s) {\r\n if (s.alias == 'suffix') {\r\n $scope.include_suffix = true;\r\n }\r\n if (s.alias == 'middle_name') {\r\n $scope.include_middle = true;\r\n }\r\n if (s.alias == 'user_id_alert_id') {\r\n $scope.userAlertsUsed = true;\r\n }\r\n });\r\n\r\n user['header_name'] = user.last_name;\r\n if ($scope.include_suffix && user.suffix != '' && user.suffix != null) {\r\n user['header_name'] = user['header_name'] + ' ' + user.suffix;\r\n }\r\n\r\n user['header_name'] = user['header_name'] + ', ' + user.first_name;\r\n\r\n if ($scope.include_middle && user.middle_name != '' && user.middle_name != null) {\r\n user['header_name'] = user['header_name'] + ' ' + user.middle_name;\r\n }\r\n\r\n if (user.alert_count > 0 && $scope.userAlertsUsed) {\r\n Users.getUserAlerts({\r\n userID: user.id,\r\n is_public: true\r\n }).then(function (result) {\r\n user.alerts = result;\r\n\r\n if (user.alerts.length > 0) {\r\n user.alerts_concat = \"\";\r\n user.alerts.forEach(function (alert) {\r\n // slightly faster than using .reduce\r\n user.alerts_concat += \", \" + alert.message;\r\n });\r\n }\r\n });\r\n }\r\n\r\n d.resolve(user);\r\n });\r\n /*}\r\n else {\r\n d.resolve($stateParams.user); // just return the user we got in state params\r\n }*/\r\n\r\n return d.promise;\r\n }\r\n\r\n $scope.userPublicAddressCheck = function (label) {\r\n if (label.includes('Public')) {\r\n return ($scope.userPublicAddresses) ? true : false;\r\n } else {\r\n // Not public address, pass\r\n return true;\r\n }\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"portal.lookup\").controller(\"UserLookup\", [\r\n \"$scope\",\r\n \"$state\",\r\n \"$stateParams\",\r\n \"$rootScope\",\r\n \"Complaints\",\r\n \"Enterprise\",\r\n \"EnterprisePublicLookup\",\r\n \"LicenseRequests\",\r\n \"Services\",\r\n \"Users\",\r\n function(\r\n $scope,\r\n $state,\r\n $stateParams,\r\n $rootScope,\r\n Complaints,\r\n Enterprise,\r\n EnterprisePublicLookup,\r\n LicenseRequests,\r\n Services,\r\n Users\r\n ) {\r\n $scope.loading = true;\r\n $scope.looking_up = false;\r\n $scope.promises = [];\r\n $scope.parameters = {\r\n enterpriseID: $rootScope.enterpriseID\r\n };\r\n $scope.license_label = \"License\";\r\n $scope.show_search_results = false;\r\n $scope.filters = [];\r\n $scope.search_columns = [];\r\n $scope.search_header_columns = [];\r\n $scope.users = [];\r\n $scope.reverse = false;\r\n\r\n $scope.currentPage;\r\n $scope.numPerPage = 10;\r\n $scope.perPages = [\r\n { id: 10, name: 10 },\r\n { id: 15, name: 15 },\r\n { id: 20, name: 20 },\r\n { id: 25, name: 25 },\r\n { id: 50, name: 50 }\r\n ];\r\n $scope.record_count = 0;\r\n $scope.filterFound = false;\r\n $scope.messages = [\"Please enter a value into one of the filter fields to search.\"];\r\n\r\n //recaptcha vars\r\n $scope.recaptchaMessage = $scope.enterprise.recaptcha_site_key_v3 != null ? \"\" : \"There was an issue loading recaptcha, please try again or contact system administrator.\"; //message to display\r\n\r\n if (!$stateParams.lookup_object) {\r\n $scope.lookup_object = {\r\n enterprise_id: $rootScope.enterpriseID,\r\n records_offset: 0,\r\n records_total: 10,\r\n sort_fields: null,\r\n from_search: true,\r\n recaptcha_passed: $scope.enterprise.recaptcha_enabled ? false : true, //to gatekeep intended function, make true if recaptcha is off, if passed from the base lookup page, will have already checked recaptcha\r\n };\r\n } else {\r\n $scope.lookup_object = $stateParams.lookup_object; // this will contain data like first_name, etc. from base lookup\r\n $scope.lookup_object.enterprise_id = $rootScope.enterpriseID;\r\n if (!$scope.lookup_object.records_offset)\r\n $scope.lookup_object.records_offset = 0;\r\n if (!$scope.lookup_object.records_total)\r\n $scope.lookup_object.records_total = 10;\r\n if (!$scope.lookup_object.sort_fields)\r\n $scope.lookup_object.sort_fields = null;\r\n if (!$scope.lookup_object.sort_fields)\r\n $scope.lookup_object.sort_direciton = \" asc\";\r\n\r\n getCount(search); // state params are not null, first time around, need to get count\r\n }\r\n\r\n $scope.currentState = $state.current.name;\r\n if ($stateParams.priorState) {\r\n $scope.priorState = $stateParams.priorState;\r\n }\r\n\r\n // Make sure we have the enterprise details\r\n if ($rootScope.enterprise != null) {\r\n $scope.enterprise = $rootScope.enterprise;\r\n $scope.loading = false;\r\n } else {\r\n Enterprise.get($scope.parameters).then(function(result) {\r\n $scope.enterprise = result;\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n // Get the entity labels\r\n $scope.userLabel = $scope.enterprise.userLabels[\"USER\"];\r\n $scope.serviceLabel = $scope.enterprise.serviceLabels[\"SERVICE\"];\r\n\r\n // Get the user lookup filters columns\r\n EnterprisePublicLookup.get({\r\n enterpriseId: $rootScope.enterpriseID,\r\n code: \"filter\",\r\n entity_type: \"user\",\r\n }).then(function(result) {\r\n if (result != null) {\r\n result.forEach(function(filter) {\r\n if (filter.alias == \"application_level_id\" || filter.alias == \"certification_level_id\") {\r\n filter.selectShow = \"combined_name\";\r\n } else {\r\n filter.selectShow = \"name\";\r\n }\r\n });\r\n $scope.filters = result;\r\n $scope.filtersAlias = [];\r\n result.forEach(function (filter) {\r\n $scope.filtersAlias.push(filter.alias);\r\n });\r\n $scope.filterFound = $scope.filtersAlias.some(function (name) {\r\n return $scope.lookup_object.hasOwnProperty(name) && $scope.lookup_object[name] && $scope.lookup_object[name] != '';\r\n });\r\n }\r\n });\r\n\r\n // Get the user lookup search columns\r\n EnterprisePublicLookup.get({\r\n enterpriseId: $rootScope.enterpriseID,\r\n code: \"search\",\r\n entity_type: \"user\",\r\n }).then(function(result) {\r\n $scope.search_columns = [];\r\n $scope.search_header_columns = [];\r\n $scope.investigation_columns = [];\r\n $scope.certification_columns = [];\r\n $scope.cert_attribute_columns = [];\r\n $scope.application_columns = [];\r\n $scope.user_services_columns = [];\r\n\r\n if (result != null) {\r\n // we will filter this down further below\r\n $scope.search_columns = result.map(function (c) {\r\n if (c.alias === 'user_id_alert_id') $scope.userAlertsUsed = true;\r\n\r\n return c;\r\n });\r\n\r\n $scope.search_header_columns = $scope.search_columns\r\n .filter(function(c) {\r\n // column may be a header column but not sortable, in that case sort button is removed\r\n return c.sortable;\r\n })\r\n .slice(0, 7); // let's just get the first 7 columns\r\n\r\n $scope.search_columns_singular = $scope.search_columns.filter(\r\n function(c) {\r\n return c.singular_relationship && !c.sortable;\r\n }\r\n );\r\n\r\n $scope.search_columns_investigations = $scope.search_columns.filter(\r\n function(c) {\r\n return (\r\n !c.singular_relationship &&\r\n c.category == \"Investigation\"\r\n );\r\n }\r\n );\r\n\r\n $scope.search_columns_investigations.forEach(function(column) {\r\n // create columns for list directive\r\n $scope.investigation_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone: true\r\n });\r\n });\r\n\r\n $scope.search_columns_applications = result.filter(function(c) {\r\n return (\r\n !c.singular_relationship && c.category == \"Application\"\r\n );\r\n });\r\n\r\n $scope.search_columns_applications.forEach(function(column) {\r\n // create columns for list directive\r\n $scope.application_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone:\r\n column.format_type == \"date\"\r\n ? column.field.toLowerCase() == \"issue_date\" ||\r\n column.field.toLowerCase() ==\r\n \"expiration_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n $scope.search_columns_certifications = result.filter(function (c) {\r\n return (\r\n !c.singular_relationship && c.category == \"Certification List\"\r\n );\r\n });\r\n\r\n $scope.search_columns_certifications.forEach(function (column) {\r\n // create columns for list directive\r\n $scope.certification_columns.push({\r\n label: column.label,\r\n field: column.alias,\r\n type: column.format_type,\r\n revertTimeZone:\r\n column.format_type == \"date\"\r\n ? column.field.toLowerCase() == \"issue_date\" ||\r\n column.field.toLowerCase() ==\r\n \"expiration_date\" || column.field.toLowerCase() == \"initial_issue_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Name\",\r\n field: \"name\",\r\n type: \"string\"\r\n });\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Value\",\r\n field: \"type\",\r\n type: \"string\"\r\n });\r\n // create columns for list directive\r\n $scope.cert_attribute_columns.push({\r\n label: \"Attribute Value\",\r\n field: \"value\",\r\n type: \"string\"\r\n });\r\n\r\n $scope.search_columns_services = result.filter(function(c) {\r\n return (\r\n !c.singular_relationship &&\r\n c.table_name == \"user_services\"\r\n );\r\n });\r\n\r\n $scope.search_columns_services.forEach(function(c) {\r\n $scope.user_services_columns.push({\r\n label: c.label,\r\n field: c.alias,\r\n type: c.format_type,\r\n link:\r\n c.field == \"name\"\r\n ? {\r\n // conditionally add link property\r\n state: \"portal.menus.servicelookupdetail\",\r\n params: [\r\n {\r\n name: \"id\",\r\n field: \"id\"\r\n },\r\n {\r\n name: \"priorState\",\r\n field: \"priorState\"\r\n },\r\n {\r\n name: \"lookup_object\",\r\n field: \"lookup_object\"\r\n }\r\n ]\r\n }\r\n : undefined,\r\n revertTimeZone:\r\n c.format_type == \"date\"\r\n ? c.field.toLowerCase() == \"issue_date\" ||\r\n c.field.toLowerCase() == \"expiration_date\"\r\n ? true\r\n : false\r\n : undefined\r\n });\r\n });\r\n }\r\n });\r\n\r\n function toggleUser(user) {\r\n user.isOpen = !user.isOpen;\r\n if (user.isOpen) {\r\n\r\n // get user alerts if needed\r\n // Turns out this can be set to empty in the UsersController when the alert icon isn't selected. I'm not sure if there's another reason for\r\n // setting it to empty there. So, I'm not going to change that functionality. I'm just going to change it here, because now we allow them\r\n // to show the text of the alerts even if that icon field isn't selected. So, let's just go ahead and check this again.\r\n if (user.alert_count > 0 && $scope.userAlertsUsed) {\r\n Users.getUserAlerts({ userID: user.id, is_public: true }).then(\r\n function(result) {\r\n user.alerts = result;\r\n\r\n if (user.alerts != null && user.alerts.length > 0) {\r\n user.alerts_concat = \"\";\r\n user.alerts.forEach(function(alert) {\r\n // slightly faster than using .reduce\r\n user.alerts_concat += \", \" + alert.message;\r\n });\r\n }\r\n }\r\n );\r\n }\r\n\r\n // grab user grid data\r\n if (\r\n $scope.search_columns_applications.length > 0 &&\r\n !user.applications\r\n ) {\r\n user.applications_list_loading = true;\r\n LicenseRequests.getByUserID(\r\n user.id,\r\n false,\r\n $rootScope.enterpriseID\r\n ).then(function(result) {\r\n user.applications = result;\r\n user.applications_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.search_columns_certifications.length > 0 &&\r\n !user.certifications\r\n ) {\r\n user.certifications_list_loading = true;\r\n Users.getUserCertifications(\r\n user.id,\r\n false,\r\n $rootScope.enterpriseID\r\n ).then(function (result) {\r\n user.certifications = result;\r\n user.certifications_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.search_columns_investigations.length > 0 &&\r\n !user.investigations\r\n ) {\r\n user.investigations_list_loading = true;\r\n Complaints.getByUserID(\r\n user.id,\r\n false,\r\n $rootScope.enterpriseID\r\n ).then(function(result) {\r\n user.investigations = result;\r\n user.investigations_list_loading = false;\r\n });\r\n }\r\n\r\n if (\r\n $scope.search_columns_services.length > 0 &&\r\n !user.services\r\n ) {\r\n user.services_list_loading = true;\r\n Services.getByUserID(\r\n user.id,\r\n false,\r\n $rootScope.enterpriseID\r\n ).then(function(result) {\r\n user.services = result.map(function(service) {\r\n service.priorState = $state.current.name;\r\n service.lookup_object = $scope.lookup_object;\r\n return service;\r\n });\r\n user.services_list_loading = false;\r\n });\r\n }\r\n }\r\n }\r\n\r\n $scope.toggleUser = toggleUser;\r\n\r\n function getCount(search) {\r\n $scope.looking_up = true;\r\n Users.getUserLookupCount($scope.lookup_object).then(function (\r\n result\r\n ) {\r\n $scope.record_count = result;\r\n if (search) {\r\n search();\r\n } else {\r\n $scope.looking_up = false;\r\n }\r\n });\r\n }\r\n\r\n $scope.getCount = getCount;\r\n\r\n function search() {\r\n $scope.looking_up = true;\r\n Users.publicLookupUser($scope.lookup_object).then(function(result) {\r\n if (result == null) {\r\n $scope.looking_up = false;\r\n $scope.show_search_results = true;\r\n\r\n return false;\r\n }\r\n\r\n $scope.include_suffix = false;\r\n $scope.include_middle = false;\r\n\r\n $scope.search_columns.forEach(function (s) {\r\n if (s.alias == 'suffix') {\r\n $scope.include_suffix = true;\r\n }\r\n if (s.alias == 'middle_name') {\r\n $scope.include_middle = true;\r\n }\r\n }); \r\n\r\n $scope.users = result.map(function(user) {\r\n\r\n user['header_name'] = user.last_name;\r\n if ($scope.include_suffix && user.suffix != '' && user.suffix != null) {\r\n user['header_name'] = user['header_name'] + ' ' + user.suffix;\r\n }\r\n\r\n user['header_name'] = user['header_name'] + ', ' + user.first_name;\r\n\r\n if ($scope.include_middle && user.middle_name != '' && user.middle_name != null) {\r\n user['header_name'] = user['header_name'] + ' ' + user.middle_name;\r\n }\r\n \r\n user.isOpen = false;\r\n return user;\r\n });\r\n\r\n $scope.looking_up = false;\r\n $scope.show_search_results = true;\r\n });\r\n }\r\n\r\n $scope.search = search;\r\n\r\n $scope.recaptchaSubmit = function () {\r\n $scope.looking_up = true;\r\n if ($scope.enterprise.recaptcha_enabled && $scope.lookup_object.recaptcha_passed != true) {\r\n if ($scope.enterprise.recaptcha_site_key_v3 != null) {\r\n grecaptcha.ready(function () {\r\n try {\r\n grecaptcha.execute($scope.enterprise.recaptcha_site_key_v3, { action: 'publicUserLookup' }).then(function (token) { //execute returns a token\r\n return Enterprise.getRecaptchaResponse(\"publicUserLookup\", token) // send action, token, score to pass over to server for validation, returns a response object\r\n }).then(function (response) { // take the response and update variables\r\n if (response.success == false) {\r\n $scope.recaptchaMessage = 'Recaptcha Error: ' + response.error;\r\n $scope.looking_up = false;\r\n } else {\r\n $scope.recaptchaMessage = \"\";\r\n };\r\n }).then(function () {\r\n if ($scope.recaptchaMessage == \"\") {\r\n $scope.getCount(search); //put function here if passed to continue normal \"submit\" is recaptcha passed\r\n } else {\r\n $scope.$apply(); //update dom so error message displays if recaptcha failed\r\n };\r\n })\r\n } catch (error) {\r\n $scope.recaptchaMessage = \"There was an issue loading recaptcha, please try again or contact system administrator.\";\r\n $scope.looking_up = false;\r\n }\r\n });\r\n } else {\r\n return;\r\n }\r\n } else {\r\n $scope.getCount(search); //put function here to continue normal \"submit\" if recaptcha is turned off\r\n };\r\n };\r\n\r\n\r\n function clearFilter() {\r\n $scope.filters.forEach(function(filter) {\r\n delete $scope.lookup_object[filter.alias];\r\n });\r\n\r\n $scope.users = [];\r\n $scope.record_count = 0;\r\n }\r\n\r\n $scope.clearFilter = clearFilter;\r\n\r\n function sort(column) {\r\n $scope.reverse = !$scope.reverse;\r\n $scope.lookup_object.sort_fields = column.alias;\r\n $scope.lookup_object.sort_direction = $scope.reverse\r\n ? \" asc\"\r\n : \"desc\";\r\n $scope.search();\r\n }\r\n\r\n $scope.sort = sort;\r\n\r\n $scope.determineClasses = function(index, length) {\r\n var classes = \"\";\r\n\r\n var value = Math.floor(12 / length);\r\n var mod = 12 % length;\r\n if (index < mod) {\r\n value += 1;\r\n }\r\n classes = \"col-xs-\" + value;\r\n\r\n return classes;\r\n };\r\n\r\n $scope.setCurrentPage = function(page) {\r\n $scope.lookup_object.records_offset = page * $scope.numPerPage;\r\n $scope.search();\r\n $scope.currentPage = angular.copy($scope.pages[page]);\r\n };\r\n\r\n $scope.setNumPerPage = function(numPerPage) {\r\n $scope.numPerPage = numPerPage;\r\n $scope.lookup_object.records_total = numPerPage;\r\n $scope.setPages($scope.record_count);\r\n $scope.search();\r\n };\r\n\r\n $scope.numOfPages = function(length) {\r\n return Math.ceil(length / $scope.numPerPage) - 1;\r\n };\r\n\r\n $scope.setPages = function(length) {\r\n $scope.pages = [];\r\n\r\n if (length > 0) {\r\n var i = 0;\r\n for (i = 0; i <= $scope.numOfPages(length); i++) {\r\n $scope.pages.push({ id: i, name: i + 1 });\r\n }\r\n } else {\r\n $scope.pages.push({ id: 0, name: 0 });\r\n }\r\n\r\n $scope.lookup_object.records_offset = 0;\r\n $scope.currentPage = angular.copy($scope.pages[0]);\r\n };\r\n\r\n $scope.$watch(\"record_count\", function(length) {\r\n $scope.setPages(length);\r\n });\r\n\r\n // Ensure there is a filter with a value in the lookup\r\n $scope.$watch(\"lookup_object\", function () {\r\n if ($scope.filtersAlias && $scope.filtersAlias.length > 0) {\r\n $scope.filterFound = $scope.filtersAlias.some(function (name) {\r\n return $scope.lookup_object.hasOwnProperty(name) && $scope.lookup_object[name] && $scope.lookup_object[name] != '';\r\n });\r\n }\r\n }, true);\r\n\r\n $scope.$watch(\"enterprise\", function () {\r\n Enterprise.getEnterpriseUserPublicAddresses().then(function (show) {\r\n if (show) {\r\n $scope.userPublicAddresses = true;\r\n } else {\r\n $scope.userPublicAddresses = false;\r\n }\r\n });\r\n });\r\n\r\n $scope.userPublicAddressCheck = function (label) {\r\n if (label.includes('Public')) {\r\n return ($scope.userPublicAddresses) ? true : false;\r\n } else {\r\n // Not public address, pass\r\n return true;\r\n }\r\n };\r\n }\r\n]);","'use strict';\r\n\r\nangular.module('portal.react')\r\n .controller('PortalApplicationsCheckout2', ['ngReactBridge', '$scope',\r\n /**\r\n * @param {any} ngReactBridge\r\n * @param {Record} $scope\r\n */\r\n function (ngReactBridge, $scope) {\r\n var resource = \"imagetrend-lms-portal\";\r\n var basename = \"/\";\r\n\r\n $scope.reactReady = false;\r\n ngReactBridge.initializeAsync(resource, basename).then(function () {\r\n $scope.reactReady = true;\r\n $scope.$apply();\r\n }).catch(function (err) {\r\n console.error(\"Failed to initialize\", err);\r\n $scope.reactError = true;\r\n $scope.$apply();\r\n });\r\n }])\r\n .directive(\"applicationCheckoutPage\", [\"ngReactBridge\", function (ngReactBridge) {\r\n var basename = \"/\";\r\n var portal = true;\r\n var renderFunc = imagetrend.lms.portal.renderPortalApp;\r\n var cleanupFunc = imagetrend.lms.portal.cleanupPortalApp;\r\n return ngReactBridge.createNgReactDirective(basename, portal, renderFunc, cleanupFunc);\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.react')\r\n .controller('PortalEducation', ['ngReactBridge', '$scope',\r\n /**\r\n * @param {any} ngReactBridge\r\n * @param {Record} $scope\r\n */\r\n function (ngReactBridge, $scope) {\r\n var resource = \"imagetrend-lms-portal\";\r\n var basename = \"/\";\r\n\r\n $scope.reactReady = false;\r\n ngReactBridge.initializeAsync(resource, basename).then(function () {\r\n $scope.reactReady = true;\r\n $scope.$apply();\r\n }).catch(function (err) {\r\n console.error(\"Failed to initialize\", err);\r\n $scope.reactError = true;\r\n $scope.$apply();\r\n });\r\n }])\r\n .directive(\"educationModule\", [\"ngReactBridge\", function (ngReactBridge) {\r\n var basename = \"/\";\r\n var portal = true;\r\n var renderFunc = imagetrend.lms.portal.renderPortalApp;\r\n var cleanupFunc = imagetrend.lms.portal.cleanupPortalApp;\r\n return ngReactBridge.createNgReactDirective(basename, portal, renderFunc, cleanupFunc);\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.react')\r\n .controller('PortalExams', ['ngReactBridge', '$scope',\r\n /**\r\n * @param {any} ngReactBridge\r\n * @param {Record} $scope\r\n */\r\n function (ngReactBridge, $scope) {\r\n var resource = \"imagetrend-lms-portal\";\r\n var basename = \"/\";\r\n\r\n $scope.reactReady = false;\r\n ngReactBridge.initializeAsync(resource, basename).then(function () {\r\n $scope.reactReady = true;\r\n $scope.$apply();\r\n }).catch(function (err) {\r\n console.error(\"Failed to initialize\", err);\r\n $scope.reactError = true;\r\n $scope.$apply();\r\n });\r\n }])\r\n .directive(\"examModule\", [\"ngReactBridge\", function (ngReactBridge) {\r\n var basename = \"/\";\r\n var portal = true;\r\n var renderFunc = imagetrend.lms.portal.renderPortalApp;\r\n var cleanupFunc = imagetrend.lms.portal.cleanupPortalApp;\r\n return ngReactBridge.createNgReactDirective(basename, portal, renderFunc, cleanupFunc);\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.react')\r\n .controller('PortalInvestigationForm', ['ngReactBridge', '$scope',\r\n /**\r\n * @param {any} ngReactBridge\r\n * @param {Record} $scope\r\n */\r\n function (ngReactBridge, $scope) {\r\n var resource = \"imagetrend-lms-portal\";\r\n var basename = \"/\";\r\n\r\n $scope.reactReady = false;\r\n ngReactBridge.initializeAsync(resource, basename).then(function () {\r\n $scope.reactReady = true;\r\n $scope.$apply();\r\n }).catch(function (err) {\r\n console.error(\"Failed to initialize\", err);\r\n $scope.reactError = true;\r\n $scope.$apply();\r\n });\r\n }])\r\n .directive(\"investigationForm\", [\"ngReactBridge\", function (ngReactBridge) {\r\n var basename = \"/\";\r\n var portal = true;\r\n var renderFunc = imagetrend.lms.portal.renderPortalApp;\r\n var cleanupFunc = imagetrend.lms.portal.cleanupPortalApp;\r\n return ngReactBridge.createNgReactDirective(basename, portal, renderFunc, cleanupFunc);\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.react')\r\n .controller('PortalMyAccount', ['ngReactBridge', '$scope',\r\n /**\r\n * @param {any} ngReactBridge\r\n * @param {Record} $scope\r\n */\r\n function (ngReactBridge, $scope) {\r\n var resource = \"imagetrend-lms-portal\";\r\n var basename = \"/\";\r\n\r\n $scope.reactReady = false;\r\n ngReactBridge.initializeAsync(resource, basename).then(function () {\r\n $scope.reactReady = true;\r\n $scope.$apply();\r\n }).catch(function (err) {\r\n console.error(\"Failed to initialize\", err);\r\n $scope.reactError = true;\r\n $scope.$apply();\r\n });\r\n }])\r\n .directive(\"myAccount\", [\"ngReactBridge\", function (ngReactBridge) {\r\n var basename = \"/\";\r\n var portal = true;\r\n var renderFunc = imagetrend.lms.portal.renderPortalApp;\r\n var cleanupFunc = imagetrend.lms.portal.cleanupPortalApp;\r\n return ngReactBridge.createNgReactDirective(basename, portal, renderFunc, cleanupFunc);\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.react')\r\n .controller('PortalClinicians', ['ngReactBridge', '$scope',\r\n /**\r\n * @param {any} ngReactBridge\r\n * @param {Record} $scope\r\n */\r\n function (ngReactBridge, $scope) {\r\n var resource = \"imagetrend-lms-portal\";\r\n var basename = \"/\";\r\n\r\n $scope.reactReady = false;\r\n ngReactBridge.initializeAsync(resource, basename).then(function () {\r\n $scope.reactReady = true;\r\n $scope.$apply();\r\n }).catch(function (err) {\r\n console.error(\"Failed to initialize\", err);\r\n $scope.reactError = true;\r\n $scope.$apply();\r\n });\r\n }])\r\n .directive(\"cliniciansImport\", [\"ngReactBridge\", function (ngReactBridge) {\r\n var basename = \"/\";\r\n var portal = true;\r\n var renderFunc = imagetrend.lms.portal.renderPortalApp;\r\n var cleanupFunc = imagetrend.lms.portal.cleanupPortalApp;\r\n return ngReactBridge.createNgReactDirective(basename, portal, renderFunc, cleanupFunc);\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('portal.services')\r\n .controller('PortalServiceInspections', ['$scope', 'IPInspections', '$rootScope', '$state', function ($scope, IPInspections, $rootScope, $state) {\r\n $scope.resetService();\r\n $scope.bulkActionItems = [];\r\n $scope.assigning = false;\r\n\r\n $scope.payInspectionFees = function (bulkActionItems) {\r\n $scope.assigning = true;\r\n\r\n IPInspections.bulkAction(bulkActionItems, null, 'fee').then(function () {\r\n $state.go('portal.menus.checkoutlist');\r\n })\r\n }\r\n\r\n $scope.columns = [\r\n {\r\n label: 'Service/Vehicle',\r\n field: 'name',\r\n hideAction: 'checklist.payment_handled',\r\n document: {\r\n id: 'checklist.document.id',\r\n code: 'checklist.document.code',\r\n url: $rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument'\r\n },\r\n info: [\r\n {\r\n label: 'Unit Number',\r\n field: 'unit_number'\r\n },\r\n {\r\n label: 'Call Sign',\r\n field: 'call_sign'\r\n }\r\n ]\r\n },\r\n {\r\n label: 'Number',\r\n field: 'number'\r\n },\r\n {\r\n label: 'Date',\r\n field: 'inspection_date',\r\n type: 'datetime',\r\n dateTimeFlag: 'date_time_set'\r\n },\r\n {\r\n label: 'Total Fee',\r\n field: 'total_fee',\r\n type: 'money'\r\n },\r\n {\r\n label: 'Deficiencies',\r\n field: 'checklist.deficiencies_fail',\r\n type: 'deficiency_total'\r\n },\r\n {\r\n label: 'Status',\r\n field: 'status.name'\r\n }\r\n ];\r\n\r\n $scope.filters = [\r\n {\r\n name: 'Status',\r\n field: 'status_id',\r\n service: 'IPStatuses'\r\n }\r\n ];\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.services')\r\n .controller('PortalService', ['$scope', '$stateParams', 'Services', '$state', function ($scope, $stateParams, Services, $state) {\r\n $scope.masterService = $stateParams.service;\r\n $scope.service = $stateParams.service;\r\n $scope.serviceID = $stateParams.id;\r\n $scope.serviceLoading = true;\r\n\r\n $scope.setMasterService = function (service) {\r\n $scope.masterService = service;\r\n $scope.service = angular.copy($scope.masterService);\r\n }\r\n\r\n $scope.resetService = function () {\r\n if ($scope.masterService == null) {\r\n $scope.masterService = {};\r\n }\r\n $scope.service = angular.copy($scope.masterService);\r\n }\r\n\r\n $scope.getService = function () {\r\n $scope.serviceLoading = true;\r\n\r\n Services.getByID($stateParams.id).then(function (service) {\r\n $scope.serviceLoading = false;\r\n $scope.setMasterService(service);\r\n })\r\n }\r\n \r\n if ($stateParams.id != null) {\r\n $scope.getService();\r\n }\r\n else {\r\n $state.go('portal.menus.denied');\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('portal.react')\r\n .controller('PortalVouchers', ['ngReactBridge', '$scope',\r\n /**\r\n * @param {any} ngReactBridge\r\n * @param {Record} $scope\r\n */\r\n function (ngReactBridge, $scope) {\r\n var resource = \"imagetrend-lms-portal\";\r\n var basename = \"/\";\r\n\r\n $scope.reactReady = false;\r\n ngReactBridge.initializeAsync(resource, basename).then(function () {\r\n $scope.reactReady = true;\r\n $scope.$apply();\r\n }).catch(function (err) {\r\n console.error(\"Failed to initialize\", err);\r\n $scope.reactError = true;\r\n $scope.$apply();\r\n });\r\n }])\r\n .directive(\"vouchers\", [\"ngReactBridge\", function (ngReactBridge) {\r\n var basename = \"/\";\r\n var portal = true;\r\n var renderFunc = imagetrend.lms.portal.renderPortalApp;\r\n var cleanupFunc = imagetrend.lms.portal.cleanupPortalApp;\r\n return ngReactBridge.createNgReactDirective(basename, portal, renderFunc, cleanupFunc);\r\n }])\r\n ;"]}