{"version":3,"file":"main.js","mappings":"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","names":["RouteNotFoundComponent","_RouteNotFoundComponent","selectors","i0","SettingsService","_SettingsService","autoCompleteGetByKeywordUrl","apiBaseUrl","autocompleteGetByKeywordAndLocationUrl","autocompleteGetByKeywordAndGeolocationUrl","autocompleteLocationUrl","personProfileUrl","placeProfileUrl","searchPlacesByNameProfileUrl","searchPlacesByNameAndLocationProfileUrl","searchPlacesByServiceProfileUrl","searchPlacesByServiceAndLocationProfileUrl","searchPlacesByNameAndGeolocationProfileUrl","searchPlacesByServiceAndGeolocationProfileUrl","searchPeopleByNameProfileUrl","searchPeopleByNameAndLocationProfileUrl","searchPeopleByServiceProfileUrl","searchPeopleByServiceAndLocationProfileUrl","searchPeopleByNameAndGeolocationProfileUrl","searchPeopleByServiceAndGeolocationProfileUrl","searchLocationsByNameUrl","searchLocationsByNameAndLocationUrl","searchLocationsByNameAndGeolocationUrl","searchLocationsByServiceUrl","searchLocationsByServiceAndLocationUrl","searchLocationsByServiceAndGeolocationUrl","totalsByNameUrl","totalsByNameAndLocationUrl","totalsByNameAndGeolocationUrl","totalsByServiceUrl","totalsByServiceAndLocationUrl","totalsByServiceAndGeolocationUrl","reportIncorrectDetailsUrl","defaultPageTitle","searchResultsTitle","noResultsText","keywordsInputPlaceholder","locationInputPlaceholder","consultIconTitle","virtualConsultationTitle","error","genericError","text","class","uiMessageClass","viewAllPeopleText","viewAllPlacesText","viewAllServiceCategoriesText","viewAllServicesText","viewAllSpecialtiesText","seeAllResultsText","useMyLocationText","lookingForMyLocationText","foundMyLocationText","failedMyLocation","all","people","places","serviceCategory","serviceCategories","services","service","specialties","specialty","SeoService","constructor","titleService","document","this","headElement","head","metaDescription","getOrCreateMetaElement","robots","getTitle","setTitle","newTitle","getMetaDescription","getAttribute","setMetaDescription","description","setAttribute","getMetaRobots","setMetaRobots","name","el","querySelector","createElement","appendChild","_SeoService","core","DOCUMENT","factory","RxType","_rxSubject","Subject","_rxObservable","asObservable","rxNext","value","next","rxSubscribe","callback","subscribe","StateRxService","_StateRxService","StateService","_stateRx","BehaviorSubject","undefined","keyPressed","keyCode","escPressed","arrowUpPressed","arrowDownPressed","enterPressed","isComponentLoading","isLoading","hasError","isError","mobileLayoutChanged","isMobile","isMobileLayout","closePopup","findClick","toggleMapSidebar","location","openPopupMap","locations","setSearchQueryParameters","searchParameters","searchQueries","searchQueryParameters","getSearchQueryParameters","saveLastTopSearchResponse","response","lastTopSearchResponse","getLastTopSearchResponse","clearLastTopSearchResponse","saveLastDefaultCategory","defaultCategory","lastDefaultCategory","getLastDefaultCategory","clearLastDefaultCategory","saveLastSearchType","searchType","lastSearchType","getLastSearchType","clearLastSearchType","saveLastSelected","lastSelected","getLastSelected","clearLastSelected","setCustomMessage","message","customMessage","clearCustomMessage","getCustomMessage","_StateService","UiService","_stateService","bindWindowResize","newLayoutIsMobile","onWindowLoad","jQuery","css","scrollToTop","window","scroll","ready","drawCurveSvgHeader","initiateMulticolorDropdown","autocompleteResetDropdownWidth","componentId","autoCompleteWidth","outerWidth","isUsingMyLocation","jqLocationBox","width","w","d","Math","max","html","bindKeyDown","elementSelector","eventHandler","keydown","resize","toggleClass","selector","className","slideToggle","setFocus","focus","getCurrentUrl","href","toggleParentClass","parentSelector","parent","hasClass","element","scrollToAPvsEC","offset","animate","scrollTop","top","click","find","removeClass","addClass","val","trigger","on","attr","_UiService","HomeComponent","_seoService","_uiService","ngOnInit","switchAPxEC","sourceElement","toggleAPxEC","selectorPrefix","_HomeComponent","ctx","RouterHelperService","static","routeType","id","queryParams","baseRoute","appBaseRoute","route","replace","encodeURIComponent","personProfile","placeProfile","RouteUrl","_RouterHelperService","home","searchResults","term","latitude","longitude","serviceCategoryFilter","serviceSelected","specialtySelected","easyClaim","telehealth","distance","distanceKms","affiliatedProvider","affiliatedProviderConsult","sort","myLocationLabel","link","query","ErrorHandlingService","catchThrowError","throwError","friendlyErrorHandler","_ErrorHandlingService","ProfileService","http","_errorHandlingService","getPerson","params","HttpParams","append","get","pipe","map","catchError","getPlace","_ProfileService","FootnoteService","getFootnotes","_footnotes","initPersonFootnotes","person","notes","addFootnote","length","forEach","place","initPlaceFootnotes","indexOf","push","Footnote","getFootnote","index","_FootnoteService","GoogleAnalyticsService","sendNoSearchResultsEvent","dataLayer","event","sendSearchResultsEvent","sendNoAutocompleteResultsEvent","sendNoLocationResultsEvent","sendAutocompleteResultsEvent","sendLocationResultsEvent","hcfLocationDetected","sendPageViewEvent","url","virtualPage","_GoogleAnalyticsService","FootnoteDirective","_el","_footnoteSerivice","ngOnChanges","footNote","footnoteText","nativeElement","innerHTML","_FootnoteDirective","PhoneLinkedWithDescriptionPipe","transform","phoneNumber","trim","phoneNumberNoSpaces","phone","_PhoneLinkedWithDescriptionPipe","pure","PhoneArrayLinkedPipe","Array","linkedPhones","phoneNumbers","_PhoneArrayLinkedPipe","WebAddressPipe","_WebAddressPipe","PlaceDetailComponent","placeDetail","practiceName","placeLink","category","serviceCategoryName","filter","serviceName","_PlaceDetailComponent","PersonServiceCategoryComponent","detailsHidden","numberOfServiceCategories","componentIndex","filteredPlacesByServiceCategory","placeDetails","filteredPlaceDetails","numberOfPlaces","setDetailsVisible","_PersonServiceCategoryComponent","MapService","mapsAPILoader","setMapZoom","userLatLng","closestLatLng","farthestLatLng","currentLat","currentLng","numberOfUniqueLocations","minLocationDistance","maxLocationDistance","latlngbounds","google","maps","LatLngBounds","currentLocation","currentLatLng","LatLng","locationDistance","geometry","spherical","computeDistanceBetween","extend","initialZoom","addListener","zoomChangeBoundsListener","getZoom","setZoom","removeListener","fitBounds","setCenter","setDefaultMap","Geocoder","geocode","address","results","status","GeocoderStatus","OK","getLocationFromAddress","load","then","geocoder","Observable","observer","loc","lat","lng","first","toPromise","_MapService","MarkerExtensionDirective","_wrapper","_mapService","_router","data","_locations","setupMap","resetZoom","marker","_markers","setMap","getNativeMap","setOptions","fullscreenControl","markerClusterer","clearMarkers","infoWindow","InfoWindow","latLng","icon","getIcon","isMultiLocation","locationDetails","Marker","optimized","getIconImage","position","title","label","toString","fontFamily","color","isLabelBlue","fontWeight","setLabel","close","isPopup","infoWindowContent","buildInfoWindow","setContent","open","lastSelectedMarker","lastSelectedlocation","setIcon","theIcon","MarkerClusterer","gridSize","styles","height","textColor","textSize","maxZoom","getLatLng","buildMapIcon","urlString","origin","Point","anchor","labelOrigin","scaledSize","Size","isSelected","adjustLabel","isAffiliatedProvider","isEasyClaim","locationDetail","placeRoute","personRoute","personId","displayName","infoContainer","practiceLink","join","addEventListener","linkClick","apStatus","ecStatus","personLink","innerText","addressContainer","buildString","receptionLocation","suburb","city","postcode","routeLink","preventDefault","navigate","s","addressLine","_MarkerExtensionDirective","MapComponent","_MapComponent","FootnotesComponent","_footnotesService","footnotes","_FootnotesComponent","ReportIncorrectDetails","ReportIncorrectDetailsService","reportIcorrectDetails","serviceUrl","headers","HttpHeaders","post","JSON","stringify","_ReportIncorrectDetailsService","ReportFormComponent","_reportService","EventEmitter","fax","web","email","reportResult","reportType","reportIncorrectDetails","formIsValid","sendReport","reportSubmittedError","reportSubmittedSuccess","selectReportType","_checkBoxCount","optionCheck","reportItem","target","t","itemValue","checked","webAddress","emailAddress","phones","x","_captchaResponse","captchaResolved","captchaResponse","done","tryAgain","_ReportFormComponent","PopupComponent","_subscriptionEscPressed","_subscriptionClosePopup","openPopup","showPopup","ngOnDestroy","unsubscribe","_PopupComponent","PersonProfileComponent","_route","_profileService","_stateRxService","_footnoteService","_gaService","getData","mapExpanded","_subscriptionIsMobileLayout","initialiseVariables","initialiseMap","firstName","lastName","filteredPersonServiceCategoriesByPlace","serviceCategoryNames","i","serviceCategoryHasPlace","personServiceCategoryNamesByPlace","currentPlace","sumLatitude","sumLongitude","isTelehealth","placesCount","isConsultant","mapCenterLatitude","mapCenterLongitude","toggleMap","reportProblem","reportProblemPopupComponent","_PersonProfileComponent","PlaceServiceCategoryComponent","_PlaceServiceCategoryComponent","PersonDetailComponent","nameNoTitle","personName","_PersonDetailComponent","PersonByServiceCategroyComponent","filteredPeopleByServiceCategory","peopleBySerivceCategory","_PersonByServiceCategroyComponent","PlaceProfileComponent","doctors","initialiseTabVariables","filteredPlaceServiceCategoriesByService","filteredPlaceServiceCategoriesByPerson","hasServices","hasPeople","currentServiceCategory","serviceCategoryHasPeople","placeServiceCategoriesByService","placeServiceCategoriesByPerson","numberOfServiceCategoriesByService","numberOfServiceCategoriesByPerson","selectedTab","tabType","p","currentPerson","onTabCLick","_PlaceProfileComponent","FilterModel","Service","ServiceCategory","ProfileTotal","ProfileTotals","Profile","SearchService","getPlaces","pageNumber","pageSize","buildSearchParams","buildProfiles","getPlacesByService","buildServiceSearchParams","getPeopleAndPlacesByService","peopleParams","peopleUrl","placesParams","placesUrl","peopleRequest","placeRequest","forkJoin","getPeopleAndPlaces","stripWildCards","type","profile","split","_SearchService","FilterService","getTotals","getServiceTotals","_FilterService","LocationService","getLocations","searchPeople","getLocationsByService","_LocationService","SearchResultDetailComponent","getSearchResultName","searchResult","detail","searchTypeCssClass","profileCssClass","viewMapClicked","placesForMap","getPersonLocationFromProfile","getPlaceLocationFromProfile","emit","matchingLocations","findIndex","_SearchResultDetailComponent","FilterHelpFormComponent","_FilterHelpFormComponent","SidebarDetailComponent","_SidebarDetailComponent","SidebarComponent","closeMapButtonPressed","closeMapEventEmitter","_SidebarComponent","PopupMapComponent","_subscriptionToggleSidebar","toggleSidebar","showSidebar","closePopupMap","backTo","selectedLocation","locationType","_PopupMapComponent","initialSearchTypeParamName","initialSearchResultsTypeParamName","initialServiceSearchTermParamName","initialServiceCategorySearchTermParamName","initialServiceCategoryFilterTermParamName","SearchResultsComponent","_searchService","_filterService","_locationService","filterType","events","NavigationStart","_subscriptionFindClick","resetSort","_subscriptionOpenPopupMap","_searchSubscription","updatedSearchQueryParameters","initializeSearchParameters","innerWidth","mobileVewSize","serviceCategoryDisplay","mobileMapExpanded","_this","selectedFilterType","serviceDescriptionSelected","isValidSearch","searchTerm","locationTerm","defaultDistanceKms","serviceCategorySearchTerm","serviceSearchTerm","specialtySearchTerm","serviceCategoryFilterTerm","searchResultsType","initSelectedFilterType","initialSearchTerm","initialSearchType","initialServiceSearchTerm","noneToNull","initialServiceCategorySearchTerm","initialServiceCategoryFilterTerm","initialSearchResultsType","setResetAvailable","setSearchTermDisplay","setLatLngFromLocation","initialSortValue","getServiceCategoryFilterData","getDataByService","getFilterData","navigateByUrl","_this2","provideMatchingService","quote","matching","searchTermDisplay","onDistanceUpdate","onDistanceChange","reroute","resetAvailable","initialSpecialtySearchTerm","nextPage","profiles","selectServiceCategorySearchTerm","selectServiceSearchTerm","selectSpecialtySearchTerm","_this3","showMoreResults","profileTotals","setFilterType","resetFilter","unsetService","filterByServiceCategory","_this4","filterByService","getDataScroll","morePeopleExist","morePlacesExist","selectedSort","displayTotals","serviceCategoryTotals","displayServiceCategory","peopleTotals","hasResults","total","placesTotals","setFilterEC","isEasyClaimChecked","setFilterTelehealth","isTelehealthChecked","setFilterAP","isAffiliatedProviderChecked","setFilterAPConsult","isAffiliatedProviderConsulChecked","setFilterDistanceKms","isDistanceKmsChecked","_this5","_this6","sortByAlphabetAscend","a","b","localeCompare","sortByAlphabetDescend","sortByNearestLocation","sortChange","sortRules","concat","searchAttempted","toLowerCase","locationInput","gaEventTerm","toggleSearchFiltersPanel","searchFiltersPanelExpanded","shouldShowSlider","mightBeNone","nullToNone","mightBeNull","urlParams","routeUrl","showFilterHelp","filterHelpPopupComponent","placesForPopupMap","popupMapComponent","toggleServiceCategory","_SearchResultsComponent","AppRoutingModule","_AppRoutingModule","RouterModule","path","component","redirectTo","pathMatch","useHash","FooterComponent","toggle","_FooterComponent","WebApiModel","AutocompleteItem","AutocompleteLocationItem","Phone","Person","Place","Location","LocationDetail","SearchRequest","keywords","AutocompleteUiItem","AutocompleteSearchResponse","request","SearchInputHelperService","autocompleteItemType","People","cssClass","Places","HeaderPeople","HeaderPlaces","HeaderServiceCategories","HeaderServiceDescriptions","ServiceCategories","ServiceDescriptions","HeaderSpecialties","Specialties","NoResults","MyLocation","bindKeypress","which","getAutocompleteRoute","item","getAutocompeteItemType","getRoute","stripSearchTermPrefix","resultArray","getSearchTermPrefix","_SearchInputHelperService","SearchInputService","_helperService","searchRequest","queryString","orderedSpecialtiesResults","orderSpecialties","autocompleteUiItem","buildAutocompleteItem","autocompleteResuts","autoCompleteItem","result1","result2","displayOrder","keyword","uiItem","selected","isHeader","startsWith","allResultsCount","isProfile","isClickable","populateInputWithName","populateSearchTermWithName","highlightName","placeLocation","subName","_SearchInputService","AutoCompleteItemNamePipe","highlightSearchText","highlightSearchTerm","originalText","searchKeywords","escapeRegExp","re","RegExp","found","match","str","_AutoCompleteItemNamePipe","AutocompleteComponent","renderer","_expectingData","hideAutoComplete","hideProgress","clearTimeout","_getDataTimeout","_inputInFocus","_selectedAutocompleteItem","autoCompleteData","selectedItem","onAutocompleteItemClick","_inputDelay","autocompleteSettings","inputDelay","_inputMinChar","inputMinChar","inputPlaceholder","initAutocomplete","autocompleteResetPosition","localAutocompleteData","inputText","onTextInput","onInput","getDataWithDelay","setTimeout","onGetData","searchInput","selectedType","onAutocompleteItemSelected","onAutocompleteItemHover","onInputFocus","onFocus","onInputBlur","giveInputFocus","autocompleteInput","resetInputValue","_AutocompleteComponent","MulticolorDropdownComponent","_MulticolorDropdownComponent","SearchInputComponent","_location","onPopState","pathname","onHomeClick","onKeywordsGetData","e","NavigationEnd","keywordsAutocompleteComponent","onWindowResize","_keywordInput","onAutocompleteKeywordSelected","onFindClick","_defaultCategory","_locationInput","_myLocationLat","_myLocationLng","usingMyLocation","lookingForLocation","locationAutocompleteComponent","onAutocompleteLocationSelected","getMyLocation","isSavingTopResult","saving","myLocationFound","topResult","selectedResult","keywordAutocompleteData","previousSelected","onAutocompleteSkipped","onMyLocationClick","onKeywordsInput","keywordInput","doKeywordLookup","onLocationInput","showMyLocationOption","onLocationGetData","doLocationLookup","onKeywordsInputFocus","onLocationInputFocus","navigator","geolocation","myLocationUiItem","buildCustomAutocompleteUiItem","locationAutocompleteData","storeResult","keywordLookup","noDataUiItem","locationLookup","itemText","currentPosition","getCurrentPosition","coords","locationTypes","getLocationAddress","setLocationNotFound","long_name","_this7","latlng","filteredAddress","_this8","result","types","some","filteredResult","address_components","passedAddressComponent","options","enableHighAccuracy","maximumAge","Promise","resolve","reject","Error","input","_SearchInputComponent","BannerTypes","BannerLocations","BannerComponent","_elementRef","_domSanitizer","Information","All","customMessageSubscription","displayMessage","body","maxLength","wordBoundaryIdx","substring","search","bannerType","Survey","bannerLocation","bannerOrigText","bannerText","safeHtml","isShown","currentPageType","routerSubscription","Results","Home","ngAfterViewChecked","aNotification","spNotification","spEllipsis","onclick","style","display","bypassSecurityTrustHtml","_BannerComponent","AppComponent","isHome","showMessage","errorMessage","messageText","messageBoxClass","testNotificiationParam","URLSearchParams","_gtmNotification","setInterval","msg","onCloseClick","_AppComponent","AppModule","_AppModule","bootstrap","GoogleMapsAPIWrapper","imports","BrowserModule","FormsModule","HttpClientModule","CommonModule","AgmCoreModule","apiKey","libraries","InfiniteScrollModule","RecaptchaModule","BrowserAnimationsModule","MatSliderModule","NgSelectModule","ReactiveFormsModule","HammerModule","environment","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","err","console"],"sourceRoot":"webpack:///","sources":["./src/app/components/app/route-not-found.component.ts","./src/app/components/app/route-not-found.component.html","./src/environments/environment.prod.ts","./src/app/services/settings.service.ts","./src/app/services/seo.service.ts","./src/app/services/staterx.service.ts","./src/app/services/state.service.ts","./src/app/services/ui.service.ts","./src/app/components/home/home.component.ts","./src/app/components/home/home.component.html","./src/app/services/router-helper.service.ts","./src/app/services/error-handling.service.ts","./src/app/services/profile.service.ts","./src/app/components/footnotes/footnote.service.ts","./src/app/services/google-analytics.service.ts","./src/app/components/footnotes/footnote.directive.ts","./src/app/pipes/string-format.pipe.ts","./src/app/components/profile/person/place-detail.component.html","./src/app/components/profile/person/place-detail.component.ts","./src/app/components/profile/person/person-service-category.component.html","./src/app/components/profile/person/person-service-category.component.ts","./src/app/components/maps/healthcarefinder-map.service.ts","./src/app/components/maps/marker-extension.directive.ts","./src/app/components/maps/healthcarefinder-map.component.ts","./src/app/components/maps/healthcarefinder-map.component.html","./src/app/components/footnotes/footnotes.component.html","./src/app/components/footnotes/footnotes.component.ts","./src/app/components/report-incorrect-details/report-incorrect-details.model.ts","./src/app/components/report-incorrect-details/report-incorrect-details.service.ts","./src/app/components/report-incorrect-details/report-form.component.html","./src/app/components/report-incorrect-details/report-form.component.ts","./src/app/components/popup/popup.component.ts","./src/app/components/popup/popup.component.html","./src/app/components/profile/person/person-profile.component.html","./src/app/components/profile/person/person-profile.component.ts","./src/app/components/profile/place/place-service-category.component.html","./src/app/components/profile/place/place-service-category.component.ts","./src/app/components/profile/place/person-detail.component.html","./src/app/components/profile/place/person-detail.component.ts","./src/app/components/profile/place/person-by-service-category.component.html","./src/app/components/profile/place/person-by-service-category.component.ts","./src/app/components/profile/place/place-profile.component.html","./src/app/components/profile/place/place-profile.component.ts","./src/app/models/filter.model.ts","./src/app/models/search.model.ts","./src/app/services/search.service.ts","./src/app/services/filter.service.ts","./src/app/services/location.service.ts","./src/app/components/search-results/search-result-detail.component.html","./src/app/components/search-results/search-result-detail.component.ts","./src/app/components/search-results/filter-help-form.component.ts","./src/app/components/search-results/filter-help-form.component.html","./src/app/components/maps/sidebar/sidebar-detail.component.html","./src/app/components/maps/sidebar/sidebar-detail.component.ts","./src/app/components/maps/sidebar/sidebar.component.html","./src/app/components/maps/sidebar/sidebar.component.ts","./src/app/components/maps/popup-map/popup-map.component.html","./src/app/components/maps/popup-map/popup-map.component.ts","./src/app/components/search-results/search-results.component.html","./src/app/components/search-results/search-results.component.ts","./src/app/app-routing.module.ts","./src/app/components/app/footer.component.ts","./src/app/components/app/footer.component.html","./src/app/models/web-api.model.ts","./src/app/components/search-input/search-input.model.ts","./src/app/components/search-input/search-input-helper.service.ts","./src/app/components/search-input/search-input.service.ts","./src/app/pipes/autocomplete.pipe.ts","./src/app/components/search-input/autocomplete.component.html","./src/app/components/search-input/autocomplete.component.ts","./src/app/components/search-input/multicolor-dropdown.component.ts","./src/app/components/search-input/multicolor-dropdown.component.html","./src/app/components/search-input/search-input.component.ts","./src/app/components/search-input/search-input.component.html","./src/app/components/banner/banner.component.ts","./src/app/components/banner/banner.component.html","./src/app/components/app/app.component.html","./src/app/components/app/app.component.ts","./src/app/app.module.ts","./src/main.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'hcf-not-found',\r\n templateUrl: './route-not-found.component.html'\r\n})\r\nexport class RouteNotFoundComponent { }\r\n","

Page not found

","export const environment = {\r\n production: true,\r\n api_url: '/api',\r\n apiKey: 'AIzaSyD74wiUgCLgLc-iffEXz3f_IJF-P-qHDiI' // for AgmCoreModule\r\n};\r\n","import { environment } from '../../environments/environment';\r\n\r\nexport class SettingsService {\r\n\r\n static apiBaseUrl = environment.api_url;\r\n\r\n static api = {\r\n autoCompleteGetByKeywordUrl: SettingsService.apiBaseUrl + '/Autocomplete/Get',\r\n autocompleteGetByKeywordAndLocationUrl: SettingsService.apiBaseUrl + '/Autocomplete/GetByLocation/',\r\n autocompleteGetByKeywordAndGeolocationUrl: SettingsService.apiBaseUrl + '/Autocomplete/GetByGeolocation/',\r\n autocompleteLocationUrl: SettingsService.apiBaseUrl + '/AutocompleteLocation/',\r\n personProfileUrl: SettingsService.apiBaseUrl + '/People/GetById',\r\n placeProfileUrl: SettingsService.apiBaseUrl + '/Places/GetById',\r\n\r\n searchPlacesByNameProfileUrl: SettingsService.apiBaseUrl + '/Places/GetByName',\r\n searchPlacesByNameAndLocationProfileUrl: SettingsService.apiBaseUrl + '/Places/GetByNameAndLocation',\r\n searchPlacesByServiceProfileUrl: SettingsService.apiBaseUrl + '/Places/GetByService',\r\n searchPlacesByServiceAndLocationProfileUrl: SettingsService.apiBaseUrl + '/Places/GetByServiceAndLocation',\r\n searchPlacesByNameAndGeolocationProfileUrl: SettingsService.apiBaseUrl + '/Places/GetByNameAndGeolocation',\r\n searchPlacesByServiceAndGeolocationProfileUrl: SettingsService.apiBaseUrl + '/Places/GetByServiceAndGeolocation',\r\n\r\n searchPeopleByNameProfileUrl: SettingsService.apiBaseUrl + '/People/GetByName',\r\n searchPeopleByNameAndLocationProfileUrl: SettingsService.apiBaseUrl + '/People/GetByNameAndLocation',\r\n searchPeopleByServiceProfileUrl: SettingsService.apiBaseUrl + '/People/GetByService',\r\n searchPeopleByServiceAndLocationProfileUrl: SettingsService.apiBaseUrl + '/People/GetByServiceAndLocation',\r\n searchPeopleByNameAndGeolocationProfileUrl: SettingsService.apiBaseUrl + '/People/GetByNameAndGeolocation',\r\n searchPeopleByServiceAndGeolocationProfileUrl: SettingsService.apiBaseUrl + '/People/GetByServiceAndGeolocation',\r\n\r\n searchLocationsByNameUrl: SettingsService.apiBaseUrl + '/Locations/GetByName',\r\n searchLocationsByNameAndLocationUrl: SettingsService.apiBaseUrl + '/Locations/GetByNameAndLocation',\r\n searchLocationsByNameAndGeolocationUrl: SettingsService.apiBaseUrl + '/Locations/GetByNameAndGeolocation',\r\n searchLocationsByServiceUrl: SettingsService.apiBaseUrl + '/Locations/GetByService',\r\n searchLocationsByServiceAndLocationUrl: SettingsService.apiBaseUrl + '/Locations/GetByServiceAndLocation',\r\n searchLocationsByServiceAndGeolocationUrl: SettingsService.apiBaseUrl + '/Locations/GetByServiceAndGeolocation',\r\n\r\n totalsByNameUrl: SettingsService.apiBaseUrl + '/Totals/GetByName',\r\n totalsByNameAndLocationUrl: SettingsService.apiBaseUrl + '/Totals/GetByNameAndLocation',\r\n totalsByNameAndGeolocationUrl: SettingsService.apiBaseUrl + '/Totals/GetByNameAndGeolocation',\r\n totalsByServiceUrl: SettingsService.apiBaseUrl + '/Totals/GetByService',\r\n totalsByServiceAndLocationUrl: SettingsService.apiBaseUrl + '/Totals/GetByServiceAndLocation',\r\n totalsByServiceAndGeolocationUrl: SettingsService.apiBaseUrl + '/Totals/GetByServiceAndGeolocation',\r\n\r\n reportIncorrectDetailsUrl: SettingsService.apiBaseUrl + '/report'\r\n };\r\n\r\n static values = {\r\n defaultPageTitle: 'Healthcare finder - Southern Cross Health Society',\r\n searchResultsTitle: 'Search results',\r\n noResultsText: 'Oops. Looks like we haven\\'t found anything for you.',\r\n keywordsInputPlaceholder: 'Start typing a healthcare provider/service/facility',\r\n locationInputPlaceholder: 'Enter your location',\r\n consultIconTitle: `An Affiliated Provider who performs specialist\r\nconsultations. Please check their profile to ensure they\r\noffer the specific healthcare service or consultation\r\nyou need. If you\\'re unable to find an Affiliated\r\nProvider near you that offers the healthcare service\r\nyou need, please contact us. This is important for\r\nAffiliated Provider only healthcare services.`,\r\n virtualConsultationTitle: `An Affiliated Provider who performs specialist\r\ninitial and follow-up consultations via telehealth.\r\nA telehealth consultation is the use of video or phone\r\nto deliver healthcare consultations when Southern Cross\r\npatients and Affiliated Providers are in different\r\nphysical locations and when no physical examination is\r\nrequired. Please ensure that you have a good internet\r\nconnection and are in a quiet, private place. The\r\nAffiliated Provider will direct you further on how to\r\nconduct the telehealth consultation.`\r\n };\r\n\r\n static uiMessageClass = {\r\n error: 'error'\r\n };\r\n\r\n static uiMessage = {\r\n genericError: {\r\n text: 'Something went wrong. Please try to reload the page or contact us.',\r\n class: SettingsService.uiMessageClass.error\r\n }\r\n };\r\n\r\n static autoCompleteValues = {\r\n viewAllPeopleText: 'Show all',\r\n viewAllPlacesText: 'Show all',\r\n viewAllServiceCategoriesText: 'Show all',\r\n viewAllServicesText: 'Show all',\r\n viewAllSpecialtiesText: 'Show all',\r\n seeAllResultsText: 'See all results',\r\n noResultsText: 'No results found',\r\n useMyLocationText: 'Use my location',\r\n lookingForMyLocationText: 'Waiting for location...',\r\n foundMyLocationText: 'Using your location',\r\n failedMyLocation: 'Location lookup failed'\r\n };\r\n\r\n static searchResultsType = {\r\n all: 'all', people: 'people', places: 'places', serviceCategory: 'servicecategory',\r\n serviceCategories: 'servicecategories', services: 'servicedescriptions', service: 'services',\r\n specialties: 'specialties', specialty: 'specialty'\r\n };\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Injectable()\r\n\r\nexport class SeoService {\r\n /**\r\n * Angular 2 Title Service\r\n */\r\n private titleService: Title;\r\n /**\r\n * Element of the HTML document\r\n */\r\n private headElement: Element;\r\n /**\r\n * Element of the HTML document\r\n */\r\n private metaDescription: Element;\r\n /**\r\n * Element of the HTML document\r\n */\r\n private robots: Element;\r\n\r\n /**\r\n * Inject the Angular 2 Title Service\r\n */\r\n constructor(titleService: Title, @Inject(DOCUMENT) private document: Document) {\r\n this.titleService = titleService;\r\n\r\n /**\r\n * get the Element\r\n */\r\n this.headElement = this.document.head;\r\n this.metaDescription = this.getOrCreateMetaElement('description');\r\n this.robots = this.getOrCreateMetaElement('robots');\r\n }\r\n\r\n public getTitle(): string {\r\n return this.titleService.getTitle();\r\n }\r\n\r\n public setTitle(newTitle: string) {\r\n this.titleService.setTitle(newTitle);\r\n }\r\n\r\n public getMetaDescription(): string {\r\n return this.metaDescription.getAttribute('content');\r\n }\r\n\r\n public setMetaDescription(description: string) {\r\n this.metaDescription.setAttribute('content', description);\r\n }\r\n\r\n public getMetaRobots(): string {\r\n return this.robots.getAttribute('content');\r\n }\r\n\r\n public setMetaRobots(robots: string) {\r\n this.robots.setAttribute('content', robots);\r\n }\r\n\r\n /**\r\n * get the HTML Element when it is in the markup, or create it.\r\n */\r\n private getOrCreateMetaElement(name: string): Element {\r\n let el: Element;\r\n el = this.document.querySelector('meta[name=' + name + ']');\r\n if (el === null) {\r\n el = this.document.createElement('meta');\r\n el.setAttribute('name', name);\r\n this.headElement.appendChild(el);\r\n }\r\n return el;\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject, Subscription } from 'rxjs';\r\n\r\nimport { WebApiModel } from '../models/web-api.model';\r\n\r\nexport class RxType {\r\n _rxSubject: Subject;\r\n _rxObservable: Observable;\r\n\r\n constructor() {\r\n this._rxSubject = new Subject();\r\n this._rxObservable = this._rxSubject.asObservable();\r\n }\r\n\r\n rxNext(value: T): void {\r\n this._rxSubject.next(value);\r\n }\r\n\r\n rxSubscribe(callback: (n: T) => any): Subscription {\r\n return this._rxObservable.subscribe(callback);\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class StateRxService {\r\n public escPressed = new RxType();\r\n public arrowUpPressed = new RxType();\r\n public arrowDownPressed = new RxType();\r\n public enterPressed = new RxType();\r\n public isLoading = new RxType();\r\n public hasError = new RxType();\r\n public mobileLayoutChanged = new RxType();\r\n public closePopup = new RxType();\r\n public findClick = new RxType();\r\n public toggleMapSidebar = new RxType();\r\n public openPopupMap = new RxType();\r\n public searchQueryParameters = new RxType();\r\n public customMessage = new RxType();\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AutocompleteSearchResponse, AutocompleteUiItem, AutocompleteSelectedItem } from '../components/search-input/search-input.model';\r\nimport { StateRxService as StateRx } from './staterx.service';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class StateService {\r\n // Stores the previous autocomplete results\r\n private static lastTopSearchResponse: AutocompleteUiItem;\r\n private static lastDefaultCategory: string;\r\n private static lastSearchType: string;\r\n private static lastSelected: AutocompleteSelectedItem;\r\n\r\n // Stores the current layout state\r\n public isMobileLayout: boolean = false;\r\n\r\n // Stores the search query parameters\r\n private searchQueries: any;\r\n\r\n // Stores GTM custom message\r\n private customMessage: any;\r\n\r\n public isSavingTopResult = new BehaviorSubject(undefined);\r\n\r\n constructor(\r\n private _stateRx: StateRx) { }\r\n\r\n keyPressed(keyCode: number) {\r\n if (keyCode === 27) {\r\n this._stateRx.escPressed.rxNext(keyCode); // Notify subscribers\r\n }\r\n if (keyCode === 38) {\r\n this._stateRx.arrowUpPressed.rxNext(keyCode);\r\n }\r\n if (keyCode === 40) {\r\n this._stateRx.arrowDownPressed.rxNext(keyCode);\r\n }\r\n if (keyCode === 13) {\r\n this._stateRx.enterPressed.rxNext(keyCode);\r\n }\r\n }\r\n\r\n // Flag indicating if component is loading data.\r\n isComponentLoading(isLoading: boolean) {\r\n this._stateRx.isLoading.rxNext(isLoading);\r\n }\r\n\r\n hasError(isError: boolean) {\r\n this._stateRx.hasError.rxNext(isError);\r\n }\r\n\r\n // Filters layout on the search results page have simpler css if we apply a mobile class to the parent app container.\r\n mobileLayoutChanged(isMobile: boolean) {\r\n this.isMobileLayout = isMobile;\r\n this._stateRx.mobileLayoutChanged.rxNext(isMobile);\r\n }\r\n\r\n // Currently used by 'Report incorrect details' component which is opened in a popup.\r\n closePopup() {\r\n this._stateRx.closePopup.rxNext(true);\r\n }\r\n\r\n findClick() {\r\n this._stateRx.findClick.rxNext(true);\r\n }\r\n\r\n toggleMapSidebar(location: any) {\r\n this._stateRx.toggleMapSidebar.rxNext(location);\r\n }\r\n\r\n openPopupMap(locations: any[]) {\r\n this._stateRx.openPopupMap.rxNext(locations);\r\n }\r\n\r\n // Stores the search query parameters and updates if any changes made\r\n setSearchQueryParameters(searchParameters: any) {\r\n this.searchQueries = searchParameters;\r\n this._stateRx.searchQueryParameters.rxNext(searchParameters);\r\n }\r\n\r\n // Gets the search query parameters\r\n getSearchQueryParameters() {\r\n return this.searchQueries;\r\n }\r\n\r\n /**\r\n * Save the top result from the previous search results for cross component usage\r\n */\r\n saveLastTopSearchResponse(response: AutocompleteUiItem) {\r\n StateService.lastTopSearchResponse = { ...response };\r\n }\r\n\r\n /**\r\n * Retrieve the top result from the previous search results for cross component usage\r\n */\r\n getLastTopSearchResponse() {\r\n return StateService.lastTopSearchResponse\r\n ? { ...StateService.lastTopSearchResponse }\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Clear the previous top search result from autocomplete\r\n */\r\n clearLastTopSearchResponse() {\r\n StateService.lastTopSearchResponse = undefined;\r\n }\r\n\r\n /**\r\n * Save the previous determined default category for cross component usage\r\n */\r\n saveLastDefaultCategory(defaultCategory: string) {\r\n StateService.lastDefaultCategory = defaultCategory;\r\n }\r\n\r\n /**\r\n * Retrieve the default category from the previous search results for cross component usage\r\n */\r\n getLastDefaultCategory() {\r\n return StateService.lastDefaultCategory;\r\n }\r\n\r\n /**\r\n * Clear the previous default category set\r\n */\r\n clearLastDefaultCategory() {\r\n StateService.lastDefaultCategory = undefined;\r\n }\r\n\r\n /**\r\n * Save the previous determined search type for cross component usage\r\n */\r\n saveLastSearchType(searchType: string) {\r\n StateService.lastSearchType = searchType;\r\n }\r\n\r\n /**\r\n * Retrieve the search type from the previous search results for cross component usage\r\n */\r\n getLastSearchType() {\r\n return StateService.lastSearchType;\r\n }\r\n\r\n /**\r\n * Clear the previous search type set\r\n */\r\n clearLastSearchType() {\r\n StateService.lastSearchType = undefined;\r\n }\r\n\r\n /**\r\n * Save the previously selected item for cross component usage\r\n */\r\n saveLastSelected(lastSelected: AutocompleteSelectedItem) {\r\n StateService.lastSelected = { ...lastSelected };\r\n }\r\n\r\n /**\r\n * Retrieve the previously selected item from the previous search results for cross component usage\r\n */\r\n getLastSelected() {\r\n return StateService.lastSelected\r\n ? { ...StateService.lastSelected }\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Clear the previous search type set\r\n */\r\n clearLastSelected() {\r\n StateService.lastSelected = undefined;\r\n }\r\n\r\n // Stores a GTM custom message and updates if it changes\r\n setCustomMessage(message: any) {\r\n this.customMessage = message;\r\n this._stateRx.customMessage.rxNext(message);\r\n }\r\n\r\n // Remove GTM custom message from store\r\n clearCustomMessage() {\r\n this.customMessage = null;\r\n this._stateRx.customMessage.rxNext(null);\r\n }\r\n\r\n // Gets current GTM custom message\r\n getCustomMessage() {\r\n return this.customMessage;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as jQuery from 'jquery';\r\nimport { StateService } from './state.service';\r\n\r\n@Injectable()\r\nexport class UiService {\r\n\r\n constructor(private _stateService: StateService) {\r\n\r\n this._stateService.isMobileLayout = this.isMobile();\r\n\r\n this.bindWindowResize(() => {\r\n const newLayoutIsMobile = this.isMobile();\r\n if (newLayoutIsMobile !== this._stateService.isMobileLayout) {\r\n this._stateService.mobileLayoutChanged(newLayoutIsMobile);\r\n }\r\n });\r\n\r\n this.onWindowLoad();\r\n }\r\n\r\n isMobile(): boolean {\r\n const isMobile = jQuery('#ismobile').css('display') === 'block';\r\n return isMobile;\r\n }\r\n\r\n scrollToTop(): void {\r\n window.scroll(0, 0);\r\n }\r\n\r\n onWindowLoad(): void {\r\n jQuery(document).ready(() => {\r\n this.drawCurveSvgHeader();\r\n this.initiateMulticolorDropdown();\r\n });\r\n }\r\n\r\n /**\r\n * Resets the size of the autocomplete dropdown, it's different size on mobile and deskop,\r\n * also this is called on window.resize.\r\n * @param componentId - Html id of the autocomplete component\r\n */\r\n autocompleteResetDropdownWidth(componentId: string): void {\r\n const jqInputBox = jQuery('#' + componentId + ' input');\r\n let autoCompleteWidth = jqInputBox.outerWidth();\r\n\r\n // Custom width for the keyword input, it has to span the width of the keyword and location inputs.\r\n // In Mobile layout the inputs are stacked in a column.\r\n // The extended dropdown width is only for the non-mobile layout when inputs are side by side.\r\n const isMobile = this.isMobile();\r\n // My location box is shown instead of the location autocomplete when My Location was selected\r\n // Use my-location-container to size the keyword autocomplete box.\r\n const isUsingMyLocation = (jQuery('#location-autocomplete').css('display') === 'none');\r\n if (!isMobile && componentId === 'keywords-autocomplete') {\r\n let jqLocationBox = jQuery('#location-autocomplete input');\r\n if (isUsingMyLocation) {\r\n jqLocationBox = jQuery('#my-location-container');\r\n }\r\n autoCompleteWidth = autoCompleteWidth + jqLocationBox.outerWidth() - 1;\r\n }\r\n jQuery('#' + componentId + ' .input-autocomplete').width(autoCompleteWidth);\r\n }\r\n\r\n /**\r\n * Draws a curved SVG vector below the masthead image\r\n */\r\n drawCurveSvgHeader(): void {\r\n const w = jQuery(window).width();\r\n const d = 11 + Math.max((w - 375) / 825 * 6, 0);\r\n jQuery('#header-svg-curve')\r\n .html('');\r\n }\r\n\r\n /**\r\n * Bind a key down event to a custom event handler\r\n * @param elementSelector - Can be a string like '#someId' or object like document.\r\n * @param eventHandler - Event handling function\r\n */\r\n bindKeyDown(elementSelector: any, eventHandler: (event) => any) {\r\n jQuery(elementSelector).keydown(eventHandler);\r\n }\r\n\r\n bindWindowResize(eventHandler: (event) => any) {\r\n jQuery(window).resize(eventHandler);\r\n }\r\n\r\n toggleClass(selector: string, className: string) {\r\n jQuery(selector).toggleClass(className);\r\n }\r\n\r\n slideToggle(selector: string) {\r\n jQuery(selector).slideToggle();\r\n }\r\n\r\n setFocus(selector: string) {\r\n jQuery(selector).focus();\r\n }\r\n\r\n /**\r\n * Returns current browser url. Used by the report incorrect details function to grab the current url.\r\n */\r\n getCurrentUrl() {\r\n return window.location.href;\r\n }\r\n\r\n toggleParentClass(selector: any, parentSelector: string, className: string) {\r\n jQuery(selector).parent(parentSelector).toggleClass(className);\r\n }\r\n\r\n hasClass(element: any, className: string): boolean {\r\n return jQuery(element).hasClass(className);\r\n }\r\n\r\n /**\r\n * Enables window scroll when user clicks on AP or EC tabs on the home screen in mobile mode.\r\n */\r\n scrollToAPvsEC(): void {\r\n if (jQuery('hcf-app.mobile hcf-home .two-columns').offset() === undefined) {\r\n return;\r\n }\r\n\r\n jQuery('html, body').animate({\r\n scrollTop: jQuery('hcf-app.mobile hcf-home .two-columns').offset().top\r\n }, 1000);\r\n }\r\n\r\n /**\r\n * Plugs in the multicolor dropdown functionality.\r\n */\r\n initiateMulticolorDropdown(): void {\r\n jQuery('.custom-select-box').click(function () {\r\n jQuery(this).toggleClass('open');\r\n jQuery(this).parent().parent().toggleClass('open');\r\n });\r\n\r\n jQuery('.custom-select-box .li').click(function () {\r\n jQuery(this).parent().find('.li').removeClass('select');\r\n jQuery(this).addClass('select');\r\n jQuery(this).parent().parent().find('.selected').text(jQuery(this).text());\r\n jQuery(this).parent().parent().parent().find('input').val(jQuery(this).text());\r\n jQuery(this).parent().parent().trigger('change');\r\n });\r\n\r\n jQuery('#login-select').on('change', () => {\r\n jQuery('#btn-sc-dd-login').attr('href', jQuery('#login-select .ul .li.select').attr('data-url'));\r\n jQuery('#btn-sc-dd-login').removeClass();\r\n jQuery('#btn-sc-dd-login').addClass('btn ' + jQuery('#login-select .ul .li.select').attr('data-btnclass'));\r\n });\r\n }\r\n}\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { SeoService } from '../../services/seo.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { UiService } from '../../services/ui.service';\r\n\r\n@Component({\r\n selector: 'hcf-home',\r\n templateUrl: './home.component.html',\r\n styleUrls: ['./home.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class HomeComponent implements OnInit {\r\n\r\n constructor(private _seoService: SeoService, private _uiService: UiService) { }\r\n\r\n ngOnInit() {\r\n this._seoService.setTitle(SettingsService.values.defaultPageTitle);\r\n }\r\n\r\n switchAPxEC(sourceElement) {\r\n if (this._uiService.hasClass('hcf-app.mobile hcf-home .' + sourceElement + '-providers-header', 'selected')) {\r\n return;\r\n }\r\n this.toggleAPxEC();\r\n }\r\n\r\n toggleAPxEC() {\r\n const selectorPrefix = 'hcf-app.mobile hcf-home';\r\n this._uiService.toggleClass(selectorPrefix + ' .ap-providers-header', 'selected');\r\n this._uiService.toggleClass(selectorPrefix + ' .ec-providers-header', 'selected');\r\n this._uiService.toggleClass(selectorPrefix + ' .ap-providers-content', 'hidden-content');\r\n this._uiService.toggleClass(selectorPrefix + ' .ec-providers-content', 'hidden-content');\r\n this._uiService.scrollToAPvsEC();\r\n }\r\n}\r\n","
\r\n
\r\n

Find a health professional that suits your needs

\r\n

This is for information only and doesn’t confirm coverage under your policy.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Affiliated Providers

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Easy-Claim partners

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
    \r\n
  • Affiliated Providers are doctors, specialists or medical facilities contracted to provide Southern Cross\r\n members with certain healthcare services at agreed prices.
  • \r\n
  • Some healthcare services are 'Affiliated\r\n Provider-only', which means they're only covered by your policy if performed by an Affiliated Provider.\r\n
  • \r\n
\r\n
\r\n
\r\n
    \r\n
  • Easy-Claim partners\r\n provide a convenient way for Southern Cross members to claim for eligible day-to-day healthcare services at\r\n the time of purchase.
  • \r\n
  • Just show your Member card (it's on the app) or mention your number and they’ll do the rest. If your plan\r\n covers the product or service, we'll reimburse the provider directly and you'll only pay any remaining\r\n contribution you're responsible for.
  • \r\n
\r\n
\r\n
\r\n
\r\n","export class RouterHelperService {\r\n\r\n static appBaseRoute = {\r\n home: '',\r\n personProfile: 'person-profile',\r\n placeProfile: 'place-profile',\r\n searchResults: 'search-results',\r\n };\r\n\r\n // Url param string values have to match the names expected by web api\r\n static urlParam = {\r\n id: 'id',\r\n term: 'term',\r\n location: 'location',\r\n searchType: 'type',\r\n defaultCategory: 'defaultCategory',\r\n latitude: 'latitude',\r\n longitude: 'longitude',\r\n serviceCategory: 'serviceCategory',\r\n serviceCategoryFilter: 'serviceCategoryFilter',\r\n serviceSelected: 'serviceSelected',\r\n specialtySelected: 'specialtySelected',\r\n service: 'service',\r\n specialty: 'specialty',\r\n easyClaim: 'easyClaim',\r\n telehealth: 'telehealth',\r\n distance: 'distance',\r\n distanceKms: 'distanceKms',\r\n affiliatedProvider: 'affiliatedProvider',\r\n affiliatedProviderConsult: 'affiliatedProviderConsult',\r\n sort: \"sort\",\r\n myLocationLabel: \"myLocationLabel\"\r\n };\r\n\r\n static routeType = {\r\n home: 'home',\r\n personProfile: 'personProfile',\r\n placeProfile: 'placeProfile',\r\n searchResults: 'searchResults'\r\n };\r\n\r\n static getRoute(routeType: string, id: string, name: string, queryParams: {}): RouteUrl {\r\n\r\n // Add slash, can't add it in appBaseRoute becasue it's used in router configuration\r\n // which doesn't accept a / at the start of the route\r\n const baseRoute = '/' + RouterHelperService.appBaseRoute[routeType];\r\n\r\n let route = [];\r\n\r\n // Remove special characters from the name and replace spaces with hyphens to make it look tidier in th url.\r\n // The name is not used anywhere, it's just to make the urls urer and search engine friendly.\r\n if (name) {\r\n name = name.replace(/[^a-z0-9 ]+/gi, '').replace(/\\s+/g, '-');\r\n name = encodeURIComponent(name);\r\n }\r\n\r\n if (routeType === RouterHelperService.routeType.personProfile || routeType === RouterHelperService.routeType.placeProfile) {\r\n route = (name) ? [baseRoute, id, name] : [baseRoute, id];\r\n } else {\r\n route = [baseRoute];\r\n }\r\n\r\n return (queryParams) ? new RouteUrl(route, queryParams) : new RouteUrl(route, null);\r\n }\r\n}\r\n\r\nexport class RouteUrl {\r\n constructor(public link: any[], public query: {}) { }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { throwError } from 'rxjs';\r\n\r\nimport { StateService } from './state.service';\r\n\r\n@Injectable()\r\nexport class ErrorHandlingService {\r\n constructor(private _stateService: StateService) { }\r\n\r\n /** Http error handler. The 'catch' statement seems to be optional when calling an http service.\r\n * The error will be passed to the calling component and should be handled there.\r\n * Use this method for generic error handling.\r\n */\r\n catchThrowError(error: any) {\r\n\r\n // Add some handling here?\r\n\r\n return throwError(error);\r\n }\r\n\r\n // Notify UI to display a friendly message\r\n friendlyErrorHandler(isError: boolean) {\r\n this._stateService.hasError(isError);\r\n }\r\n}\r\n","import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\nimport { WebApiModel } from '../models/web-api.model';\r\nimport { ErrorHandlingService } from './error-handling.service';\r\nimport { RouterHelperService } from './router-helper.service';\r\nimport { SettingsService } from './settings.service';\r\n\r\n@Injectable()\r\nexport class ProfileService {\r\n constructor(private http: HttpClient, private _errorHandlingService: ErrorHandlingService) { }\r\n\r\n getPerson(id: string): Observable {\r\n let params: HttpParams = new HttpParams();\r\n params = params.append(RouterHelperService.urlParam.id, id);\r\n return this.http\r\n .get(SettingsService.api.personProfileUrl, { params })\r\n .pipe(\r\n map(response => response as WebApiModel.Person) // revisit after angular 7 upgrade\r\n , catchError(this._errorHandlingService.catchThrowError)\r\n );\r\n }\r\n\r\n getPlace(id: string): Observable {\r\n let params: HttpParams = new HttpParams();\r\n params = params.append(RouterHelperService.urlParam.id, id);\r\n return this.http\r\n .get(SettingsService.api.placeProfileUrl, { params })\r\n .pipe(\r\n map(response => response as WebApiModel.Place) // revisit after angular 7 upgrade\r\n , catchError(this._errorHandlingService.catchThrowError)\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { WebApiModel } from '../../models/web-api.model';\r\n\r\n@Injectable()\r\nexport class FootnoteService {\r\n\r\n private _footnotes: string[] = [];\r\n\r\n getFootnotes(): string[] {\r\n return this._footnotes;\r\n }\r\n\r\n /**\r\n * Initialises the person profile footnotes so parent and child components can access them.\r\n * There might be multiple footnotes on the profile page some belong to the person and some to places.\r\n */\r\n initPersonFootnotes(person: WebApiModel.Person): string[] {\r\n this._footnotes = [];\r\n\r\n if (person.notes) {\r\n this.addFootnote(person.notes);\r\n }\r\n\r\n if (person.places && person.places.length > 0) {\r\n person.places.forEach((place) => {\r\n if (place.notes) {\r\n this.addFootnote(place.notes);\r\n }\r\n });\r\n }\r\n\r\n return this._footnotes;\r\n }\r\n\r\n /**\r\n * Initialises place profile footnotes.\r\n */\r\n initPlaceFootnotes(place: WebApiModel.Place): string[] {\r\n this._footnotes = [];\r\n\r\n if (place.notes) {\r\n this.addFootnote(place.notes);\r\n }\r\n\r\n if (place.people && place.people.length > 0) {\r\n place.people.forEach((person) => {\r\n if (person.notes) {\r\n this.addFootnote(person.notes);\r\n }\r\n });\r\n }\r\n\r\n return this._footnotes;\r\n }\r\n\r\n\r\n /**\r\n * Adds a footnote to an array which keeps the state of the footnotes on the current profile page.\r\n */\r\n private addFootnote(text: string) {\r\n\r\n const index = this._footnotes.indexOf(text);\r\n\r\n if (index === -1) {\r\n this._footnotes.push(text);\r\n return new Footnote(this._footnotes.length, text);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a footnote index and text so it can be rendered in the UI.\r\n */\r\n getFootnote(text: string): Footnote {\r\n const index = this._footnotes.indexOf(text);\r\n\r\n if (index > -1) {\r\n return new Footnote(index + 1, text);\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport class Footnote {\r\n constructor(public index: number, public text: string) { }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\ndeclare var dataLayer: any;\r\n\r\n@Injectable()\r\nexport class GoogleAnalyticsService {\r\n constructor() { }\r\n\r\n // Sends a Google Analytics event when no search results are found\r\n // Term could be search term, service description or service category\r\n sendNoSearchResultsEvent(term: string, location: string) {\r\n if (dataLayer) {\r\n dataLayer.push({\r\n 'event': 'hcf-no-search-results',\r\n 'hcf-term': term,\r\n 'hcf-location': location\r\n });\r\n }\r\n }\r\n // Sends a Google Analytics event when search results are found\r\n sendSearchResultsEvent(term: string, location: string) {\r\n if (dataLayer) {\r\n dataLayer.push({\r\n 'event': 'hcf-search-results',\r\n 'hcf-term': term,\r\n 'hcf-location': location\r\n });\r\n }\r\n }\r\n\r\n sendNoAutocompleteResultsEvent(term: string, location: string) {\r\n if (dataLayer) {\r\n dataLayer.push({\r\n 'event': 'hcf-no-autocomplete',\r\n 'hcf-term': term,\r\n 'hcf-location': location\r\n });\r\n }\r\n }\r\n\r\n sendNoLocationResultsEvent(term: string, location: string) {\r\n if (dataLayer) {\r\n dataLayer.push({\r\n 'event': 'hcf-no-location',\r\n 'hcf-term': term,\r\n 'hcf-location': location\r\n });\r\n }\r\n }\r\n\r\n sendAutocompleteResultsEvent(term: string, location: string) {\r\n if (dataLayer) {\r\n dataLayer.push({\r\n 'event': 'hcf-autocomplete',\r\n 'hcf-term': term,\r\n 'hcf-location': location\r\n });\r\n }\r\n }\r\n\r\n sendLocationResultsEvent(term: string, location: string, hcfLocationDetected = false) {\r\n if (dataLayer) {\r\n dataLayer.push({\r\n 'event': 'hcf-location',\r\n 'hcf-term': term,\r\n 'hcf-location': location,\r\n 'hcf-location-detected': hcfLocationDetected\r\n });\r\n }\r\n }\r\n\r\n sendPageViewEvent(url: string) {\r\n if (dataLayer) {\r\n dataLayer.push({\r\n 'event': 'virtualPageView',\r\n 'virtualPage': url\r\n });\r\n }\r\n }\r\n}\r\n","import { Directive, ElementRef, Input, OnChanges } from '@angular/core';\r\n\r\nimport { FootnoteService } from './footnote.service';\r\n\r\n/**\r\n * hcfFootnote directive is used to render element containing a footnote index and text.\r\n */\r\n@Directive({\r\n selector: '[hcfFootnote]'\r\n})\r\nexport class FootnoteDirective implements OnChanges {\r\n\r\n @Input() footnoteText: string;\r\n\r\n constructor(private _el: ElementRef, private _footnoteSerivice: FootnoteService) { }\r\n\r\n ngOnChanges() {\r\n const footNote = this._footnoteSerivice.getFootnote(this.footnoteText);\r\n if (footNote) {\r\n this._el.nativeElement.setAttribute('title', footNote.text);\r\n this._el.nativeElement.innerHTML = footNote.index;\r\n }\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n/**\r\n * Phone with no spaces is needed for the tel link on mobile.\r\n */\r\n@Pipe({ name: 'phoneNoSpaces' })\r\nexport class PhoneNoSpacesPipe implements PipeTransform {\r\n transform(value: string): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const phone = value.trim().replace(/\\s+/g, '-');\r\n\r\n return phone;\r\n }\r\n}\r\n\r\n@Pipe({ name: 'phoneLinkedWithDescription' })\r\nexport class PhoneLinkedWithDescriptionPipe implements PipeTransform {\r\n transform(value: string, description: string): string {\r\n\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const phoneNumber = value.trim();\r\n\r\n description = (description) ? description.trim() : null;\r\n\r\n const phoneNumberNoSpaces = value.replace(/\\s+/g, '-');\r\n\r\n let phone = '';\r\n\r\n if (description) {\r\n phone = `${description}: ${phoneNumber}`;\r\n } else {\r\n phone = `${phoneNumber}`;\r\n }\r\n\r\n return phone;\r\n }\r\n}\r\n\r\n/**\r\n * Render an array of clickable phone numbers. Places have phone numbers coming form web api as an array.\r\n */\r\n@Pipe({ name: 'phoneArrayLinked' })\r\nexport class PhoneArrayLinkedPipe implements PipeTransform {\r\n transform(value: string[]): string {\r\n\r\n if (!(value instanceof Array)) {\r\n return '';\r\n }\r\n\r\n // if array is null or empty then return\r\n if (!value || !value.length) {\r\n return '';\r\n }\r\n\r\n let linkedPhones: string = '';\r\n const phoneNumbers: string[] = value;\r\n\r\n phoneNumbers.forEach((phoneNumber) => {\r\n if (phoneNumber) {\r\n if (linkedPhones !== '') {\r\n linkedPhones += ', '; // add a comma in front if it's not the first number\r\n }\r\n const phoneNumberNoSpaces = phoneNumber.replace(/\\s+/g, '-');\r\n linkedPhones += `${phoneNumber}`;\r\n }\r\n });\r\n\r\n return linkedPhones;\r\n }\r\n}\r\n\r\n@Pipe({ name: 'webAddress' })\r\nexport class WebAddressPipe implements PipeTransform {\r\n transform(value: string): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const webAddress = value.replace('http://', '').replace('https://', '');\r\n\r\n return webAddress;\r\n }\r\n}\r\n","

\r\n \r\n {{placeDetail.practiceName}}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{placeDetail.facilityName}}
\r\n
{{placeDetail.receptionLocation}}
\r\n {{placeDetail.address}}\r\n
{{placeDetail.suburb}}
\r\n
{{placeDetail.city}} {{placeDetail.postcode}}
\r\n
\r\n \r\n
\r\n \r\n
    \r\n
  • \r\n {{service}}\r\n
  • \r\n
\r\n
\r\n","import { Component, Input, OnChanges, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\nimport { RouterHelperService } from '../../../services/router-helper.service';\r\nimport { SettingsService } from '../../../services/settings.service';\r\n\r\n@Component({\r\n selector: 'hcf-place-detail',\r\n templateUrl: './place-detail.component.html',\r\n styleUrls: ['./place-detail.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PlaceDetailComponent implements OnChanges {\r\n\r\n @Input() placeDetail: WebApiModel.Place;\r\n @Input() serviceCategoryName: string;\r\n\r\n placeLink: any[];\r\n services: string[];\r\n settings = SettingsService;\r\n\r\n ngOnChanges() {\r\n const id = this.placeDetail.id;\r\n const routeType = RouterHelperService.routeType.placeProfile;\r\n const route = RouterHelperService.getRoute(routeType, id, this.placeDetail.practiceName, null);\r\n this.placeLink = route.link;\r\n // Get services\r\n this.placeDetail.serviceCategories.forEach((category) => {\r\n if (category.name === this.serviceCategoryName) {\r\n // Filter null or empty\r\n this.services = category.services.filter((serviceName) => { if (serviceName) { return serviceName; } });\r\n }\r\n });\r\n }\r\n}\r\n","
\r\n

\r\n {{serviceCategoryName}} View locations

\r\n
\r\n \r\n
\r\n
","import { Component, Input, OnChanges, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\n\r\n@Component({\r\n selector: 'hcf-person-service-category',\r\n templateUrl: './person-service-category.component.html',\r\n styleUrls: ['./person-service-category.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PersonServiceCategoryComponent implements OnInit, OnChanges {\r\n @Input() serviceCategoryName: string;\r\n @Input() placeDetails: WebApiModel.Place[];\r\n @Input() componentIndex: number;\r\n @Input() numberOfServiceCategories: number;\r\n\r\n filteredPlaceDetails: WebApiModel.Place[];\r\n detailsHidden: boolean = true;\r\n numberOfPlaces: number = 0;\r\n\r\n ngOnInit(): void {\r\n // Don't use ngOnInit, it's only triggered once when loading the first profile,\r\n // doesn't fire again when navigating to another person profile.\r\n // This is the default angular router behavour - reusing components.\r\n // There was an issue when this component wasn't refreshing when the 'serviceCategory' variable in ngFor in the parenent component\r\n // had the same value as the previous person profile, e.g. when browsing people who all had 'General practitioner' service category\r\n // the locations didn't update when navigating between the GP profiles.\r\n }\r\n\r\n ngOnChanges() {\r\n // expand the first category by default if there are more than one\r\n this.detailsHidden = (this.numberOfServiceCategories > 1 || this.componentIndex > 0);\r\n\r\n // or always expand the first one\r\n // this.detailsHidden = (this.componentIndex > 0);\r\n\r\n const filteredPlacesByServiceCategory: WebApiModel.Place[] = [];\r\n this.placeDetails.forEach((place) => {\r\n place.serviceCategories.forEach((category) => {\r\n if (category.name === this.serviceCategoryName) {\r\n filteredPlacesByServiceCategory.push(place);\r\n }\r\n });\r\n });\r\n this.filteredPlaceDetails = filteredPlacesByServiceCategory;\r\n\r\n if (this.filteredPlaceDetails) {\r\n this.numberOfPlaces = this.filteredPlaceDetails.length;\r\n }\r\n }\r\n\r\n setDetailsVisible(): void {\r\n this.detailsHidden = !this.detailsHidden;\r\n }\r\n}\r\n","import { MapsAPILoader } from '@agm/core';\r\nimport { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, from, Observable, Subject } from 'rxjs';\r\nimport { first, takeWhile } from 'rxjs/operators';\r\nimport { WebApiModel } from '../../models/web-api.model';\r\n\r\ndeclare var google: any;\r\n\r\n@Injectable()\r\nexport class MapService {\r\n\r\n constructor(private mapsAPILoader: MapsAPILoader){}\r\n\r\n setMapZoom(map: any, locations: any[], userLatLng: any) {\r\n let currentLat = 0;\r\n let currentLng = 0;\r\n let numberOfUniqueLocations = 0;\r\n let minLocationDistance = 0;\r\n let maxLocationDistance = 0;\r\n let closestLatLng: any;\r\n let farthestLatLng: any;\r\n\r\n const latlngbounds = new google.maps.LatLngBounds();\r\n\r\n for (const location of locations) {\r\n const currentLocation: WebApiModel.Location = location;\r\n\r\n // If there are multiple locations with the same coordinates then skip that location, otherwise\r\n // map bounds are not set properly below. The zoom is set to fit bounds instead of center and the map\r\n // is zoomed in too much, it was happening on the person profile pages. When doctor is working at\r\n // multiple facilities which were at the same address.\r\n if (currentLocation.longitude === currentLng && currentLocation.latitude === currentLat) {\r\n continue;\r\n }\r\n\r\n if (userLatLng) {\r\n const currentLatLng = new google.maps.LatLng(currentLocation.latitude, currentLocation.longitude);\r\n\r\n const locationDistance = google.maps.geometry.spherical.computeDistanceBetween(userLatLng, currentLatLng);\r\n if (locationDistance < minLocationDistance || minLocationDistance === 0) {\r\n minLocationDistance = locationDistance;\r\n closestLatLng = currentLatLng;\r\n }\r\n if (locationDistance > maxLocationDistance || maxLocationDistance === 0) {\r\n maxLocationDistance = locationDistance;\r\n farthestLatLng = currentLatLng;\r\n }\r\n }\r\n\r\n if (currentLocation.longitude !== 0 && currentLocation.latitude !== 0) {\r\n latlngbounds.extend(new google.maps.LatLng(currentLocation.latitude, currentLocation.longitude));\r\n numberOfUniqueLocations++;\r\n }\r\n\r\n currentLat = currentLocation.latitude;\r\n currentLng = currentLocation.longitude;\r\n }\r\n\r\n let initialZoom = true;\r\n\r\n // Listener to handle fitBounds zoom changes\r\n // When there are two marker located very close on the map and we use fitBounds then the map\r\n // will zoom in too much, setZoom right after fitBounds is not working but fitBounds will\r\n // fire zoom_changed and bounds_changed events, this is how we zoom the map back a little\r\n google.maps.event.addListener(map, 'zoom_changed', () => {\r\n\r\n const zoomChangeBoundsListener =\r\n google.maps.event.addListener(map, 'bounds_changed', () => {\r\n\r\n // double check after angular 7 upgrade\r\n if (map.getZoom() > 19 && initialZoom === true) {\r\n // Change max/min zoom here\r\n map.setZoom(19);\r\n }\r\n\r\n initialZoom = false;\r\n google.maps.event.removeListener(zoomChangeBoundsListener);\r\n });\r\n });\r\n\r\n\r\n if (userLatLng) {\r\n map.fitBounds(new google.maps.LatLngBounds().extend(userLatLng).extend(farthestLatLng),0); //.extend(closestLatLng));\r\n map.setZoom(map.getZoom() - 1);\r\n } else {\r\n if (numberOfUniqueLocations > 1) {\r\n map.fitBounds(latlngbounds,0);\r\n // Zoom level after fitBounds is handled by the zoom_changed event listener above.\r\n // setZoom() didn't work after fitBounds.\r\n } else if (numberOfUniqueLocations === 1) {\r\n map.setCenter(new google.maps.LatLng(locations[0].latitude, locations[0].longitude));\r\n map.setZoom(14); // Set zoom level for a single location, otherwise the default is a bit too far.\r\n }\r\n }\r\n }\r\n\r\n // Sets default view on the map with NZ showing\r\n setDefaultMap(map: any) {\r\n const country = 'New Zealand';\r\n const geocoder = new google.maps.Geocoder();\r\n geocoder.geocode({ address: country }, (results, status) => {\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n map.setCenter(results[0].geometry.location);\r\n map.setZoom(4);\r\n }\r\n });\r\n }\r\n\r\n // Retrieve the latitude/longitude for an address\r\n // Returns a promise which can be awaited\r\n getLocationFromAddress(address: string) {\r\n return this.mapsAPILoader.load().then(() => {\r\n const geocoder = new google.maps.Geocoder();\r\n\r\n const ob = Observable.create(\r\n observer => geocoder.geocode({ address }, (results, status) => {\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n const loc = results[0].geometry.location;\r\n observer.next({\r\n lat: loc.lat(),\r\n lng: loc.lng()\r\n });\r\n } else {\r\n observer.next(null);\r\n }\r\n })) as Observable<{lat: number, lng: number}>;\r\n\r\n return ob.pipe(first()).toPromise();\r\n });\r\n }\r\n}\r\n","import { GoogleMapsAPIWrapper } from '@agm/core';\r\nimport { Directive, Input } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport 'js-marker-clusterer/src/markerclusterer.js';\r\n\r\nimport { WebApiModel } from '../../models/web-api.model';\r\nimport { RouterHelperService, RouteUrl } from '../../services/router-helper.service';\r\nimport { StateService } from '../../services/state.service';\r\nimport { MapService } from './healthcarefinder-map.service';\r\n\r\ndeclare var google: any;\r\ndeclare var MarkerClusterer;\r\ndeclare function require(string): string;\r\nconst maxZoom = 14;\r\n\r\n@Directive({\r\n selector: '[hcfMarkerExtension]'\r\n})\r\nexport class MarkerExtensionDirective {\r\n\r\n private _markers = [];\r\n private _locations = [];\r\n private markerClusterer: any;\r\n lastSelectedMarker: any;\r\n lastSelectedlocation: WebApiModel.Location;\r\n @Input() latitude: number;\r\n @Input() longitude: number;\r\n @Input() isPopup: boolean;\r\n\r\n constructor(private _stateService: StateService,\r\n private _wrapper: GoogleMapsAPIWrapper,\r\n private _mapService: MapService,\r\n private _router: Router\r\n ) { }\r\n\r\n @Input()\r\n set data(locations: any[]) {\r\n this._locations = locations;\r\n this.setupMap(true);\r\n }\r\n\r\n setupMap(resetZoom: boolean) {\r\n // Remove any previously added markers from the map\r\n // for (let i = 0; i < this._markers.length; i++) {\r\n // this._markers[i].setMap(null);\r\n // }\r\n for (const marker of this._markers) {\r\n marker.setMap(null);\r\n }\r\n\r\n this._markers = []; // Reset markers each time new data is received.\r\n\r\n this._wrapper.getNativeMap()\r\n .then((map) => {\r\n\r\n const mapOptions = {\r\n fullscreenControl: false\r\n };\r\n map.setOptions(mapOptions);\r\n\r\n if (this.markerClusterer) {\r\n this.markerClusterer.clearMarkers();\r\n }\r\n\r\n // If no locations then no markers\r\n if (!this._locations || this._locations.length === 0) {\r\n this._mapService.setDefaultMap(map);\r\n return;\r\n }\r\n\r\n // One info window object reused by many markers, this way only one info window will be open on the map at a time.\r\n const infoWindow = new google.maps.InfoWindow();\r\n\r\n for (const location of this._locations) {\r\n const currentLocation: WebApiModel.Location = location;\r\n const latLng = new google.maps.LatLng(currentLocation.latitude, currentLocation.longitude);\r\n const icon = this.getIcon(currentLocation, false);\r\n const isMultiLocation = currentLocation.locationDetails.length > 1;\r\n \r\n const marker = new google.maps.Marker({\r\n map,\r\n optimized: false, // Needed for IE11, otherwise markers are not showing properly and zoom is not working well.\r\n icon: this.getIconImage(icon),\r\n position: latLng,\r\n title: isMultiLocation ? currentLocation.address : currentLocation.locationDetails[0].practiceName\r\n });\r\n\r\n if (isMultiLocation) {\r\n const label = {\r\n text: currentLocation.locationDetails.length.toString(),\r\n fontFamily: 'Arial',\r\n color: icon.isLabelBlue ? '#125687' : '#85ac59',\r\n fontWeight: '600'\r\n };\r\n marker.setLabel(label);\r\n }\r\n\r\n // Add info window content and marker click handler\r\n marker.addListener('click', () => {\r\n if (isMultiLocation) {\r\n infoWindow.close();\r\n if (!this.isPopup) {\r\n this._stateService.openPopupMap([currentLocation]);\r\n }\r\n this._stateService.toggleMapSidebar(currentLocation);\r\n } else {\r\n const infoWindowContent = this.buildInfoWindow(currentLocation);\r\n infoWindow.setContent(infoWindowContent);\r\n infoWindow.open(map, marker);\r\n this._stateService.toggleMapSidebar(null);\r\n }\r\n\r\n if (this.lastSelectedMarker && this.lastSelectedlocation) {\r\n this.lastSelectedMarker.setIcon(this.getIconImage(this.getIcon(this.lastSelectedlocation, false)));\r\n }\r\n\r\n const theIcon = this.getIcon(currentLocation, true);\r\n marker.setIcon(this.getIconImage(theIcon));\r\n\r\n this.lastSelectedMarker = marker;\r\n this.lastSelectedlocation = currentLocation;\r\n map.setCenter(new google.maps.LatLng(currentLocation.latitude, currentLocation.longitude));\r\n if (map.getZoom() < maxZoom) {\r\n map.setZoom(maxZoom);\r\n }\r\n });\r\n\r\n this._markers.push(marker);\r\n }\r\n\r\n const clusterStyles = [\r\n {\r\n url: '../../../assets/svg/ic-map-cluster.svg',\r\n width: 32,\r\n height: 32,\r\n textColor: '#ffffff',\r\n textSize: 13\r\n }\r\n ];\r\n\r\n const options = {\r\n gridSize: 36,\r\n styles: clusterStyles,\r\n maxZoom\r\n };\r\n\r\n this.markerClusterer = new MarkerClusterer(map, this._markers, options);\r\n\r\n google.maps.event.addListener(infoWindow, 'closeclick', () => {\r\n this.setupMap(false);\r\n });\r\n\r\n if (resetZoom) {\r\n this._mapService.setMapZoom(map, this._locations, this.getLatLng(this.latitude, this.longitude));\r\n }\r\n });\r\n }\r\n\r\n getLatLng(latitude: number, longitude: number): any {\r\n if (latitude && longitude) {\r\n return new google.maps.LatLng(latitude, longitude);\r\n }\r\n return null;\r\n }\r\n\r\n buildMapIcon(urlString: string, width: number, height: number, isLabelBlue: boolean, origin: any): MapIcon {\r\n const icon = {\r\n url: urlString,\r\n width,\r\n height,\r\n isLabelBlue,\r\n origin\r\n };\r\n return icon;\r\n }\r\n\r\n getIconImage(icon: MapIcon): any { \r\n return {\r\n url: icon.url,\r\n origin: new google.maps.Point(0, 0),\r\n anchor: new google.maps.Point(icon.width / 2, icon.height),\r\n labelOrigin: icon.origin,\r\n scaledSize: new google.maps.Size(icon.width, icon.height) // Scale down hi-res image for hi-res displays\r\n };\r\n }\r\n\r\n getIcon(location: WebApiModel.Location, isSelected: boolean): MapIcon {\r\n\r\n // Icons will be embedded into js by webpack because of 'require', they won't be copied to the webroot folder.\r\n let icon: MapIcon;\r\n let origin = new google.maps.Point(0, 0);\r\n const adjustLabel = isSelected ? 2 : 0;\r\n\r\n if (location.locationDetails.length > 1) {\r\n if (location.locationDetails.length > 19) {\r\n origin = new google.maps.Point(13 + adjustLabel, 14 + adjustLabel);\r\n } else if (location.locationDetails.length > 9) {\r\n origin = new google.maps.Point(14 + adjustLabel, 14 + adjustLabel);\r\n } else {\r\n origin = new google.maps.Point(15 + adjustLabel, 14 + adjustLabel);\r\n }\r\n\r\n if (isSelected) {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-green-cluster-selected.svg',\r\n 34, 48, false, origin);\r\n } else {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-green-cluster.svg', 29, 43, false, origin);\r\n }\r\n\r\n if (location.isAffiliatedProvider && location.isEasyClaim) {\r\n if (location.locationDetails.length > 9) {\r\n origin = new google.maps.Point(14 + (adjustLabel * 1.5), 16 + adjustLabel);\r\n } else {\r\n origin = new google.maps.Point(15 + (adjustLabel * 1.5), 15 + adjustLabel);\r\n }\r\n\r\n if (isSelected) {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-ec-and-ap-cluster-selected.svg',\r\n 41, 51, true, origin);\r\n } else {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-ec-and-ap-cluster.svg', 34, 45, true, origin);\r\n }\r\n } else if (location.isAffiliatedProvider) {\r\n if (isSelected) {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-blue-cluster-selected.svg',\r\n 34, 48, true, origin);\r\n } else {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-blue-cluster.svg', 29, 43, true, origin);\r\n }\r\n }\r\n } else {\r\n if (isSelected) {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-day-to-day-selected.svg', 34, 48, false, origin);\r\n } else {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-day-to-day.svg', 29, 43, false, origin);\r\n }\r\n\r\n const locationDetails = location.locationDetails[0];\r\n\r\n if (locationDetails.isAffiliatedProvider && locationDetails.isEasyClaim) {\r\n if (isSelected) {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-ec-and-ap-selected.svg', 41, 51, true, origin);\r\n } else {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-ec-and-ap.svg', 34, 45, true, origin);\r\n }\r\n } else if (locationDetails.isAffiliatedProvider) {\r\n if (isSelected) {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-affiliated-selected.svg',\r\n 34, 48, true, origin);\r\n } else {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-affiliated.svg', 29, 43, true, origin);\r\n }\r\n } else if (locationDetails.isEasyClaim) {\r\n if (isSelected) {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-easy-claim-selected.svg',\r\n 34, 48, false, origin);\r\n } else {\r\n icon = this.buildMapIcon('../../../assets/svg/ic-pin-easy-claim.svg', 29, 43, false, origin);\r\n }\r\n }\r\n }\r\n\r\n return icon;\r\n }\r\n\r\n buildInfoWindow(location: WebApiModel.Location): HTMLElement {\r\n\r\n const locationDetail = location.locationDetails[0];\r\n let address = '';\r\n\r\n const placeRoute: RouteUrl = RouterHelperService.getRoute(\r\n RouterHelperService.routeType.placeProfile, locationDetail.id, locationDetail.practiceName, null);\r\n\r\n const personRoute: RouteUrl = RouterHelperService.getRoute(\r\n RouterHelperService.routeType.personProfile, locationDetail.personId, locationDetail.displayName, null);\r\n\r\n // Create a wrapper container\r\n const infoContainer: HTMLElement = document.createElement('div');\r\n infoContainer.className = 'map-info-container';\r\n\r\n // Add practice link and AP|EC icons\r\n if (locationDetail.practiceName) {\r\n const practiceLink: HTMLAnchorElement = document.createElement('a');\r\n practiceLink.innerHTML = `${locationDetail.practiceName} `;\r\n practiceLink.href = placeRoute.link.join('/');\r\n practiceLink.className = 'marker-place-link';\r\n\r\n practiceLink.addEventListener('click', (event) => { this.linkClick(event, placeRoute); });\r\n if (locationDetail.isAffiliatedProvider) {\r\n const apStatus: HTMLElement = document.createElement('span');\r\n practiceLink.appendChild(apStatus);\r\n }\r\n\r\n if (locationDetail.isEasyClaim) {\r\n const ecStatus: HTMLElement = document.createElement('span');\r\n practiceLink.appendChild(ecStatus);\r\n }\r\n infoContainer.appendChild(practiceLink);\r\n }\r\n\r\n // Add person link, used on the search results map\r\n if (locationDetail.displayName) {\r\n const personLink: HTMLAnchorElement = document.createElement('a');\r\n const title = locationDetail.title ? locationDetail.title + ' ' : '';\r\n personLink.innerText = title + ' ' + locationDetail.displayName;\r\n personLink.href = personRoute.link.join('/');\r\n personLink.className = 'marker-person-link';\r\n personLink.addEventListener('click', (event) => { this.linkClick(event, personRoute); });\r\n infoContainer.appendChild(personLink);\r\n }\r\n\r\n const addressContainer: HTMLElement = document.createElement('div');\r\n\r\n address = this.buildString(address, locationDetail.receptionLocation);\r\n address = this.buildString(address, location.address);\r\n address = this.buildString(address, location.suburb);\r\n address = this.buildString(address, location.city);\r\n\r\n if (location.city && location.postcode) {\r\n address = address + ' ' + location.postcode;\r\n } else if (location.postcode) {\r\n address = this.buildString(address, location.postcode);\r\n }\r\n\r\n if (location.latitude && location.longitude) {\r\n const getDirections = 'Get directions';\r\n address = this.buildString(address, getDirections);\r\n }\r\n\r\n addressContainer.innerHTML = address;\r\n\r\n infoContainer.appendChild(addressContainer);\r\n\r\n return infoContainer;\r\n }\r\n\r\n linkClick(event, routeLink: RouteUrl) {\r\n event.preventDefault();\r\n this._router.navigate(routeLink.link);\r\n }\r\n\r\n /**\r\n * Helper to build a concatinated string and skip blank items\r\n */\r\n buildString(s: string, addressLine: string) {\r\n if (addressLine) {\r\n s = (s) ? s + '
' + addressLine : addressLine;\r\n }\r\n return s;\r\n }\r\n}\r\n\r\ninterface MapIcon {\r\n url: string;\r\n width: number;\r\n height: number;\r\n isLabelBlue: boolean;\r\n origin: any;\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'hcf-map',\r\n templateUrl: './healthcarefinder-map.component.html',\r\n styleUrls: ['./healthcarefinder-map.component.scss'],\r\n})\r\nexport class MapComponent {\r\n @Input() places: any;\r\n @Input() latitude: number;\r\n @Input() longitude: number;\r\n @Input() isPopup: boolean;\r\n}\r\n","\r\n
\r\n
","
    \r\n
  • {{i+1}} {{footnote}}
  • \r\n
","import { Component, Input, OnChanges } from '@angular/core';\r\nimport { FootnoteService } from './footnote.service';\r\n\r\n@Component({\r\n selector: 'hcf-footnotes',\r\n templateUrl: './footnotes.component.html',\r\n styleUrls: ['./footnotes.component.scss'],\r\n})\r\n\r\nexport class FootnotesComponent implements OnChanges {\r\n\r\n @Input() footnotes: string[];\r\n\r\n constructor(private _footnotesService: FootnoteService) { }\r\n\r\n ngOnChanges() {\r\n this.footnotes = this._footnotesService.getFootnotes();\r\n }\r\n}\r\n","export class ReportIncorrectDetails {\r\n\r\n reportType: string; // Person or place\r\n id: string;\r\n name: string;\r\n phones: string[] = [];\r\n fax: string;\r\n address: string;\r\n webAddress: string;\r\n url: string;\r\n captchaResponse: string;\r\n emailAddress: string;\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { ReportIncorrectDetails } from './report-incorrect-details.model';\r\n\r\n@Injectable()\r\nexport class ReportIncorrectDetailsService {\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n sendReport = (reportIcorrectDetails: ReportIncorrectDetails): Observable => {\r\n\r\n const serviceUrl = SettingsService.api.reportIncorrectDetailsUrl;\r\n\r\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\r\n\r\n return this.http.post(serviceUrl, JSON.stringify(reportIcorrectDetails), { headers })\r\n .pipe(\r\n map((response) => {\r\n return response as string ? true : false; // from angular 7 upgrade, need to check still works\r\n })\r\n , catchError((error) => throwError(error))\r\n );\r\n }\r\n\r\n}\r\n","\r\n

Report incorrect details for '{{personFullName || (place && place.practiceName)}}'

\r\n

\r\n If the details for this place or person aren't right, let us know by completing the details below.\r\n

\r\n

\r\n Note: if you need to contact this person/place now, please try their website (if listed) to find\r\n their contact details. We appreciate you taking the time to report the error(s) to us so we can correct them.\r\n

\r\n
\r\n

I am a...

\r\n
\r\n
    \r\n
  • \r\n
  • \r\n
\r\n\r\n
\r\n

\r\n The following details are incorrect:\r\n

\r\n
    \r\n
  • \r\n
  • \r\n
  • \r\n
  • \r\n
  • \r\n
\r\n
    \r\n
  • \r\n \r\n
  • \r\n
  • \r\n
    \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n
  • \r\n
\r\n \r\n

\r\n \r\n

\r\n

If you need assistance please call us on 0800 800 181. We're here to\r\n help between 8am to 6pm, Monday to Friday.

\r\n
\r\n
\r\n

To update your personal or practice details, please email:
provider.update@southerncross.co.nz

\r\n
\r\n
\r\n
\r\n
\r\n

Success

\r\n

Your request has been submitted to Southern Cross for review.
Thanks for your help!

\r\n

Done

\r\n
\r\n
\r\n

Error

\r\n

Something went wrong and we couldn't submit your request.
Please try again.

\r\n

Try again

\r\n
","import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { WebApiModel } from '../../models/web-api.model';\r\nimport { StateService } from '../../services/state.service';\r\nimport { UiService } from '../../services/ui.service';\r\nimport { ReportIncorrectDetails } from './report-incorrect-details.model';\r\nimport { ReportIncorrectDetailsService } from './report-incorrect-details.service';\r\n\r\n@Component({\r\n selector: 'hcf-report-form',\r\n templateUrl: './report-form.component.html',\r\n styleUrls: ['./report-form.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ReportFormComponent implements OnChanges {\r\n\r\n @Input() person: WebApiModel.Person;\r\n @Input() personFullName: string;\r\n @Input() place: WebApiModel.Place;\r\n @Output() closePopupHandler = new EventEmitter();\r\n\r\n // Enum object with items that can be reported\r\n reportItem = { name: 'name', phone: 'phone', fax: 'fax', web: 'web', email: 'email', address: 'address' };\r\n reportType: number = null;\r\n reportResult: ReportIncorrectDetails;\r\n reportSubmittedSuccess: boolean = false;\r\n reportSubmittedError: boolean = false;\r\n\r\n private _checkBoxCount: number = 0;\r\n private _captchaResponse: string = null;\r\n\r\n constructor(\r\n private _uiService: UiService,\r\n private _stateService: StateService,\r\n private _reportService: ReportIncorrectDetailsService) {\r\n\r\n }\r\n\r\n ngOnChanges() {\r\n this.reportResult = new ReportIncorrectDetails();\r\n // Reset the report type, it fill trigger ngIf and it will reset the radio and checkbox state\r\n this.reportType = null;\r\n\r\n if (this.person) {\r\n this.reportResult.reportType = 'person';\r\n this.reportResult.id = this.person.id;\r\n } else if (this.place) {\r\n this.reportResult.reportType = 'place';\r\n this.reportResult.id = this.place.id;\r\n } else {\r\n return;\r\n }\r\n\r\n this.reportResult.url = this._uiService.getCurrentUrl();\r\n }\r\n\r\n reportIncorrectDetails() {\r\n\r\n if (this.formIsValid()) {\r\n\r\n this._stateService.isComponentLoading(true);\r\n\r\n this._reportService.sendReport(this.reportResult).subscribe(\r\n (response: boolean) => {\r\n if (response) {\r\n this.reportSubmittedError = false;\r\n this.reportSubmittedSuccess = true;\r\n } else {\r\n this.reportSubmittedSuccess = false;\r\n this.reportSubmittedError = true;\r\n }\r\n this._stateService.isComponentLoading(false);\r\n this._uiService.scrollToTop();\r\n },\r\n () => {\r\n // Show an error message\r\n this.reportSubmittedSuccess = false;\r\n this.reportSubmittedError = true;\r\n this._stateService.isComponentLoading(false);\r\n this._uiService.scrollToTop();\r\n }\r\n );\r\n }\r\n }\r\n\r\n selectReportType(reportType: number) {\r\n if (this.reportType !== reportType) {\r\n this.reportType = reportType;\r\n this._checkBoxCount = 0; // When switching the report type all checkboxes are reset so we reset the count.\r\n }\r\n }\r\n\r\n /** Adds/removes options from the final report object when checkboxes are selected\r\n */\r\n optionCheck(event, reportItem: string) {\r\n if (!event.target) {\r\n return;\r\n }\r\n\r\n const t = event.target;\r\n\r\n let itemValue = null;\r\n\r\n if (t.checked) {\r\n itemValue = t.value;\r\n this._checkBoxCount++;\r\n } else {\r\n this._checkBoxCount--;\r\n }\r\n\r\n if (reportItem === this.reportItem.name) {\r\n this.reportResult.name = itemValue;\r\n } else if (reportItem === this.reportItem.fax) {\r\n this.reportResult.fax = itemValue;\r\n } else if (reportItem === this.reportItem.web) {\r\n this.reportResult.webAddress = itemValue;\r\n } else if (reportItem === this.reportItem.email) {\r\n this.reportResult.emailAddress = itemValue;\r\n } else if (reportItem === this.reportItem.address) {\r\n this.reportResult.address = itemValue;\r\n } else if (reportItem === this.reportItem.phone) {\r\n if (!this.reportResult.phones) {\r\n this.reportResult.phones = [];\r\n }\r\n if (t.checked) {\r\n this.reportResult.phones.push(t.value);\r\n } else {\r\n this.reportResult.phones = this.reportResult.phones.filter(x => x !== t.value);\r\n }\r\n }\r\n\r\n // Custom checkbox icons require a class set on the label element,\r\n // Find current checkbox parent label and toggle the class 'checked'\r\n this._uiService.toggleParentClass(t, 'label', 'checked');\r\n }\r\n\r\n formIsValid() {\r\n return (this._checkBoxCount > 0 && this._captchaResponse);\r\n }\r\n\r\n captchaResolved(captchaResponse: string) {\r\n this._captchaResponse = captchaResponse;\r\n this.reportResult.captchaResponse = captchaResponse;\r\n }\r\n\r\n done() {\r\n this._stateService.closePopup();\r\n }\r\n\r\n tryAgain() {\r\n this.reportSubmittedSuccess = false;\r\n this.reportSubmittedError = false;\r\n this._captchaResponse = null;\r\n }\r\n}\r\n","import { Component, OnDestroy, ViewEncapsulation } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { StateRxService } from '../../services/staterx.service';\r\nimport { UiService } from '../../services/ui.service';\r\n\r\n@Component({\r\n selector: 'hcf-popup',\r\n templateUrl: './popup.component.html',\r\n styleUrls: ['./popup.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PopupComponent implements OnDestroy {\r\n\r\n showPopup: boolean = false;\r\n\r\n private _subscriptionEscPressed: Subscription;\r\n private _subscriptionClosePopup: Subscription;\r\n\r\n constructor(_stateRx: StateRxService, private _uiService: UiService) {\r\n this._subscriptionEscPressed = _stateRx.escPressed.rxSubscribe(() => {\r\n this.closePopup();\r\n });\r\n\r\n this._subscriptionClosePopup = _stateRx.closePopup.rxSubscribe(() => {\r\n this.closePopup();\r\n });\r\n }\r\n\r\n openPopup() {\r\n this.showPopup = true;\r\n this._uiService.scrollToTop();\r\n }\r\n\r\n closePopup() {\r\n this.showPopup = false;\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subscriptionEscPressed.unsubscribe();\r\n this._subscriptionClosePopup.unsubscribe();\r\n }\r\n}\r\n","
\r\n
\r\n \r\n \r\n
","
\r\n
\r\n
\r\n
\r\n

{{name}}\r\n \r\n \r\n \r\n \r\n

\r\n

{{person.specialist}}

\r\n
Special interest(s): {{person.specialInterest}}\r\n
\r\n
    \r\n
  • \r\n
\r\n
{{person.fax}}
\r\n
{{person.emailAddress}}
\r\n \r\n

Report incorrect details

\r\n
\r\n

View map\r\n

\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n Affiliated Providers (AP)\r\n \r\n
\r\n Below are the healthcare facilities where this AP works and the healthcare services they are contracted with us to perform at each healthcare facility. When booking, please confirm that the AP is contracted with us to perform the healthcare service at your chosen healthcare facility. \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n 0\">\r\n\r\n
\r\n
\r\n\r\n \r\n\r\n","import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Params, Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\nimport { ErrorHandlingService } from '../../../services/error-handling.service';\r\nimport { GoogleAnalyticsService } from '../../../services/google-analytics.service';\r\nimport { ProfileService } from '../../../services/profile.service';\r\nimport { RouterHelperService } from '../../../services/router-helper.service';\r\nimport { SeoService } from '../../../services/seo.service';\r\nimport { SettingsService } from '../../../services/settings.service';\r\nimport { StateService } from '../../../services/state.service';\r\nimport { StateRxService } from '../../../services/staterx.service';\r\nimport { UiService } from '../../../services/ui.service';\r\nimport { FootnoteService } from '../../footnotes/footnote.service';\r\nimport { PopupComponent } from '../../popup/popup.component';\r\n\r\n@Component({\r\n selector: 'hcf-person-profile',\r\n templateUrl: './person-profile.component.html',\r\n styleUrls: ['./person-profile.component.scss']\r\n})\r\nexport class PersonProfileComponent implements OnInit, OnDestroy {\r\n person: WebApiModel.Person;\r\n mapCenterLatitude: number;\r\n mapCenterLongitude: number;\r\n name: string;\r\n personServiceCategoryNamesByPlace: string[] = [];\r\n mapExpanded: boolean = true;\r\n private _subscriptionIsMobileLayout: Subscription;\r\n footnotes: string[] = [];\r\n locations: WebApiModel.Location[];\r\n\r\n settings = SettingsService;\r\n\r\n @ViewChild('reportProblemPopupComponent') reportProblemPopupComponent: PopupComponent;\r\n\r\n constructor(\r\n private _route: ActivatedRoute,\r\n private _router: Router,\r\n private _profileService: ProfileService,\r\n private _stateService: StateService,\r\n private _stateRxService: StateRxService,\r\n private _errorHandlingService: ErrorHandlingService,\r\n private _uiService: UiService,\r\n private _footnoteService: FootnoteService,\r\n private _gaService: GoogleAnalyticsService,\r\n private _seoService: SeoService) { }\r\n\r\n ngOnInit(): void {\r\n // When using the autocomplete dropdown users can select different doctors,\r\n // ngOnInit event is not fired every time a new person profile is loaded, it only fired the first time profile is loaded,\r\n // Angular2 is reusing the component.\r\n // We can use route params observable to bind new profile data.\r\n // Tried using switchMap but it didn't work well in case if there was an http error,\r\n // after the error params subscription didn't work anymore.\r\n // switchMap is supposed to cancel any previous subscriptions and http requests.\r\n this._route.params.subscribe((params: Params) => {\r\n this.getData(params);\r\n });\r\n\r\n // Collapse map on mobile by default\r\n if (this._uiService.isMobile()) {\r\n this.mapExpanded = false;\r\n }\r\n\r\n // If browser is resized from mobile to desktop we need to show the map if it was hidden.\r\n // We need this becasue of ngIf used to collapse map on mobile.\r\n // We need ngIf to collapse/expand the map because otherwise it's not initialised properly when it's hidden.\r\n this._subscriptionIsMobileLayout = this._stateRxService.mobileLayoutChanged.rxSubscribe(isMobile => {\r\n // If map is already expanded then keep it that way, it looks like on resize is fired on Android when scrolling\r\n // probably because the scrollbars are hiding/showing, the map was collapsing when scrolling the page\r\n this.mapExpanded = !isMobile;\r\n });\r\n }\r\n\r\n private getData(params: Params) {\r\n this._stateService.isComponentLoading(true);\r\n this._profileService.getPerson(params[RouterHelperService.urlParam.id]).subscribe(\r\n (response: WebApiModel.Person) => {\r\n if (response) {\r\n this._stateService.isComponentLoading(false);\r\n this.person = null;\r\n this.person = response;\r\n this.initialiseVariables();\r\n this.initialiseMap();\r\n this._uiService.scrollToTop();\r\n this._gaService.sendPageViewEvent(this._router.url);\r\n } else {\r\n this._errorHandlingService.friendlyErrorHandler(true);\r\n }\r\n },\r\n () => {\r\n this._errorHandlingService.friendlyErrorHandler(true);\r\n }\r\n );\r\n }\r\n\r\n private initialiseVariables(): void {\r\n this.name = this.person.firstName + ' ' + this.person.lastName;\r\n if (this.person.title) {\r\n this.name = this.person.title + ' ' + this.name;\r\n }\r\n\r\n // Set page title\r\n this._seoService.setTitle(this.name);\r\n this._seoService.setMetaDescription(`${this.name}; ${this.person.specialty || ''}`);\r\n\r\n this.footnotes = this._footnoteService.initPersonFootnotes(this.person);\r\n\r\n // Filter out service categoris that have no matching place so we don't output empty service category headers.\r\n\r\n const filteredPersonServiceCategoriesByPlace: string[] = [];\r\n\r\n // Filter the categories that have some places\r\n if (this.person.serviceCategoryNames && this.person.serviceCategoryNames.length > 0) {\r\n for (let i = 0; i < this.person.serviceCategoryNames.length; i++) {\r\n const serviceCategoryName = this.person.serviceCategoryNames[i];\r\n if (this.serviceCategoryHasPlace(serviceCategoryName)) {\r\n filteredPersonServiceCategoriesByPlace.push(serviceCategoryName);\r\n }\r\n }\r\n }\r\n\r\n this.personServiceCategoryNamesByPlace = filteredPersonServiceCategoriesByPlace;\r\n }\r\n\r\n private serviceCategoryHasPlace(serviceCategoryName: string) {\r\n\r\n if (!serviceCategoryName || !this.person.places) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < this.person.places.length; i++) {\r\n\r\n const currentPlace = this.person.places[i];\r\n\r\n if (!currentPlace.serviceCategories) {\r\n return false;\r\n }\r\n\r\n for (let s = 0; s < currentPlace.serviceCategories.length; s++) {\r\n const currentPersonServcieCategory = currentPlace.serviceCategories[s];\r\n if (currentPersonServcieCategory.name === serviceCategoryName) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private initialiseMap(): void {\r\n let sumLatitude = 0;\r\n let sumLongitude = 0;\r\n let isAffiliatedProvider = false;\r\n let isEasyClaim = false;\r\n let isTelehealth = false;\r\n const placesCount = this.person.places.length;\r\n this.locations = [];\r\n this.person.places.forEach(place => {\r\n sumLatitude += place.latitude;\r\n sumLongitude += place.longitude;\r\n\r\n if (place.isAffiliatedProvider) {\r\n isAffiliatedProvider = place.isAffiliatedProvider;\r\n }\r\n if (place.isEasyClaim) {\r\n isEasyClaim = place.isEasyClaim;\r\n }\r\n if (place.isTelehealth) {\r\n isTelehealth = place.isTelehealth;\r\n }\r\n\r\n const locationDetail = {\r\n id: place.id,\r\n practiceName: place.practiceName,\r\n receptionLocation: place.receptionLocation,\r\n isAffiliatedProvider: place.isAffiliatedProvider,\r\n isEasyClaim: place.isEasyClaim,\r\n webAddress: place.webAddress,\r\n isConsultant: place.isConsultant,\r\n isTelehealth: place.isTelehealth\r\n } as WebApiModel.LocationDetail;\r\n\r\n const location = {\r\n latitude: place.latitude,\r\n longitude: place.longitude,\r\n address: place.address,\r\n suburb: place.suburb,\r\n city: place.city,\r\n postcode: place.postcode,\r\n isAffiliatedProvider,\r\n isEasyClaim,\r\n isTelehealth,\r\n locationDetails: [locationDetail]\r\n } as WebApiModel.Location;\r\n this.locations.push(location);\r\n });\r\n this.mapCenterLatitude = sumLatitude / placesCount;\r\n this.mapCenterLongitude = sumLongitude / placesCount;\r\n }\r\n\r\n toggleMap() {\r\n this.mapExpanded = !this.mapExpanded;\r\n }\r\n\r\n ngOnDestroy() {\r\n // prevent memory leak when component destroyed\r\n this._subscriptionIsMobileLayout.unsubscribe();\r\n }\r\n\r\n reportProblem() {\r\n this.reportProblemPopupComponent.openPopup();\r\n }\r\n\r\n closePopup() {\r\n this.reportProblemPopupComponent.closePopup();\r\n }\r\n}\r\n","
\r\n

\r\n {{serviceCategory.name}} \r\n

\r\n
\r\n
    \r\n
  • {{service}}
  • \r\n
\r\n
\r\n
","import { Component, Input, OnChanges, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\n\r\n@Component({\r\n selector: 'hcf-place-service-category',\r\n templateUrl: './place-service-category.component.html',\r\n styleUrls: ['./place-service-category.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PlaceServiceCategoryComponent implements OnChanges {\r\n @Input() serviceCategory: WebApiModel.ServiceCategory;\r\n @Input() componentIndex: number;\r\n @Input() numberOfServiceCategories: number;\r\n\r\n detailsHidden: boolean = false;\r\n numberOfServices: number = 0;\r\n\r\n ngOnChanges() {\r\n // expand the first category by default if it's the only one\r\n // this.detailsHidden = (this.numberOfServiceCategories > 1 || this.componentIndex > 0);\r\n\r\n // or always expand the frist one\r\n // this.detailsHidden = (this.componentIndex > 0);\r\n }\r\n\r\n setDetailsVisible(): void {\r\n this.detailsHidden = !this.detailsHidden;\r\n }\r\n}\r\n","

\r\n \r\n {{personName}}\r\n \r\n \r\n \r\n \r\n

\r\n

{{person.specialty}}

\r\n
Special interest(s): {{person.specialInterest}}
\r\n
    \r\n
  • \r\n
\r\n
{{person.emailAddress}}
\r\n\r\n
\r\n \r\n
\r\n","import { Component, Input, OnChanges, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\nimport { RouterHelperService } from '../../../services/router-helper.service';\r\nimport { SettingsService } from '../../../services/settings.service';\r\n\r\n@Component({\r\n selector: 'hcf-person-detail',\r\n templateUrl: './person-detail.component.html',\r\n styleUrls: ['./person-detail.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PersonDetailComponent implements OnChanges {\r\n @Input() person: WebApiModel.Person;\r\n personLink: any[];\r\n personName: string = '';\r\n settings = SettingsService;\r\n\r\n ngOnChanges() {\r\n\r\n // Name in the url doesn't use title because data for the autocomplete dropdown doesn't have the title,\r\n // so use name with no title here for the route as well.\r\n let nameNoTitle = '';\r\n\r\n // Check for nulls, otherwise a 'null' is displayed at the front end\r\n if (this.person.firstName) {\r\n nameNoTitle += this.person.firstName + ' ';\r\n }\r\n\r\n if (this.person.lastName) {\r\n nameNoTitle += this.person.lastName;\r\n }\r\n\r\n if (this.person.title) {\r\n this.personName = `${this.person.title} ${nameNoTitle}`;\r\n } else {\r\n this.personName = nameNoTitle;\r\n }\r\n\r\n const id = this.person.id;\r\n const routeType = RouterHelperService.routeType.personProfile;\r\n const route = RouterHelperService.getRoute(routeType, id, nameNoTitle, null);\r\n this.personLink = route.link;\r\n }\r\n}\r\n","
\r\n

\r\n {{serviceCategory.name}}

\r\n
\r\n \r\n
\r\n
","import { Component, Input, OnChanges } from '@angular/core';\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\n\r\n@Component({\r\n selector: 'hcf-person-by-service-category',\r\n templateUrl: './person-by-service-category.component.html',\r\n styleUrls: ['./person-detail.component.scss']\r\n})\r\nexport class PersonByServiceCategroyComponent implements OnChanges {\r\n\r\n @Input() serviceCategory: WebApiModel.ServiceCategory;\r\n @Input() placeDetail: WebApiModel.Place;\r\n @Input() componentIndex: number;\r\n @Input() numberOfServiceCategories: number;\r\n\r\n peopleBySerivceCategory: WebApiModel.Person[] = [];\r\n detailsHidden: boolean = false;\r\n numberOfDoctors: number = 0;\r\n\r\n ngOnChanges() {\r\n\r\n // expand the first category by default if there is only one\r\n //this.detailsHidden = (this.numberOfServiceCategories > 1 || this.componentIndex > 0);\r\n\r\n // or always expand the first category\r\n // this.detailsHidden = this.componentIndex > 0;\r\n\r\n // Group people by service category.\r\n const filteredPeopleByServiceCategory: WebApiModel.Person[] = [];\r\n this.placeDetail.people.forEach((person) => {\r\n person.serviceCategories.forEach((category) => {\r\n if (category.name === this.serviceCategory.name) {\r\n filteredPeopleByServiceCategory.push(person);\r\n }\r\n });\r\n });\r\n\r\n this.peopleBySerivceCategory = filteredPeopleByServiceCategory;\r\n }\r\n\r\n setDetailsVisible(): void {\r\n this.detailsHidden = !this.detailsHidden;\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n

{{place.practiceName}}\r\n \r\n \r\n \r\n

\r\n
\r\n
{{place.fax}}
\r\n
\r\n
\r\n {{place.facilityName}}
\r\n
{{place.receptionLocation}}
\r\n {{place.address}}\r\n
{{place.suburb}}
\r\n
{{place.city}} {{place.postcode}}
\r\n
\r\n \r\n

Report incorrect details

\r\n
\r\n

View map\r\n

\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n Affiliated Provider (AP) healthcare facilities\r\n \r\n
\r\n Not all healthcare providers at this healthcare facility are contracted with \r\n us to perform every service. When booking, check that your healthcare provider\r\n is contracted with us to perform the healthcare service you need at this location. \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n Healthcare facilities offering Easy-Claim (EC)\r\n \r\n
\r\n You can authorise healthcare providers who offer Easy-Claim to claim on\r\n your behalf for eligible healthcare services at the time of purchase or service.\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n DoctorsServices\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n\r\n 0\">\r\n\r\n
\r\n
\r\n\r\n \r\n\r\n","import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Params, Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\nimport { ErrorHandlingService } from '../../../services/error-handling.service';\r\nimport { GoogleAnalyticsService } from '../../../services/google-analytics.service';\r\nimport { ProfileService } from '../../../services/profile.service';\r\nimport { RouterHelperService } from '../../../services/router-helper.service';\r\nimport { SeoService } from '../../../services/seo.service';\r\nimport { SettingsService } from '../../../services/settings.service';\r\nimport { StateService } from '../../../services/state.service';\r\nimport { StateRxService } from '../../../services/staterx.service';\r\nimport { UiService } from '../../../services/ui.service';\r\nimport { FootnoteService } from '../../footnotes/footnote.service';\r\nimport { PopupComponent } from '../../popup/popup.component';\r\n\r\n@Component({\r\n selector: 'hcf-place-profile',\r\n templateUrl: './place-profile.component.html',\r\n styleUrls: ['./place-profile.component.scss']\r\n})\r\nexport class PlaceProfileComponent implements OnInit, OnDestroy {\r\n place: WebApiModel.Place;\r\n location: WebApiModel.Location;\r\n hasServices: boolean;\r\n hasPeople: boolean;\r\n selectedTab: string;\r\n detailsHidden: boolean[] = [];\r\n tabType = { services: 'services', doctors: 'doctors' };\r\n numberOfServiceCategoriesByService: number = 0;\r\n numberOfServiceCategoriesByPerson: number = 0;\r\n placeServiceCategoriesByService: WebApiModel.ServiceCategory[] = [];\r\n placeServiceCategoriesByPerson: WebApiModel.ServiceCategory[] = [];\r\n mapExpanded: boolean = true;\r\n private _subscriptionIsMobileLayout: Subscription;\r\n footnotes: string[] = [];\r\n settings = SettingsService;\r\n\r\n @ViewChild('reportProblemPopupComponent') reportProblemPopupComponent: PopupComponent;\r\n\r\n constructor(\r\n private _route: ActivatedRoute,\r\n private _router: Router,\r\n private _profileService: ProfileService,\r\n private _stateService: StateService,\r\n private _stateRxService: StateRxService,\r\n private _errorHandlingService: ErrorHandlingService,\r\n private _uiService: UiService,\r\n private _footnoteService: FootnoteService,\r\n private _gaService: GoogleAnalyticsService,\r\n private _seoService: SeoService) { }\r\n\r\n ngOnInit() {\r\n this._route.params.subscribe((params: Params) => { this.getData(params); });\r\n\r\n // Collapse map on mobile by default\r\n if (this._uiService.isMobile()) {\r\n this.mapExpanded = false;\r\n }\r\n\r\n // If browser is resized from mobile to desktop we need to show the map if it was hidden.\r\n // We need this becasue of ngIf used to collapse map on mobile.\r\n // We need ngIf to collapse/expand the map because otherwise it's not initialised properly when it's hidden.\r\n this._subscriptionIsMobileLayout = this._stateRxService.mobileLayoutChanged.rxSubscribe(isMobile => {\r\n this.mapExpanded = !isMobile;\r\n });\r\n }\r\n\r\n getData(params: Params) {\r\n this._stateService.isComponentLoading(true);\r\n this._profileService.getPlace(params[RouterHelperService.urlParam.id])\r\n .subscribe((response: WebApiModel.Place) => {\r\n if (response) {\r\n this._stateService.isComponentLoading(false);\r\n this.place = response;\r\n this.initialiseTabVariables();\r\n this._uiService.scrollToTop();\r\n this._gaService.sendPageViewEvent(this._router.url);\r\n } else {\r\n this._errorHandlingService.friendlyErrorHandler(true);\r\n }\r\n },\r\n () => {\r\n this._errorHandlingService.friendlyErrorHandler(true);\r\n });\r\n }\r\n\r\n private initialiseTabVariables(): void {\r\n\r\n if (!this.place) {\r\n return;\r\n }\r\n\r\n this.footnotes = this._footnoteService.initPlaceFootnotes(this.place);\r\n\r\n const filteredPlaceServiceCategoriesByService: WebApiModel.ServiceCategory[] = [];\r\n const filteredPlaceServiceCategoriesByPerson: WebApiModel.ServiceCategory[] = [];\r\n\r\n // Some service categories don't have services. Check number of servcies in each category,\r\n // if at least one of them have some then we can set this.hasServices to true.\r\n // this.hasServices is used to show/hide the Servcies tab.\r\n // Also skip service categories without services, populate new array with only servcie categories that have services.\r\n this.hasServices = false;\r\n this.hasPeople = false;\r\n if (this.place.serviceCategories !== null && this.place.serviceCategories.length > 0) {\r\n\r\n for (let i = 0; i < this.place.serviceCategories.length; i++) {\r\n\r\n const currentServiceCategory = this.place.serviceCategories[i];\r\n\r\n if (currentServiceCategory.services && currentServiceCategory.services.length > 0) {\r\n this.hasServices = true;\r\n filteredPlaceServiceCategoriesByService.push(currentServiceCategory);\r\n }\r\n\r\n if (this.serviceCategoryHasPeople(currentServiceCategory.name)) {\r\n this.hasPeople = true;\r\n filteredPlaceServiceCategoriesByPerson.push(currentServiceCategory);\r\n }\r\n }\r\n }\r\n\r\n this.placeServiceCategoriesByService = filteredPlaceServiceCategoriesByService;\r\n this.placeServiceCategoriesByPerson = filteredPlaceServiceCategoriesByPerson;\r\n\r\n this.numberOfServiceCategoriesByService = this.placeServiceCategoriesByService.length;\r\n this.numberOfServiceCategoriesByPerson = this.placeServiceCategoriesByPerson.length;\r\n\r\n if (this.hasPeople) {\r\n this.selectedTab = this.tabType.doctors; // Will be selected by default\r\n } else if (this.hasServices) {\r\n this.selectedTab = this.tabType.services;\r\n }\r\n\r\n this._seoService.setTitle(this.place.practiceName);\r\n this._seoService.setMetaDescription(\r\n `${this.place.practiceName} ${this.place.receptionLocation || ''}\r\n ${this.place.address || ''} ${this.place.suburb || ''} ${this.place.city || ''}, ${this.place.postcode || ''}`);\r\n\r\n this.initialiseMap();\r\n }\r\n\r\n private initialiseMap() {\r\n const locationDetail = {\r\n id: this.place.id,\r\n practiceName: this.place.practiceName,\r\n receptionLocation: this.place.receptionLocation,\r\n isAffiliatedProvider: this.place.isAffiliatedProvider,\r\n isEasyClaim: this.place.isEasyClaim,\r\n webAddress: this.place.webAddress,\r\n isConsultant: this.place.isConsultant\r\n };\r\n this.location = {\r\n latitude: this.place.latitude,\r\n longitude: this.place.longitude,\r\n address: this.place.address,\r\n suburb: this.place.suburb,\r\n city: this.place.city,\r\n postcode: this.place.postcode,\r\n isAffiliatedProvider: this.place.isAffiliatedProvider,\r\n isEasyClaim: this.place.isEasyClaim,\r\n locationDetails: [locationDetail]\r\n };\r\n }\r\n\r\n /**\r\n * Check if a particular servcie category has any associated people\r\n */\r\n private serviceCategoryHasPeople(serviceCategoryName: string): boolean {\r\n\r\n if (!serviceCategoryName) {\r\n return false;\r\n }\r\n\r\n for (let p = 0; p < this.place.people.length; p++) {\r\n const currentPerson = this.place.people[p];\r\n for (let s = 0; s < currentPerson.serviceCategories.length; s++) {\r\n const currentPersonServcieCategory = currentPerson.serviceCategories[s];\r\n if (currentPersonServcieCategory.name === serviceCategoryName) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n onTabCLick(selectedTab: string): void {\r\n this.selectedTab = selectedTab;\r\n }\r\n\r\n setDetailsVisible(index: number) {\r\n this.detailsHidden[index] = !this.detailsHidden[index];\r\n }\r\n\r\n toggleMap() {\r\n this.mapExpanded = !this.mapExpanded;\r\n }\r\n\r\n ngOnDestroy() {\r\n // prevent memory leak when component destroyed\r\n this._subscriptionIsMobileLayout.unsubscribe();\r\n }\r\n\r\n reportProblem() {\r\n this.reportProblemPopupComponent.openPopup();\r\n }\r\n}\r\n","export namespace FilterModel {\r\n\r\n export class Service {\r\n name: string;\r\n total: number;\r\n }\r\n\r\n export class ServiceCategory {\r\n name: string;\r\n total: number;\r\n serviceTotals: Service[];\r\n }\r\n\r\n export class ProfileTotal {\r\n total: number;\r\n affiliatedProvider: number;\r\n easyClaim: number;\r\n telehealth: number;\r\n serviceCategoryTotals: ServiceCategory[];\r\n }\r\n\r\n export class ProfileTotals {\r\n peopleTotals: ProfileTotal;\r\n placesTotals: ProfileTotal;\r\n combinedTotals: ProfileTotal;\r\n }\r\n}\r\n","import { WebApiModel } from './web-api.model';\r\n\r\nexport class Profile {\r\n data: WebApiModel.ProfileDetail;\r\n type: string;\r\n}\r\n","import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { forkJoin, Observable, throwError } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\nimport { Profile } from '../models/search.model';\r\nimport { WebApiModel } from '../models/web-api.model';\r\nimport { SettingsService } from './settings.service';\r\n\r\n@Injectable()\r\nexport class SearchService {\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n getPlaces(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n pageNumber: number,\r\n pageSize: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): Observable {\r\n\r\n const params = this.buildSearchParams(name, location, affiliatedProvider, affiliatedProviderConsult,sort,easyClaim, telehealth, pageNumber, pageSize,\r\n serviceCategory, service, specialty, latitude, longitude, distance, distanceKms);\r\n\r\n let serviceUrl = SettingsService.api.searchPlacesByNameProfileUrl;\r\n\r\n if (location) {\r\n serviceUrl = SettingsService.api.searchPlacesByNameAndLocationProfileUrl;\r\n } else if (latitude && longitude) {\r\n serviceUrl = SettingsService.api.searchPlacesByNameAndGeolocationProfileUrl;\r\n }\r\n if (!distance) {\r\n serviceUrl = SettingsService.api.searchPlacesByNameAndGeolocationProfileUrl;\r\n }\r\n\r\n return this.http.get(serviceUrl, { params })\r\n .pipe(\r\n map((response: HttpResponse) => this.buildProfiles(response, 'places'))\r\n , catchError((error) => throwError(error))\r\n );\r\n }\r\n\r\n getPlacesByService(name: string,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n pageNumber: number,\r\n pageSize: number,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): Observable {\r\n const params = this.buildServiceSearchParams(name, serviceCategory, service, specialty, location, affiliatedProvider,affiliatedProviderConsult,sort,\r\n easyClaim, telehealth, pageNumber, pageSize, latitude, longitude, distance, distanceKms);\r\n\r\n let serviceUrl = SettingsService.api.searchPlacesByServiceProfileUrl;\r\n\r\n if (location) {\r\n serviceUrl = SettingsService.api.searchPlacesByServiceAndLocationProfileUrl;\r\n } else if (latitude && longitude) {\r\n serviceUrl = SettingsService.api.searchPlacesByServiceAndGeolocationProfileUrl;\r\n }\r\n if (!distance) {\r\n serviceUrl = SettingsService.api.searchPlacesByServiceAndGeolocationProfileUrl;\r\n }\r\n\r\n return this.http\r\n .get(serviceUrl, { params })\r\n .pipe(\r\n map((response: HttpResponse) => this.buildProfiles(response, 'places'))\r\n , catchError((error) => throwError(error))\r\n );\r\n }\r\n\r\n getPeopleAndPlacesByService(name: string,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n pageNumber: number,\r\n pageSize: number,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): Observable {\r\n // people\r\n const peopleParams = this.buildServiceSearchParams(name, serviceCategory, service, specialty, location, affiliatedProvider,affiliatedProviderConsult, sort,\r\n easyClaim, telehealth, pageNumber, pageSize, latitude, longitude, distance, distanceKms);\r\n\r\n let peopleUrl = SettingsService.api.searchPeopleByServiceProfileUrl;\r\n\r\n if (location) {\r\n peopleUrl = SettingsService.api.searchPeopleByServiceAndLocationProfileUrl;\r\n } else if (latitude && longitude) {\r\n peopleUrl = SettingsService.api.searchPeopleByServiceAndGeolocationProfileUrl;\r\n }\r\n if (!distance) {\r\n peopleUrl = SettingsService.api.searchPeopleByServiceAndGeolocationProfileUrl;\r\n }\r\n\r\n // places\r\n const placesParams = this.buildServiceSearchParams(name, serviceCategory, service, specialty, location, affiliatedProvider, affiliatedProviderConsult, sort, easyClaim,\r\n telehealth, pageNumber, pageSize, latitude, longitude, distance, distanceKms);\r\n\r\n let placesUrl = SettingsService.api.searchPlacesByServiceProfileUrl;\r\n\r\n if (location) {\r\n placesUrl = SettingsService.api.searchPlacesByServiceAndLocationProfileUrl;\r\n } else if (latitude && longitude) {\r\n placesUrl = SettingsService.api.searchPlacesByServiceAndGeolocationProfileUrl;\r\n }\r\n if (!distance) {\r\n placesUrl = SettingsService.api.searchPlacesByServiceAndGeolocationProfileUrl;\r\n }\r\n\r\n const peopleRequest = this.http\r\n .get(peopleUrl, { params: peopleParams })\r\n .pipe(\r\n map((response: HttpResponse) => this.buildProfiles(response, 'people'))\r\n , catchError((error) => throwError(error))\r\n );\r\n\r\n const placeRequest = this.http\r\n .get(placesUrl, { params: placesParams })\r\n .pipe(\r\n map((response: HttpResponse) => this.buildProfiles(response, 'places'))\r\n , catchError((error) => throwError(error))\r\n );\r\n\r\n return forkJoin([peopleRequest, placeRequest]);\r\n\r\n }\r\n\r\n getPeopleAndPlaces(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n pageNumber: number,\r\n pageSize: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): Observable {\r\n // people\r\n const peopleParams = this.buildSearchParams(name, location, affiliatedProvider, affiliatedProviderConsult, sort, easyClaim, telehealth, pageNumber, pageSize,\r\n serviceCategory, service, specialty, latitude, longitude, distance, distanceKms);\r\n\r\n let peopleUrl = SettingsService.api.searchPeopleByNameProfileUrl;\r\n\r\n if (location) {\r\n peopleUrl = SettingsService.api.searchPeopleByNameAndLocationProfileUrl;\r\n } else if (latitude && longitude) {\r\n peopleUrl = SettingsService.api.searchPeopleByNameAndGeolocationProfileUrl;\r\n }\r\n if (!distance) {\r\n peopleUrl = SettingsService.api.searchPeopleByNameAndGeolocationProfileUrl;\r\n }\r\n\r\n // places\r\n const placesParams = this.buildSearchParams(name, location, affiliatedProvider, affiliatedProviderConsult, sort, easyClaim, telehealth,\r\n pageNumber, pageSize, serviceCategory, service, specialty, latitude, longitude, distance, distanceKms);\r\n\r\n // let placesUrl = SettingsService.api.searchPlacesProfileUrl;\r\n let placesUrl = SettingsService.api.searchPlacesByNameProfileUrl;\r\n\r\n if (location) {\r\n placesUrl = SettingsService.api.searchPlacesByNameAndLocationProfileUrl;\r\n } else if (latitude && longitude) {\r\n placesUrl = SettingsService.api.searchPlacesByNameAndGeolocationProfileUrl;\r\n }\r\n if (!distance) {\r\n placesUrl = SettingsService.api.searchPlacesByNameAndGeolocationProfileUrl;\r\n }\r\n\r\n const peopleRequest = this.http\r\n .get(peopleUrl, { params: peopleParams })\r\n .pipe(\r\n map((response: HttpResponse) => {\r\n return this.buildProfiles(response, 'people');\r\n })\r\n , catchError((error) => throwError(error))\r\n );\r\n\r\n const placeRequest = this.http\r\n .get(placesUrl, { params: placesParams })\r\n .pipe(\r\n map((response: HttpResponse) => {\r\n return this.buildProfiles(response, 'places');\r\n })\r\n , catchError((error) => throwError(error))\r\n );\r\n\r\n return forkJoin([peopleRequest, placeRequest]);\r\n }\r\n\r\n buildSearchParams(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n pageNumber: number,\r\n pageSize: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n latitude: string,\r\n // longitude: string): URLSearchParams { // old deprecated module upgraded to httpParams\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): HttpParams {\r\n\r\n // const params: URLSearchParams = new URLSearchParams(); // old deprecated module upgraded to httpParams\r\n let params: HttpParams = new HttpParams();\r\n params = !name ? params : params.append('name', name);\r\n params = !location ? params : params.append('location', location);\r\n params = !serviceCategory ? params : params.append('serviceCategory', this.stripWildCards(serviceCategory));\r\n params = !service ? params : params.append('service', this.stripWildCards(service));\r\n params = !specialty ? params : params.append('specialty', this.stripWildCards(specialty));\r\n params = !distance ? params : params.append('distanceKms', distanceKms.toString());\r\n\r\n if (affiliatedProvider === true) {\r\n params = params.append('isAffiliatedProvider', affiliatedProvider.toString());\r\n }\r\n params = params.append('sort', sort);\r\n params = params.append('isAffiliatedProviderConsult', affiliatedProviderConsult.toString());\r\n\r\n if (telehealth === true) {\r\n params = params.append('isTelehealth', telehealth.toString());\r\n }\r\n\r\n if (easyClaim === true) {\r\n params = params.append('isEasyClaim', easyClaim.toString());\r\n }\r\n\r\n params = !pageSize ? params : params.append('pageSize', pageSize.toString());\r\n params = !pageNumber ? params : params.append('pageNumber', pageNumber.toString());\r\n params = !latitude ? params : params.append('latitude', latitude.toString());\r\n params = !longitude ? params : params.append('longitude', longitude.toString());\r\n\r\n return params;\r\n }\r\n\r\n buildServiceSearchParams(name: string,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n pageNumber: number,\r\n pageSize: number,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): HttpParams {\r\n let params: HttpParams = new HttpParams();\r\n\r\n params = !name ? params : params.append('name', name);\r\n params = !service ? params : params.append('service', service);\r\n params = !specialty ? params : params.append('specialty', specialty);\r\n params = !serviceCategory ? params : params.append('serviceCategory', serviceCategory);\r\n params = !location ? params : params.append('location', location);\r\n\r\n if (affiliatedProvider === true) {\r\n params = params.append('isAffiliatedProvider', affiliatedProvider.toString());\r\n }\r\n params = params.append('sort', sort);\r\n params = params.append('isAffiliatedProviderConsult', affiliatedProviderConsult.toString());\r\n if (telehealth === true) {\r\n params = params.append('isTelehealth', telehealth.toString());\r\n }\r\n if (easyClaim === true) {\r\n params = params.append('isEasyClaim', easyClaim.toString());\r\n }\r\n\r\n params = !pageSize ? params : params.append('pageSize', pageSize.toString());\r\n params = !pageNumber ? params : params.append('pageNumber', pageNumber.toString());\r\n params = !latitude ? params : params.append('latitude', latitude.toString());\r\n params = !longitude ? params : params.append('longitude', longitude.toString());\r\n params = !distance ? params : params.append('distanceKms', distanceKms.toString());\r\n\r\n return params;\r\n }\r\n\r\n buildProfiles(response, type: string): Profile[] {\r\n const results = response as WebApiModel.ProfileDetail[]; // revisit after angular 7 upgrade\r\n\r\n const profiles = results.map((data) => {\r\n const profile = new Profile();\r\n profile.data = data;\r\n profile.type = type;\r\n return profile;\r\n });\r\n\r\n return profiles;\r\n }\r\n\r\n stripWildCards(term: string): string {\r\n if (term) {\r\n return term.split('%').join('');\r\n }\r\n return term;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { FilterModel } from '../models/filter.model';\r\nimport { SettingsService } from './settings.service';\r\n\r\n@Injectable()\r\nexport class FilterService {\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n getTotals(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string): Observable {\r\n const params = this.buildSearchParams(name, location, affiliatedProvider,affiliatedProviderConsult, easyClaim, telehealth, latitude, longitude, distance, distanceKms, serviceCategory, service, specialty);\r\n\r\n let serviceUrl = SettingsService.api.totalsByNameUrl;\r\n if (location) {\r\n serviceUrl = SettingsService.api.totalsByNameAndLocationUrl;\r\n } else if (latitude && longitude) {\r\n serviceUrl = SettingsService.api.totalsByNameAndGeolocationUrl;\r\n }\r\n if (!distance) {\r\n serviceUrl = SettingsService.api.totalsByNameAndGeolocationUrl;\r\n }\r\n\r\n return this.http\r\n .get(serviceUrl, { params })\r\n .pipe(\r\n map(response => response as FilterModel.ProfileTotals) // revisit after angular 7 upgrade\r\n );\r\n }\r\n\r\n getServiceTotals(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string):\r\n Observable {\r\n const params = this.buildServiceSearchParams(name, location, affiliatedProvider, affiliatedProviderConsult, easyClaim, telehealth, latitude, longitude, distance, distanceKms, serviceCategory, service, specialty);\r\n\r\n let serviceUrl = SettingsService.api.totalsByServiceUrl;\r\n\r\n if (location) {\r\n serviceUrl = SettingsService.api.totalsByServiceAndLocationUrl;\r\n } else if (latitude && longitude) {\r\n serviceUrl = SettingsService.api.totalsByServiceAndGeolocationUrl;\r\n }\r\n if (!distance) {\r\n serviceUrl = SettingsService.api.totalsByServiceAndGeolocationUrl;\r\n }\r\n\r\n return this.http\r\n .get(serviceUrl, { params })\r\n .pipe(\r\n map(response => response as FilterModel.ProfileTotals) // revisit after angular 7 upgrade\r\n );\r\n }\r\n\r\n buildSearchParams(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string): HttpParams {\r\n\r\n let params: HttpParams = new HttpParams();\r\n params = !name ? params : params.append('name', name);\r\n params = !location ? params : params.append('location', location);\r\n params = !serviceCategory ? params : params.append('serviceCategory', this.stripWildCards(serviceCategory));\r\n params = !service ? params : params.append('service', this.stripWildCards(service));\r\n params = !specialty ? params : params.append('specialty', this.stripWildCards(specialty));\r\n params = !latitude ? params : params.append('latitude', latitude.toString());\r\n params = !longitude ? params : params.append('longitude', longitude.toString());\r\n params = !distance ? params : params.append('distanceKms', distanceKms.toString());\r\n\r\n params = params.append('isAffiliatedProvider', affiliatedProvider.toString());\r\n\r\n\r\n params = params.append('isAffiliatedProviderConsult', affiliatedProviderConsult.toString());\r\n\r\n if (telehealth === true) {\r\n params = params.append('isTelehealth', telehealth.toString());\r\n }\r\n\r\n if (easyClaim === true) {\r\n params = params.append('isEasyClaim', easyClaim.toString());\r\n }\r\n\r\n return params;\r\n }\r\n\r\n // This looks like duplication of code. Will probably refactor at some stage unless there is a valid business case for this.\r\n buildServiceSearchParams(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string): HttpParams {\r\n\r\n let params: HttpParams = new HttpParams();\r\n params = !name ? params : params.append('name', name);\r\n params = !location ? params : params.append('location', location);\r\n params = !serviceCategory ? params : params.append('serviceCategory', serviceCategory);\r\n params = !service ? params : params.append('service', service);\r\n params = !specialty ? params : params.append('specialty',specialty);\r\n params = !latitude ? params : params.append('latitude', latitude.toString());\r\n params = !longitude ? params : params.append('longitude', longitude.toString());\r\n params = !distance ? params : params.append('distanceKms', distanceKms.toString());\r\n\r\n params = params.append('isAffiliatedProvider', affiliatedProvider.toString());\r\n\r\n params = params.append('isAffiliatedProviderConsult', affiliatedProviderConsult.toString());\r\n\r\n if (telehealth === true) {\r\n params = params.append('isTelehealth', telehealth.toString());\r\n }\r\n\r\n if (easyClaim === true) {\r\n params = params.append('isEasyClaim', easyClaim.toString());\r\n }\r\n\r\n return params;\r\n }\r\n\r\n stripWildCards(term: string): string {\r\n if (term) {\r\n return term.split('%').join('');\r\n }\r\n return term;\r\n }\r\n}\r\n","import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\nimport { WebApiModel } from '../models/web-api.model';\r\nimport { SettingsService } from './settings.service';\r\n\r\n@Injectable()\r\nexport class LocationService {\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n getLocations(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n searchPeople: boolean): Observable {\r\n const params = this.buildSearchParams(name, location, affiliatedProvider, affiliatedProviderConsult, sort, easyClaim, telehealth, latitude, longitude, distance, distanceKms, serviceCategory,\r\n service, specialty, searchPeople);\r\n\r\n let serviceUrl = SettingsService.api.searchLocationsByNameUrl;\r\n\r\n if (location) {\r\n serviceUrl = SettingsService.api.searchLocationsByNameAndLocationUrl;\r\n } else if (latitude && longitude) {\r\n serviceUrl = SettingsService.api.searchLocationsByNameAndGeolocationUrl;\r\n }\r\n if (!distance) {\r\n serviceUrl = SettingsService.api.searchLocationsByNameAndGeolocationUrl;\r\n }\r\n\r\n return this.http\r\n .get(serviceUrl, { params })\r\n .pipe(\r\n map(response => response as WebApiModel.Location[]) // revisit after angular 7 upgrade\r\n , catchError((error) => throwError(error))\r\n );\r\n\r\n }\r\n\r\n getLocationsByService(name: string,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort:string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n searchPeople: boolean): Observable {\r\n const params = this.buildServiceSearchParams(name, serviceCategory, service, specialty, location, affiliatedProvider, affiliatedProviderConsult,sort,\r\n easyClaim, telehealth, latitude, longitude, distance, distanceKms, searchPeople);\r\n\r\n let serviceUrl = SettingsService.api.searchLocationsByServiceUrl;\r\n\r\n if (location) {\r\n serviceUrl = SettingsService.api.searchLocationsByServiceAndLocationUrl;\r\n } else if (latitude && longitude) {\r\n serviceUrl = SettingsService.api.searchLocationsByServiceAndGeolocationUrl;\r\n }\r\n if (!distance) {\r\n serviceUrl = SettingsService.api.searchLocationsByServiceAndGeolocationUrl;\r\n }\r\n\r\n return this.http\r\n .get(serviceUrl, { params })\r\n .pipe(\r\n map(response => response as WebApiModel.Location[]) // revisit after angular 7 upgrade\r\n , catchError((error) => throwError(error))\r\n );\r\n }\r\n\r\n buildSearchParams(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort: string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n searchPeople: boolean): HttpParams {\r\n\r\n let params: HttpParams = new HttpParams();\r\n params = !name ? params : params.append('name', name);\r\n params = !location ? params : params.append('location', location);\r\n params = !serviceCategory ? params : params.append('serviceCategory', this.stripWildCards(serviceCategory));\r\n params = !service ? params : params.append('service', this.stripWildCards(service));\r\n params = !specialty ? params : params.append('specialty', this.stripWildCards(specialty));\r\n params = !searchPeople ? params : params.append('searchPeople', searchPeople.toString());\r\n params = !distance ? params : params.append('distanceKms', distanceKms.toString());\r\n params = !latitude ? params : params.append('latitude', latitude.toString());\r\n params = !longitude ? params : params.append('longitude', longitude.toString());\r\n\r\n if (affiliatedProvider === true) {\r\n params = params.append('isAffiliatedProvider', affiliatedProvider.toString());\r\n }\r\n params = params.append('sort', sort);\r\n params = params.append('isAffiliatedProviderConsult', affiliatedProviderConsult.toString());\r\n if (telehealth === true) {\r\n params = params.append('isTelehealth', telehealth.toString());\r\n }\r\n if (easyClaim === true) {\r\n params = params.append('isEasyClaim', easyClaim.toString());\r\n }\r\n\r\n return params;\r\n }\r\n\r\n buildServiceSearchParams(name: string,\r\n serviceCategory: string,\r\n service: string,\r\n specialty: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort: string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number,\r\n searchPeople: boolean): HttpParams {\r\n\r\n let params: HttpParams = new HttpParams();\r\n params = !name ? params : params.append('name', name);\r\n params = !service ? params : params.append('service', service);\r\n params = !specialty ? params : params.append('specialty', specialty);\r\n params = !serviceCategory ? params : params.append('serviceCategory', serviceCategory);\r\n params = !searchPeople ? params : params.append('searchPeople', searchPeople.toString());\r\n params = !location ? params : params.append('location', location);\r\n params = !distance ? params : params.append('distanceKms', distanceKms.toString());\r\n params = !latitude ? params : params.append('latitude', latitude.toString());\r\n params = !longitude ? params : params.append('longitude', longitude.toString());\r\n\r\n if (affiliatedProvider === true) {\r\n params = params.append('isAffiliatedProvider', affiliatedProvider.toString());\r\n }\r\n params = params.append('sort', sort);\r\n params = params.append('isAffiliatedProviderConsult', affiliatedProviderConsult.toString());\r\n if (telehealth === true) {\r\n params = params.append('isTelehealth', telehealth.toString());\r\n }\r\n if (easyClaim === true) {\r\n params = params.append('isEasyClaim', easyClaim.toString());\r\n }\r\n\r\n return params;\r\n }\r\n\r\n stripWildCards(term: string): string {\r\n if (term) {\r\n return term.split('%').join('');\r\n }\r\n return term;\r\n }\r\n}\r\n","
\r\n

\r\n \r\n {{searchResult.data.firstName}} {{searchResult.data.lastName}}\r\n \r\n \r\n \r\n \r\n \r\n

\r\n

{{searchResult.data.specialist}}

\r\n
Special interest(s):\r\n {{searchResult.data.specialInterest}}
\r\n

\r\n \r\n {{searchResult.data.practiceName}}\r\n \r\n \r\n \r\n \r\n

\r\n
    \r\n
  • \r\n \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n {{searchResult.data.facilityName}}
\r\n
{{searchResult.data.receptionLocation}}
\r\n {{searchResult.data.address}}\r\n
{{searchResult.data.suburb}}
\r\n
{{searchResult.data.city}}\r\n {{searchResult.data.postcode}}
\r\n
\r\n \r\n \r\n \r\n

0\">Service category

\r\n
    \r\n
  • {{serviceCategory}}
  • \r\n
\r\n
\r\n \r\n\r\n \r\n
\r\n
\r\n","import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core';\r\n\r\nimport { Profile } from '../../models/search.model';\r\nimport { WebApiModel } from '../../models/web-api.model';\r\nimport { RouterHelperService, RouteUrl } from '../../services/router-helper.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { PopupMapComponent } from '../maps/popup-map/popup-map.component';\r\n\r\n@Component({\r\n selector: 'hcf-search-result-detail',\r\n templateUrl: './search-result-detail.component.html',\r\n styleUrls: ['./search-result-detail.component.scss']\r\n})\r\nexport class SearchResultDetailComponent implements OnChanges {\r\n @Input() searchResult: Profile;\r\n @Input() typeFilter: string;\r\n @Input() places: WebApiModel.Location[];\r\n @Output() openPopupMap: EventEmitter = new EventEmitter();\r\n\r\n filterType = { people: \"people\", places: \"places\" };\r\n placeLink: any[];\r\n profileCssClass: string = '';\r\n searchTypeCssClass: string = '';\r\n settings = SettingsService;\r\n\r\n @ViewChild('popupMapComponent') popupMapComponent: PopupMapComponent;\r\n\r\n ngOnChanges() {\r\n const id = this.searchResult.data.id;\r\n const route = this.getSearchResultName(this.searchResult.data, id);\r\n this.placeLink = route.link;\r\n }\r\n\r\n private getSearchResultName(detail: any, id: string): RouteUrl {\r\n let name = '';\r\n let routeType = '';\r\n this.searchTypeCssClass = detail.isAffiliatedProvider ? 'is-affiliated-provider'\r\n : detail.isEasyClaim ? 'is-easy-claim'\r\n : 'is-other';\r\n\r\n if (detail.practiceName) {\r\n name = detail.practiceName;\r\n routeType = RouterHelperService.routeType.placeProfile;\r\n this.profileCssClass = 'place-profile';\r\n } else if (detail.firstName) {\r\n name = detail.firstName + ' ' + detail.lastName;\r\n routeType = RouterHelperService.routeType.personProfile;\r\n this.profileCssClass = 'person-profile';\r\n }\r\n\r\n const route = RouterHelperService.getRoute(routeType, id, name, null);\r\n\r\n return route;\r\n }\r\n\r\n viewMapClicked() {\r\n let placesForMap: WebApiModel.Location[];\r\n if (this.searchResult.type === 'people') {\r\n placesForMap = this.getPersonLocationFromProfile(this.searchResult);\r\n } else {\r\n placesForMap = this.getPlaceLocationFromProfile(this.searchResult);\r\n }\r\n this.openPopupMap.emit(placesForMap);\r\n }\r\n\r\n getPlaceLocationFromProfile(profile: Profile): WebApiModel.Location[] {\r\n const place = profile.data;\r\n const locationDetail = {\r\n id: place.id,\r\n practiceName: place.practiceName,\r\n receptionLocation: place.receptionLocation,\r\n isAffiliatedProvider: place.isAffiliatedProvider,\r\n isEasyClaim: place.isEasyClaim,\r\n isConsultant: place.isConsultant,\r\n isTelehealth: place.isTelehealth\r\n };\r\n const location = {\r\n address: place.address,\r\n suburb: place.suburb,\r\n city: place.city,\r\n postcode: place.postcode,\r\n latitude: place.latitude,\r\n longitude: place.longitude,\r\n isAffiliatedProvider: place.isAffiliatedProvider,\r\n isEasyClaim: place.isEasyClaim,\r\n isTelehealth: place.isTelehealth,\r\n locationDetails: [locationDetail]\r\n };\r\n return [location];\r\n }\r\n\r\n getPersonLocationFromProfile(profile: Profile): WebApiModel.Location[] {\r\n const matchingLocations: WebApiModel.Location[] = [];\r\n this.places.forEach((location) => {\r\n if (location.locationDetails.findIndex(x => x.personId === profile.data.id) > -1) {\r\n matchingLocations.push(location);\r\n }\r\n });\r\n return matchingLocations;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, Output } from '@angular/core';\r\nimport { StateService } from '../../services/state.service';\r\n\r\n@Component({\r\n selector: 'hcf-filter-help-form',\r\n templateUrl: './filter-help-form.component.html',\r\n styleUrls: ['./filter-help-form.component.scss']\r\n})\r\nexport class FilterHelpFormComponent {\r\n\r\n @Output() closePopupHandler = new EventEmitter();\r\n\r\n constructor(private _stateService: StateService) { }\r\n\r\n done() {\r\n this._stateService.closePopup();\r\n }\r\n}\r\n","
\r\n

Healthcare provider types

\r\n

\r\n Affiliated Providers\r\n \r\n

\r\n

An Affiliated Provider is a doctor, specialist or medical facility contracted to provide Southern Cross members\r\n with certain healthcare services at agreed prices.

\r\n

Some healthcare services are 'Affiliated\r\n Provider-only', which means they’re only covered by your policy if they're performed by an Affiliated\r\n Provider.

\r\n

Using an Affiliated Provider is also easier – no forms and no fuss as prior approval and claiming are sorted for\r\n you directly with them.

\r\n

\r\n \r\n If you see this while you’re searching – this means an Affiliated\r\n Provider who performs specialist consultations. Please check their profile to ensure they offer the specific\r\n healthcare service or consultation you need.\r\n

\r\n

\r\n \r\n This icon represents Affiliated Providers who perform specialist initial and follow-up consultations via telehealth. A telehealth consultation\r\n is the use of video or phone to deliver healthcare consultations when Southern Cross patients and Affiliated Providers are in different physical\r\n locations and when no physical examination is required.\r\n

\r\n

If you're unable to find an Affiliated Provider near you that offers the healthcare service you need, please contact us. This is important for Affiliated\r\n Provider-only healthcare services.

\r\n

\r\n Easy-Claim partners\r\n \r\n

\r\n

Easy-Claim partners provide a convenient way for Southern Cross members to claim for eligible day-to-day healthcare\r\n services at the time of purchase. Easy-Claim is available at participating General Practices, Optometrists,\r\n Dentists, Physiotherapists, Audiologists, Chiropractors, Podiatrists, Osteopaths, Remedial Massage Therapists, and\r\n Pharmacies.

\r\n

Just show your Member card (it’s on the app) or mention your member number and they’ll do the rest. If your plan\r\n covers the product or service, we'll reimburse the provider directly and you'll only pay any remaining contribution\r\n you're responsible for.

\r\n

Log in to My Southern Cross to\r\n see your benefit balances and plan documents, or download the My Southern Cross\r\n app.

\r\n
\r\n","
\r\n
\r\n {{locationDetail.displayName}}\r\n \r\n \r\n
\r\n \r\n \r\n
{{locationDetail.receptionLocation}}
\r\n
","import { Component, Input, OnChanges, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\nimport { RouterHelperService } from '../../../services/router-helper.service';\r\n\r\n@Component({\r\n selector: 'sidebar-detail',\r\n templateUrl: './sidebar-detail.component.html',\r\n styleUrls: ['./sidebar-detail.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class SidebarDetailComponent implements OnChanges {\r\n @Input() locationDetail: WebApiModel.LocationDetail;\r\n placeLink: any[];\r\n personLink: any[];\r\n\r\n constructor() { }\r\n\r\n ngOnChanges() {\r\n if (this.locationDetail.practiceName) {\r\n const id = this.locationDetail.id;\r\n const routeType = RouterHelperService.routeType.placeProfile;\r\n const route = RouterHelperService.getRoute(routeType, id, this.locationDetail.practiceName, null);\r\n this.placeLink = route.link;\r\n }\r\n if (this.locationDetail.displayName) {\r\n const personId = this.locationDetail.personId;\r\n const routeType = RouterHelperService.routeType.personProfile;\r\n const route = RouterHelperService.getRoute(routeType, personId, this.locationDetail.displayName, null);\r\n this.personLink = route.link;\r\n }\r\n }\r\n}\r\n","
\r\n
\r\n \r\n

\r\n {{location.address}}
\r\n {{location.suburb}}
\r\n {{location.city}} {{location.postcode}}\r\n

\r\n

Get directions\r\n

\r\n

{{locationType}} ({{location.locationDetails.length}})

\r\n
\r\n \r\n \r\n
","import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\n\r\n@Component({\r\n selector: 'sidebar',\r\n templateUrl: './sidebar.component.html',\r\n styleUrls: ['./sidebar.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class SidebarComponent {\r\n @Input() location: WebApiModel.Location;\r\n @Input() locationType: string;\r\n @Output() closeMapEventEmitter: EventEmitter = new EventEmitter();\r\n\r\n closeMapButtonPressed() {\r\n this.closeMapEventEmitter.emit();\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n

\r\n {{(showSidebar) ? 'Back to the map' : 'Back to results'}}\r\n \r\n

\r\n \r\n
\r\n
Affiliated Provider
\r\n
Easy-Claim Partner
\r\n
Affiliated Provider & Easy-Claim
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n","import { Component, Input, OnDestroy, ViewEncapsulation } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WebApiModel } from '../../../models/web-api.model';\r\nimport { StateRxService } from '../../../services/staterx.service';\r\n\r\n@Component({\r\n selector: 'hcf-popup-map',\r\n templateUrl: './popup-map.component.html',\r\n styleUrls: ['./popup-map.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PopupMapComponent implements OnDestroy {\r\n\r\n mapExpanded: boolean = false;\r\n showSidebar: boolean = false;\r\n selectedLocation: WebApiModel.Location;\r\n locationType: string;\r\n\r\n @Input() placesForMap: WebApiModel.Location[];\r\n @Input() latitude: number;\r\n @Input() longitude: number;\r\n\r\n private _subscriptionToggleSidebar: Subscription;\r\n\r\n constructor(_stateRx: StateRxService) {\r\n this._subscriptionToggleSidebar = _stateRx.toggleMapSidebar.rxSubscribe(location => {\r\n this.toggleSidebar(location);\r\n });\r\n }\r\n\r\n done() {\r\n this.mapExpanded = false;\r\n }\r\n\r\n openPopupMap() {\r\n this.showSidebar = false;\r\n this.mapExpanded = true;\r\n }\r\n\r\n closePopupMap() {\r\n this.showSidebar = false;\r\n this.mapExpanded = false;\r\n }\r\n\r\n backTo() {\r\n if (this.showSidebar) {\r\n this.toggleSidebar(null); // will close the side bar and go back to the map\r\n } else {\r\n // Otherwise close the map\r\n this.closePopupMap();\r\n }\r\n }\r\n\r\n toggleSidebar(location: WebApiModel.Location) {\r\n if (location) {\r\n this.selectedLocation = location;\r\n this.showSidebar = true;\r\n if (location.locationDetails.findIndex(x => x.displayName != null) >= 0) {\r\n this.locationType = 'Doctors';\r\n } else {\r\n this.locationType = 'Practices';\r\n }\r\n } else {\r\n this.showSidebar = false;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subscriptionToggleSidebar.unsubscribe();\r\n }\r\n}\r\n","\r\n\r\n
\r\n\r\n
\r\n
\r\n

View map

\r\n \r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n

\r\n {{searchTermDisplay}}\r\n

\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n Affiliated Provider (AP)\r\n \r\n
\r\n
\r\n Affiliated Providers are contracted with us to perform certain healthcare services at certain healthcare facilities. Click the \"Check services\" button on a search result to see what healthcare services are available and where they can be performed.\r\n
\r\n
\r\n
\r\n
\r\n \r\n Affiliated Provider (AP) healthcare facilities\r\n \r\n
\r\n
\r\n Some Affiliated Providers are only contracted with us to perform certain healthcare services at certain healthcare facilities. Clicking the \"View facility details\" button on a result below will show you all the healthcare services and APs available at that healthcare facility. \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n

Search filters

\r\n
\r\n
\r\n \r\n \r\n
\r\n

\r\n Providers\r\n \r\n Healthcare provider types\r\n \r\n

\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
Within {{distanceKms}}{{distanceKms === 0 ? \"km\" : \"kms\"}}
\r\n
\r\n
{{matSlider.min}}
\r\n
\r\n \r\n \r\n
\r\n
{{matSlider.max}}kms
\r\n
\r\n
\r\n
\r\n

\r\n \r\n Services\r\n 0)\">\r\n \r\n Reset\r\n

\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n Sort\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n Show more results\r\n
\r\n
\r\n

{{noResultsText}}

\r\n
    \r\n
  • If you searched by person or healthcare facility, try searching by the type of healthcare service, service category or specialty instead e.g. gynaecology.

  • \r\n
  • Suggestions for results will appear in a drop-down menu as you start typing in the search bar.

  • \r\n
  • You can widen or narrow your search location by using the “Include nearby locations” slider in the filter panel options.

  • \r\n
  • Try using a different search term or keyword(s).

  • \r\n
  • If you're still unable to find what you need, please contact us.

  • \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n","import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { ViewEncapsulation } from '@angular/core';\r\nimport { ActivatedRoute, NavigationStart, Params, Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { FilterModel } from '../../models/filter.model';\r\nimport { Profile } from '../../models/search.model';\r\nimport { WebApiModel } from '../../models/web-api.model';\r\nimport { FilterService } from '../../services/filter.service';\r\nimport { GoogleAnalyticsService } from '../../services/google-analytics.service';\r\nimport { LocationService } from '../../services/location.service';\r\nimport { RouterHelperService } from '../../services/router-helper.service';\r\nimport { SearchService } from '../../services/search.service';\r\nimport { SeoService } from '../../services/seo.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { StateService } from '../../services/state.service';\r\nimport { StateRxService } from '../../services/staterx.service';\r\nimport { UiService } from '../../services/ui.service';\r\nimport { PopupMapComponent } from '../maps/popup-map/popup-map.component';\r\nimport { PopupComponent } from '../popup/popup.component';\r\nimport { MapService } from '../../components/maps/healthcarefinder-map.service';\r\n\r\nconst initialSearchTypeParamName = 'initial-search-type';\r\nconst initialSearchResultsTypeParamName = 'initial-search-results-type';\r\nconst initialServiceSearchTermParamName = 'initial-search-term';\r\nconst initialServiceCategorySearchTermParamName = 'initial-search-category-term';\r\nconst initialServiceCategoryFilterTermParamName = 'initial-filter-category-term';\r\n\r\n@Component({\r\n selector: 'hcf-search-results',\r\n templateUrl: './search-results.component.html',\r\n styleUrls: ['./search-results.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n\r\nexport class SearchResultsComponent implements OnInit, OnDestroy {\r\n // search terms\r\n searchTerm: string;\r\n locationTerm: string;\r\n nextPage: number;\r\n searchResultsType: string;\r\n initialSearchResultsType: string;\r\n searchType = { profile: 'profile', service: 'service' };\r\n initialSearchType: string;\r\n initialSearchTerm: string;\r\n serviceCategorySearchTerm: string;\r\n initialServiceCategorySearchTerm: string;\r\n serviceCategoryFilterTerm: string; // Used to search Service Category Totals separately from results\r\n initialServiceCategoryFilterTerm: string;\r\n serviceSearchTerm: string;\r\n initialServiceSearchTerm: string;\r\n latitude: string;\r\n longitude: string;\r\n myLocationLabel: string;\r\n affiliatedProvider: boolean;\r\n affiliatedProviderConsult: boolean;\r\n easyClaim: boolean;\r\n telehealth: boolean;\r\n distance: boolean;\r\n distanceKms: number;\r\n defaultDistanceKms: number = 10;\r\n pageSize: number = 6;\r\n searchTermDisplay: string;\r\n serviceDescriptionSelected: string;\r\n initialSpecialtySearchTerm: string;\r\n specialtySearchTerm: string;\r\n specialtySelected: string;\r\n\r\n // search results\r\n profiles: Profile[];\r\n places: Profile[];\r\n placesForMap: WebApiModel.Location[];\r\n placesForPopupMap: WebApiModel.Location[];\r\n morePeopleExist: boolean;\r\n morePlacesExist: boolean;\r\n\r\n // filter variables\r\n profileTotals: FilterModel.ProfileTotals;\r\n displayTotals: FilterModel.ProfileTotal;\r\n displayServiceCategory: FilterModel.ServiceCategory = new FilterModel.ServiceCategory();\r\n noResultsText: string = SettingsService.values.noResultsText;\r\n filterType = { people: 'people', places: 'places' };\r\n selectedFilterType: string = this.filterType.places;\r\n hasResults: boolean = false; // are there any places and or profiles?\r\n searchAttempted: boolean = false; // used to stop the Noresults found message showing up at start\r\n showMoreResults: boolean = false; // whether to show Show More results button when filtering\r\n isLoading: boolean = false;\r\n searchFiltersPanelExpanded: boolean = true;\r\n mobileMapExpanded: boolean = false;\r\n resetAvailable: boolean = true;\r\n serviceCategoryDisplay: boolean = false;\r\n sortRules: object;\r\n selectedSort: object;\r\n private _subscriptionOpenPopupMap: Subscription;\r\n private _subscriptionFindClick: Subscription;\r\n private _searchSubscription: Subscription;\r\n mobileVewSize = 768;\r\n\r\n @ViewChild('filterHelpPopupComponent') filterHelpPopupComponent: PopupComponent;\r\n @ViewChild('popupMapComponent') popupMapComponent: PopupMapComponent;\r\n\r\n constructor(private _route: ActivatedRoute,\r\n private _searchService: SearchService,\r\n private _stateRxService: StateRxService,\r\n private _stateService: StateService,\r\n private _filterService: FilterService,\r\n private _seoService: SeoService,\r\n private _router: Router,\r\n private _gaService: GoogleAnalyticsService,\r\n private _locationService: LocationService,\r\n private _uiService: UiService,\r\n private _mapService: MapService) {\r\n\r\n _router.events.subscribe(event => {\r\n if (event instanceof NavigationStart) {\r\n if (event.url.indexOf(RouterHelperService.appBaseRoute.searchResults) >= 1) {\r\n this.initialiseVariables();\r\n // this needs to be changed to accept two parameters\r\n this._gaService.sendPageViewEvent(this._router.url);\r\n }\r\n }\r\n });\r\n this._subscriptionFindClick = _stateRxService.findClick.rxSubscribe(() => {\r\n this.resetSort();\r\n });\r\n this._subscriptionOpenPopupMap = _stateRxService.openPopupMap.rxSubscribe(location => {\r\n this.openPopupMap(location);\r\n });\r\n\r\n // Subscribe to any changes made to the search query parameters and update the search results page accordingly\r\n this._searchSubscription = this._stateRxService.searchQueryParameters.rxSubscribe(updatedSearchQueryParameters => {\r\n this.initializeSearchParameters(updatedSearchQueryParameters);\r\n });\r\n\r\n if (window.innerWidth > this.mobileVewSize) {\r\n this.serviceCategoryDisplay = true;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this._seoService.setTitle(SettingsService.values.searchResultsTitle);\r\n this.initializeSearchParameters(this._stateService.getSearchQueryParameters());\r\n\r\n // Collapse map on mobile by default\r\n if (this._uiService.isMobile()) {\r\n this.mobileMapExpanded = false;\r\n }\r\n\r\n // If browser is resized from mobile to desktop we need to show the map if it was hidden.\r\n // We need this becasue of ngIf used to collapse map on mobile.\r\n // We need ngIf to collapse/expand the map because otherwise it's not initialised properly when it's hidden.\r\n this._stateRxService.mobileLayoutChanged.rxSubscribe(isMobile => {\r\n this.mobileMapExpanded = !isMobile;\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this._searchSubscription.unsubscribe();\r\n }\r\n\r\n // Initializes local search parameters with what's being passed to the search results page\r\n // from the search input (or home) page\r\n async initializeSearchParameters(searchQueryParameters: any) {\r\n this.initialiseVariables();\r\n this.selectedFilterType = this.filterType.places;\r\n this.serviceDescriptionSelected = 'false';\r\n this.specialtySelected = 'false';\r\n\r\n if (!this.isValidSearch(searchQueryParameters)) {\r\n this._router.navigateByUrl('/');\r\n return;\r\n }\r\n\r\n // Basic search terms\r\n\r\n this.searchTerm = searchQueryParameters[RouterHelperService.urlParam.term];\r\n this.locationTerm = searchQueryParameters[RouterHelperService.urlParam.location];\r\n this.latitude = searchQueryParameters[RouterHelperService.urlParam.latitude];\r\n this.longitude = searchQueryParameters[RouterHelperService.urlParam.longitude];\r\n this.myLocationLabel = searchQueryParameters[RouterHelperService.urlParam.myLocationLabel];\r\n // AP and EC checkboxes\r\n\r\n if (searchQueryParameters[RouterHelperService.urlParam.affiliatedProvider] || searchQueryParameters[RouterHelperService.urlParam.affiliatedProvider] != null) {\r\n this.affiliatedProvider = searchQueryParameters[RouterHelperService.urlParam.affiliatedProvider];\r\n } else {\r\n this.affiliatedProvider = true;\r\n }\r\n if (searchQueryParameters[RouterHelperService.urlParam.affiliatedProviderConsult] || searchQueryParameters[RouterHelperService.urlParam.affiliatedProviderConsult] != null) {\r\n this.affiliatedProviderConsult = searchQueryParameters[RouterHelperService.urlParam.affiliatedProviderConsult];\r\n } else {\r\n this.affiliatedProviderConsult = true;\r\n }\r\n if (searchQueryParameters[RouterHelperService.urlParam.easyClaim] || searchQueryParameters[RouterHelperService.urlParam.easyClaim] != null) {\r\n this.easyClaim = searchQueryParameters[RouterHelperService.urlParam.easyClaim];\r\n } else {\r\n this.easyClaim = true;\r\n }\r\n if (searchQueryParameters[RouterHelperService.urlParam.telehealth] || searchQueryParameters[RouterHelperService.urlParam.telehealth] != null) {\r\n this.telehealth = searchQueryParameters[RouterHelperService.urlParam.telehealth];\r\n } else {\r\n this.telehealth = true;\r\n }\r\n if (searchQueryParameters[RouterHelperService.urlParam.distance] || searchQueryParameters[RouterHelperService.urlParam.distance] != null) {\r\n this.distance = searchQueryParameters[RouterHelperService.urlParam.distance];\r\n this.distanceKms = searchQueryParameters[RouterHelperService.urlParam.distanceKms];\r\n } else {\r\n // By default, enable distance slider if an address/location has been specified\r\n this.distance = true;\r\n this.distanceKms = this.defaultDistanceKms;\r\n }\r\n\r\n // Search type\r\n\r\n this.serviceCategorySearchTerm = searchQueryParameters[RouterHelperService.urlParam.serviceCategory];\r\n this.serviceSearchTerm = searchQueryParameters[RouterHelperService.urlParam.service];\r\n this.serviceDescriptionSelected = searchQueryParameters[RouterHelperService.urlParam.serviceSelected];\r\n this.specialtySearchTerm = searchQueryParameters[RouterHelperService.urlParam.specialty];\r\n this.specialtySelected = searchQueryParameters[RouterHelperService.urlParam.specialtySelected];\r\n\r\n if (searchQueryParameters[RouterHelperService.urlParam.searchType] === this.filterType.people) {\r\n this.selectedFilterType = this.filterType.people;\r\n this.serviceCategoryFilterTerm = searchQueryParameters[RouterHelperService.urlParam.serviceCategoryFilter];\r\n }\r\n if (searchQueryParameters[RouterHelperService.urlParam.searchType] === this.filterType.places\r\n || !searchQueryParameters[RouterHelperService.urlParam.searchType]) {\r\n this.selectedFilterType = this.filterType.places;\r\n this.serviceCategoryFilterTerm = searchQueryParameters[RouterHelperService.urlParam.serviceCategoryFilter];\r\n }\r\n\r\n this.searchResultsType = searchQueryParameters[RouterHelperService.urlParam.searchType];\r\n\r\n if (searchQueryParameters[RouterHelperService.urlParam.searchType] === SettingsService.searchResultsType.serviceCategories) {\r\n // want to search by service categories ONLY\r\n // this.searchTerm = null; // us12305 - comment this line as we need to remain the searchTerm when filtering the search result.\r\n this.serviceSearchTerm = null;\r\n this.serviceCategorySearchTerm = null;\r\n this.serviceCategoryFilterTerm = searchQueryParameters[RouterHelperService.urlParam.term];\r\n } else if (searchQueryParameters[RouterHelperService.urlParam.searchType] === SettingsService.searchResultsType.serviceCategory) {\r\n // want to search by service category ONLY\r\n // this.searchTerm = null; // us12305 - comment this line as we need to remain the searchTerm when filtering the search result.\r\n this.serviceSearchTerm = null;\r\n this.serviceCategorySearchTerm = searchQueryParameters[RouterHelperService.urlParam.term];\r\n this.serviceCategoryFilterTerm = null;\r\n } else if (searchQueryParameters[RouterHelperService.urlParam.searchType] === SettingsService.searchResultsType.services) {\r\n // want to search by service ONLY\r\n // this.searchTerm = null; // us12305 - comment this line as we need to remain the searchTerm when filtering the search result.\r\n this.serviceSearchTerm = searchQueryParameters[RouterHelperService.urlParam.term];\r\n this.serviceCategorySearchTerm = null;\r\n this.serviceCategoryFilterTerm = null;\r\n } else if (searchQueryParameters[RouterHelperService.urlParam.searchType] === SettingsService.searchResultsType.service) {\r\n // want to search by service ONLY\r\n // this.searchTerm = null; // us12305 - comment this line as we need to remain the searchTerm when filtering the search result.\r\n this.serviceSearchTerm = searchQueryParameters[RouterHelperService.urlParam.term];\r\n this.serviceCategorySearchTerm = null;\r\n this.serviceCategoryFilterTerm = null;\r\n this.serviceDescriptionSelected = 'true';\r\n } else if (searchQueryParameters[RouterHelperService.urlParam.searchType] === SettingsService.searchResultsType.specialties) {\r\n // want to search by service ONLY\r\n // this.searchTerm = null; // us12305 - comment this line as we need to remain the searchTerm when filtering the search result.\r\n this.specialtySearchTerm = searchQueryParameters[RouterHelperService.urlParam.term];\r\n this.serviceCategorySearchTerm = null;\r\n this.serviceCategoryFilterTerm = null;\r\n this.initSelectedFilterType(searchQueryParameters);\r\n } else if (searchQueryParameters[RouterHelperService.urlParam.searchType] === SettingsService.searchResultsType.specialty) {\r\n // want to search by service ONLY\r\n // this.searchTerm = null; // us12305 - comment this line as we need to remain the searchTerm when filtering the search result.\r\n this.specialtySearchTerm = searchQueryParameters[RouterHelperService.urlParam.term];\r\n this.serviceCategorySearchTerm = null;\r\n this.serviceCategoryFilterTerm = null;\r\n this.specialtySelected = 'true';\r\n this.initSelectedFilterType(searchQueryParameters);\r\n }\r\n\r\n // Initial search settings\r\n\r\n this.initialSearchTerm = this.searchTerm;\r\n if (searchQueryParameters[initialSearchTypeParamName]) {\r\n this.initialSearchType = searchQueryParameters[initialSearchTypeParamName];\r\n } else {\r\n if (this.serviceCategorySearchTerm || this.serviceCategoryFilterTerm || this.serviceSearchTerm || this.specialtySearchTerm) {\r\n this.initialSearchType = this.searchType.service;\r\n } else {\r\n this.initialSearchType = this.searchType.profile;\r\n }\r\n }\r\n\r\n\r\n if (searchQueryParameters[initialServiceSearchTermParamName]) {\r\n this.initialServiceSearchTerm = this.noneToNull(searchQueryParameters[initialServiceSearchTermParamName]);\r\n } else {\r\n this.initialServiceSearchTerm = this.serviceSearchTerm;\r\n }\r\n\r\n if (searchQueryParameters[initialServiceCategorySearchTermParamName]) {\r\n this.initialServiceCategorySearchTerm = this.noneToNull(searchQueryParameters[initialServiceCategorySearchTermParamName]);\r\n } else {\r\n this.initialServiceCategorySearchTerm = this.serviceCategorySearchTerm;\r\n }\r\n\r\n if (searchQueryParameters[initialServiceCategoryFilterTermParamName]) {\r\n this.initialServiceCategoryFilterTerm = this.noneToNull(searchQueryParameters[initialServiceCategoryFilterTermParamName]);\r\n } else {\r\n this.initialServiceCategoryFilterTerm = this.serviceCategoryFilterTerm;\r\n }\r\n\r\n if (searchQueryParameters[initialSearchResultsTypeParamName]) {\r\n this.initialSearchResultsType = this.noneToNull(searchQueryParameters[initialSearchResultsTypeParamName]);\r\n } else {\r\n this.initialSearchResultsType = this.searchResultsType;\r\n }\r\n\r\n this.setResetAvailable();\r\n this.setSearchTermDisplay();\r\n\r\n // Retrieve lat/lng of specified location\r\n await this.setLatLngFromLocation();\r\n\r\n this.initialSortValue(this.locationTerm, this.latitude, this.longitude);\r\n\r\n // Initiate the search and update the page\r\n\r\n if (this.initialSearchType === this.searchType.service) {\r\n this.getServiceCategoryFilterData();\r\n this.getDataByService();\r\n this.getLocationsByService();\r\n } else {\r\n this.getFilterData();\r\n this.getData();\r\n this.getLocations();\r\n }\r\n\r\n\r\n }\r\n\r\n private initSelectedFilterType(searchQueryParameters: any) {\r\n switch (searchQueryParameters[RouterHelperService.urlParam.defaultCategory]) {\r\n case this.filterType.people:\r\n this.selectedFilterType = this.filterType.people;\r\n break;\r\n case this.filterType.places:\r\n this.selectedFilterType = this.filterType.places;\r\n break;\r\n default:\r\n this.selectedFilterType = this.filterType.places;\r\n }\r\n }\r\n // Retrieve lat/lng of specified location\r\n private async setLatLngFromLocation() {\r\n if (this.locationTerm && this.locationTerm.length > 0) {\r\n const loc = await this._mapService.getLocationFromAddress(this.locationTerm + \", New Zealand\");\r\n\r\n if (loc) {\r\n this.latitude = loc.lat.toString();\r\n this.longitude = loc.lng.toString();\r\n }\r\n }\r\n }\r\n\r\n // Checks if the search operation is valid\r\n // For a search operation to be valid it has to have a search term\r\n private isValidSearch(searchParameters: any): boolean {\r\n if (searchParameters != null && searchParameters[RouterHelperService.urlParam.term]) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n // Constructs the text that needs to be displayed in the search results page as the page header\r\n private setSearchTermDisplay() {\r\n let text = '';\r\n const provideMatchingService = ' providing services matching ';\r\n const matching = ' matching ';\r\n const quote = '\\'';\r\n if (this.selectedFilterType === this.filterType.people) {\r\n text = 'People';\r\n } else {\r\n text = 'Places';\r\n }\r\n\r\n if (this.serviceSearchTerm) {\r\n text += provideMatchingService + quote + this.serviceSearchTerm + quote;\r\n } else if (this.serviceCategorySearchTerm) {\r\n text += provideMatchingService + quote + this.serviceCategorySearchTerm + quote;\r\n } else if (this.serviceCategoryFilterTerm) {\r\n text += provideMatchingService + quote + this.serviceCategoryFilterTerm + quote;\r\n } else {\r\n text += matching + quote + this.searchTerm + quote;\r\n }\r\n\r\n if (this.locationTerm) {\r\n text += ' in ' + quote + this.locationTerm + quote;\r\n }\r\n\r\n this.searchTermDisplay = text;\r\n }\r\n\r\n onDistanceUpdate(event: any) {\r\n // Update distance shown in interface as user slides\r\n this.distanceKms = event.value;\r\n }\r\n\r\n onDistanceChange(event: any) {\r\n // Check the \"include nearby locations\" box\r\n this.distance = true;\r\n\r\n // Perform search\r\n if (!this.isLoading) {\r\n this.isLoading = true;\r\n this.reroute();\r\n }\r\n }\r\n\r\n // Decides if the reset button is available in the search results page\r\n private setResetAvailable() {\r\n this.resetAvailable = false;\r\n\r\n if ((this.searchTerm || this.initialSearchTerm) &&\r\n (this.searchTerm !== this.initialSearchTerm)) {\r\n this.resetAvailable = true;\r\n } else if ((this.serviceSearchTerm || this.initialServiceSearchTerm) &&\r\n (this.serviceSearchTerm !== this.initialServiceSearchTerm)) {\r\n this.resetAvailable = true;\r\n } else if ((this.specialtySearchTerm || this.initialSpecialtySearchTerm) &&\r\n (this.serviceSearchTerm !== this.initialServiceSearchTerm)) {\r\n this.resetAvailable = true;\r\n } else if ((this.serviceCategorySearchTerm || this.initialServiceCategorySearchTerm) &&\r\n (this.serviceCategorySearchTerm !== this.initialServiceCategorySearchTerm)) {\r\n this.resetAvailable = true;\r\n } else if ((this.serviceCategoryFilterTerm || this.initialServiceCategoryFilterTerm) &&\r\n (this.serviceCategoryFilterTerm !== this.initialServiceCategoryFilterTerm)) {\r\n this.resetAvailable = true;\r\n }\r\n }\r\n\r\n private initialiseVariables() {\r\n this.nextPage = 1;\r\n this.profiles = [];\r\n this.places = [];\r\n }\r\n\r\n private selectServiceCategorySearchTerm(): string {\r\n if (this.serviceCategorySearchTerm) {\r\n return '%' + this.serviceCategorySearchTerm + '%';\r\n } else if (this.serviceCategoryFilterTerm) {\r\n return '%' + this.serviceCategoryFilterTerm + '%';\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private selectServiceSearchTerm(): string {\r\n if (this.initialSearchResultsType === SettingsService.searchResultsType.services) {\r\n if (this.serviceDescriptionSelected === 'true') {\r\n return this.serviceSearchTerm;\r\n }\r\n return '%' + this.serviceSearchTerm + '%';\r\n }\r\n\r\n return this.serviceSearchTerm;\r\n }\r\n\r\n private selectSpecialtySearchTerm(): string {\r\n /* It seems as if adding the wildcards caused false positives.\r\n Business was concerned that a search for urologist returned neurologist as well.\r\n Keeping the code commented out until after testing. If successful, the code will\r\n be removed entirely\r\n */\r\n // if (this.initialSearchResultsType === SettingsService.searchResultsType.specialties) {\r\n // if (this.specialtySelected === 'true') {\r\n // return this.specialtySearchTerm;\r\n // }\r\n // return '%' + this.specialtySearchTerm + '%';\r\n // }\r\n\r\n return this.specialtySearchTerm;\r\n }\r\n\r\n private async getFilterData() {\r\n this.showMoreResults = false;\r\n\r\n this._filterService.getTotals(this.searchTerm, this.locationTerm, this.affiliatedProvider, this.affiliatedProviderConsult,\r\n this.easyClaim, this.telehealth, this.latitude, this.longitude, this.distance, this.distanceKms, this.selectServiceCategorySearchTerm(), this.selectServiceSearchTerm(), this.selectSpecialtySearchTerm())\r\n .subscribe((response: FilterModel.ProfileTotals) => {\r\n this.profileTotals = response;\r\n this.setFilterType(this.selectedFilterType, false);\r\n });\r\n }\r\n\r\n resetFilter(): void {\r\n this.searchTerm = this.initialSearchTerm;\r\n this.serviceSearchTerm = this.initialServiceSearchTerm;\r\n this.serviceCategorySearchTerm = this.initialServiceCategorySearchTerm;\r\n this.serviceCategoryFilterTerm = this.initialServiceCategoryFilterTerm;\r\n this.serviceDescriptionSelected = 'false';\r\n this.specialtySelected = 'false';\r\n this.reroute();\r\n }\r\n\r\n unsetService(): void {\r\n if (this.serviceSearchTerm) {\r\n if (this.initialServiceSearchTerm && this.serviceSearchTerm === this.initialServiceSearchTerm) {\r\n this.searchTerm = this.initialSearchTerm;\r\n this.serviceSearchTerm = this.initialServiceSearchTerm;\r\n this.serviceCategorySearchTerm = this.initialServiceCategorySearchTerm;\r\n this.serviceCategoryFilterTerm = this.initialServiceCategoryFilterTerm;\r\n } else {\r\n this.serviceDescriptionSelected = 'false';\r\n this.serviceSearchTerm = this.initialServiceSearchTerm;\r\n }\r\n this.reroute();\r\n } else if (this.specialtySearchTerm) {\r\n if (this.initialSpecialtySearchTerm && this.specialtySearchTerm === this.initialSpecialtySearchTerm) {\r\n this.searchTerm = this.initialSearchTerm;\r\n this.specialtySearchTerm = this.initialSpecialtySearchTerm;\r\n } else {\r\n this.specialtySelected = 'false';\r\n //this.specialtySearchTerm = this.initialSpecialtySearchTerm;\r\n }\r\n this.serviceCategorySearchTerm = this.initialServiceCategorySearchTerm;\r\n this.serviceCategoryFilterTerm = this.initialServiceCategoryFilterTerm;\r\n this.reroute();\r\n } else if (this.serviceCategorySearchTerm) {\r\n this.resetFilter();\r\n }\r\n }\r\n\r\n filterByServiceCategory(serviceCategory: string): void {\r\n this.serviceCategorySearchTerm = serviceCategory;\r\n this.reroute();\r\n }\r\n\r\n async getServiceCategoryFilterData() {\r\n this._filterService.getServiceTotals(this.searchTerm, this.locationTerm, this.affiliatedProvider, this.affiliatedProviderConsult, this.easyClaim, this.telehealth, this.latitude, this.longitude,\r\n this.distance, this.distanceKms, this.selectServiceCategorySearchTerm(), this.selectServiceSearchTerm(), this.selectSpecialtySearchTerm())\r\n .subscribe((response: FilterModel.ProfileTotals) => {\r\n this.profileTotals = response;\r\n this.setFilterType(this.selectedFilterType, false);\r\n });\r\n }\r\n\r\n filterByService(service: string): void {\r\n this.serviceSearchTerm = service;\r\n this.serviceDescriptionSelected = 'true';\r\n this.reroute();\r\n }\r\n\r\n getDataScroll() {\r\n if ((this.selectedFilterType === this.filterType.people && !this.morePeopleExist)\r\n || (this.selectedFilterType === this.filterType.places && !this.morePlacesExist)\r\n || (!this.morePeopleExist && !this.morePlacesExist)) {\r\n return;\r\n }\r\n\r\n if (this.initialSearchType === this.searchType.service) {\r\n this.getDataByService();\r\n } else {\r\n this.getData();\r\n }\r\n }\r\n\r\n getData(): void {\r\n this.getPeopleAndPlaces(this.searchTerm, this.locationTerm, this.affiliatedProvider, this.affiliatedProviderConsult, this.selectedSort[\"value\"], this.easyClaim, this.telehealth,\r\n this.latitude, this.longitude, this.distance, this.distanceKms);\r\n this.nextPage++;\r\n }\r\n\r\n getDataByService(): void {\r\n this.getPeopleAndPlacesByService(this.searchTerm, this.locationTerm, this.affiliatedProvider, this.affiliatedProviderConsult, this.selectedSort[\"value\"], this.easyClaim, this.telehealth, this.latitude,\r\n this.longitude, this.distance, this.distanceKms);\r\n if (this.displayTotals && this.displayTotals.serviceCategoryTotals) {\r\n this.displayServiceCategory = this.displayTotals.serviceCategoryTotals.find(x => x.name === this.serviceCategorySearchTerm);\r\n }\r\n this.nextPage++;\r\n }\r\n\r\n setFilterType(type: string, getLocations: boolean): void {\r\n this.selectedFilterType = type;\r\n this.showMoreResults = false;\r\n if (type === this.filterType.people) {\r\n if (this.profileTotals) {\r\n this.displayTotals = this.profileTotals.peopleTotals;\r\n this.hasResults = this.profileTotals.peopleTotals.total > 0;\r\n }\r\n this.showMoreResults = this.morePeopleExist;\r\n } else if (type === this.filterType.places) {\r\n if (this.profileTotals) {\r\n this.displayTotals = this.profileTotals.placesTotals;\r\n this.hasResults = this.profileTotals.placesTotals.total > 0;\r\n }\r\n this.showMoreResults = this.morePlacesExist;\r\n }\r\n\r\n if (this.displayTotals && this.displayTotals.serviceCategoryTotals) {\r\n this.displayServiceCategory = this.displayTotals.serviceCategoryTotals.find(x => x.name === this.serviceCategorySearchTerm);\r\n }\r\n\r\n if (getLocations) {\r\n if (this.initialSearchType === this.searchType.service) {\r\n this.getLocationsByService();\r\n } else {\r\n this.getLocations();\r\n }\r\n }\r\n\r\n this.setSearchTermDisplay();\r\n }\r\n\r\n setFilterEC(isEasyClaimChecked: boolean): void {\r\n this.isLoading = true;\r\n this.easyClaim = !this.easyClaim;\r\n this.reroute();\r\n }\r\n\r\n setFilterTelehealth(isTelehealthChecked: boolean): void {\r\n this.isLoading = true;\r\n this.telehealth = !this.telehealth;\r\n this.reroute();\r\n }\r\n\r\n setFilterAP(isAffiliatedProviderChecked: boolean): void {\r\n this.isLoading = true;\r\n this.affiliatedProvider = !this.affiliatedProvider;\r\n if (!isAffiliatedProviderChecked) {\r\n this.affiliatedProviderConsult = false;\r\n this.telehealth = false;\r\n } else {\r\n this.affiliatedProviderConsult = true;\r\n this.telehealth = true;\r\n }\r\n this.reroute();\r\n }\r\n\r\n setFilterAPConsult(isAffiliatedProviderConsulChecked: boolean): void {\r\n this.isLoading = true;\r\n this.affiliatedProviderConsult = !this.affiliatedProviderConsult;\r\n this.reroute();\r\n }\r\n\r\n setFilterDistanceKms(isDistanceKmsChecked: boolean): void {\r\n this.isLoading = true;\r\n this.distance = !this.distance;\r\n this.reroute();\r\n }\r\n\r\n private async getLocations() {\r\n this._locationService.getLocations(this.searchTerm, this.locationTerm, this.affiliatedProvider, this.affiliatedProviderConsult, this.selectedSort[\"value\"], this.easyClaim,\r\n this.telehealth, this.latitude, this.longitude, this.distance, this.distanceKms, this.selectServiceCategorySearchTerm(),\r\n this.selectServiceSearchTerm(), this.selectSpecialtySearchTerm(), this.selectedFilterType === this.filterType.people)\r\n .subscribe((response: WebApiModel.Location[]) => {\r\n this.placesForMap = response;\r\n });\r\n }\r\n\r\n private async getLocationsByService() {\r\n this._locationService.getLocationsByService(this.searchTerm, this.selectServiceCategorySearchTerm(), this.selectServiceSearchTerm(), this.selectSpecialtySearchTerm(),\r\n this.locationTerm, this.affiliatedProvider, this.affiliatedProviderConsult, this.selectedSort[\"value\"], this.easyClaim, this.telehealth, this.latitude, this.longitude, this.distance, this.distanceKms,\r\n this.selectedFilterType === this.filterType.people)\r\n .subscribe((response: WebApiModel.Location[]) => {\r\n this.placesForMap = response;\r\n });\r\n }\r\n private sortByAlphabetAscend(profiles: Profile[]) {\r\n profiles.sort((a, b) => a.type.localeCompare(b.type));\r\n profiles.sort(function (a, b) {\r\n if (a.type === \"people\") {\r\n if ((a.data).firstName < (b.data).firstName) { return -1; }\r\n if ((a.data).firstName > (b.data).firstName) { return 1; }\r\n return 0;\r\n }\r\n if (a.type === \"places\") {\r\n if ((a.data).practiceName < (b.data).practiceName) { return -1; }\r\n if ((a.data).practiceName > (b.data).practiceName) { return 1; }\r\n return 0;\r\n }\r\n })\r\n }\r\n private sortByAlphabetDescend(profiles: Profile[]) {\r\n profiles.sort((a, b) => a.type.localeCompare(b.type));\r\n profiles.sort(function (a, b) {\r\n if (a.type === \"people\") {\r\n if ((a.data).firstName > (b.data).firstName) { return -1; }\r\n if ((a.data).firstName < (b.data).firstName) { return 1; }\r\n return 0;\r\n }\r\n if (a.type === \"places\") {\r\n if ((a.data).practiceName > (b.data).practiceName) { return -1; }\r\n if ((a.data).practiceName < (b.data).practiceName) { return 1; }\r\n return 0;\r\n }\r\n })\r\n }\r\n private sortByNearestLocation(profiles: Profile[]) {\r\n profiles.sort((a, b) => a.type.localeCompare(b.type));\r\n profiles.sort(function (a, b) {\r\n if (a.type === \"places\") {\r\n return (a.data).distance - (b.data).distance;\r\n }\r\n })\r\n }\r\n sortChange() {\r\n switch (this.selectedSort) {\r\n case this.sortRules[0]:\r\n this.reroute();\r\n break;\r\n case this.sortRules[1]:\r\n this.reroute()\r\n break;\r\n case this.sortRules[2]:\r\n this.reroute()\r\n break;\r\n }\r\n }\r\n private resetSort() {\r\n if ((this.latitude && this.longitude) || this.locationTerm) {\r\n this.sortRules = [\r\n { value: \"ascend\", label: 'Ascending (A to Z)' },\r\n { value: \"descend\", label: 'Descending (Z to A)' },\r\n { value: \"location\", label: 'Nearest to location' }\r\n ];\r\n this.selectedSort = this.sortRules[2];\r\n } else {\r\n this.sortRules = [\r\n { value: \"ascend\", label: 'Ascending (A to Z)' },\r\n { value: \"descend\", label: 'Descending (Z to A)' }\r\n ];\r\n this.selectedSort = this.sortRules[0];\r\n }\r\n }\r\n\r\n private initialSortValue(location: string, latitude: string, longitude: string) {\r\n if ((latitude && longitude) || location) {\r\n this.sortRules = [\r\n { value: \"ascend\", label: 'Ascending (A to Z)' },\r\n { value: \"descend\", label: 'Descending (Z to A)' },\r\n { value: \"location\", label: 'Nearest to location' }\r\n ];\r\n if (!this.selectedSort) {\r\n this.selectedSort = this.sortRules[2];\r\n }\r\n } else {\r\n this.sortRules = [\r\n { value: \"ascend\", label: 'Ascending (A to Z)' },\r\n { value: \"descend\", label: 'Descending (Z to A)' }\r\n ];\r\n if (!this.selectedSort || (this.selectedSort && this.selectedSort[\"value\"] === \"location\")) {\r\n this.selectedSort = this.sortRules[0];\r\n }\r\n }\r\n }\r\n private getPeopleAndPlaces(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort: string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): void {\r\n // set loading so spinner shows if necessary\r\n this.isLoading = true;\r\n this._searchService.getPeopleAndPlaces(name, location, affiliatedProvider, affiliatedProviderConsult, sort, easyClaim, telehealth, this.nextPage, this.pageSize,\r\n this.selectServiceCategorySearchTerm(), this.selectServiceSearchTerm(), this.selectSpecialtySearchTerm(), latitude, longitude, distance, distanceKms)\r\n .subscribe((response: Profile[][]) => {\r\n this.isLoading = false;\r\n this.profiles = this.profiles.concat(response[0]);\r\n this.morePeopleExist = response[0].length === this.pageSize;\r\n this.places = this.places.concat(response[1]);\r\n this.profiles = this.profiles.concat(response[1]);\r\n this.morePlacesExist = response[1].length === this.pageSize;\r\n this.searchAttempted = true;\r\n const lastDefaultCategory = this._stateService.getLastDefaultCategory();\r\n if (lastDefaultCategory) {\r\n this.setFilterType(lastDefaultCategory.toLowerCase(), false);\r\n } else {\r\n this.setFilterType(this.selectedFilterType, false);\r\n }\r\n const locationInput: string = location ? location : (latitude && longitude ? this.myLocationLabel : null);\r\n if (this.profiles && this.profiles.length <= 0) {\r\n this._gaService.sendNoSearchResultsEvent(name, locationInput);\r\n } else {\r\n this._gaService.sendSearchResultsEvent(name, locationInput);\r\n }\r\n },\r\n () => {\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n private getPeopleAndPlacesByService(name: string,\r\n location: string,\r\n affiliatedProvider: boolean,\r\n affiliatedProviderConsult: boolean,\r\n sort: string,\r\n easyClaim: boolean,\r\n telehealth: boolean,\r\n latitude: string,\r\n longitude: string,\r\n distance: boolean,\r\n distanceKms: number): void {\r\n // set loading so spinner shows if necesssary\r\n this.isLoading = true;\r\n this._searchService.getPeopleAndPlacesByService(name, this.selectServiceCategorySearchTerm(), this.selectServiceSearchTerm(), this.selectSpecialtySearchTerm(),\r\n location, affiliatedProvider, affiliatedProviderConsult, sort, easyClaim, telehealth, this.nextPage, this.pageSize, latitude, longitude, distance, distanceKms)\r\n .subscribe((response: Profile[][]) => {\r\n this.isLoading = false;\r\n this.profiles = this.profiles.concat(response[0]);\r\n this.morePeopleExist = response[0].length === this.pageSize;\r\n this.places = this.places.concat(response[1]);\r\n this.profiles = this.profiles.concat(response[1]);\r\n this.morePlacesExist = response[1].length === this.pageSize;\r\n this.searchAttempted = true;\r\n const lastDefaultCategory = this._stateService.getLastDefaultCategory();\r\n if (lastDefaultCategory) {\r\n this.setFilterType(lastDefaultCategory.toLowerCase(), false);\r\n } else {\r\n this.setFilterType(this.selectedFilterType, false);\r\n }\r\n this._stateService.clearLastDefaultCategory();\r\n //this.hasResults = this.profiles && this.profiles.length > 0;\r\n // Either service category or service will have a value but not both\r\n // The values seem to be prefixed and suffixed with % and %dietitian% would become NaNietitian cause of %d\r\n // Hence the character replacement before sending the event to Google Analytics\r\n let gaEventTerm = this.selectServiceCategorySearchTerm() || this.selectServiceSearchTerm() || this.selectSpecialtySearchTerm();\r\n gaEventTerm = gaEventTerm.replace(/%/g, '');\r\n const locationInput: string = location ? location : (latitude && longitude ? this.myLocationLabel : null);\r\n if (this.profiles && this.profiles.length <= 0) {\r\n this._gaService.sendNoSearchResultsEvent(gaEventTerm, locationInput);\r\n } else {\r\n this._gaService.sendSearchResultsEvent(gaEventTerm, locationInput);\r\n }\r\n this.setFilterType(this.selectedFilterType, false);\r\n },\r\n () => {\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n toggleSearchFiltersPanel() {\r\n this.searchFiltersPanelExpanded = !this.searchFiltersPanelExpanded;\r\n }\r\n\r\n toggleMap() {\r\n this.mobileMapExpanded = !this.mobileMapExpanded;\r\n this.openPopupMap(null);\r\n }\r\n\r\n shouldShowSlider() {\r\n return (this.displayTotals && this.locationTerm != null) || (this.displayTotals && this.latitude && this.longitude);\r\n }\r\n\r\n noneToNull(mightBeNone: string): string {\r\n if (mightBeNone === 'none') {\r\n return null;\r\n } else {\r\n return mightBeNone;\r\n }\r\n }\r\n\r\n nullToNone(mightBeNull: string): string {\r\n if (!mightBeNull) {\r\n return 'none';\r\n } else {\r\n return mightBeNull;\r\n }\r\n }\r\n\r\n private reroute() {\r\n const urlParams = {};\r\n\r\n urlParams[RouterHelperService.urlParam.term] = this.searchTerm;\r\n urlParams[RouterHelperService.urlParam.location] = this.locationTerm;\r\n urlParams[RouterHelperService.urlParam.searchType] = this.selectedFilterType;\r\n urlParams[RouterHelperService.urlParam.latitude] = this.latitude;\r\n urlParams[RouterHelperService.urlParam.longitude] = this.longitude;\r\n urlParams[RouterHelperService.urlParam.serviceCategory] = this.serviceCategorySearchTerm;\r\n urlParams[RouterHelperService.urlParam.serviceCategoryFilter] = this.serviceCategoryFilterTerm;\r\n urlParams[RouterHelperService.urlParam.service] = this.serviceSearchTerm;\r\n urlParams[RouterHelperService.urlParam.specialty] = this.specialtySearchTerm;\r\n urlParams[RouterHelperService.urlParam.easyClaim] = this.easyClaim;\r\n urlParams[RouterHelperService.urlParam.telehealth] = this.telehealth;\r\n urlParams[RouterHelperService.urlParam.distance] = this.distance;\r\n urlParams[RouterHelperService.urlParam.distanceKms] = (this.distance) ? this.distanceKms : this.defaultDistanceKms;\r\n urlParams[RouterHelperService.urlParam.affiliatedProvider] = this.affiliatedProvider;\r\n urlParams[RouterHelperService.urlParam.affiliatedProviderConsult] = this.affiliatedProviderConsult;\r\n urlParams[RouterHelperService.urlParam.sort] = this.selectedSort[\"value\"];\r\n urlParams[initialSearchTypeParamName] = this.initialSearchType;\r\n urlParams[RouterHelperService.urlParam.serviceSelected] = this.serviceDescriptionSelected;\r\n urlParams[RouterHelperService.urlParam.specialtySelected] = this.specialtySelected;\r\n urlParams[initialSearchResultsTypeParamName] = this.nullToNone(this.initialSearchResultsType);\r\n urlParams[initialServiceSearchTermParamName] = this.nullToNone(this.initialServiceSearchTerm);\r\n urlParams[initialServiceCategorySearchTermParamName] = this.nullToNone(this.initialServiceCategorySearchTerm);\r\n urlParams[initialServiceCategoryFilterTermParamName] = this.nullToNone(this.initialServiceCategoryFilterTerm);\r\n\r\n const routeUrl = RouterHelperService.getRoute(RouterHelperService.routeType.searchResults, null, null, urlParams);\r\n\r\n // Will save the query string collection to the newly added searchParameters and then later remove queryParams from navigate()\r\n\r\n this._stateService.setSearchQueryParameters(routeUrl.query);\r\n this._router.navigate(routeUrl.link);\r\n this._uiService.scrollToTop();\r\n }\r\n\r\n showFilterHelp() {\r\n this.filterHelpPopupComponent.openPopup();\r\n }\r\n\r\n openPopupMap(places: WebApiModel.Location[]) {\r\n if (places) {\r\n this.placesForPopupMap = places;\r\n } else {\r\n this.placesForPopupMap = this.placesForMap;\r\n }\r\n this.popupMapComponent.openPopupMap();\r\n }\r\n\r\n closePopupMap() {\r\n this.popupMapComponent.closePopupMap();\r\n }\r\n\r\n closePopup() {\r\n this.filterHelpPopupComponent.closePopup();\r\n }\r\n\r\n toggleServiceCategory(serviceCategoryDisplay: boolean) {\r\n this.serviceCategoryDisplay = !this.serviceCategoryDisplay;\r\n }\r\n}\r\n","import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nimport { RouteNotFoundComponent } from './components/app/route-not-found.component';\r\nimport { HomeComponent } from './components/home/home.component';\r\nimport { PersonProfileComponent } from './components/profile/person/person-profile.component';\r\nimport { PlaceProfileComponent } from './components/profile/place/place-profile.component';\r\nimport { SearchResultsComponent } from './components/search-results/search-results.component';\r\nimport { RouterHelperService } from './services/router-helper.service';\r\n\r\n/**\r\n * From Angualar 2 docs:\r\n * A Routing Module separates routing concerns from its companion module. It typically:\r\n * # defines routes\r\n * # adds router configuration to the module's imports\r\n * # re-exports RouterModule\r\n * # adds guard and resolver service providers to the module's providers.\r\n * # is not concerned with feature module declarations\r\n * The name of the Routing Module should parallel the name of its companion module, using the suffix \"Routing\".For example,\r\n * FooModule in foo.module.ts has a routing module named FooRoutingModule in foo - routing.module.ts\r\n */\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot([\r\n { path: RouterHelperService.appBaseRoute.personProfile + '/:id/:name', component: PersonProfileComponent },\r\n { path: RouterHelperService.appBaseRoute.personProfile + '/:id', component: PersonProfileComponent },\r\n // If no parameteres passed then redirect to the home page\r\n { path: RouterHelperService.appBaseRoute.personProfile, redirectTo: '/', pathMatch: 'full' },\r\n { path: RouterHelperService.appBaseRoute.placeProfile + '/:id/:name', component: PlaceProfileComponent },\r\n { path: RouterHelperService.appBaseRoute.placeProfile + '/:id', component: PlaceProfileComponent },\r\n { path: RouterHelperService.appBaseRoute.placeProfile, redirectTo: '/', pathMatch: 'full' },\r\n { path: RouterHelperService.appBaseRoute.searchResults, component: SearchResultsComponent },\r\n { path: '', component: HomeComponent },\r\n { path: '**', component: RouteNotFoundComponent } // Page not found, can be a custom 404 component.\r\n], //{ relativeLinkResolution: 'legacy' }\r\n{ useHash: true }\r\n)],\r\n exports: [\r\n RouterModule\r\n ],\r\n providers: [],\r\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\r\n})\r\nexport class AppRoutingModule { }\r\n","import { Component, ViewEncapsulation } from '@angular/core';\r\nimport { UiService } from '../../services/ui.service';\r\n\r\n@Component({\r\n selector: 'hcf-footer',\r\n templateUrl: './footer.component.html',\r\n styleUrls: ['./footer.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class FooterComponent {\r\n\r\n constructor(private _uiService: UiService) { }\r\n\r\n toggle(id) {\r\n this._uiService.toggleClass('#' + id, 'expanded');\r\n this._uiService.slideToggle('#' + id + ' + .toggle-panel');\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n

Disclaimer

\r\n

\r\n Southern Cross Health Society (Southern Cross) has made the Healthcare finder available to\r\n assist its members and others in finding a health services provider in their area. While Southern Cross will\r\n endeavour to keep the contents of the Healthcare finder up to date, accurate and complete we do not warrant or\r\n represent to any user or other third party that such content is accurate, up to date or complete at all times.\r\n The Southern Cross website \r\n Terms of\r\n Use\r\n apply to any use of the Healthcare finder. Any listing of any healthcare provider on the Healthcare\r\n finder in no way indicates any recommendation or endorsement of a healthcare provider by Southern Cross. Any use\r\n of the Healthcare finder or a particular provider is at the user's own risk.
Where you have allowed us to\r\n track your physical location we will only use this information to sort the results you see on Healthcare Finder,\r\n and will not share this information with any third parties.\r\n

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Quick links

\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Southern Cross websites

\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n © Southern Cross Medical Care Society\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n

\r\n Southern Cross Medical Care Society (trading as Southern Cross Health Society) is a licensed insurer and a licensed financial advice provider. For more information about the financial advice service we provide and a copy of our public disclosure statement please visit southerncross.co.nz/disclosure-statement.\r\n

\r\n

\r\n Southern Cross Medical Care Society (trading as Southern Cross Health Society) has an A+ (Strong) financial\r\n strength rating given by Standard & Poor's (Australia) Pty Limited. The rating scale is: AAA (Extremely\r\n Strong), AA (Very Strong), A (Strong), BBB (Good), BB (Marginal), B (Weak), CCC (Very Weak), CC (Extremely Weak),\r\n SD or D (Selective Default or Default), R (Regulatory Action), NR (Not Rated). Ratings from 'AA' to 'CCC' may be\r\n modified by the addition of a plus (+) or minus (-) sign to show relative standing within the major rating\r\n categories. Full details of the rating scale are available at www.standardandpoors.com. Standard & Poor's is an approved rating\r\n agency under the Insurance (Prudential Supervision) Act 2010.\r\n

\r\n
\r\n
\r\n","/**\r\n * Web api model\r\n */\r\nexport namespace WebApiModel {\r\n\r\n export class AutocompleteItem {\r\n type: string; // This would be one of People, Places, Service Categories, and Service Descriptions\r\n name: string;\r\n id: string;\r\n placeLocation: string; // Autocomplete places have a separate field for location to be displayed in the dropdown list\r\n //defaultCategory: string;\r\n defaultCategory?: string; // Make it optional with a \"?\" and provide a default value if needed\r\n allResultsCount: number;\r\n }\r\n\r\n export class AutocompleteLocationItem {\r\n name: string;\r\n }\r\n\r\n export class ServiceCategory {\r\n name: string;\r\n services: string[];\r\n }\r\n\r\n export interface ProfileDetail {\r\n id: string;\r\n }\r\n\r\n export class Phone {\r\n description: string;\r\n number: number;\r\n }\r\n\r\n export class Person implements ProfileDetail {\r\n id: string;\r\n sortField: string;\r\n title: string;\r\n firstName: string;\r\n lastName: string;\r\n notes: string;\r\n specialty: string;\r\n subSpecialty: string;\r\n specialInterest: string;\r\n specialist: string;\r\n isAffiliatedProvider: boolean;\r\n isConsultant: boolean;\r\n isTelehealth: boolean;\r\n phones: Phone[];\r\n fax: string;\r\n emailAddress: string;\r\n webAddress: string;\r\n serviceCategoryNames: string[];\r\n serviceCategories: ServiceCategory[];\r\n places: Place[];\r\n }\r\n\r\n export class Place implements ProfileDetail {\r\n id: string;\r\n sortField: string;\r\n practiceName: string;\r\n facilityName: string;\r\n receptionLocation: string;\r\n address: string;\r\n suburb: string;\r\n city: string;\r\n postcode: string;\r\n region: string;\r\n notes: string;\r\n isAffiliatedProvider: boolean;\r\n isEasyClaim: boolean;\r\n isConsultant: boolean;\r\n isTelehealth: boolean;\r\n phones: string[];\r\n fax: string;\r\n emailAddress: string;\r\n webAddress: string;\r\n latitude: number;\r\n longitude: number;\r\n serviceCategories: ServiceCategory[];\r\n serviceCategoryNames: string[];\r\n people: Person[];\r\n distance:number;\r\n }\r\n\r\n export class Location {\r\n address: string;\r\n suburb: string;\r\n city: string;\r\n postcode: string;\r\n latitude: number;\r\n longitude: number;\r\n locationDetails: LocationDetail[];\r\n isAffiliatedProvider: boolean;\r\n isEasyClaim: boolean;\r\n isTelehealth: boolean;\r\n }\r\n\r\n export class LocationDetail {\r\n id: string;\r\n practiceName: string;\r\n receptionLocation: string;\r\n isAffiliatedProvider: boolean;\r\n isEasyClaim: boolean;\r\n personId: string;\r\n title: string;\r\n displayName: string;\r\n webAddress: string;\r\n isConsultant: boolean;\r\n isTelehealth: boolean;\r\n }\r\n}\r\n","import { WebApiModel } from '../../models/web-api.model';\r\nimport { RouteUrl } from '../../services/router-helper.service';\r\n\r\n/** Search request type. */\r\nexport class SearchRequest {\r\n constructor(\r\n public keywords: string,\r\n public location: string, // Location name, i.e. 'Auckland'.\r\n public latitude: string,\r\n public longitude: string) { }\r\n}\r\n\r\n/** Item bound to the autocomplete dropdown list. */\r\nexport class AutocompleteUiItem {\r\n data: WebApiModel.AutocompleteItem;\r\n route: RouteUrl;\r\n selected: boolean;\r\n index: number;\r\n name: string;\r\n /* Places will have an extra bit of information - location. Use a generic name because AutocompleteUiItem is also used by the location autocomplete. */\r\n subName: string;\r\n isHeader: boolean;\r\n /** Person or place profile */\r\n isProfile: boolean;\r\n isClickable: boolean;\r\n cssClass: string;\r\n // When item is selected from the dropdown the input textbox is populated with the items name,\r\n // we don't want this behaviour for the autocomplte headers. This flag is a way to control the behaviour.\r\n populateInputWithName: boolean;\r\n\r\n // Populate the url search term with either what user typed in the input box\r\n // or full name of the selected item.\r\n // For example when when service name is clicked we pass the service name to search results.\r\n // When People or Places header is clicke in the autocomplete dropdown we pass what was entered in the input box.\r\n populateSearchTermWithName: boolean;\r\n /**\r\n * Flag indicating if the name will be highlighted as you type. Not all autocomplete items will need\r\n * name highlighted, for example People, Places, 'See all results' can't be highlighted.\r\n */\r\n highlightName: boolean;\r\n}\r\n\r\n/** Search response when getting autocomplete data from web api */\r\nexport class AutocompleteSearchResponse {\r\n constructor(\r\n public request: SearchRequest,\r\n public results: WebApiModel.AutocompleteItem[]) { }\r\n}\r\n\r\nexport class AutocompleteSelectedItem {\r\n autocompleteUiItem: AutocompleteUiItem;\r\n /** Search input at the time when item was selected from the dropdown list. */\r\n searchInput: string;\r\n /** Search term to use on the search results page. */\r\n searchTerm: string;\r\n}\r\n\r\n/** Settings can be passed from the parent component to override defaults (optional). */\r\nexport class AutocompleteSettings {\r\n inputDelay: number;\r\n inputMinChar: number;\r\n inputPlaceholder: string;\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { WebApiModel } from '../../models/web-api.model';\r\nimport { RouterHelperService, RouteUrl } from '../../services/router-helper.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { StateService } from '../../services/state.service';\r\nimport { UiService } from '../../services/ui.service';\r\n\r\n@Injectable()\r\nexport class SearchInputHelperService {\r\n\r\n // Properties and 'type' value need to match the values coming from web api, the first letter is capital.\r\n get autocompleteItemType() {\r\n return {\r\n People: {\r\n type: 'People',\r\n cssClass: 'person',\r\n route: RouterHelperService.routeType.personProfile,\r\n searchResultsType: null\r\n },\r\n Places: {\r\n type: 'Places',\r\n cssClass: 'place',\r\n route: RouterHelperService.routeType.placeProfile,\r\n searchResultsType: null\r\n },\r\n HeaderPeople: {\r\n type: 'HeaderPeople',\r\n cssClass: 'header-people',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.people\r\n },\r\n HeaderPlaces: {\r\n type: 'HeaderPlaces',\r\n cssClass: 'header-places',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.places\r\n },\r\n HeaderServiceCategories: {\r\n type: 'HeaderServiceCategories',\r\n cssClass: 'header-service-categories',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.serviceCategories\r\n },\r\n HeaderServiceDescriptions: {\r\n type: 'HeaderServiceDescriptions',\r\n cssClass: 'header-services',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.services\r\n },\r\n ServiceCategories: {\r\n type: 'ServiceCategories',\r\n cssClass: 'service-category',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.serviceCategory\r\n },\r\n ServiceDescriptions: {\r\n type: 'ServiceDescriptions',\r\n cssClass: 'service',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.service\r\n },\r\n HeaderSpecialties: {\r\n type: 'HeaderSpecialties',\r\n cssClass: 'header-specialties',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.specialties\r\n },\r\n Specialties: {\r\n type: 'Specialties',\r\n cssClass: 'specialty',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: SettingsService.searchResultsType.specialty\r\n },\r\n NoResults: {\r\n type: 'NoResults',\r\n cssClass: 'no-results',\r\n route: RouterHelperService.routeType.searchResults,\r\n searchResultsType: null\r\n },\r\n Location: { // Type for items in the locations dropdown\r\n type: 'Location',\r\n cssClass: null,\r\n route: null,\r\n searchResultsType: null\r\n },\r\n MyLocation: { // Type for the My Location item which will try to get current location\r\n type: 'MyLocation',\r\n cssClass: 'my-location',\r\n route: null,\r\n searchResultsType: null\r\n }\r\n };\r\n }\r\n\r\n constructor(private _stateService: StateService, private _uiService: UiService) {\r\n this.bindKeypress();\r\n }\r\n\r\n bindKeypress() {\r\n // Bind keypress event to the document, catch the Esc key so if Esc is pressed\r\n // then we close autocomplete dropdowns even when autocomplete input boxes are not in focus in case if we go\r\n // with the implementaiton when the dropdown is not closed on blur.\r\n this._uiService.bindKeyDown(document, (event) => {\r\n if (event.which === 27) {\r\n this._stateService.keyPressed(event.which);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * A helper method to get an atuocmplete item route based on the items type, i.e. Person, Place, etc.\r\n * @param location - Location name\r\n * @param latitude - My location\r\n * @param longitude - My location\r\n */\r\n getAutocompleteRoute(\r\n item: WebApiModel.AutocompleteItem,\r\n defaultCategory: string,\r\n searchTerm: string,\r\n location: string,\r\n latitude: string,\r\n longitude: string,\r\n myLocationLabel:string): RouteUrl {\r\n\r\n const autocompleteItemType = this.getAutocompeteItemType(item.type);\r\n const routeType = autocompleteItemType.route;\r\n const searchResultsType = autocompleteItemType.searchResultsType;\r\n\r\n return this.getRoute(routeType, item.id, item.name, defaultCategory, searchTerm, location, searchResultsType, latitude, longitude, myLocationLabel);\r\n }\r\n\r\n getRoute(\r\n routeType: string,\r\n id: string,\r\n name: string,\r\n defaultCategory: string,\r\n searchTerm: string,\r\n location: string,\r\n searchResultsType: string,\r\n latitude: string,\r\n longitude: string,\r\n myLocationLabel: string) {\r\n const urlParams = {};\r\n\r\n const lastDefaultCategory = this._stateService.getLastDefaultCategory();\r\n const lastSearchType = this._stateService.getLastSearchType();\r\n\r\n if (searchTerm) {\r\n urlParams[RouterHelperService.urlParam.term] = searchTerm.trim();\r\n }\r\n\r\n // Use either my location coordinates or location name in the query string.\r\n if (latitude && longitude) {\r\n urlParams[RouterHelperService.urlParam.latitude] = latitude;\r\n urlParams[RouterHelperService.urlParam.longitude] = longitude;\r\n }\r\n if (location) {\r\n urlParams[RouterHelperService.urlParam.location] = location.trim();\r\n }\r\n if (defaultCategory){\r\n urlParams[RouterHelperService.urlParam.defaultCategory] = defaultCategory;\r\n }\r\n if (lastDefaultCategory){\r\n urlParams[RouterHelperService.urlParam.defaultCategory] = lastDefaultCategory;\r\n // this._stateService.clearLastDefaultCategory();\r\n }\r\n if (searchResultsType) {\r\n urlParams[RouterHelperService.urlParam.searchType] = searchResultsType.toLowerCase();\r\n }\r\n if (lastSearchType){\r\n urlParams[RouterHelperService.urlParam.searchType] = lastSearchType.toLowerCase();\r\n this._stateService.clearLastSearchType();\r\n }\r\n\r\n if (myLocationLabel) {\r\n urlParams[RouterHelperService.urlParam.myLocationLabel] = myLocationLabel;\r\n }\r\n\r\n return RouterHelperService.getRoute(routeType, id, name, urlParams);\r\n }\r\n\r\n getAutocompeteItemType(type: string): IAutocompleteItemType {\r\n return (this.autocompleteItemType[type])\r\n ? this.autocompleteItemType[type] : { type: '', cssClass: '', route: '', searchResultsType: '' };\r\n }\r\n\r\n stripSearchTermPrefix(searchTerm: string): string {\r\n if (searchTerm) {\r\n const resultArray = searchTerm.split(':');\r\n if (resultArray.length > 1) {\r\n return resultArray[1];\r\n } else {\r\n return resultArray[0];\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n getSearchTermPrefix(searchTerm: string): string {\r\n if (searchTerm) {\r\n const resultArray = searchTerm.split(':');\r\n if (resultArray.length > 1) {\r\n return resultArray[0];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n}\r\n\r\ninterface IAutocompleteItemType {\r\n type: string;\r\n cssClass: string;\r\n route: string;\r\n searchResultsType: string; // Passed to the search results page as a query string parameter\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\nimport { WebApiModel } from '../../models/web-api.model';\r\nimport { RouterHelperService } from '../../services/router-helper.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { StateService } from '../../services/state.service';\r\nimport { SearchInputHelperService } from './search-input-helper.service';\r\nimport { AutocompleteSearchResponse, AutocompleteUiItem, SearchRequest } from './search-input.model';\r\n\r\n@Injectable()\r\nexport class SearchInputService {\r\n\r\n displayOrder: string[];\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private _helperService: SearchInputHelperService,\r\n private _stateService: StateService) {\r\n this.displayOrder = [\r\n _helperService.autocompleteItemType.HeaderSpecialties.type,\r\n _helperService.autocompleteItemType.Specialties.type,\r\n _helperService.autocompleteItemType.HeaderPeople.type,\r\n _helperService.autocompleteItemType.People.type,\r\n _helperService.autocompleteItemType.HeaderPlaces.type,\r\n _helperService.autocompleteItemType.Places.type,\r\n _helperService.autocompleteItemType.HeaderServiceCategories.type,\r\n _helperService.autocompleteItemType.ServiceCategories.type,\r\n _helperService.autocompleteItemType.HeaderServiceDescriptions.type,\r\n _helperService.autocompleteItemType.ServiceDescriptions.type\r\n ];\r\n }\r\n\r\n /**\r\n * Autocomplete items for the keywords search box, keywords will be always present in this search but location not always.\r\n */\r\n keywordLookup = (searchRequest: SearchRequest): Observable => {\r\n\r\n let serviceUrl = '';\r\n let queryString = '';\r\n\r\n if (searchRequest.location) {\r\n serviceUrl = SettingsService.api.autocompleteGetByKeywordAndLocationUrl;\r\n queryString = `${RouterHelperService.urlParam.term}=${encodeURIComponent(searchRequest.keywords)}`;\r\n queryString = `${queryString}&${RouterHelperService.urlParam.location}=${searchRequest.location}`;\r\n queryString = `${queryString}&${RouterHelperService.urlParam.latitude}=${searchRequest.latitude}`;\r\n queryString = `${queryString}&${RouterHelperService.urlParam.longitude}=${searchRequest.longitude}`;\r\n } else if (searchRequest.latitude && searchRequest.longitude) {\r\n serviceUrl = SettingsService.api.autocompleteGetByKeywordAndGeolocationUrl;\r\n queryString = `${RouterHelperService.urlParam.term}=${encodeURIComponent(searchRequest.keywords)}`;\r\n queryString = `${queryString}&${RouterHelperService.urlParam.latitude}=${searchRequest.latitude}`;\r\n queryString = `${queryString}&${RouterHelperService.urlParam.longitude}=${searchRequest.longitude}`;\r\n } else {\r\n serviceUrl = SettingsService.api.autoCompleteGetByKeywordUrl;\r\n queryString = `${RouterHelperService.urlParam.term}=${encodeURIComponent(searchRequest.keywords)}`;\r\n }\r\n\r\n return this.http.get(`${serviceUrl}?${queryString}`) // used string interpolation to replace the old RequestOptions and URLSearchParams\r\n .pipe(\r\n map((response) => {\r\n const results = response as WebApiModel.AutocompleteItem[];\r\n const orderedSpecialtiesResults = this.orderSpecialties(results);\r\n if (results && results[1]) {\r\n const autocompleteUiItem = this.buildAutocompleteItem(results[1], 1, searchRequest.keywords);\r\n this._stateService.saveLastTopSearchResponse(autocompleteUiItem);\r\n }\r\n return new AutocompleteSearchResponse(searchRequest, orderedSpecialtiesResults);\r\n })\r\n , catchError((error) => throwError(error))\r\n );\r\n }\r\n\r\n locationLookup = (searchRequest: SearchRequest): Observable => {\r\n\r\n const serviceUrl = SettingsService.api.autocompleteLocationUrl;\r\n const queryString = `${RouterHelperService.urlParam.term}=${searchRequest.location}`;\r\n\r\n return this.http.get(`${serviceUrl}?${queryString}`).pipe(\r\n map(\r\n (response) => {\r\n // Locations come back as a sting array. Re-map them into WebApiModel.AutocompleteItem\r\n // so both keyword and location dropdowns operate with the same autocomplete types.\r\n const results = response as string[];\r\n const autocompleteResuts = results.map((item) => {\r\n const autoCompleteItem = new WebApiModel.AutocompleteItem();\r\n autoCompleteItem.id = null;\r\n autoCompleteItem.name = item;\r\n autoCompleteItem.type = this._helperService.autocompleteItemType.Location.type;\r\n return autoCompleteItem;\r\n });\r\n return new AutocompleteSearchResponse(searchRequest, autocompleteResuts);\r\n }\r\n ), catchError((error) => throwError(error))\r\n );\r\n }\r\n\r\n // We will no longer depend on the backend to return the items in the correct order\r\n orderSpecialties = (results: WebApiModel.AutocompleteItem[]) => {\r\n return results.sort((result1, result2) => {\r\n const orderOfResult1 = this.displayOrder.findIndex(item => item === result1.type);\r\n const orderOfResult2 = this.displayOrder.findIndex(item => item === result2.type);\r\n if (orderOfResult1 < orderOfResult2 ) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Create a new item to bind to the UI based on the web api data. Add extra properties to the UI item.\r\n * @param item - Web api AutocompleteItem\r\n */\r\n buildAutocompleteItem(item: WebApiModel.AutocompleteItem, index: number, keyword: string): AutocompleteUiItem {\r\n const uiItem = new AutocompleteUiItem();\r\n uiItem.data = item;\r\n uiItem.name = item.name;\r\n uiItem.selected = false;\r\n uiItem.index = index;\r\n uiItem.isHeader = false;\r\n if (item.type && item.type.startsWith('Header')) {\r\n uiItem.isHeader = true;\r\n uiItem.name = `'${keyword}' in ${item.name}`;\r\n if (item.type === this._helperService.autocompleteItemType.HeaderPlaces.type ||\r\n item.type === this._helperService.autocompleteItemType.HeaderPeople.type) {\r\n uiItem.name += ` (${item.allResultsCount})`;\r\n }\r\n }\r\n\r\n uiItem.isProfile = (\r\n item.type === this._helperService.autocompleteItemType.People.type\r\n || item.type === this._helperService.autocompleteItemType.Places.type);\r\n\r\n uiItem.isClickable = item.type !== this._helperService.autocompleteItemType.NoResults.type;\r\n\r\n uiItem.populateInputWithName = (\r\n item.type === this._helperService.autocompleteItemType.Location.type\r\n || item.type === this._helperService.autocompleteItemType.ServiceCategories.type\r\n || item.type === this._helperService.autocompleteItemType.ServiceDescriptions.type\r\n || item.type === this._helperService.autocompleteItemType.Specialties.type\r\n || item.type === this._helperService.autocompleteItemType.People.type\r\n || item.type === this._helperService.autocompleteItemType.Places.type);\r\n\r\n uiItem.populateSearchTermWithName = (\r\n item.type === this._helperService.autocompleteItemType.ServiceCategories.type\r\n || item.type === this._helperService.autocompleteItemType.ServiceDescriptions.type\r\n || item.type === this._helperService.autocompleteItemType.Specialties.type);\r\n\r\n uiItem.highlightName = (\r\n item.type === this._helperService.autocompleteItemType.People.type\r\n || item.type === this._helperService.autocompleteItemType.Places.type\r\n || item.type === this._helperService.autocompleteItemType.ServiceCategories.type\r\n || item.type === this._helperService.autocompleteItemType.ServiceDescriptions.type\r\n || item.type === this._helperService.autocompleteItemType.Location.type\r\n || item.type === this._helperService.autocompleteItemType.Specialties.type);\r\n\r\n uiItem.cssClass = this._helperService.getAutocompeteItemType(item.type).cssClass;\r\n\r\n if (item.placeLocation) {\r\n uiItem.subName = item.placeLocation; // Places will display name and location in the autocomplete dropdown.\r\n }\r\n\r\n if (item.type === this._helperService.autocompleteItemType.HeaderPeople.type) {\r\n uiItem.subName = SettingsService.autoCompleteValues.viewAllPeopleText;\r\n }\r\n\r\n if (item.type === this._helperService.autocompleteItemType.HeaderPlaces.type) {\r\n uiItem.subName = SettingsService.autoCompleteValues.viewAllPlacesText;\r\n }\r\n\r\n if (item.type === this._helperService.autocompleteItemType.HeaderServiceCategories.type) {\r\n uiItem.subName = SettingsService.autoCompleteValues.viewAllServiceCategoriesText;\r\n }\r\n\r\n if (item.type === this._helperService.autocompleteItemType.HeaderServiceDescriptions.type) {\r\n uiItem.subName = SettingsService.autoCompleteValues.viewAllServicesText;\r\n }\r\n\r\n if (item.type === this._helperService.autocompleteItemType.HeaderSpecialties.type) {\r\n uiItem.subName = SettingsService.autoCompleteValues.viewAllSpecialtiesText;\r\n }\r\n\r\n return uiItem;\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n/**\r\n * Hilight text in the autocomplete item and add sub name when needed.\r\n */\r\n@Pipe({ name: 'autocompleteItemName' })\r\nexport class AutoCompleteItemNamePipe implements PipeTransform {\r\n transform(value: string, subName: string, keyword: string, highlightName: boolean): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n let name: string = '' + this.highlightSearchText(highlightName, value, keyword) + '';\r\n\r\n if (!subName) {\r\n return name;\r\n }\r\n\r\n return name += ' ' + this.highlightSearchText(highlightName, subName, keyword) + '';\r\n }\r\n\r\n // Highlights part of the text if it matches the search keywords. This gives the user a visual aid as to why the search results are being displayed.\r\n private highlightSearchText(highlightSearchTerm: boolean, originalText: string, searchKeywords: string): string {\r\n if (!highlightSearchTerm) {\r\n return originalText;\r\n }\r\n\r\n let name: string = originalText;\r\n // Find matches first to preserve orignial letter casing,\r\n // otherwise if you do a simple keyword replace then when searching for 'john'\r\n // you would have John replaced with john.\r\n if (searchKeywords) {\r\n searchKeywords = this.escapeRegExp(searchKeywords); // Escape special regex characters otherwise regexp throws an error.\r\n }\r\n const re = new RegExp(searchKeywords, 'i'); // ignore case\r\n const found = originalText.match(re);\r\n\r\n if (found && found.length > 0) {\r\n name = originalText.replace(found[0], '' + found[0] + '');\r\n }\r\n\r\n return name;\r\n }\r\n\r\n private escapeRegExp(str) {\r\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\r\n }\r\n}\r\n","\r\n\r\n
    \r\n
  • \r\n \r\n
  • \r\n
","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild, Renderer2 } from '@angular/core';\r\n\r\nimport { StateService } from '../../services/state.service';\r\nimport { StateRxService } from '../../services/staterx.service';\r\nimport { UiService } from '../../services/ui.service';\r\nimport { AutocompleteSelectedItem, AutocompleteSettings, AutocompleteUiItem } from './search-input.model';\r\n\r\n@Component({\r\n selector: 'hcf-autocomplete',\r\n templateUrl: './autocomplete.component.html'\r\n})\r\nexport class AutocompleteComponent implements OnInit, OnChanges {\r\n\r\n @ViewChild('autocompleteInput') autocompleteInput: ElementRef;\r\n\r\n @Input() componentId: string;\r\n @Input() tabIndex: number;\r\n @Input() autoCompleteData: AutocompleteUiItem[] = [];\r\n @Input() autocompleteSettings: AutocompleteSettings;\r\n @Output() onInput = new EventEmitter();\r\n @Output() onFocus = new EventEmitter();\r\n @Output() onGetData = new EventEmitter();\r\n @Output() onAutocompleteItemSelected = new EventEmitter();\r\n @Output() onEnter = new EventEmitter();\r\n\r\n // A reference to the setTimeout timer, so we only have one timer in use and it can be cleared when needed.\r\n private _getDataTimeout: any;\r\n private _inputDelay: number; // Delay after last user input before firing the search service, miliseconds. Set in parent settings.\r\n private _inputMinChar: number; // Minimum number of characters before firing the search. Set in parent.\r\n private _inputInFocus: boolean = false;\r\n private _selectedAutocompleteItem: number = -1;\r\n // Had some issues with cancelling previous data requests using observables, use this flag instead for now to ignore incoming data\r\n // if it's not needed anymore.\r\n private _expectingData: boolean = false;\r\n // Local variable to assign the @Input autoCompleteData.\r\n localAutocompleteData: AutocompleteUiItem[] = [];\r\n\r\n inputText: string = '';\r\n inputPlaceholder: string = '';\r\n hideAutoComplete: boolean = true;\r\n hideProgress: boolean = true; // hide/show the autocomplete loading indicator\r\n\r\n counter: number;\r\n\r\n constructor(\r\n private _stateService: StateService,\r\n _stateRx: StateRxService,\r\n private _uiService: UiService,\r\n private renderer: Renderer2) {\r\n\r\n // TODO: add unsubscribe on destroy. In the current version this component is loaded once and is never unloaded,\r\n // so currently it's ok not to unsubscribe.\r\n _stateRx.escPressed.rxSubscribe(() => {\r\n this._expectingData = false;\r\n this.hideAutoComplete = true;\r\n this.hideProgress = true;\r\n clearTimeout(this._getDataTimeout);\r\n });\r\n\r\n // Subscribe to arrow down key press\r\n _stateRx.arrowDownPressed.rxSubscribe(() => {\r\n if (this._inputInFocus && !this.hideAutoComplete) {\r\n\r\n // If press down on the last item then jump to the top, nothing will be selected and we can keep going down the list.\r\n if (this._selectedAutocompleteItem === this.autoCompleteData.length - 1) {\r\n this._selectedAutocompleteItem = -1;\r\n this.autoCompleteData.forEach(d => d.selected = false);\r\n return;\r\n }\r\n\r\n if (this._selectedAutocompleteItem < this.autoCompleteData.length - 1) {\r\n this._selectedAutocompleteItem++;\r\n let selectedItem = this.autoCompleteData[this._selectedAutocompleteItem];\r\n // Skip unclicable item but only if it's not the last item like for example the NoResults item\r\n if (!selectedItem.isClickable && this._selectedAutocompleteItem < this.autoCompleteData.length - 2) {\r\n this._selectedAutocompleteItem++;\r\n selectedItem = this.autoCompleteData[this._selectedAutocompleteItem];\r\n }\r\n this.autoCompleteData.forEach(d => d.selected = false);\r\n selectedItem.selected = true;\r\n }\r\n }\r\n });\r\n\r\n // Subscribe to arrow up key press\r\n _stateRx.arrowUpPressed.rxSubscribe(() => {\r\n if (this._inputInFocus && !this.hideAutoComplete) {\r\n\r\n // If press up while nothing is selected then start from the bottom of the list\r\n if (this._selectedAutocompleteItem === -1 && this.autoCompleteData.length > 1) {\r\n this._selectedAutocompleteItem = this.autoCompleteData.length;\r\n }\r\n\r\n // Remove highlight from the first item if arrow up is pressed\r\n if (this._selectedAutocompleteItem === 0) {\r\n this._selectedAutocompleteItem--;\r\n this.autoCompleteData.forEach(d => d.selected = false);\r\n }\r\n\r\n if (this._selectedAutocompleteItem > 0) {\r\n this._selectedAutocompleteItem--;\r\n let selectedItem = this.autoCompleteData[this._selectedAutocompleteItem];\r\n // Skip unclickable items\r\n if (!selectedItem.isClickable && this._selectedAutocompleteItem > -1) {\r\n this._selectedAutocompleteItem--;\r\n selectedItem = this.autoCompleteData[this._selectedAutocompleteItem];\r\n }\r\n this.autoCompleteData.forEach(d => d.selected = false);\r\n selectedItem.selected = true;\r\n }\r\n }\r\n });\r\n\r\n // Subscribe to Enter press\r\n _stateRx.enterPressed.rxSubscribe(() => {\r\n // Clear timeout if enter is pressed, if enter takes user to the search result page then\r\n // we don't want the autocomplete dropdown to popup due to delay\r\n clearTimeout(this._getDataTimeout);\r\n this.hideProgress = true;\r\n this._expectingData = false;\r\n\r\n // If nothing is selected in a dropdown but enter is pressed then pass null data to parent component\r\n if (this._inputInFocus && this._selectedAutocompleteItem < 0) {\r\n this.onAutocompleteItemClick(null);\r\n } else if (this._inputInFocus && !this.hideAutoComplete && this._selectedAutocompleteItem >= 0) {\r\n // If something was selected from the dropdown.\r\n this.onAutocompleteItemClick(this.autoCompleteData[this._selectedAutocompleteItem]);\r\n } else {\r\n this.hideAutoComplete = true;\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // Load settings passed from the parent.\r\n this._inputDelay = this.autocompleteSettings.inputDelay;\r\n this._inputMinChar = this.autocompleteSettings.inputMinChar;\r\n this.inputPlaceholder = this.autocompleteSettings.inputPlaceholder;\r\n this.initAutocomplete();\r\n }\r\n\r\n // Fired when Input data changes\r\n ngOnChanges() {\r\n // Home page has a different layout for input boxes.\r\n // Reset the autocomplete position when getting data so we get the right autocomplete layout no matter what page we're on.\r\n this.autocompleteResetPosition();\r\n\r\n this.hideProgress = true;\r\n if (this.autoCompleteData && this._expectingData) {\r\n this._selectedAutocompleteItem = -1;\r\n this.localAutocompleteData = this.autoCompleteData;\r\n if (this.autoCompleteData.length === 1) {\r\n this.hideAutoComplete = !this._inputInFocus;\r\n } else {\r\n this.hideAutoComplete = (!this.inputText || this.inputText.length < this._inputMinChar) || this.autoCompleteData.length === 0;\r\n }\r\n } else {\r\n this.localAutocompleteData = [];\r\n }\r\n }\r\n\r\n onTextInput(event: string) {\r\n\r\n if (event) {\r\n event = event.trim();\r\n }\r\n\r\n this.inputText = event;\r\n\r\n if (!event || event.length < this._inputMinChar) {\r\n\r\n this.hideAutoComplete = true;\r\n\r\n // emit empty string so parent is updated that nothing is selected\r\n this.onInput.emit(null);\r\n\r\n // Clear the timeout in case if the user is quickly pressing the Backspace, so the getDataWithDelay below\r\n // doesn't fire after the keyword is less than the _inputMinChar.\r\n clearTimeout(this._getDataTimeout);\r\n return; // Don't seacrh if keywords are empty? Need to take location into account as well.\r\n } else {\r\n this.onInput.emit(event);\r\n this.getDataWithDelay();\r\n }\r\n }\r\n\r\n private getDataWithDelay() {\r\n\r\n this._expectingData = true;\r\n\r\n // _getDataTimeout will be wired on each keystroke, clear it before setting a new one\r\n // setTimeout will emit onGetData event once the input is stopped for a specified time interval\r\n clearTimeout(this._getDataTimeout);\r\n\r\n this._getDataTimeout = setTimeout(() => {\r\n this.hideProgress = false;\r\n this.onGetData.emit();\r\n }, this._inputDelay);\r\n }\r\n\r\n /** Event handler when items selected from the autocomplete dropdown\r\n * @param event .\r\n * @param item - Data item\r\n */\r\n onAutocompleteItemClick(item: AutocompleteUiItem) {\r\n\r\n this._selectedAutocompleteItem = -1;\r\n if (item && item.cssClass !== 'my-location') {\r\n this._stateService.clearLastTopSearchResponse();\r\n }\r\n\r\n // If nothing was selected and the Enter key pressed then item will be null.\r\n // In this case parent will redirect to the search results.\r\n let searchTerm: string = this.inputText;\r\n let selectedItem: AutocompleteSelectedItem = { autocompleteUiItem: null, searchInput: this.inputText, searchTerm };\r\n\r\n if (item != null) {\r\n if (item.populateInputWithName) {\r\n this.inputText = item.data.name;\r\n searchTerm = item.data.name;\r\n }\r\n if (item.populateSearchTermWithName) {\r\n searchTerm = item.data.name;\r\n }\r\n selectedItem = { autocompleteUiItem: item, searchInput: this.inputText, searchTerm };\r\n }\r\n const selectedType = (item && item.data) ? item.data.type.toLowerCase() : undefined;\r\n if (selectedType !== 'location' && selectedType !== undefined) {\r\n this._stateService.saveLastSelected(selectedItem);\r\n }\r\n this.onAutocompleteItemSelected.emit(selectedItem);\r\n this.hideAutoComplete = true;\r\n }\r\n\r\n onAutocompleteItemHover(item: AutocompleteUiItem) {\r\n this._selectedAutocompleteItem = item.index;\r\n this.autoCompleteData.forEach(x => x.selected = false);\r\n item.selected = true;\r\n }\r\n\r\n onInputFocus() {\r\n this._inputInFocus = true;\r\n this._expectingData = true; // Used by My location, we need to display it on focus.\r\n\r\n this.onFocus.emit(true);\r\n\r\n // Show the dropdown on focus if there is something in the input box\r\n if (!this.inputText || this.inputText.length < this._inputMinChar) {\r\n return;\r\n }\r\n\r\n this.getDataWithDelay();\r\n }\r\n\r\n onInputBlur() {\r\n\r\n // Use 'mousedown' event for autocomplete items onAutocompleteItemClick. 'mousedown' is fired before blur.\r\n // If 'click' event is used then the blur would fire first and then click which means if we hide the autocomplete on blur\r\n // the click won't register because the dropdown will be closed.\r\n\r\n this._inputInFocus = false;\r\n this._expectingData = false;\r\n this.hideProgress = true;\r\n this.onFocus.emit(false);\r\n\r\n // If input is not empty then dropdown will appear on focus using the same delay as keyboard input.\r\n // Clear the timeout on blur, so if user switching boxes back and forward we cancel the previously fired onfocus search request.\r\n clearTimeout(this._getDataTimeout);\r\n this.hideAutoComplete = true;\r\n }\r\n\r\n /**\r\n * Bind autocomplete reposition on window resize.\r\n */\r\n initAutocomplete() {\r\n this.autocompleteResetPosition();\r\n this._uiService.bindWindowResize(() => {\r\n this.autocompleteResetPosition();\r\n }); // reposition autocomplete on window resize\r\n\r\n // Bind keypress event to current component's input.\r\n this._uiService.bindKeyDown('#' + this.componentId + ' input', (event) => {\r\n this._stateService.keyPressed(event.which);\r\n });\r\n }\r\n\r\n /** Helper method to position the autocomplete dropdown for the responsive layout.\r\n * Call this on window.resize to reposition and change the width to match the input width.\r\n */\r\n private autocompleteResetPosition() {\r\n this._uiService.autocompleteResetDropdownWidth(this.componentId);\r\n }\r\n\r\n giveInputFocus() {\r\n setTimeout(() => {\r\n this.autocompleteInput.nativeElement.focus();\r\n });\r\n }\r\n\r\n resetInputValue(value: string) {\r\n this.inputText = value;\r\n this.onInput.emit(null);\r\n }\r\n}\r\n","import { Component, ViewEncapsulation } from '@angular/core';\r\n\r\n@Component({\r\n // tslint:disable-next-line: component-selector\r\n selector: 'multicolor-dropdown',\r\n templateUrl: './multicolor-dropdown.component.html',\r\n styleUrls: ['./multicolor-dropdown.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class MulticolorDropdownComponent { }\r\n","
\r\n \r\n \r\n \r\n \r\n My Southern Cross\r\n \r\n \r\n My Southern Cross\r\n \r\n Adviser Gateway\r\n \r\n Easy-Claim\r\n \r\n Provider Web\r\n \r\n Work Scheme Gateway\r\n \r\n \r\n \r\n Log in\r\n
\r\n","import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\n\r\nimport { WebApiModel } from '../../models/web-api.model';\r\nimport { GoogleAnalyticsService } from '../../services/google-analytics.service';\r\nimport { RouterHelperService, RouteUrl } from '../../services/router-helper.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { StateService } from '../../services/state.service';\r\nimport { StateRxService } from '../../services/staterx.service';\r\nimport { UiService } from '../../services/ui.service';\r\nimport { MapService } from '../maps/healthcarefinder-map.service';\r\nimport { AutocompleteComponent } from './autocomplete.component';\r\nimport { SearchInputHelperService } from './search-input-helper.service';\r\nimport { AutocompleteSearchResponse, AutocompleteSelectedItem, AutocompleteSettings, AutocompleteUiItem, SearchRequest } from './search-input.model';\r\nimport { SearchInputService } from './search-input.service';\r\nimport { PlatformLocation } from '@angular/common'\r\nimport { filter } from 'rxjs/operators';\r\ndeclare var navigator: any;\r\ndeclare var google: any;\r\n\r\n@Component({\r\n selector: 'hcf-search-input',\r\n templateUrl: './search-input.component.html',\r\n styleUrls: ['./search-input.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class SearchInputComponent implements OnInit {\r\n\r\n @ViewChild('keywordsAutocompleteComponent') keywordsAutocompleteComponent: AutocompleteComponent;\r\n @ViewChild('locationAutocompleteComponent') locationAutocompleteComponent: AutocompleteComponent;\r\n\r\n // Store current user input coming from the autocomplete components.\r\n private _keywordInput: string;\r\n private _defaultCategory: string;\r\n private _locationInput: string;\r\n private readonly _inputDelay: number = 300;\r\n private readonly _inputMinChar: number = 2;\r\n private _myLocationLat: string = null;\r\n private _myLocationLng: string = null;\r\n\r\n usingMyLocation: boolean = false;\r\n lookingForLocation: boolean = false;\r\n keywordAutocompleteData: AutocompleteUiItem[];\r\n locationAutocompleteData: AutocompleteUiItem[];\r\n myLocationLabel: string = SettingsService.autoCompleteValues.useMyLocationText;\r\n myLocationFound: boolean = false;\r\n failedMyLocation: boolean = false;\r\n // Search results type to pass the the search results page\r\n searchResultsType: string = null;\r\n\r\n keywordAutocompleteSettings: AutocompleteSettings = {\r\n inputDelay: this._inputDelay,\r\n inputMinChar: this._inputMinChar,\r\n inputPlaceholder: SettingsService.values.keywordsInputPlaceholder\r\n };\r\n locationAutocompleteSettings: AutocompleteSettings = {\r\n inputDelay: this._inputDelay,\r\n inputMinChar: this._inputMinChar,\r\n inputPlaceholder: SettingsService.values.locationInputPlaceholder\r\n };\r\n\r\n constructor(\r\n private _searchService: SearchInputService,\r\n private _router: Router,\r\n private _helperService: SearchInputHelperService,\r\n private _gaService: GoogleAnalyticsService,\r\n private _uiService: UiService,\r\n private _stateRxService: StateRxService,\r\n private _stateService: StateService,\r\n private _mapService: MapService,\r\n private _location: PlatformLocation) {\r\n _location.onPopState(() => {\r\n if (window.location.pathname == \"/\") {\r\n this.onHomeClick();\r\n }\r\n });\r\n this._stateRxService.enterPressed.rxSubscribe(async () => {\r\n await this.onKeywordsGetData();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this._router.events.subscribe(e => {\r\n if (e instanceof NavigationEnd) {\r\n // Reset the keywords input box after navigating to the home page.\r\n if (this._router.url === '/') {\r\n if (this.keywordsAutocompleteComponent) {\r\n this.keywordsAutocompleteComponent.resetInputValue('');\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._uiService.bindWindowResize(() => {\r\n this.onWindowResize();\r\n });\r\n }\r\n\r\n onWindowResize(): void {\r\n this._uiService.drawCurveSvgHeader();\r\n }\r\n\r\n /**\r\n * Create a new item to bind to the UI based on the web api data. Add extra properties to the UI item.\r\n * @param item - Web api AutocompleteItem\r\n */\r\n buildAutocompleteItem(item: WebApiModel.AutocompleteItem, index: number): AutocompleteUiItem {\r\n return this._searchService.buildAutocompleteItem(item, index, this._keywordInput);\r\n }\r\n\r\n onAutocompleteKeywordSelected(item: AutocompleteSelectedItem) {\r\n // Autocomplete componenet returns a null item when nothing was selected from a dropdown and the Enter key was pressed\r\n // in this case we take user to the search results page\r\n if (item.autocompleteUiItem === null) {\r\n this.onFindClick();\r\n return;\r\n }\r\n\r\n // Update this component input with current up to date search input from the child, the child search input is passed with the item.\r\n this._keywordInput = item.searchInput;\r\n this._defaultCategory = item.autocompleteUiItem.data.defaultCategory;\r\n const location = this._locationInput ? this._locationInput : (this._myLocationLat && this._myLocationLng ? this.myLocationLabel : null);\r\n\r\n if (this._keywordInput) {\r\n this._gaService.sendAutocompleteResultsEvent(this._keywordInput, location);\r\n }\r\n\r\n // If item is not clickable then don't do anything, for example the no results item.\r\n if (!item.autocompleteUiItem.isClickable) {\r\n return;\r\n }\r\n\r\n const route = this._helperService.getAutocompleteRoute(\r\n item.autocompleteUiItem.data,\r\n item.autocompleteUiItem.data.defaultCategory,\r\n item.searchTerm,\r\n this._locationInput,\r\n this._myLocationLat,\r\n this._myLocationLng,\r\n this.myLocationLabel);\r\n\r\n if (item.autocompleteUiItem.isProfile) {// No query string for the profile pages\r\n this._router.navigate(route.link);\r\n this._uiService.scrollToTop();\r\n return;\r\n }\r\n\r\n // Set the search type when item is selected from dropdown\r\n this.searchResultsType = this._helperService.getAutocompeteItemType(item.autocompleteUiItem.data.type).searchResultsType;\r\n\r\n\r\n // If location is empty and is not my location then set focus on the location\r\n if (!this._locationInput && !this.usingMyLocation && !this.lookingForLocation && !this.failedMyLocation) {\r\n this.locationAutocompleteComponent.giveInputFocus();\r\n } else {\r\n // This is triggered when \"search all\" is clicked from the auto-complete search results\r\n // Will save the query string collection to the newly added searchParameters and then later remove queryParams from navigate()\r\n this._stateService.setSearchQueryParameters(route.query);\r\n this._router.navigate(route.link);\r\n this._uiService.scrollToTop();\r\n }\r\n }\r\n\r\n async onAutocompleteLocationSelected(item: AutocompleteSelectedItem) {\r\n\r\n this._locationInput = item.searchInput;\r\n const keywordInput = this._keywordInput ? this._keywordInput : null;\r\n\r\n if (this._locationInput) {\r\n this._gaService.sendLocationResultsEvent(keywordInput, this._locationInput);\r\n }\r\n\r\n // Fire normal search if item is null, it happens when the Enter key is pressed inside the location input.\r\n if (item.autocompleteUiItem === null) {\r\n this.onFindClick();\r\n return;\r\n }\r\n\r\n if (item.autocompleteUiItem.data.type === this._helperService.autocompleteItemType.MyLocation.type) {\r\n this.usingMyLocation = true;\r\n await this.getMyLocation();\r\n this.locationAutocompleteComponent.resetInputValue('');\r\n return;\r\n } else {\r\n this._myLocationLat = null;\r\n this._myLocationLng = null;\r\n this.usingMyLocation = false;\r\n }\r\n\r\n // Business requirement: submit search when location item is clicked and if search input is not empty\r\n if (this._keywordInput) {\r\n this.onFindClick();\r\n } else {\r\n // Business req: If location is selected but the keyword is empty then set focus to the keywords input\r\n this.keywordsAutocompleteComponent.giveInputFocus();\r\n }\r\n }\r\n\r\n /**\r\n * Handle Find button click event\r\n */\r\n onFindClick() {\r\n this._stateService.isSavingTopResult.pipe(filter(saving => saving !== true)).subscribe((saving) => {\r\n // Don't submit the search if the keywords input is empty or less than min char\r\n if (!this._keywordInput || this._keywordInput.length < this._inputMinChar) {\r\n this.keywordsAutocompleteComponent.giveInputFocus();\r\n return;\r\n }\r\n\r\n if (!this._locationInput && !this.myLocationFound) {\r\n this._myLocationLat = null;\r\n this._myLocationLng = null;\r\n }\r\n\r\n const topResult = this._stateService.getLastTopSearchResponse();\r\n let searchResultsType = topResult ? topResult.cssClass : this.searchResultsType;\r\n let keyword, defaultCategory;\r\n keyword = topResult ? topResult.name : this._keywordInput;\r\n defaultCategory = topResult ? topResult.data.defaultCategory : this._defaultCategory;\r\n if (topResult && topResult.data.defaultCategory === '') {\r\n defaultCategory = topResult.data.type.toLowerCase();\r\n }\r\n if (topResult && (topResult.data.type.toLowerCase() === SettingsService.searchResultsType.people ||\r\n topResult.data.type.toLowerCase() === SettingsService.searchResultsType.places)) {\r\n keyword = this._keywordInput;\r\n searchResultsType = topResult.data.type;\r\n defaultCategory = searchResultsType;\r\n }\r\n const selectedResult = this.keywordAutocompleteData && this.keywordAutocompleteData.find(x => x.selected);\r\n const selectedType = selectedResult && selectedResult.data.type.replace('header-', '').replace('Header', '');\r\n if (selectedType) {\r\n keyword = this._keywordInput;\r\n searchResultsType = selectedType.toLowerCase();\r\n defaultCategory = selectedResult.data.defaultCategory ? selectedResult.data.defaultCategory : selectedResult.data.name;\r\n }\r\n const previousSelected = this._stateService.getLastSelected();\r\n if (previousSelected && previousSelected.searchTerm) {\r\n keyword = previousSelected.searchTerm;\r\n searchResultsType = previousSelected.autocompleteUiItem.data.type.toLowerCase();\r\n defaultCategory = previousSelected.autocompleteUiItem.data.defaultCategory ? previousSelected.autocompleteUiItem.data.defaultCategory :\r\n previousSelected.autocompleteUiItem.data.name;\r\n }\r\n if (defaultCategory && defaultCategory.toLowerCase() !== SettingsService.searchResultsType.places && defaultCategory.toLowerCase() !== SettingsService.searchResultsType.people) {\r\n defaultCategory = SettingsService.searchResultsType.places;\r\n }\r\n if (defaultCategory) {\r\n defaultCategory = defaultCategory.toLowerCase();\r\n }\r\n this._stateService.saveLastSearchType(searchResultsType);\r\n this._stateService.saveLastDefaultCategory(defaultCategory);\r\n\r\n if (!topResult && !previousSelected){\r\n this.onAutocompleteSkipped(keyword);\r\n return;\r\n }\r\n\r\n const routeUrl: RouteUrl = this._helperService.getRoute(\r\n RouterHelperService.routeType.searchResults,\r\n null,\r\n null,\r\n defaultCategory ? defaultCategory.toLowerCase() : defaultCategory,\r\n this._helperService.stripSearchTermPrefix(keyword),\r\n this._locationInput,\r\n searchResultsType ? searchResultsType.toLowerCase() : searchResultsType,\r\n this._myLocationLat,\r\n this._myLocationLng,\r\n this.myLocationLabel);\r\n\r\n // This is triggered when the \"find\" button is clicked\r\n // Will save the query string collection to the newly added searchParameters and then later remove queryParams from navigate()\r\n this._stateService.setSearchQueryParameters(routeUrl.query);\r\n\r\n this._router.navigate(routeUrl.link);\r\n this._uiService.scrollToTop();\r\n this._stateService.findClick();\r\n });\r\n }\r\n\r\n onHomeClick() {\r\n this.keywordsAutocompleteComponent.resetInputValue(\"\");\r\n this.locationAutocompleteComponent.resetInputValue(\"\");\r\n this.onMyLocationClick();\r\n }\r\n\r\n /**\r\n * Fired when keywords input changes in the child autocomplete component,\r\n * child component returns the input without a delay unlike the onKeywordsGetData event.\r\n * We need the input data without a delay in order to make the Find button work well when its clicked or when Enter key is pressed.\r\n */\r\n onKeywordsInput(event: string) {\r\n this._keywordInput = event;\r\n // Reset search type on a new lookup. If user is typing fast and no data comes back before they fire the search\r\n // we don't want to keep searchResultsType value from the previous search.\r\n this.searchResultsType = null;\r\n this._stateService.clearLastSelected();\r\n }\r\n\r\n async onKeywordsGetData() {\r\n this._stateService.clearLastTopSearchResponse();\r\n if (this._keywordInput) {\r\n const keywordInput = this._helperService.stripSearchTermPrefix(this._keywordInput);\r\n if (this.usingMyLocation && this._myLocationLat && this._myLocationLng) {\r\n this.doKeywordLookup(new SearchRequest(keywordInput, null, this._myLocationLat, this._myLocationLng));\r\n } else {\r\n await this.setLatLngFromLocation();\r\n this.doKeywordLookup(new SearchRequest(keywordInput, this._locationInput, this._myLocationLat, this._myLocationLng));\r\n }\r\n }\r\n }\r\n\r\n onLocationInput(event: string) {\r\n this._locationInput = event;\r\n\r\n // If location input is empty then show the MyLocation option.\r\n if (!event) {\r\n this.showMyLocationOption();\r\n }\r\n }\r\n\r\n async onLocationGetData() {\r\n if (this._locationInput) {\r\n await this.setLatLngFromLocation();\r\n this.doLocationLookup(new SearchRequest(null, this._locationInput, this._myLocationLat, this._myLocationLng));\r\n }\r\n }\r\n\r\n async onKeywordsInputFocus(event: boolean) {\r\n await this.onKeywordsGetData();\r\n }\r\n\r\n onLocationInputFocus(event: boolean) {\r\n // if in focus show my location option\r\n if (event) {\r\n this.showMyLocationOption();\r\n }\r\n }\r\n\r\n private showMyLocationOption() {\r\n const data: AutocompleteUiItem[] = [];\r\n\r\n if (!this._locationInput && navigator.geolocation) {\r\n const myLocationUiItem = this.buildCustomAutocompleteUiItem(SettingsService.autoCompleteValues.useMyLocationText,\r\n this._helperService.autocompleteItemType.MyLocation.type,\r\n null,\r\n null, 0);\r\n\r\n data.push(myLocationUiItem);\r\n this.locationAutocompleteData = data;\r\n }\r\n }\r\n\r\n /**\r\n * Get data from the service to populate the autocomplete dropdown.\r\n * @param request - Search request object\r\n */\r\n private doKeywordLookup(request: SearchRequest) {\r\n\r\n const storeResult = this._stateService.getLastTopSearchResponse();\r\n const keyword = storeResult ? storeResult.name : this._keywordInput;\r\n this.searchResultsType = storeResult ? storeResult.cssClass : this.searchResultsType;\r\n if (storeResult) {\r\n this._defaultCategory = storeResult ? storeResult.data.defaultCategory : this._defaultCategory;\r\n if (storeResult.data.defaultCategory === '') {\r\n this._defaultCategory = storeResult.data.type.toLowerCase();\r\n }\r\n this.onFindClick();\r\n this._stateService.clearLastTopSearchResponse();\r\n }\r\n\r\n this._searchService.keywordLookup(request).subscribe(\r\n (response: AutocompleteSearchResponse) => {\r\n\r\n // If data comes back but user has cleared the input box then don't show the data that came back,\r\n // i.e. don't show the autocomplete dropdown if the input is already blank.\r\n // It was happening when data retrieval was a bit slow and you press the backspace to clear the input,\r\n // by the time data came back the input was already blank and the data shouldn't have been displayed.\r\n if (!keyword) {\r\n this.keywordAutocompleteData = [];\r\n return;\r\n }\r\n\r\n // If there are results then populate the auto complete data.\r\n if (response && response.results) {\r\n\r\n const data = response.results.map((item, index) => {\r\n return this.buildAutocompleteItem(item, index);\r\n });\r\n\r\n if (!data || data.length <= 0) {\r\n // Add 'no results' item to the data\r\n const noDataUiItem = this.buildCustomAutocompleteUiItem(SettingsService.autoCompleteValues.noResultsText,\r\n this._helperService.autocompleteItemType.NoResults.type,\r\n keyword, this._locationInput, 0);\r\n data.push(noDataUiItem);\r\n\r\n const input = keyword;\r\n const locationInput = this._locationInput ? this._locationInput : null;\r\n this._gaService.sendNoAutocompleteResultsEvent(input, locationInput);\r\n } else {\r\n // if there is data, grab the first item type and use it as a default search type, this is for the Find button,\r\n // when nothing was selected from the dropdown and the Find button was clicked.\r\n const searchType = this._stateService.getLastSearchType();\r\n this.searchResultsType = searchType;\r\n }\r\n\r\n this.keywordAutocompleteData = data;\r\n }\r\n }, () => {\r\n // Show an error message if there is a connection error.\r\n // We may not want to show an error for the dropdown list in case if there are intermittent connectivity issues,\r\n // users can use the Find button to go to the search results page and if there is still a connection issue then\r\n // they will see a friendly error message. We will need to handle errors on the search results page.\r\n // this._errorHandlingService.friendlyErrorHandler(true);\r\n }\r\n );\r\n }\r\n\r\n private doLocationLookup(request: SearchRequest) {\r\n const searchInput = this._keywordInput ? this._keywordInput : null;\r\n this._searchService.locationLookup(request).subscribe(\r\n (response: AutocompleteSearchResponse) => {\r\n\r\n // If the input is blank (edited by the user) by the time we recieved the data then don't show the data.\r\n if (!this._locationInput) {\r\n this.locationAutocompleteData = [];\r\n return;\r\n }\r\n\r\n if (response && response.results) {\r\n\r\n const data = response.results\r\n .map((item, index) => {\r\n return this.buildAutocompleteItem(item, index);\r\n });\r\n\r\n // Add 'no results' item to the data\r\n if (!data || data.length === 0) {\r\n const noDataUiItem = this.buildCustomAutocompleteUiItem(SettingsService.autoCompleteValues.noResultsText,\r\n this._helperService.autocompleteItemType.NoResults.type,\r\n this._locationInput, // Location is the keyword in this case so the helper can generate the correct string\r\n null, 0);\r\n data.push(noDataUiItem);\r\n\r\n this._gaService.sendNoLocationResultsEvent(searchInput, this._locationInput);\r\n }\r\n\r\n // Add my location option as the last item of the dropdown list so the my location option is always available\r\n const myLocationUiItem = this.buildCustomAutocompleteUiItem(SettingsService.autoCompleteValues.useMyLocationText,\r\n this._helperService.autocompleteItemType.MyLocation.type,\r\n null,\r\n null, 0);\r\n\r\n data.push(myLocationUiItem);\r\n\r\n this.locationAutocompleteData = data;\r\n }\r\n }, () => {\r\n // Error handling is disabled for now, see explanation in the comments above.\r\n // this._errorHandlingService.friendlyErrorHandler(true);\r\n }\r\n );\r\n }\r\n\r\n /** Helper to add custom autocomplete items */\r\n private buildCustomAutocompleteUiItem(\r\n name: string, type: string, keyword: string, location: string, index: number): AutocompleteUiItem {\r\n const item = new WebApiModel.AutocompleteItem();\r\n\r\n let itemText = name;\r\n\r\n if (keyword) {\r\n itemText += ` for '${keyword}'`;\r\n\r\n if (location) {\r\n itemText += ` in '${location}'`;\r\n }\r\n }\r\n\r\n item.name = itemText;\r\n item.type = type;\r\n const uiItem = this.buildAutocompleteItem(item, index);\r\n return uiItem;\r\n }\r\n\r\n /**\r\n * Stop using my location\r\n */\r\n onMyLocationClick() {\r\n // Turn off search by my location and reset the coordinates\r\n this.usingMyLocation = false;\r\n this.myLocationFound = false;\r\n this.failedMyLocation = false;\r\n this._myLocationLat = null;\r\n this._myLocationLng = null;\r\n }\r\n\r\n async getMyLocation() {\r\n this.failedMyLocation = false;\r\n if (!navigator.geolocation) {\r\n return;\r\n }\r\n this.lookingForLocation = true;\r\n this.myLocationFound = false;\r\n this.myLocationLabel = SettingsService.autoCompleteValues.lookingForMyLocationText;\r\n\r\n try {\r\n const currentPosition: any = await this.getCurrentPosition();\r\n this.lookingForLocation = false;\r\n if (currentPosition && currentPosition.coords) {\r\n this.myLocationFound = true;\r\n this._myLocationLat = currentPosition.coords.latitude;\r\n this._myLocationLng = currentPosition.coords.longitude;\r\n // The locationTypes array is ordered, the order in which the items appears, is the order of specifity for the search:\r\n // first sublocality, then postal_town etc.\r\n const locationTypes = ['sublocality', 'postal_town', 'administrative_area_level_2', 'administrative_area_level_1'];\r\n let location: any;\r\n for (const locationType of locationTypes) {\r\n location = await this.getLocationAddress(this._myLocationLat, this._myLocationLng, locationType);\r\n if (location) {\r\n break;\r\n }\r\n }\r\n if (!location) {\r\n this.setLocationNotFound();\r\n return;\r\n }\r\n this.myLocationLabel = location.long_name;\r\n const searchInput = this._keywordInput ? this._keywordInput : null;\r\n this._gaService.sendLocationResultsEvent(searchInput, this.myLocationLabel, true);\r\n }\r\n } catch (exception) {\r\n this.setLocationNotFound();\r\n }\r\n }\r\n\r\n /**\r\n * Helper to reset the state of the UI when not location has been found with location detection\r\n */\r\n private setLocationNotFound() {\r\n this.lookingForLocation = false;\r\n this.myLocationFound = false;\r\n this.failedMyLocation = true;\r\n this._myLocationLat = null;\r\n this._myLocationLng = null;\r\n this.myLocationLabel = SettingsService.autoCompleteValues.failedMyLocation;\r\n }\r\n\r\n // Retrieve lat/lng of specified location\r\n private async setLatLngFromLocation() {\r\n if (this._locationInput && this._locationInput.length > 0) {\r\n const loc = await this._mapService.getLocationFromAddress(this._locationInput + ', New Zealand');\r\n\r\n if (loc) {\r\n this._myLocationLat = loc.lat.toString();\r\n this._myLocationLng = loc.lng.toString();\r\n }\r\n }\r\n }\r\n\r\n public async getLocationAddress(latitude, longitude, searchType) {\r\n const latlng = new google.maps.LatLng(latitude, longitude);\r\n try {\r\n const results: any = await this.geocode({ latLng: latlng });\r\n const filteredResults = results.filter(result => {\r\n return result.types.some(type => type === searchType);\r\n });\r\n const filteredAddress = filteredResults.find(filteredResult => {\r\n return filteredResult ? filteredResult.address_components.filter(passedAddressComponent => {\r\n return passedAddressComponent.types.find(type => type === searchType);\r\n }) : undefined;\r\n });\r\n const addressComponent = filteredAddress ? filteredAddress.address_components.find(passedAddressComponent => {\r\n return passedAddressComponent.types.some(type => type === searchType);\r\n }) : undefined;\r\n if (addressComponent) {\r\n return addressComponent;\r\n }\r\n return;\r\n } catch (exception) {\r\n this.setLocationNotFound();\r\n }\r\n }\r\n\r\n /**\r\n * Helper/wrapper to allow async/await for navigator.geolocation.getCurrentPosition\r\n * @param options the options that would have been sent to navigator.geolocation.getCurrentPosition - see\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition\r\n */\r\n public getCurrentPosition(options = {enableHighAccuracy: true, maximumAge: 0}) {\r\n return new Promise((resolve, reject) => {\r\n navigator.geolocation.getCurrentPosition(resolve, reject, options);\r\n });\r\n }\r\n\r\n /**\r\n * Helper/wrapper to allow async/await for geocoder.geocode\r\n * @param options the options that would have been sent to geocoder.geocode - see\r\n * https://angular-maps.com/api-docs/agm-core/injectables/agmgeocoder\r\n */\r\n public geocode(options = {}) {\r\n return new Promise((resolve, reject) => {\r\n const geocoder = new google.maps.Geocoder();\r\n geocoder.geocode(options, (results, status) => {\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n if (results.length) {\r\n resolve(results);\r\n } else {\r\n reject(new Error('No results found'));\r\n }\r\n } else {\r\n reject(new Error('Geocoder failed due to: ' + status));\r\n }\r\n });\r\n });\r\n }\r\n\r\n onAutocompleteSkipped(keyword: string) {\r\n const request = {\r\n keywords: keyword,\r\n latitude: null,\r\n longitude: null,\r\n location: null\r\n };\r\n this._stateService.clearLastSelected();\r\n this._stateService.isSavingTopResult.next(true);\r\n this._searchService.keywordLookup(request).subscribe(\r\n (response: AutocompleteSearchResponse) => {\r\n // If there are results then populate the auto complete data.\r\n if (response && response.results && response.results.length) {\r\n\r\n const data = response.results.map((item, index) => {\r\n return this.buildAutocompleteItem(item, index);\r\n });\r\n\r\n if (!data || data.length <= 0) {\r\n const input = this._keywordInput;\r\n const locationInput = this._locationInput ? this._locationInput : null;\r\n this._gaService.sendNoAutocompleteResultsEvent(input, locationInput);\r\n const noDataUiItem = this.buildCustomAutocompleteUiItem(input,\r\n this._helperService.autocompleteItemType.NoResults.type,\r\n this._locationInput, // Location is the keyword in this case so the helper can generate the correct string\r\n null, 0);\r\n this._stateService.saveLastTopSearchResponse(noDataUiItem);\r\n this._stateService.isSavingTopResult.next(false);\r\n } else {\r\n // if there is data, grab the first item type and use it as a default search type, this is for the Find button,\r\n // when nothing was selected from the dropdown and the Find button was clicked.\r\n if (data && data[1]) {\r\n this._stateService.saveLastTopSearchResponse(data[1]);\r\n this._stateService.isSavingTopResult.next(false);\r\n }\r\n this.doKeywordLookup(request);\r\n }\r\n\r\n } else {\r\n const noDataUiItem = this.buildCustomAutocompleteUiItem(this._keywordInput,\r\n this._helperService.autocompleteItemType.NoResults.type,\r\n this._locationInput, // Location is the keyword in this case so the helper can generate the correct string\r\n null, 0);\r\n this._stateService.saveLastTopSearchResponse(noDataUiItem);\r\n this._stateService.isSavingTopResult.next(false);\r\n this.onFindClick();\r\n }\r\n }, () => {\r\n // Show an error message if there is a connection error.\r\n // We may not want to show an error for the dropdown list in case if there are intermittent connectivity issues,\r\n // users can use the Find button to go to the search results page and if there is still a connection issue then\r\n // they will see a friendly error message. We will need to handle errors on the search results page.\r\n // this._errorHandlingService.friendlyErrorHandler(true);\r\n }\r\n );\r\n }\r\n}\r\n","\r\n \r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n Healthcare finder\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

Healthcare finder

\r\n

Find an Affiliated Provider or see
who offers Easy-Claim near you.

\r\n
\r\n
\r\n \r\n \r\n Healthcare finder\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n {{myLocationLabel}}\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input, ElementRef, AfterViewChecked, OnDestroy } from '@angular/core';\r\nimport { StateService } from '../../services/state.service';\r\nimport { StateRxService } from '../../services/staterx.service';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\nexport enum BannerTypes {\r\n Information = \"information-banner\",\r\n Survey = \"survey-banner\"\r\n};\r\n\r\nexport enum BannerLocations {\r\n All = \"all\",\r\n Home = \"home\",\r\n Results = \"results\",\r\n Person = \"person\",\r\n Place = \"place\"\r\n};\r\n\r\n@Component({\r\n selector: 'hcf-banner',\r\n templateUrl: './banner.component.html',\r\n styleUrls: ['./banner.component.scss']\r\n})\r\nexport class BannerComponent implements OnInit, OnDestroy, AfterViewChecked {\r\n constructor(\r\n private _router: Router,\r\n private _stateRxService: StateRxService,\r\n private _stateService: StateService,\r\n private _elementRef: ElementRef,\r\n private _domSanitizer: DomSanitizer\r\n ) { }\r\n\r\n @Input() initialY:number = 0;\r\n bannerType: BannerTypes = BannerTypes.Information;\r\n bannerLocation: BannerLocations = BannerLocations.All;\r\n bannerText: SafeHtml = \"\";\r\n bannerOrigText: string = \"\";\r\n\r\n currentPageType: BannerLocations;\r\n isShown = false;\r\n\r\n customMessageSubscription: Subscription;\r\n routerSubscription: Subscription;\r\n \r\n ngOnInit() {\r\n // Retrieve GTM messages\r\n this.customMessageSubscription = this._stateRxService.customMessage.rxSubscribe(message => {\r\n if (message) {\r\n let displayMessage = '';\r\n\r\n // Set banner body text\r\n if (message.body) {\r\n // Truncate notification if too long\r\n // Allow for a 10 character buffer so that the \"split text/body\" isn't too short\r\n const maxLength = 70;\r\n if (message.body.indexOf('[!]') > -1 || message.body.length > maxLength + 10) {\r\n\r\n // Find next end of word after 50 characters\r\n if (message.body.indexOf('[!]') > -1) {\r\n const wordBoundaryIdx = message.body.indexOf('[!]');\r\n const title = message.body.substring(0, wordBoundaryIdx);\r\n const body = '
' + message.body.substring(wordBoundaryIdx + 3) + '
';\r\n\r\n displayMessage = '
' + title + \"
\" +\r\n ' read more' +\r\n '' + body + '
';\r\n } else {\r\n const wordBoundaryIdx = message.body.substring(maxLength).search(/[^A-Za-z!\\.]/) + maxLength;\r\n const title = message.body.substring(0, wordBoundaryIdx);\r\n const body = message.body.substring(wordBoundaryIdx);\r\n\r\n displayMessage = '
' + title +\r\n '... read more' +\r\n '' + body + '
';\r\n }\r\n } else {\r\n displayMessage = message.body;\r\n }\r\n } else {\r\n displayMessage = '';\r\n }\r\n\r\n // Determine banner type (Informational, Survey)\r\n if (message.type === BannerTypes.Survey) {\r\n this.bannerType = BannerTypes.Survey;\r\n } else {\r\n this.bannerType = BannerTypes.Information;\r\n }\r\n\r\n // Determine banner location\r\n if (message.location) {\r\n this.bannerLocation = message.location;\r\n }\r\n\r\n this.bannerOrigText = displayMessage;\r\n this.bannerText = this.safeHtml(displayMessage);\r\n } else {\r\n this.bannerOrigText = '';\r\n this.bannerText = '';\r\n }\r\n\r\n // Determine if banner should be shown\r\n this.isShown = (\r\n this.bannerOrigText &&\r\n this.bannerOrigText.length > 0 && (\r\n this.bannerLocation === BannerLocations.All ||\r\n this.currentPageType === this.bannerLocation\r\n )\r\n );\r\n });\r\n\r\n // Retrieve type of current page\r\n this.routerSubscription = this._router.events.subscribe(event => {\r\n if (event instanceof NavigationEnd) {\r\n if (this._router.url.startsWith('/search-results')) {\r\n this.currentPageType = BannerLocations.Results;\r\n } else if (this._router.url.startsWith('/place-profile')) {\r\n this.currentPageType = BannerLocations.Place;\r\n } else if (this._router.url.startsWith('/person-profile')) {\r\n this.currentPageType = BannerLocations.Person;\r\n } else {\r\n this.currentPageType = BannerLocations.Home;\r\n }\r\n }\r\n\r\n // Determine if banner should be shown\r\n this.isShown = (\r\n this.bannerOrigText &&\r\n this.bannerOrigText.length > 0 && (\r\n this.bannerLocation === BannerLocations.All ||\r\n this.currentPageType === this.bannerLocation\r\n )\r\n );\r\n });\r\n }\r\n \r\n // Unsubscribe from message / router updates\r\n ngOnDestroy() {\r\n if(this.customMessageSubscription) {\r\n this.customMessageSubscription.unsubscribe();\r\n }\r\n\r\n if(this.routerSubscription) {\r\n this.routerSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n ngAfterViewChecked () {\r\n const aNotification = this._elementRef.nativeElement.querySelector('#aNotification');\r\n const spNotification = this._elementRef.nativeElement.querySelector('#spNotification');\r\n const spEllipsis = this._elementRef.nativeElement.querySelector('#spEllipsis');\r\n if (aNotification) {\r\n aNotification.onclick = () => {\r\n aNotification.style.display = 'none';\r\n spEllipsis.style.display = 'none';\r\n spNotification.style.display = 'inline';\r\n };\r\n }\r\n }\r\n\r\n public closeBanner = () => {\r\n // Remove GTM message from store\r\n this._stateService.clearCustomMessage();\r\n }\r\n\r\n /**\r\n * Sanitize the text for rendering\r\n * @param text\r\n * @returns any\r\n */\r\n safeHtml(text: string) {\r\n return this._domSanitizer.bypassSecurityTrustHtml(text);\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n","\r\n

Healthcare finder

\r\n
\r\n
{{messageText}} close\r\n
\r\n
\r\n\r\n\r\n
\r\n
\r\n \r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\n\r\nimport { GoogleAnalyticsService } from '../../services/google-analytics.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { StateService } from '../../services/state.service';\r\nimport { StateRxService } from '../../services/staterx.service';\r\nimport { UiService } from '../../services/ui.service';\r\n\r\n@Component({\r\n selector: 'hcf-app',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss'],\r\n // tslint:disable-next-line: use-host-property-decorator\r\n host: {\r\n '[class.home]': 'isHome', '[class.mobile]': 'isMobile' // Add a class when displaying a home page, homepage has different layout\r\n },\r\n})\r\n\r\nexport class AppComponent implements OnInit {\r\n\r\n isHome: boolean = false;\r\n isLoading: boolean = false; // Don't show component loading progress bar by default\r\n isMobile: boolean = false;\r\n showMessage: boolean = false;\r\n messageText: string;\r\n messageBoxClass: string;\r\n\r\n constructor(\r\n private _router: Router,\r\n // private _location: Location,\r\n private _stateService: StateService,\r\n private _stateRxService: StateRxService,\r\n public _gaService: GoogleAnalyticsService,\r\n private _uiService: UiService) { }\r\n\r\n ngOnInit() {\r\n\r\n this.isMobile = this._uiService.isMobile();\r\n\r\n // Subscribe to router changes to add/remove the home css class.\r\n this._router.events.subscribe(event => {\r\n if (event instanceof NavigationEnd) {\r\n this.isHome = (this._router.url === '/' || this._router.url.startsWith('/?'));\r\n }\r\n });\r\n\r\n // Display a loader when changing routes. Subscribe to rxJs event triggered when routed components start and finish loading data.\r\n this._stateRxService.isLoading.rxSubscribe(isLoading => {\r\n this.isLoading = isLoading;\r\n });\r\n\r\n // Some css styles a simple to set/unset if there is a parent class identifying if the layout is mobile\r\n this._stateRxService.mobileLayoutChanged.rxSubscribe(isMobile => {\r\n this.isMobile = isMobile;\r\n });\r\n\r\n this._stateRxService.hasError.rxSubscribe(isError => {\r\n // Stop loading animation in case if it was on.\r\n this.isLoading = false;\r\n\r\n this.showMessage = isError;\r\n const errorMessage = SettingsService.uiMessage.genericError;\r\n this.messageText = (isError) ? this.messageText = errorMessage.text : '';\r\n this.messageBoxClass = errorMessage.class;\r\n\r\n });\r\n\r\n \r\n\r\n // Check for GTM notification test\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const testNotificiationParam = urlParams.get('testnotification');\r\n\r\n if (testNotificiationParam === '1') {\r\n (window)._gtmNotification = {body: 'I am a custom notification! I am a custom notification! I am a custom notification![!]' +\r\n 'I am the body text! I am the body text! I am the body text! I am the body text!I am the body text! ' +\r\n 'I am the body text! I am the body text! I am the body text!I am the body text! I am the body text! ' +\r\n 'I am the body text! I am the body text!I am the body text! I am the body text! I am the body text!'};\r\n } else if (testNotificiationParam === '2') {\r\n (window)._gtmNotification = {body: 'I am a survey banner! I am a survey banner! I am a survey banner![!]' +\r\n 'I am the body text! I am the body text! I am the body text! I am the body text!I am the body text! ' +\r\n 'I am the body text! I am the body text! I am the body text!I am the body text! I am the body text! ' +\r\n 'I am the body text! I am the body text!I am the body text! I am the body text! I am the body text!',\r\n location: 'results'};\r\n } else if (testNotificiationParam === '3') {\r\n (window)._gtmNotification = {body: 'I am a survey banner! I am a survey banner! I am a survey banner![!]' +\r\n 'I am the body text! I am the body text! I am the body text! I am the body text!I am the body text! ' +\r\n 'I am the body text! I am the body text! I am the body text!I am the body text! I am the body text! ' +\r\n 'I am the body text! I am the body text!I am the body text! I am the body text! I am the body text!',\r\n type: 'survey-banner'};\r\n } else if (testNotificiationParam === '4') {\r\n (window)._gtmNotification = {body: 'I am a custom notification! I am a custom notification! I am a custom notification! ' +\r\n 'I am the body text! I am the body text! I am the body text! I am the body text!I am the body text! ' +\r\n 'I am the body text! I am the body text! I am the body text!I am the body text! I am the body text! ' +\r\n 'I am the body text! I am the body text!I am the body text! I am the body text! I am the body text!'};\r\n }\r\n\r\n // Check for custom notifications via GTM\r\n window.setInterval(() => {\r\n const msg = (window)._gtmNotification;\r\n if (msg && msg.body) {\r\n this._stateService.setCustomMessage(msg);\r\n (window)._gtmNotification = null;\r\n }\r\n }, 1000);\r\n }\r\n\r\n onCloseClick() {\r\n this.showMessage = false;\r\n }\r\n}\r\n","import { AgmCoreModule, GoogleMapsAPIWrapper } from '@agm/core';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { BrowserModule, HammerModule } from '@angular/platform-browser';\r\nimport { RecaptchaModule } from 'ng-recaptcha';\r\n// import { InfiniteScrollModule } from 'angular2-infinite-scroll'; // upgraded to new package after angular 7 upgrade\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\n// import { NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\n\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { AppComponent } from './components/app/app.component';\r\nimport { FooterComponent } from './components/app/footer.component';\r\nimport { RouteNotFoundComponent } from './components/app/route-not-found.component';\r\nimport { FootnoteDirective } from './components/footnotes/footnote.directive';\r\nimport { FootnoteService } from './components/footnotes/footnote.service';\r\nimport { FootnotesComponent } from './components/footnotes/footnotes.component';\r\nimport { HomeComponent } from './components/home/home.component';\r\nimport { MapComponent } from './components/maps/healthcarefinder-map.component';\r\nimport { MapService } from './components/maps/healthcarefinder-map.service';\r\nimport { MarkerExtensionDirective } from './components/maps/marker-extension.directive';\r\nimport { PopupMapComponent } from './components/maps/popup-map/popup-map.component';\r\nimport { SidebarDetailComponent } from './components/maps/sidebar/sidebar-detail.component';\r\nimport { SidebarComponent } from './components/maps/sidebar/sidebar.component';\r\nimport { PopupComponent } from './components/popup/popup.component';\r\nimport { BannerComponent } from './components/banner/banner.component';\r\nimport { PersonProfileComponent } from './components/profile/person/person-profile.component';\r\nimport { PersonServiceCategoryComponent } from './components/profile/person/person-service-category.component';\r\nimport { PlaceDetailComponent } from './components/profile/person/place-detail.component';\r\nimport { PersonByServiceCategroyComponent } from './components/profile/place/person-by-service-category.component';\r\nimport { PersonDetailComponent } from './components/profile/place/person-detail.component';\r\nimport { PlaceProfileComponent } from './components/profile/place/place-profile.component';\r\nimport { PlaceServiceCategoryComponent } from './components/profile/place/place-service-category.component';\r\nimport { ReportFormComponent } from './components/report-incorrect-details/report-form.component';\r\nimport { ReportIncorrectDetailsService } from './components/report-incorrect-details/report-incorrect-details.service';\r\nimport { AutocompleteComponent } from './components/search-input/autocomplete.component';\r\nimport { MulticolorDropdownComponent } from './components/search-input/multicolor-dropdown.component';\r\nimport { SearchInputHelperService } from './components/search-input/search-input-helper.service';\r\nimport { SearchInputComponent } from './components/search-input/search-input.component';\r\nimport { SearchInputService } from './components/search-input/search-input.service';\r\nimport { FilterHelpFormComponent } from './components/search-results/filter-help-form.component';\r\nimport { SearchResultDetailComponent } from './components/search-results/search-result-detail.component';\r\nimport { SearchResultsComponent } from './components/search-results/search-results.component';\r\nimport { AutoCompleteItemNamePipe } from './pipes/autocomplete.pipe';\r\nimport { PhoneArrayLinkedPipe, PhoneLinkedWithDescriptionPipe, PhoneNoSpacesPipe, WebAddressPipe } from './pipes/string-format.pipe';\r\nimport { ErrorHandlingService } from './services/error-handling.service';\r\nimport { FilterService } from './services/filter.service';\r\nimport { GoogleAnalyticsService } from './services/google-analytics.service';\r\nimport { LocationService } from './services/location.service';\r\nimport { ProfileService } from './services/profile.service';\r\nimport { SearchService } from './services/search.service';\r\nimport { SeoService } from './services/seo.service';\r\nimport { StateService } from './services/state.service';\r\nimport { StateRxService } from './services/staterx.service';\r\nimport { UiService } from './services/ui.service';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { MatLegacySliderModule as MatSliderModule } from '@angular/material/legacy-slider';\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { CommonModule } from '@angular/common';\r\nimport { environment } from '../environments/environment';\r\n/* Upgrade to angular7 resulted in http client needing updating\r\n * https://angular.io/guide/http\r\n */\r\n\r\n// Declare module\r\n@NgModule({\r\n imports: [\r\n BrowserModule,\r\n FormsModule,\r\n HttpClientModule,\r\n CommonModule,\r\n // NgbModule,\r\n AppRoutingModule,\r\n AgmCoreModule.forRoot({\r\n apiKey: environment.apiKey,\r\n libraries: ['geometry']\r\n }),\r\n InfiniteScrollModule,\r\n RecaptchaModule,\r\n BrowserAnimationsModule,\r\n MatSliderModule,\r\n NgSelectModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n HammerModule\r\n ],\r\n declarations: [\r\n AppComponent,\r\n FooterComponent,\r\n HomeComponent,\r\n SearchInputComponent,\r\n AutocompleteComponent,\r\n SearchResultsComponent,\r\n PersonProfileComponent,\r\n PlaceProfileComponent,\r\n RouteNotFoundComponent,\r\n PersonServiceCategoryComponent,\r\n PlaceServiceCategoryComponent,\r\n PlaceDetailComponent,\r\n PersonDetailComponent,\r\n PersonByServiceCategroyComponent,\r\n SearchResultDetailComponent,\r\n PhoneNoSpacesPipe,\r\n PhoneLinkedWithDescriptionPipe,\r\n PhoneArrayLinkedPipe,\r\n WebAddressPipe,\r\n AutoCompleteItemNamePipe,\r\n MapComponent,\r\n MarkerExtensionDirective,\r\n FootnoteDirective,\r\n FootnotesComponent,\r\n ReportFormComponent,\r\n PopupComponent,\r\n BannerComponent,\r\n FilterHelpFormComponent,\r\n PopupMapComponent,\r\n SidebarComponent,\r\n SidebarDetailComponent,\r\n MulticolorDropdownComponent\r\n ],\r\n bootstrap: [\r\n AppComponent\r\n ],\r\n providers: [\r\n SearchInputService,\r\n SearchInputHelperService,\r\n StateService,\r\n StateRxService,\r\n ErrorHandlingService,\r\n ProfileService,\r\n SearchService,\r\n FilterService,\r\n GoogleMapsAPIWrapper,\r\n UiService,\r\n GoogleAnalyticsService,\r\n FootnoteService,\r\n ReportIncorrectDetailsService,\r\n MapService,\r\n LocationService,\r\n SeoService\r\n ],\r\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\r\n})\r\nexport class AppModule { }\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n"],"x_google_ignoreList":[]}