{"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","window","SessionInformation","UserName","user_name","UserExternalIdentifier","enterprise","$q","$location","Enterprise","CMSSites","gRecaptcha","d","defer","portalAbsUrl","absUrl","portalUrl","url","substring","indexOf","lastIndexOf","loadingEnterprise","enterpriseID","getByAddress","loadingSite","SiteCode","folder","SiteExternalIdentifier","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","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","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","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-24.12.2.1.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 if (account) {\r\n //Walk Me Analytics\r\n if (!window.SessionInformation) { window.SessionInformation = {}; }\r\n window.SessionInformation.UserName = account.user_name;\r\n window.SessionInformation.UserExternalIdentifier = account.id;\r\n }\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 //Walk Me Analytics\r\n if (!window.SessionInformation) { window.SessionInformation = {}; }\r\n window.SessionInformation.SiteCode = enterprise.folder;\r\n window.SessionInformation.SiteExternalIdentifier = enterprise.id;\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 //Walk Me Analytics\r\n if (!window.SessionInformation) { window.SessionInformation = {}; }\r\n window.SessionInformation.SiteCode = enterprise.folder;\r\n window.SessionInformation.SiteExternalIdentifier = enterprise.id;\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 }\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',\r\n function ($scope, Cache, $stateParams, $element, $q, $timeout, $modal, $state, $filter, $rootScope, Documents) {\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 $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 = '';\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', function ($scope, $state, $stateParams, $rootScope, $window, EntityEnterpriseFields, Users, Enterprise, IntegrationMethods, Countries, EnterpriseLoginCriteria, Authentication) {\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 && $rootScope.userAccount && $rootScope.userAccount.id) {\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 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 $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\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\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\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 (account) {\r\n //Walk Me Analytics\r\n if (!window.SessionInformation) { window.SessionInformation = {}; }\r\n window.SessionInformation.UserName = account.user_name;\r\n window.SessionInformation.UserExternalIdentifier = account.id;\r\n }\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({ 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\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 ;"]}