{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./Components/SearchFilterBar/SearchFilterBarComponent.css?33b4","webpack:///./Apps/Search/Src/Components/paging_control_styles.css?885e","webpack:///./Components/LocationPicker2023/RegionComponentStyles.css?0baf","webpack:///./Components/CompanionsPicker/styles.css?c693","webpack:///./Components/AmountPicker/styles.css?e791","webpack:///./Components/CombinedFilter/CombinedFilterComponent.css?ca62","webpack:///./Components/LocationPicker2023/styles2023.css?9228","webpack:///external \"Vue\"","webpack:///./Components/ArrivalDeparturePicker/arrivalDeparturePicker.css?d843","webpack:///./Components/LocationPicker2023/CountryComponentStyles.css?00a4","webpack:///./Components/SearchFilter/SearchFilterComponent.css?8586","webpack:///./Apps/Search2023/Src/Search2023App.vue","webpack:///./Types/search/SearchResultBaseVue.ts","webpack:///./Composables/SearchComposables.ts","webpack:///./Types/FilterSelections.ts","webpack:///./Apps/Search/Src/Models/FilterModel.ts","webpack:///./Apps/Search/Src/Logic/urlConvert.ts","webpack:///./Apps/Search/Src/Models/PagingModel.ts","webpack:///./Apps/Search/Src/Models/SearchModel.ts","webpack:///./Apps/Search/Src/Logic/setupSearchModel.ts","webpack:///./Components/SearchFilter/setupFilterAndBarComposables.ts","webpack:///./Types/search/SearchOrderingOption.ts","webpack:///./Apps/Search/Src/Logic/historyLogic.ts","webpack:///./Composables/FetchSearchComposables.ts","webpack:///./Apps/Search/Src/Logic/scrollToTop.ts","webpack:///./Apps/Search/Translations/VueTranslations.ts","webpack:///./Components/SearchFilter/SearchFilterComponent.vue","webpack:///./Components/CombinedFilter/CombinedFilterComponent.vue","webpack:///./Components/ArrivalDeparturePicker/ArrivalDeparturePicker.vue","webpack:///./Components/ArrivalDeparturePicker/Month.vue","webpack:///./Components/ArrivalDeparturePicker/Day.vue","webpack:///./Components/ArrivalDeparturePicker/Day.vue?f99c","webpack:///./Components/ArrivalDeparturePicker/Day.vue?918b","webpack:///./Components/ArrivalDeparturePicker/Translations/VueTranslations.ts","webpack:///./Components/ArrivalDeparturePicker/Month.vue?ceb8","webpack:///./Components/ArrivalDeparturePicker/Month.vue?ad35","webpack:///./Components/ArrivalDeparturePicker/Functions/fetchAvailability.ts","webpack:///./Functions/DateFunctions.ts","webpack:///./Components/ArrivalDeparturePicker/Types/ArrivalDepartureState.ts","webpack:///./Components/ArrivalDeparturePicker/Types/DateEntry.ts","webpack:///./Components/ArrivalDeparturePicker/Types/MonthEntry.ts","webpack:///./Components/ArrivalDeparturePicker/Functions/createData.ts","webpack:///./Components/ArrivalDeparturePicker/Types/AvailabilityContainer.ts","webpack:///./Types/NSCarouselWrapper.ts","webpack:///./Components/ArrivalDeparturePicker/arrivalDeparturePicker.ts","webpack:///./Components/ArrivalDeparturePicker/ArrivalDeparturePicker.vue?6e92","webpack:///./Components/LocationPicker2023/LocationPicker2023.vue","webpack:///./Components/LocationPicker/Translations/VueTranslations.ts","webpack:///./Components/LocationPicker2023/CountryComponent.vue","webpack:///./Components/LocationPicker2023/RegionComponent.vue","webpack:///./Components/LocationPicker2023/RegionComponent.vue?f705","webpack:///./Components/LocationPicker2023/RegionComponent.vue?951c","webpack:///./Components/LocationPicker2023/CountryComponent.vue?094b","webpack:///./Components/LocationPicker2023/CountryComponent.vue?8951","webpack:///./Types/search/LocationFilterSetting.ts","webpack:///./Types/search/LocationEntryTSVM.ts","webpack:///./Components/LocationPicker2023/LocationPicker2023ClearLocationComposables.ts","webpack:///./Components/LocationPicker2023/LocationPicker2023.ts","webpack:///./Components/LocationPicker2023/LocationPicker2023.vue?22b6","webpack:///./Components/CompanionsPicker/CompanionsPicker.vue","webpack:///./Components/AmountPicker/AmountPicker.vue","webpack:///./Components/AmountPicker/AmountPicker.vue?c29e","webpack:///./Components/AmountPicker/AmountPicker.vue?3681","webpack:///./Components/CompanionsPicker/Translations/VueTranslations.ts","webpack:///./Components/CompanionsPicker/companionsPicker.ts","webpack:///./Components/CompanionsPicker/CompanionsPicker.vue?e681","webpack:///./Composables/LocationHelpers.ts","webpack:///./Components/SearchBar/Translations/VueTranslations.ts","webpack:///./Composables/FilterDisplayComposables.ts","webpack:///./Components/CombinedFilter/CombinedFilterComponent.ts","webpack:///./Components/CombinedFilter/CombinedFilterComponent.vue?56ae","webpack:///./Apps/MapSearch/Translations/VueTranslations.ts","webpack:///./Components/SearchFilter/SearchFilterComponent.ts","webpack:///./Components/SearchFilter/SearchFilterComponent.vue?8d63","webpack:///./Components/SearchFilterBar/SearchFilterBarComponent.vue","webpack:///./Components/SearchFilterBar/SearchFilterBarComponent.ts","webpack:///./Components/SearchFilterBar/SearchFilterBarComponent.vue?fd38","webpack:///./Apps/Search/Src/Components/PagingControl.vue","webpack:///./Apps/Search/Src/Components/PagingControl.vue?593b","webpack:///./Apps/Search/Src/Components/PagingControl.vue?e40a","webpack:///./Apps/MapSearch/Src/Components/MapSearch/Composables/SetupFilterWatchesComposables.ts","webpack:///./Apps/Search2023/Src/Search2023App.vue?2c34","webpack:///./Apps/Search2023/Src/Search2023App.vue?2e03","webpack:///./Apps/Search2023/main.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","Vue","id","class","to","type","onShowMapClicked","resx","searhApp_Label_ShowMap","searchModel","filter","orderBy","filterPartial_Label_SortBy","filterPartial_Label_SortBy_Price_LowFirst","filterPartial_Label_SortBy_Price_HighFirst","filterPartial_Label_SortBy_TotalPerson_LowFirst","filterPartial_Label_SortBy_TotalPerson_HighFirst","filterPartial_Label_SortBy_Standard","displaySortingMessage","filterPartial_Label_CalculatePriceWhenDateChange","is-filter-visible","isFilterVisible","onSearchBarAction","is-visible","ref","force-hide-content-title","total-count","totalCount","onHideFilter","paging","pageTo","searchApp_Label_ResultCount","scrollToTop","searchApp_Btn_ToTop","page","pageCount","pageSize","hasResultsForParamsOnly","this","getFilterDefinitions","filterDefinitions","Error","getSearchMetaDefinitions","searchMetaDefinitions","hasSearchMetaDefinitions","getSearchBaseResultsFromServerSideRendering","createEmptyIfNotExists","initialSearchResults","getInitialLocationSelectionDetails","sm","locationSelections","find","clearFiltersAndRedirect","urlAction","searchUrl","isMapSearch","mapSearchUrl","url","URL","location","href","assign","selection","Array","countNoPreference","countryNoPreference","countryValueId","val","regionValueId","cityValueId","numberOfAdults","numberOfPets","numberOfChildren","numberOfBabies","accommodationTypes","accommodationTypeNoPreference","criteria","bedrooms","bathrooms","date","companions","forEach","values","amount","minValue","paramId","urlConvertersDefaultModelBinder","parse","prefix","params","getParamNameFromKey","ident","substr","curIdent","curParam","startsWith","indexOf","paramName","toLowerCase","keys","isArray","toIs","index","amenityId","str","toAmount","isMin","toHas","map","v","join","toHasSearch","flat","toUrlOrderBy","other","undefined","toUrlDate","arrival","departure","toUrlCompanions","toUrl","has","is","isIndex","amountIndex","hasSearch","hasSearchIndex","amenityIdAccommodationType","amenityIdBedrooms","amenityIdBathrooms","searchCriteriaFlattened","hasValue","fs","getAsFormValue","hasPaging","searchQuery","fromUrlBase","search","URLSearchParams","allIs","allHas","allAmount","allHasSearch","default","replaceAll","locIds","split","le","countryData","countryName","label","regionData","regionName","cityData","cityName","isParams","hasSearchParams","amountParams","hasAccType","flatMap","bedroomSelection","bathroomSelection","sp","loopGroups","groupIndex","searchCriteriaGrouping","critIndex","items","keyId","fromUrlOrRewrite","queryStringFromRewrite","newPage","cloned","PagingModel","returnValue","parseInt","isNaN","getValueFor","setupSearchModel","criteriaGroupCount","setupCombinedFilter","filterInstance","isMapFilterVisible","targetArea","onFocusArea","SearchOrderingOption","accommodationLinkSelector","scrollPositionParameter","addNewHistoryEntry","browserAddressHref","pathname","history","replaceState","getCurrentUrlAsRelative","getCurrentUrlAsReturnUrl","includeScroll","encodeURIComponent","addHistoryOnClick","container","clearAction","addEventListener","e","target","classList","contains","preventDefault","stopPropagation","link","closest","linkHref","getAttribute","reset","clearCriteria","_searchModel","_onProcessData","CreateSearchUrlType","queueDelay","fetchQueue","currentTimeout","activeFetches","Map","newFetchWaiting","onProcessData","stateIsFetching","isInDebounce","isFetching","triggerNewSearch","changeTriggered","size","clearTimeout","setTimeout","fetchNext","Date","now","fetchPage","fetchId","set","clone","fetchDataAsync","fetchEnded","delete","timeout","diff","createSearchUrl","includePath","fetchUrl","current","mapSearch","switch","switchUrl","landingPageId","providerPageId","fetch","method","redirect","then","response","json","_fid","fetchDataResult","catch","fetchDataResultError","setPage","setPageCount","setPageSize","alert","noDelay","document","querySelector","scrollIntoView","behavior","currentLanguage","globalLanguage","translations","nl","en","de","currentTranslation","isVisible","onClose","confirmBtn_Label","forceHideContentTitle","showContentTitle","contentTitle","totalCriteriaCount","resetFilters_Btn_NoFilterText","resetFilters_Btn_Text","clearFilters","disabled","locationSelectionDisplay","hasSelection","showLocationPicker","onLocationClicked","clearLocationInput","displayValue","is-inline-styled","hide-confirm-button","is-auto-confirm","filter-selection-location","onLocationSelected","clearLandingPageFilters","datesSelectionDisplay","showDatesPicker","onDatesClicked","clearDateInput","display-constrained","should-detect-became-visible","became-visible","hide-no-preference-button","arrival-date","default-date","departure-date","onDatesSelected","fallback","guestsSelectionDisplay","showGuestsPicker","onGuestsClicked","hide-chrome","model","i18n","filterPartial_Label_AccomodationsFound","PriceAsc","PriceDesc","MaxGuestCountAsc","MaxGuestCountDesc","Default","filterPartial_Label_RoomBeds","max","min","filterPartial_Label_Bedrooms","filterPartial_Label_Bathrooms","displayMode","isForAccommodation","isPickStateArrival","isPickStateDeparture","arrivalDeparturePicker_Title_ChooseArrDept","onDayClick","months","month","arrivalDateInput","departureDateInput","arrivalDeparturePicker_Label_ChooseDeptToContinue","showClearButton","hasArrivalDate","displayConstrained","resetDate","arrivalDeparturePicker_Btn_ResetDate","hideNoPreferenceButton","noDatePreference","arrivalDeparturePicker_Btn_NoDatePreference","monthName","year","arrivalDeparturePicker_Label_2Char_Monday","arrivalDeparturePicker_Label_2Char_Tuesday","arrivalDeparturePicker_Label_2Char_Wednesday","arrivalDeparturePicker_Label_2Char_Thursday","arrivalDeparturePicker_Label_2Char_Friday","arrivalDeparturePicker_Label_2Char_Saturday","arrivalDeparturePicker_Label_2Char_Sunday","days","day","classes","isSelectedArrival","isSelectedDeparture","isSelected","isValidDeparture","data-date","data-lt","ltDate","props","required","setup","context","arrivalDateLt","departureDateLt","validDepartures","some","render","components","Day","fetchAvailabilityUrl","fetchAvailability","accommodationId","toString","headers","ok","arrivalDeparturePicker_Error_SomethingWentWrong","nrOfDaysStartOnMonday","nrOfDaysStartOnSunday","toXX","computeNrOfDaysInPreviousMonth","dayOfWeek","startWeekOnMonday","computeNrOfDaysInNextMonth","monthFormatter","Intl","DateTimeFormat","timeZone","computeNameOfMonth","jsMonth","format","oneDayMs","refDate","getTime","computeLtDate","Math","round","abs","computeLtDateFromDate","fromLtDate","valueOf","setDate","getDate","toYYYYMMDD","getFullYear","getMonth","parseDate","weekday","ArrivalDepartureState","displayShortDateNoWeekdayCurrentFormat","displayShortDateNoWeekday","parseToLtDate","todayDate","setHours","today","aval","checkArrival","isAvailable","isValidArrival","entries","ent","createData","startYear","startMonth","endYear","endMonth","doNextMonth","createDaysForMonth","firstDayDate","lastDayDate","daysInPrevMonth","getDay","prevDate","createAndFillDataEntry","daysInNextMonth","nextDate","isPrevious","isNext","entry","updateForAvailability","nsCarouselWrapper","nsCarousel","nsArrivalDeparturePickerOptions","track","forward","back","slide","trackEndClass","trackStartClass","invertTrackStartEnd","Month","readOnly","Boolean","arrivalDate","String","departureDate","defaultDate","numberOfMonths","Number","shouldDetectBecameVisible","becameVisible","displaySingle","emits","selectionConfirmed","root","propsArrivalDate","propsDepartureDate","availability","emit","arrivalDateString","departureDateString","pickState","ReadOnly","Departure","ResetArrival","Arrival","isFirstBecameVisible","scrollToMonth","arrivalMonthSelector","pos","defaultScrollContainer","getElementsByClassName","offsetLeft","scrollLeft","clientLeft","scrollTo","top","left","onBecameVisible","selectedArrivalDateEl","newv","oldv","end","setMonth","event","HTMLElement","newDate","newValue","oldValue","avEntry","vd","maxDays","immediate","isInlineStyled","disableLocationSelections","resxTitle","filterSelectionLocation","loc","currentReadOnlySelection","country","iconUrl","src","subEntries","region","countries","is-toggled","toggledCountries","onToggleCountry","onSelectCountry","onSelectRegion","onSelectNoPreference","noPreferenceButtonLabel","hideConfirmButton","locationConfirmed","resxConfirmButton","isToggled","onSelect","onToggle","regions","RegionComponent","LocationFilterSetting","desc","aId","geoBox","ClearLocationAction","determineClearLocationFilterAction","locationFilterSetting","Auto","ResetEntireFilter","CountryComponent","locationNextAsConfirm","isAutoConfirm","staticCountries","countriesWithRegions","currentLocationFilterSetting","Set","countryId","add","clearSelection","currentSelectedLocation","regionNoPreference","ZoomCountry","Prevent","Clear","determinedAction","searchApp_Label_ClearAllFilters","locationPicker_Label_SearchInAllCountries","existingCountry","countryVM","sc","cityVM","regionVM","locationPicker_Title_Main","locationPicker_Btn_ConfirmAlt","locationPicker_Btn_Confirm","hideChrome","companionsPicker_Title_ChooseCompany","companionsPicker_Label_NumberOfPersons","maxGuests","companionsPicker_Label_NumberOfBabies","sub-label","companionsPicker_Title_Between_0_2_years","maxPets","companionsPicker_Label_NumberOfPets","forceNoBtnType","onConfirm","customButtonText","subLabel","onSubtract","modelValue","onAdd","getNewValue","delta","newVal","mv","__scopeId","AmountPicker","companionsPicker_Button_CustomButton","guestsConfirmed","getSelectedLocationName","count","getLocationSelectionDisplay","reduce","criteriaArray","getDatesSelectionDisplay","searchBar__When","filterLocation","hasNoPreferenceSelection","hasMultipleSelections","searchBar__Where","searchBar_Btn_AllCountries","first","searchBar_Text_MultipleLocations","getGuestsSelectionDisplay","hasBeenActive","searchBar__Who","displayValues","searchBar__Guest","searchBar__Guests","searchBar__Baby","searchBar__Babies","searchBar__Pet","searchBar__Pets","ArrivalDeparturePicker","LocationPicker2023","CompanionsPicker","isLandingPage","isProviderPage","criteriaActions","isChecked","toggle","valueIndex","area","scrollTop","console","log","def","searchApp_Label_NoFilterText","CombinedFilter","combinedFilterInstance","filter_Confirm","onToggleFilter","usePaging","prevIndex","btnPreviousText","rel","doPage","createUrlForPage","firstPageEntry","renderCssClass","renderPageNumber","hasGapBeforeWith3","pagesArray","pd","hasGapAfterWith3","lastPageEntry","nextIndex","btnNextText","searchApp_Pagination_Back","searchApp_Pagination_Next","showFor3Design","setData","getPrevious","getNext","lastPage","active","counter","unshift","deep","flush","action","excludeLocation","locationAction","excludeOrderBy","orderByAction","exclude","propertiesToWatch","prop","includes","SearchFilter","SearchFilterBar","PagingControl","searchAppContainer","searchPageBody","searchResults","altResults","castData","innerHTML","content","alt","oldVal","remove","getElementById","getElementsByTagName","dataset","app","mount"],"mappings":"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","file":"js/app.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/VueApps/_Dist/Search2023/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([\"f0da\",\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./SearchFilterBarComponent.css?vue&type=style&index=0&lang=css\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./paging_control_styles.css?vue&type=style&index=0&id=4ccab902&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./RegionComponentStyles.css?vue&type=style&index=0&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./styles.css?vue&type=style&index=0&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./styles.css?vue&type=style&index=0&id=3925f3bc&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./CombinedFilterComponent.css?vue&type=style&index=0&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./styles2023.css?vue&type=style&index=0&lang=css\"","module.exports = Vue;","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./arrivalDeparturePicker.css?vue&type=style&index=0&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./CountryComponentStyles.css?vue&type=style&index=0&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./SearchFilterComponent.css?vue&type=style&index=0&lang=css\"","\r\n","// This file has been generated from LT.Web.App_Logic.SearchSetup.Models.SearchResultBaseVue\r\n\r\nexport default class SearchResultBaseVue {\r\n\r\n page: number;\r\n pageCount: number;\r\n pageSize: number;\r\n totalCount: number;\r\n hasResultsForParamsOnly: boolean;\r\n\r\n\r\n\tconstructor(page: number, pageCount: number, pageSize: number, totalCount: number, hasResultsForParamsOnly: boolean){\r\n\t\r\n this.page = page;\r\n this.pageCount = pageCount;\r\n this.pageSize = pageSize;\r\n this.totalCount = totalCount;\r\n this.hasResultsForParamsOnly = hasResultsForParamsOnly;\r\n\t}\r\n}","import FilterDefinitionsVue from '@Types/search/FilterDefinitionsVue';\r\nimport SearchMetaDefinitionsVue from '@Types/search/SearchMetaDefinitionsVue';\r\nimport SearchResultBaseVue from \"@Types/search/SearchResultBaseVue\";\r\nimport { FilterSelectionLocation, FilterSelectionLocationEntry } from '../Types/FilterSelections';\r\nimport GeoBoundingBoxTSVM from '../Types/search/GeoBoundingBoxTSVM';\r\nimport GeoPointTSVM from '../Types/search/GeoPointTSVM';\r\n\r\n\r\n\r\ndeclare const filterDefinitions: FilterDefinitionsVue | undefined;\r\ndeclare const searchMetaDefinitions: SearchMetaDefinitionsVue | undefined;\r\ndeclare const initialSearchResults: SearchResultBaseVue | undefined;\r\n\r\n\r\n/**\r\n * Returns the default filter definitions as set server side, this\r\n * is required for each search related page that needs the specific\r\n * id's etc for the search to work. e.g. amenitiyIds for specific\r\n * filter types.\r\n * \r\n * Note that setting these properties in c# is done through the SearchSetupHelper class.\r\n * \r\n * @returns\r\n */\r\nexport function getFilterDefinitions(): FilterDefinitionsVue {\r\n\r\n if (!filterDefinitions) {\r\n\r\n throw new Error(\"filterDefinitions is undefined\");\r\n }\r\n\r\n return filterDefinitions;\r\n}\r\n\r\n/**\r\n * Returns the search meta definitions as set server side, contains\r\n * specifics about the current search 'page' such as if it is from a \r\n * specific landing page, contains data about the initial location selections,\r\n * the search url it started from, fetchUrl etc.\r\n * \r\n * Note that setting these properties in c# is done through the SearchSetupHelper class.\r\n * \r\n * @returns\r\n */\r\nexport function getSearchMetaDefinitions(): SearchMetaDefinitionsVue {\r\n\r\n if (!searchMetaDefinitions) {\r\n\r\n throw new Error(\"searchMetaDefinitions is undefined\");\r\n }\r\n\r\n return searchMetaDefinitions;\r\n}\r\n\r\n/**\r\n * can check to see if the searchMetaDefinitions are set.\r\n * \r\n * @returns\r\n */\r\nexport function hasSearchMetaDefinitions() {\r\n\r\n return !!searchMetaDefinitions;\r\n}\r\n\r\n/**\r\n * The initial search is done with server side rendering, this method\r\n * returns the data about that initial search, which normally come with a \r\n * new fetch calls. This contains information such as the number of results,\r\n * page, etc.\r\n * \r\n * Note that setting these properties in c# is done through the SearchSetupHelper class.\r\n * \r\n * @returns\r\n */\r\nexport function getSearchBaseResultsFromServerSideRendering(createEmptyIfNotExists: boolean = false): SearchResultBaseVue {\r\n\r\n if (!initialSearchResults) {\r\n\r\n\r\n if (createEmptyIfNotExists) {\r\n return new SearchResultBaseVue(0, 0, 0, 0, false);\r\n }\r\n\r\n throw new Error(\"searchResultBase is undefined\");\r\n }\r\n\r\n return initialSearchResults;\r\n}\r\n\r\n\r\nexport function getBoundingBoxForLocationSelection(filter: FilterSelectionLocation) {\r\n\r\n if (filter.hasValue()) {\r\n\r\n const sm = getSearchMetaDefinitions();\r\n // try get for: sm.countriesWithRegions\r\n const bbs = new Array();\r\n for (let sel of filter.selection) {\r\n\r\n const bb = tryGetBoundingBox(sel);\r\n if (bb) {\r\n bbs.push(bb);\r\n }\r\n }\r\n\r\n // can also try with custom selections:\r\n //sm.locationSelections\r\n\r\n // future: landing page specific locations?\r\n\r\n // merge bbs to single bb (or null if no bb's found)\r\n return mergeBoundingBoxes(bbs);\r\n\r\n } else {\r\n // should reset to outer dimensions?\r\n }\r\n\r\n // fall back:\r\n\r\n\r\n return null;\r\n\r\n\r\n}\r\n\r\n/**\r\n * will merge bounding boxes into a single bounding box.\r\n * For b1 (top-left):\r\n Get the minimum longitude (most left) from all b1 points.\r\n Get the maximum latitude (most top) from all b1 points.\r\n For b2 (bottom-right):\r\n Get the maximum longitude (most right) from all b2 points.\r\n Get the minimum latitude (most bottom) from all b2 points.\r\n * @param bbs\r\n * @returns\r\n */\r\nexport function mergeBoundingBoxes(bbs: Array) {\r\n\r\n if (bbs == null || bbs.length == 0) {\r\n return null;\r\n }\r\n let minLng = bbs[0].b1.lng; // Most left\r\n let maxLat = bbs[0].b1.lat; // Most top\r\n let maxLng = bbs[0].b2.lng; // Most right\r\n let minLat = bbs[0].b2.lat; // Most bottom\r\n\r\n for (let bb of bbs) {\r\n minLng = Math.min(minLng, bb.b1.lng);\r\n maxLat = Math.max(maxLat, bb.b1.lat);\r\n maxLng = Math.max(maxLng, bb.b2.lng);\r\n minLat = Math.min(minLat, bb.b2.lat);\r\n }\r\n\r\n return new GeoBoundingBoxTSVM(new GeoPointTSVM(maxLat, minLng), new GeoPointTSVM(minLat, maxLng));\r\n}\r\n\r\n/**\r\n * will search the searchmeta definitions for the relevant entries (lowest level possible, e.g. city first then up to country).\r\n * will also fall back to country if bb not set in other levels.\r\n * \r\n * @param sel\r\n * @returns\r\n */\r\nexport function tryGetBoundingBox(sel: FilterSelectionLocationEntry): GeoBoundingBoxTSVM | null {\r\n\r\n let bb: GeoBoundingBoxTSVM | null = null;\r\n\r\n // note that data is nested, so we have to zoom in...\r\n\r\n if (sel.countryValueId) {\r\n\r\n const country = getSearchMetaDefinitions().countriesWithRegions.find(t => t.id == sel.countryValueId);\r\n\r\n\r\n if (country) {\r\n\r\n if (sel.regionValueId) {\r\n\r\n const region = country.subEntries.find(t => t.id == sel.regionValueId);\r\n if (region && region.geoBox) {\r\n\r\n bb = region.geoBox;\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n\r\n\r\n\r\n // fallback to country if needed.\r\n if (!bb && country.geoBox) {\r\n\r\n bb = country.geoBox;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n return bb;\r\n}\r\n\r\n\r\n\r\n/**\r\n * Helper function that can be used to read the location details for the initial\r\n * server side rendering. we have no complete list of location details, as they\r\n * are fetched from server on typeahead. Therefore we cannot show the initial\r\n * names, and this data is set on the initial search request, inside the searchMetaDefinitions .\r\n * \r\n * @param id\r\n */\r\nexport function getInitialLocationSelectionDetails(id: number) {\r\n\r\n const sm = getSearchMetaDefinitions();\r\n return sm.locationSelections.find(t => t.id == id);\r\n\r\n}\r\n\r\n/**\r\n * checks to see if in the initial search meta definitions there are any\r\n * locations selected. \r\n * @returns\r\n */\r\nexport function hasInitialLocationSelectionOnInit() {\r\n\r\n if (hasSearchMetaDefinitions()) {\r\n\r\n const sm = getSearchMetaDefinitions();\r\n return sm.locationSelections?.length > 0;\r\n }\r\n\r\n return false;\r\n\r\n}\r\n\r\n\r\n// todo: perhaps we should have an alt version that \r\n// should not clear all filters, but only the landing page data specifi.c (like we had\r\n// in a prev version)\r\nexport function clearFiltersAndRedirect() {\r\n\r\n // basically, this should clear everything, and reset full.\r\n // the easiest way it to in fact do a clean redirect to the current search (map/non map).\r\n // as that would automatically clear any and all filters, such as landing page, provider,\r\n // etc.\r\n\r\n let urlAction = getSearchMetaDefinitions().searchUrl;\r\n\r\n if (getSearchMetaDefinitions().isMapSearch) {\r\n\r\n urlAction = getSearchMetaDefinitions().mapSearchUrl;\r\n\r\n }\r\n\r\n let url = new URL(urlAction, window.location.href);\r\n window.location.assign(url.href);\r\n\r\n\r\n ////if (isLandingPage.value || isProviderPage.value) {\r\n //// var searchQuery = filterToQuery(filter, searchModel.paging.clone(0));\r\n //// const url = new URL(searchComposables.getSearchMetaDefinitions().searchUrl, window.location.href).href + '?' + searchQuery;\r\n\r\n //// // console.debug(\"clearning landing page, redirecting to default search page...\");\r\n //// window.location.assign(url);\r\n ////}\r\n}\r\n\r\n\r\n\r\n","export class FilterSelectionDate {\r\n\r\n arrival?: string;\r\n departure?: string;\r\n default?: string;\r\n\r\n}\r\n\r\n\r\n/*\r\n * \r\n * NL selectecetern> \r\n * selection[0] = {name: \"NL\", \"amenitytId: 12\", value: 4 };\r\n * Heel nederland?\r\n * \r\n * \r\n */\r\n\r\nexport class FilterSelectionLocation {\r\n\r\n selection = new Array();\r\n\r\n customName?: string;\r\n\r\n getSelectionName() {\r\n\r\n // selection[0].name\r\n // or if multiplee items return string.join (...)\r\n //or if custom name => return custom name\r\n }\r\n\r\n hasValue(countNoPreference = true): boolean {\r\n // returns true if there is 'any' selection. note that\r\n // this will also unclide the no preference.\r\n\r\n if (countNoPreference) {\r\n return !!this.selection.length;\r\n } else {\r\n\r\n if (this.selection.length) {\r\n\r\n if (this.selection.length == 1) {\r\n\r\n if (this.selection[0].countryNoPreference) {\r\n\r\n // no preference means no value\r\n return false;\r\n }\r\n }\r\n\r\n // either 1 with not a no-country-preference,\r\n // or more than 1\r\n return true; \r\n }\r\n\r\n return false;\r\n }\r\n }\r\n}\r\n\r\nexport class FilterSelectionLocationEntry {\r\n\r\n countryName?: string;\r\n countryValueId?: number;\r\n countryNoPreference!: boolean;\r\n regionName?: string;\r\n regionValueId?: number;\r\n regionNoPreference!: boolean;\r\n cityName?: string;\r\n cityValueId?: number;\r\n cityNoPreference!: boolean;\r\n\r\n /**\r\n * has selected at least a country\r\n */\r\n hasSelection(): boolean {\r\n\r\n return !!this.countryValueId;\r\n }\r\n\r\n getAsFormValue(): string | false {\r\n\r\n if (this.countryValueId) {\r\n let val = `${this.countryValueId}`;\r\n\r\n if (this.regionValueId) {\r\n\r\n val += `,${this.regionValueId}`;\r\n } else if (this.cityValueId) {\r\n\r\n val += `,-1`;\r\n }\r\n\r\n if (this.cityValueId) {\r\n\r\n val += `,${this.cityValueId}`;\r\n }\r\n return val;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n\r\n}\r\n\r\nexport class FilterSelectionCompanions {\r\n\r\n numberOfAdults = 2;\r\n numberOfPets = 0;\r\n numberOfChildren = 0;\r\n numberOfBabies = 0;\r\n\r\n}","import { } from 'vue';\r\nimport { FilterSelectionDate, FilterSelectionLocation, FilterSelectionCompanions } from '@Types/FilterSelections';\r\n\r\n\r\nexport class FilterModel {\r\n\r\n accommodationTypes = new Array();\r\n accommodationTypeNoPreference = true;\r\n criteria = [] as Array>;\r\n bedrooms = 1;\r\n bathrooms = 1;\r\n \r\n date = new FilterSelectionDate();\r\n location = new FilterSelectionLocation();\r\n companions = new FilterSelectionCompanions();\r\n orderBy?: string = \"\";\r\n \r\n public clearCriteria(): void {\r\n\r\n this.criteria.forEach(c => c.splice(0));\r\n }\r\n}\r\n\r\n// class that maps to a querystring set of variables that define a single property \r\nexport class FilterParamEntry {\r\n\r\n paramId: number;\r\n amount: number | null;\r\n minValue: number | null;\r\n values: number[];\r\n\r\n constructor() {\r\n\r\n this.values = [];\r\n this.amount = null;\r\n this.minValue = null;\r\n this.paramId = 0;\r\n }\r\n}\r\n\r\n","import { FilterModel, FilterParamEntry } from '@Apps/Search/Src/Models/FilterModel';\r\nimport PagingModel from '@Apps/Search/Src/Models/PagingModel';\r\nimport * as searchComposables from '@Composables/SearchComposables';\r\nimport { FilterSelectionLocationEntry } from '@Types/FilterSelections';\r\n\r\n\r\nconst getLocationFromDefinitions = (id: number) => {\r\n\r\n return searchComposables.getInitialLocationSelectionDetails(id);\r\n};\r\n\r\nconst urlConvertersDefaultModelBinder = {\r\n\r\n /**\r\n * parses a list of values (from query string usually) and\r\n * matches each param into a filter param entry.\r\n * where (query string) values are given as: is[0].param=1&is[0].value=3&is[1].param=2\r\n * this will group together based on the array indexer, so all is[0] are\r\n * bound together in the same object.\r\n * @param prefix\r\n * @param params\r\n */\r\n parse(prefix: string, params: { key: string, val: string }[]): Array {\r\n\r\n let result = new Array();\r\n\r\n // inline hlper function to get the value from the key\r\n const getParamNameFromKey = (key: string, ident: string): string => {\r\n\r\n return key.substr(ident.length + 1);\r\n };\r\n\r\n // these all start with \"key[xxx]\", and then contain paramid, amount or minvalue\r\n // we need to group them together based on the key, but we dont actually need the key\r\n // so we only need to check if the prefix/key is the same, and we need to remove the prefix\r\n // to determine which attribute it is\r\n let curIdent = \"--\";\r\n let curParam: FilterParamEntry | null = null;\r\n params.forEach((p) => {\r\n\r\n if (p.key.startsWith(curIdent)) {\r\n\r\n // belongs to the same item,\r\n // parse value and add to curParam\r\n }\r\n else {\r\n\r\n // new entry, so determine new curIdent,\r\n // create new curParam\r\n // add to results\r\n curIdent = p.key.substr(0, p.key.indexOf(\"]\") + 1);\r\n curParam = new FilterParamEntry();\r\n result.push(curParam);\r\n }\r\n\r\n // using current curId and curParam, parse id/value\r\n let paramName = getParamNameFromKey(p.key, curIdent);\r\n // note that values array will have the paramName formatted as values[0], values[1] etc.\r\n if (paramName.toLowerCase().startsWith('values')) {\r\n paramName = 'values';\r\n }\r\n // since we cannot be sure of casing, we need to lower compare\r\n Object.keys(curParam!).forEach(key => {\r\n\r\n \r\n\r\n if (key.toLowerCase() == paramName) {\r\n\r\n // workaround typescript forced type\r\n if (Array.isArray((curParam as any)[key])) {\r\n\r\n // we currently only have a values array... which is number\r\n (curParam as any)[key].push(+p.val);\r\n }\r\n else {\r\n (curParam as any)[key] = +p.val;\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 return result;\r\n },\r\n\r\n\r\n toIs(index: number, amenityId: number, ...valueId: number[]) {\r\n\r\n //using old style c# modelbinder for now:\r\n let str = `Is[${index}].ParamId=${amenityId}`;\r\n for (let i = 0; i < valueId.length; i++) {\r\n str += `&Is[${index}].Values=${valueId[i]}`;\r\n }\r\n return str;\r\n },\r\n\r\n\r\n\r\n toAmount(index: number, amenityId: number, amount: number, isMin = true) {\r\n\r\n //using old style c# modelbinder for now:\r\n return `Amount[${index}].ParamId=${amenityId}&Amount[${index}].${(isMin ? \"MinValue\" : \"MaxValue\")}=${amount}`;\r\n\r\n },\r\n\r\n toHas(index: number, ...amenityId: number[]) {\r\n\r\n return amenityId.map((v, i) => `Has[${index + i}].ParamId=${v}`).join('&');\r\n\r\n },\r\n\r\n toHasSearch(index: number, ...amenityId: number[]) {\r\n\r\n return amenityId.map((v, i) => `HasSearch[${index + i}].ParamId=${v}`).join('&');\r\n\r\n },\r\n\r\n join(...params: Array>) {\r\n\r\n return params.filter(s => s.length > 0).flat().join(\"&\");\r\n }\r\n\r\n};\r\n\r\n\r\nexport function toUrlOrderBy(filter: FilterModel): Array {\r\n\r\n const other = new Array();\r\n\r\n if (filter.orderBy !== undefined && filter.orderBy !== \"\") {\r\n other.push(`OrderBy=${filter.orderBy}`);\r\n }\r\n\r\n return other;\r\n}\r\n\r\nexport function toUrlDate(filter: FilterModel): Array {\r\n\r\n const other = new Array();\r\n\r\n if (filter.date.arrival && filter.date.departure) {\r\n\r\n other.push(`Date.Min=${filter.date.arrival}`);\r\n other.push(`Date.Max=${filter.date.departure}`);\r\n\r\n }\r\n\r\n return other;\r\n}\r\n\r\nexport function toUrlCompanions(filter: FilterModel): Array {\r\n\r\n const other = new Array();\r\n\r\n if (filter.companions.numberOfAdults) {\r\n\r\n other.push(`NumberOfPersons=${filter.companions.numberOfAdults}`);\r\n }\r\n\r\n\r\n if (filter.companions.numberOfPets) {\r\n\r\n other.push(`NumberOfPets=${filter.companions.numberOfPets}`);\r\n }\r\n\r\n\r\n if (filter.companions.numberOfBabies) {\r\n\r\n other.push(`NumberOfBabies=${filter.companions.numberOfBabies}`);\r\n }\r\n\r\n return other;\r\n}\r\n\r\n\r\nexport function toUrl(filter: FilterModel, paging?: PagingModel): string {\r\n\r\n\r\n const has = new Array();\r\n let hasIndex = 0;\r\n const is = new Array();\r\n let isIndex = 0;\r\n\r\n const date = [];\r\n\r\n const amount = new Array();\r\n let amountIndex = 0;\r\n\r\n const hasSearch = new Array();\r\n let hasSearchIndex = 0;\r\n\r\n if (!filter.accommodationTypeNoPreference && filter.accommodationTypes.length > 0) {\r\n\r\n // only add specific preferences\r\n is.push(urlConvertersDefaultModelBinder.toIs(isIndex++, searchComposables.getFilterDefinitions().amenityIdAccommodationType, ...filter.accommodationTypes));\r\n }\r\n\r\n\r\n // validate for default.. no need to send default filter..\r\n if (filter.bedrooms !== 1) {\r\n\r\n amount.push(urlConvertersDefaultModelBinder.toAmount(amountIndex++, searchComposables.getFilterDefinitions().amenityIdBedrooms, filter.bedrooms));\r\n }\r\n if (filter.bathrooms !== 1) {\r\n\r\n amount.push(urlConvertersDefaultModelBinder.toAmount(amountIndex++, searchComposables.getFilterDefinitions().amenityIdBathrooms, filter.bathrooms));\r\n }\r\n\r\n\r\n\r\n\r\n\r\n // get all search criteria in one go:\r\n const searchCriteriaFlattened = filter.criteria.flat();\r\n if (searchCriteriaFlattened.length > 0) {\r\n\r\n hasSearch.push(urlConvertersDefaultModelBinder.toHasSearch(hasSearchIndex++, ...searchCriteriaFlattened));\r\n }\r\n\r\n\r\n const other = new Array();\r\n\r\n // currently these are added as regular values:\r\n if (filter.location.hasValue()) {\r\n\r\n\r\n filter.location.selection.forEach((selection, index) => {\r\n\r\n var fs = selection.getAsFormValue();\r\n if (fs !== false) {\r\n\r\n\r\n other.push(`Locations[${index}]=${fs}`);\r\n\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n other.push(...toUrlDate(filter));\r\n\r\n other.push(...toUrlCompanions(filter));\r\n\r\n \r\n\r\n\r\n if (paging !== undefined && paging.hasPaging()) {\r\n // no need to set page and pagesize if value is 0.. \r\n other.push(`Page=${paging.page}`);\r\n other.push(`PageSize=${paging.pageSize}`);\r\n\r\n }\r\n\r\n other.push(...toUrlOrderBy(filter));\r\n\r\n \r\n\r\n const searchQuery = urlConvertersDefaultModelBinder.join(has, is, hasSearch, amount, other);\r\n return searchQuery;\r\n\r\n}\r\n\r\n\r\nexport function fromUrlBase(filter: FilterModel, search: string): FilterModel {\r\n\r\n const params = new URLSearchParams(search.toLowerCase());\r\n\r\n\r\n // using default model binder c#\r\n const allIs = new Array<{ key: string; val: string }>();\r\n const allHas = new Array<{ key: string; val: string }>();\r\n const allAmount = new Array<{ key: string; val: string }>();\r\n const allHasSearch = new Array<{ key: string; val: string }>();\r\n\r\n // get each valid key:\r\n // has, date, is, hasSearch, amount\r\n params.forEach((val, key) => {\r\n\r\n\r\n // Date:\r\n // Date.Min\r\n if (key.startsWith('date.')) {\r\n\r\n if (key === 'date.min') {\r\n\r\n // todo: should check is valid date\r\n\r\n filter.date.arrival = val;\r\n }\r\n else if (key === 'date.max') {\r\n\r\n filter.date.departure = val;\r\n }\r\n }\r\n\r\n else if (key === \"defaultdate\") {\r\n filter.date.default = val;\r\n }\r\n\r\n else if (key === \"numberofpersons\") {\r\n\r\n filter.companions.numberOfAdults = +val;\r\n }\r\n else if (key === \"numberofbabies\") {\r\n\r\n filter.companions.numberOfBabies = +val;\r\n }\r\n else if (key === \"numberofpets\") {\r\n\r\n filter.companions.numberOfPets = +val;\r\n }\r\n else if (key === \"numberofchildren\") {\r\n\r\n filter.companions.numberOfChildren = +val;\r\n }\r\n\r\n // usually we have only one location. but more is possible. in that case we need to get all the values\r\n // from the definitions.\r\n else if (key.startsWith(\"locations[\")) {\r\n\r\n // we need to get the index, as that should match with the initLocations..\r\n const locIndex = + key.replaceAll(\"locations[\", \"\").replaceAll(\"]\", \"\");\r\n\r\n // val => string with one or more selections. e.g. 1,130,10 (meaning netherlands, zeeland, burgh haamstede)\r\n // 1 => nederland\r\n // 1, 130 => nederland, zeeland\r\n // 1,-1, 10 => nederland + burghaamstede...(no region selected)\r\n\r\n const locIds = val.split(',').map(t => +t);\r\n if (locIds.length > 0) {\r\n\r\n const le = new FilterSelectionLocationEntry();\r\n filter.location.selection.push(le);\r\n\r\n le.countryValueId = locIds[0]; // country\r\n const countryData = getLocationFromDefinitions(le.countryValueId);\r\n if (countryData) {\r\n le.countryName = countryData.label;\r\n }\r\n\r\n if (locIds.length > 1) {\r\n\r\n if (locIds[1] != -1) { // -1 => skip, no region selected, should have a city selected?\r\n\r\n le.regionValueId = locIds[1];\r\n const regionData = getLocationFromDefinitions(le.regionValueId);\r\n if (regionData) {\r\n le.regionName = regionData.label;\r\n }\r\n }\r\n }\r\n\r\n if (locIds.length > 2) {\r\n\r\n le.cityValueId = locIds[2];\r\n const cityData = getLocationFromDefinitions(le.cityValueId);\r\n if (cityData) {\r\n le.cityName = cityData.label;\r\n }\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n // the rest is parsing of the \"Is\", \"Has\", hasSearch, \"amount\",.\r\n // these all work the same, more or less\r\n // some are converted to specific properties, such as bedrooms, bathrooms, accommodation type and location.\r\n else if (key.startsWith(\"is[\")) {\r\n allIs.push({ key, val });\r\n }\r\n else if (key.startsWith(\"has[\")) {\r\n allHas.push({ key, val });\r\n }\r\n else if (key.startsWith(\"amount[\")) {\r\n allAmount.push({ key, val });\r\n }\r\n else if (key.startsWith(\"hassearch[\")) {\r\n allHasSearch.push({ key, val });\r\n }\r\n\r\n else if (key === \"orderby\") {\r\n filter.orderBy = val;\r\n }\r\n\r\n\r\n // note that paging data will normally be set through the init settings\r\n // as this is set server side. therefore we do not need to read it from the url \r\n //(since values will be absent in the url, but will be set in from the server )\r\n //else if (key === \"page\") { // do not use starts with here, because pageSize and pageCount will also trigger\r\n\r\n // paging.setPage(val);\r\n //}\r\n //else if (key === \"pageCount\") {\r\n\r\n // paging.setPageCount(val);\r\n //}\r\n //else if (key === \"pageSize\") {\r\n\r\n // paging.setPageSize(val);\r\n //}\r\n\r\n });\r\n\r\n\r\n const isParams = urlConvertersDefaultModelBinder.parse(\"is\", allIs);\r\n const hasParams = urlConvertersDefaultModelBinder.parse(\"has\", allHas);\r\n const hasSearchParams = urlConvertersDefaultModelBinder.parse(\"hassearch\", allHasSearch);\r\n const amountParams = urlConvertersDefaultModelBinder.parse(\"amount\", allAmount);\r\n\r\n // currently we do not use these params directly, but they are converted to specific types.\r\n\r\n // isParams => accommodation type and location\r\n\r\n // try get\r\n const hasAccType = isParams.filter((v) => v.paramId === searchComposables.getFilterDefinitions().amenityIdAccommodationType).flatMap(t => t.values);\r\n if (hasAccType.length > 0) {\r\n filter.accommodationTypes.push(...hasAccType);\r\n filter.accommodationTypeNoPreference = false;\r\n } else {\r\n filter.accommodationTypeNoPreference = true;\r\n }\r\n\r\n // location is now a seperate property on the search fields.\r\n\r\n //// currently we have no way to define if a isParam is used for a location, since we do not specify those definitions\r\n //// for now: anything that is not accommodation type is a location. if we have more Is definitiions in the future,\r\n //// we either need to check those as well, or move the location to a specific property for the querystring..\r\n //const locationSelection = isParams.find(v => ![definitions.amenityIdAccommodationType /* , add any other definitions to filter.. */].some(d => d == v.paramId));\r\n //if (locationSelection) {\r\n\r\n // filter.location.amenityId = locationSelection.paramId;\r\n // filter.location.valueId = locationSelection.values[0];\r\n\r\n //}\r\n\r\n // amountParams => bedrooms, bathrooms,\r\n const bedroomSelection = amountParams.find((v) => v.paramId === searchComposables.getFilterDefinitions().amenityIdBedrooms);\r\n if (bedroomSelection) {\r\n\r\n filter.bedrooms = bedroomSelection.minValue ?? 1;\r\n }\r\n\r\n const bathroomSelection = amountParams.find((v) => v.paramId === searchComposables.getFilterDefinitions().amenityIdBathrooms);\r\n if (bathroomSelection) {\r\n\r\n filter.bathrooms = bathroomSelection.minValue ?? 1;\r\n }\r\n\r\n\r\n\r\n // hasParams => currently not used since we use search criteria and not amenities directly.\r\n\r\n\r\n // hasSearch => criteria\r\n // note that the criteria is a bit of a special collection, as it contains\r\n // selected items based on the group to which the criterium belongs.\r\n // so we need to first check to which criteria group our selected item belongs.\r\n\r\n hasSearchParams.forEach((sp) => {\r\n\r\n // we only need param id here\r\n // search our search criteria definitions:\r\n loopGroups:\r\n for (let groupIndex = 0; groupIndex < searchComposables.getFilterDefinitions().searchCriteriaGrouping.length; groupIndex++) {\r\n\r\n loopCriteria:\r\n for (let critIndex = 0; critIndex < searchComposables.getFilterDefinitions().searchCriteriaGrouping[groupIndex].items.length; critIndex++) {\r\n\r\n if (searchComposables.getFilterDefinitions().searchCriteriaGrouping[groupIndex].items[critIndex].keyId == sp.paramId) {\r\n\r\n // add the current search param to:\r\n filter.criteria[groupIndex].push(sp.paramId);\r\n\r\n // break out of group loop, since we found what we need for the current search param.\r\n break loopGroups;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n });\r\n\r\n\r\n\r\n return filter;\r\n}\r\n\r\n\r\n/**\r\n * Reads and fills the filter model from either the current search param on the url, or\r\n * in case of a rewrite, it will use the set initquerystring from the url rewrite parameters \r\n * as passed down from the controller.\r\n * \r\n * @param filter\r\n */\r\nexport function fromUrlOrRewrite(filter: FilterModel): FilterModel {\r\n\r\n if (searchComposables.hasSearchMetaDefinitions() && searchComposables.getSearchMetaDefinitions().queryStringFromRewrite) {\r\n\r\n return fromUrlBase(filter, searchComposables.getSearchMetaDefinitions().queryStringFromRewrite);\r\n }\r\n\r\n\r\n return fromUrlBase(filter, window.location.search);\r\n\r\n\r\n\r\n}","export default class PagingModel {\r\n\r\n\r\n pageCount?: number;\r\n page?: number;\r\n pageSize?: number; // currently not used internally\r\n\r\n\r\n /**\r\n * Will create a new paging model for a new page.\r\n * will keep the current pageSize.\r\n * \r\n * @param newPage\r\n */\r\n clone(newPage: number) {\r\n\r\n const cloned = new PagingModel();\r\n cloned.page = newPage;\r\n cloned.pageSize = this.pageSize;\r\n cloned.pageCount = this.pageCount;\r\n return cloned;\r\n }\r\n\r\n hasPaging(): boolean {\r\n\r\n // either pageCount is undefined, or 0 (default) otherwise it should be 1\r\n // for the 'first' page.\r\n\r\n return this.pageCount === undefined? false: (this.pageCount > 1);\r\n\r\n }\r\n\r\n\r\n private getValueFor(val: number| string | undefined): number | undefined {\r\n\r\n let returnValue = undefined;\r\n if (val !== undefined && val !== \"\") {\r\n\r\n if (typeof val === \"number\") {\r\n return val;\r\n }\r\n returnValue = parseInt(val);\r\n if (isNaN(returnValue)) {\r\n returnValue = undefined;\r\n }\r\n }\r\n\r\n\r\n return returnValue;\r\n }\r\n\r\n\r\n setPage(val: number | undefined) {\r\n\r\n this.page = this.getValueFor(val);\r\n }\r\n\r\n setPageCount(val: number | undefined) {\r\n\r\n this.pageCount = this.getValueFor(val);\r\n\r\n }\r\n\r\n setPageSize(val: number | undefined) {\r\n\r\n this.pageSize = this.getValueFor(val);\r\n }\r\n\r\n\r\n getPrevious(): number {\r\n\r\n \r\n if (this.page !== undefined) {\r\n\r\n if (this.page > 0) return this.page - 1;\r\n }\r\n return -1;\r\n }\r\n\r\n getNext() {\r\n\r\n if (this.page !== undefined && this.pageCount !== undefined) {\r\n\r\n if (this.page < (this.pageCount - 1)) return this.page + 1;\r\n }\r\n return -1;\r\n }\r\n\r\n\r\n}\r\n","import PagingModel from '@Apps/Search/Src/Models/PagingModel';\r\nimport { FilterModel } from '@Apps/Search/Src/Models/FilterModel';\r\n\r\nexport default class SearchModel {\r\n\r\n\r\n filter = new FilterModel();\r\n\r\n paging = new PagingModel();\r\n\r\n totalCount = 0;\r\n}","import { } from 'vue';\r\nimport SearchModel from '@Apps/Search/Src/Models/SearchModel';\r\nimport { fromUrlOrRewrite } from '@Apps/Search/Src/Logic/urlConvert';\r\nimport * as searchComposables from '@Composables/SearchComposables';\r\n\r\n\r\n//import PagingModel from '@Apps/Search/Src/Models/PagingModel';\r\n//import { FilterModel, FilterParamEntry } from '@Apps/Search/Src/Models/FilterModel';\r\n//import { FilterSelectionDate, FilterSelectionLocation, FilterSelectionCompanions } from '@Types/FilterSelections';\r\n\r\n\r\n\r\nexport function setupSearchModel(): SearchModel {\r\n\r\n \r\n const searchModel = new SearchModel();\r\n\r\n for (let i = 0; i < searchComposables.getFilterDefinitions().criteriaGroupCount; i++) {\r\n\r\n searchModel.filter.criteria.push(new Array());\r\n }\r\n\r\n // WRONG: setting non UI related data on filter, can trigger \r\n // a watch update when changed after a fetch.\r\n // these properties should be set on a different object which is not watched.\r\n // e.g. not the filter model, but a 'Search Model \"?\r\n\r\n\r\n // total count can be read from 'global'\r\n searchModel.totalCount = searchComposables.getSearchBaseResultsFromServerSideRendering().totalCount;\r\n\r\n // paging init can also be read from global;\r\n searchModel.paging.page = searchComposables.getSearchBaseResultsFromServerSideRendering().page;\r\n searchModel.paging.pageCount = searchComposables.getSearchBaseResultsFromServerSideRendering().pageCount;\r\n searchModel.paging.pageSize = searchComposables.getSearchBaseResultsFromServerSideRendering().pageSize;\r\n\r\n\r\n\r\n fromUrlOrRewrite(searchModel.filter);\r\n\r\n return searchModel;\r\n}\r\n\r\n\r\n\r\n","import { watch, computed, ComputedRef, reactive, ref, Ref } from 'vue';\r\n\r\nimport ICombinedFilterComponent from '@Components/CombinedFilter/ICombinedFilterComponent';\r\n\r\n\r\nexport interface CombinedFilterSetupResult {\r\n\r\n isFilterVisible: Ref;\r\n\r\n onSearchBarAction: (targetArea: string | undefined) => void;\r\n onHideFilter: () => void;\r\n\r\n\r\n}\r\n\r\n\r\nexport function setupCombinedFilter(filterInstance: Ref): CombinedFilterSetupResult {\r\n //performs setup for the two components and their interaction. that is what the ICombinedFilterComponent is for,\r\n // if not null, it will be used to trigger the correct area from the bar click.\r\n\r\n\r\n // note that depending on mobile or desktop, we might\r\n // actually want to have a different default value.\r\n // e.g. for mobile hidden, but for large desktop, (where it collapses left/right)\r\n // we might want to have it visible.\r\n\r\n // todo: we have done something in BHVK to do some default setup based on initial\r\n // screen size. We might want to do something similar here. is not perfect,\r\n // but works for most default cases.\r\n const isMapFilterVisible = ref(false);\r\n\r\n // handles clicks from the search bar action. initially\r\n // only opens the bar, but with parameters we can also determine\r\n // a specific action.\r\n const onSearchBarAction = (targetArea: string | undefined) => {\r\n\r\n\r\n filterInstance.value?.onFocusArea(targetArea);\r\n isMapFilterVisible.value = !isMapFilterVisible.value;\r\n\r\n\r\n };\r\n\r\n const onHideFilter = () => {\r\n\r\n\r\n isMapFilterVisible.value = false;\r\n };\r\n\r\n return {\r\n\r\n isFilterVisible: isMapFilterVisible,\r\n onSearchBarAction,\r\n onHideFilter\r\n };\r\n\r\n}","// This file has been generated from LT.Core.Logic.Search.SearchOrderingOption\r\nexport enum SearchOrderingOption {\r\n\r\n \r\n Default = 0,\r\n PriceAsc = 11,\r\n PriceDesc = 12,\r\n MaxGuestCountAsc = 21,\r\n MaxGuestCountDesc = 22\r\n\r\n}\r\nexport default SearchOrderingOption;","import { FilterModel } from \"@Apps/Search/Src/Models/FilterModel\";\r\n\r\n\r\n// this is v1 search\r\n//const accommodationLinkSelector = \".accommodation-card a\";\r\n\r\nconst accommodationLinkSelector = \"a.accommodation-card-v2023\";\r\n\r\n//const searchUrlParameter = \"searchUrl\";\r\nconst scrollPositionParameter = \"scrolly\";\r\nexport function addNewHistoryEntry(search: string): void {\r\n // update location?\r\n // note does not contain fragment\r\n const browserAddressHref = new URL(window.location.pathname, window.location.href).href + \"?\" + search;\r\n history.replaceState({ search }, \"\", browserAddressHref);\r\n\r\n}\r\n\r\nexport function getCurrentUrlAsRelative(): string {\r\n\r\n return location.pathname + location.search;\r\n\r\n}\r\n\r\n/**\r\n * will url encode the current url and format it as \"returnUrl=[currenturl as encodeUriComponent()];\r\n * */\r\nexport function getCurrentUrlAsReturnUrl(paramName = \"returnUrl\", includeScroll = false): string {\r\n\r\n let url = getCurrentUrlAsRelative();\r\n if (includeScroll) {\r\n\r\n\r\n if (url.indexOf(\"?\") >= 0) {\r\n url += \"&\";\r\n } else {\r\n url += \"?\";\r\n }\r\n\r\n url += scrollPositionParameter + \"=\" + 123; // todo:: get scroll.. onload: scroll to\r\n\r\n }\r\n\r\n return paramName + \"=\" + encodeURIComponent(url);\r\n}\r\n\r\nexport function addHistoryOnClick(container: HTMLElement, filter: FilterModel, clearAction: undefined | (() => void) = undefined): void {\r\n\r\n\r\n container.addEventListener(\"click\", function (e: Event) {\r\n\r\n const s = e.target as HTMLElement;\r\n if (s && s.classList.contains(\"btn-favorite\")){\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n\r\n const link = s.closest(accommodationLinkSelector);\r\n if (link) {\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const linkHref = link.getAttribute(\"href\")!;\r\n\r\n\r\n\r\n window.location.href = linkHref + (linkHref.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + getCurrentUrlAsReturnUrl();\r\n }\r\n else {\r\n const reset = s.closest(\"[data-trigger-reset-filter]\");\r\n if (reset) {\r\n\r\n if (clearAction) {\r\n clearAction();\r\n } else {\r\n // this is done on the old search, but will in fact not clear all search filters.\r\n e.preventDefault();\r\n e.stopPropagation();\r\n filter.clearCriteria();\r\n }\r\n }\r\n }\r\n\r\n });\r\n\r\n}","import { watch, computed, ComputedRef, reactive, ref, Ref } from 'vue';\r\nimport { FilterModel, FilterParamEntry } from '@Apps/Search/Src/Models/FilterModel';\r\nimport PagingModel from '@Apps/Search/Src/Models/PagingModel';\r\nimport * as searchComposables from '@Composables/SearchComposables';\r\n\r\nimport { addNewHistoryEntry } from '@Apps/Search/Src/Logic/historyLogic';\r\nimport { toUrl } from '@Apps/Search/Src/Logic/urlConvert';\r\nimport SearchModel from '@Apps/Search/Src//Models/SearchModel';\r\nimport SearchOrderingOption from '../Types/search/SearchOrderingOption';\r\n\r\n\r\nexport interface SetupResult {\r\n\r\n stateIsFetching: ComputedRef;\r\n triggerNewSearch: () => void;\r\n\r\n}\r\n\r\nexport interface IFetchSearchResult {\r\n pageCount: number | undefined;\r\n page: number | undefined;\r\n pageSize: number | undefined;\r\n totalCount: number;\r\n}\r\n\r\nconst queueDelay = 200;\r\nlet _searchModel: SearchModel;\r\nlet _onProcessData: (data: IFetchSearchResult) => void;\r\n\r\nconst fetchQueue = reactive({\r\n\r\n currentTimeout: -1,\r\n activeFetches: new Map(),\r\n newFetchWaiting: false as number | boolean\r\n\r\n\r\n});\r\n\r\n\r\nexport function setup(searchModel: SearchModel, onProcessData: (data: IFetchSearchResult) => void): SetupResult {\r\n\r\n\r\n _searchModel = searchModel;\r\n _onProcessData = onProcessData;\r\n\r\n /**\r\n * true if there is a fetch requesting running to get \r\n * new search results.\r\n **/\r\n const stateIsFetching = computed(() => {\r\n\r\n return isInDebounce() || isFetching() || fetchQueue.newFetchWaiting === true;\r\n\r\n });\r\n\r\n\r\n return {\r\n\r\n stateIsFetching,\r\n triggerNewSearch: changeTriggered\r\n };\r\n}\r\n\r\n\r\n\r\nfunction isInDebounce() {\r\n\r\n return fetchQueue.currentTimeout > -1;\r\n}\r\n\r\nfunction isFetching() {\r\n\r\n return fetchQueue.activeFetches.size > 0;\r\n}\r\n\r\nfunction changeTriggered() {\r\n\r\n // this means a change has triggered on the model, and we should fetch new data, (with timeout)\r\n // but wait for the current fetch to complete, (if any)\r\n\r\n if (isInDebounce()) {\r\n\r\n // extend the debounce by resetting and setting a new timeout\r\n clearTimeout(fetchQueue.currentTimeout);\r\n fetchQueue.currentTimeout = setTimeout(fetchNext, queueDelay);\r\n }\r\n else if (isFetching()) {\r\n\r\n // already fetching, so we should wait until the fetch is complete\r\n fetchQueue.newFetchWaiting = Date.now();\r\n }\r\n else {\r\n\r\n // first trigger:\r\n fetchQueue.currentTimeout = setTimeout(fetchNext, queueDelay);\r\n }\r\n}\r\n\r\nexport function fetchPage(page: number) {\r\n\r\n // force clear timeout\r\n clearTimeout(fetchQueue.currentTimeout);\r\n fetchNext(page);\r\n}\r\n\r\n\r\nfunction fetchNext(page?: number) {\r\n\r\n // when fetching the next item, it means that the current timestamp has expired,\r\n // we add that to the queue\r\n const fetchId = fetchQueue.currentTimeout;\r\n fetchQueue.activeFetches.set(fetchId, true);\r\n fetchQueue.currentTimeout = -1;\r\n\r\n // always create new paging for page 0 unless specifically specified\r\n const url = toUrl(_searchModel.filter, _searchModel.paging.clone(page === undefined ? 0 : page));\r\n fetchDataAsync(url, fetchId);\r\n}\r\n\r\n\r\n/**\r\n * when a fetch call has ended, either succesfully or with errors, we need to \r\n * update our fetch queue.\r\n */\r\nfunction fetchEnded(fetchId: number) {\r\n\r\n // we can clear our fetchQueue map:\r\n fetchQueue.activeFetches.delete(fetchId); // we can check the result value to see if we actually had a fetchId...\r\n\r\n if (fetchQueue.newFetchWaiting !== false) {\r\n\r\n const timeout = fetchQueue.newFetchWaiting as number;\r\n\r\n // set timeout\r\n let diff = Date.now() - timeout;\r\n if (diff < 1) {\r\n diff = 1;\r\n }\r\n\r\n // should not have a new timeout, but just in case:\r\n if (fetchQueue.currentTimeout > -1) {\r\n clearTimeout(fetchQueue.currentTimeout);\r\n }\r\n\r\n fetchQueue.currentTimeout = setTimeout(fetchNext, diff);\r\n fetchQueue.newFetchWaiting = false; // reset\r\n }\r\n}\r\n\r\nexport enum CreateSearchUrlType {\r\n\r\n fetch = 0,\r\n search = 1,\r\n mapSearch = 2,\r\n /**\r\n * current means use whatever is currently active\r\n */\r\n current = 3,\r\n\r\n /**\r\n * Means switch from map to non map, or vice versa. for landingpages\r\n * this will automatically include the landing page id as part of the url rewrite.\r\n */\r\n switch = 4\r\n}\r\n\r\n\r\nexport function createSearchUrl(searchQuery: string, type: CreateSearchUrlType, includePath = true) {\r\n\r\n\r\n // determine which url we need..\r\n // if fetch, then easy, if not, check if map is required.\r\n let urlAction = searchComposables.getSearchMetaDefinitions().fetchUrl;\r\n\r\n if (type == CreateSearchUrlType.current) {\r\n\r\n if (searchComposables.getSearchMetaDefinitions().isMapSearch) {\r\n urlAction = searchComposables.getSearchMetaDefinitions().searchUrl;\r\n }\r\n else {\r\n urlAction = searchComposables.getSearchMetaDefinitions().mapSearchUrl;\r\n }\r\n\r\n }\r\n else if (type == CreateSearchUrlType.mapSearch) {\r\n\r\n urlAction = searchComposables.getSearchMetaDefinitions().mapSearchUrl;\r\n }\r\n else if (type == CreateSearchUrlType.search) {\r\n\r\n urlAction = searchComposables.getSearchMetaDefinitions().searchUrl;\r\n }\r\n else if (type == CreateSearchUrlType.switch) {\r\n\r\n urlAction = searchComposables.getSearchMetaDefinitions().switchUrl;\r\n }\r\n\r\n\r\n let url = new URL(urlAction, window.location.href).href;\r\n\r\n if (searchQuery) {\r\n\r\n url = url + '?' + searchQuery;\r\n }\r\n\r\n if (includePath) {\r\n\r\n url = url + (searchQuery?\"&\":\"?\") + (`path=${window.location.pathname}`);\r\n }\r\n\r\n \r\n // for switch we do not need these values as the url would include the id / rewritten path.\r\n if (type != CreateSearchUrlType.switch) {\r\n if (searchComposables.getSearchMetaDefinitions().landingPageId != null) {\r\n\r\n url += \"&landingPageId=\" + searchComposables.getSearchMetaDefinitions().landingPageId;\r\n }\r\n\r\n if (searchComposables.getSearchMetaDefinitions().providerPageId != undefined) {\r\n url += \"&providerId=\" + searchComposables.getSearchMetaDefinitions().providerPageId;\r\n }\r\n }\r\n\r\n\r\n return url;\r\n}\r\n\r\nfunction fetchDataAsync(search: string, fetchId: number) {\r\n\r\n\r\n let url = createSearchUrl(search, CreateSearchUrlType.fetch);\r\n\r\n addNewHistoryEntry(search);\r\n\r\n\r\n fetch(url,\r\n {\r\n method: 'GET',\r\n redirect: \"error\"\r\n })\r\n .then(response => response.json())\r\n\r\n .then(\r\n // closure for fetchId so that we can unset/update the fetchQueue\r\n // (also used for errors)\r\n (function (_fid: number) {\r\n\r\n return function (response: any) {\r\n\r\n fetchDataResult(_fid, response);\r\n }\r\n })(fetchId))\r\n\r\n .catch(\r\n // @see then, using closure\r\n (function (_fid: number) {\r\n\r\n return function (response: any) {\r\n\r\n fetchDataResultError(_fid, response);\r\n }\r\n })(fetchId)\r\n\r\n );\r\n}\r\n\r\nfunction fetchDataResult(fetchId: number, data: IFetchSearchResult) {\r\n\r\n // update content... (note that we should not update the filter\r\n // as that is being watched by vue!)\r\n\r\n _searchModel.totalCount = data.totalCount;\r\n\r\n\r\n _searchModel.paging.setPage(data.page);\r\n _searchModel.paging.setPageCount(data.pageCount);\r\n _searchModel.paging.setPageSize(data.pageSize);\r\n\r\n _onProcessData(data);\r\n\r\n fetchEnded(fetchId);\r\n}\r\n\r\nfunction fetchDataResultError(fetchId: number, response: any) {\r\n\r\n // something went wrong, do we need to show the user?\r\n // \r\n alert('Er ging iets mis bij het ophalen van de informatie, probeer de pagina te verversen');\r\n\r\n fetchEnded(fetchId);\r\n}\r\n\r\n\r\n\r\nexport type ISortableAccommodationEntry = {\r\n\r\n searchPrice?: number;\r\n reviewScore?: number;\r\n maxGuestCount?: number;\r\n orderKeyString: string;\r\n}\r\n\r\nexport function orderSearchResults(orderBy: SearchOrderingOption, hasDatesSelected: boolean, items: Array) {\r\n\r\n // we only order by price if we have dates selected..\r\n if (orderBy == SearchOrderingOption.PriceAsc && hasDatesSelected) {\r\n\r\n return [...items].sort((a, b) => (a.searchPrice ?? 0) - (b.searchPrice ?? 0));\r\n\r\n\r\n\r\n }\r\n else if (orderBy == SearchOrderingOption.PriceDesc && hasDatesSelected) {\r\n return [...items].sort((a, b) => (b.searchPrice ?? 0) - (a.searchPrice ?? 0));\r\n\r\n }\r\n else if (orderBy == SearchOrderingOption.MaxGuestCountAsc) {\r\n return [...items].sort((a, b) => (a.maxGuestCount ?? 0) - (b.maxGuestCount ?? 0));\r\n }\r\n else if (orderBy == SearchOrderingOption.MaxGuestCountDesc) {\r\n return [...items].sort((a, b) => (b.maxGuestCount ?? 0) - (a.maxGuestCount ?? 0));\r\n }\r\n\r\n else {\r\n\r\n return [...items].sort((a, b) => (a.orderKeyString ?? \"\").localeCompare(b.orderKeyString));\r\n }\r\n}","export default function scrollToTop(noDelay = false) {\r\n\r\n\r\n setTimeout(() => {\r\n\r\n document.querySelector(\"#scrollTopAnchor\")?.scrollIntoView({ behavior: \"smooth\" });\r\n\r\n }, noDelay?0: 130);\r\n \r\n}","declare let globalLanguage: string;\r\nlet currentLanguage = globalLanguage || \"nl\";\r\n\r\nconst translations = {\r\n\r\n nl: {\"filterPartial_Label_AccomodationsFound\":\"vakantieverblijven gevonden\",\"filterPartial_Label_AccomodationType\":\"Type vakantieverblijf\",\"filterPartial_Label_All\":\"Alles\",\"filterPartial_Label_Bathrooms\":\"Badkamers\",\"filterPartial_Label_Bedrooms\":\"Slaapkamers\",\"filterPartial_Label_CalculatePriceWhenDateChange\":\"We berekenen de prijsinformatie als je een datum kiest, pas dan kunnen we er op sorteren.\",\"filterPartial_Label_Close\":\"Sluit\",\"filterPartial_Label_RefineYourSearch\":\"Verfijn je zoekopdracht\",\"filterPartial_Label_RoomBeds\":\"Kamers en bedden\",\"filterPartial_Label_SortBy\":\"Sorteer op\",\"filterPartial_Label_SortBy_Price_HighFirst\":\"Prijs (hoogste eerst)\",\"filterPartial_Label_SortBy_Price_LowFirst\":\"Prijs (laagste eerst)\",\"filterPartial_Label_SortBy_Standard\":\"Standaard\",\"filterPartial_Label_SortBy_TotalPerson_HighFirst\":\"Aantal personen (hoogste eerst)\",\"filterPartial_Label_SortBy_TotalPerson_LowFirst\":\"Aantal personen (laagste eerst)\",\"filterPartial_Label_View\":\"Toon\",\"searchApp_Btn_ToTop\":\"naar boven\",\"searchApp_Label_ClearAllFilters\":\"Alle filters wissen\",\"searchApp_Label_NoFilterText\":\"Alle filters wissen\",\"searchApp_Label_ResultCount\":\"aantal resultaten:\",\"searchApp_Pagination_Back\":\"Vorige\",\"searchApp_Pagination_Next\":\"Volgende\",\"searhApp_Label_ShowMap\":\"Kaartweergave\"},\r\n en: {\"filterPartial_Label_AccomodationsFound\":\"vacation rentals found\",\"filterPartial_Label_AccomodationType\":\"Type of vacation rental\",\"filterPartial_Label_All\":\"All\",\"filterPartial_Label_Bathrooms\":\"Bathrooms\",\"filterPartial_Label_Bedrooms\":\"Bedrooms\",\"filterPartial_Label_CalculatePriceWhenDateChange\":\"We can calculate the price information when you choose a date, only then can we sort by it.\",\"filterPartial_Label_Close\":\"Close\",\"filterPartial_Label_RefineYourSearch\":\"Refine your search\",\"filterPartial_Label_RoomBeds\":\"Rooms and beds\",\"filterPartial_Label_SortBy\":\"Sort by\",\"filterPartial_Label_SortBy_Price_HighFirst\":\"Price (highest first)\",\"filterPartial_Label_SortBy_Price_LowFirst\":\"Price (lowest first)\",\"filterPartial_Label_SortBy_Standard\":\"Standard\",\"filterPartial_Label_SortBy_TotalPerson_HighFirst\":\"Number of persons (highest first)\",\"filterPartial_Label_SortBy_TotalPerson_LowFirst\":\"Number of persons (lowest first)\",\"filterPartial_Label_View\":\"Show\",\"searchApp_Btn_ToTop\":\"Go to top\",\"searchApp_Label_ClearAllFilters\":\"Clear all filters\",\"searchApp_Label_NoFilterText\":\"Clear all filters\",\"searchApp_Label_ResultCount\":\"Number of results:\",\"searchApp_Pagination_Back\":\"Back\",\"searchApp_Pagination_Next\":\"Next\",\"searhApp_Label_ShowMap\":\"Map View\"},\r\n de: {\"filterPartial_Label_AccomodationsFound\":\"Ferienunterk\\u00FCnfte gefunden\",\"filterPartial_Label_AccomodationType\":\"Art der Ferienunterk\\u00FCnft\",\"filterPartial_Label_All\":\"Alles\",\"filterPartial_Label_Bathrooms\":\"Badezimmer\",\"filterPartial_Label_Bedrooms\":\"Schlafzimmer\",\"filterPartial_Label_CalculatePriceWhenDateChange\":\"Wir berechnen die Preisinformationen, wenn Sie ein Datum ausw\\u00E4hlen, nur dann k\\u00F6nnen wir danach sortieren.\",\"filterPartial_Label_Close\":\"Schlie\\u00DFen\",\"filterPartial_Label_RefineYourSearch\":\"Verfeinern Sie Ihre Suche\",\"filterPartial_Label_RoomBeds\":\"Zimmer und Betten\",\"filterPartial_Label_SortBy\":\"Sortieren nach\",\"filterPartial_Label_SortBy_Price_HighFirst\":\"Preis (h\\u00F6chster zuerst)\",\"filterPartial_Label_SortBy_Price_LowFirst\":\"Preis (niedrigster zuerst)\",\"filterPartial_Label_SortBy_Standard\":\"Standard\",\"filterPartial_Label_SortBy_TotalPerson_HighFirst\":\"Anzahl der Personen (h\\u00F6chste zuerst)\",\"filterPartial_Label_SortBy_TotalPerson_LowFirst\":\"Anzahl der Personen (niedrigste zuerst)\",\"filterPartial_Label_View\":\"Anzeigen\",\"searchApp_Btn_ToTop\":\"nach oben\",\"searchApp_Label_ClearAllFilters\":\"Alle Filter l\\u00F6schen\",\"searchApp_Label_NoFilterText\":\"Alle Filter l\\u00F6schen\",\"searchApp_Label_ResultCount\":\"Anzahl der Ergebnisse:\",\"searchApp_Pagination_Back\":\"Zur\\u00FCck\",\"searchApp_Pagination_Next\":\"Weiter\",\"searhApp_Label_ShowMap\":\"Kartenansicht\"}\r\n};\r\n\r\ninterface appTranslations {\r\n\r\n filterPartial_Label_AccomodationsFound: string; \r\n filterPartial_Label_AccomodationType: string; \r\n filterPartial_Label_All: string; \r\n filterPartial_Label_Bathrooms: string; \r\n filterPartial_Label_Bedrooms: string; \r\n filterPartial_Label_CalculatePriceWhenDateChange: string; \r\n filterPartial_Label_Close: string; \r\n filterPartial_Label_RefineYourSearch: string; \r\n filterPartial_Label_RoomBeds: string; \r\n filterPartial_Label_SortBy: string; \r\n filterPartial_Label_SortBy_Price_HighFirst: string; \r\n filterPartial_Label_SortBy_Price_LowFirst: string; \r\n filterPartial_Label_SortBy_Standard: string; \r\n filterPartial_Label_SortBy_TotalPerson_HighFirst: string; \r\n filterPartial_Label_SortBy_TotalPerson_LowFirst: string; \r\n filterPartial_Label_View: string; \r\n searchApp_Btn_ToTop: string; \r\n searchApp_Label_ClearAllFilters: string; \r\n searchApp_Label_NoFilterText: string; \r\n searchApp_Label_ResultCount: string; \r\n searchApp_Pagination_Back: string; \r\n searchApp_Pagination_Next: string; \r\n searhApp_Label_ShowMap: string; \r\n\r\n}\r\n\r\n//@ts-ignore\r\nlet currentTranslation = (currentLanguage in translations) ? translations[currentLanguage] : translations[\"nl\"];\r\n\r\nexport default currentTranslation as appTranslations;","\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 import { defineComponent, ref, Ref, computed, PropType, ComputedRef, inject } from 'vue';\r\n import { DateEntry, } from '@Components/ArrivalDeparturePicker/Types/DateEntry';\r\n\r\n export default defineComponent({\r\n\r\n props: {\r\n\r\n day: {\r\n type: Object as PropType,\r\n required: true\r\n }\r\n },\r\n\r\n setup(props, context) {\r\n\r\n\r\n\r\n const arrivalDateLt = inject('arrivalDateLt') as ComputedRef;\r\n const departureDateLt = inject('departureDateLt') as ComputedRef;;\r\n\r\n // we dont need availability, we provide the valid dates..\r\n // const availability = inject('availability');// as reactive | undefined;\r\n const validDepartures = inject('validDepartures') as ComputedRef>;\r\n\r\n\r\n // if i am the arrival date, i should be selected\r\n const isSelectedArrival = computed(() => arrivalDateLt.value !== undefined && arrivalDateLt.value == props.day.ltDate);\r\n\r\n\r\n // if i am the departure date, i should be selected\r\n const isSelectedDeparture = computed(() => departureDateLt.value !== undefined && departureDateLt.value == props.day.ltDate);\r\n\r\n // if i am between arrival and departure,\r\n // i should be selected\r\n const isSelected = computed(() => {\r\n\r\n if (isSelectedArrival.value || isSelectedDeparture.value) return true;\r\n\r\n // todo : determine if there is a selection, and this value is between it\r\n if (arrivalDateLt.value !== undefined && departureDateLt.value !== undefined) {\r\n\r\n return props.day.ltDate > arrivalDateLt.value && props.day.ltDate < departureDateLt.value;\r\n }\r\n\r\n return false;\r\n\r\n });\r\n\r\n // if there is an arrival date, but no departure date,\r\n // i should show if i am valid as a departure date\r\n const isValidDeparture = computed(() => {\r\n\r\n return validDepartures.value.some((value, index) => index === 0 ? false : value == props.day.ltDate);\r\n\r\n });\r\n\r\n\r\n return {\r\n isSelectedArrival,\r\n isSelectedDeparture,\r\n isSelected,\r\n isValidDeparture\r\n };\r\n }\r\n });\r\n\r\n\r\n\r\n","import { render } from \"./Day.vue?vue&type=template&id=2efb8e56\"\nimport script from \"./Day.vue?vue&type=script&lang=ts\"\nexport * from \"./Day.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","declare let globalLanguage: string;\r\nlet currentLanguage = globalLanguage || \"nl\";\r\n\r\nconst translations = {\r\n\r\n nl: {\"arrivalDeparturePicker_Btn_NoDatePreference\":\"Geen voorkeur\",\"arrivalDeparturePicker_Btn_ResetDate\":\"Wis datum\",\"arrivalDeparturePicker_Error_SomethingWentWrong\":\"Something went wrong while getting availability, please refresh the page\",\"arrivalDeparturePicker_Label_2Char_Friday\":\"Vr\",\"arrivalDeparturePicker_Label_2Char_Monday\":\"Ma\",\"arrivalDeparturePicker_Label_2Char_Saturday\":\"Za\",\"arrivalDeparturePicker_Label_2Char_Sunday\":\"Zo\",\"arrivalDeparturePicker_Label_2Char_Thursday\":\"Do\",\"arrivalDeparturePicker_Label_2Char_Tuesday\":\"Di\",\"arrivalDeparturePicker_Label_2Char_Wednesday\":\"Wo\",\"arrivalDeparturePicker_Label_ChooseDeptToContinue\":\"Selecteer een vertrekdatum om door te gaan\",\"arrivalDeparturePicker_Title_ChooseArrDept\":\"Kies aankomst en vertrek\"},\r\n en: {\"arrivalDeparturePicker_Btn_NoDatePreference\":\"No preference\",\"arrivalDeparturePicker_Btn_ResetDate\":\"Reset date\",\"arrivalDeparturePicker_Error_SomethingWentWrong\":\"Something went wrong while getting the availability data, please refresh the page\",\"arrivalDeparturePicker_Label_2Char_Friday\":\"Fr\",\"arrivalDeparturePicker_Label_2Char_Monday\":\"Mo\",\"arrivalDeparturePicker_Label_2Char_Saturday\":\"Sa\",\"arrivalDeparturePicker_Label_2Char_Sunday\":\"Su\",\"arrivalDeparturePicker_Label_2Char_Thursday\":\"Th\",\"arrivalDeparturePicker_Label_2Char_Tuesday\":\"Tu\",\"arrivalDeparturePicker_Label_2Char_Wednesday\":\"We\",\"arrivalDeparturePicker_Label_ChooseDeptToContinue\":\"Select a departure date to continue\",\"arrivalDeparturePicker_Title_ChooseArrDept\":\"Choose arrival and departure date\"},\r\n de: {\"arrivalDeparturePicker_Btn_NoDatePreference\":\"Keine Pr\\u00E4ferenz\",\"arrivalDeparturePicker_Btn_ResetDate\":\"Datum l\\u00F6schen\",\"arrivalDeparturePicker_Error_SomethingWentWrong\":\"Etwas ist schief gelaufen, w\\u00E4hrend Sie auf die Verf\\u00FCgbarkeit gewartet haben, bitte aktualisieren Sie die Seite\",\"arrivalDeparturePicker_Label_2Char_Friday\":\"Fr\",\"arrivalDeparturePicker_Label_2Char_Monday\":\"Mo\",\"arrivalDeparturePicker_Label_2Char_Saturday\":\"Sa\",\"arrivalDeparturePicker_Label_2Char_Sunday\":\"So\",\"arrivalDeparturePicker_Label_2Char_Thursday\":\"Do\",\"arrivalDeparturePicker_Label_2Char_Tuesday\":\"Di\",\"arrivalDeparturePicker_Label_2Char_Wednesday\":\"Mi\",\"arrivalDeparturePicker_Label_ChooseDeptToContinue\":\"Bitte w\\u00E4hlen Sie ein Abreisedatum aus, um fortzufahren\",\"arrivalDeparturePicker_Title_ChooseArrDept\":\"W\\u00E4hlen Sie An- und Abreise\"}\r\n};\r\n\r\ninterface appTranslations {\r\n\r\n arrivalDeparturePicker_Btn_NoDatePreference: string; \r\n arrivalDeparturePicker_Btn_ResetDate: string; \r\n arrivalDeparturePicker_Error_SomethingWentWrong: string; \r\n arrivalDeparturePicker_Label_2Char_Friday: string; \r\n arrivalDeparturePicker_Label_2Char_Monday: string; \r\n arrivalDeparturePicker_Label_2Char_Saturday: string; \r\n arrivalDeparturePicker_Label_2Char_Sunday: string; \r\n arrivalDeparturePicker_Label_2Char_Thursday: string; \r\n arrivalDeparturePicker_Label_2Char_Tuesday: string; \r\n arrivalDeparturePicker_Label_2Char_Wednesday: string; \r\n arrivalDeparturePicker_Label_ChooseDeptToContinue: string; \r\n arrivalDeparturePicker_Title_ChooseArrDept: string; \r\n\r\n}\r\n\r\n//@ts-ignore\r\nlet currentTranslation = (currentLanguage in translations) ? translations[currentLanguage] : translations[\"nl\"];\r\n\r\nexport default currentTranslation as appTranslations;","\r\n\r\n import { defineComponent, ref, reactive, PropType, watch } from 'vue';\r\n import Day from '@Components/ArrivalDeparturePicker/Day.vue';\r\n\r\n import { MonthEntry } from './Types/MonthEntry';\r\n\r\n import appTranslations from \"@Components/ArrivalDeparturePicker/Translations/VueTranslations\"\r\n\r\n export default defineComponent({\r\n\r\n components: { Day },\r\n\r\n props: {\r\n\r\n\r\n month: {\r\n type: Object as PropType,\r\n required: true\r\n }\r\n\r\n },\r\n\r\n\r\n setup(props, context) {\r\n\r\n return {\r\n arrivalDeparturePicker_Label_2Char_Friday: appTranslations.arrivalDeparturePicker_Label_2Char_Friday,\r\n arrivalDeparturePicker_Label_2Char_Monday: appTranslations.arrivalDeparturePicker_Label_2Char_Monday,\r\n arrivalDeparturePicker_Label_2Char_Saturday: appTranslations.arrivalDeparturePicker_Label_2Char_Saturday,\r\n arrivalDeparturePicker_Label_2Char_Sunday: appTranslations.arrivalDeparturePicker_Label_2Char_Sunday,\r\n arrivalDeparturePicker_Label_2Char_Thursday: appTranslations.arrivalDeparturePicker_Label_2Char_Thursday,\r\n arrivalDeparturePicker_Label_2Char_Tuesday: appTranslations.arrivalDeparturePicker_Label_2Char_Tuesday,\r\n arrivalDeparturePicker_Label_2Char_Wednesday: appTranslations.arrivalDeparturePicker_Label_2Char_Wednesday\r\n };\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n","import { render } from \"./Month.vue?vue&type=template&id=db1f5302\"\nimport script from \"./Month.vue?vue&type=script&lang=ts\"\nexport * from \"./Month.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","import AvailabilityFetchVM from '../Types/AvailabilityFetchTSVM';\r\nimport appTranslations from \"@Components/ArrivalDeparturePicker/Translations/VueTranslations\"\r\n\r\nconst fetchAvailabilityUrl = \"/Fetch/FetchAvailability\";\r\n\r\nexport default async function fetchAvailability(accommodationId: number) {\r\n\r\n \r\n const url = new URL(fetchAvailabilityUrl + `?accommodationId=${accommodationId}`, window.location.href);\r\n\r\n const response = await fetch(url.toString(), {\r\n\r\n method: \"Get\",\r\n headers: { 'Content-Type': 'application/json' },\r\n redirect: \"error\"\r\n\r\n });\r\n\r\n if (response.ok) {\r\n\r\n return await response.json() as AvailabilityFetchVM;\r\n\r\n } else {\r\n\r\n alert(appTranslations.arrivalDeparturePicker_Error_SomethingWentWrong);\r\n\r\n }\r\n\r\n}","\r\n\r\n\r\nconst nrOfDaysStartOnMonday = [6, 0, 1, 2, 3, 4, 5];\r\nconst nrOfDaysStartOnSunday = [0, 1, 2, 3, 4, 5, 6];\r\n\r\n\r\n\r\n/**\r\n * function to pad a value with a leading 0 if required\r\n * @param val\r\n */\r\nexport function toXX(val: number) {\r\n\r\n // faster then pad? :val.toString().padStart(2,'0')\r\n\r\n if (val < 10) {\r\n return \"0\" + val;\r\n\r\n }\r\n else return \"\" + val;\r\n}\r\n\r\n\r\n/**\r\n * given the day of week, how many days in that week belong to the previous month, if the given date is the first day of the month? (defaults to starting the week on monday, if set to false, starts on sunday)\r\n * @param dayOfWeek\r\n * @param startWeekOnMonday\r\n */\r\nexport function computeNrOfDaysInPreviousMonth(dayOfWeek: number, startWeekOnMonday = true) {\r\n\r\n return startWeekOnMonday ? nrOfDaysStartOnMonday[dayOfWeek] : nrOfDaysStartOnSunday[dayOfWeek];\r\n\r\n}\r\n\r\n/**\r\n * given the day of week, how many days in that week belong to the next month, if that is the last day of the week? (defaults to starting the week on monday, if set to false, starts on sunday)\r\n * @param dayOfWeek\r\n * @param startWeekOnMonday\r\n */\r\nexport function computeNrOfDaysInNextMonth(dayOfWeek: number, startWeekOnMonday = true) {\r\n\r\n return 6 - (startWeekOnMonday ? nrOfDaysStartOnMonday[dayOfWeek] : nrOfDaysStartOnSunday[dayOfWeek]);\r\n\r\n}\r\n\r\n\r\n\r\n\r\nconst monthFormatter = new Intl.DateTimeFormat(undefined, { month: 'long', timeZone: 'UTC' });\r\n\r\nexport function computeNameOfMonth(jsMonth: number) {\r\n\r\n return monthFormatter.format(new Date(`2017-${toXX(jsMonth + 1)}-01T00:00:00+00:00`));\r\n\r\n}\r\n\r\n// this seems to be off by one depending on locale?\r\n//export function computeNameOfMonthWithDate(date: Date) {\r\n\r\n// return monthFormatter.format(date);\r\n\r\n//}\r\n\r\nconst oneDayMs = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds\r\nconst refDate = new Date(2020, 0, 1).getTime();\r\n\r\n/**\r\n * returns the LtDate representation of a given date time\r\n * @param day\r\n * @param jsMonth\r\n * @param year\r\n * @param ltDateRefYear\r\n */\r\nexport function computeLtDate(day: number, jsMonth: number, year: number): number {\r\n\r\n\r\n const date = new Date(year, jsMonth, day).getTime();\r\n // const refDate = new Date(ltDateRefYear, 0, 1).getTime();\r\n\r\n return Math.round(Math.abs((date - refDate) / oneDayMs));\r\n\r\n}\r\n\r\n/**\r\n * returns the LtDate representation of a given date time\r\n * @param day\r\n * @param month\r\n * @param year\r\n * @param ltDateRefYear\r\n */\r\nexport function computeLtDateFromDate(date: Date | undefined): number | undefined {\r\n\r\n if (!date) return undefined;\r\n\r\n return Math.round(Math.abs((date.getTime() - refDate) / oneDayMs));\r\n\r\n}\r\n\r\n/**\r\n * Converts an ltdate back to a date.\r\n * @param val\r\n */\r\nexport function fromLtDate(val: number | undefined): Date| undefined {\r\n\r\n if (!val) return undefined;\r\n\r\n const date = new Date(refDate.valueOf());\r\n date.setDate(date.getDate() + val);\r\n\r\n return date;\r\n\r\n}\r\n\r\n\r\n/**\r\n * will format a date as yyyy-mm-dd, with leading zeros if required.\r\n * to be used in an input type=date or querystring.\r\n * @param date\r\n */\r\nexport function toYYYYMMDD(date: Date | undefined) {\r\n\r\n if (date) {\r\n\r\n return `${date.getFullYear()}-${toXX(date.getMonth() + 1)}-${toXX(date.getDate())}`;\r\n\r\n }\r\n else return \"\";\r\n}\r\n\r\n/**\r\n * parse date that will return undefined if the value is not a string. value\r\n * should be in a valid string format for the new Date constructor.\r\n * @param str\r\n */\r\nexport function parseDate(str: string | undefined | null): Date | undefined {\r\n\r\n if (!str) return undefined;\r\n\r\n return new Date(str);\r\n\r\n}\r\n\r\nconst displayDateCurrentFormat = new Intl.DateTimeFormat([], { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\r\nconst displayShortDateCurrentFormat = new Intl.DateTimeFormat([], { weekday: 'short', month: 'short', day: 'numeric' });\r\nconst displayShortDateNoWeekdayCurrentFormat = new Intl.DateTimeFormat([], { month: 'short', day: 'numeric' });\r\nconst displayMonthNameAndYearFormat = new Intl.DateTimeFormat([], { month: 'long', year: 'numeric' });\r\n\r\n\r\n/**\r\n * converts a date to a long display date, using Intl functions. If the date is a string, then it is first parsed\r\n * to a new date. if undefined, returns empty string.\r\n * \r\n * @param date\r\n */\r\nexport function displayDate(date: string | Date | undefined): string {\r\n\r\n if (!date) {\r\n return \"\";\r\n }\r\n\r\n return displayDateCurrentFormat.format(date instanceof Date ? date : new Date(date));\r\n}\r\n\r\n/**\r\n * converts a date to a short display date, using Intl functions. If the date is a string, then it is first parsed\r\n * to a new date. if undefined, returns empty string.\r\n * \r\n * @param date\r\n */\r\nexport function displayShortDate(date: string | Date | undefined): string {\r\n\r\n if (!date) {\r\n return \"\";\r\n }\r\n\r\n return displayShortDateCurrentFormat.format(date instanceof Date ? date : new Date(date));\r\n}\r\n\r\n/**\r\n * converts a date to a short display date, using Intl functions. If the date is a string, then it is first parsed\r\n * to a new date. if undefined, returns empty string.\r\n * \r\n * @param date\r\n */\r\nexport function displayShortDateNoWeekday(date: string | Date | undefined): string {\r\n\r\n if (!date) {\r\n return \"\";\r\n }\r\n\r\n return displayShortDateNoWeekdayCurrentFormat.format(date instanceof Date ? date : new Date(date));\r\n}\r\n\r\n/**\r\n * converts a date to a short display date, using Intl functions. If the date is a string, then it is first parsed\r\n * to a new date. if undefined, returns empty string.\r\n * \r\n * @param date\r\n */\r\nexport function displayMonthAndYear(date: string | Date | undefined): string {\r\n\r\n if (!date) {\r\n return \"\";\r\n }\r\n\r\n return displayMonthNameAndYearFormat.format(date instanceof Date ? date : new Date(date));\r\n}\r\n\r\n\r\n\r\n/**\r\n * Converts a date format (e.g. yyyy-MM-dd) to an lt date value.\r\n * \r\n * @param str\r\n */\r\nexport function parseToLtDate(str: string | undefined | null): number | undefined {\r\n if (!str) return undefined;\r\n\r\n return computeLtDateFromDate(parseDate(str));\r\n\r\n\r\n}\r\n\r\n","\r\nexport enum ArrivalDepartureState {\r\n\r\n ReadOnly = 0,\r\n Arrival = 1,\r\n Departure = 2,\r\n ResetArrival = 3\r\n\r\n}\r\n\r\nexport default ArrivalDepartureState;","import AvailabilityFetchVM from './AvailabilityFetchTSVM';\r\nimport * as dateFunctions from '@Functions/DateFunctions';\r\n\r\nconst todayDate = new Date();\r\ntodayDate.setHours(0, 0, 0);\r\nconst today = dateFunctions.computeLtDateFromDate(todayDate) as number;\r\n\r\nexport class DateEntry {\r\n\r\n day: number;\r\n month: number;\r\n year: number;\r\n classes: Array;\r\n key: string;\r\n ltDate: number;\r\n\r\n constructor(day: number, month: number, year: number) {\r\n\r\n this.day = day;\r\n this.month = month;\r\n this.year = year;\r\n this.key = `${year}-${(month+1)}-${day}`;\r\n this.classes = [];\r\n\r\n this.ltDate = dateFunctions.computeLtDate(this.day, month, year);\r\n }\r\n\r\n\r\n /**\r\n * set data based on availability. should be set only once per run.\r\n * @param aval\r\n */\r\n public updateForAvailability(aval: AvailabilityFetchVM | undefined) {\r\n\r\n\r\n if (aval) {\r\n\r\n const checkArrival = true;\r\n let isAvailable = false;\r\n let isValidArrival = false;\r\n\r\n for (const ent of aval.entries) {\r\n\r\n if (!isAvailable && (this.ltDate >= ent[0] && this.ltDate <= ent[ent.length - 1])) {\r\n\r\n // if the current date is inside this entry, then the accommodation is available.\r\n isAvailable = true;\r\n }\r\n\r\n if (checkArrival && !isValidArrival && this.ltDate === ent[0]) {\r\n\r\n isValidArrival = true;\r\n }\r\n\r\n // if we have set both isAvailable, and isValidArrival, and\r\n // we dont need to check valid departure, then we can stop.\r\n if (checkArrival && isAvailable && isValidArrival) break;\r\n\r\n\r\n }\r\n\r\n if (isAvailable) {\r\n // entry.classes.push(\"-v\");\r\n } else {\r\n this.classes.push(\"-x\");\r\n }\r\n\r\n if (isValidArrival) {\r\n this.classes.push(\"-a\");\r\n }\r\n\r\n\r\n } else {\r\n\r\n // for non accommodation, so what we do here is only check using \"today\"\r\n // and perhaps a cap for max duration (?)\r\n if (this.ltDate <= (today + 2)) { // plus 2 -- beause in the accommodation calendar we use addDays 3 (inclusive) to fetch availability\r\n this.classes.push(\"-x\");\r\n } else {\r\n this.classes.push(\"-a\");\r\n }\r\n }\r\n };\r\n}\r\n\r\n\r\n\r\n","import { DateEntry } from './DateEntry';\r\nimport { computeNameOfMonth } from '@Functions/DateFunctions'\r\n\r\nexport class MonthEntry {\r\n\r\n \r\n month: number;\r\n year: number;\r\n key: string;\r\n days!: Array;\r\n monthName: string;\r\n\r\n constructor(month: number, year: number) {\r\n\r\n \r\n this.month = month;\r\n this.year = year;\r\n this.key = `${year}-${month}`;\r\n this.monthName = computeNameOfMonth(this.month);\r\n }\r\n\r\n \r\n}\r\n","/* eslint-disable @typescript-eslint/no-use-before-define */\r\n\r\nimport { DateEntry } from '../Types/DateEntry';\r\nimport { MonthEntry } from '../Types/MonthEntry';\r\nimport * as dateFunctions from '@Functions/DateFunctions';\r\nimport AvailabilityFetchVM from '../Types/AvailabilityFetchTSVM';\r\n\r\n\r\n/**\r\n * Creates all basic months/days for the given range.\r\n * \r\n * @param startYear\r\n * @param startMonth\r\n * @param endYear\r\n * @param endMonth\r\n */\r\nexport default function createData(startYear: number, startMonth: number, endYear: number, endMonth: number, aval: AvailabilityFetchVM | undefined): Array {\r\n\r\n\r\n const result = new Array();\r\n\r\n // starting with startYear, until endMonth, create months\r\n\r\n let doNextMonth = true;\r\n let index = 0;\r\n\r\n while (doNextMonth) {\r\n\r\n index++;\r\n if (index > 10 * 12) break; // hard cap for 10 years currently.\r\n\r\n const month = new MonthEntry(startMonth, startYear);\r\n createDaysForMonth(month, aval); //eslint-disable-line\r\n\r\n\r\n result.push(month);\r\n\r\n startMonth++;\r\n if (startMonth > 11) {\r\n startMonth = 0;\r\n startYear++;\r\n }\r\n\r\n if (startYear === endYear && startMonth > endMonth) {\r\n\r\n doNextMonth = false;\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n return result;\r\n}\r\n\r\n\r\nfunction createDaysForMonth(month: MonthEntry, aval: AvailabilityFetchVM | undefined) {\r\n\r\n\r\n month.days = new Array();\r\n\r\n const firstDayDate = new Date(month.year, month.month, 1);\r\n const lastDayDate = new Date(month.year, month.month + 1, 0);\r\n\r\n\r\n \r\n // add days of previous month if needed\r\n const daysInPrevMonth = dateFunctions.computeNrOfDaysInPreviousMonth(firstDayDate.getDay());\r\n\r\n if (daysInPrevMonth > 0) {\r\n\r\n // determine what the actual dates are:\r\n const prevDate = new Date(firstDayDate.valueOf());\r\n prevDate.setDate(prevDate.getDate() - daysInPrevMonth);\r\n\r\n // foreach day in prev month, add day\r\n for (let i = 0; i < daysInPrevMonth; i++) {\r\n\r\n month.days.push(createAndFillDataEntry(aval, prevDate.getDate() + i, prevDate.getMonth(), prevDate.getFullYear(), true, false)); \r\n }\r\n }\r\n\r\n // add each day of the month\r\n for (let i = 1; i <= lastDayDate.getDate(); i++) {\r\n\r\n month.days.push(createAndFillDataEntry(aval, i, month.month, month.year));\r\n }\r\n\r\n // add days in next month, if any\r\n const daysInNextMonth = dateFunctions.computeNrOfDaysInNextMonth(lastDayDate.getDay());\r\n\r\n if (daysInNextMonth > 0) {\r\n\r\n const nextDate = new Date(lastDayDate.valueOf());\r\n nextDate.setDate(nextDate.getDate() + 1);\r\n\r\n // foreach day in next month, add day\r\n for (let i = 1; i <= daysInNextMonth; i++) {\r\n\r\n month.days.push(createAndFillDataEntry(aval, i, nextDate.getMonth(), nextDate.getFullYear(), false, true));\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n\r\nfunction createAndFillDataEntry(aval: AvailabilityFetchVM | undefined, day: number, month: number, year: number, isPrevious = false, isNext = false): DateEntry {\r\n\r\n const entry = new DateEntry(day, month, year);\r\n entry.updateForAvailability(aval);\r\n\r\n if (isNext) {\r\n entry.classes.push(\"next\");\r\n }\r\n if (isPrevious) {\r\n entry.classes.push(\"prev\");\r\n }\r\n\r\n return entry;\r\n\r\n}\r\n\r\n","import AvailabilityFetchVM from '@Components/ArrivalDeparturePicker/Types/AvailabilityFetchTSVM';\r\n\r\nexport default class AvailabilityContainer {\r\n\r\n data: AvailabilityFetchVM | undefined;\r\n\r\n \r\n}","// set in index/html view, from json from c#\r\n// currently in home, and search;\r\ndeclare const nsCarousel: {\r\n create(selector: string | HTMLElement, options: object): Array;\r\n determineTrackEnds(options: any, container: HTMLElement, track: HTMLElement, e: any): void;\r\n};\r\nexport interface NSCarouselEntry {\r\n\r\n container: HTMLElement;\r\n track: HTMLElement;\r\n slides: NodeListOf;\r\n options: object;\r\n\r\n}\r\n\r\nexport const nsCarouselWrapper = nsCarousel;\r\n\r\nexport const nsArrivalDeparturePickerOptions = {\r\n\r\n track: \".adp-months-container\",\r\n forward:\".btn-next\",\r\n back: \".btn-prev\",\r\n slide: \".calendar\",\r\n trackEndClass: \"-is-end\",\r\n trackStartClass: \"-is-start\",\r\n invertTrackStartEnd: false \r\n};","import { defineComponent, ref, reactive, computed, provide, watch, nextTick, toRef, unref, onMounted } from 'vue';\r\nimport Month from '@Components/ArrivalDeparturePicker/Month.vue';\r\n\r\nimport SelectionConfirmedEvent from '@Components/ArrivalDeparturePicker/Types/SelectionConfirmedEvent';\r\n\r\nimport fetchAvailability from '@Components/ArrivalDeparturePicker/Functions/fetchAvailability';\r\nimport * as dateFunctions from '@Functions/DateFunctions';\r\nimport ArrivalDepartureState from './Types/ArrivalDepartureState';\r\nimport createData from './Functions/createData';\r\n\r\nimport AvailabilityContainer from './Types/AvailabilityContainer';\r\n\r\nimport { nsCarouselWrapper, nsArrivalDeparturePickerOptions, NSCarouselEntry } from '@Types/NSCarouselWrapper';\r\n\r\nimport appTranslations from \"@Components/ArrivalDeparturePicker/Translations/VueTranslations\"\r\n\r\ninterface DateReactive {\r\n\r\n value: number | undefined;\r\n}\r\n\r\nexport default defineComponent({\r\n\r\n components: { Month },\r\n\r\n props: {\r\n\r\n\r\n readOnly: {\r\n type: Boolean,\r\n required: false,\r\n default: false\r\n },\r\n\r\n arrivalDate: {\r\n type: String,\r\n required: false\r\n },\r\n departureDate: {\r\n type: String,\r\n required: false\r\n },\r\n\r\n defaultDate: {\r\n type: String,\r\n required: false\r\n },\r\n\r\n // add custom validators with regex: \\d{4}-[0123]?\\d-[0123]?\\d\r\n accommodationId: {\r\n\r\n type: String,\r\n required: false\r\n },\r\n\r\n numberOfMonths: {\r\n type: Number,\r\n required: false,\r\n default: 18\r\n },\r\n\r\n\r\n shouldDetectBecameVisible: {\r\n type: Boolean,\r\n required: false,\r\n default: false\r\n },\r\n\r\n becameVisible: {\r\n type: Boolean,\r\n required: false,\r\n },\r\n\r\n hideNoPreferenceButton: {\r\n type: Boolean,\r\n required: false,\r\n default: false\r\n },\r\n\r\n displaySingle:{\r\n type: Boolean,\r\n required: false,\r\n default: false\r\n },\r\n\r\n displayConstrained: {\r\n type: Boolean,\r\n required: false,\r\n default: false\r\n }\r\n\r\n },\r\n\r\n emits: {\r\n\r\n selectionConfirmed: null, // no validation\r\n resetDate: null\r\n },\r\n\r\n async setup(props, context) {\r\n\r\n const root = ref(null);\r\n\r\n const propsArrivalDate = toRef(props, 'arrivalDate');\r\n const propsDepartureDate = toRef(props, 'departureDate');\r\n\r\n const arrivalDate = ref(dateFunctions.parseToLtDate(propsArrivalDate.value));\r\n const departureDate = ref(dateFunctions.parseToLtDate(propsDepartureDate.value));\r\n const defaultDate = ref(dateFunctions.parseToLtDate(props.defaultDate));\r\n\r\n\r\n const availability = reactive(new AvailabilityContainer()); //define here so it can be used on watches etc.\r\n const validDepartures = ref>([]);\r\n\r\n let arrivalCarouselWrapper: null | NSCarouselEntry = null;\r\n\r\n let displayMode = \"display-auto\";\r\n if (props.displaySingle) {\r\n displayMode = \"display-single\";\r\n }\r\n\r\n if (props.displayConstrained) {\r\n displayMode = \"display-contrained\";\r\n }\r\n\r\n onMounted(() => {\r\n\r\n // must be called before any async calls.\r\n // mount our carousel js:\r\n arrivalCarouselWrapper = nsCarouselWrapper.create(root.value as HTMLElement, nsArrivalDeparturePickerOptions)[0];\r\n\r\n });\r\n\r\n // currently we do not watch for outside changes.\r\n // we can by enabling this code,\r\n watch(propsArrivalDate, (n, o) => {\r\n\r\n\r\n arrivalDate.value = dateFunctions.parseToLtDate(n);\r\n });\r\n\r\n watch(propsDepartureDate, (n, o) => {\r\n\r\n departureDate.value = dateFunctions.parseToLtDate(n);\r\n });\r\n\r\n const hasSelection = computed(() => { return !!arrivalDate.value && !!departureDate.value; });\r\n\r\n\r\n // final event to send a new arrival and departure date upwards\r\n const selectionConfirmed = () => {\r\n\r\n context.emit(\"selectionConfirmed\", {\r\n arrivalDate: dateFunctions.fromLtDate(arrivalDate.value),\r\n departureDate: dateFunctions.fromLtDate(departureDate.value),\r\n arrivalDateString: arrivalDateInput.value,\r\n departureDateString: departureDateInput.value\r\n } as SelectionConfirmedEvent);\r\n\r\n };\r\n\r\n // wrapper type to convert to/from formatted string to be used in input type=date\r\n const arrivalDateInput = computed(\r\n {\r\n get: () => { return dateFunctions.toYYYYMMDD(dateFunctions.fromLtDate(arrivalDate.value)); },\r\n set: val => {\r\n arrivalDate.value = dateFunctions.parseToLtDate(val.toString());\r\n }\r\n }\r\n );\r\n\r\n const hasArrivalDate = computed(() => { return !!arrivalDate.value; });\r\n\r\n /**\r\n * we always show in constrained mode to avoid confusion of buttons showing up or not.\r\n * otherwise only show if there is a date selected.\r\n */\r\n const showClearButton = computed(() => {\r\n\r\n if (props.displayConstrained) return true;\r\n else return hasArrivalDate.value;\r\n });\r\n\r\n // wrapper type to convert to/from formatted string to be used in input type=date\r\n const departureDateInput = computed(\r\n {\r\n get: () => { return dateFunctions.toYYYYMMDD(dateFunctions.fromLtDate(departureDate.value)); },\r\n set: val => {\r\n departureDate.value = dateFunctions.parseToLtDate(val.toString());\r\n }\r\n }\r\n );\r\n\r\n\r\n const noDatePreference = () => {\r\n resetDate();\r\n selectionConfirmed();\r\n }\r\n\r\n\r\n\r\n provide('arrivalDateLt', arrivalDate);\r\n provide('departureDateLt', departureDate);\r\n provide('validDepartures', validDepartures);\r\n\r\n\r\n // The current state of the picker in regards to what are we picking \r\n const pickState = computed(() => {\r\n\r\n if (props.readOnly) return ArrivalDepartureState.ReadOnly;\r\n // if (!arrivalDate.value) return ArrivalDepartureState.Arrival;\r\n if (!!arrivalDate.value && !departureDate.value) return ArrivalDepartureState.Departure;\r\n if (hasSelection) return ArrivalDepartureState.ResetArrival;\r\n\r\n // default is always arrival?\r\n return ArrivalDepartureState.Arrival;\r\n });\r\n\r\n const isPickStateArrival = computed(() => pickState.value === ArrivalDepartureState.Arrival || pickState.value === ArrivalDepartureState.ResetArrival);\r\n const isPickStateDeparture = computed(() => pickState.value === ArrivalDepartureState.Departure);\r\n\r\n let isFirstBecameVisible = true;\r\n\r\n const scrollToMonth = (arrivalMonthSelector: HTMLElement) => {\r\n\r\n if (root.value) {\r\n\r\n let pos = 0;\r\n const defaultScrollContainer = root.value.getElementsByClassName(\"adp-months-container\")[0] as HTMLElement;\r\n\r\n pos = (arrivalMonthSelector.offsetLeft - arrivalMonthSelector.scrollLeft + arrivalMonthSelector.clientLeft);\r\n \r\n defaultScrollContainer.scrollTo({\r\n top: 0,\r\n left: pos,\r\n behavior: 'smooth'\r\n }), 100;\r\n\r\n }\r\n };\r\n\r\n const onBecameVisible = async () => {\r\n\r\n\r\n // When calendar becomes visible and arrival date is picked, the calendar scrolls the selected arrival date into view.\r\n \r\n if (root.value) {\r\n\r\n if (arrivalDate.value !== undefined) {\r\n await nextTick();\r\n\r\n // Get the selected arrival date element\r\n const selectedArrivalDateEl = document.querySelector(\".-sa:not(.next)\") as HTMLElement;\r\n\r\n if (selectedArrivalDateEl) {\r\n let arrivalMonthSelector = selectedArrivalDateEl.closest(\".calendar\") as HTMLElement;\r\n\r\n scrollToMonth(arrivalMonthSelector);\r\n\r\n }\r\n // else :we do not scroll at all,.\r\n\r\n }\r\n else if (defaultDate.value !== undefined && isFirstBecameVisible) {\r\n\r\n\r\n await nextTick();\r\n // find the month that is selected.\r\n\r\n const selectedArrivalDateEl = document.querySelector(\"[data-lt='\" + defaultDate.value + \"']:not(.next):not(.prev)\") as HTMLElement;\r\n\r\n\r\n if (selectedArrivalDateEl) {\r\n let arrivalMonthSelector = selectedArrivalDateEl.closest(\".calendar\") as HTMLElement;\r\n\r\n scrollToMonth(arrivalMonthSelector);\r\n\r\n }\r\n }\r\n }\r\n\r\n isFirstBecameVisible = false;\r\n };\r\n\r\n if (props.shouldDetectBecameVisible) {\r\n\r\n // if so, we will watch became visible\r\n watch(() => props.becameVisible, async (newv, oldv) => {\r\n\r\n if (newv === true && !oldv) {\r\n\r\n // call becameVisible\r\n await onBecameVisible();\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n // get availability if we can\r\n\r\n if (props.accommodationId) {\r\n\r\n provide('availability', availability);\r\n availability.data = await fetchAvailability(+props.accommodationId);\r\n\r\n\r\n }\r\n\r\n\r\n // set / create months and days\r\n // defaults to current month and year\r\n const now = new Date();\r\n const end = new Date(now.valueOf());\r\n end.setMonth(now.getMonth() + props.numberOfMonths);\r\n const months = reactive(createData(now.getFullYear(), now.getMonth(), end.getFullYear(), end.getMonth(), availability.data));\r\n\r\n\r\n\r\n\r\n\r\n\r\n // if not read only, we will bind the handler for handling click events on the \r\n // the root element\r\n const onDayClick = (event: Event) => {\r\n\r\n if (pickState.value !== ArrivalDepartureState.ReadOnly && event.target !== null && event.target instanceof HTMLElement) {\r\n\r\n if (event.target.classList.contains('d')) {\r\n\r\n const newDate = (event.target.getAttribute('data-lt'));\r\n if (newDate !== null) {\r\n\r\n // handle selection click, which depends on our state...\r\n if ((pickState.value === ArrivalDepartureState.Arrival || pickState.value === ArrivalDepartureState.ResetArrival) && event.target.classList.contains('-a')) { // -a means valid arrival\r\n\r\n // an arrival has been selected, switch to departure\r\n // or\r\n // a new arrival has been selected, also reset departure, and switch to\r\n // departure selection.\r\n arrivalDate.value = parseInt(newDate);\r\n\r\n // for both states setting this to undefined is valid..\r\n departureDate.value = undefined;\r\n\r\n // in this state, we should probably also update valid departures,\r\n // but we can let that be processed in a watch.\r\n\r\n }\r\n else if (pickState.value === ArrivalDepartureState.Departure && event.target.classList.contains('-d')) {\r\n\r\n // departure selected, auto confirm\r\n departureDate.value = parseInt(newDate);\r\n selectionConfirmed();\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const resetDate = () => {\r\n // If only arrival is selected, clear the selection in this component (because data is not saved yet)\r\n // else the data needs to be reset in the parent component (searchbar)\r\n if (arrivalDate.value && !departureDate.value) {\r\n arrivalDate.value = undefined;\r\n } else {\r\n\r\n context.emit(\"resetDate\", {\r\n arrivalDate: dateFunctions.fromLtDate(arrivalDate.value),\r\n departureDate: dateFunctions.fromLtDate(departureDate.value),\r\n arrivalDateString: arrivalDateInput.value,\r\n departureDateString: departureDateInput.value\r\n } as SelectionConfirmedEvent);\r\n }\r\n };\r\n\r\n\r\n\r\n\r\n\r\n\r\n // watch arrival date change to update departure dates\r\n watch(arrivalDate, (newValue, oldValue) => {\r\n\r\n if (newValue !== unref(oldValue) && newValue !== undefined) { // do we need this check, or does vue do this automatically?\r\n\r\n\r\n // we are in accommodation mode\r\n if (props.accommodationId) {\r\n if (availability.data !== undefined) {\r\n\r\n\r\n // using current arrival date, we should check any valid departure days..\r\n // we do this here to avoid having the 'day' component do this for each date..\r\n const avEntry = availability.data.entries.find((value) => value[0] === newValue);\r\n if (avEntry) {\r\n validDepartures.value = avEntry;\r\n\r\n } else {\r\n validDepartures.value = [];\r\n }\r\n }\r\n }\r\n // else this is the default picker (home, search)\r\n else {\r\n\r\n // the default is to use arrival and add days?\r\n const vd = new Array();\r\n const maxDays = 4 * 7;\r\n for (let i = 1; i <= maxDays; i++) {\r\n vd.push(newValue + i);\r\n }\r\n validDepartures.value = vd;\r\n }\r\n\r\n }\r\n }, {\r\n immediate: true\r\n });\r\n\r\n\r\n return {\r\n\r\n root,\r\n displayMode,\r\n months,\r\n isForAccommodation: props.accommodationId !== undefined,\r\n\r\n arrivalDate,\r\n departureDate,\r\n\r\n // computed\r\n showClearButton,\r\n hasArrivalDate,\r\n hasSelection,\r\n arrivalDateInput,\r\n departureDateInput,\r\n pickState,\r\n isPickStateArrival,\r\n isPickStateDeparture,\r\n\r\n // actions\r\n selectionConfirmed,\r\n onDayClick,\r\n resetDate,\r\n noDatePreference,\r\n arrivalDeparturePicker_Title_ChooseArrDept: appTranslations.arrivalDeparturePicker_Title_ChooseArrDept,\r\n arrivalDeparturePicker_Label_ChooseDeptToContinue: appTranslations.arrivalDeparturePicker_Label_ChooseDeptToContinue,\r\n arrivalDeparturePicker_Btn_NoDatePreference: appTranslations.arrivalDeparturePicker_Btn_NoDatePreference,\r\n arrivalDeparturePicker_Btn_ResetDate: appTranslations.arrivalDeparturePicker_Btn_ResetDate\r\n };\r\n\r\n }\r\n\r\n\r\n\r\n});\r\n\r\n","import { render } from \"./ArrivalDeparturePicker.vue?vue&type=template&id=b71b8e8e\"\nimport script from \"./arrivalDeparturePicker.ts?vue&type=script&lang=js\"\nexport * from \"./arrivalDeparturePicker.ts?vue&type=script&lang=js\"\n\nimport \"./arrivalDeparturePicker.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","\r\n\r\n\r\n","declare let globalLanguage: string;\r\nlet currentLanguage = globalLanguage || \"nl\";\r\n\r\nconst translations = {\r\n\r\n nl: {\"locationPicker_Btn_ChooseLocation\":\"Zelf een locatie kiezen\",\"locationPicker_Btn_ClearAllLocations\":\"Alle \\u0027{landingPageTitle}\\u0027 locaties wissen\",\"locationPicker_Btn_Confirm\":\"Zoeken\",\"locationPicker_Btn_ConfirmAlt\":\"Bevestig\",\"locationPicker_Error_CityCannotBeLoaded\":\"Er is een fout opgetreden. De steden kunnen niet geladen worden. Herlaad de pagina en probeer opnieuw.\",\"locationPicker_Label_ChooseCity\":\"Kies plaats\",\"locationPicker_Label_ChooseCountry\":\"Kies land\",\"locationPicker_Label_ChooseRegion\":\"Kies regio\",\"locationPicker_Label_SearchByPlace\":\"Zoek op plaats in {countryName}\",\"locationPicker_Label_SearchEverywhere\":\"Zoek in heel {countryName}\",\"locationPicker_Label_SearchEverywhereLocationParent\":\"Zoek in heel {locationParentSelectionDisplay}\",\"locationPicker_Label_SearchInAllCountries\":\"Zoek in alle landen\",\"locationPicker_Text_ChooseLocationYourself\":\"Voor deze pagina hebben we de plaatsen voor je uitgekozen. Wil je zelf plaatsen kiezen? Klik dan op de knop\\r\\n \\u0022Alle \\u0027{landingPageTitle}\\u0027 locaties wissen\\u0022. We sturen je dan naar de zoekpagina (je filteropties bewaren we).\",\"locationPicker_Title_Main\":\"Kies een bestemming\",\"locationPicker_Title_SelectLocations\":\"Geselecteerde locatie(s)\"},\r\n en: {\"locationPicker_Btn_ChooseLocation\":\"Choose a location\",\"locationPicker_Btn_ClearAllLocations\":\"Erase all \\u0027{landingPageTitle}\\u0027 locations\",\"locationPicker_Btn_Confirm\":\"Search\",\"locationPicker_Btn_ConfirmAlt\":\"Confirm\",\"locationPicker_Error_CityCannotBeLoaded\":\"An error has occurred. The towns cannot be loaded. Please refresh the page and try again.\",\"locationPicker_Label_ChooseCity\":\"Choose town\",\"locationPicker_Label_ChooseCountry\":\"Choose country\",\"locationPicker_Label_ChooseRegion\":\"Choose region\",\"locationPicker_Label_SearchByPlace\":\"Search by town in {countryName}\",\"locationPicker_Label_SearchEverywhere\":\"Search in {countryName}\",\"locationPicker_Label_SearchEverywhereLocationParent\":\"Search in {locationParentSelectionDisplay}\",\"locationPicker_Label_SearchInAllCountries\":\"Search in all countries\",\"locationPicker_Text_ChooseLocationYourself\":\"For this page we have selected these places for you. Do you want to choose places yourself? Please click on the button\\r\\n\\u0022Erase all \\u0027{landingPageTitle}\\u0027 locations\\u0022. We will send you through to the search page (your filter selection will be preserved).\",\"locationPicker_Title_Main\":\"Choose a destination\",\"locationPicker_Title_SelectLocations\":\"Selected location(s)\"},\r\n de: {\"locationPicker_Btn_ChooseLocation\":\"Selbst einen Standort w\\u00E4hlen\",\"locationPicker_Btn_ClearAllLocations\":\"Alle \\u0027{landingPageTitle}\\u0027 Locations l\\u00F6schen\",\"locationPicker_Btn_Confirm\":\"Suchen\",\"locationPicker_Btn_ConfirmAlt\":\"Best\\u00E4tigen\",\"locationPicker_Error_CityCannotBeLoaded\":\"Es ist ein Fehler aufgetreten. Die St\\u00E4dte k\\u00F6nnen nicht geladen werden. Starten Sie die Seite neu und versuchen Sie es erneut.\",\"locationPicker_Label_ChooseCity\":\"Stadt w\\u00E4hlen\",\"locationPicker_Label_ChooseCountry\":\"Land ausw\\u00E4hlen\",\"locationPicker_Label_ChooseRegion\":\"Region w\\u00E4hlen\",\"locationPicker_Label_SearchByPlace\":\"Suche nach Ort in {countryName}\",\"locationPicker_Label_SearchEverywhere\":\"Suche in ganz {countryName}\",\"locationPicker_Label_SearchEverywhereLocationParent\":\"Suche in {locationParentSelectionDisplay}\",\"locationPicker_Label_SearchInAllCountries\":\"Suche in allen L\\u00E4ndern\",\"locationPicker_Text_ChooseLocationYourself\":\"F\\u00FCr diese Seite haben wir die volgenden Orte f\\u00FCr Sie ausgew\\u00E4hlt. M\\u00F6chten Sie selbst Ihre Orte ausw\\u00E4hlen? Klicken Sie dann \\r\\n \\u0022L\\u00F6schen Sie alle \\u0027{landingPageTitle}\\u0027-Standorte\\u0022. Wir leiten Sie dann auf die Suchseite (wir speichern Ihre Filteroptionen).\",\"locationPicker_Title_Main\":\"W\\u00E4hlen Sie ein Ziel\",\"locationPicker_Title_SelectLocations\":\"Ausgew\\u00E4hlte(r) Standort(e)\"}\r\n};\r\n\r\ninterface appTranslations {\r\n\r\n locationPicker_Btn_ChooseLocation: string; \r\n locationPicker_Btn_ClearAllLocations: string; \r\n locationPicker_Btn_Confirm: string; \r\n locationPicker_Btn_ConfirmAlt: string; \r\n locationPicker_Error_CityCannotBeLoaded: string; \r\n locationPicker_Label_ChooseCity: string; \r\n locationPicker_Label_ChooseCountry: string; \r\n locationPicker_Label_ChooseRegion: string; \r\n locationPicker_Label_SearchByPlace: string; \r\n locationPicker_Label_SearchEverywhere: string; \r\n locationPicker_Label_SearchEverywhereLocationParent: string; \r\n locationPicker_Label_SearchInAllCountries: string; \r\n locationPicker_Text_ChooseLocationYourself: string; \r\n locationPicker_Title_Main: string; \r\n locationPicker_Title_SelectLocations: string; \r\n\r\n}\r\n\r\n//@ts-ignore\r\nlet currentTranslation = (currentLanguage in translations) ? translations[currentLanguage] : translations[\"nl\"];\r\n\r\nexport default currentTranslation as appTranslations;","\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n import { defineComponent, ref, reactive, computed, inject, PropType, Ref } from 'vue';\r\n import LocationEntryTSVM from '@Types/search/LocationEntryTSVM';\r\n import { FilterSelectionLocation, FilterSelectionLocationEntry } from '@Types/FilterSelections';\r\n\r\n\r\n\r\n\r\n export default defineComponent({\r\n\r\n\r\n props: {\r\n\r\n region: {\r\n type: Object as PropType,\r\n required: true\r\n },\r\n },\r\n emit: ['select'],\r\n\r\n setup(props, context) {\r\n\r\n\r\n const filterSelectionLocation = inject(\"filterSelectionLocation\") as Ref;\r\n\r\n\r\n const isSelected = computed(() => {\r\n\r\n if (filterSelectionLocation.value.hasValue()) {\r\n\r\n // should not have city, but region only\r\n if (!filterSelectionLocation.value.selection[0].cityValueId) {\r\n\r\n return filterSelectionLocation.value.selection[0].regionValueId === props.region.id;\r\n }\r\n\r\n }\r\n\r\n return false;\r\n });\r\n\r\n const onSelect = () => {\r\n\r\n context.emit('select', props.region);\r\n };\r\n\r\n\r\n return {\r\n\r\n isSelected,\r\n onSelect,\r\n\r\n region: props.region,\r\n\r\n };\r\n }\r\n\r\n\r\n\r\n });\r\n\r\n\r\n","import { render } from \"./RegionComponent.vue?vue&type=template&id=526fb212\"\nimport script from \"./RegionComponent.vue?vue&type=script&lang=ts\"\nexport * from \"./RegionComponent.vue?vue&type=script&lang=ts\"\n\nimport \"./RegionComponentStyles.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","\r\n\r\n import { defineComponent, ref, reactive, computed, PropType, inject, Ref } from 'vue';\r\n import LocationEntryTSVM from '@Types/search/LocationEntryTSVM';\r\n import { FilterSelectionLocation, FilterSelectionLocationEntry } from '@Types/FilterSelections';\r\n import RegionComponent from './RegionComponent.vue';\r\n\r\n export default defineComponent({\r\n\r\n components: { RegionComponent },\r\n props: {\r\n\r\n country: {\r\n type: Object as PropType,\r\n required: true\r\n },\r\n\r\n isToggled: {\r\n type: Boolean,\r\n required: false\r\n },\r\n },\r\n\r\n emit: ['toggle', 'select', 'selectRegion'],\r\n\r\n setup(props, context) {\r\n\r\n\r\n const filterSelectionLocation = inject(\"filterSelectionLocation\") as Ref;\r\n\r\n const isSelected = computed(() => {\r\n\r\n\r\n if (filterSelectionLocation.value.hasValue()) {\r\n\r\n // should only have country value id\r\n if (!filterSelectionLocation.value.selection[0].cityValueId && !filterSelectionLocation.value.selection[0].regionValueId) {\r\n \r\n return filterSelectionLocation.value.selection[0].countryValueId === props.country.id;\r\n }\r\n\r\n }\r\n\r\n return false;\r\n });\r\n\r\n const onSelect = () => {\r\n\r\n \r\n context.emit('select', props.country);\r\n }\r\n const onSelectRegion = (region: LocationEntryTSVM) => {\r\n\r\n context.emit('selectRegion', props.country, region);\r\n }\r\n const onToggle = () => {\r\n\r\n context.emit('toggle', props.country.id);\r\n }\r\n\r\n return {\r\n\r\n isSelected,\r\n onSelect,\r\n onSelectRegion,\r\n onToggle,\r\n country: props.country,\r\n regions: props.country.subEntries\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n });\r\n\r\n\r\n","import { render } from \"./CountryComponent.vue?vue&type=template&id=2b0aa7c9\"\nimport script from \"./CountryComponent.vue?vue&type=script&lang=ts\"\nexport * from \"./CountryComponent.vue?vue&type=script&lang=ts\"\n\nimport \"./CountryComponentStyles.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","// This file has been generated from LT.Core.LocationFilterSetting\r\nexport enum LocationFilterSetting {\r\n\r\n \r\n Auto = 0,\r\n Prevent = 1,\r\n Clear = 2,\r\n ZoomCountry = 3\r\n\r\n}\r\nexport default LocationFilterSetting;","// This file has been generated from LT.Web.ViewModels.LocationEntryTSVM\r\nimport GeoBoundingBoxTSVM from \"@Types/search/GeoBoundingBoxTSVM\";\r\n\r\nexport default class LocationEntryTSVM {\r\n\r\n id: number;\r\n label: string;\r\n desc: string;\r\n aId: number;\r\n iconUrl: string;\r\n parentOrderWeight?: number;\r\n subEntries: Array;\r\n parentId?: number;\r\n geoBox: GeoBoundingBoxTSVM;\r\n\r\n\r\n\tconstructor(id: number, label: string, desc: string, aId: number, iconUrl: string, geoBox: GeoBoundingBoxTSVM){\r\n\t\r\n this.id = id;\r\n this.label = label;\r\n this.desc = desc;\r\n this.aId = aId;\r\n this.iconUrl = iconUrl;\r\n this.subEntries = new Array();\r\n this.geoBox = geoBox;\r\n\t}\r\n}","import * as searchComposables from '@Composables/SearchComposables';\r\nimport LocationFilterSetting from '@Types/search/LocationFilterSetting';\r\n\r\n\r\nexport enum ClearLocationAction {\r\n\r\n Default = 1,\r\n ResetEntireFilter = 2\r\n}\r\n\r\n\r\nexport function determineClearLocationFilterAction(): ClearLocationAction{\r\n// this function helps to determine what action to take when clearing a location filter.\r\n// this is not straight forward, as it depends on what kind of page we are on. for instance,\r\n// on a landing page this would typically reset the entire filter.\r\n// this filter returns if the actions means to reset the enitre page, or continue with\r\n// the default action.\r\n\r\n if (searchComposables.getSearchMetaDefinitions().locationFilterSetting == LocationFilterSetting.Auto) {\r\n\r\n // for auto the default clear options should be taken.\r\n return ClearLocationAction.Default;\r\n }\r\n\r\n // currently for all the rest, clearing means to remove the entire landing page (or provider page) filter.\r\n // meaning to redirect to the search or map search page.\r\n\r\n return ClearLocationAction.ResetEntireFilter;\r\n\r\n}","import { defineComponent, ref, toRef, reactive, computed, PropType, watch, onMounted, inject, provide, ComputedRef, nextTick, defineProps, defineEmit } from 'vue';\r\n\r\nimport { FilterSelectionLocation, FilterSelectionLocationEntry } from '@Types/FilterSelections';\r\nimport { LocationGroup } from '@Components/LocationPicker/Types/Data';\r\nimport { ActiveFilter } from '@Components/SearchBar/ActiveFilter';\r\nimport appTranslations from \"@Components/LocationPicker/Translations/VueTranslations\";\r\nimport searchTranslations from '@Apps/Search/Translations/VueTranslations';\r\n\r\nimport { fetchLocationData } from '@Composables/LocationHelpers';\r\nimport * as searchComposables from '@Composables/SearchComposables';\r\nimport CountryComponent from './CountryComponent.vue';\r\nimport LocationEntryTSVM from '@Types/search/LocationEntryTSVM';\r\nimport LocationFilterSetting from '@Types/search/LocationFilterSetting';\r\nimport * as locationPickerComposables from './LocationPicker2023ClearLocationComposables';\r\n\r\n\r\nexport default defineComponent({\r\n\r\n components: { CountryComponent },\r\n\r\n props: {\r\n\r\n filterSelectionLocation: {\r\n type: Object as PropType,\r\n required: true\r\n },\r\n\r\n locationNextAsConfirm: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n hideConfirmButton: {\r\n type: Boolean,\r\n required: false\r\n },\r\n // selecting a location will trigger the location confirmed event.\r\n // will not automatically hide the confirm button.\r\n isAutoConfirm: {\r\n type: Boolean,\r\n required: false\r\n },\r\n\r\n // will change the styling of the action buttons to be \"inline\",\r\n // and they will not be sticky (on mobile), and use a smaller display style.\r\n isInlineStyled: {\r\n type: Boolean,\r\n required: false\r\n }\r\n },\r\n\r\n emits: ['locationConfirmed', 'onClearLocationInput', 'onClearLandingPageFilters'],\r\n\r\n //async \r\n setup(props, context) {\r\n\r\n\r\n // static, cached list of countries and regions.\r\n const staticCountries = searchComposables.getSearchMetaDefinitions().countriesWithRegions;\r\n\r\n\r\n // settings specific from the setup / meta definitions.\r\n\r\n // landingpage currenlty not needed for display\r\n //const landingPageId = ref(searchComposables.getSearchMetaDefinitions().landingPageId);\r\n //const isLandingPage = computed(() => landingPageId.value != null && landingPageId.value != \"\");\r\n\r\n \r\n\r\n\r\n // in theory this is set once, on load, but we might in the future want to change this prop\r\n // to prevent map search to be reloaded to clear landing page data.\r\n // so if we 'ref' it, this is already reactive if we implement that change in the future.\r\n\r\n const currentLocationFilterSetting = computed(() => {\r\n\r\n return searchComposables.getSearchMetaDefinitions().locationFilterSetting;\r\n\r\n });\r\n\r\n // current location object with custom name and selection array\r\n const filterSelectionLocation = toRef(props, \"filterSelectionLocation\");\r\n\r\n // provide to children and grand children\r\n provide(\"filterSelectionLocation\", filterSelectionLocation);\r\n\r\n const toggledCountries = ref>(new Set());\r\n\r\n\r\n\r\n\r\n\r\n const onToggleCountry = (countryId: number) => {\r\n\r\n if (toggledCountries.value.has(countryId)) {\r\n toggledCountries.value.delete(countryId);\r\n }\r\n else {\r\n toggledCountries.value.add(countryId);\r\n }\r\n\r\n // Force a re-render by re-assigning the ref's value:\r\n // delete/add do not trigger a reactivy update\r\n\r\n toggledCountries.value = new Set(toggledCountries.value);\r\n };\r\n\r\n const onSelectCountry = (country: LocationEntryTSVM) => {\r\n\r\n clearSelection();\r\n currentSelectedLocation.value.countryName = country.label;\r\n currentSelectedLocation.value.countryValueId = country.id;\r\n currentSelectedLocation.value.countryNoPreference = false;\r\n\r\n if (props.isAutoConfirm) {\r\n locationConfirmed();\r\n }\r\n\r\n };\r\n const onSelectRegion = (country: LocationEntryTSVM, region: LocationEntryTSVM) => {\r\n\r\n clearSelection();\r\n currentSelectedLocation.value.countryName = country.label;\r\n currentSelectedLocation.value.countryValueId = country.id;\r\n currentSelectedLocation.value.countryNoPreference = false;\r\n\r\n currentSelectedLocation.value.regionName = region.label;\r\n currentSelectedLocation.value.regionValueId = region.id;\r\n currentSelectedLocation.value.regionNoPreference = false;\r\n\r\n if (props.isAutoConfirm) {\r\n locationConfirmed();\r\n }\r\n };\r\n\r\n\r\n\r\n\r\n // first item in the location selection array\r\n const currentSelectedLocation = computed(() => {\r\n return filterSelectionLocation.value.selection[0];\r\n });\r\n\r\n const clearSelection = () => {\r\n // clear entire selection and set country selection\r\n filterSelectionLocation.value.selection = new Array();\r\n filterSelectionLocation.value.selection.push(new FilterSelectionLocationEntry());\r\n\r\n };\r\n\r\n\r\n\r\n // depending on the location filter setting, we might need to adjust the visible location selection.\r\n // currently we only support zoom on countries, in that case we filter the countries list automatically.\r\n // and ideally the country would be opened..\r\n\r\n // Case auto => no changes\r\n // Case Zoom country => filter country list, allow region selection, 'alle landen' should clear all filters..\r\n\r\n\r\n\r\n if (currentLocationFilterSetting.value == LocationFilterSetting.ZoomCountry) {\r\n\r\n if (filterSelectionLocation.value.hasValue() && filterSelectionLocation.value.selection[0].countryValueId) {\r\n\r\n\r\n // toggle the coutry to be open on first view.\r\n toggledCountries.value.add(filterSelectionLocation.value.selection[0].countryValueId);\r\n\r\n }\r\n }\r\n\r\n const disableLocationSelections = ref(false);\r\n\r\n if (\r\n currentLocationFilterSetting.value == LocationFilterSetting.Prevent ||\r\n currentLocationFilterSetting.value == LocationFilterSetting.Clear) {\r\n\r\n // in this case we would like to hide all options, and possibly replace by custom contents.\r\n disableLocationSelections.value = true;\r\n }\r\n\r\n\r\n var countries = computed(() => {\r\n\r\n\r\n if (currentLocationFilterSetting.value == LocationFilterSetting.ZoomCountry) {\r\n\r\n if (filterSelectionLocation.value.hasValue() && filterSelectionLocation.value.selection[0].countryValueId) {\r\n // only the selected country, e.g. from landing page,\r\n // should be displayed.\r\n\r\n return staticCountries.filter(c => c.id == filterSelectionLocation.value.selection[0].countryValueId);\r\n\r\n }\r\n }\r\n else if (disableLocationSelections.value) {\r\n\r\n return [];\r\n\r\n }\r\n\r\n\r\n return staticCountries;\r\n });\r\n\r\n\r\n const hideConfirmButton = computed(() => {\r\n\r\n if (props.hideConfirmButton) {\r\n return true;\r\n }\r\n\r\n // if not always hidden, we may still want to hide\r\n // if no selection is allowed. this is mainly to prevent\r\n // confusion for the user that they should 'confirm' / search\r\n // with the current selection.\r\n else return disableLocationSelections.value;\r\n\r\n });\r\n\r\n const locationConfirmed = () => {\r\n\r\n\r\n context.emit('locationConfirmed');\r\n }\r\n\r\n\r\n /**\r\n * Called when the user explicitly sets no preference for country. This button is currently labeled :\"Search in all countries\".\r\n * However this button will behave differently if a certain location filter setting is set.\r\n * */\r\n const onSelectNoPreference = () => {\r\n\r\n\r\n const determinedAction = locationPickerComposables.determineClearLocationFilterAction();\r\n\r\n if (determinedAction == locationPickerComposables.ClearLocationAction.ResetEntireFilter) {\r\n\r\n // this will clear the filter, and reload \r\n clearLandingPageFilters();\r\n return;\r\n }\r\n\r\n\r\n clearSelection();\r\n currentSelectedLocation.value.countryNoPreference = true;\r\n\r\n locationConfirmed();\r\n }\r\n\r\n\r\n // should be used from a simple button to clear the current location\r\n const resetLocationFilter = () => {\r\n context.emit('onClearLocationInput');\r\n }\r\n\r\n\r\n const clearLandingPageFilters = () => {\r\n context.emit('onClearLandingPageFilters');\r\n }\r\n\r\n const hasMultipleLocationSelections = computed(() => {\r\n return filterSelectionLocation.value.selection.length > 1;\r\n });\r\n\r\n /**\r\n * used to determine if the 'confirm' button should be disabled or not,\r\n * a selection can be both 'no country preference', and an actual selection.\r\n */\r\n const hasSelection = computed(() => {\r\n\r\n if (filterSelectionLocation.value.hasValue()) {\r\n\r\n\r\n return filterSelectionLocation.value.selection[0].hasSelection() || filterSelectionLocation.value.selection[0].countryNoPreference;\r\n\r\n }\r\n\r\n return false;\r\n\r\n });\r\n\r\n\r\n\r\n\r\n\r\n const noPreferenceButtonLabel = computed(() => {\r\n\r\n // the label depends on some settings, most notably:\r\n\r\n if (disableLocationSelections.value) {\r\n\r\n return searchTranslations.searchApp_Label_ClearAllFilters;\r\n }\r\n else {\r\n return appTranslations.locationPicker_Label_SearchInAllCountries;\r\n }\r\n });\r\n\r\n const currentReadOnlySelection = computed(() => {\r\n\r\n // get all countries\r\n // then add all regions or cities\r\n\r\n //to the country\r\n\r\n let selection = new Array();\r\n\r\n if (!filterSelectionLocation.value.hasValue()) {\r\n\r\n return selection;\r\n }\r\n\r\n for (let country of filterSelectionLocation.value.selection) {\r\n\r\n // add country (if not set?)\r\n\r\n\r\n var existingCountry = selection.find(s => s.id == country.countryValueId);\r\n\r\n //@ts-ignore for constructor params\r\n var countryVM = existingCountry ?? new LocationEntryTSVM();\r\n\r\n if (!existingCountry) {\r\n selection.push(countryVM);\r\n countryVM.id = country.countryValueId!;\r\n countryVM.subEntries = new Array();\r\n\r\n }\r\n countryVM.label = country.countryName!;\r\n\r\n var sc = staticCountries.find(c => c.id == country.countryValueId);\r\n if (sc) {\r\n countryVM.iconUrl = sc.iconUrl;\r\n }\r\n\r\n // if city is set, then add city, otherwise add region\r\n if (country.cityValueId) {\r\n\r\n \r\n //@ts-ignore for constructor params\r\n let cityVM = new LocationEntryTSVM();\r\n cityVM.label = country.cityName!;\r\n countryVM.subEntries.push(cityVM);\r\n\r\n } else if (country.regionValueId) {\r\n\r\n \r\n //@ts-ignore for constructor params\r\n let regionVM = new LocationEntryTSVM();\r\n regionVM.label = country.regionName!;\r\n countryVM.subEntries.push(regionVM);\r\n }\r\n\r\n }\r\n\r\n return selection;\r\n\r\n });\r\n\r\n return {\r\n\r\n currentLocationFilterSetting,\r\n disableLocationSelections,\r\n currentReadOnlySelection,\r\n\r\n countries,\r\n toggledCountries,\r\n onToggleCountry,\r\n onSelectCountry,\r\n onSelectRegion,\r\n\r\n onSelectNoPreference,\r\n locationConfirmed,\r\n hasSelection,\r\n\r\n hideConfirmButton,\r\n\r\n //locationPicker_Text_ChooseLocationYourself,\r\n //locationPicker_Btn_ClearAllLocations,\r\n //locationPicker_Btn_ChooseLocation: appTranslations.locationPicker_Btn_ChooseLocation,\r\n //locationPicker_Title_SelectLocations: appTranslations.locationPicker_Title_SelectLocations,\r\n //locationPicker_Label_ChooseCountry: appTranslations.locationPicker_Label_ChooseCountry,\r\n //locationPicker_Label_SearchInAllCountries: appTranslations.locationPicker_Label_SearchInAllCountries,\r\n //locationPicker_Label_ChooseRegion: appTranslations.locationPicker_Label_ChooseRegion,\r\n //locationPicker_Label_ChooseCity: appTranslations.locationPicker_Label_ChooseCity,\r\n\r\n //locationPickerLabelSearchByPlace,\r\n //locationPickerLabelSearchEverywhere,\r\n //locationPickerLabelSearchEverywhereLocationParent\r\n\r\n resxTitle: appTranslations.locationPicker_Title_Main,\r\n resxConfirmButton: props.locationNextAsConfirm ? appTranslations.locationPicker_Btn_ConfirmAlt : appTranslations.locationPicker_Btn_Confirm,\r\n noPreferenceButtonLabel,\r\n };\r\n\r\n },\r\n\r\n});\r\n","import { render } from \"./LocationPicker2023.vue?vue&type=template&id=1d76ba8e\"\nimport script from \"./LocationPicker2023.ts?vue&type=script&lang=js\"\nexport * from \"./LocationPicker2023.ts?vue&type=script&lang=js\"\n\nimport \"./styles2023.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","\r\n\r\n\r\n","\r\n\r\n\r\n\r\n","\r\n\r\n import { defineComponent, onMounted, ref } from 'vue';\r\n\r\n export default defineComponent({\r\n\r\n props: {\r\n\r\n modelValue: Number,\r\n label: String,\r\n subLabel: String,\r\n name: String,\r\n max: {\r\n type: Number,\r\n default: 99\r\n\r\n },\r\n min: {\r\n type: Number,\r\n default: 0\r\n\r\n }\r\n },\r\n\r\n emits: [\"update:modelValue\"],\r\n\r\n\r\n setup(props, context) {\r\n\r\n \r\n const getNewValue = (delta: number) => {\r\n\r\n if (props.modelValue == undefined) {\r\n\r\n // if we are going up, return 1, else default to 0;\r\n return Math.max(props.min, delta > 0 ? 1 : 0);\r\n }\r\n else {\r\n\r\n const newVal = props.modelValue + delta;\r\n if (newVal < props.min) return props.min;\r\n if (newVal > props.max) return (props.max);\r\n return newVal;\r\n }\r\n };\r\n\r\n const onAdd = () => {\r\n\r\n context.emit('update:modelValue', getNewValue(1));\r\n }\r\n\r\n const onSubtract = () => {\r\n\r\n context.emit('update:modelValue', getNewValue(-1));\r\n }\r\n\r\n\r\n onMounted(() => {\r\n\r\n const mv = (props.modelValue ?? 0);\r\n\r\n if (mv < props.min) {\r\n context.emit('update:modelValue', props.min);\r\n }\r\n else if (mv > props.max) {\r\n context.emit('update:modelValue', props.max);\r\n }\r\n });\r\n\r\n return {\r\n onAdd,\r\n onSubtract\r\n };\r\n }\r\n\r\n });\r\n\r\n","import { render } from \"./AmountPicker.vue?vue&type=template&id=3925f3bc&scoped=true\"\nimport script from \"./AmountPicker.vue?vue&type=script&lang=ts\"\nexport * from \"./AmountPicker.vue?vue&type=script&lang=ts\"\n\nimport \"./styles.css?vue&type=style&index=0&id=3925f3bc&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-3925f3bc\"\n\nexport default script","declare let globalLanguage: string;\r\nlet currentLanguage = globalLanguage || \"nl\";\r\n\r\nconst translations = {\r\n\r\n nl: {\"companionsPicker_Button_CustomButton\":\"Zoeken\",\"companionsPicker_Label_NumberOfBabies\":\"Babies\",\"companionsPicker_Label_NumberOfPersons\":\"Personen\",\"companionsPicker_Label_NumberOfPets\":\"Huisdieren\",\"companionsPicker_Title_Between_0_2_years\":\"Tussen 0 - 2 jaar\",\"companionsPicker_Title_ChooseCompany\":\"Kies gezelschap\"},\r\n en: {\"companionsPicker_Button_CustomButton\":\"Search\",\"companionsPicker_Label_NumberOfBabies\":\"Babies\",\"companionsPicker_Label_NumberOfPersons\":\"Persons\",\"companionsPicker_Label_NumberOfPets\":\"Pets\",\"companionsPicker_Title_Between_0_2_years\":\"Between 0 - 2 years\",\"companionsPicker_Title_ChooseCompany\":\"Choose company\"},\r\n de: {\"companionsPicker_Button_CustomButton\":\"Suchen\",\"companionsPicker_Label_NumberOfBabies\":\"Babys\",\"companionsPicker_Label_NumberOfPersons\":\"Personen\",\"companionsPicker_Label_NumberOfPets\":\"Haustiere\",\"companionsPicker_Title_Between_0_2_years\":\"Zwischen 0 - 2 Jahren\",\"companionsPicker_Title_ChooseCompany\":\"Reisegruppe ausw\\u00E4hlen\"}\r\n};\r\n\r\ninterface appTranslations {\r\n\r\n companionsPicker_Button_CustomButton: string; \r\n companionsPicker_Label_NumberOfBabies: string; \r\n companionsPicker_Label_NumberOfPersons: string; \r\n companionsPicker_Label_NumberOfPets: string; \r\n companionsPicker_Title_Between_0_2_years: string; \r\n companionsPicker_Title_ChooseCompany: string; \r\n\r\n}\r\n\r\n//@ts-ignore\r\nlet currentTranslation = (currentLanguage in translations) ? translations[currentLanguage] : translations[\"nl\"];\r\n\r\nexport default currentTranslation as appTranslations;","import { defineComponent, ref, reactive, computed, PropType } from 'vue';\r\nimport { FilterSelectionCompanions } from '@Types/FilterSelections';\r\nimport AmountPicker from '@Components/AmountPicker/AmountPicker.vue';\r\n//import { defaultSearchDefinitions } from '@Types/DefaultSearchDefinitions';\r\nimport appTranslations from \"@Components/CompanionsPicker/Translations/VueTranslations\"\r\n\r\nexport default defineComponent({\r\n\r\n components: { AmountPicker },\r\n\r\n props: {\r\n\r\n model: Object as PropType,\r\n\r\n // todo: add prop to determine what guest info should be shown or not\r\n maxPets: {\r\n type: Number,\r\n default: 3\r\n },\r\n maxGuests: {\r\n type: Number,\r\n default: 45 // note this number currently defines the max value used in the vue pickers. and is not dynmamically set from the actual max number currently available.\r\n },\r\n customButtonText: {\r\n type: String,\r\n default: appTranslations.companionsPicker_Button_CustomButton\r\n },\r\n\r\n hideChrome: Boolean,\r\n\r\n // introduced with searchbar 2023,\r\n // the old version had no btn type, and was considered a submit\r\n // btn when in a form, thus automatically submitting the form.\r\n // in 2023, we should trigger a specific submit action and\r\n // perform the logic.\r\n forceNoBtnType: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n\r\n emits: {\r\n\r\n guestsConfirmed: null\r\n },\r\n\r\n setup(props, context) {\r\n\r\n \r\n\r\n const onConfirm = (e: Event) => {\r\n\r\n context.emit(\"guestsConfirmed\");\r\n };\r\n\r\n\r\n\r\n return {\r\n\r\n //defaultSearchDefinitions,\r\n onConfirm,\r\n forceNoBtnType: props.forceNoBtnType,\r\n companionsPicker_Title_ChooseCompany: appTranslations.companionsPicker_Title_ChooseCompany,\r\n companionsPicker_Label_NumberOfBabies: appTranslations.companionsPicker_Label_NumberOfBabies,\r\n companionsPicker_Label_NumberOfPersons: appTranslations.companionsPicker_Label_NumberOfPersons,\r\n companionsPicker_Label_NumberOfPets: appTranslations.companionsPicker_Label_NumberOfPets,\r\n companionsPicker_Title_Between_0_2_years: appTranslations.companionsPicker_Title_Between_0_2_years\r\n\r\n };\r\n\r\n }\r\n\r\n\r\n\r\n});\r\n","import { render } from \"./CompanionsPicker.vue?vue&type=template&id=8a3ab3e2\"\nimport script from \"./companionsPicker.ts?vue&type=script&lang=js\"\nexport * from \"./companionsPicker.ts?vue&type=script&lang=js\"\n\nimport \"./styles.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","import { ref, unref, computed } from \"vue\";\r\nimport { LocationGroup, LocationEntry } from '@Components/LocationPicker/Types/Data';\r\nimport { FilterSelectionLocationEntry } from \"@Types/FilterSelections\";\r\n\r\n/**\r\n * obsolete, these are helpers for the old seperate fetches. in the 2023 version,\r\n * all locations are loaded client side on page load (server side cache)\r\n * @returns\r\n */\r\nexport const fetchLocationData = () => {\r\n\r\n const fetchCountriesEndpoint = \"/Fetch/FetchCountries\";\r\n const fetchRegionsEndpoint = \"/Fetch/FetchRegions?countryId=\";\r\n const fetchCitiesForCountryEndpoint = \"/Fetch/FetchCitiesForCountries?countryId=\";\r\n const fetchCitiesForRegionEndpoint = \"/Fetch/FetchCitiesForRegion?regionId=\";\r\n\r\n\r\n // Variables used for fetch state and errors\r\n const isLoading = ref(false);\r\n const hasLoadError = ref(false);\r\n const errorMessages = ref>([]);\r\n\r\n const fetchedCountryList = ref>([]);\r\n const fetchedRegionList = ref>([]);\r\n const fetchedCityList = ref>([]);\r\n\r\n const fetchCountries = async () => {\r\n\r\n isLoading.value = true;\r\n\r\n fetchedCountryList.value = [];\r\n\r\n const url = new URL(fetchCountriesEndpoint, window.location.href);\r\n \r\n const response = await fetch(url.toString(), {\r\n\r\n method: \"Get\",\r\n headers: { 'Content-Type': 'application/json' },\r\n redirect: \"error\"\r\n\r\n });\r\n\r\n if (response.ok) {\r\n\r\n fetchedCountryList.value = await response.json() as Array;\r\n\r\n } else {\r\n\r\n alert('Something went wrong, please try again');\r\n }\r\n\r\n isLoading.value = false;\r\n }\r\n\r\n const fetchRegions = async (countryId: number) => {\r\n\r\n // reset fetched list\r\n isLoading.value = true;\r\n fetchedRegionList.value = [];\r\n\r\n \r\n const url = new URL(fetchRegionsEndpoint + countryId, window.location.href);\r\n \r\n const response = await fetch(url.toString(), {\r\n\r\n method: \"Get\",\r\n headers: { 'Content-Type': 'application/json' },\r\n redirect: \"error\"\r\n\r\n });\r\n\r\n if (response.ok) {\r\n\r\n fetchedRegionList.value = await response.json() as Array;\r\n\r\n } else {\r\n\r\n alert('Something went wrong, please try again');\r\n }\r\n\r\n isLoading.value = false;\r\n\r\n };\r\n\r\n const fetchCitiesForCountry = async (countryId: number) => {\r\n\r\n // reset fetched list\r\n \r\n isLoading.value = true;\r\n fetchedCityList.value = [];\r\n\r\n\r\n const url = new URL(fetchCitiesForCountryEndpoint + countryId, window.location.href);\r\n\r\n const response = await fetch(url.toString(), {\r\n\r\n method: \"Get\",\r\n headers: { 'Content-Type': 'application/json' },\r\n redirect: \"error\"\r\n\r\n });\r\n\r\n if (response.ok) {\r\n\r\n fetchedCityList.value = await response.json() as Array;\r\n\r\n } else {\r\n\r\n alert('Something went wrong, please try again');\r\n }\r\n isLoading.value = false;\r\n };\r\n\r\n const fetchCitiesForRegion = async (regionId: number) => {\r\n\r\n // reset fetched list\r\n isLoading.value = true;\r\n fetchedCityList.value = [];\r\n\r\n\r\n const url = new URL(fetchCitiesForRegionEndpoint + regionId, window.location.href);\r\n\r\n const response = await fetch(url.toString(), {\r\n\r\n method: \"Get\",\r\n headers: { 'Content-Type': 'application/json' },\r\n redirect: \"error\"\r\n\r\n });\r\n\r\n if (response.ok) {\r\n\r\n fetchedCityList.value = await response.json() as Array;\r\n\r\n } else {\r\n\r\n alert('Something went wrong, please try again');\r\n }\r\n isLoading.value = false;\r\n };\r\n\r\n return {\r\n\r\n fetchCountries,\r\n fetchRegions,\r\n fetchCitiesForCountry,\r\n fetchCitiesForRegion,\r\n\r\n fetchedCountryList,\r\n fetchedRegionList,\r\n fetchedCityList,\r\n\r\n isLoading,\r\n hasLoadError,\r\n errorMessages,\r\n\r\n };\r\n};\r\n\r\nexport function getSelectedLocationName(location: FilterSelectionLocationEntry) {\r\n let countryName = \"\";\r\n let regionName = \"\";\r\n let cityName = \"\";\r\n\r\n\r\n if (location != undefined && location.countryName != undefined) {\r\n countryName = location.countryName;\r\n }\r\n\r\n if (location != undefined && location.regionName != undefined) {\r\n regionName = location.regionName;\r\n }\r\n\r\n if (location != undefined && location.cityName != undefined) {\r\n cityName = location.cityName;\r\n }\r\n return { countryName, regionName, cityName };\r\n \r\n};\r\n\r\n","declare let globalLanguage: string;\r\nlet currentLanguage = globalLanguage || \"nl\";\r\n\r\nconst translations = {\r\n\r\n nl: {\"searchBar__Babies\":\"Babies\",\"searchBar__Baby\":\"Baby\",\"searchBar__Back\":\"Vorige\",\"searchBar__Cancel\":\"Annuleer\",\"searchBar__Close\":\"Sluiten\",\"searchBar__Guest\":\"Persoon\",\"searchBar__Guests\":\"Personen\",\"searchBar__MobileBtn\":\"Zoek \\u0026 boek jouw vakantieverblijf\",\"searchBar__Next\":\"Volgende\",\"searchBar__Pet\":\"Huisdier\",\"searchBar__Pets\":\"Huisdieren\",\"searchBar__Search\":\"Zoeken\",\"searchBar__When\":\"Wanneer\",\"searchBar__When_Long\":\"Kies periode\",\"searchBar__Where\":\"Waarheen\",\"searchBar__Where_Long\":\"Kies land, regio of plaats\",\"searchBar__Who\":\"Met wie\",\"searchBar__Who_Long\":\"Kies gezelschap\",\"searchBar_Btn_AllCountries\":\"Alle landen\",\"searchBar_Btn_AllCountry\":\"Alle landen\",\"searchBar_Btn_ClearDates\":\"Datum wissen\",\"searchBar_Btn_MultipleLocationsSelected\":\"Meerdere locaties geselecteerd\",\"searchBar_LocationPicker_Placeholder\":\"Selecteer stad of land\",\"searchBar_NoPreference\":\"Geen voorkeur\",\"searchBar_Text_MultipleLocations\":\"Meerdere locaties\"},\r\n en: {\"searchBar__Babies\":\"Babies\",\"searchBar__Baby\":\"Baby\",\"searchBar__Back\":\"Previous\",\"searchBar__Cancel\":\"Cancel\",\"searchBar__Close\":\"Close\",\"searchBar__Guest\":\"Person\",\"searchBar__Guests\":\"Persons\",\"searchBar__MobileBtn\":\"Find your vacation rental\",\"searchBar__Next\":\"Next\",\"searchBar__Pet\":\"Pets\",\"searchBar__Pets\":\"Pets\",\"searchBar__Search\":\"Search\",\"searchBar__When\":\"When\",\"searchBar__When_Long\":\"Choose period\",\"searchBar__Where\":\"Where to\",\"searchBar__Where_Long\":\"Choose country, region, or town\",\"searchBar__Who\":\"With whom\",\"searchBar__Who_Long\":\"Choose company\",\"searchBar_Btn_AllCountries\":\"All countries\",\"searchBar_Btn_AllCountry\":\"All countries\",\"searchBar_Btn_ClearDates\":\"Erase date\",\"searchBar_Btn_MultipleLocationsSelected\":\"Multiple locations selected\",\"searchBar_LocationPicker_Placeholder\":\"Select town or country\",\"searchBar_NoPreference\":\"No preference\",\"searchBar_Text_MultipleLocations\":\"Multiple locations\"},\r\n de: {\"searchBar__Babies\":\"Babys\",\"searchBar__Baby\":\"Baby\",\"searchBar__Back\":\"Voherige\",\"searchBar__Cancel\":\"Abbrechen\",\"searchBar__Close\":\"Schlie\\u00DFen\",\"searchBar__Guest\":\"Person\",\"searchBar__Guests\":\"Personen\",\"searchBar__MobileBtn\":\"Suchen Sie Ihre Ferienhaus\",\"searchBar__Next\":\"weiter\",\"searchBar__Pet\":\"Haustier\",\"searchBar__Pets\":\"Haustiere\",\"searchBar__Search\":\"Suchen\",\"searchBar__When\":\"Wann\",\"searchBar__When_Long\":\"Zeitraum ausw\\u00E4hlen\",\"searchBar__Where\":\"Wo\",\"searchBar__Where_Long\":\"Land, Region oder Stadt ausw\\u00E4hlen\",\"searchBar__Who\":\"Mit wem\",\"searchBar__Who_Long\":\"Reisegruppe ausw\\u00E4hlen\",\"searchBar_Btn_AllCountries\":\"Alle L\\u00E4nder\",\"searchBar_Btn_AllCountry\":\"Alle L\\u00E4nder\",\"searchBar_Btn_ClearDates\":\"Datum l\\u00F6schen\",\"searchBar_Btn_MultipleLocationsSelected\":\"Mehrere Standorte ausgew\\u00E4hlt\",\"searchBar_LocationPicker_Placeholder\":\"Stadt oder Land ausw\\u00E4hlen\",\"searchBar_NoPreference\":\"Keine Pr\\u00E4ferenz\",\"searchBar_Text_MultipleLocations\":\"Mehrere Standorte\"}\r\n};\r\n\r\ninterface appTranslations {\r\n\r\n searchBar__Babies: string; \r\n searchBar__Baby: string; \r\n searchBar__Back: string; \r\n searchBar__Cancel: string; \r\n searchBar__Close: string; \r\n searchBar__Guest: string; \r\n searchBar__Guests: string; \r\n searchBar__MobileBtn: string; \r\n searchBar__Next: string; \r\n searchBar__Pet: string; \r\n searchBar__Pets: string; \r\n searchBar__Search: string; \r\n searchBar__When: string; \r\n searchBar__When_Long: string; \r\n searchBar__Where: string; \r\n searchBar__Where_Long: string; \r\n searchBar__Who: string; \r\n searchBar__Who_Long: string; \r\n searchBar_Btn_AllCountries: string; \r\n searchBar_Btn_AllCountry: string; \r\n searchBar_Btn_ClearDates: string; \r\n searchBar_Btn_MultipleLocationsSelected: string; \r\n searchBar_LocationPicker_Placeholder: string; \r\n searchBar_NoPreference: string; \r\n searchBar_Text_MultipleLocations: string; \r\n\r\n}\r\n\r\n//@ts-ignore\r\nlet currentTranslation = (currentLanguage in translations) ? translations[currentLanguage] : translations[\"nl\"];\r\n\r\nexport default currentTranslation as appTranslations;","import { getSelectedLocationName } from '@Composables/LocationHelpers';\r\nimport { FilterModel, FilterParamEntry } from '@Apps/Search/Src/Models/FilterModel';\r\nimport searchBarTranslations from '@Components/SearchBar/Translations/VueTranslations';\r\nimport { displayShortDateNoWeekday } from '@Functions/DateFunctions';\r\nimport * as searchComposables from '@Composables/SearchComposables';\r\nimport LocationFilterSetting from '../Types/search/LocationFilterSetting';\r\nimport { FilterSelectionCompanions, FilterSelectionDate, FilterSelectionLocation } from '../Types/FilterSelections';\r\n\r\n\r\n\r\nexport const getActiveFilterCount = (filter: FilterModel) => {\r\n\r\n\r\n // will count all active filters, including non-default values for guest pickers etc.\r\n // note that a location filter will count as \"1\", as does a date-range filter.\r\n\r\n\r\n let count = 0;\r\n\r\n\r\n // a provider does not have a visible filter currently, but you should be able to clear it.\r\n if (searchComposables.getSearchMetaDefinitions().providerPageId) {\r\n\r\n count++;\r\n }\r\n\r\n\r\n\r\n if (getLocationSelectionDisplay(filter).hasSelection) {\r\n count++;\r\n }\r\n\r\n if (filter.date && filter.date.arrival && filter.date.departure) {\r\n count++;\r\n }\r\n\r\n // non default guests:\r\n if (filter.companions.numberOfAdults != 2 || filter.companions.numberOfPets != 0 || filter.companions.numberOfBabies != 0) {\r\n\r\n count++;\r\n }\r\n\r\n if (filter.accommodationTypes.length) {\r\n count++;\r\n }\r\n\r\n if (filter.bathrooms != 1) {\r\n count++;\r\n }\r\n\r\n if (filter.bedrooms != 1) {\r\n\r\n count++;\r\n }\r\n\r\n count += filter.criteria.reduce((count, criteriaArray) => count + criteriaArray.length, 0);\r\n\r\n\r\n if (count == 0 && searchComposables.getSearchMetaDefinitions().landingPageId) {\r\n\r\n // if none of the filters trigger, then in this case there is still a filter active, because it is a landing page.\r\n // this could happen with the 'hidden' filters that can be matched as hasAnySearch, which are not loaded in the front-end currently.\r\n // if we need to know \"what\" these are, we are going to have to do some more changing..\r\n // for now we just add to the count to let the 'clear filters' button become active\r\n count++;\r\n }\r\n\r\n return count;\r\n}\r\n\r\nexport const getDatesSelectionDisplay = (filter: FilterModel) => {\r\n\r\n return getDatesSelectionDisplayLf(filter.date);\r\n}\r\n\r\n\r\nexport const getDatesSelectionDisplayLf = (filter: FilterSelectionDate) => {\r\n\r\n\r\n let result = {\r\n\r\n hasSelection: false,\r\n displayValue: searchBarTranslations.searchBar__When,\r\n };\r\n\r\n if (!filter || !filter.arrival || !filter.departure) {\r\n\r\n // no results, no Selection.\r\n return result;\r\n }\r\n\r\n result.hasSelection = true;\r\n result.displayValue = displayShortDateNoWeekday(filter.arrival) + \" - \" + displayShortDateNoWeekday(filter.departure);\r\n\r\n return result;\r\n};\r\n\r\n\r\nexport const getLocationSelectionDisplay = (filter: FilterModel) => {\r\n\r\n return getLocationSelectionDisplayLf(filter.location);\r\n}\r\n\r\n// display name in filter\r\nexport const getLocationSelectionDisplayLf = (filterLocation: FilterSelectionLocation) => {\r\n\r\n let result = {\r\n\r\n hasSelection: false,\r\n hasNoPreferenceSelection: false,\r\n hasMultipleSelections: false,\r\n displayValue: searchBarTranslations.searchBar__Where,\r\n };\r\n\r\n if (!filterLocation.selection || filterLocation.selection.length == 0) {\r\n\r\n // no results, no Selection.\r\n //unless it is a predefined filter based on the landing page/providerpage => accommodation selection\r\n\r\n if (searchComposables.getSearchMetaDefinitions()?.locationFilterSetting == LocationFilterSetting.Prevent) {\r\n\r\n result.displayValue = searchComposables.getSearchMetaDefinitions().contentTitle;\r\n result.hasSelection = true;\r\n }\r\n\r\n\r\n return result;\r\n }\r\n\r\n result.hasNoPreferenceSelection = filterLocation.selection.length > 0 && filterLocation.selection[0] && filterLocation.selection[0].countryNoPreference;\r\n\r\n if (result.hasNoPreferenceSelection) {\r\n\r\n result.displayValue = searchBarTranslations.searchBar_Btn_AllCountries;\r\n return result;\r\n }\r\n\r\n if (filterLocation.selection.length == 1) {\r\n\r\n result.hasSelection = true;\r\n var first = getSelectedLocationName(filterLocation.selection[0]);\r\n\r\n if (first.cityName) {\r\n result.displayValue = first.cityName;\r\n\r\n if (first.regionName) {\r\n result.displayValue += ` (${first.regionName})`\r\n }\r\n\r\n else {\r\n result.displayValue += ` (${first.countryName})`\r\n }\r\n }\r\n\r\n else if (first.regionName) {\r\n\r\n result.displayValue = `${first.regionName} (${first.countryName})`;\r\n\r\n } else if (first.countryName) {\r\n\r\n result.displayValue = first.countryName;\r\n }\r\n\r\n }\r\n else {\r\n result.hasSelection = true;\r\n result.hasMultipleSelections = true;\r\n result.displayValue = searchBarTranslations.searchBar_Text_MultipleLocations;\r\n }\r\n\r\n return result;\r\n\r\n\r\n\r\n};\r\n\r\n\r\nexport const getGuestsSelectionDisplay = (filter: FilterModel, hasBeenActive: boolean) => {\r\n\r\n return getGuestsSelectionDisplayLf(filter.companions, hasBeenActive);\r\n}\r\n\r\nexport const getGuestsSelectionDisplayLf = (filter: FilterSelectionCompanions, hasBeenActive: boolean) => {\r\n\r\n let result = {\r\n\r\n hasBeenActive: hasBeenActive,\r\n hasSelection: false,\r\n displayValue: searchBarTranslations.searchBar__Who,\r\n };\r\n\r\n if (!hasBeenActive) {\r\n\r\n // do not show any results \r\n\r\n }\r\n\r\n\r\n else {\r\n\r\n result.hasSelection = true;\r\n const displayValues = [];\r\n if (filter.numberOfAdults == 1) {\r\n\r\n displayValues.push(filter.numberOfAdults + \" \" + searchBarTranslations.searchBar__Guest);\r\n }\r\n if (filter.numberOfAdults > 1) {\r\n\r\n displayValues.push(filter.numberOfAdults + \" \" + searchBarTranslations.searchBar__Guests);\r\n }\r\n if (filter.numberOfBabies == 1) {\r\n\r\n displayValues.push(filter.numberOfBabies + \" \" + searchBarTranslations.searchBar__Baby);\r\n }\r\n if (filter.numberOfBabies > 1) {\r\n\r\n displayValues.push(filter.numberOfBabies + \" \" + searchBarTranslations.searchBar__Babies);\r\n }\r\n if (filter.numberOfPets == 1) {\r\n\r\n displayValues.push(filter.numberOfPets + \" \" + searchBarTranslations.searchBar__Pet);\r\n }\r\n if (filter.numberOfPets > 1) {\r\n\r\n displayValues.push(filter.numberOfPets + \" \" + searchBarTranslations.searchBar__Pets);\r\n\r\n }\r\n\r\n result.displayValue = displayValues.join(\", \");\r\n\r\n }\r\n\r\n\r\n\r\n return result;\r\n\r\n\r\n\r\n};\r\n\r\n\r\n\r\n\r\n","import { defineComponent, ref, reactive, computed, provide, watch, nextTick, toRef, unref, onMounted, PropType, toRefs } from 'vue';\r\nimport { FilterModel } from '@Apps/Search/Src/Models/FilterModel';\r\nimport ArrivalDeparturePicker from '@Components/ArrivalDeparturePicker/ArrivalDeparturePicker.vue';\r\nimport SelectionConfirmedEvent from '@Components/ArrivalDeparturePicker/Types/SelectionConfirmedEvent';\r\nimport LocationPicker2023 from '@Components/LocationPicker2023/LocationPicker2023.vue';\r\nimport CompanionsPicker from '@Components/CompanionsPicker/CompanionsPicker.vue';\r\nimport AmountPicker from '@Components/AmountPicker/AmountPicker.vue';\r\nimport { getLocationSelectionDisplay, getGuestsSelectionDisplay, getDatesSelectionDisplay, getActiveFilterCount } from '@Composables/FilterDisplayComposables';\r\nimport * as searchComposables from '@Composables/SearchComposables';\r\nimport searchBarTranslations from '@Components/SearchBar/Translations/VueTranslations';\r\nimport searchTranslations from '@Apps/Search/Translations/VueTranslations';\r\nimport SearchOrderingOption from '@Types/search/SearchOrderingOption';\r\nimport appTranslations from '@Components/CombinedFilter/Translations/VueTranslations';\r\nimport { FilterSelectionLocationEntry } from '../../Types/FilterSelections';\r\nimport * as locationPickerComposables from '@Components/LocationPicker2023/LocationPicker2023ClearLocationComposables';\r\n\r\nexport default defineComponent({\r\n\r\n components: { ArrivalDeparturePicker, LocationPicker2023, CompanionsPicker, AmountPicker },\r\n\r\n props: {\r\n\r\n filter: {\r\n type: Object as PropType,\r\n required: true\r\n },\r\n\r\n forceHideContentTitle: Boolean,\r\n\r\n totalCount: Number,\r\n\r\n \r\n },\r\n\r\n emits: [\"onChanged\"],\r\n\r\n\r\n setup(props, context) {\r\n\r\n\r\n const root = ref(null);\r\n\r\n\r\n const filter = toRef(props, 'filter');\r\n const filterDefinitions = searchComposables.getFilterDefinitions();\r\n\r\n const landingPageId = ref(searchComposables.getSearchMetaDefinitions().landingPageId);\r\n const providerPageId = ref(searchComposables.getSearchMetaDefinitions().providerPageId);\r\n const isLandingPage = computed(() => landingPageId.value != null && landingPageId.value != \"\");\r\n const isProviderPage = computed(() => providerPageId != undefined);\r\n\r\n\r\n const contentTitle = ref(searchComposables.getSearchMetaDefinitions().contentTitle);\r\n\r\n const showContentTitle = computed(() => {\r\n\r\n return !props.forceHideContentTitle && (isLandingPage.value || isProviderPage.value) && contentTitle.value;\r\n });\r\n\r\n \r\n const showLocationPicker = ref(false);\r\n const showDatesPicker = ref(false);\r\n const showGuestsPicker = ref(false);\r\n\r\n const onLocationClicked = () => {\r\n\r\n showLocationPicker.value = !showLocationPicker.value;\r\n };\r\n const onDatesClicked = () => {\r\n\r\n showDatesPicker.value = !showDatesPicker.value;\r\n };\r\n\r\n const onGuestsClicked = () => {\r\n\r\n showGuestsPicker.value = !showGuestsPicker.value;\r\n };\r\n\r\n //setup date picker\r\n const onDatesSelected = (event: SelectionConfirmedEvent) => {\r\n\r\n filter.value.date.arrival = event.arrivalDateString;\r\n filter.value.date.departure = event.departureDateString;\r\n showDatesPicker.value = false;\r\n };\r\n\r\n const clearDateInput = () => {\r\n\r\n if (filter.value.date) {\r\n filter.value.date.arrival = \"\";\r\n filter.value.date.departure = \"\";\r\n }\r\n };\r\n\r\n const datesSelectionDisplay = computed(() => {\r\n\r\n return getDatesSelectionDisplay(filter.value);\r\n });\r\n\r\n\r\n\r\n\r\n const locationSelectionDisplay = computed(() => {\r\n\r\n return getLocationSelectionDisplay(filter.value);\r\n });\r\n\r\n\r\n const onLocationSelected = () => {\r\n\r\n\r\n showLocationPicker.value = false;\r\n\r\n }\r\n const clearLocationInput = () => {\r\n\r\n const determinedAction = locationPickerComposables.determineClearLocationFilterAction();\r\n\r\n if (determinedAction == locationPickerComposables.ClearLocationAction.ResetEntireFilter) {\r\n\r\n // this will clear the filter, and reload \r\n clearLandingPageFilters();\r\n return;\r\n }\r\n\r\n filter.value.location.selection = new Array();\r\n }\r\n\r\n const clearLandingPageFilters = () => {\r\n\r\n // for now the clear landingpage filters does the same thing as clearFilters, it will\r\n // clear everything.\r\n clearFilters();\r\n }\r\n\r\n const clearFilters = () => {\r\n\r\n searchComposables.clearFiltersAndRedirect();\r\n\r\n\r\n };\r\n\r\n const totalCriteriaCount = computed(() => {\r\n\r\n return getActiveFilterCount(filter.value);\r\n });\r\n\r\n const guestsSelectionDisplay = computed(() => {\r\n\r\n // for now we always show the number of guests with the \"true\" for has been active.\r\n // in the existing searchbar we had a property that was monitored if 'enabled',\r\n // so that on the homepage version we could show 'met wie' on first load, and only\r\n // change to guest counts once the 'popup' was opened for the first time.\r\n // in the current version we do not have a homepage equivalent, so for now\r\n // we will always show 2 persons by default, or the actual selection. \r\n return getGuestsSelectionDisplay(filter.value, true);\r\n });\r\n\r\n\r\n const displaySortingMessage = computed(() =>\r\n\r\n (filter.value.orderBy == \"11\" || filter.value.orderBy == \"12\") && // eslint-disable-line eqeqeq\r\n (!filter.value.date.arrival || !filter.value.date.departure));\r\n\r\n\r\n const criteriaActions = {\r\n\r\n count(index: number) {\r\n\r\n return filter.value.criteria[index].length;\r\n },\r\n\r\n isChecked(index: number, val: number) {\r\n\r\n\r\n return filter.value.criteria[index].indexOf(val) > -1;\r\n\r\n },\r\n\r\n toggle(index: number, val: number) {\r\n\r\n\r\n const valueIndex = filter.value.criteria[index].indexOf(val);\r\n\r\n if (valueIndex > -1) {\r\n\r\n filter.value.criteria[index].splice(valueIndex, 1);\r\n\r\n } else {\r\n\r\n filter.value.criteria[index].push(val);\r\n }\r\n\r\n }\r\n }\r\n\r\n const onFocusArea = (area: string | undefined) => {\r\n\r\n showLocationPicker.value = area == \"location\";\r\n showDatesPicker.value = area == \"dates\";\r\n showGuestsPicker.value = area == \"guests\";\r\n\r\n if (root.value) {\r\n root.value.scrollTop = 0;\r\n }\r\n console.log(\"focus on area: \" + area);\r\n };\r\n\r\n\r\n return {\r\n\r\n // refs\r\n root,\r\n\r\n // event actions external\r\n onFocusArea: onFocusArea,\r\n //--\r\n\r\n def: filterDefinitions,\r\n i18n: searchTranslations,\r\n contentTitle,\r\n showContentTitle,\r\n SearchOrderingOption,\r\n filter,\r\n \r\n \r\n onDatesSelected,\r\n clearDateInput,\r\n\r\n onLocationSelected,\r\n clearLocationInput,\r\n clearLandingPageFilters,\r\n clearFilters,\r\n\r\n showGuestsPicker,\r\n showDatesPicker,\r\n showLocationPicker,\r\n onLocationClicked,\r\n onDatesClicked,\r\n onGuestsClicked,\r\n\r\n datesSelectionDisplay,\r\n locationSelectionDisplay,\r\n guestsSelectionDisplay,\r\n\r\n totalCriteriaCount,\r\n\r\n criteriaActions,\r\n displaySortingMessage,\r\n\r\n resetFilters_Btn_Text: searchTranslations.searchApp_Label_ClearAllFilters,\r\n resetFilters_Btn_NoFilterText: searchTranslations.searchApp_Label_NoFilterText,\r\n };\r\n\r\n\r\n\r\n\r\n }\r\n\r\n});\r\n\r\n","import { render } from \"./CombinedFilterComponent.vue?vue&type=template&id=5a62e6fb\"\nimport script from \"./CombinedFilterComponent.ts?vue&type=script&lang=ts\"\nexport * from \"./CombinedFilterComponent.ts?vue&type=script&lang=ts\"\n\nimport \"./CombinedFilterComponent.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","declare let globalLanguage: string;\r\nlet currentLanguage = globalLanguage || \"nl\";\r\n\r\nconst translations = {\r\n\r\n nl: {\"accDetails_Description\":\"Omschrijving\",\"accDetails_Reviews\":\"Reviews\",\"accDetails_Reviews_OutOf\":\"van de\",\"accDetails_Reviews_ReviewsShown\":\"reviews getoond.\",\"accDetails_ViewDetailsBtn\":\"Bekijk details\",\"closeMap\":\"Kaart sluiten\",\"filter_Confirm\":\"Bevestig\",\"logoUrl\":\"/App_Resources/Images/LTLogoLanguageVariants/Logo_NL_White.svg\",\"no\":\"Nee\",\"rootUrl\":\"/nl/\",\"yes\":\"Ja\"},\r\n en: {\"accDetails_Description\":\"Description\",\"accDetails_Reviews\":\"Reviews\",\"accDetails_Reviews_OutOf\":\"out of\",\"accDetails_Reviews_ReviewsShown\":\"reviews shown.\",\"accDetails_ViewDetailsBtn\":\"View details\",\"closeMap\":\"Close map\",\"filter_Confirm\":\"Confirm\",\"logoUrl\":\"/App_Resources/Images/LTLogoLanguageVariants/Logo_EN_White.svg\",\"no\":\"No\",\"rootUrl\":\"/en/\",\"yes\":\"Yes\"},\r\n de: {\"accDetails_Description\":\"Beschreibung\",\"accDetails_Reviews\":\"Rezensionen\",\"accDetails_Reviews_OutOf\":\"von\",\"accDetails_Reviews_ReviewsShown\":\"Bewertungen angezeigt.\",\"accDetails_ViewDetailsBtn\":\"Details ansehen\",\"closeMap\":\"Karte schlie\\u00DFen\",\"filter_Confirm\":\"Best\\u00E4tigen\",\"logoUrl\":\"/App_Resources/Images/LTLogoLanguageVariants/Logo_DE_White.svg\",\"no\":\"Nein\",\"rootUrl\":\"/de/\",\"yes\":\"Ja\"}\r\n};\r\n\r\ninterface appTranslations {\r\n\r\n accDetails_Description: string; \r\n accDetails_Reviews: string; \r\n accDetails_Reviews_OutOf: string; \r\n accDetails_Reviews_ReviewsShown: string; \r\n accDetails_ViewDetailsBtn: string; \r\n closeMap: string; \r\n filter_Confirm: string; \r\n logoUrl: string; \r\n no: string; \r\n rootUrl: string; \r\n yes: string; \r\n\r\n}\r\n\r\n//@ts-ignore\r\nlet currentTranslation = (currentLanguage in translations) ? translations[currentLanguage] : translations[\"nl\"];\r\n\r\nexport default currentTranslation as appTranslations;","import { defineComponent, ref, reactive, computed, provide, watch, nextTick, toRef, unref, onMounted, PropType, toRefs } from 'vue';\r\nimport { FilterModel } from '@Apps/Search/Src/Models/FilterModel';\r\nimport CombinedFilter from '@Components/CombinedFilter/CombinedFilterComponent.vue';\r\nimport ICombinedFilterComponent from '@Components/CombinedFilter/ICombinedFilterComponent';\r\nimport appTranslations from '@Apps/MapSearch/Translations/VueTranslations';\r\n\r\nexport default defineComponent({\r\n\r\n components: { CombinedFilter },\r\n\r\n props: {\r\n\r\n filter: {\r\n type: Object as PropType,\r\n required: true\r\n },\r\n isVisible: Boolean,\r\n forceHideContentTitle: Boolean,\r\n totalCount: Number\r\n\r\n\r\n },\r\n\r\n emits: [\"onClose\"],\r\n\r\n\r\n setup(props, context) {\r\n\r\n const combinedFilterInstance = ref(null);\r\n const isVisible = toRef(props, 'isVisible');\r\n const filter = toRef(props, 'filter');\r\n const totalCount = toRef(props, 'totalCount');\r\n\r\n const onClose = () => {\r\n\r\n\r\n context.emit(\"onClose\")\r\n };\r\n\r\n\r\n const onFocusArea = (area: string | undefined) => {\r\n\r\n combinedFilterInstance.value?.onFocusArea(area);\r\n };\r\n\r\n\r\n\r\n return {\r\n\r\n // component refs\r\n combinedFilterInstance,\r\n\r\n // event actions external\r\n onFocusArea,\r\n\r\n //--\r\n\r\n onClose,\r\n isVisible,\r\n filter,\r\n totalCount,\r\n forceHideContentTitle: props.forceHideContentTitle || false,\r\n confirmBtn_Label: appTranslations.filter_Confirm\r\n\r\n };\r\n\r\n\r\n\r\n\r\n }\r\n\r\n});\r\n\r\n","import { render } from \"./SearchFilterComponent.vue?vue&type=template&id=52c5c3fe\"\nimport script from \"./SearchFilterComponent.ts?vue&type=script&lang=ts\"\nexport * from \"./SearchFilterComponent.ts?vue&type=script&lang=ts\"\n\nimport \"./SearchFilterComponent.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","\r\n\r\n\r\n\r\n","import { defineComponent, ref, reactive, computed, provide, watch, nextTick, toRef, unref, onMounted, PropType, toRefs } from 'vue';\r\nimport { FilterModel } from '@Apps/Search/Src/Models/FilterModel';\r\nimport { getLocationSelectionDisplay, getGuestsSelectionDisplay, getDatesSelectionDisplay, getActiveFilterCount } from '@Composables/FilterDisplayComposables';\r\n\r\nexport default defineComponent({\r\n\r\n components: {},\r\n\r\n props: {\r\n\r\n filter: {\r\n type: Object as PropType,\r\n required: true\r\n },\r\n\r\n isFilterVisible: Boolean\r\n\r\n },\r\n\r\n emits: [\"onClick\"],\r\n\r\n\r\n setup(props, context) {\r\n\r\n\r\n const filter = toRef(props, 'filter');\r\n\r\n\r\n const onToggleFilter = () => {\r\n\r\n context.emit(\"onClick\")\r\n };\r\n const onLocationClicked = () => {\r\n\r\n context.emit(\"onClick\", \"location\")\r\n };\r\n\r\n\r\n const onDatesClicked = () => {\r\n\r\n context.emit(\"onClick\", \"dates\")\r\n };\r\n\r\n const onGuestsClicked = () => {\r\n\r\n context.emit(\"onClick\", \"guests\")\r\n };\r\n\r\n const datesSelectionDisplay = computed(() => {\r\n\r\n return getDatesSelectionDisplay(filter.value);\r\n });\r\n\r\n const locationSelectionDisplay = computed(() => {\r\n\r\n return getLocationSelectionDisplay(filter.value);\r\n });\r\n\r\n const guestsSelectionDisplay = computed(() => {\r\n\r\n // for now we always show the number of guests with the \"true\" for has been active.\r\n // in the existing searchbar we had a property that was monitored if 'enabled',\r\n // so that on the homepage version we could show 'met wie' on first load, and only\r\n // change to guest counts once the 'popup' was opened for the first time.\r\n // in the current version we do not have a homepage equivalent, so for now\r\n // we will always show 2 persons by default, or the actual selection. \r\n return getGuestsSelectionDisplay(filter.value, true ); \r\n })\r\n\r\n const totalCriteriaCount = computed(() => {\r\n\r\n\r\n return getActiveFilterCount(filter.value); });\r\n\r\n\r\n return {\r\n\r\n filter,\r\n onToggleFilter,\r\n onLocationClicked,\r\n onDatesClicked,\r\n onGuestsClicked,\r\n\r\n \r\n datesSelectionDisplay,\r\n locationSelectionDisplay,\r\n guestsSelectionDisplay,\r\n\r\n totalCriteriaCount,\r\n\r\n };\r\n\r\n\r\n\r\n\r\n }\r\n\r\n});\r\n\r\n","import { render } from \"./SearchFilterBarComponent.vue?vue&type=template&id=019173d9\"\nimport script from \"./SearchFilterBarComponent.ts?vue&type=script&lang=ts\"\nexport * from \"./SearchFilterBarComponent.ts?vue&type=script&lang=ts\"\n\nimport \"./SearchFilterBarComponent.css?vue&type=style&index=0&lang=css\"\nscript.render = render\n\nexport default script","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n import { defineComponent, onMounted, ref, PropType, watch, reactive } from 'vue';\r\n import PagingModel from '@Apps/Search/Src/Models/PagingModel';\r\n import { FilterModel } from '@Apps/Search/Src/Models/FilterModel';\r\n import { toUrl } from '@Apps/Search/Src/Logic/urlConvert';\r\n import appTranslations from \"@Apps/Search/Translations/VueTranslations\"\r\n\r\n interface PageData {\r\n\r\n page: number;\r\n url: string;\r\n showFor3Design: boolean;\r\n }\r\n\r\n export default defineComponent({\r\n\r\n props: {\r\n\r\n paging: {\r\n type: Object as PropType,\r\n required: true\r\n },\r\n\r\n filter: {\r\n type: Object as PropType,\r\n required: true\r\n }\r\n },\r\n\r\n emits: [\"onPage\"],\r\n\r\n setup(props, context) {\r\n\r\n const usePaging = ref(false);\r\n\r\n const prevIndex = ref(0);\r\n const nextIndex = ref(0);\r\n\r\n const btnPreviousText = appTranslations.searchApp_Pagination_Back;\r\n const btnNextText = appTranslations.searchApp_Pagination_Next;\r\n\r\n const createUrlForPage = (page: number) => {\r\n\r\n return '?' + toUrl(props.filter!, props.paging!.clone(page));\r\n };\r\n\r\n const renderPageNumber = (data: PageData) => { return data.page + 1; };\r\n\r\n const renderCssClass = (data: PageData) => {\r\n\r\n\r\n return ((data.page == props.paging?.page) ? \"active\" : \"\") + \" \" + \"btn btn-small-number\" + \" \" + (data.showFor3Design ? \"-with3\" : \" \");\r\n\r\n };\r\n\r\n\r\n\r\n const pagesArray = ref([]);\r\n\r\n let firstPageEntry = reactive({ page: 0, url: \"\", showFor3Design: true });\r\n let lastPageEntry = reactive({ page: -1, url: \"\", showFor3Design: true });\r\n\r\n // note that we currently have a design with max of 3 items\r\n // if we want to have a different version, we need to calculate the has gap\r\n // for that scenario as well because we wont be able to do that in css (dynamically determine where the ... should be shown)\r\n let hasGapBeforeWith3 = ref(false);\r\n let hasGapAfterWith3 = ref(false);\r\n\r\n\r\n const setData = () => {\r\n\r\n usePaging.value = props.paging.hasPaging();\r\n prevIndex.value = props.paging.getPrevious();\r\n nextIndex.value = props.paging.getNext();\r\n\r\n pagesArray.value.length = 0;\r\n\r\n if (usePaging.value) {\r\n\r\n const lastPage = (props.paging.pageCount ?? 0) - 1;\r\n\r\n\r\n firstPageEntry.url = createUrlForPage(0);\r\n\r\n lastPageEntry.page = lastPage;\r\n lastPageEntry.url = createUrlForPage(lastPage);\r\n\r\n\r\n // add any pages in between\r\n // do not add first or last page\r\n // we will try and get a few before and after\r\n\r\n var active = props.paging.page ?? -1;\r\n\r\n\r\n // this determines if we want to show elipsis between the active item and the first and last item\r\n hasGapBeforeWith3.value = active > 1;\r\n hasGapAfterWith3.value = (lastPage - active) > 1;\r\n\r\n // for the with 3 design, we only want to show the first entry before the active entry:\r\n // if the active entry is the last entry\r\n\r\n // for the with 3 design we only want to show the first entry after the active entry:\r\n // if the active entry is the first entry..\r\n\r\n\r\n // render items *before* the current active entry (if there are entries before, and limit to 3)\r\n let counter = 0;\r\n for (let i = active - 1; i > 0; i--) {\r\n\r\n pagesArray.value.unshift({ page: i, url: createUrlForPage(i), showFor3Design: lastPageEntry.page == active && counter === 0 });\r\n\r\n // take at most 3:\r\n if (counter >= 3) break;\r\n counter++;\r\n }\r\n\r\n // render active here if not first or last\r\n if (active !== 0 && active !== lastPage) {\r\n pagesArray.value.push({ page: active, url: createUrlForPage(active), showFor3Design: true });\r\n }\r\n\r\n // render items *after* the current active entry (if there are entries after, and limit to 3)\r\n counter = 0;\r\n for (let i = active + 1; i < lastPage; i++) {\r\n\r\n pagesArray.value.push({ page: i, url: createUrlForPage(i), showFor3Design: firstPageEntry.page == active && counter === 0 });\r\n // take at most 3:\r\n if (counter >= 3) break;\r\n counter++;\r\n }\r\n\r\n\r\n }\r\n else {\r\n // could clear, but does not really matter since there is a v-if on the same property..\r\n }\r\n\r\n };\r\n\r\n setData();\r\n\r\n watch(props.filter, () => {\r\n\r\n setData();\r\n\r\n\r\n },\r\n {\r\n deep: true,\r\n flush: \"post\"\r\n }\r\n )\r\n\r\n watch(props.paging, () => {\r\n\r\n setData();\r\n\r\n\r\n },\r\n {\r\n deep: true,\r\n flush: \"post\"\r\n }\r\n )\r\n\r\n\r\n\r\n const doPage = (page: number) => {\r\n\r\n context.emit(\"onPage\", page);\r\n };\r\n\r\n\r\n\r\n\r\n\r\n return {\r\n usePaging,\r\n prevIndex,\r\n nextIndex,\r\n createUrlForPage,\r\n firstPageEntry,\r\n hasGapBeforeWith3,\r\n pagesArray,\r\n hasGapAfterWith3,\r\n lastPageEntry,\r\n renderPageNumber,\r\n renderCssClass,\r\n doPage,\r\n\r\n btnPreviousText,\r\n btnNextText\r\n };\r\n }\r\n\r\n });\r\n\r\n","import { render } from \"./PagingControl.vue?vue&type=template&id=4ccab902&scoped=true\"\nimport script from \"./PagingControl.vue?vue&type=script&lang=ts\"\nexport * from \"./PagingControl.vue?vue&type=script&lang=ts\"\n\nimport \"./paging_control_styles.css?vue&type=style&index=0&id=4ccab902&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-4ccab902\"\n\nexport default script","import { watch } from \"vue\";\r\nimport { FilterModel } from \"@Apps/Search/Src/Models/FilterModel\";\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport const setupFilterWatch = (filter: FilterModel, action: () => void,\r\n excludeLocation: boolean, locationAction: null | (() => void),\r\n excludeOrderBy: boolean, orderByAction: null | (() => void),\r\n\r\n) => {\r\n\r\n if (!excludeLocation && !excludeOrderBy) {\r\n\r\n watch(filter, () => {\r\n\r\n action();\r\n\r\n }, {\r\n deep: true,\r\n flush: 'post'\r\n });\r\n } else {\r\n\r\n // we have to setup a watch for each property, except excluded versions, \r\n // which get a seperate watch if an action is provided.\r\n\r\n const exclude = [] as Array;\r\n\r\n if (excludeLocation) {\r\n exclude.push('location');\r\n }\r\n if (excludeOrderBy) {\r\n exclude.push('orderBy');\r\n }\r\n\r\n const propertiesToWatch = Object.keys(filter).filter(prop => !exclude.includes(prop))\r\n\r\n for (const prop of propertiesToWatch) {\r\n watch(\r\n () => filter[prop as keyof FilterModel],\r\n (newValue, oldValue) => {\r\n action()\r\n },\r\n { deep: true }\r\n )\r\n }\r\n\r\n if (locationAction != null) {\r\n watch(\r\n () => filter.location,\r\n (newValue, oldValue) => {\r\n if (locationAction) {\r\n locationAction()\r\n }\r\n },\r\n { deep: true }\r\n )\r\n }\r\n\r\n if (orderByAction != null) {\r\n watch(\r\n () => filter.orderBy,\r\n (newValue, oldValue) => {\r\n if (orderByAction) {\r\n orderByAction()\r\n }\r\n },\r\n { deep: true }\r\n )\r\n }\r\n }\r\n\r\n};","\r\n import { reactive, ref, watch, onMounted, computed } from 'vue';\r\n import SearchModel from '@Apps/Search/Src/Models/SearchModel';\r\n import { FilterModel } from '@Apps/Search/Src/Models/FilterModel';\r\n\r\n import * as searchComposables from '@Composables/SearchComposables';\r\n import { toUrl as filterToQuery } from '@Apps/Search/Src/Logic/urlConvert';\r\n import { setupSearchModel } from '@Apps/Search/Src/Logic/setupSearchModel';\r\n import { setupCombinedFilter } from \"@Components/SearchFilter/setupFilterAndBarComposables\"\r\n import { setup as fetchSearchSetup, fetchPage, IFetchSearchResult, createSearchUrl, CreateSearchUrlType } from '@Composables/FetchSearchComposables';\r\n import { addHistoryOnClick } from '@Apps/Search/Src/Logic/historyLogic';\r\n import scrollToTop from '@Apps/Search/Src/Logic/scrollToTop';\r\n\r\n import appTranslations from '@Apps/Search/Translations/VueTranslations';\r\n\r\n\r\n import SearchFilter from '@Components/SearchFilter/SearchFilterComponent.vue';\r\n import SearchFilterBar from '@Components/SearchFilterBar/SearchFilterBarComponent.vue';\r\n import PagingControl from '@Apps/Search/Src/Components/PagingControl.vue';\r\n\r\n import ICombinedFilterComponent from '@Components/CombinedFilter/ICombinedFilterComponent';\r\n import { setupFilterWatch } from '@Apps/MapSearch/Src/Components/MapSearch/Composables/SetupFilterWatchesComposables';\r\n\r\n export default {\r\n\r\n // note that props on an app are not 'default'\r\n // these are created in the main.ts, and are retrieved from all data- attributes\r\n // on the html element that serves as the root for the app.\r\n // all values would be string by default!\r\n props: {\r\n\r\n\r\n },\r\n\r\n components: { SearchFilter, SearchFilterBar, PagingControl },\r\n\r\n\r\n setup(props: any) {\r\n\r\n\r\n // containers for search results (as html, server side rendering)\r\n const searchAppContainer = ref(null);\r\n const searchPageBody = ref(null);\r\n const searchResults = ref(null);\r\n const altResults = ref(null);\r\n\r\n\r\n\r\n const filterInstance = ref(null);\r\n\r\n\r\n let searchModel = reactive(setupSearchModel()) as SearchModel;\r\n\r\n const totalCount = computed(() => searchModel.totalCount);\r\n\r\n\r\n\r\n // do setup for combined filter, note that we need a ref for the component\r\n const { isFilterVisible, onHideFilter, onSearchBarAction } = setupCombinedFilter(filterInstance);\r\n\r\n\r\n // do setup for fetch calls,\r\n // we explicitly state the handling here.\r\n const { stateIsFetching, triggerNewSearch } = fetchSearchSetup(searchModel, (data: IFetchSearchResult) => {\r\n\r\n // convert data to specific implementation for default search\r\n // which will include the content and alt props as html..\r\n const castData = data as any; // todo: specific type here\r\n\r\n if (searchResults.value !== null) {\r\n searchResults.value.innerHTML = castData.content;\r\n }\r\n\r\n if (altResults.value !== null) {\r\n altResults.value.innerHTML = castData.alt;\r\n }\r\n\r\n });\r\n\r\n\r\n // note that we only watch the filter here, not the entire search Model.\r\n setupFilterWatch(searchModel.filter, triggerNewSearch, false, null, false, null);\r\n\r\n\r\n //we watch the is fetching to add class to app container\r\n\r\n watch(stateIsFetching, (newVal, oldVal) => {\r\n\r\n if (searchAppContainer.value !== null) {\r\n\r\n if (newVal) {\r\n searchAppContainer.value.classList.add(\"is-searching\");\r\n } else {\r\n searchAppContainer.value.classList.remove(\"is-searching\");\r\n }\r\n }\r\n\r\n });\r\n\r\n watch(isFilterVisible, (newVal, oldVal) => {\r\n\r\n if (searchPageBody.value !== null) {\r\n\r\n if (newVal) {\r\n searchPageBody.value.classList.add(\"is-filter-visible\");\r\n } else {\r\n searchPageBody.value.classList.remove(\"is-filter-visible\");\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n const pageTo = (page: number) => {\r\n\r\n fetchPage(page);\r\n scrollToTop(true);\r\n\r\n };\r\n\r\n const clearLandingPageFilters = () => {\r\n\r\n\r\n // for now we do a clear all\r\n searchComposables.clearFiltersAndRedirect();\r\n\r\n };\r\n\r\n\r\n const onShowMapClicked = () => {\r\n\r\n const search = filterToQuery(searchModel.filter);\r\n\r\n // note that this creates the complete url,\r\n // including any landing pages or provider pages.\r\n // as used in 'paging' and\r\n const url = createSearchUrl(search, CreateSearchUrlType.switch, false);\r\n\r\n window.location.assign(url);\r\n }\r\n\r\n\r\n\r\n onMounted(() => {\r\n\r\n // workaround because the elements are not in vue, but rendered server side (so cannot teleport).\r\n\r\n // todo: validate correct element ids\r\n\r\n searchAppContainer.value = document.getElementById(\"search-app-container\");\r\n searchPageBody.value = document.getElementsByTagName('body')[0];\r\n searchResults.value = document.getElementById(\"results-container\");\r\n altResults.value = document.getElementById(\"alternatives-container\");\r\n\r\n // todo: test is this works!\r\n\r\n addHistoryOnClick(searchResults.value!, searchModel.filter, searchComposables.clearFiltersAndRedirect);\r\n\r\n\r\n\r\n });\r\n\r\n return {\r\n filterInstance,\r\n\r\n onShowMapClicked,\r\n searchModel,\r\n totalCount,\r\n\r\n stateIsFetching,\r\n scrollToTop,\r\n pageTo,\r\n clearLandingPageFilters,\r\n\r\n isFilterVisible, onHideFilter, onSearchBarAction,\r\n\r\n\r\n resx: appTranslations\r\n\r\n }\r\n }\r\n\r\n };\r\n\r\n\r\n\r\n","import { render } from \"./Search2023App.vue?vue&type=template&id=839e8ea4\"\nimport script from \"./Search2023App.vue?vue&type=script&lang=ts\"\nexport * from \"./Search2023App.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","import { createApp } from 'vue'\r\nimport App from './Src/Search2023App.vue'\r\n\r\n\r\n\r\nconst id = '#search2023App';\r\nconst dataset = (document.querySelector(id) as HTMLElement).dataset;\r\n// convert all data- attributes on root element to a dataset, and pass that as props to the root app.\r\n// note that the
is replaced with the template, therefore we \r\n// get any data attributes before hand. NOTE: if your prop is called abc, then use data-abc=\"\" on the element!\r\nconst app = createApp(App, { ...dataset });\r\napp.mount(id);\r\n\r\n"],"sourceRoot":""}