{"version":3,"file":"find-a-class.07f7d0b8.js","sources":["../js/find-a-class.ts"],"sourcesContent":["import Vue from 'vue'\nimport VueTailwind from 'vue-tailwind'\n\nimport tailwindSettings from \"./components/VueTailwindSettings\";\nimport NormalizedOptions from 'vue-tailwind/dist/types/NormalizedOptions'\n\nimport axios from 'axios'\nimport { getTimeZones, TimeZone } from '@vvo/tzdb'\nimport SearchPagination from './components/SearchPagination.vue'\nimport ClassSearch from './components/ClassSearch.vue'\n\nimport { CountryDto, LanguageDto } from \"./models/PublicApi\";\n\n// Use shared settings, see VueTailwindSettings.ts for more details.\nVue.use(VueTailwind, tailwindSettings);\n\n// This has to be registered globally because it is consumed by the vue-good-table\nVue.component('class-search-pagination', SearchPagination);\n\n// Registering globally also removes intellisense warnings about unknown tags\n// TODO: Fix vue-good-table by referencing local packages at some point.\nVue.component('class-search', ClassSearch)\n\ninterface SearchParams {\n certificationAbbreviation: string,\n deliveryMethod: string,\n timeZone: string,\n startTime: string,\n // regionId: number | null,\n countryId: number | null,\n languageCode: string | null\n}\n\nexport function initFindAClassVue(element: string, countries: CountryDto[], languages: LanguageDto[]) {\n if (!document.getElementById(element)) return;\n\n const vm = new Vue({\n el: '#' + element,\n components: {\n 'class-search': ClassSearch,\n },\n data() {\n return {\n hasRunASearch: false,\n allCountries: countries,\n allLanguages: languages,\n timezones: [] as NormalizedOptions,\n countries: [] as NormalizedOptions,\n languages: [] as NormalizedOptions,\n isLoading: false,\n searchResults: null,\n searchParams: {\n certificationAbbreviation: '',\n deliveryMethod: '',\n timeZone: '',\n startTime: '',\n // regionId: null,\n countryId: null,\n languageCode: null,\n } as SearchParams\n }\n },\n mounted: function () {\n const tzs = getTimeZones();\n const currentTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n this.timezones = tzs.map(tz => {\n const display = this.getTimezoneDisplay(tz);\n if (currentTz === tz.name ||\n tz.group.includes(currentTz)) {\n this.searchParams.timeZone = tz.name;\n }\n return {\n text: display,\n value: tz.name\n }\n });\n this.updateCountryOptions(this.allCountries);\n this.updateLanguageOptions(this.allLanguages);\n this.updateSearchParamsFromUrl();\n },\n methods: {\n getProperty: function (obj: T, key: K) {\n return obj[key];\n },\n getTimezoneDisplay: function (tz: TimeZone) {\n const hours = Math.floor(Math.abs(tz.currentTimeOffsetInMinutes / 60));\n const minutes = Math.abs(tz.currentTimeOffsetInMinutes % 60);\n const sign = tz.currentTimeOffsetInMinutes < 0 ? '-' : '+';\n const utcOffsetDisplay = (hours === 0 && minutes === 0)\n ? '(UTC)'\n : `(UTC${sign}${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')})`;\n const topCities = tz.mainCities.slice(0, 3).join(', ');\n\n return `${utcOffsetDisplay} ${topCities}`;\n },\n // onRegionSelected: function (newRegionValue: string) {\n // if (!newRegionValue) {\n // // Reset country combo back to include all countries\n // this.updateCountryOptions(this.allCountries);\n // } else {\n // const newList = this.allCountries.filter(country => country?.region?.id === parseInt(newRegionValue));\n // this.updateCountryOptions(newList);\n // }\n // },\n runSearch: async function () {\n this.searchResults = null;\n this.hasRunASearch = true;\n this.isLoading = true;\n try {\n // TODO: Create a component/class/service that handles this for us instead of\n // having to do this for every component we need to hit the public api\n var token = document.querySelector('input[name=\"__RequestVerificationToken\"]')?.getAttribute(\"value\");\n const response = await axios.post('/api/classes/search', this.searchParams, {\n xsrfHeaderName: 'RequestVerificationToken',\n headers: {\n 'RequestVerificationToken': token\n },\n });\n\n // The validateStatus config function will throw an exception on error\n this.searchResults = response.data;\n\n this.updateUrlFromSearchParams();\n\n } catch (error) {\n // TODO: Add better error handling\n console.log(\"Error running class search\", error);\n }\n this.isLoading = false;\n },\n updateCountryOptions: function(countries: CountryDto[]) {\n let selectedCountryFound = false;\n const newOptions = countries.map(country => {\n if (this.searchParams.countryId === country.id) {\n selectedCountryFound = true;\n }\n return {\n text: country.name,\n value: country.id\n }\n });\n\n if (!selectedCountryFound) {\n this.searchParams.countryId = null;\n }\n this.countries = newOptions;\n },\n updateLanguageOptions: function(languages: LanguageDto[]){\n const browserLanguage = navigator.language.split('-')[0]; \n console.log(browserLanguage);\n let selectedLanguageFound = false;\n const newOptions = languages.map(language => {\n if (browserLanguage === language.code) {\n selectedLanguageFound = true;\n }\n return {\n text: language.name,\n value: language.code\n }\n });\n\n if (selectedLanguageFound) {\n this.searchParams.languageCode = browserLanguage; }\n else {\n this.searchParams.languageCode = null;\n }\n this.languages = newOptions;\n },\n updateSearchParamsFromUrl: function() {\n const url = new URL(window.location.href);\n const sp = this.searchParams;\n let updatedParam = false;\n if (!!url.searchParams.get('cert') && url.searchParams.get('cert') != null) {\n sp.certificationAbbreviation = url.searchParams.get('cert');\n updatedParam = true;\n }\n\n if (!!url.searchParams.get('delivery') && url.searchParams.get('delivery') != null) {\n sp.deliveryMethod = url.searchParams.get('delivery');\n updatedParam = true;\n }\n // if (!!url.searchParams.get('region') && url.searchParams.get('region') != null) {\n // sp.regionId = parseInt(url.searchParams.get('region'))\n // updatedParam = true;\n // }\n if (!!url.searchParams.get('tz') && url.searchParams.get('tz') != null) {\n sp.timeZone = url.searchParams.get('tz');\n updatedParam = true;\n }\n if (!!url.searchParams.get('start') && url.searchParams.get('start') != null) {\n sp.startTime = url.searchParams.get('start');\n updatedParam = true;\n }\n if (!!url.searchParams.get('language') && url.searchParams.get('language') != null) {\n sp.languageCode = url.searchParams.get('language');\n updatedParam = true;\n }\n // Do country last due to region potentially causing issues.\n if (!!url.searchParams.get('country') && url.searchParams.get('country') != null) {\n sp.countryId = parseInt(url.searchParams.get('country'));\n updatedParam = true;\n }\n\n if (updatedParam) {\n this.runSearch();\n }\n },\n updateUrlFromSearchParams: function() {\n const url = new URL(window.location.href);\n const sp = this.searchParams;\n url.search = \"\";\n\n let keysToDelete: string[] = [];\n url.searchParams.forEach((value, key) => {\n keysToDelete.push(key);\n });\n keysToDelete.forEach(k => {\n url.searchParams.delete(k);\n })\n\n if (!!sp.certificationAbbreviation && sp.certificationAbbreviation.trim().length > 0) {\n url.searchParams.set('cert', sp.certificationAbbreviation);\n }\n if (!!sp.countryId && sp.countryId >= 0) {\n url.searchParams.set('country', sp.countryId.toString());\n }\n if (!!sp.languageCode && sp.languageCode.trim().length > 0) {\n url.searchParams.set('language', sp.languageCode);\n }\n if (!!sp.deliveryMethod && sp.deliveryMethod.trim().length > 0) {\n url.searchParams.set('delivery', sp.deliveryMethod);\n }\n // if (!!sp.regionId && sp.regionId >= 0) {\n // url.searchParams.set('region', sp.regionId.toString());\n // }\n if (!!sp.timeZone && sp.timeZone.trim().length > 0) {\n url.searchParams.set('tz', sp.timeZone);\n }\n if (!!sp.startTime && sp.startTime.trim().length > 0) {\n url.searchParams.set('start', sp.startTime);\n }\n\n // This doesn't get placed in the history, see: https://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page\n window.history.replaceState(null, '', url.toString());\n }\n }\n });\n}\n"],"names":["element","countries","languages","document","getElementById","Vue","el","components","ClassSearch","data","hasRunASearch","allCountries","allLanguages","timezones","isLoading","searchResults","searchParams","certificationAbbreviation","deliveryMethod","timeZone","startTime","countryId","languageCode","mounted","tzs","getTimeZones","currentTz","Intl","DateTimeFormat","resolvedOptions","map","display","this","getTimezoneDisplay","tz","name","group","includes","text","value","updateCountryOptions","updateLanguageOptions","updateSearchParamsFromUrl","methods","getProperty","obj","key","hours","Math","floor","abs","currentTimeOffsetInMinutes","minutes","sign","String","padStart","mainCities","slice","join","runSearch","async","token","querySelector","getAttribute","response","axios","post","xsrfHeaderName","headers","RequestVerificationToken","updateUrlFromSearchParams","error","log","countries2","selectedCountryFound","newOptions","country","id","languages2","browserLanguage","navigator","language","split","selectedLanguageFound","code","url","URL","window","location","href","sp","updatedParam","get","parseInt","search","keysToDelete","forEach","push","delete","k","trim","length","set","toString","history","replaceState","use","VueTailwind","tailwindSettings","component","SearchPagination"],"mappings":"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"}