{"version":3,"file":"js/app-legacy.75494cd8.js","mappings":"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","sources":["webpack://eighty-days-client/./src/App.vue","webpack://eighty-days-client/./src/App.vue?30d2","webpack://eighty-days-client/./src/views/Home.vue?cbac","webpack://eighty-days-client/./src/components/leaflet/LeafletMap.vue?cd0b","webpack://eighty-days-client/./src/services/map-service/basic-osm-tiles.service.ts","webpack://eighty-days-client/./src/services/map-service/map-tile.interface.ts","webpack://eighty-days-client/./src/services/map-service/location-search/location-search.interface.ts","webpack://eighty-days-client/./src/services/user-management/user-info.interface.ts","webpack://eighty-days-client/./src/services/user-management/basic-user-info.service.ts","webpack://eighty-days-client/./src/services/trips/trip-service.interface.ts","webpack://eighty-days-client/./src/services/trips/trip.ts","webpack://eighty-days-client/./src/services/trips/basic-trip.service.ts","webpack://eighty-days-client/./src/services/map-service/points/point-set.interface.ts","webpack://eighty-days-client/./src/services/map-service/points/array-point-set.service.ts","webpack://eighty-days-client/./src/services/map-service/display-info/map-display-info.interface.ts","webpack://eighty-days-client/./src/services/map-service/display-info/openlayers-map-display-info.service.ts","webpack://eighty-days-client/./src/services/trips/trip-icon-set.interface.ts","webpack://eighty-days-client/./src/services/trips/fontawesome-icon-set.service.ts","webpack://eighty-days-client/./src/services/map-service/routing/direction-router.interface.ts","webpack://eighty-days-client/./src/services/trips/trip-textualizer.interface.ts","webpack://eighty-days-client/./src/services/map-service/points/computed-polylines.interface.ts","webpack://eighty-days-client/./src/services/map-service/points/array-polylines.service.ts","webpack://eighty-days-client/./src/services/map-service/map-vector-json.interface.ts","webpack://eighty-days-client/./src/services/map-service/local-openmaptiles.service.ts","webpack://eighty-days-client/./src/services/map-service/location-search/photon-search.service.ts","webpack://eighty-days-client/./src/services/logging/console-logger.service.ts","webpack://eighty-days-client/./src/services/logging/logger.interface.ts","webpack://eighty-days-client/./src/services/map-service/routing/route-type.ts","webpack://eighty-days-client/./src/services/map-service/routing/routing-result-cache.ts","webpack://eighty-days-client/./src/utils/logger.ts","webpack://eighty-days-client/./src/services/map-service/routing/backend-router.service.ts","webpack://eighty-days-client/./src/services/timezone/timezone-lookup.interface.ts","webpack://eighty-days-client/./src/services/timezone/server-tz-lookup.service.ts","webpack://eighty-days-client/./src/services/focus/global-click-tracker.interface.ts","webpack://eighty-days-client/./src/services/focus/document-click-tracker.service.ts","webpack://eighty-days-client/./src/services/map-service/geoapify-tiles.service.ts","webpack://eighty-days-client/./src/di.ts","webpack://eighty-days-client/./src/map-display.ts","webpack://eighty-days-client/./src/parts/PointSetCollapse.ts","webpack://eighty-days-client/./src/icon-styling.ts","webpack://eighty-days-client/./src/parts/PolylineFinder.ts","webpack://eighty-days-client/./src/services/map-service/display-info/leaflet-map-display-info.service.ts","webpack://eighty-days-client/./src/components/leaflet/MapMarker.vue?1a6c","webpack://eighty-days-client/./src/components/leaflet/MapMarker.vue","webpack://eighty-days-client/./src/components/leaflet/MapPolyline.vue?a917","webpack://eighty-days-client/./src/components/leaflet/MapPolyline.vue","webpack://eighty-days-client/./src/components/leaflet/LeafletMap.vue?750a","webpack://eighty-days-client/./src/components/leaflet/LeafletMap.vue","webpack://eighty-days-client/./src/components/openlayers/OpenLayersMap.vue?697a","webpack://eighty-days-client/./src/olms-shim.js","webpack://eighty-days-client/./src/components/openlayers/OpenLayerMarker.vue?6212","webpack://eighty-days-client/./src/components/utils/BounceAnimation.vue?685d","webpack://eighty-days-client/./src/components/utils/BounceAnimation.vue?68db","webpack://eighty-days-client/./src/components/utils/BounceAnimation.vue","webpack://eighty-days-client/./src/components/openlayers/OpenLayerMarker.vue?1b45","webpack://eighty-days-client/./src/components/openlayers/OpenLayerMarker.vue","webpack://eighty-days-client/./src/components/openlayers/OpenLayerPolyline.vue?289f","webpack://eighty-days-client/./src/components/openlayers/OpenLayerPolyline.vue","webpack://eighty-days-client/./src/components/openlayers/OpenLayersMap.vue?70a9","webpack://eighty-days-client/./src/components/openlayers/OpenLayersMap.vue","webpack://eighty-days-client/./src/components/Hud.vue?6314","webpack://eighty-days-client/./src/components/Hud.vue?9a82","webpack://eighty-days-client/./src/components/Hud.vue","webpack://eighty-days-client/./src/components/UserManagement.vue?a756","webpack://eighty-days-client/./src/components/UserManagement.vue?ba78","webpack://eighty-days-client/./src/components/UserManagement.vue","webpack://eighty-days-client/./src/views/Home.vue?e12a","webpack://eighty-days-client/./src/views/Home.vue","webpack://eighty-days-client/./src/views/TripDetailView.vue?76a8","webpack://eighty-days-client/./src/components/trip-view/TripViewer.vue?2890","webpack://eighty-days-client/./src/parts/ManagedPointDisplay.ts","webpack://eighty-days-client/./src/utils/normalized.ts","webpack://eighty-days-client/./src/components/trip-view/city-modal/CityModalContent.vue?2b30","webpack://eighty-days-client/./src/components/utils/inputs/EditableTitle.vue?14be","webpack://eighty-days-client/./src/components/utils/inputs/EditableTitle.vue?460c","webpack://eighty-days-client/./src/components/utils/inputs/EditableTitle.vue","webpack://eighty-days-client/./src/components/trip-view/CityNightCount.vue?d9d9","webpack://eighty-days-client/./src/components/utils/InlineDuration.vue?1d37","webpack://eighty-days-client/./src/components/utils/EdPopup.vue?1939","webpack://eighty-days-client/./src/components/utils/EdPopup.vue?be28","webpack://eighty-days-client/./src/components/utils/EdPopup.vue","webpack://eighty-days-client/./src/components/utils/InlineDuration.vue?75b2","webpack://eighty-days-client/./src/components/utils/InlineDuration.vue","webpack://eighty-days-client/./src/components/trip-view/CityNightCount.vue?fe11","webpack://eighty-days-client/./src/components/trip-view/CityNightCount.vue","webpack://eighty-days-client/./src/components/utils/CostDisplay.vue?e221","webpack://eighty-days-client/./src/components/utils/CostDisplay.vue?b4d3","webpack://eighty-days-client/./src/components/utils/CostDisplay.vue","webpack://eighty-days-client/./src/utils/Debouncer.ts","webpack://eighty-days-client/./src/parts/TotalCityCostCalculator.ts","webpack://eighty-days-client/./src/components/trip-view/city-modal/CityModalContent.vue?f8aa","webpack://eighty-days-client/./src/components/trip-view/city-modal/CityModalContent.vue","webpack://eighty-days-client/./src/components/trip-view/TripCityViewer.vue?7b74","webpack://eighty-days-client/./src/parts/city/city-compute.ts","webpack://eighty-days-client/./src/components/utils/PointList.vue?cb29","webpack://eighty-days-client/./src/components/search/HiddenFinder.vue?3c36","webpack://eighty-days-client/./src/components/search/LocationFinder.vue?76f5","webpack://eighty-days-client/./src/parts/LocationSearchComponent.ts","webpack://eighty-days-client/./src/parts/ResultDisplayManager.ts","webpack://eighty-days-client/./src/components/search/LocationFinder.vue?ca99","webpack://eighty-days-client/./src/components/search/LocationFinder.vue","webpack://eighty-days-client/./src/components/search/HiddenFinder.vue?69fc","webpack://eighty-days-client/./src/components/search/HiddenFinder.vue","webpack://eighty-days-client/./src/components/utils/PointListItem.vue?75ab","webpack://eighty-days-client/./src/components/utils/modals/FaIconModalTrigger.vue?c035","webpack://eighty-days-client/./src/parts/ModalControl.ts","webpack://eighty-days-client/./src/components/utils/modals/EdModal.vue?960d","webpack://eighty-days-client/./src/components/utils/modals/EdModal.vue?9911","webpack://eighty-days-client/./src/components/utils/modals/EdModal.vue","webpack://eighty-days-client/./src/components/utils/modals/FaIconModalTrigger.vue?cab8","webpack://eighty-days-client/./src/components/utils/modals/FaIconModalTrigger.vue","webpack://eighty-days-client/./src/components/utils/PointListItem.vue?2d75","webpack://eighty-days-client/./src/components/utils/PointListItem.vue","webpack://eighty-days-client/./src/utils/misc-styles.ts","webpack://eighty-days-client/./src/components/utils/PointList.vue?5199","webpack://eighty-days-client/./src/components/utils/PointList.vue","webpack://eighty-days-client/./src/components/trip-view/CityPointTime.vue?7413","webpack://eighty-days-client/./src/utils/time-fmt.ts","webpack://eighty-days-client/./src/components/trip-view/CityPointTime.vue?3e2c","webpack://eighty-days-client/./src/components/trip-view/CityPointTime.vue","webpack://eighty-days-client/./src/components/trip-view/point-modal/PointModalContent.vue?f9d4","webpack://eighty-days-client/./src/components/trip-view/CityPointConfig.vue?77a0","webpack://eighty-days-client/./src/components/trip-view/CityPointConfig.vue?9d31","webpack://eighty-days-client/./src/components/trip-view/CityPointConfig.vue","webpack://eighty-days-client/./src/components/trip-view/point-modal/PointModalContent.vue?b1b7","webpack://eighty-days-client/./src/components/trip-view/point-modal/PointModalContent.vue","webpack://eighty-days-client/./src/components/trip-view/point-modal/OvernightModalContent.vue?1943","webpack://eighty-days-client/./src/parts/SettableProps.ts","webpack://eighty-days-client/./src/components/trip-view/point-modal/OvernightModalContent.vue?83af","webpack://eighty-days-client/./src/components/trip-view/point-modal/OvernightModalContent.vue","webpack://eighty-days-client/./src/components/trip-view/PointTravelInfo.vue?db8e","webpack://eighty-days-client/./src/components/trip-view/LegInfoDisplay.vue?8e29","webpack://eighty-days-client/./src/parts/hour-minute-string.ts","webpack://eighty-days-client/./src/components/trip-view/LegInfoDisplay.vue?2202","webpack://eighty-days-client/./src/components/trip-view/LegInfoDisplay.vue","webpack://eighty-days-client/./src/components/trip-view/PointTravelInfo.vue?3e94","webpack://eighty-days-client/./src/components/trip-view/PointTravelInfo.vue","webpack://eighty-days-client/./src/components/utils/modals/ModalTrigger.vue?a3fb","webpack://eighty-days-client/./src/components/utils/modals/ModalTrigger.vue?eb5f","webpack://eighty-days-client/./src/components/utils/modals/ModalTrigger.vue","webpack://eighty-days-client/./src/utils/city-overnight-class-utils.ts","webpack://eighty-days-client/./src/parts/ManagedComputedPoly.ts","webpack://eighty-days-client/./src/parts/city/one-city-map-display.ts","webpack://eighty-days-client/./src/utils/async-ref.ts","webpack://eighty-days-client/./src/parts/city/city-router.ts","webpack://eighty-days-client/./src/parts/city/day-listing.ts","webpack://eighty-days-client/./src/parts/city/point-times.ts","webpack://eighty-days-client/./src/parts/injection-keys.ts","webpack://eighty-days-client/./src/components/trip-view/TripCityViewer.vue?17f9","webpack://eighty-days-client/./src/components/trip-view/TripCityViewer.vue","webpack://eighty-days-client/./src/components/option-config/TripOptionConfig.vue?4485","webpack://eighty-days-client/./src/components/option-config/TripOptionConfig.vue?20ea","webpack://eighty-days-client/./src/components/option-config/TripOptionConfig.vue","webpack://eighty-days-client/./src/components/option-config/DisplayOptionConfig.vue?b769","webpack://eighty-days-client/./src/components/option-config/DisplayOptionConfig.vue?3122","webpack://eighty-days-client/./src/components/option-config/DisplayOptionConfig.vue","webpack://eighty-days-client/./src/parts/DisplayOptions.ts","webpack://eighty-days-client/./src/parts/night-counter.ts","webpack://eighty-days-client/./src/parts/city/city-start-dates.ts","webpack://eighty-days-client/./src/components/trip-view/TripViewer.vue?18bc","webpack://eighty-days-client/./src/components/trip-view/TripViewer.vue","webpack://eighty-days-client/./src/views/TripDetailView.vue?1f01","webpack://eighty-days-client/./src/views/TripDetailView.vue","webpack://eighty-days-client/./src/components/TripSelector.vue?80f6","webpack://eighty-days-client/./src/components/TripCreator.vue?b061","webpack://eighty-days-client/./src/components/TripCreator.vue?40be","webpack://eighty-days-client/./src/components/TripCreator.vue","webpack://eighty-days-client/./src/components/TripSelector.vue?f1b3","webpack://eighty-days-client/./src/components/TripSelector.vue","webpack://eighty-days-client/./src/router/index.ts","webpack://eighty-days-client/./src/main.ts","webpack://eighty-days-client/webpack/bootstrap","webpack://eighty-days-client/webpack/runtime/chunk loaded","webpack://eighty-days-client/webpack/runtime/compat get default export","webpack://eighty-days-client/webpack/runtime/define property getters","webpack://eighty-days-client/webpack/runtime/ensure chunk","webpack://eighty-days-client/webpack/runtime/get javascript chunk filename","webpack://eighty-days-client/webpack/runtime/get mini-css chunk filename","webpack://eighty-days-client/webpack/runtime/global","webpack://eighty-days-client/webpack/runtime/hasOwnProperty shorthand","webpack://eighty-days-client/webpack/runtime/load script","webpack://eighty-days-client/webpack/runtime/make namespace object","webpack://eighty-days-client/webpack/runtime/publicPath","webpack://eighty-days-client/webpack/runtime/jsonp chunk loading","webpack://eighty-days-client/webpack/startup"],"sourcesContent":["\n","import { render } from \"./App.vue?vue&type=template&id=43f8a59e\"\nconst script = {}\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, createVNode as _createVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-7bcd06b4\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"d-flex align-items-stretch h-100\" }\nconst _hoisted_2 = {\n key: 2,\n class: \"h-100 w-100 d-flex flex-column align-items-center\"\n}\nconst _hoisted_3 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { class: \"m-auto d-flex flex-column align-items-center\" }, [\n /*#__PURE__*/_createElementVNode(\"img\", {\n class: \"big-logo\",\n src: \"favicon.svg\",\n alt: \"Eighty Days Logo\"\n }),\n /*#__PURE__*/_createElementVNode(\"h1\", { class: \"mt-2\" }, \"Eighty Days\"),\n /*#__PURE__*/_createElementVNode(\"div\", { class: \"subtitle faded\" }, \"Please Log In\")\n], -1))\nconst _hoisted_4 = [\n _hoisted_3\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_hud = _resolveComponent(\"hud\")!\n const _component_open_layers_map = _resolveComponent(\"open-layers-map\")!\n const _component_user_management = _resolveComponent(\"user-management\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.haveUser)\n ? (_openBlock(), _createBlock(_component_hud, { key: 0 }))\n : _createCommentVNode(\"\", true),\n (_ctx.haveUser)\n ? (_openBlock(), _createBlock(_component_open_layers_map, { key: 1 }))\n : _createCommentVNode(\"\", true),\n (!_ctx.haveUser)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _hoisted_4))\n : _createCommentVNode(\"\", true),\n _createVNode(_component_user_management, { class: \"user-manager-bubble\" })\n ]))\n}","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, mergeProps as _mergeProps, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n class: \"ed-map\",\n id: \"leaflet-map\",\n tabindex: \"-1\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_map_marker = _resolveComponent(\"map-marker\")!\n const _component_map_polyline = _resolveComponent(\"map-polyline\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.map)\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList(_ctx.markerPoints, (marker) => {\n return (_openBlock(), _createBlock(_component_map_marker, _mergeProps(marker, { map: _ctx.map }), null, 16, [\"map\"]))\n }), 256))\n : _createCommentVNode(\"\", true),\n (_ctx.map)\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 1 }, _renderList(_ctx.polylines, (line) => {\n return (_openBlock(), _createBlock(_component_map_polyline, _mergeProps(line, { map: _ctx.map }), null, 16, [\"map\"]))\n }), 256))\n : _createCommentVNode(\"\", true)\n ]))\n}","import { injectable } from 'inversify';\nimport { MapTileService } from './map-tile.interface';\n\n@injectable()\nexport class BasicOsmTileService implements MapTileService {\n buildLeafletTileUrl(): string {\n return 'https://{s}.tile.osm.org/{z}/{x}/{y}.png';\n }\n buildOptions(): Record {\n return {\n attribution:\n '© OpenStreetMap contributors',\n };\n }\n}\n","export const MapTileService = Symbol('MapTileService');\nexport interface MapTileService {\n buildLeafletTileUrl(): string;\n buildOptions(): Record;\n}\n","import { LocationEngineInfo } from './engine-info';\nimport { LocationSearchRequest } from './search-request';\nimport { SearchResult } from './search-result';\n\nexport const LocationSearchService = Symbol('LocationSearchService');\nexport interface LocationSearchService {\n getEngineSpecification(): LocationEngineInfo;\n doLocationSearch(search: LocationSearchRequest): Promise;\n}\n","import { DeepReadonly, Ref } from 'vue';\n\nexport interface UserInfo {\n username: string;\n}\n\nexport const UserInfoService = Symbol('UserInfoService');\n\nexport interface UserInfoService {\n getCurrentUser(): DeepReadonly>;\n /**\n * Waits for initial user info loading to complete\n */\n waitForLoad(): Promise;\n /*\n * Refresh the current user. If the request fails due to a network issue, this\n * will keep the existing user info, otherwise it will be updated.\n */\n refreshCurrentUser(): Promise;\n doLogin(username: string, password: string): Promise;\n doLogout(): Promise;\n doSignup(username: string, password: string): Promise;\n userManagementErrorMessage?: Ref;\n}\n","import axios, { AxiosError } from 'axios';\nimport { injectable } from 'inversify';\nimport { readonly, ref, Ref } from 'vue';\nimport { UserInfo, UserInfoService } from './user-info.interface';\n\n//TODO cache user info\n@injectable()\nexport class BasicUserInfoService implements UserInfoService {\n private readonly userRef: Ref = ref(null);\n private loader: Promise | null;\n userManagementErrorMessage: Ref = ref(null);\n constructor() {\n this.loader = this.refreshCurrentUser();\n this.loader.finally(() => {\n this.loader = null;\n });\n }\n private setErrorMessage(err: AxiosError) {\n if (err && err.response?.data?.message) {\n this.userManagementErrorMessage.value = err.response.data.message;\n } else {\n this.userManagementErrorMessage.value = 'Could not reach the server.';\n }\n }\n async waitForLoad(): Promise {\n if (this.loader) {\n await this.loader;\n }\n }\n getCurrentUser(): Ref {\n return readonly(this.userRef);\n }\n async refreshCurrentUser(): Promise {\n try {\n const result = await axios.get('/user/me');\n this.userRef.value = result.data;\n return result.data;\n } catch (e) {\n const axiosErr = e as AxiosError;\n if (axiosErr.response) this.userRef.value = null;\n return this.userRef.value;\n }\n }\n async doLogin(username: string, password: string): Promise {\n if (username.length === 0 || password.length === 0) {\n this.userManagementErrorMessage.value =\n 'Username and password are required.';\n return null;\n }\n try {\n const result = await axios.post('/user/login', {\n username,\n password,\n });\n this.userRef.value = result.data;\n this.userManagementErrorMessage.value = null;\n return result.data;\n } catch (e) {\n this.setErrorMessage(e as AxiosError);\n return null;\n }\n }\n\n async doLogout(): Promise {\n try {\n await axios.post('/user/logout');\n this.userRef.value = null;\n return true;\n } catch (e) {\n return false;\n }\n }\n async doSignup(username: string, password: string): Promise {\n if (username.length === 0 || password.length === 0) {\n this.userManagementErrorMessage.value =\n 'Username and password are required.';\n return false;\n }\n try {\n const result = await axios.post('/user/signup', {\n username,\n password,\n });\n this.userManagementErrorMessage.value = null;\n return !!result.data.username;\n } catch (e) {\n this.setErrorMessage(e as AxiosError);\n return false;\n }\n }\n}\n","import { SearchResult } from '@/services/map-service/location-search/search-result';\nimport { Trip, TripCity, TripCityPoint, TripDetail } from './trip';\n\nexport const TripApiService = Symbol('TripApiService');\n\nexport enum TripDetailError {\n // This may also mean the trip was not authorized, but the server doesn't\n // actually tell us which one it is\n NOT_FOUND,\n UNKNOWN,\n}\nexport interface TripApiService {\n getCurrentUserTrips(): Promise;\n getTripDetail(tripId: string): Promise;\n updateTrip(trip: TripDetail): Promise;\n newTrip(tripName: string): Promise;\n createCityFromSearch(result: SearchResult): TripCity;\n createPointFromSearch(result: SearchResult): TripCityPoint;\n // deleteTrip(trip: Trip): Promise\n}\n","import { DateTime } from 'luxon';\nimport { RouteType } from '../map-service/routing/route-type';\n\nexport interface Trip {\n _id: string;\n name: string;\n}\n\nexport enum TripPointType {\n ARRIVAL = 'arrival-plane',\n AIRPORT = 'airport',\n BUS_STOP = 'bus',\n BOAT = 'boat',\n CABLE_CAR = 'cable-car',\n TRAIN_STATION = 'train',\n HOTEL = 'hotel',\n BUILDING = 'building',\n AREA = 'area',\n STORE = 'store',\n PARK = 'park',\n HERITAGE = 'heritage',\n SPA = 'spa',\n WATER = 'water',\n RESTAURANT = 'restaurant',\n CHURCH = 'church',\n EXPERIENCE = 'experience',\n OTHER = 'other',\n}\n\nexport interface TripPoint {\n lat: number;\n lng: number;\n name: string;\n place_id: string;\n}\n\nexport interface TripCityPoint extends TripPoint {\n type: TripPointType;\n id: string;\n minutes: number;\n outgoing_travel: RouteType | null;\n is_overnight: boolean;\n notes: string;\n cost?: number;\n\n start_hour?: number;\n start_minute?: number;\n}\n\nexport interface TripCity extends TripPoint {\n enter_via: TripCityPoint | null;\n exit_via: TripCityPoint | null;\n stay_at: TripCityPoint | null;\n nights: number;\n\n points: TripCityPoint[];\n id: string;\n\n notes: string;\n cost?: number;\n}\n\nexport interface TripOptions {\n dayStartHour: number;\n dayStartMinute: number;\n startDate?: DateTime;\n}\n\nexport interface TripDetail extends Trip {\n cities: TripCity[];\n options: TripOptions;\n notes: string;\n cost?: number;\n}\n","import axios, { AxiosError } from 'axios';\nimport { injectable } from 'inversify';\nimport { DateTime } from 'luxon';\nimport { SearchResult } from '../map-service/location-search/search-result';\nimport {\n Trip,\n TripCity,\n TripCityPoint,\n TripDetail,\n TripOptions,\n TripPointType,\n} from './trip';\nimport { TripDetailError, TripApiService } from './trip-service.interface';\nimport { TripTextualizer } from './trip-textualizer.interface';\n\ntype ApiTripOptions = Omit & { startDate?: string };\ntype ApiTrip = Omit & {\n options: ApiTripOptions;\n};\n\nfunction prepareOptionsForApi(options: TripOptions): ApiTripOptions {\n const startDate = options.startDate\n ? options.startDate.toFormat('yyyy-MM-dd')\n : undefined;\n return { ...options, startDate };\n}\n\nfunction prepareTripForApi(trip: TripDetail): ApiTrip {\n const updatedCities = trip.cities.map((city: TripCity) => {\n const clone: TripCity = { ...city };\n clone.points = clone.points.map((point) => {\n if (point.is_overnight) {\n const with_stay_ll = city.stay_at\n ? {\n ...point,\n lat: city.stay_at.lat,\n lng: city.stay_at.lng,\n }\n : point;\n return with_stay_ll;\n }\n return point;\n }, [] as number[]);\n return clone;\n });\n const options = prepareOptionsForApi(trip.options);\n const { _id, ...subtrip } = trip;\n const newTripData = { ...subtrip, cities: updatedCities, options };\n return newTripData;\n}\n\ninterface ConvertableId {\n _id: string;\n id?: string;\n}\n\nfunction convertId(v?: ConvertableId) {\n if (v) v.id = v._id;\n}\n\n// TODO can we properly type the API route as well\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeTripForUI(trip: any): TripDetail {\n trip.cities.forEach(\n (\n v: ConvertableId & {\n stay_at?: ConvertableId;\n enter_via?: ConvertableId;\n exit_via?: ConvertableId;\n points: { _id: string; id?: string }[];\n },\n ) => {\n convertId(v);\n convertId(v.stay_at);\n convertId(v.enter_via);\n convertId(v.exit_via);\n v.points.forEach(convertId);\n },\n );\n\n trip.cities.forEach(\n (city: {\n nights?: number;\n notes?: string;\n points: { minutes?: number; is_overnight?: boolean; cost?: number }[];\n }) => {\n if (city.nights === undefined) {\n city.nights = 0;\n }\n if (city.notes === undefined) {\n city.notes = '';\n }\n city.points.forEach((pt) => {\n if (pt.minutes === undefined) {\n pt.minutes = 0;\n }\n if (pt.is_overnight === undefined) {\n pt.is_overnight = false;\n }\n if (pt.is_overnight) {\n pt.cost = undefined;\n }\n });\n },\n );\n\n trip.cities.forEach((city: TripCity) => {\n if (!city.stay_at) return;\n const stay_at = city.stay_at;\n\n let overnightCount = 0;\n city.points = city.points.reduce((newPoints, aliasedPoint) => {\n const point = aliasedPoint as TripCityPoint;\n if (point.is_overnight) {\n ++overnightCount;\n const with_stay_ll = {\n ...point,\n id: `overnight-${overnightCount}`,\n lat: stay_at.lat,\n lng: stay_at.lng,\n };\n newPoints.push(with_stay_ll);\n } else {\n newPoints.push(point);\n }\n return newPoints;\n }, [] as TripCityPoint[]);\n });\n\n if (trip.options?.startDate) {\n trip.options.startDate = DateTime.fromISO(trip.options.startDate);\n }\n\n if (!trip.notes) {\n trip.notes = '';\n }\n\n return trip;\n}\n\n@injectable()\nexport class BasicTripService implements TripApiService, TripTextualizer {\n generatedIdents = 0;\n async getCurrentUserTrips(): Promise {\n try {\n const result = await axios.get('/trip/mine');\n return result.data;\n } catch (e) {\n return null;\n }\n }\n\n async getTripDetail(trip: string): Promise {\n try {\n const result = await axios.get(`/trip/${trip}`);\n return normalizeTripForUI(result.data);\n } catch (e) {\n const axiosErr = e as AxiosError;\n if (axiosErr.response?.status === 404) return TripDetailError.NOT_FOUND;\n else {\n return TripDetailError.UNKNOWN;\n }\n }\n }\n async updateTrip(trip: TripDetail): Promise {\n const normalized = prepareTripForApi(trip);\n try {\n await axios.put(`/trip/${trip._id}`, normalized);\n return true;\n } catch (e) {\n return false;\n }\n }\n async newTrip(name: string): Promise {\n try {\n const result = await axios.post('/trip', { name });\n return result.data;\n } catch (e) {\n return null;\n }\n }\n\n createCityFromSearch(result: SearchResult): TripCity {\n return {\n lat: result.location.lat,\n lng: result.location.lng,\n name: result.name,\n place_id: result.place_id,\n enter_via: null,\n exit_via: null,\n stay_at: null,\n nights: 0,\n points: [],\n id: `${this.generatedIdents++}`,\n notes: '',\n };\n }\n\n createPointFromSearch(result: SearchResult): TripCityPoint {\n return {\n lat: result.location.lat,\n lng: result.location.lng,\n name: result.name,\n place_id: result.place_id,\n type: TripPointType.OTHER,\n id: `${this.generatedIdents++}`,\n minutes: 0,\n outgoing_travel: null,\n is_overnight: false,\n notes: '',\n };\n }\n\n tripToText(trip: TripDetail): string {\n // Need to preserve the ID, so add it in since the API doesn't want it\n // in the JSON\n const normalized: ApiTrip & { _id?: string } = prepareTripForApi(trip);\n normalized._id = trip._id;\n\n return JSON.stringify(normalized);\n }\n\n textToTrip(data: string): string | TripDetail {\n try {\n return normalizeTripForUI(JSON.parse(data));\n } catch (e) {\n return (e as Error).message;\n }\n }\n}\n","import { PointSet } from '@/map-display';\nimport { DeepReadonly, Ref } from 'vue';\n\nexport const PointSetService = Symbol('PointSetService');\nexport interface PointSetService {\n getPointSets(): DeepReadonly>;\n removePointSet(id: Ref): boolean;\n addPointSet(set: Ref): void;\n clearPointSets(): void;\n}\n","import { injectable } from 'inversify';\nimport { computed, ComputedRef, DeepReadonly, reactive, Ref } from 'vue';\nimport { PointSet } from '../../../map-display';\nimport { PointSetService } from './point-set.interface';\n\n@injectable()\nexport class ArrayPointSetService implements PointSetService {\n private pointSets: Ref[];\n private readonly resolvedSets: ComputedRef;\n constructor() {\n this.pointSets = reactive([]);\n this.resolvedSets = computed(() => {\n return this.pointSets.map((r) => r.value);\n });\n }\n\n getPointSets(): DeepReadonly> {\n return this.resolvedSets;\n }\n\n removePointSet(set: Ref): boolean {\n const idx = this.pointSets.findIndex((r) => r == set);\n\n if (idx >= 0) this.pointSets.splice(idx, 1);\n\n return idx >= 0;\n }\n\n addPointSet(ps: Ref): void {\n this.pointSets.push(ps);\n }\n\n clearPointSets(): void {\n this.pointSets.length = 0;\n }\n}\n","import { MapPoint } from '../../../map-display';\n\nexport const MapDisplayInfoService = Symbol('MapDisplayInfoService');\n\nexport interface MapDisplayInfoService {\n getMapCenter(): MapPoint | undefined;\n setMapCenter(newCenter: MapPoint): void;\n getMapZoom(): number | undefined;\n}\n","import { injectable } from 'inversify';\nimport Map from 'ol/Map';\nimport { MapDisplayInfoService } from './map-display-info.interface';\nimport { fromLonLat, toLonLat } from 'ol/proj';\nimport { MapPoint } from '../../../map-display';\n\n@injectable()\nexport class OpenLayersMapDisplayInfoService implements MapDisplayInfoService {\n private map?: Map;\n\n setMap(map: Map | undefined): void {\n this.map = map;\n }\n getMapCenter(): MapPoint | undefined {\n if (!this.map) return undefined;\n const center = this.map.getView().getCenter();\n if (!center) return { lng: 0, lat: 0 };\n const ll = toLonLat(center);\n return { lng: ll[0], lat: ll[1] };\n }\n\n setMapCenter(mapPoint: MapPoint): void {\n this.map?.getView().animate({\n center: fromLonLat([mapPoint.lng, mapPoint.lat]),\n duration: 250,\n });\n }\n\n getMapZoom(): number | undefined {\n if (!this.map) return undefined;\n return this.map?.getView().getZoom();\n }\n}\n","import { TripPointType } from './trip';\n\nexport const TripIconSet = Symbol('TripIconSet');\nexport interface TripIconSet {\n getTripIconClass(type: TripPointType): string;\n}\n","import { injectable } from 'inversify';\nimport { TripPointType } from './trip';\nimport { TripIconSet } from './trip-icon-set.interface';\n\nfunction ic(name: string) {\n return `fas fa-${name}`;\n}\n@injectable()\nexport class FAIconSet implements TripIconSet {\n getTripIconClass(type: TripPointType): string {\n switch (type) {\n case TripPointType.ARRIVAL:\n return ic('plane-arrival');\n case TripPointType.AIRPORT:\n return ic('plane-departure');\n case TripPointType.BUS_STOP:\n return ic('bus');\n case TripPointType.BOAT:\n return ic('ship');\n case TripPointType.CABLE_CAR:\n return ic('tram');\n case TripPointType.TRAIN_STATION:\n return ic('train');\n case TripPointType.HOTEL:\n return ic('hotel');\n case TripPointType.BUILDING:\n return ic('building');\n case TripPointType.AREA:\n return ic('map');\n case TripPointType.STORE:\n return ic('store');\n case TripPointType.PARK:\n return ic('tree');\n case TripPointType.HERITAGE:\n return ic('landmark');\n case TripPointType.SPA:\n return ic('spa');\n case TripPointType.WATER:\n return ic('water');\n case TripPointType.RESTAURANT:\n return ic('utensils');\n case TripPointType.CHURCH:\n return ic('church');\n case TripPointType.EXPERIENCE:\n return ic('ticket-alt');\n\n default:\n return 'fas fa-map-signs';\n }\n }\n}\n","import { MapPoint } from '@/map-display';\nimport { RouteType } from './route-type';\n\nexport const DirectionRouterService = Symbol('DirectRouterService');\n\nexport interface RouteLeg {\n points: MapPoint[];\n seconds: number;\n type: RouteType;\n}\n\nexport type RouteOptions = RouteLeg[][];\n\nexport interface DirectionRouterService {\n getRoutedPoints(points: MapPoint[]): Promise;\n}\n","import { TripDetail } from './trip';\n\nexport const TripTextualizer = Symbol('TripTextualizer');\n\nexport interface TripTextualizer {\n tripToText(trip: TripDetail): string;\n /// Attempts to convert the string back into the trip details.\n /// If that fails, returns an error message instead.\n textToTrip(data: string): TripDetail | string;\n}\n","import { MapPoint, PointSetPolyInfo } from '@/map-display';\nimport { ComputedRef, DeepReadonly, Ref } from 'vue';\n\nexport interface ComputedPolyline {\n points: MapPoint[];\n displayInfo: PointSetPolyInfo;\n}\n\nexport type PolylineComputationId = number;\n\nexport const ComputedPolylineManager = Symbol('ComputedPolylineManager');\n\nexport interface ComputedPolylineManager {\n addPolylineComputation(\n ref: ComputedRef,\n ): PolylineComputationId;\n removePolylineComputation(id: PolylineComputationId): void;\n\n getPolylines(): DeepReadonly>;\n}\n","import { injectable } from 'inversify';\nimport {\n computed,\n ComputedRef,\n DeepReadonly,\n readonly,\n ref,\n Ref,\n toRef,\n} from 'vue';\nimport {\n ComputedPolyline,\n ComputedPolylineManager,\n PolylineComputationId,\n} from './computed-polylines.interface';\n\ninterface PolyRef {\n computation: ComputedRef;\n id: PolylineComputationId;\n}\n\n@injectable()\nexport class ArrayPolylineManager implements ComputedPolylineManager {\n private readonly polylines: Ref;\n private readonly flatPolylines: ComputedRef;\n private id: number;\n constructor() {\n this.id = 0;\n this.polylines = ref([]);\n this.flatPolylines = computed(() =>\n this.polylines.value.flatMap(\n (polyref) => toRef(polyref, 'computation').value,\n ),\n );\n }\n addPolylineComputation(\n ref: ComputedRef,\n ): PolylineComputationId {\n ++this.id;\n this.polylines.value.push({\n computation: ref,\n id: this.id,\n });\n return this.id;\n }\n removePolylineComputation(id: PolylineComputationId): void {\n this.polylines.value = this.polylines.value.filter((v) => v.id != id);\n }\n getPolylines(): DeepReadonly> {\n return readonly(this.flatPolylines);\n }\n}\n","export const MapVectorJsonService = Symbol('MapVectorJsonService');\nexport interface MapVectorJsonService {\n isMapboxVectorStyle: boolean;\n getStyleUrl(): string;\n buildOpenLayersTileUrl(): string;\n getOpenLayersAttributions(): string | string[];\n}\n","import { injectable } from 'inversify';\nimport { MapVectorJsonService } from './map-vector-json.interface';\n@injectable()\nexport class LocalOpenMapTilesVectorJsonService\n implements MapVectorJsonService\n{\n isMapboxVectorStyle = false;\n getStyleUrl(): string {\n return '';\n }\n buildOpenLayersTileUrl(): string {\n // TODO use base url or environment variable or something\n return `http://${window.location.hostname}:8090/tiles/{z}/{x}/{y}.pbf`;\n }\n getOpenLayersAttributions(): string | string[] {\n return [\n '© ' +\n 'OpenStreetMap contributors',\n ];\n }\n}\n","import { injectable } from 'inversify';\nimport axios from 'axios';\nimport { Point } from 'geojson';\nimport { LocationEngineInfo } from './engine-info';\nimport { LocationSearchService } from './location-search.interface';\nimport { LocationSearchRequest } from './search-request';\nimport { SearchResult } from './search-result';\n\nconst MAX_LOCATION_PARTS = 2;\n\ninterface PhotonFeatureProps {\n name: string;\n city?: string;\n countrycode?: string;\n osm_value?: string;\n street?: string;\n osm_id: number;\n}\n\ntype PhotonCollection = GeoJSON.FeatureCollection;\n\nfunction titleCaseValue(value: string): string {\n const spaced = value.replace('_', ' ');\n const split = spaced.split(' ');\n return split\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nconst BAD_VALUES = [\n 'primary',\n 'secondary',\n 'tertiary',\n 'city',\n 'state',\n 'street',\n 'administrative',\n];\n\nfunction isValueUsable(value: string): boolean {\n return BAD_VALUES.indexOf(value) == -1;\n}\n\n@injectable()\nexport class PhotonSearchService\n implements LocationSearchService\n{\n getEngineSpecification(): LocationEngineInfo {\n return {\n autocompletionLimits: null,\n };\n }\n async doLocationSearch(\n search: LocationSearchRequest,\n ): Promise {\n let llPart = '';\n if (search.findCloseTo) {\n const zoomScale = search.mapZoom ? `&zoom=${search.mapZoom}` : '';\n llPart = `&lat=${search.findCloseTo.lat}&lon=${search.findCloseTo.lng}${zoomScale}`;\n }\n const queryPart = `q=${search.input.toLowerCase()}`;\n const lang = `&lang=en`;\n const url = `https://photon.komoot.io/api/?${queryPart}${llPart}${lang}`;\n const result = await axios.get(url, {\n withCredentials: false,\n });\n return this.convertResultGeoJson(result.data);\n }\n convertResultGeoJson(results: PhotonCollection): SearchResult[] {\n const featProps = results.features.map((feat) => feat.properties);\n return featProps.map((feat, idx) => {\n const name = feat.name;\n const locationParts: string[] = [];\n if (feat.street) locationParts.push(feat.street);\n if (feat.city) locationParts.push(feat.city);\n if (feat.countrycode) locationParts.push(feat.countrycode);\n const locationDrilldown = locationParts\n .filter((_, idx) => idx < MAX_LOCATION_PARTS)\n .join(', ');\n\n const type =\n feat.osm_value && isValueUsable(feat.osm_value)\n ? titleCaseValue(feat.osm_value)\n : null;\n const typePart = type ? `${type} ${feat.street ? 'on' : 'in'} ` : '';\n\n const fullDetail = typePart + locationDrilldown;\n\n return {\n name,\n detail: fullDetail,\n location: {\n lng: results.features[idx].geometry.coordinates[0],\n lat: results.features[idx].geometry.coordinates[1],\n },\n place_id: `${feat.osm_id}`,\n };\n });\n }\n}\n","/* eslint-disable no-console */\nimport { injectable } from 'inversify';\nimport { LoggerService } from './logger.interface';\n\n@injectable()\nexport class ConsoleLogger implements LoggerService {\n async error(msg: unknown): Promise {\n console.error(msg);\n }\n async warn(msg: unknown): Promise {\n console.warn(msg);\n }\n async log(msg: unknown): Promise {\n console.log(msg);\n }\n}\n","export const LoggerService = Symbol('LoggerService');\nexport interface LoggerService {\n error(msg: unknown): Promise;\n warn(msg: unknown): Promise;\n log(msg: unknown): Promise;\n}\n","export enum RouteType {\n WALK = 'walk',\n CAR = 'car',\n}\n","import { RouteOptions } from './direction-router.interface';\n\nexport class RoutingResultCache {\n private readonly mapping = new Map();\n private lru: string[] = [];\n constructor(private readonly limit: number) {}\n\n refreshUsage(ident: string): void {\n this.lru = this.lru.filter((val) => val != ident);\n this.lru.push(ident);\n }\n\n insertResult(ident: string, points: RouteOptions): void {\n while (this.lru.length >= this.limit) {\n this.mapping.delete(this.lru[0]);\n this.lru.shift();\n }\n this.refreshUsage(ident);\n this.mapping.set(ident, points);\n }\n\n getResult(ident: string): RouteOptions | null {\n const cached = this.mapping.get(ident);\n if (cached) {\n this.refreshUsage(ident);\n return cached;\n } else {\n return null;\n }\n }\n}\n","import { DI } from '@/di';\nimport { ConsoleLogger } from '@/services/logging/console-logger.service';\nimport { LoggerService } from '@/services/logging/logger.interface';\n\nfunction delegateLog(k: keyof LoggerService): (msg: unknown) => void {\n return (msg: unknown) => {\n let service = DI.isBound(LoggerService)\n ? DI.get(LoggerService)\n : undefined;\n if (!service && process.env.JEST_WORKER_ID) service = new ConsoleLogger();\n if (service) void service[k](msg);\n };\n}\n\nexport const Logger = {\n error: delegateLog('error'),\n warn: delegateLog('warn'),\n log: delegateLog('log'),\n};\n","import { MapPoint } from '@/map-display';\nimport axios from 'axios';\nimport { injectable } from 'inversify';\nimport {\n DirectionRouterService,\n RouteOptions,\n} from './direction-router.interface';\nimport { RoutingResultCache } from './routing-result-cache';\nimport { RouteType } from './route-type';\nimport { Logger } from '@/utils/logger';\nimport * as polyline from '@mapbox/polyline';\n\nconst MAX_RESULT_CACHE_SIZE = 50;\nconst POLYLINE_PRECISION = 6;\n\nexport enum PathTravelType {\n WALK = 'walk',\n CAR = 'car',\n}\n\ninterface PathResult {\n routes: {\n type: PathTravelType;\n legs: {\n points: string;\n seconds: number;\n }[];\n }[];\n}\n\nconst PATH_TO_ROUTE_TYPE = {\n [PathTravelType.CAR]: RouteType.CAR,\n [PathTravelType.WALK]: RouteType.WALK,\n};\n\n@injectable()\nexport class BackendRouterService implements DirectionRouterService {\n private readonly lru_cache = new RoutingResultCache(MAX_RESULT_CACHE_SIZE);\n\n async getRawRoutes(points: MapPoint[]): Promise {\n const req = polyline.encode(\n points.map((p) => [p.lat, p.lng]),\n POLYLINE_PRECISION,\n );\n const result = await axios.post('/pathfinding/v1/polystring', {\n polystring: req,\n });\n return result.data;\n }\n\n async getRoutedPoints(points: MapPoint[]): Promise {\n if (points.length <= 1) {\n return [\n points.map((p) => ({\n points: [p],\n seconds: 0,\n type: RouteType.WALK,\n })),\n ];\n }\n\n const strippedPoints = points.map((p) => ({ lat: p.lat, lon: p.lng }));\n\n const ident = JSON.stringify(strippedPoints);\n\n const cached = this.lru_cache.getResult(ident);\n if (cached) return cached;\n try {\n const res = await this.getRawRoutes(points);\n const options = res.routes.map((route) =>\n route.legs.map((leg) => {\n const polyTuples = polyline.decode(leg.points, POLYLINE_PRECISION);\n const points = polyTuples.map((tuple) => ({\n lat: tuple[0],\n lng: tuple[1],\n }));\n return {\n points,\n seconds: leg.seconds,\n type: PATH_TO_ROUTE_TYPE[route.type],\n };\n }),\n );\n\n this.lru_cache.insertResult(ident, options);\n return options;\n } catch (e) {\n Logger.warn('Could not get route from backend pathfinding API');\n Logger.warn(e);\n return [\n points.map((p) => ({\n points: [p],\n seconds: -1,\n type: RouteType.WALK,\n })),\n ];\n }\n }\n}\n","import { MapPoint } from '@/map-display';\n\nexport const TimezoneLookupService = Symbol('TimezoneLookupService');\n\nexport type TimezoneIdentifier = string;\nexport interface TimezoneLookupService {\n getTimezone(point: MapPoint): Promise;\n}\n","import { MapPoint } from '@/map-display';\nimport axios from 'axios';\nimport { injectable } from 'inversify';\nimport {\n TimezoneIdentifier,\n TimezoneLookupService,\n} from './timezone-lookup.interface';\n\n@injectable()\nexport class ServerTzLookupService implements TimezoneLookupService {\n async getTimezone(point: MapPoint): Promise {\n const resp = await axios.get(`timezone/lookup/${point.lat}/${point.lng}`);\n return resp.data.tz;\n }\n}\n","export interface GlobalClickObserver {\n onClick(target: EventTarget | null): void;\n}\n\nexport const GlobalClickTracker = Symbol('GlobalClickTracker');\nexport interface GlobalClickTracker {\n addObserver(obs: GlobalClickObserver): void;\n removeObserver(obs: GlobalClickObserver): void;\n}\n","import { injectable } from 'inversify';\nimport {\n GlobalClickObserver,\n GlobalClickTracker,\n} from './global-click-tracker.interface';\n\n@injectable()\nexport class DocumentClickTracker implements GlobalClickTracker {\n private observers: GlobalClickObserver[] = [];\n private callback: (evt: MouseEvent) => void;\n\n constructor() {\n this.callback = this.notify.bind(this);\n document.addEventListener('mousedown', this.callback);\n }\n\n private notify(evt: MouseEvent) {\n this.observers.forEach((obs) => obs.onClick(evt.target));\n }\n\n addObserver(obs: GlobalClickObserver): void {\n this.observers.push(obs);\n }\n\n removeObserver(remove: GlobalClickObserver): void {\n this.observers = this.observers.filter((obs) => obs != remove);\n }\n\n unregister(): void {\n document.removeEventListener('mousedown', this.callback);\n }\n}\n","import { MapTileService } from './map-tile.interface';\nimport L from 'leaflet';\nimport { injectable } from 'inversify';\nimport { MapVectorJsonService } from './map-vector-json.interface';\n\n@injectable()\nexport class GeoapifyTileService\n implements MapTileService, MapVectorJsonService\n{\n TILE_THEME = 'osm-bright';\n isMapboxVectorStyle = true;\n getStyleUrl(): string {\n const apiKey = `apiKey=${process.env.VUE_APP_GEOAPIFY_MAP_KEY}`;\n return `https://maps.geoapify.com/v1/styles/${this.TILE_THEME}/style.json?${apiKey}`;\n }\n buildOpenLayersTileUrl(): string {\n throw new Error('Method not implemented.');\n }\n getOpenLayersAttributions(): string | string[] {\n throw new Error('Method not implemented.');\n }\n\n GEOAPIFY_RASTER_URL_BASE = 'https://maps.geoapify.com/v1/tile';\n buildLeafletTileUrl(): string {\n const retinaStr = L.Browser.retina ? '@2x' : '';\n const extension = `${retinaStr}.png`;\n const apiKey = `apiKey=${process.env.VUE_APP_GEOAPIFY_MAP_KEY}`;\n\n const fullString = `${this.GEOAPIFY_RASTER_URL_BASE}/${this.TILE_THEME}/{z}/{x}/{y}${extension}?${apiKey}`;\n return fullString;\n }\n buildOptions(): Record {\n return {\n attribution:\n 'Powered by Geoapify | © OpenStreetMap contributors',\n maxZoom: 20,\n };\n }\n}\n","import 'reflect-metadata';\nimport { Container } from 'inversify';\nimport { BasicOsmTileService } from './services/map-service/basic-osm-tiles.service';\nimport { MapTileService } from './services/map-service/map-tile.interface';\nimport { LocationSearchService } from './services/map-service/location-search/location-search.interface';\nimport { SearchResult } from './services/map-service/location-search/search-result';\nimport { UserInfoService } from './services/user-management/user-info.interface';\nimport { BasicUserInfoService } from './services/user-management/basic-user-info.service';\nimport { TripApiService } from './services/trips/trip-service.interface';\nimport { BasicTripService } from './services/trips/basic-trip.service';\nimport { PointSetService } from './services/map-service/points/point-set.interface';\nimport { ArrayPointSetService } from './services/map-service/points/array-point-set.service';\nimport { MapDisplayInfoService } from './services/map-service/display-info/map-display-info.interface';\nimport { OpenLayersMapDisplayInfoService } from './services/map-service/display-info/openlayers-map-display-info.service';\nimport { TripIconSet } from './services/trips/trip-icon-set.interface';\nimport { FAIconSet } from './services/trips/fontawesome-icon-set.service';\nimport { DirectionRouterService } from './services/map-service/routing/direction-router.interface';\nimport { TripTextualizer } from './services/trips/trip-textualizer.interface';\nimport { ComputedPolylineManager } from './services/map-service/points/computed-polylines.interface';\nimport { ArrayPolylineManager } from './services/map-service/points/array-polylines.service';\nimport { MapVectorJsonService } from './services/map-service/map-vector-json.interface';\nimport { LocalOpenMapTilesVectorJsonService } from './services/map-service/local-openmaptiles.service';\nimport { PhotonSearchService } from './services/map-service/location-search/photon-search.service';\nimport { ConsoleLogger } from './services/logging/console-logger.service';\nimport { LoggerService } from './services/logging/logger.interface';\nimport { BackendRouterService } from './services/map-service/routing/backend-router.service';\nimport { TimezoneLookupService } from './services/timezone/timezone-lookup.interface';\nimport { ServerTzLookupService } from './services/timezone/server-tz-lookup.service';\nimport { GlobalClickTracker } from './services/focus/global-click-tracker.interface';\nimport { DocumentClickTracker } from './services/focus/document-click-tracker.service';\nimport { GeoapifyTileService } from './services/map-service/geoapify-tiles.service';\n\nexport const DI = new Container();\n\nexport type SearchServiceResultType = SearchResult;\n\nexport function bindServices(): void {\n DI.bind(MapTileService)\n .to(BasicOsmTileService)\n .inSingletonScope();\n if (process.env.VUE_APP_USE_GEOAPIFY_TILES) {\n DI.bind(MapVectorJsonService)\n .to(GeoapifyTileService)\n .inSingletonScope();\n } else {\n DI.bind(MapVectorJsonService)\n .to(LocalOpenMapTilesVectorJsonService)\n .inSingletonScope();\n }\n\n DI.bind>(LocationSearchService)\n .to(PhotonSearchService)\n .inSingletonScope();\n\n DI.bind(DirectionRouterService)\n .to(BackendRouterService)\n .inSingletonScope();\n\n DI.bind(UserInfoService)\n .to(BasicUserInfoService)\n .inSingletonScope();\n\n DI.bind(TripApiService)\n .to(BasicTripService)\n .inSingletonScope();\n\n DI.bind(TripTextualizer)\n .to(BasicTripService)\n .inSingletonScope();\n\n DI.bind(PointSetService)\n .to(ArrayPointSetService)\n .inSingletonScope();\n DI.bind(ComputedPolylineManager)\n .to(ArrayPolylineManager)\n .inSingletonScope();\n\n DI.bind(MapDisplayInfoService)\n .to(OpenLayersMapDisplayInfoService)\n .inSingletonScope();\n\n DI.bind(TripIconSet).to(FAIconSet).inSingletonScope();\n\n DI.bind(LoggerService).to(ConsoleLogger).inSingletonScope();\n\n DI.bind(TimezoneLookupService)\n .to(ServerTzLookupService)\n .inSingletonScope();\n\n DI.bind(GlobalClickTracker)\n .to(DocumentClickTracker)\n .inSingletonScope();\n}\n","import { PolylineOptions } from 'leaflet';\n\nexport interface MapPoint {\n lat: number;\n lng: number;\n}\n\nexport interface PointOfInterest extends MapPoint {\n name: string;\n}\n\nexport interface RawPointSet {\n points: MapPoint[];\n}\n\nexport type PointSetId = symbol;\n\nexport interface PointDisplayOptions {\n iconClass?: string;\n color?: string;\n highlightColor?: string;\n zIndex?: number;\n hoverText?: string;\n isHighlighted?: boolean;\n}\n\nexport interface DisplayableMapPoint extends MapPoint {\n displayOptions?: PointDisplayOptions;\n}\n\nexport interface PointSetPolyInfo {\n color?: string;\n dashes?: number[];\n}\n\nexport type PolyInfoDisplayOptions = Omit;\n\nexport interface PointWithId {\n id: string;\n locked?: boolean;\n}\n\nexport type DisplayablePointOfInterest = PointOfInterest &\n DisplayableMapPoint &\n PointWithId;\n\nexport enum PointSetDisplayType {\n NoDisplay = 0,\n Markers = 1 << 0,\n Polyline = 1 << 1,\n All = ~(~0 << 2),\n}\nexport class PointSet

{\n readonly id: PointSetId = Symbol();\n iconClass: string;\n color: string;\n zIndex = 0;\n polyinfo?: PointSetPolyInfo;\n constructor(\n public points: P[],\n public displayType: PointSetDisplayType,\n iconClass?: string,\n color?: string,\n ) {\n this.iconClass = iconClass ? iconClass : '';\n this.color = color ? color : '';\n }\n}\n\nexport type MapMarkerProps = PointDisplayOptions & { point: MapPoint };\n\n/**\n * Some common categories for points of interest.\n */\nexport enum InterestType {\n ACCOMODATION = 'accomodation',\n BUILDING = 'building',\n CATERING = 'restaurant',\n NATURE = 'nature',\n TOURISM = 'tourism',\n LEISURE = 'leisure',\n}\n","import { computed, ComputedRef } from 'vue';\nimport { DI } from '@/di';\nimport { MapMarkerProps, PointSetDisplayType } from '@/map-display';\nimport { PointSetService } from '@/services/map-service/points/point-set.interface';\n\nexport class PointSetCollapse {\n private readonly service = DI.get(PointSetService);\n\n readonly points: ComputedRef = computed(() =>\n this.service\n .getPointSets()\n .value.filter(\n (set) =>\n (set.displayType & PointSetDisplayType.Markers) ===\n PointSetDisplayType.Markers,\n )\n .flatMap((set) =>\n set.points.map((point) => {\n const display = point.displayOptions;\n return {\n point,\n ...display,\n iconClass: display?.iconClass || set.iconClass,\n color: display?.color || set.color,\n zIndex: display?.zIndex || set.zIndex,\n };\n }),\n ),\n );\n}\n","export const BASE_PIN_COLOR = '#3822a8';\nexport const SEARCH_HIGHLIGHT_PIN_COLOR = '#8295ff';\nexport const CITY_STAY_AT_PIN_COLOR = '#ba7600';\nexport const CITY_STAY_AT_PIN_HIGHLIGHT = '#d08600';\nexport const CITY_VIA_PIN_COLOR = '#e87f2e';\nexport const CITY_VIA_PIN_HIGHLIGHT = '#ff9f30';\n\nexport const CITY_PIN_ICON_CLASS = 'fas fa-city';\nexport const SEARCH_PIN_ICON_CLASS = 'fas fa-search';\nexport const GENERIC_TRIP_POINT_ICON_CLASS = 'fas fa-map-pin';\n\nexport const CITY_PIN_Z_INDEX = 100;\nexport const SEARCH_PIN_Z_INDEX = 200;\n\nexport const BASE_PATH_COLOR = 'black';\nexport const IN_CITY_PATH_COLOR = '#8b5fc9';\nexport const CITY_VIA_PATH_COLOR = '#ff8969';\n\nexport const CITY_DAY_COLORS = [\n '#B01515',\n '#D4A200',\n '#087A00',\n '#17BD8B',\n '#00DDFF',\n '#1522D6',\n '#801094',\n '#E01991',\n];\n\nexport const CITY_DAY_HIGHLIGHTS = [\n '#D03535',\n '#F4C230',\n '#28BB30',\n '#37DDAB',\n '#77FFFF',\n '#4562FF',\n '#A030C8',\n '#FF69C4',\n];\n","import { DI } from '@/di';\nimport { PointSetService } from '@/services/map-service/points/point-set.interface';\nimport { MapPoint, PointSetDisplayType } from '@/map-display';\nimport { computed, ComputedRef, DeepReadonly } from 'vue';\nimport { BASE_PATH_COLOR } from '@/icon-styling';\nimport { ComputedPolylineManager } from '@/services/map-service/points/computed-polylines.interface';\n\ntype ComputedPoly = DeepReadonly<{\n points: MapPoint[];\n color?: string;\n dashPattern?: number[];\n}>;\nexport class PolylineFinder {\n private readonly setService = DI.get(PointSetService);\n private readonly polyManager = DI.get(\n ComputedPolylineManager,\n );\n\n private buildOptions(\n color?: string,\n dashArray?: string,\n dashOffset?: string,\n ) {\n return {\n color: color && color.length > 0 ? color : BASE_PATH_COLOR,\n dashArray,\n dashOffset: dashOffset || (dashArray ? '0' : undefined),\n };\n }\n\n readonly lines: ComputedRef = computed(() => {\n const pointSetPolys: ComputedPoly[] = this.setService\n .getPointSets()\n .value.filter(\n (s) =>\n (s.displayType & PointSetDisplayType.Polyline) ===\n PointSetDisplayType.Polyline,\n )\n .map((s) => {\n const { color, points } = s;\n const polyColor = s.polyinfo?.color;\n const polyDash = s.polyinfo?.dashes;\n const specColor = polyColor && polyColor.length > 0 ? polyColor : color;\n return {\n color: specColor,\n dashPattern: polyDash,\n points: points.map((p) => ({\n lat: p.lat,\n lng: p.lng,\n })),\n };\n });\n\n const computedPolys: ComputedPoly[] = this.polyManager\n .getPolylines()\n .value.map((compPoly) => {\n const polyColor = compPoly.displayInfo.color;\n const polyDash = compPoly.displayInfo.dashes;\n return {\n color: polyColor,\n dashPattern: polyDash,\n points: compPoly.points,\n };\n });\n return pointSetPolys.concat(computedPolys);\n });\n}\n","import { injectable } from 'inversify';\nimport { Map } from 'leaflet';\nimport { MapPoint } from '../../../map-display';\nimport { MapDisplayInfoService } from './map-display-info.interface';\n\n@injectable()\nexport class LeafletMapDisplayInfoService implements MapDisplayInfoService {\n private map?: Map;\n\n setMap(map: Map | undefined): void {\n this.map = map;\n }\n getMapCenter(): MapPoint | undefined {\n if (!this.map) return undefined;\n return this.map.getBounds().getCenter();\n }\n\n setMapCenter(mapPoint: MapPoint): void {\n this.map?.panTo(mapPoint);\n }\n\n getMapZoom(): number | undefined {\n return this.map?.getZoom();\n }\n}\n","\nimport L, { DivIcon, Marker } from 'leaflet';\nimport {\n defineComponent,\n onMounted,\n onUnmounted,\n PropType,\n toRefs,\n watch,\n} from 'vue';\nimport { MapMarkerProps, MapPoint } from '@/map-display';\nimport { Map as LeafletMap } from 'leaflet';\nimport { BASE_PIN_COLOR } from '@/icon-styling';\n\nexport default defineComponent({\n name: 'MapMarker',\n props: {\n point: {\n type: Object as PropType,\n required: true,\n },\n color: {\n type: String,\n },\n iconClass: {\n type: String,\n },\n zIndex: {\n type: Number,\n },\n map: {\n type: Object as PropType,\n required: true,\n },\n },\n render() {\n return [];\n },\n setup(props: MapMarkerProps & { map: LeafletMap }) {\n const { point, color, iconClass, zIndex } = toRefs(props);\n let marker: Marker;\n let icon: DivIcon;\n\n function buildMarker(): Marker {\n const mark = L.marker(L.latLng(point.value.lat, point.value.lng), {\n icon,\n });\n mark.addTo(props.map);\n return mark;\n }\n\n function buildIcon(): DivIcon {\n const styleString =\n color?.value && color.value.length > 0\n ? `style='background-color:${props.color}'`\n : `style='background-color:${BASE_PIN_COLOR}'`;\n const htmlIconClass =\n iconClass?.value && iconClass.value.length > 0\n ? iconClass.value\n : 'bi-circle-fill';\n const IW = 36;\n const IH = Math.sqrt(IW * IW * 2);\n return L.divIcon({\n className: 'custom-div-icon',\n html: `

`,\n iconSize: [IW, IH],\n iconAnchor: [IW / 2, IH],\n });\n }\n function reloadMarker() {\n if (marker) {\n marker.setLatLng(L.latLng(point.value.lat, point.value.lng));\n marker.setIcon(icon);\n marker.setZIndexOffset(zIndex?.value ? zIndex.value : 0);\n } else {\n marker = buildMarker();\n }\n }\n function reloadIcon() {\n icon = buildIcon();\n reloadMarker();\n }\n\n onMounted(reloadIcon);\n onUnmounted(() => {\n if (marker) {\n marker.off();\n marker.remove();\n }\n });\n\n watch(point, reloadMarker, { deep: true });\n if (zIndex) watch(zIndex, reloadMarker);\n if (color) watch(color, reloadIcon);\n if (iconClass) watch(iconClass, reloadIcon);\n\n icon = buildIcon();\n marker = buildMarker();\n\n return {\n marker,\n icon,\n };\n },\n});\n","import script from \"./MapMarker.vue?vue&type=script&lang=ts\"\nexport * from \"./MapMarker.vue?vue&type=script&lang=ts\"\n\nimport \"./MapMarker.vue?vue&type=style&index=0&id=46f4eae6&lang=stylus\"\n\nconst __exports__ = script;\n\nexport default __exports__","\nimport { DI } from '@/di';\nimport { DirectionRouterService } from '@/services/map-service/routing/direction-router.interface';\nimport L, { Polyline, Map as LeafletMap } from 'leaflet';\nimport {\n computed,\n ComputedRef,\n defineComponent,\n onUnmounted,\n PropType,\n ref,\n toRefs,\n watch,\n} from 'vue';\nimport { MapPoint, PolyInfoDisplayOptions } from '@/map-display';\n\nexport default defineComponent({\n name: 'MapPolyline',\n props: {\n points: {\n type: Array as PropType,\n required: true,\n },\n options: Object as PropType,\n doRouting: Boolean,\n map: {\n type: Object as PropType,\n required: true,\n },\n },\n render() {\n return [];\n },\n setup(props) {\n const routerService = DI.get(\n DirectionRouterService,\n );\n const { points, options, doRouting } = toRefs(props);\n const routedPoints = ref([]);\n const polyPoints: ComputedRef = computed(() =>\n routedPoints.value.length > 0 ? routedPoints.value : points.value,\n );\n let polyline: Polyline;\n\n function buildPolyline(): Polyline {\n const latlngs = polyPoints.value.map((p) => L.latLng(p.lat, p.lng));\n\n if (polyline) {\n polyline.setLatLngs(latlngs);\n if (options && options.value) polyline.setStyle(options.value);\n } else {\n polyline = new Polyline(latlngs, options?.value);\n polyline.addTo(props.map);\n }\n return polyline;\n }\n\n if (doRouting.value) {\n polyline = new Polyline([], options?.value);\n polyline.addTo(props.map);\n } else {\n polyline = buildPolyline();\n }\n watch([polyPoints, options], buildPolyline, { deep: true });\n\n onUnmounted(() => {\n if (polyline) {\n polyline.off();\n polyline.remove();\n }\n });\n\n async function requestRouting() {\n if (doRouting.value) {\n const newRoutedPoints = await routerService.getRoutedPoints(\n points.value,\n );\n routedPoints.value = newRoutedPoints.flatMap((leg) => leg[0].points);\n }\n }\n\n requestRouting();\n\n watch(\n points,\n () => {\n requestRouting();\n },\n { deep: true },\n );\n\n return { polyline, buildPolyline, routerService };\n },\n});\n","import script from \"./MapPolyline.vue?vue&type=script&lang=ts\"\nexport * from \"./MapPolyline.vue?vue&type=script&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\nimport 'leaflet/dist/leaflet.css';\nimport { defineComponent, onMounted, onUnmounted, Ref, shallowRef } from 'vue';\nimport L, { Map } from 'leaflet';\nimport { DI } from '@/di';\nimport { MapTileService } from '@/services/map-service/map-tile.interface';\nimport { PointSetCollapse } from '../../parts/PointSetCollapse';\nimport { PolylineFinder } from '../../parts/PolylineFinder';\nimport { MapDisplayInfoService } from '@/services/map-service/display-info/map-display-info.interface';\nimport { LeafletMapDisplayInfoService } from '@/services/map-service/display-info/leaflet-map-display-info.service';\nimport MapMarker from './MapMarker.vue';\nimport MapPolyline from './MapPolyline.vue';\n\nfunction newMap(tileService: MapTileService): Map {\n let map = L.map('leaflet-map', { zoomControl: false });\n map.setView([51.5073219, -0.1276474], 13);\n L.tileLayer(\n tileService.buildLeafletTileUrl(),\n tileService.buildOptions(),\n ).addTo(map);\n\n let zoomCtrl = new L.Control.Zoom({ position: 'bottomleft' });\n zoomCtrl.addTo(map);\n\n return map;\n}\n\nexport default defineComponent({\n name: 'LeafletMap',\n components: {\n MapMarker,\n MapPolyline,\n },\n setup() {\n const tileService = DI.get(MapTileService);\n const displayInfoService = (function () {\n const raw = DI.get(MapDisplayInfoService);\n if (raw instanceof LeafletMapDisplayInfoService) return raw;\n return undefined;\n })();\n let map: Ref = shallowRef(null);\n //let pointDisplay: PointSetDisplay;\n let collapser = new PointSetCollapse();\n let polyFinder = new PolylineFinder();\n\n const doPostMountInit = () => {\n map.value = newMap(tileService);\n //pointDisplay = new PointSetDisplay(map);\n //pointDisplay.setup();\n\n displayInfoService?.setMap(map.value);\n };\n\n function destroyMap() {\n if (map.value) {\n map.value.off();\n map.value.remove();\n }\n displayInfoService?.setMap(undefined);\n }\n\n onMounted(doPostMountInit);\n onUnmounted(destroyMap);\n return {\n markerPoints: collapser.points,\n polylines: polyFinder.lines,\n map,\n collapser,\n polyFinder,\n };\n },\n});\n","import { render } from \"./LeafletMap.vue?vue&type=template&id=498d0c74&ts=true&lang=pug\"\nimport script from \"./LeafletMap.vue?vue&type=script&lang=ts\"\nexport * from \"./LeafletMap.vue?vue&type=script&lang=ts\"\n\nimport \"./LeafletMap.vue?vue&type=style&index=0&id=498d0c74&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, mergeProps as _mergeProps, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_open_layer_marker = _resolveComponent(\"open-layer-marker\")!\n const _component_open_layer_polyline = _resolveComponent(\"open-layer-polyline\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"ol-map ed-map flex-fill\",\n id: \"ol-map\",\n tabindex: \"-1\",\n onMouseenter: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.focusMap && _ctx.focusMap(...args))),\n ref: \"mapDiv\"\n }, [\n (_ctx.map)\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList(_ctx.markerPoints, (marker) => {\n return (_openBlock(), _createBlock(_component_open_layer_marker, _mergeProps(marker, { map: _ctx.map }), null, 16, [\"map\"]))\n }), 256))\n : _createCommentVNode(\"\", true),\n (_ctx.map)\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 1 }, _renderList(_ctx.polylines, (line) => {\n return (_openBlock(), _createBlock(_component_open_layer_polyline, _mergeProps(line, { \"vector-source\": _ctx.polylineSource }), null, 16, [\"vector-source\"]))\n }), 256))\n : _createCommentVNode(\"\", true)\n ], 544))\n}","import stylefunction from 'ol-mapbox-style/dist/stylefunction';\n\nexport default stylefunction;\n","import { normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = [\"title\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_bounce_animation = _resolveComponent(\"bounce-animation\")!\n\n return (_openBlock(), _createBlock(_Teleport, { to: \"body\" }, [\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"ol-marker\", {highlighted: _ctx.isHighlighted}]),\n ref: \"marker\",\n title: _ctx.hoverText\n }, [\n _createVNode(_component_bounce_animation, { animate: _ctx.isHighlighted }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", {\n class: \"marker-pin ol-pin\",\n style: _normalizeStyle(_ctx.styleString)\n }, null, 4),\n _createElementVNode(\"i\", {\n class: _normalizeClass([\"ol-map-icon\", _ctx.defaultedIconClasses])\n }, null, 2)\n ]),\n _: 1\n }, 8, [\"animate\"])\n ], 10, _hoisted_1)\n ]))\n}","import { renderSlot as _renderSlot, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass({bouncing: _ctx.animationRunning}),\n onAnimationiteration: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.animationIterationComplete && _ctx.animationIterationComplete(...args))),\n onAnimationend: _cache[1] || (_cache[1] = ($event: any) => (_ctx.animationRunning=false))\n }, [\n _renderSlot(_ctx.$slots, \"default\")\n ], 34))\n}","\nimport { defineComponent, ref, toRef, watch } from 'vue';\n\nexport default defineComponent({\n name: 'BounceAnimation',\n props: {\n animate: Boolean,\n },\n setup(props) {\n const animationRunning = ref(false);\n\n function animationIterationComplete() {\n if (!props.animate) animationRunning.value = false;\n }\n\n watch(toRef(props, 'animate'), (newAnim) => {\n if (newAnim) {\n animationRunning.value = true;\n }\n });\n\n return { animationRunning, animationIterationComplete };\n },\n});\n","import { render } from \"./BounceAnimation.vue?vue&type=template&id=10a7b048&ts=true&lang=pug\"\nimport script from \"./BounceAnimation.vue?vue&type=script&lang=ts\"\nexport * from \"./BounceAnimation.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { MapPoint, MapMarkerProps } from '@/map-display';\nimport {\n computed,\n defineComponent,\n onMounted,\n onUnmounted,\n PropType,\n ref,\n shallowRef,\n toRefs,\n watch,\n} from 'vue';\nimport Map from 'ol/Map';\nimport Overlay from 'ol/Overlay';\nimport { fromLonLat } from 'ol/proj';\nimport { BASE_PIN_COLOR } from '@/icon-styling';\nimport BounceAnimation from '@/components/utils/BounceAnimation.vue';\n\nexport default defineComponent({\n name: 'OpenLayerMarker',\n components: {\n BounceAnimation,\n },\n props: {\n point: {\n type: Object as PropType,\n required: true,\n },\n color: {\n type: String,\n },\n highlightColor: {\n type: String,\n },\n iconClass: {\n type: String,\n },\n zIndex: {\n type: Number,\n },\n hoverText: {\n type: String,\n },\n isHighlighted: {\n type: Boolean,\n },\n map: {\n type: Object as PropType,\n required: true,\n },\n },\n render() {\n return [];\n },\n setup(props: MapMarkerProps & { map: Map }) {\n const { point, iconClass } = toRefs(props);\n const marker = ref(undefined);\n const overlay = shallowRef(\n new Overlay({\n stopEvent: false,\n positioning: 'center-center',\n }),\n );\n const elementSet = ref(false);\n\n const styleString = computed(() => {\n const propColor = props.isHighlighted\n ? props.highlightColor || props.color\n : props.color;\n return propColor && propColor.length > 0\n ? `background-color:${propColor}`\n : `background-color:${BASE_PIN_COLOR}`;\n });\n const defaultedIconClasses = computed(() => {\n const cls =\n iconClass?.value && iconClass.value.length > 0\n ? [iconClass.value]\n : ['bi-circle-fill'];\n return cls;\n });\n\n function updateOverlay() {\n overlay.value.setPosition(fromLonLat([point.value.lng, point.value.lat]));\n }\n\n onMounted(() => {\n if (marker.value && !elementSet.value) {\n overlay.value.setElement(marker.value);\n props.map.addOverlay(overlay.value);\n elementSet.value = true;\n }\n updateOverlay();\n });\n\n onUnmounted(() => {\n if (elementSet.value) props.map.removeOverlay(overlay.value);\n });\n\n watch([point], () => updateOverlay(), { deep: true });\n\n return {\n marker,\n overlay,\n styleString,\n defaultedIconClasses,\n elementSet,\n };\n },\n});\n","import { render } from \"./OpenLayerMarker.vue?vue&type=template&id=072f01c8&ts=true&lang=pug\"\nimport script from \"./OpenLayerMarker.vue?vue&type=script&lang=ts\"\nexport * from \"./OpenLayerMarker.vue?vue&type=script&lang=ts\"\n\nimport \"./OpenLayerMarker.vue?vue&type=style&index=0&id=072f01c8&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { MapPoint } from '@/map-display';\nimport {\n defineComponent,\n onMounted,\n onUnmounted,\n PropType,\n toRefs,\n watch,\n} from 'vue';\nimport VectorSource from 'ol/source/Vector';\nimport Geometry from 'ol/geom/Geometry';\nimport Feature from 'ol/Feature';\nimport { fromLonLat } from 'ol/proj';\nimport Style from 'ol/style/Style';\nimport Stroke from 'ol/style/Stroke';\nimport LineString from 'ol/geom/LineString';\n\nexport default defineComponent({\n props: {\n points: {\n type: Array as PropType,\n required: true,\n },\n color: String,\n dashPattern: Array as PropType,\n vectorSource: {\n type: Object as PropType>,\n required: true,\n },\n },\n render() {\n return [];\n },\n setup(props) {\n const { points, color, dashPattern } = toRefs(props);\n const feature = new Feature();\n function updateGeom() {\n const mapPoints = points.value.map((mp) => fromLonLat([mp.lng, mp.lat]));\n feature.setGeometry(new LineString(mapPoints));\n }\n function updateStyle() {\n const style = new Style({\n stroke: new Stroke({\n width: 3,\n color: color?.value || '#000',\n lineDash: dashPattern?.value,\n }),\n zIndex: 2,\n });\n feature.setStyle(style);\n }\n\n updateStyle();\n watch([color, dashPattern], () => updateStyle(), { deep: true });\n updateGeom();\n watch(points, () => updateGeom(), { deep: true });\n\n onMounted(() => {\n props.vectorSource.addFeature(feature);\n });\n\n onUnmounted(() => {\n props.vectorSource.removeFeature(feature);\n });\n\n return { feature };\n },\n});\n","import script from \"./OpenLayerPolyline.vue?vue&type=script&lang=ts\"\nexport * from \"./OpenLayerPolyline.vue?vue&type=script&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n//TODO don't disable\n/* eslint-disable */\nimport Map from 'ol/Map';\nimport View from 'ol/View';\nimport MVT from 'ol/format/MVT';\nimport VectorTileLayer from 'ol/layer/VectorTile';\nimport VectorTileSource from 'ol/source/VectorTile';\nimport VectorLayer from 'ol/layer/Vector';\nimport MapboxVectorLayer from 'ol/layer/MapboxVector';\nimport VectorSource from 'ol/source/Vector';\nimport { DI } from '@/di';\nimport { PointSetCollapse } from '@/parts/PointSetCollapse';\nimport { PolylineFinder } from '@/parts/PolylineFinder';\nimport { MapDisplayInfoService } from '@/services/map-service/display-info/map-display-info.interface';\nimport { defineComponent, onMounted, ref, Ref, shallowRef } from 'vue';\nimport olms from '@/olms-shim';\nimport STYLE from '@/style.json';\nimport OpenLayerMarker from './OpenLayerMarker.vue';\nimport OpenLayerPolyline from './OpenLayerPolyline.vue';\nimport { MapVectorJsonService } from '@/services/map-service/map-vector-json.interface';\nimport { fromLonLat } from 'ol/proj';\nimport { OpenLayersMapDisplayInfoService } from '@/services/map-service/display-info/openlayers-map-display-info.service';\nimport Geometry from 'ol/geom/Geometry';\n\nconst MIN_UPDATE_MILLIS = 50;\n\nexport default defineComponent({\n name: 'OpenLayersMap',\n components: { OpenLayerMarker, OpenLayerPolyline },\n setup() {\n const mapDiv: Ref = ref(null);\n const vectorService = DI.get(MapVectorJsonService);\n const displayInfoService = (function () {\n const raw = DI.get(MapDisplayInfoService);\n if (raw instanceof OpenLayersMapDisplayInfoService) return raw;\n return undefined;\n })();\n let map: Ref = shallowRef(null);\n let polylineSource: Ref | null> = shallowRef(null);\n\n let collapser = new PointSetCollapse();\n let polyFinder = new PolylineFinder();\n\n function focusMap(evt: MouseEvent) {\n const btns = evt.buttons !== undefined ? evt.buttons : evt.which;\n // Don't focus if a mouse button is down\n if (btns !== 0) return;\n const elem = map.value?.getTargetElement();\n if (elem) elem.focus();\n }\n\n let lastUpdate: number | null = null;\n\n //TODO would we be better off triggering this externally?\n //The timer makes sure it doesn't run too often, but it's not ideal\n function resized() {\n const now = Date.now();\n const delta = lastUpdate ? now - lastUpdate : MIN_UPDATE_MILLIS;\n if (delta >= MIN_UPDATE_MILLIS) {\n map.value?.updateSize();\n lastUpdate = now;\n } else {\n setTimeout(resized, MIN_UPDATE_MILLIS - delta);\n }\n }\n\n function getTileLayer() {\n if (vectorService.isMapboxVectorStyle) {\n return new MapboxVectorLayer({ styleUrl: vectorService.getStyleUrl() });\n } else {\n return new VectorTileLayer({\n declutter: true,\n source: new VectorTileSource({\n attributions: vectorService.getOpenLayersAttributions(),\n format: new MVT(),\n url: vectorService.buildOpenLayersTileUrl(),\n }),\n });\n }\n }\n\n onMounted(() => {\n const tileLayer = getTileLayer();\n polylineSource.value = new VectorSource({});\n const polylineLayer = new VectorLayer({\n source: polylineSource.value,\n zIndex: 1,\n });\n const theMap = new Map({\n layers: [polylineLayer, tileLayer],\n target: 'ol-map',\n view: new View({\n center: fromLonLat([-0.1276474, 51.5073219]),\n zoom: 10,\n }),\n });\n\n olms(tileLayer, STYLE, 'openmaptiles');\n map.value = theMap;\n displayInfoService?.setMap(theMap);\n\n const observer = new ResizeObserver(resized);\n if (mapDiv.value) observer.observe(mapDiv.value);\n else {\n console.error('Map div not ready');\n }\n });\n\n return {\n markerPoints: collapser.points,\n polylines: polyFinder.lines,\n polylineSource,\n map,\n mapDiv,\n focusMap,\n };\n },\n});\n","import { render } from \"./OpenLayersMap.vue?vue&type=template&id=076f9cd5&ts=true&lang=pug\"\nimport script from \"./OpenLayersMap.vue?vue&type=script&lang=ts\"\nexport * from \"./OpenLayersMap.vue?vue&type=script&lang=ts\"\n\nimport \"./OpenLayersMap.vue?vue&type=style&index=0&id=076f9cd5&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-32150d8c\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { id: \"hud\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.currentUser)\n ? (_openBlock(), _createBlock(_component_router_view, { key: 0 }))\n : _createCommentVNode(\"\", true)\n ]))\n}","\nimport { defineComponent } from 'vue';\nimport { DI } from '../di';\nimport { UserInfoService } from '../services/user-management/user-info.interface';\n\nexport default defineComponent({\n name: 'Hud',\n setup() {\n const userService = DI.get(UserInfoService);\n const currentUser = userService.getCurrentUser();\n\n return { currentUser };\n },\n});\n","import { render } from \"./Hud.vue?vue&type=template&id=32150d8c&scoped=true&ts=true&lang=pug\"\nimport script from \"./Hud.vue?vue&type=script&lang=ts\"\nexport * from \"./Hud.vue?vue&type=script&lang=ts\"\n\nimport \"./Hud.vue?vue&type=style&index=0&id=32150d8c&lang=stylus&scoped=true\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-32150d8c\"]])\n\nexport default __exports__","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, withModifiers as _withModifiers, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1155e163\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n key: 0,\n class: \"text-center bi bi-person-fill mt-auto mb-auto\",\n id: \"um-person-icon\"\n}\nconst _hoisted_2 = {\n key: 0,\n class: \"alert alert-danger w-100\"\n}\nconst _hoisted_3 = [\"value\"]\nconst _hoisted_4 = {\n key: 2,\n class: \"text-center m-auto p-3\",\n id: \"um-current-user\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"d-flex flex-column align-items-center\",\n id: \"usermgmt\",\n onClick: _cache[5] || (_cache[5] = \n//@ts-ignore\n(...args) => (_ctx.openForm && _ctx.openForm(...args))),\n ref: \"rootDiv\",\n onFocusout: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.focusLeaving && _ctx.focusLeaving(...args)))\n }, [\n (!_ctx.expanded && !_ctx.currentUser)\n ? (_openBlock(), _createElementBlock(\"i\", _hoisted_1))\n : _createCommentVNode(\"\", true),\n (_ctx.expanded && !_ctx.currentUser)\n ? (_openBlock(), _createElementBlock(\"form\", {\n key: 1,\n class: \"d-flex flex-column\",\n id: \"um-form\",\n onSubmit: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.handleSubmit && _ctx.handleSubmit(...args)), [\"prevent\"]))\n }, [\n (_ctx.expanded && !_ctx.currentUser && _ctx.errorMessage)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString(_ctx.errorMessage), 1))\n : _createCommentVNode(\"\", true),\n _withDirectives(_createElementVNode(\"input\", {\n class: \"form-control\",\n id: \"um-username\",\n ref: \"usernameInput\",\n type: \"text\",\n placeholder: \"Username\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.username) = $event))\n }, null, 512), [\n [_vModelText, _ctx.username]\n ]),\n _withDirectives(_createElementVNode(\"input\", {\n class: \"form-control\",\n id: \"um-password\",\n type: \"password\",\n placeholder: \"Password\",\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_ctx.password) = $event))\n }, null, 512), [\n [_vModelText, _ctx.password]\n ]),\n _createElementVNode(\"input\", {\n class: \"btn btn-primary\",\n id: \"um-submit\",\n type: \"submit\",\n value: _ctx.submitText\n }, null, 8, _hoisted_3),\n _createElementVNode(\"a\", {\n class: \"btn btn-link p-0\",\n onClick: _cache[2] || (_cache[2] = ($event: any) => (_ctx.doingSignup = !_ctx.doingSignup)),\n href: \"#\",\n role: \"button\"\n }, _toDisplayString(_ctx.swapText), 1)\n ], 32))\n : _createCommentVNode(\"\", true),\n (!_ctx.expanded && _ctx.currentUser)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, _toDisplayString(_ctx.currentUser.username), 1))\n : _createCommentVNode(\"\", true),\n (_ctx.expanded && _ctx.currentUser)\n ? (_openBlock(), _createElementBlock(\"input\", {\n key: 3,\n class: \"btn btn-secondary\",\n id: \"um-logout\",\n ref: \"logoutButton\",\n type: \"submit\",\n value: \"Log Out\",\n onClick: _cache[4] || (_cache[4] = \n//@ts-ignore\n(...args) => (_ctx.doLogout && _ctx.doLogout(...args)))\n }, null, 512))\n : _createCommentVNode(\"\", true)\n ], 544))\n}","\nimport { computed, defineComponent, nextTick, ref } from 'vue';\nimport { DI } from '../di';\nimport {\n UserInfo,\n UserInfoService,\n} from '@/services/user-management/user-info.interface';\n\nexport default defineComponent({\n name: 'UserManagement',\n setup() {\n const infoService = DI.get(UserInfoService);\n const username = ref('');\n const password = ref('');\n const doingSignup = ref(false);\n const expanded = ref(false);\n const usernameInput = ref(null);\n const rootDiv = ref(null);\n const currentUser = infoService.getCurrentUser();\n const logoutButton = ref(null);\n\n const errorMessage = infoService.userManagementErrorMessage\n ? infoService.userManagementErrorMessage\n : ref(null);\n\n async function handleSubmit() {\n let result: boolean | UserInfo | null = null;\n if (doingSignup.value) {\n result = await infoService.doSignup(username.value, password.value);\n } else {\n result = await infoService.doLogin(username.value, password.value);\n if (result != null) expanded.value = false;\n }\n if (result) {\n doingSignup.value = false;\n username.value = '';\n password.value = '';\n }\n }\n\n function openForm() {\n if (!expanded.value) {\n expanded.value = true;\n if (currentUser.value) nextTick(() => logoutButton.value?.focus());\n else nextTick(() => usernameInput.value?.focus());\n }\n }\n\n function focusLeaving(evt: FocusEvent) {\n //Don't hide on window/tab change\n if (evt.relatedTarget == null) return;\n if (!rootDiv.value?.contains(evt.relatedTarget as Node))\n expanded.value = false;\n }\n\n async function doLogout() {\n await infoService.doLogout();\n expanded.value = false;\n }\n\n const submitText = computed(() =>\n doingSignup.value ? 'Sign Up' : 'Log In',\n );\n\n const swapText = computed(() =>\n doingSignup.value ? 'Switch to Login' : 'Switch to Signup',\n );\n\n const formClasses = computed(() => {\n return { collapsed: !expanded.value };\n });\n\n return {\n username,\n password,\n errorMessage,\n doingSignup,\n handleSubmit,\n expanded,\n currentUser,\n openForm,\n submitText,\n swapText,\n usernameInput,\n rootDiv,\n logoutButton,\n focusLeaving,\n formClasses,\n doLogout,\n };\n },\n});\n","import { render } from \"./UserManagement.vue?vue&type=template&id=1155e163&scoped=true&ts=true&lang=pug\"\nimport script from \"./UserManagement.vue?vue&type=script&lang=ts\"\nexport * from \"./UserManagement.vue?vue&type=script&lang=ts\"\n\nimport \"./UserManagement.vue?vue&type=style&index=0&id=1155e163&lang=stylus&scoped=true\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1155e163\"]])\n\nexport default __exports__","\nimport { computed, defineComponent, Ref } from 'vue';\nimport LeafletMap from '@/components/leaflet/LeafletMap.vue';\nimport OpenLayersMap from '@/components/openlayers/OpenLayersMap.vue';\nimport Hud from '@/components/Hud.vue';\nimport UserManagement from '@/components/UserManagement.vue';\nimport { DI } from '@/di';\nimport { UserInfoService } from '@/services/user-management/user-info.interface';\n\nexport default defineComponent({\n name: 'Home',\n components: {\n LeafletMap,\n OpenLayersMap,\n Hud,\n UserManagement,\n },\n\n setup() {\n const userService = DI.get(UserInfoService);\n const haveUser: Ref = computed(\n () => !!userService.getCurrentUser().value,\n );\n return { haveUser };\n },\n});\n","import { render } from \"./Home.vue?vue&type=template&id=7bcd06b4&scoped=true&ts=true&lang=pug\"\nimport script from \"./Home.vue?vue&type=script&lang=ts\"\nexport * from \"./Home.vue?vue&type=script&lang=ts\"\n\nimport \"./Home.vue?vue&type=style&index=0&id=7bcd06b4&lang=stylus&scoped=true\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7bcd06b4\"]])\n\nexport default __exports__","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withModifiers as _withModifiers, Fragment as _Fragment, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-40577a8f\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n key: 0,\n class: \"left-hud large\"\n}\nconst _hoisted_2 = {\n key: 2,\n class: \"alert alert-danger send-error-display text-center\"\n}\nconst _hoisted_3 = /*#__PURE__*/_createTextVNode(\"We haven't tried to save for several minutes.\")\nconst _hoisted_4 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"br\", null, null, -1))\nconst _hoisted_5 = /*#__PURE__*/_createTextVNode(\"This might be nothing, but if you're making changes then there may be a problem.\")\nconst _hoisted_6 = [\n _hoisted_3,\n _hoisted_4,\n _hoisted_5\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_trip_viewer = _resolveComponent(\"trip-viewer\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (!_ctx.selectedTrip)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, \"Loading...\"))\n : _createCommentVNode(\"\", true),\n (_ctx.selectedTrip != null)\n ? (_openBlock(), _createBlock(_component_trip_viewer, {\n key: 1,\n modelValue: _ctx.selectedTrip,\n \"onUpdate:modelValue\": _ctx.doTripUpdate,\n onBack: _ctx.goToSelection\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onBack\"]))\n : _createCommentVNode(\"\", true),\n (_ctx.hadSendError)\n ? (_openBlock(), _createElementBlock(\"h4\", _hoisted_2, \"Could not save!\"))\n : _createCommentVNode(\"\", true),\n (_ctx.noActivity)\n ? (_openBlock(), _createElementBlock(\"h5\", {\n key: 3,\n class: \"alert alert-warning inactivity-display text-center\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.resetActivity && _ctx.resetActivity(...args)), [\"prevent\"]))\n }, _hoisted_6))\n : _createCommentVNode(\"\", true)\n ], 64))\n}","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, normalizeClass as _normalizeClass, vShow as _vShow, withDirectives as _withDirectives, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-7e1d2ba4\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"hud-header trip-view-header d-flex align-items-center container\" }\nconst _hoisted_2 = {\n key: 1,\n class: \"d-flex flex-column flex-fill text-center\"\n}\nconst _hoisted_3 = { class: \"m-0 trip-view-title\" }\nconst _hoisted_4 = { class: \"trip-night-count\" }\nconst _hoisted_5 = {\n key: 2,\n class: \"faded pe-2 trip-option-trigger\"\n}\nconst _hoisted_6 = { class: \"modal-row d-flex flex-column align-items-center mt-1\" }\nconst _hoisted_7 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { class: \"w-100\" }, [\n /*#__PURE__*/_createElementVNode(\"hr\", { class: \"m-2 w-100\" })\n], -1))\nconst _hoisted_8 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { class: \"w-100\" }, [\n /*#__PURE__*/_createElementVNode(\"hr\", { class: \"m-2 w-100\" })\n], -1))\nconst _hoisted_9 = { class: \"modal-row mt-1 flex-grow-1 d-flex flex-column\" }\nconst _hoisted_10 = [\"value\"]\nconst _hoisted_11 = {\n key: 0,\n class: \"w-100 mt-1 mb-2\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_trip_option_config = _resolveComponent(\"trip-option-config\")!\n const _component_cost_display = _resolveComponent(\"cost-display\")!\n const _component_display_option_config = _resolveComponent(\"display-option-config\")!\n const _component_fa_icon_modal_trigger = _resolveComponent(\"fa-icon-modal-trigger\")!\n const _component_inline_duration = _resolveComponent(\"inline-duration\")!\n const _component_trip_city_viewer = _resolveComponent(\"trip-city-viewer\")!\n const _component_city_modal_content = _resolveComponent(\"city-modal-content\")!\n const _component_point_list = _resolveComponent(\"point-list\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"left-hud ed-scrollable\", {collapsed: _ctx.collapsed}])\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n (!_ctx.collapsed)\n ? (_openBlock(), _createElementBlock(\"i\", {\n key: 0,\n class: \"trip-back bi-chevron-left mt-auto mb-auto text-center primary-clickable faded\",\n onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.emitBack && _ctx.emitBack(...args)))\n }))\n : _createCommentVNode(\"\", true),\n (!_ctx.collapsed)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n _createElementVNode(\"h4\", _hoisted_3, _toDisplayString(_ctx.modelValue.name), 1),\n _createElementVNode(\"div\", _hoisted_4, _toDisplayString(_ctx.nightTotal) + \" nights - $\" + _toDisplayString(_ctx.costTotal), 1)\n ]))\n : _createCommentVNode(\"\", true),\n (!_ctx.collapsed)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n _createVNode(_component_fa_icon_modal_trigger, { \"icon-class\": \"fa-gear\" }, {\n default: _withCtx(() => [\n _createVNode(_component_trip_option_config, {\n modelValue: _ctx.modelValue.options || {},\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => (_ctx.updateOptions($event)))\n }, null, 8, [\"modelValue\"]),\n _createElementVNode(\"div\", _hoisted_6, [\n _createVNode(_component_cost_display, {\n cost: _ctx.modelValue.cost || 0,\n \"onUpdate:cost\": _ctx.scheduleCostUpdate\n }, null, 8, [\"cost\", \"onUpdate:cost\"])\n ]),\n _hoisted_7,\n _createVNode(_component_display_option_config, {\n class: \"mt-1\",\n modelValue: _ctx.displayOptions,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.displayOptions) = $event))\n }, null, 8, [\"modelValue\"]),\n _hoisted_8,\n _createElementVNode(\"div\", _hoisted_9, [\n _createElementVNode(\"textarea\", {\n class: \"form-control flex-grow-1\",\n value: _ctx.modelValue.notes,\n onInput: _cache[3] || (_cache[3] = \n//@ts-ignore\n(...args) => (_ctx.scheduleNoteUpdate && _ctx.scheduleNoteUpdate(...args))),\n placeholder: \"Notes, Ideas, and More!\"\n }, null, 40, _hoisted_10)\n ])\n ]),\n _: 1\n })\n ]))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"i\", {\n class: _normalizeClass([\"fas primary-clickable faded collapser pe-2 text-center\", {'fa-caret-left': !_ctx.collapsed, 'fa-caret-right': _ctx.collapsed}]),\n onClick: _cache[4] || (_cache[4] = ($event: any) => (_ctx.collapsed = !_ctx.collapsed))\n }, null, 2)\n ]),\n (!_ctx.collapsed)\n ? (_openBlock(), _createElementBlock(\"hr\", _hoisted_11))\n : _createCommentVNode(\"\", true),\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_component_point_list, {\n class: \"trip-city-list\",\n modelValue: _ctx.normalizedPoints,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = ($event: any) => ((_ctx.normalizedPoints) = $event)),\n onAddSearched: _ctx.addSearched,\n \"item-class\": \"tv-city\",\n \"pad-all\": \"\"\n }, {\n inline: _withCtx(({point, updatePoint}) => [\n _createVNode(_component_inline_duration, {\n class: \"city-night-count\",\n mode: \"single\",\n suffix: {singular: 'night', plural: 'nights'},\n modelValue: point.nights,\n \"onUpdate:modelValue\": _ctx.generateNightCbObject(point, updatePoint).cb,\n buttonText: _ctx.getCityNightsButtonText(point.id)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"buttonText\"])\n ]),\n expansion: _withCtx(({point, updatePoint}) => [\n _createVNode(_component_trip_city_viewer, {\n modelValue: point,\n \"onUpdate:modelValue\": updatePoint\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])\n ]),\n settings: _withCtx(({point, updatePoint}) => [\n _createVNode(_component_city_modal_content, {\n modelValue: point,\n \"onUpdate:modelValue\": updatePoint\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])\n ]),\n _: 1\n }, 8, [\"modelValue\", \"onAddSearched\"])\n ], 512), [\n [_vShow, !_ctx.collapsed]\n ])\n ], 2))\n}","import { computed, ComputedRef, onUnmounted, Ref } from 'vue';\nimport { DI } from '@/di';\nimport {\n DisplayablePointOfInterest,\n PointSet,\n PointSetDisplayType,\n PointSetPolyInfo,\n} from '@/map-display';\nimport { PointSetService } from '@/services/map-service/points/point-set.interface';\n\n/**\n * Pushes a set of points out for display on the map.\n *\n * The icon class and other display properties can be configured via the\n * `iconClass` and `polyinfo` fields.\n */\nexport class ManagedPointDisplay {\n private pointService = DI.get(PointSetService);\n private readonly setRef: ComputedRef;\n iconClass?: string;\n polyinfo?: PointSetPolyInfo;\n /// Map point z index. Cannot be changed once the point set is loaded.\n zIndex = 0;\n constructor(\n private readonly points: Ref,\n private readonly displayType: PointSetDisplayType,\n ) {\n const pointsWithHover = computed(() => {\n return this.points.value.map((poi) => {\n return {\n ...poi,\n displayOptions: {\n ...poi.displayOptions,\n hoverText: poi.displayOptions?.hoverText || poi.name,\n },\n };\n });\n });\n this.setRef = computed(() => {\n const set = new PointSet(\n pointsWithHover.value,\n this.displayType,\n this.iconClass,\n );\n set.zIndex = this.zIndex;\n set.polyinfo = this.polyinfo;\n return set;\n });\n }\n\n destroy(): void {\n this.pointService.removePointSet(this.setRef);\n }\n\n register(): void {\n this.pointService.addPointSet(this.setRef);\n }\n\n setup(): void {\n this.register();\n onUnmounted(() => {\n this.destroy();\n });\n }\n}\n","export interface Identifiable {\n id: string;\n}\nexport interface NormalizedList {\n ordering: string[];\n values: Record;\n}\n\nexport function normalizeList(\n list: T[],\n): NormalizedList {\n const result: NormalizedList = {\n ordering: list.map((v) => v.id),\n values: {},\n };\n list.forEach((elem) => {\n result.values[elem.id] = elem;\n });\n return result;\n}\n\nexport function normalizedCopyAndAppend(\n list: NormalizedList,\n item: T,\n): NormalizedList {\n const clone = { ...list };\n clone.values[item.id] = item;\n clone.ordering.push(item.id);\n return clone;\n}\n\nexport function rebuildFromNormalized(\n normalized: NormalizedList,\n): T[] {\n return normalized.ordering.map((id) => normalized.values[id]);\n}\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"m-0 small text-secondary\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"w-100\" }, [\n /*#__PURE__*/_createElementVNode(\"hr\", { class: \"w-100 m-2\" })\n], -1)\nconst _hoisted_3 = { class: \"modal-row d-flex flex-row align-items-center\" }\nconst _hoisted_4 = { class: \"modal-row flex-grow-1 d-flex flex-column\" }\nconst _hoisted_5 = [\"value\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_editable_title = _resolveComponent(\"editable-title\")!\n const _component_city_night_count = _resolveComponent(\"city-night-count\")!\n const _component_cost_display = _resolveComponent(\"cost-display\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createVNode(_component_editable_title, {\n modelValue: _ctx.modelValue.name,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = name => _ctx.patchAndEmitCity({name}))\n }, null, 8, [\"modelValue\"]),\n _createElementVNode(\"p\", _hoisted_1, \"$\" + _toDisplayString(_ctx.cityCost) + \" total\", 1),\n _hoisted_2,\n _createElementVNode(\"div\", _hoisted_3, [\n _createVNode(_component_city_night_count, {\n modelValue: _ctx.modelValue,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = v => _ctx.$emit('update:modelValue', v))\n }, null, 8, [\"modelValue\"]),\n _createVNode(_component_cost_display, {\n class: \"flex-grow-1\",\n cost: _ctx.modelValue.cost || 0,\n \"onUpdate:cost\": _ctx.scheduleCostUpdate\n }, null, 8, [\"cost\", \"onUpdate:cost\"])\n ]),\n _createElementVNode(\"div\", _hoisted_4, [\n _createElementVNode(\"textarea\", {\n class: \"form-control flex-grow-1\",\n value: _ctx.modelValue.notes,\n onInput: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.scheduleNoteUpdate && _ctx.scheduleNoteUpdate(...args))),\n placeholder: \"Notes, Ideas, and More!\"\n }, null, 40, _hoisted_5)\n ])\n ], 64))\n}","import { toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, withKeys as _withKeys, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (!_ctx.editing)\n ? (_openBlock(), _createElementBlock(\"h2\", {\n key: 0,\n class: \"edit-title-header m-0\",\n onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.headerClicked && _ctx.headerClicked(...args)))\n }, _toDisplayString(_ctx.modelValue), 1))\n : _createCommentVNode(\"\", true),\n (_ctx.editing)\n ? _withDirectives((_openBlock(), _createElementBlock(\"input\", {\n key: 1,\n class: \"edit-title-input form-control-lg text-center\",\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_ctx.currentTitle) = $event)),\n ref: \"input\",\n onKeyup: _cache[2] || (_cache[2] = _withKeys(\n//@ts-ignore\n(...args) => (_ctx.editComplete && _ctx.editComplete(...args)), [\"enter\"]))\n }, null, 544)), [\n [_vModelText, _ctx.currentTitle]\n ])\n : _createCommentVNode(\"\", true)\n ], 64))\n}","\nimport { DI } from '@/di';\nimport {\n GlobalClickObserver,\n GlobalClickTracker,\n} from '@/services/focus/global-click-tracker.interface';\nimport {\n defineComponent,\n nextTick,\n onMounted,\n onUnmounted,\n Ref,\n ref,\n} from 'vue';\n\nexport default defineComponent({\n props: {\n modelValue: String,\n },\n setup(props, { emit }) {\n const editing = ref(false);\n const currentTitle = ref(props.modelValue);\n const input: Ref = ref(null);\n const clickHandler: GlobalClickObserver = {\n onClick: (target: EventTarget) => {\n if (target != input.value) editing.value = false;\n },\n };\n\n function handleTitleInput(newValue: string) {\n currentTitle.value = newValue;\n }\n\n function editComplete() {\n editing.value = false;\n emit('update:modelValue', currentTitle.value);\n }\n\n function headerClicked() {\n editing.value = true;\n nextTick(() => {\n input.value?.focus();\n input.value?.select();\n });\n }\n\n onMounted(() => {\n DI.get(GlobalClickTracker).addObserver(clickHandler);\n });\n onUnmounted(() => {\n DI.get(GlobalClickTracker).removeObserver(\n clickHandler,\n );\n });\n\n return {\n currentTitle,\n editing,\n input,\n editComplete,\n handleTitleInput,\n headerClicked,\n };\n },\n});\n","import { render } from \"./EditableTitle.vue?vue&type=template&id=232e10b0&ts=true&lang=pug\"\nimport script from \"./EditableTitle.vue?vue&type=script&lang=ts\"\nexport * from \"./EditableTitle.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"city-night-count\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_inline_duration = _resolveComponent(\"inline-duration\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_inline_duration, {\n mode: \"single\",\n suffix: {singular: 'night', plural: 'nights'},\n modelValue: _ctx.nights,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.nights) = $event))\n }, null, 8, [\"modelValue\"])\n ]))\n}","import { toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, vModelText as _vModelText, withDirectives as _withDirectives, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"idn-pop d-flex flex-row flex-nowrap align-items-middle\" }\nconst _hoisted_2 = [\"step\"]\nconst _hoisted_3 = { class: \"idn-suffix m-1\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_ed_popup = _resolveComponent(\"ed-popup\")!\n\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createVNode(_component_ed_popup, {\n showPopup: _ctx.picking,\n options: {placement: 'bottom'},\n onHidden: _ctx.popupHidden\n }, {\n root: _withCtx(() => [\n _createElementVNode(\"button\", {\n class: \"idn-btn text-nowrap btn btn-sm btn-secondary ms-1 me-1\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.buttonClick && _ctx.buttonClick(...args)), [\"stop\"]))\n }, _toDisplayString(_ctx.btnText), 1)\n ]),\n popup: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_1, [\n _withDirectives(_createElementVNode(\"input\", {\n class: \"form-control form-control-sm\",\n type: \"number\",\n min: \"0\",\n step: _ctx.singleStep,\n onMouseover: _cache[1] || (_cache[1] = ($event: any) => ($event.target.focus())),\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.storedValue) = $event))\n }, null, 40, _hoisted_2), [\n [\n _vModelText,\n _ctx.storedValue,\n void 0,\n { number: true }\n ]\n ]),\n _createElementVNode(\"div\", _hoisted_3, _toDisplayString(_ctx.currentSuffix), 1)\n ])\n ]),\n _: 1\n }, 8, [\"showPopup\", \"onHidden\"])\n ]))\n}","import { renderSlot as _renderSlot, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { ref: \"root\" }\nconst _hoisted_2 = { ref: \"popup\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _renderSlot(_ctx.$slots, \"root\")\n ], 512),\n _createElementVNode(\"div\", _hoisted_2, [\n _renderSlot(_ctx.$slots, \"popup\")\n ], 512)\n ]))\n}","\nimport {\n defineComponent,\n onMounted,\n PropType,\n shallowRef,\n toRef,\n watch,\n} from 'vue';\nimport tippy, { Instance, Placement } from 'tippy.js';\nimport { PositioningStrategy } from '@popperjs/core';\n\nexport interface EdPopupOptions {\n placement: Placement | undefined;\n}\n\nexport default defineComponent({\n props: {\n showPopup: Boolean,\n options: Object as PropType,\n },\n emits: ['hidden'],\n setup(props, { emit }) {\n const root = shallowRef(null);\n const popup = shallowRef(null);\n let tooltip = shallowRef(null);\n function buildOptions() {\n return {\n trigger: 'manual',\n content: popup.value || undefined,\n interactive: true,\n theme: 'light',\n onHidden() {\n emit('hidden');\n },\n popperOptions: {\n strategy: 'fixed' as PositioningStrategy,\n },\n ...props.options,\n };\n }\n const openPopup = function () {\n if (!root.value || !popup.value) return;\n if (!tooltip.value) {\n tooltip.value = tippy(root.value, buildOptions());\n }\n };\n watch(toRef(props, 'showPopup'), () => {\n if (tooltip.value) {\n if (props.showPopup) {\n tooltip.value.show();\n // Popups have a tendency to create spurious selections of all text\n // within the popup body. Normally, clearing all selections like this\n // might have side effects, but because the popup has just been\n // triggered by clicking the root element, this should be okay\n if (window.getSelection) {\n if (window.getSelection()?.empty) {\n // Chrome\n window.getSelection()?.empty();\n } else if (window.getSelection()?.removeAllRanges) {\n // Firefox\n window.getSelection()?.removeAllRanges();\n }\n }\n } else {\n tooltip.value.hide();\n }\n }\n });\n watch(toRef(props, 'options'), () => {\n if (tooltip.value && popup.value) {\n tooltip.value.setProps(buildOptions());\n }\n });\n\n onMounted(openPopup);\n\n return {\n root,\n popup,\n tooltip,\n };\n },\n});\n","import { render } from \"./EdPopup.vue?vue&type=template&id=249c2314&ts=true&lang=pug\"\nimport script from \"./EdPopup.vue?vue&type=script&lang=ts\"\nexport * from \"./EdPopup.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { computed, defineComponent, PropType, ref } from 'vue';\nimport EdPopup from '@/components/utils/EdPopup.vue';\nimport { DurationMode } from '@/utils/duration';\n\nexport default defineComponent({\n name: 'InlineDuration',\n components: {\n EdPopup,\n },\n props: {\n mode: {\n type: String as PropType,\n required: true,\n },\n modelValue: Number,\n suffix: [String, Object] as PropType<\n string | { singular: string; plural: string }\n >,\n step: Number,\n buttonText: String,\n },\n emits: ['update:modelValue'],\n setup(props, { emit }) {\n const picking = ref(false);\n const singleStep = computed(() => (props.step ? props.step : 1));\n const storedValue = ref(props.modelValue);\n\n const currentSuffix = computed(() => {\n if (!props.suffix) return '';\n else if (typeof props.suffix === 'string') return props.suffix;\n else\n return storedValue.value === 1\n ? props.suffix.singular\n : props.suffix.plural;\n });\n const btnText = computed(() => {\n if (props.buttonText) return props.buttonText;\n const mainText = `${storedValue.value}`;\n return `${mainText} ${currentSuffix.value}`;\n });\n function popupHidden() {\n picking.value = false;\n const invalid =\n typeof storedValue.value !== 'number' || isNaN(storedValue.value);\n emit('update:modelValue', invalid ? 0 : storedValue.value);\n if (invalid) {\n storedValue.value = 0;\n }\n }\n function buttonClick() {\n if (!picking.value) picking.value = true;\n }\n return {\n btnText,\n currentSuffix,\n picking,\n singleStep,\n storedValue,\n popupHidden,\n buttonClick,\n };\n },\n});\n","import { render } from \"./InlineDuration.vue?vue&type=template&id=b7956808&ts=true&lang=pug\"\nimport script from \"./InlineDuration.vue?vue&type=script&lang=ts\"\nexport * from \"./InlineDuration.vue?vue&type=script&lang=ts\"\n\nimport \"./InlineDuration.vue?vue&type=style&index=0&id=b7956808&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { TripCity } from '@/services/trips/trip';\nimport { computed, defineComponent, PropType } from 'vue';\nimport InlineDuration from '@/components/utils/InlineDuration.vue';\n\nexport default defineComponent({\n components: {\n InlineDuration,\n },\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n },\n\n setup(props, { emit }) {\n const nights = computed({\n get() {\n return props.modelValue.nights || 0;\n },\n set(v: number) {\n const clone = { ...props.modelValue };\n clone.nights = v;\n emit('update:modelValue', clone);\n },\n });\n\n return { nights };\n },\n});\n","import { render } from \"./CityNightCount.vue?vue&type=template&id=9f8f6ad2&ts=true&lang=pug\"\nimport script from \"./CityNightCount.vue?vue&type=script&lang=ts\"\nexport * from \"./CityNightCount.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"form-inline\" }\nconst _hoisted_2 = { class: \"input-group\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"input-group-prepend\" }, [\n /*#__PURE__*/_createElementVNode(\"div\", { class: \"input-group-text\" }, \"$ \")\n], -1)\nconst _hoisted_4 = [\"value\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _hoisted_3,\n _createElementVNode(\"input\", {\n class: \"cost form-control\",\n type: \"number\",\n min: \"0\",\n value: _ctx.cost,\n onInput: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.updateCost && _ctx.updateCost(...args)))\n }, null, 40, _hoisted_4)\n ])\n ]))\n}","\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'CostDisplay',\n emits: ['update:cost'],\n props: {\n cost: {\n type: Number,\n required: true,\n },\n },\n setup(props, { emit }) {\n function updateCost(evt: InputEvent) {\n try {\n const value = parseInt((evt.target as HTMLInputElement).value);\n emit('update:cost', value);\n } catch (e) {\n // suppress the value, someone is putting in garbage\n }\n }\n return {\n updateCost,\n };\n },\n});\n","import { render } from \"./CostDisplay.vue?vue&type=template&id=3bd4e76c&ts=true&lang=pug\"\nimport script from \"./CostDisplay.vue?vue&type=script&lang=ts\"\nexport * from \"./CostDisplay.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export class Debouncer {\n private timeout?: number;\n private value?: T;\n constructor(\n private debounceWait: number,\n private callback: (value: T) => unknown,\n private combineDebounced?: (original: T, incoming: T) => T,\n ) {}\n\n startDebounce(value: T): void {\n if (this.timeout !== undefined && this.combineDebounced)\n this.value = this.combineDebounced(this.value as T, value);\n else this.value = value;\n clearTimeout(this.timeout);\n this.timeout = setTimeout(() => {\n this.timeout = undefined;\n this.callback(this.value as T);\n }, this.debounceWait) as unknown as number;\n }\n\n fireImmediately(): void {\n if (this.timeout !== undefined) this.callback(this.value as T);\n }\n}\n","import { TripCity } from '@/services/trips/trip';\nimport { NormalizedList, normalizeList } from '@/utils/normalized';\n\nexport interface CityCostInfo {\n id: string;\n cost: number;\n}\n\nexport class TotalCityCostCalculator {\n constructor(private readonly cities: TripCity[]) {}\n\n private getSpecialPointCosts(city: TripCity): number {\n const stay = city.stay_at?.cost || 0;\n const enter = city.enter_via?.cost || 0;\n const exit = city.exit_via?.cost || 0;\n return stay + enter + exit;\n }\n\n private calculateOneCityCost(city: TripCity): number {\n const fromCity = city.cost || 0;\n const fromPoints = city.points.reduce(\n (acc, point) => acc + (point.cost || 0),\n 0,\n );\n\n const fromSpecial = this.getSpecialPointCosts(city);\n\n return fromCity + fromPoints + fromSpecial;\n }\n\n cityCosts(): CityCostInfo[] {\n return this.cities.map((city) => ({\n id: city.id,\n cost: this.calculateOneCityCost(city),\n }));\n }\n\n normalizedCityCosts(): NormalizedList {\n return normalizeList(this.cityCosts());\n }\n\n totalCost(): number {\n return this.cityCosts().reduce((acc, cityCost) => acc + cityCost.cost, 0);\n }\n}\n","\nimport { computed, defineComponent, onUnmounted, PropType } from 'vue';\nimport { TripCity } from '@/services/trips/trip';\n\nimport EditableTitle from '@/components/utils/inputs/EditableTitle.vue';\nimport CityNightCount from '@/components/trip-view/CityNightCount.vue';\nimport CostDisplay from '@/components/utils/CostDisplay.vue';\nimport { Debouncer } from '@/utils/Debouncer';\nimport { TotalCityCostCalculator } from '@/parts/TotalCityCostCalculator';\n\nconst NOTE_DEBOUNCE = 1000;\n\nexport default defineComponent({\n components: {\n EditableTitle,\n CityNightCount,\n CostDisplay,\n },\n props: {\n modelValue: {\n required: true,\n type: Object as PropType,\n },\n },\n setup(props, { emit }) {\n const changeDebounce = new Debouncer(\n NOTE_DEBOUNCE,\n (data: Partial) => patchAndEmitCity(data),\n (existing: Partial, newData: Partial) => ({\n ...existing,\n ...newData,\n }),\n );\n\n function patchAndEmitCity(patch: Partial) {\n const newCity: TripCity = { ...props.modelValue, ...patch };\n emit('update:modelValue', newCity);\n }\n\n function scheduleCostUpdate(cost: number) {\n changeDebounce.startDebounce({ cost });\n }\n\n function scheduleNoteUpdate(event: InputEvent) {\n const notes = (event?.target as HTMLTextAreaElement).value;\n changeDebounce.startDebounce({ notes });\n }\n\n onUnmounted(() => {\n changeDebounce.fireImmediately();\n });\n\n const cityCost = computed(() =>\n new TotalCityCostCalculator([props.modelValue]).totalCost(),\n );\n\n return {\n patchAndEmitCity,\n scheduleNoteUpdate,\n scheduleCostUpdate,\n cityCost,\n };\n },\n});\n","import { render } from \"./CityModalContent.vue?vue&type=template&id=4653b094&ts=true&lang=pug\"\nimport script from \"./CityModalContent.vue?vue&type=script&lang=ts\"\nexport * from \"./CityModalContent.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, normalizeStyle as _normalizeStyle, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"d-flex flex-row tcv\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"tcv-left-padder me-1\" }, null, -1)\nconst _hoisted_3 = { class: \"d-flex flex-column single-city-wrapper flex-grow-1\" }\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"hr\", { class: \"m-1\" }, null, -1)\nconst _hoisted_5 = { class: \"text-center small text-nowrap\" }\nconst _hoisted_6 = {\n key: 1,\n class: \"text-center small text-nowrap day-label day-time\"\n}\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"w-100 d-flex flex-row justify-content-center tcv-exit-dots\" }, [\n /*#__PURE__*/_createElementVNode(\"i\", { class: \"fas fa-ellipsis-h\" })\n], -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_point_modal_content = _resolveComponent(\"point-modal-content\")!\n const _component_point_list_item = _resolveComponent(\"point-list-item\")!\n const _component_point_travel_info = _resolveComponent(\"point-travel-info\")!\n const _component_city_point_time = _resolveComponent(\"city-point-time\")!\n const _component_overnight_modal_content = _resolveComponent(\"overnight-modal-content\")!\n const _component_point_list = _resolveComponent(\"point-list\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"div\", _hoisted_3, [\n _createVNode(_component_point_list_item, {\n class: \"tcv-stay-at flex-grow-1\",\n name: _ctx.singlePoints['stay_at'].name.value,\n \"allow-settings\": !!_ctx.modelValue.stay_at,\n \"allow-centering\": true,\n \"allow-delete\": false,\n handle: false,\n onSearchComplete: _cache[0] || (_cache[0] = ($event: any) => (_ctx.singlePoints['stay_at'].change($event))),\n onCenterOnThis: _cache[1] || (_cache[1] = ($event: any) => (_ctx.singlePoints['stay_at'].centerMap())),\n \"icon-class\": _ctx.singlePoints['stay_at'].iconClass.value,\n \"item-class\": \"tcv-hoverable\",\n \"item-description\": \"Stay Somewhere?\",\n \"item-hover\": \"Home sweet home. Sleep here, then go out and explore!\",\n onMouseover: _cache[2] || (_cache[2] = ($event: any) => (_ctx.setHoverPoint(_ctx.modelValue.stay_at))),\n onMouseleave: _cache[3] || (_cache[3] = ($event: any) => (_ctx.clearHoverPoint(_ctx.modelValue.stay_at)))\n }, {\n settings: _withCtx(() => [\n _createVNode(_component_point_modal_content, {\n modelValue: _ctx.modelValue.stay_at,\n \"onUpdate:modelValue\": _ctx.singlePoints['stay_at'].boundSet\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])\n ]),\n _: 1\n }, 8, [\"name\", \"allow-settings\", \"icon-class\"]),\n _hoisted_4,\n _createVNode(_component_point_list_item, {\n class: \"tcv-enter flex-grow-1 mb-1\",\n name: _ctx.singlePoints['enter_via'].name.value,\n \"allow-inline\": true,\n \"allow-settings\": !!_ctx.modelValue.enter_via,\n \"allow-centering\": true,\n \"allow-delete\": false,\n handle: false,\n onSearchComplete: _cache[4] || (_cache[4] = ($event: any) => (_ctx.singlePoints['enter_via'].change($event))),\n onCenterOnThis: _cache[5] || (_cache[5] = ($event: any) => (_ctx.singlePoints['enter_via'].centerMap())),\n \"icon-class\": _ctx.singlePoints['enter_via'].iconClass.value,\n \"item-class\": \"tcv-hoverable\",\n \"item-description\": \"Arrival\",\n \"item-hover\": \"Arrival point for your plane, train, or magic carpet.\",\n style: _normalizeStyle(_ctx.startBottomBorderStyle),\n onMouseover: _cache[6] || (_cache[6] = ($event: any) => (_ctx.setHoverPoint(_ctx.modelValue.enter_via))),\n onMouseleave: _cache[7] || (_cache[7] = ($event: any) => (_ctx.clearHoverPoint(_ctx.modelValue.enter_via)))\n }, {\n inline: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.getDayDisplayString(0)), 1)\n ]),\n settings: _withCtx(() => [\n _createVNode(_component_point_modal_content, {\n modelValue: _ctx.modelValue.enter_via,\n \"onUpdate:modelValue\": _ctx.singlePoints['enter_via'].boundSet\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])\n ]),\n _: 1\n }, 8, [\"name\", \"allow-settings\", \"icon-class\", \"style\"]),\n (_ctx.modelValue.enter_via)\n ? (_openBlock(), _createBlock(_component_point_travel_info, {\n key: 0,\n modelValue: _ctx.modelValue.enter_via,\n route: _ctx.legOptions.values[_ctx.modelValue.enter_via.id].options,\n \"onUpdate:modelValue\": _ctx.singlePoints['enter_via'].boundSet\n }, null, 8, [\"modelValue\", \"route\", \"onUpdate:modelValue\"]))\n : _createCommentVNode(\"\", true),\n _createVNode(_component_point_list, {\n class: \"city-point-list flex-grow-1\",\n modelValue: _ctx.normalizedPoints,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = ($event: any) => ((_ctx.normalizedPoints) = $event)),\n onAddSearched: _ctx.addSearched,\n \"id-icon-map\": _ctx.iconMap,\n \"id-border-map\": _ctx.borderMap,\n \"item-class\": \"tcv-hoverable\",\n onItemHoverStart: _ctx.setHoverPoint,\n onItemHoverEnd: _ctx.clearHoverPoint\n }, {\n inline: _withCtx(({point, updatePoint}) => [\n _createElementVNode(\"div\", null, [\n (!point.is_overnight)\n ? (_openBlock(), _createBlock(_component_city_point_time, {\n key: 0,\n modelValue: point,\n \"start-time\": _ctx.getTimeInfo(point.id, 'startTime'),\n \"end-time\": _ctx.getTimeInfo(point.id, 'endTime'),\n \"use-time-of-day\": _ctx.displayOpts.useConcreteTime,\n \"onUpdate:modelValue\": updatePoint\n }, null, 8, [\"modelValue\", \"start-time\", \"end-time\", \"use-time-of-day\", \"onUpdate:modelValue\"]))\n : (point.is_overnight)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, _toDisplayString(_ctx.getDayDisplayString(_ctx.normalizedDays.values[point.id].day)), 1))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n settings: _withCtx(({point, updatePoint}) => [\n (!point.is_overnight)\n ? (_openBlock(), _createBlock(_component_point_modal_content, {\n key: 0,\n modelValue: point,\n \"onUpdate:modelValue\": updatePoint\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"]))\n : (point.is_overnight)\n ? (_openBlock(), _createBlock(_component_overnight_modal_content, {\n key: 1,\n modelValue: point,\n \"onUpdate:modelValue\": updatePoint,\n \"default-hour\": _ctx.defaultDayHour,\n \"default-minute\": _ctx.defaultDayMinute\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"default-hour\", \"default-minute\"]))\n : _createCommentVNode(\"\", true)\n ]),\n intermediate: _withCtx(({point, updatePoint}) => [\n (_ctx.showPointTravelOptions(point.id))\n ? (_openBlock(), _createBlock(_component_point_travel_info, {\n key: 0,\n modelValue: point,\n route: _ctx.legOptions.values[point.id].options,\n \"onUpdate:modelValue\": updatePoint\n }, null, 8, [\"modelValue\", \"route\", \"onUpdate:modelValue\"]))\n : _createCommentVNode(\"\", true)\n ]),\n _: 1\n }, 8, [\"modelValue\", \"onAddSearched\", \"id-icon-map\", \"id-border-map\", \"onItemHoverStart\", \"onItemHoverEnd\"]),\n _hoisted_7,\n _createVNode(_component_point_list_item, {\n class: \"tcv-exit flex-grow-1\",\n name: _ctx.singlePoints['exit_via'].name.value,\n \"allow-settings\": !!_ctx.modelValue.exit_via,\n \"allow-centering\": true,\n \"allow-delete\": false,\n handle: false,\n onSearchComplete: _cache[9] || (_cache[9] = ($event: any) => (_ctx.singlePoints['exit_via'].change($event))),\n onCenterOnThis: _cache[10] || (_cache[10] = ($event: any) => (_ctx.singlePoints['exit_via'].centerMap())),\n \"icon-class\": _ctx.singlePoints['exit_via'].iconClass.value,\n \"item-class\": \"tcv-hoverable\",\n \"item-description\": \"Departure\",\n \"item-hover\": \"Depart from here, headed to your next adventure.\",\n onMouseover: _cache[11] || (_cache[11] = ($event: any) => (_ctx.setHoverPoint(_ctx.modelValue.exit_via))),\n onMouseleave: _cache[12] || (_cache[12] = ($event: any) => (_ctx.clearHoverPoint(_ctx.modelValue.exit_via)))\n }, {\n settings: _withCtx(() => [\n _createVNode(_component_point_modal_content, {\n modelValue: _ctx.modelValue.exit_via,\n \"onUpdate:modelValue\": _ctx.singlePoints['exit_via'].boundSet\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])\n ]),\n _: 1\n }, 8, [\"name\", \"allow-settings\", \"icon-class\"])\n ])\n ]))\n}","import { computed, ComputedRef, Ref } from 'vue';\nimport { DisplayablePointOfInterest } from '@/map-display';\nimport { TripCity, TripCityPoint, TripPointType } from '@/services/trips/trip';\nimport { DI } from '@/di';\nimport { TripIconSet } from '@/services/trips/trip-icon-set.interface';\nimport {\n CITY_DAY_COLORS,\n CITY_DAY_HIGHLIGHTS,\n CITY_STAY_AT_PIN_COLOR,\n CITY_STAY_AT_PIN_HIGHLIGHT,\n CITY_VIA_PIN_COLOR,\n CITY_VIA_PIN_HIGHLIGHT,\n} from '@/icon-styling';\n\ntype ManagedPoint = DisplayablePointOfInterest & TripCityPoint;\ntype PointArray = (DisplayablePointOfInterest & TripCityPoint)[];\n\nexport interface AnnotatedPoint {\n day: number;\n point: T;\n}\n\nfunction convertPoint(\n point: TripCityPoint,\n type?: TripPointType,\n color?: string,\n highlightColor?: string,\n): ManagedPoint;\nfunction convertPoint(\n point: TripCityPoint | null,\n type?: TripPointType,\n color?: string,\n highlightColor?: string,\n): ManagedPoint | null;\nfunction convertPoint(\n point: TripCityPoint | null,\n type?: TripPointType,\n color?: string,\n highlightColor?: string,\n): ManagedPoint | null {\n if (point == null) return null;\n return {\n ...point,\n displayOptions: {\n iconClass: DI.get(TripIconSet).getTripIconClass(\n type || point.type,\n ),\n color: color,\n highlightColor: highlightColor,\n },\n };\n}\n\nexport class CitySpecialPointFinder {\n readonly enterExitPoints: ComputedRef;\n readonly enterPoint: ComputedRef;\n readonly exitPoint: ComputedRef;\n readonly stayPoint: ComputedRef;\n readonly allSpecials: ComputedRef;\n\n constructor(private readonly city: Ref) {\n this.enterPoint = computed(() => {\n return convertPoint(\n this.city.value.enter_via,\n this.city.value.enter_via?.type || TripPointType.ARRIVAL,\n CITY_VIA_PIN_COLOR,\n CITY_VIA_PIN_HIGHLIGHT,\n );\n });\n this.exitPoint = computed(() => {\n return convertPoint(\n this.city.value.exit_via,\n this.city.value.exit_via?.type || TripPointType.AIRPORT,\n CITY_VIA_PIN_COLOR,\n CITY_VIA_PIN_HIGHLIGHT,\n );\n });\n this.stayPoint = computed(() => {\n return convertPoint(\n this.city.value.stay_at,\n this.city.value.stay_at?.type || TripPointType.HOTEL,\n CITY_STAY_AT_PIN_COLOR,\n CITY_STAY_AT_PIN_HIGHLIGHT,\n );\n });\n this.enterExitPoints = computed(() => {\n const combinedPoints = [];\n if (this.enterPoint.value) combinedPoints.push(this.enterPoint.value);\n if (this.exitPoint.value) combinedPoints.push(this.exitPoint.value);\n return combinedPoints;\n });\n this.allSpecials = computed(() => {\n const cp = this.enterExitPoints.value.map((p) => p);\n if (this.stayPoint.value) {\n if (this.city.value.enter_via) {\n cp.splice(1, 0, this.stayPoint.value);\n } else {\n cp.splice(0, 0, this.stayPoint.value);\n }\n }\n return cp;\n });\n }\n}\n\nexport class CityPointAnnotator {\n readonly pointsWithoutSpecials: ComputedRef[]>;\n readonly pointsWithSpecials: ComputedRef[]>;\n\n constructor(private readonly city: Ref) {\n this.pointsWithSpecials = computed(() => this.getPointsWithSpecials());\n this.pointsWithoutSpecials = computed(() =>\n this.getPointsWithoutSpecials(),\n );\n }\n\n getWithVerifiedOvernights(): TripCityPoint[] {\n const stay_at: TripCityPoint | null = this.city.value.stay_at;\n\n let overnightCount = 0;\n const fixedOvernights = this.city.value.points.filter((p) => {\n if (p.is_overnight) {\n if (overnightCount >= this.city.value.nights) {\n return false;\n }\n ++overnightCount;\n }\n return true;\n });\n\n for (; overnightCount < this.city.value.nights; ++overnightCount) {\n fixedOvernights.push({\n type: stay_at?.type || TripPointType.OTHER,\n lat: stay_at ? stay_at.lat : this.city.value.lat,\n lng: stay_at ? stay_at.lng : this.city.value.lng,\n name: stay_at ? stay_at.name : this.city.value.name,\n place_id: stay_at ? stay_at.place_id : this.city.value.place_id,\n minutes: 0,\n is_overnight: true,\n notes: '',\n outgoing_travel: null,\n id: `overnight-${overnightCount + 1}`,\n });\n }\n\n return fixedOvernights;\n }\n\n getAnnotatedPoints(): AnnotatedPoint[] {\n let day = 0;\n return this.getWithVerifiedOvernights().map((elem) => {\n if (elem.is_overnight) ++day;\n return { day, point: elem };\n });\n }\n\n getPointsWithoutSpecials(): AnnotatedPoint[] {\n return this.getAnnotatedPoints().filter(\n (p) => !p.point.is_overnight,\n ) as AnnotatedPoint[];\n }\n\n getPointsWithSpecials(): AnnotatedPoint[] {\n return this.city.value.stay_at\n ? this.getAnnotatedPoints()\n : this.getPointsWithoutSpecials();\n }\n}\n\nexport class CityPointFlattener {\n readonly flatCityPoints: ComputedRef;\n\n constructor(\n specialFinder: CitySpecialPointFinder,\n annotator: CityPointAnnotator,\n ) {\n this.flatCityPoints = computed(() => {\n const noSpecials = annotator.pointsWithoutSpecials.value.map((p) =>\n convertPoint(\n p.point,\n p.point.type,\n CITY_DAY_COLORS[p.day % CITY_DAY_COLORS.length],\n CITY_DAY_HIGHLIGHTS[p.day % CITY_DAY_HIGHLIGHTS.length],\n ),\n );\n\n return noSpecials.concat(specialFinder.allSpecials.value);\n });\n }\n}\n","import { renderSlot as _renderSlot, resolveComponent as _resolveComponent, normalizeStyle as _normalizeStyle, withCtx as _withCtx, createVNode as _createVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"d-flex flex-column\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_point_list_item = _resolveComponent(\"point-list-item\")!\n const _component_draggable = _resolveComponent(\"draggable\")!\n const _component_hidden_finder = _resolveComponent(\"hidden-finder\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_draggable, {\n modelValue: _ctx.draggableList,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.draggableList) = $event)),\n group: _ctx.actualDragGroup,\n \"item-key\": \"id\",\n handle: \".pli-handle\",\n \"force-fallback\": true\n }, {\n item: _withCtx(({element}) => [\n _createElementVNode(\"div\", null, [\n _createVNode(_component_point_list_item, {\n class: \"w-100 mb-1 flex-grow-1\",\n name: element.name,\n \"allow-expansion\": !!_ctx.$slots.expansion,\n \"allow-settings\": !!_ctx.$slots.settings,\n \"allow-inline\": !!_ctx.$slots.inline,\n \"item-class\": _ctx.itemClass,\n \"pad-all\": _ctx.padAll,\n locked: !!element.locked,\n \"icon-class\": _ctx.idIconMap ? _ctx.idIconMap[element.id] : undefined,\n style: _normalizeStyle(_ctx.getItemBorder(element.id)),\n onSearchComplete: ($event: any) => (_ctx.changePoint(element.id, $event)),\n onDelete: ($event: any) => (_ctx.deletePoint(element.id)),\n onCenterOnThis: ($event: any) => (_ctx.centerOnItem(element.id)),\n onMouseover: ($event: any) => (_ctx.$emit(\"itemHoverStart\", element.id)),\n onMouseleave: ($event: any) => (_ctx.$emit(\"itemHoverEnd\", element.id))\n }, {\n inline: _withCtx(() => [\n _renderSlot(_ctx.$slots, \"inline\", {\n point: element,\n updatePoint: (p) => _ctx.updatePoint(element.id, p)\n })\n ]),\n settings: _withCtx(() => [\n _renderSlot(_ctx.$slots, \"settings\", {\n point: element,\n updatePoint: (p) => _ctx.updatePoint(element.id, p)\n })\n ]),\n expansion: _withCtx(() => [\n _renderSlot(_ctx.$slots, \"expansion\", {\n point: element,\n updatePoint: (p) => _ctx.updatePoint(element.id, p)\n })\n ]),\n _: 2\n }, 1032, [\"name\", \"allow-expansion\", \"allow-settings\", \"allow-inline\", \"item-class\", \"pad-all\", \"locked\", \"icon-class\", \"style\", \"onSearchComplete\", \"onDelete\", \"onCenterOnThis\", \"onMouseover\", \"onMouseleave\"]),\n _renderSlot(_ctx.$slots, \"intermediate\", {\n point: element,\n updatePoint: (p) => _ctx.updatePoint(element.id, p)\n })\n ])\n ]),\n _: 3\n }, 8, [\"modelValue\", \"group\"]),\n _createVNode(_component_hidden_finder, {\n class: \"w-100\",\n \"clear-on-chosen\": true,\n onLocationChosen: _ctx.addPoint,\n \"focus-on-chosen\": true\n }, null, 8, [\"onLocationChosen\"])\n ]))\n}","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hidden-finder\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_location_finder = _resolveComponent(\"location-finder\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.hidden)\n ? (_openBlock(), _createElementBlock(\"i\", {\n key: 0,\n class: \"bi-plus primary-clickable\",\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.hidden=false))\n }))\n : (_openBlock(), _createBlock(_component_location_finder, {\n key: 1,\n class: \"hidden-finder-actual w-100\",\n onLocationChosen: _ctx.locationChosen,\n \"clear-on-chosen\": _ctx.clearOnChosen,\n \"take-mount-focus\": true,\n \"focus-on-chosen\": _ctx.focusOnChosen,\n onUnsearch: _cache[1] || (_cache[1] = ($event: any) => (_ctx.hidden=true))\n }, null, 8, [\"onLocationChosen\", \"clear-on-chosen\", \"focus-on-chosen\"]))\n ]))\n}","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, vModelText as _vModelText, withKeys as _withKeys, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = [\"title\"]\nconst _hoisted_2 = {\n key: 0,\n class: \"text-danger fas fa-exclamation-circle small me-1\",\n title: \"Pick a result to save search changes.\"\n}\nconst _hoisted_3 = { class: \"ed-scrollable lf-result-root\" }\nconst _hoisted_4 = [\"onClick\", \"onMouseover\", \"onMouseleave\"]\nconst _hoisted_5 = {\n key: 0,\n class: \"result-detail\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_ed_popup = _resolveComponent(\"ed-popup\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"lf-root align-middle w-100\",\n title: _ctx.hoverInfoText\n }, [\n _createVNode(_component_ed_popup, {\n showPopup: _ctx.showPopup,\n options: {placement: 'bottom', arrow: false, interactive: true},\n onHidden: _cache[5] || (_cache[5] = ($event: any) => (_ctx.wasHidden = true))\n }, {\n root: _withCtx(() => [\n _createElementVNode(\"div\", {\n class: \"lf-name-container d-flex align-items-center lf-core w-100\",\n onClick: _cache[4] || (_cache[4] = ($event: any) => (_ctx.swapToSearch()))\n }, [\n (!_ctx.editing && _ctx.nameMismatch)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_2))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"lf-location-name lf-core\", {invisible: _ctx.editing, \"text-secondary\": !_ctx.locationName }])\n }, _toDisplayString(_ctx.locationName || _ctx.fallbackInfoText), 3),\n _withDirectives(_createElementVNode(\"input\", {\n class: _normalizeClass([\"lf-location-search lf-core form-control w-100\", {invisible: !_ctx.editing}]),\n ref: \"searchBox\",\n type: \"search\",\n placeholder: \"Find a Location\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.locationName) = $event)),\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.selected=true)),\n onBlur: _cache[2] || (_cache[2] = ($event: any) => (_ctx.maybeUnsearch($event))),\n onKeyup: _cache[3] || (_cache[3] = _withKeys(($event: any) => (_ctx.loadFinalResults()), [\"enter\"]))\n }, null, 34), [\n [_vModelText, _ctx.locationName]\n ])\n ])\n ]),\n popup: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"lf-results\", {show: _ctx.showResults}]),\n ref: \"resultDiv\"\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.results, (res, i) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"d-flex flex-column lf-single-result p-1\",\n onClick: ($event: any) => (_ctx.itemClicked(i, res)),\n onMouseover: ($event: any) => (_ctx.setHighlight(i)),\n onMouseleave: ($event: any) => (_ctx.removeHighlight(i))\n }, [\n _createElementVNode(\"div\", null, _toDisplayString(res.name), 1),\n (res.detail)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, _toDisplayString(res.detail), 1))\n : _createCommentVNode(\"\", true)\n ], 40, _hoisted_4))\n }), 256))\n ], 2)\n ])\n ]),\n _: 1\n }, 8, [\"showPopup\"])\n ], 8, _hoisted_1))\n}","import { DI } from '@/di';\nimport { LocationSearchRequest } from '@/services/map-service/location-search/search-request';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\nimport { computed, Ref, ref } from 'vue';\nimport { LocationSearchService } from '@/services/map-service/location-search/location-search.interface';\nimport { MapDisplayInfoService } from '@/services/map-service/display-info/map-display-info.interface';\n\nexport class LocationSearchComponent {\n readonly searchService = DI.get>(\n LocationSearchService,\n );\n readonly mapService = DI.get(MapDisplayInfoService);\n readonly results = ref([]);\n readonly showResults = computed(\n () =>\n this.searchText.value.length > 0 &&\n this.results.value.length > 0 &&\n this.searching.value,\n );\n\n constructor(\n private readonly searchText: Ref,\n private readonly searching: Ref,\n ) {}\n\n async loadResults(isAuto: boolean): Promise {\n const zoom = this.mapService.getMapZoom();\n const searchRequest: LocationSearchRequest = {\n input: this.searchText.value,\n isAutocomplete: isAuto,\n findCloseTo: this.mapService.getMapCenter(),\n mapZoom: zoom ? Math.floor(zoom) : undefined,\n };\n try {\n const unwrappedResults = await this.searchService.doLocationSearch(\n searchRequest,\n );\n this.results.value = ref(unwrappedResults).value;\n } catch (e) {\n this.results.value = [];\n }\n }\n\n loadFinalResults(): void {\n void this.loadResults(false);\n }\n\n resetResults(): void {\n this.results.value = [];\n }\n\n setup(): void {\n // For consistency\n }\n}\n","import { ref, onUnmounted, Ref, computed, ComputedRef } from 'vue';\nimport { DI } from '@/di';\nimport {\n SEARCH_PIN_ICON_CLASS,\n SEARCH_HIGHLIGHT_PIN_COLOR,\n SEARCH_PIN_Z_INDEX,\n} from '@/icon-styling';\nimport {\n DisplayableMapPoint,\n PointSet,\n PointSetDisplayType,\n} from '@/map-display';\nimport { MapDisplayInfoService } from '@/services/map-service/display-info/map-display-info.interface';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\nimport { PointSetService } from '@/services/map-service/points/point-set.interface';\n\n/**\n * Manages the display of search results on the map.\n */\nexport class ResultDisplayManager {\n readonly pointSetService = DI.get(PointSetService);\n readonly mapService = DI.get(MapDisplayInfoService);\n displayed: ComputedRef>;\n mounted = ref(true);\n private readonly points: Ref;\n private readonly highlighted: Ref = ref(-1);\n\n constructor(\n /// A list of results to display\n private readonly results: Ref,\n /// Whether the map should be focused on a result when it gets highlighted\n private readonly focusOnHighlight: Ref,\n ) {\n this.points = computed(() =>\n this.mounted.value\n ? this.results.value.map((res, idx) => ({\n displayOptions: {\n color:\n idx == this.highlighted.value ? SEARCH_HIGHLIGHT_PIN_COLOR : '',\n },\n ...res.location,\n }))\n : [],\n );\n\n this.displayed = computed(() => {\n const set = new PointSet(\n this.points.value,\n PointSetDisplayType.Markers,\n SEARCH_PIN_ICON_CLASS,\n );\n set.zIndex = SEARCH_PIN_Z_INDEX;\n return set;\n });\n this.pointSetService.addPointSet(this.displayed);\n }\n\n setHighlight(index: number): void {\n this.highlighted.value = index;\n if (this.focusOnHighlight.value) this.focusMapOnResult(index);\n }\n\n removeHighlight(index: number): void {\n if (this.highlighted.value == index) this.highlighted.value = -1;\n }\n\n focusMapOnResult(index: number): void {\n this.mapService.setMapCenter(this.results.value[index].location);\n }\n\n setup(): void {\n onUnmounted(() => this.pointSetService.removePointSet(this.displayed));\n }\n}\n","\nimport {\n computed,\n defineComponent,\n nextTick,\n onMounted,\n ref,\n toRef,\n watch,\n} from 'vue';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\nimport { LocationSearchComponent } from '../../parts/LocationSearchComponent';\nimport { ResultDisplayManager } from '../../parts/ResultDisplayManager';\nimport EdPopup from '@/components/utils/EdPopup.vue';\n\nexport default defineComponent({\n name: 'LocationFinder',\n components: {\n EdPopup,\n },\n props: {\n clearOnChosen: Boolean,\n focusOnChosen: Boolean,\n location: String,\n takeMountFocus: Boolean,\n fallbackInfoText: String,\n hoverInfoText: String,\n },\n setup(props, { emit }) {\n const locationName = ref(props.location || '');\n const nameAtSearchStart = ref(locationName.value);\n const selected = ref(false);\n const searchBox = ref(null);\n const resultDiv = ref(null);\n const wasHidden = ref(true);\n const editing = computed(\n () =>\n (selected.value || locationName.value.length == 0) && !wasHidden.value,\n );\n\n const searchComponent = new LocationSearchComponent(locationName, editing);\n\n const nameMismatch = computed(\n () => !editing.value && nameAtSearchStart.value != locationName.value,\n );\n\n const showPopup = computed(\n () => searchComponent.showResults.value && !wasHidden.value,\n );\n const displayedResults = computed(() =>\n searchComponent.showResults.value ? searchComponent.results.value : [],\n );\n\n const resultDisplay = new ResultDisplayManager(\n displayedResults,\n toRef(props, 'focusOnChosen'),\n );\n function itemClicked(i: number, result: SearchResult) {\n if (props.focusOnChosen) resultDisplay.focusMapOnResult(i);\n selected.value = false;\n emit('locationChosen', result);\n\n locationName.value = props.clearOnChosen ? '' : result.name;\n searchComponent.resetResults();\n nameAtSearchStart.value = locationName.value;\n }\n\n function swapToSearch() {\n wasHidden.value = false;\n if (!selected.value) {\n selected.value = true;\n }\n nextTick(() => searchBox.value?.focus());\n }\n\n function maybeUnsearch(evt: FocusEvent) {\n // Never unsearch when displaying tooltip\n if (showPopup.value) return;\n if (\n !evt.relatedTarget ||\n !resultDiv.value?.contains(evt.relatedTarget as Node)\n ) {\n selected.value = false;\n if (locationName.value.length == 0)\n locationName.value = nameAtSearchStart.value;\n emit('unsearch');\n }\n }\n\n watch(locationName, () => {\n if (locationName.value.length == 0) {\n searchComponent.resetResults();\n }\n });\n\n watch(toRef(props, 'location'), (newLoc) => {\n if (newLoc) {\n locationName.value = newLoc;\n nameAtSearchStart.value = newLoc;\n }\n });\n\n if (props.takeMountFocus)\n onMounted(() => {\n swapToSearch();\n });\n\n searchComponent.setup();\n resultDisplay.setup();\n return {\n swapToSearch,\n maybeUnsearch,\n selected,\n locationName,\n searchBox,\n resultDiv,\n editing,\n results: searchComponent.results,\n showResults: searchComponent.showResults,\n displayedResults,\n loadFinalResults: () => searchComponent.loadFinalResults(),\n itemClicked,\n setHighlight: (i: number) => resultDisplay.setHighlight(i),\n removeHighlight: (i: number) => resultDisplay.removeHighlight(i),\n searchComponent,\n showPopup,\n wasHidden,\n nameMismatch,\n nameAtSearchStart,\n };\n },\n});\n","import { render } from \"./LocationFinder.vue?vue&type=template&id=411617ac&ts=true&lang=pug\"\nimport script from \"./LocationFinder.vue?vue&type=script&lang=ts\"\nexport * from \"./LocationFinder.vue?vue&type=script&lang=ts\"\n\nimport \"./LocationFinder.vue?vue&type=style&index=0&id=411617ac&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { defineComponent, ref } from 'vue';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\nimport LocationFinder from './LocationFinder.vue';\n\nexport default defineComponent({\n name: 'HiddenFinder',\n components: {\n LocationFinder,\n },\n props: {\n clearOnChosen: Boolean,\n focusOnChosen: Boolean,\n },\n setup(props, { emit }) {\n const hidden = ref(true);\n\n function locationChosen(result: SearchResult) {\n emit('locationChosen', result);\n if (props.clearOnChosen) hidden.value = true;\n }\n\n return {\n hidden,\n locationChosen,\n };\n },\n});\n","import { render } from \"./HiddenFinder.vue?vue&type=template&id=7dd1dbac&ts=true&lang=pug\"\nimport script from \"./HiddenFinder.vue?vue&type=script&lang=ts\"\nexport * from \"./HiddenFinder.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, toDisplayString as _toDisplayString, renderSlot as _renderSlot, withCtx as _withCtx, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"d-flex flex-row align-items-center justify-content-between\" }\nconst _hoisted_2 = {\n key: 3,\n class: \"pli-lf pli-locked flex-grow-1 h-100 small\"\n}\nconst _hoisted_3 = {\n key: 4,\n class: \"pl-inline-item\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_location_finder = _resolveComponent(\"location-finder\")!\n const _component_fa_icon_modal_trigger = _resolveComponent(\"fa-icon-modal-trigger\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"pli-root ps-1 pe-1\", _ctx.itemClass ? [_ctx.itemClass] : []])\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"i\", {\n class: _normalizeClass([\"pli-handle bi-list primary-clickable pli-on-hover me-1\", {invisible: !_ctx.handle}])\n }, null, 2),\n (!_ctx.locked && _ctx.allowExpansion)\n ? (_openBlock(), _createElementBlock(\"i\", {\n key: 0,\n class: _normalizeClass([\"pli-expand faded primary-clickable bi-chevron-right m-auto me-1\", {expanded: _ctx.expanded}]),\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.expanded=!_ctx.expanded))\n }, null, 2))\n : _createCommentVNode(\"\", true),\n (!!_ctx.iconClass)\n ? (_openBlock(), _createElementBlock(\"i\", {\n key: 1,\n class: _normalizeClass([\"pli-icon me-1\", [_ctx.iconClass]])\n }, null, 2))\n : _createCommentVNode(\"\", true),\n (!_ctx.locked)\n ? (_openBlock(), _createBlock(_component_location_finder, {\n key: 2,\n class: \"pli-lf flex-grow-1 h-100\",\n location: _ctx.name,\n onLocationChosen: _ctx.emitPointChange,\n \"focus-on-chosen\": true,\n \"fallback-info-text\": _ctx.itemDescription,\n \"hover-info-text\": _ctx.itemHover\n }, null, 8, [\"location\", \"onLocationChosen\", \"fallback-info-text\", \"hover-info-text\"]))\n : _createCommentVNode(\"\", true),\n (_ctx.locked)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString(_ctx.name), 1))\n : _createCommentVNode(\"\", true),\n (_ctx.allowInline)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n _renderSlot(_ctx.$slots, \"inline\")\n ]))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"pli-on-hover pli-settings\", {invisible: !_ctx.allowSettings}])\n }, [\n _createVNode(_component_fa_icon_modal_trigger, {\n \"icon-class\": \"fa-up-right-and-down-left-from-center\",\n \"closed-class\": \"fa-down-left-and-up-right-to-center\"\n }, {\n default: _withCtx(() => [\n _renderSlot(_ctx.$slots, \"settings\")\n ]),\n _: 3\n })\n ], 2),\n _createElementVNode(\"i\", {\n class: _normalizeClass([\"pli-center pli-on-hover bi-geo-alt-fill primary-clickable m-auto ms-1 me-1\", {invisible: !_ctx.allowCentering}]),\n onClick: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.centerMapOnPoint && _ctx.centerMapOnPoint(...args)))\n }, null, 2),\n _createElementVNode(\"i\", {\n class: _normalizeClass([\"pli-delete pli-on-hover bi-trash-fill danger-clickable m-auto\", {invisible: _ctx.locked || !_ctx.allowDelete}]),\n onClick: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.emitDelete && _ctx.emitDelete(...args)))\n }, null, 2)\n ]),\n (!_ctx.locked && _ctx.doExpansion)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: _normalizeClass([\"w-100\", {\"p-1\": _ctx.padAll}])\n }, [\n (!_ctx.locked && _ctx.doExpansion)\n ? _renderSlot(_ctx.$slots, \"expansion\", { key: 0 })\n : _createCommentVNode(\"\", true)\n ], 2))\n : _createCommentVNode(\"\", true)\n ], 2))\n}","import { withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, renderSlot as _renderSlot, resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_ed_modal = _resolveComponent(\"ed-modal\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"i\", {\n class: _normalizeClass([\"fas modal-trigger primary-clickable\", _ctx.classes]),\n onClick: _cache[0] || (_cache[0] = _withModifiers(($event: any) => (_ctx.control.modalOpened()), [\"stop\"])),\n onMouseenter: _cache[1] || (_cache[1] = ($event: any) => (_ctx.control.modalTriggerEntered()))\n }, null, 34),\n (_ctx.show)\n ? (_openBlock(), _createBlock(_component_ed_modal, {\n key: 0,\n onHide: _cache[2] || (_cache[2] = ($event: any) => (_ctx.control.modalHidden()))\n }, {\n default: _withCtx(() => [\n _renderSlot(_ctx.$slots, \"default\")\n ]),\n _: 3\n }))\n : _createCommentVNode(\"\", true)\n ], 64))\n}","import { ref } from 'vue';\n\nexport class ModalControl {\n /*\n * Tracking for hide, to prevent reopening if the button is clicked to close\n * the modal.\n *\n * When hidden, we'll assume it was local. We'll correct that assumption if\n * the mouse enters the button.\n */\n readonly showModal = ref(false);\n private readonly wasLocalHide = ref(false);\n\n modalOpened(): void {\n if (!this.wasLocalHide.value) this.showModal.value = true;\n this.wasLocalHide.value = false;\n }\n\n modalHidden(): void {\n this.wasLocalHide.value = true;\n this.showModal.value = false;\n }\n\n modalTriggerEntered(): void {\n this.wasLocalHide.value = false;\n }\n}\n","import { renderSlot as _renderSlot, createElementVNode as _createElementVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-0dceadfd\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"ed-modal-root ed-scrollable d-flex flex-column align-items-center\",\n ref: \"modal\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createBlock(_Teleport, { to: \"body\" }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _renderSlot(_ctx.$slots, \"default\", {}, undefined, true)\n ], 512)\n ]))\n}","\nimport { defineComponent, onMounted, onUnmounted, ref, Ref } from 'vue';\nimport {\n GlobalClickObserver,\n GlobalClickTracker,\n} from '@/services/focus/global-click-tracker.interface';\nimport { DI } from '@/di';\n\nexport default defineComponent({\n name: 'EdModal',\n emits: ['hide'],\n setup(_props, ctx) {\n const tracker = DI.get(GlobalClickTracker);\n const modal: Ref = ref(null);\n\n const obs: GlobalClickObserver = {\n onClick(target: EventTarget) {\n if (\n modal.value &&\n target instanceof Node &&\n !modal.value.contains(target)\n ) {\n ctx.emit('hide');\n }\n },\n };\n\n onMounted(() => tracker.addObserver(obs));\n onUnmounted(() => tracker.removeObserver(obs));\n\n return {\n modal,\n };\n },\n});\n","import { render } from \"./EdModal.vue?vue&type=template&id=0dceadfd&scoped=true&ts=true&lang=pug\"\nimport script from \"./EdModal.vue?vue&type=script&lang=ts\"\nexport * from \"./EdModal.vue?vue&type=script&lang=ts\"\n\nimport \"./EdModal.vue?vue&type=style&index=0&id=0dceadfd&lang=stylus&scoped=true\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0dceadfd\"]])\n\nexport default __exports__","\nimport { ModalControl } from '@/parts/ModalControl';\nimport { computed, ComputedRef, defineComponent } from 'vue';\nimport EdModal from './EdModal.vue';\n\nexport default defineComponent({\n name: 'FaIconModalTrigger',\n components: {\n EdModal,\n },\n props: {\n iconClass: {\n type: String,\n required: true,\n },\n closedClass: String,\n },\n setup(props) {\n const control = new ModalControl();\n const classes: ComputedRef> = computed(() => {\n const mapping: Record = {\n [props.iconClass]: !control.showModal.value || !props.closedClass,\n };\n if (props.closedClass)\n mapping[props.closedClass] = control.showModal.value;\n return mapping;\n });\n return {\n control,\n show: control.showModal,\n classes,\n };\n },\n});\n","import { render } from \"./FaIconModalTrigger.vue?vue&type=template&id=6d8ac782&ts=true&lang=pug\"\nimport script from \"./FaIconModalTrigger.vue?vue&type=script&lang=ts\"\nexport * from \"./FaIconModalTrigger.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { computed, defineComponent, ref } from 'vue';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\n\nimport LocationFinder from '@/components/search/LocationFinder.vue';\nimport EdPopup from '@/components/utils/EdPopup.vue';\nimport FaIconModalTrigger from '@/components/utils/modals/FaIconModalTrigger.vue';\n\nexport default defineComponent({\n name: 'PointListItem',\n components: {\n LocationFinder,\n EdPopup,\n FaIconModalTrigger,\n },\n props: {\n name: {\n type: String,\n required: true,\n },\n allowExpansion: Boolean,\n allowSettings: Boolean,\n allowInline: Boolean,\n allowIntermediate: Boolean,\n allowDelete: {\n type: Boolean,\n default: true,\n },\n closeSettings: Boolean,\n allowCentering: {\n type: Boolean,\n default: true,\n },\n itemClass: String,\n itemDescription: String,\n itemHover: String,\n padAll: Boolean,\n handle: {\n type: Boolean,\n default: true,\n },\n iconClass: String,\n locked: Boolean,\n },\n setup(props, { emit }) {\n const expanded = ref(false);\n const settingsChanging = ref(false);\n const showSettings = computed(\n () => settingsChanging.value && !props.closeSettings,\n );\n const doSettings = computed(\n () => showSettings.value && props.allowSettings,\n );\n const doExpansion = computed(() => expanded.value && props.allowExpansion);\n function emitDelete() {\n emit('delete');\n }\n\n function emitPointChange(searchItem: SearchResult) {\n emit('searchComplete', searchItem);\n }\n\n function settingsClicked() {\n settingsChanging.value = !showSettings.value;\n if (settingsChanging.value) emit('settingsOpened');\n else emit('settingsClosed');\n }\n\n function hideSettings() {\n settingsChanging.value = false;\n emit('settingsClosed');\n }\n\n function centerMapOnPoint() {\n emit('centerOnThis');\n }\n\n return {\n expanded,\n settingsChanging,\n settingsClicked,\n showSettings,\n hideSettings,\n emitDelete,\n emitPointChange,\n doSettings,\n doExpansion,\n centerMapOnPoint,\n };\n },\n});\n","import { render } from \"./PointListItem.vue?vue&type=template&id=47f0beaa&ts=true&lang=pug\"\nimport script from \"./PointListItem.vue?vue&type=script&lang=ts\"\nexport * from \"./PointListItem.vue?vue&type=script&lang=ts\"\n\nimport \"./PointListItem.vue?vue&type=style&index=0&id=47f0beaa&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export function getPointListBottomBorderStyle(color: string): string {\n return `border-bottom-right-radius: 0; border-bottom-left-radius: 0;border-bottom: solid;border-color: ${color};`;\n}\n","\nimport { computed, defineComponent, PropType } from 'vue';\nimport HiddenFinder from '@/components/search/HiddenFinder.vue';\nimport PointListItem from './PointListItem.vue';\nimport draggable from 'vuedraggable';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\nimport { DI } from '@/di';\nimport { MapDisplayInfoService } from '@/services/map-service/display-info/map-display-info.interface';\nimport { DisplayablePointOfInterest } from '@/map-display';\nimport { NormalizedList, rebuildFromNormalized } from '@/utils/normalized';\nimport { getPointListBottomBorderStyle } from '@/utils/misc-styles';\n\nlet generatedGroup = 0;\n\nexport default defineComponent({\n name: 'PointList',\n components: {\n HiddenFinder,\n PointListItem,\n draggable,\n },\n props: {\n modelValue: {\n type: Object as PropType>,\n required: true,\n },\n idIconMap: {\n type: Object as PropType>,\n required: false,\n },\n idBorderMap: {\n type: Object as PropType>,\n required: false,\n },\n dragGroup: String,\n itemClass: String,\n padAll: Boolean,\n },\n setup(props, { emit }) {\n const draggableList = computed({\n get() {\n return rebuildFromNormalized(props.modelValue);\n },\n set(list: DisplayablePointOfInterest[]) {\n const newOrder = list.map((item) => item.id);\n let clone = { ...props.modelValue };\n clone.ordering = newOrder;\n emit('update:modelValue', clone);\n },\n });\n\n const actualDragGroup =\n props.dragGroup != undefined ? props.dragGroup : `${generatedGroup++}`;\n\n function centerOnItem(id: string) {\n const point = props.modelValue.values[id];\n if (point)\n DI.get(MapDisplayInfoService).setMapCenter(\n point,\n );\n }\n\n function updatePoint(elemId: string, newPoint: DisplayablePointOfInterest) {\n let clone = { ...props.modelValue };\n clone.values[elemId] = newPoint;\n emit('update:modelValue', clone);\n }\n\n function addPoint(res: SearchResult) {\n emit('addSearched', res);\n }\n\n function deletePoint(id: string) {\n let clone = { ...props.modelValue };\n delete clone.values[id];\n clone.ordering = clone.ordering.filter((pointId) => pointId != id);\n emit('update:modelValue', clone);\n }\n\n function changePoint(id: string, result: SearchResult) {\n let clone = { ...props.modelValue };\n clone.values[id].lat = result.location.lat;\n clone.values[id].lng = result.location.lng;\n clone.values[id].name = result.name;\n emit('update:modelValue', clone);\n }\n\n function getItemBorder(id: string): string {\n if (!props.idBorderMap || !props.idBorderMap[id]) return '';\n const color = props.idBorderMap[id];\n return getPointListBottomBorderStyle(color);\n }\n\n return {\n actualDragGroup,\n centerOnItem,\n updatePoint,\n addPoint,\n deletePoint,\n changePoint,\n draggableList,\n getItemBorder,\n };\n },\n});\n","import { render } from \"./PointList.vue?vue&type=template&id=59e64b10&ts=true&lang=pug\"\nimport script from \"./PointList.vue?vue&type=script&lang=ts\"\nexport * from \"./PointList.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"point-time\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_inline_duration = _resolveComponent(\"inline-duration\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_inline_duration, {\n mode: \"single\",\n suffix: {singular: 'minute', plural: 'minutes'},\n step: 5,\n modelValue: _ctx.minutes,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.minutes) = $event)),\n \"button-text\": _ctx.buttonText\n }, null, 8, [\"modelValue\", \"button-text\"])\n ]))\n}","import { DateTime } from 'luxon';\n\nexport function displayTime(dt: DateTime): string {\n return dt.toFormat('HH:mm');\n}\n\nexport function displayTimeRange(start: DateTime, end: DateTime): string {\n return `${displayTime(start)} - ${displayTime(end)}`;\n}\n","\nimport { TripCityPoint } from '@/services/trips/trip';\nimport { computed, defineComponent, PropType } from 'vue';\nimport InlineDuration from '@/components/utils/InlineDuration.vue';\nimport { DateTime } from 'luxon';\n\nimport { displayTimeRange } from '@/utils/time-fmt';\n\nexport default defineComponent({\n components: {\n InlineDuration,\n },\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n startTime: {\n type: Object as PropType,\n },\n endTime: {\n type: Object as PropType,\n },\n useTimeOfDay: Boolean,\n },\n setup(props, { emit }) {\n const minutes = computed({\n get() {\n return props.modelValue.minutes;\n },\n set(minutes: number) {\n let clone = { ...props.modelValue };\n clone.minutes = minutes;\n emit('update:modelValue', clone);\n },\n });\n\n const buttonText = computed(() =>\n props.useTimeOfDay && props.startTime && props.endTime\n ? displayTimeRange(props.startTime, props.endTime)\n : undefined,\n );\n return {\n minutes,\n buttonText,\n };\n },\n});\n","import { render } from \"./CityPointTime.vue?vue&type=template&id=aa214224&ts=true&lang=pug\"\nimport script from \"./CityPointTime.vue?vue&type=script&lang=ts\"\nexport * from \"./CityPointTime.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-c1e05c40\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { class: \"w-100\" }, [\n /*#__PURE__*/_createElementVNode(\"hr\", { class: \"w-100 m-2\" })\n], -1))\nconst _hoisted_2 = { class: \"d-flex flex-row modal-row\" }\nconst _hoisted_3 = { class: \"flex-grow-1\" }\nconst _hoisted_4 = { class: \"cost-container m-auto flex-grow-2\" }\nconst _hoisted_5 = { class: \"modal-row flex-grow-1 d-flex flex-column\" }\nconst _hoisted_6 = [\"value\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_editable_title = _resolveComponent(\"editable-title\")!\n const _component_city_point_config = _resolveComponent(\"city-point-config\")!\n const _component_cost_display = _resolveComponent(\"cost-display\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createVNode(_component_editable_title, {\n modelValue: _ctx.modelValue.name,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = name => _ctx.patchAndEmitPoint({name}))\n }, null, 8, [\"modelValue\"]),\n _hoisted_1,\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createVNode(_component_city_point_config, {\n modelValue: _ctx.modelValue,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = v => _ctx.$emit('update:modelValue', v))\n }, null, 8, [\"modelValue\"])\n ]),\n _createElementVNode(\"div\", _hoisted_4, [\n _createVNode(_component_cost_display, {\n cost: _ctx.modelValue.cost || 0,\n \"onUpdate:cost\": _ctx.scheduleCostUpdate\n }, null, 8, [\"cost\", \"onUpdate:cost\"])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"textarea\", {\n class: \"form-control flex-grow-1\",\n value: _ctx.modelValue.notes,\n onInput: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.scheduleNoteUpdate && _ctx.scheduleNoteUpdate(...args))),\n placeholder: \"Notes, Ideas, and More!\"\n }, null, 40, _hoisted_6)\n ])\n ], 64))\n}","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"container city-point-config\" }\nconst _hoisted_2 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.iconOptions, (opt) => {\n return (_openBlock(), _createElementBlock(\"i\", {\n class: _normalizeClass([\"cpc-type-icon me-1 ms-1 primary-clickable text-center\", opt.iconClass]),\n onClick: ($event: any) => (_ctx.setIcon(opt.value))\n }, null, 10, _hoisted_2))\n }), 256))\n ]))\n}","\nimport { DI } from '@/di';\nimport { TripCityPoint, TripPointType } from '@/services/trips/trip';\nimport { TripIconSet } from '@/services/trips/trip-icon-set.interface';\nimport { defineComponent, PropType, ref } from 'vue';\n\nexport default defineComponent({\n name: 'CityPointConfig',\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n },\n setup(props, { emit }) {\n const icons = DI.get(TripIconSet);\n const newName = ref('');\n\n const iconOptions = Object.values(TripPointType).map((k) => ({\n value: k,\n iconClass: icons.getTripIconClass(k),\n }));\n\n function setIcon(value: TripPointType) {\n const clone = { ...props.modelValue };\n clone.type = value;\n emit('update:modelValue', clone);\n }\n\n function setName() {\n if (newName.value.length === 0) return;\n const clone = { ...props.modelValue };\n clone.name = newName.value;\n emit('update:modelValue', clone);\n }\n\n return {\n iconOptions,\n setIcon,\n newName,\n setName,\n };\n },\n});\n","import { render } from \"./CityPointConfig.vue?vue&type=template&id=f141930c&ts=true&lang=pug\"\nimport script from \"./CityPointConfig.vue?vue&type=script&lang=ts\"\nexport * from \"./CityPointConfig.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { defineComponent, onUnmounted, PropType } from 'vue';\nimport { TripCityPoint } from '@/services/trips/trip';\n\nimport EditableTitle from '@/components/utils/inputs/EditableTitle.vue';\nimport CityPointConfig from '@/components/trip-view/CityPointConfig.vue';\nimport CostDisplay from '@/components/utils/CostDisplay.vue';\n\nimport { Debouncer } from '@/utils/Debouncer';\n\nconst NOTE_DEBOUNCE = 1000;\n\nexport default defineComponent({\n components: {\n EditableTitle,\n CityPointConfig,\n CostDisplay,\n },\n props: {\n modelValue: {\n required: true,\n type: Object as PropType,\n },\n },\n setup(props, { emit }) {\n const changeDebounce = new Debouncer(\n NOTE_DEBOUNCE,\n (data: Partial) => patchAndEmitPoint(data),\n (existing: Partial, newData: Partial) => ({\n ...existing,\n ...newData,\n }),\n );\n function patchAndEmitPoint(patch: Partial) {\n const newCity: TripCityPoint = { ...props.modelValue, ...patch };\n emit('update:modelValue', newCity);\n }\n\n function scheduleNoteUpdate(event: InputEvent) {\n const notes = (event?.target as HTMLTextAreaElement).value;\n changeDebounce.startDebounce({ notes });\n }\n\n function scheduleCostUpdate(cost: number) {\n changeDebounce.startDebounce({ cost });\n }\n\n onUnmounted(() => {\n changeDebounce.fireImmediately();\n });\n\n return {\n patchAndEmitPoint,\n scheduleCostUpdate,\n scheduleNoteUpdate,\n };\n },\n});\n","import { render } from \"./PointModalContent.vue?vue&type=template&id=c1e05c40&scoped=true&ts=true&lang=pug\"\nimport script from \"./PointModalContent.vue?vue&type=script&lang=ts\"\nexport * from \"./PointModalContent.vue?vue&type=script&lang=ts\"\n\nimport \"./PointModalContent.vue?vue&type=style&index=0&id=c1e05c40&lang=stylus&scoped=true\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c1e05c40\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, vModelSelect as _vModelSelect, withDirectives as _withDirectives } from \"vue\"\n\nconst _hoisted_1 = { class: \"m-1\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"w-100\" }, [\n /*#__PURE__*/_createElementVNode(\"hr\", { class: \"w-100 m-1\" })\n], -1)\nconst _hoisted_3 = { class: \"d-flex flex-row align-items-center mt-1\" }\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"label\", { class: \"form-label-sm m-1 text-nowrap\" }, \"Day Start:\", -1)\nconst _hoisted_5 = [\"value\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"label\", { class: \"form-label-sm m-1\" }, \":\", -1)\nconst _hoisted_7 = [\"value\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"h2\", _hoisted_1, _toDisplayString(_ctx.modelValue.name), 1),\n _hoisted_2,\n _createElementVNode(\"form\", _hoisted_3, [\n _hoisted_4,\n _withDirectives(_createElementVNode(\"select\", {\n class: \"day-hour form-select form-select-sm\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.hour) = $event))\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.hourOptions, (v) => {\n return (_openBlock(), _createElementBlock(\"option\", {\n value: v.num\n }, _toDisplayString(v.str), 9, _hoisted_5))\n }), 256))\n ], 512), [\n [_vModelSelect, _ctx.hour]\n ]),\n _hoisted_6,\n _withDirectives(_createElementVNode(\"select\", {\n class: \"day-minute form-select form-select-sm\",\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_ctx.minute) = $event))\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.minuteOptions, (v) => {\n return (_openBlock(), _createElementBlock(\"option\", {\n value: v.num\n }, _toDisplayString(v.str), 9, _hoisted_7))\n }), 256))\n ], 512), [\n [_vModelSelect, _ctx.minute]\n ])\n ])\n ], 64))\n}","import { computed, WritableComputedRef } from 'vue';\n\nexport class SettableProps {\n constructor(\n private readonly props: () => T,\n private readonly emit: (key: E, v: T) => void,\n private readonly emitString: E,\n ) {}\n\n getPropRef(\n prop: K,\n parser: (conv: string) => T[K],\n ): WritableComputedRef {\n return computed({\n get: () => {\n return this.props()[prop];\n },\n set: (v: T[K] | string) => {\n const result = typeof v === 'string' ? parser(v) : v;\n const out = { ...this.props() };\n out[prop] = result;\n this.emit(this.emitString, out);\n },\n });\n }\n}\n","\nimport { SettableProps } from '@/parts/SettableProps';\nimport { TripCityPoint } from '@/services/trips/trip';\nimport { defineComponent, PropType } from 'vue';\n\nexport default defineComponent({\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n defaultHour: Number,\n defaultMinute: Number,\n },\n setup(props, { emit }) {\n const settable = new SettableProps(\n () => {\n const copy = { ...props.modelValue };\n if (copy.start_hour === undefined) copy.start_hour = props.defaultHour;\n if (copy.start_minute === undefined)\n copy.start_minute = props.defaultMinute;\n return copy;\n },\n emit,\n 'update:modelValue',\n );\n const hour = settable.getPropRef('start_hour', parseInt);\n const minute = settable.getPropRef('start_minute', parseInt);\n function* timeOptions(maxExclusive: number) {\n let i = 0;\n for (; i < maxExclusive; ++i) {\n yield { num: i, str: String(i).padStart(2, '0') };\n }\n }\n const hourOptions = Array.from(timeOptions(24));\n const minuteOptions = Array.from(timeOptions(60));\n\n return {\n hour,\n minute,\n hourOptions,\n minuteOptions,\n };\n },\n});\n","import { render } from \"./OvernightModalContent.vue?vue&type=template&id=da16a892&ts=true&lang=pug\"\nimport script from \"./OvernightModalContent.vue?vue&type=script&lang=ts\"\nexport * from \"./OvernightModalContent.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, mergeProps as _mergeProps, createBlock as _createBlock, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"w-100 d-flex flex-row justify-content-center\" }\nconst _hoisted_2 = { class: \"w-50 d-flex flex-row justify-content-evenly pb-1\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_leg_info_display = _resolveComponent(\"leg-info-display\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.pointRouteTypes, (ty) => {\n return (_openBlock(), _createBlock(_component_leg_info_display, _mergeProps(_ctx.getTypeInfoBinding(ty), {\n onClick: ($event: any) => (_ctx.setSelectedTravelType(ty))\n }), null, 16, [\"onClick\"]))\n }), 256))\n ])\n ]))\n}","import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"leg-time\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"leg-info-root d-flex flex-row align-items-center justify-content-center small ps-1 pe-1\", {'leg-info-selected': _ctx.selected}])\n }, [\n _createElementVNode(\"i\", {\n class: _normalizeClass([\"fas pe-1 leg-info-icon\", _ctx.iconClass])\n }, null, 2),\n _createElementVNode(\"div\", _hoisted_1, _toDisplayString(_ctx.timeString), 1)\n ], 2))\n}","import { computed, ComputedRef, Ref } from 'vue';\n\nexport function hoursAndMinutesComputer(\n seconds: Ref,\n): ComputedRef {\n return computed(() => hoursAndMinutes(seconds.value));\n}\n\nexport function hoursAndMinutes(seconds: number): string {\n const totalMinutes = Math.ceil(seconds / 60);\n const minutes = totalMinutes % 60;\n const hours = Math.floor(totalMinutes / 60);\n\n const useMinutes = minutes > 0 || hours == 0;\n\n const hourString = hours > 0 ? `${hours}h` : '';\n const minuteString = useMinutes ? `${minutes}m` : '';\n if (hourString.length > 0 && minuteString.length > 0)\n return `${hourString} ${minuteString}`;\n else return hourString + minuteString;\n}\n","\nimport { RouteLeg } from '@/services/map-service/routing/direction-router.interface';\nimport { RouteType } from '@/services/map-service/routing/route-type';\nimport { computed, defineComponent, PropType, toRef } from 'vue';\nimport { hoursAndMinutesComputer } from '@/parts/hour-minute-string';\n\nconst ICON_MAP = {\n [RouteType.WALK]: 'fa-walking',\n [RouteType.CAR]: 'fa-car',\n};\n\nexport default defineComponent({\n name: 'LegInfoDisplay',\n props: {\n seconds: {\n type: Number,\n required: true,\n },\n type: {\n type: String as PropType,\n required: true,\n },\n selected: {\n type: Boolean,\n required: false,\n },\n },\n setup(props: Omit & { selected?: boolean }) {\n const iconClass = computed(() => ICON_MAP[props.type]);\n const timeString = hoursAndMinutesComputer(toRef(props, 'seconds'));\n return { timeString, iconClass };\n },\n});\n","import { render } from \"./LegInfoDisplay.vue?vue&type=template&id=381b41b4&ts=true&lang=pug\"\nimport script from \"./LegInfoDisplay.vue?vue&type=script&lang=ts\"\nexport * from \"./LegInfoDisplay.vue?vue&type=script&lang=ts\"\n\nimport \"./LegInfoDisplay.vue?vue&type=style&index=0&id=381b41b4&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { RouteOptionMap } from '@/parts/city/city-router';\nimport { RouteType } from '@/services/map-service/routing/route-type';\nimport { TripCityPoint } from '@/services/trips/trip';\nimport { computed, defineComponent, PropType } from 'vue';\nimport LegInfoDisplay from './LegInfoDisplay.vue';\n\nconst MAX_LEG_SECONDS = 60 * 60 * 24;\n\nconst LEG_DISPLAY_ORDER = [RouteType.WALK, RouteType.CAR];\n\nexport default defineComponent({\n name: 'PointTravelInfo',\n components: {\n LegInfoDisplay,\n },\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n route: {\n type: Object as PropType,\n required: true,\n },\n },\n setup(props, { emit }) {\n const pointRouteTypes = computed(() =>\n Array.from(props.route.keys())\n .filter((type) => {\n const leg = props.route.get(type);\n return leg && leg.seconds > 0 && leg.seconds < MAX_LEG_SECONDS;\n })\n .sort(\n (a, b) => LEG_DISPLAY_ORDER.indexOf(a) - LEG_DISPLAY_ORDER.indexOf(b),\n ),\n );\n function getTypeInfoBinding(type: RouteType) {\n const binding = {\n type,\n seconds: props.route.get(type)?.seconds,\n selected: props.modelValue.outgoing_travel === type,\n };\n return binding;\n }\n function setSelectedTravelType(type: RouteType) {\n const copy = { ...props.modelValue };\n copy.outgoing_travel = type;\n emit('update:modelValue', copy);\n }\n return {\n pointRouteTypes,\n getTypeInfoBinding,\n setSelectedTravelType,\n };\n },\n});\n","import { render } from \"./PointTravelInfo.vue?vue&type=template&id=6f08298a&ts=true&lang=pug\"\nimport script from \"./PointTravelInfo.vue?vue&type=script&lang=ts\"\nexport * from \"./PointTravelInfo.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, renderSlot as _renderSlot, resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_ed_modal = _resolveComponent(\"ed-modal\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"button\", {\n class: \"modal-trigger text-nowrap btn btn-sm btn-secondary m-1\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(($event: any) => (_ctx.control.modalOpened()), [\"stop\"])),\n onMouseenter: _cache[1] || (_cache[1] = ($event: any) => (_ctx.control.modalTriggerEntered()))\n }, _toDisplayString(_ctx.text), 33),\n (_ctx.show)\n ? (_openBlock(), _createBlock(_component_ed_modal, {\n key: 0,\n onHide: _cache[2] || (_cache[2] = ($event: any) => (_ctx.control.modalHidden()))\n }, {\n default: _withCtx(() => [\n _renderSlot(_ctx.$slots, \"default\")\n ]),\n _: 3\n }))\n : _createCommentVNode(\"\", true)\n ], 64))\n}","\nimport { defineComponent } from 'vue';\nimport EdModal from './EdModal.vue';\nimport { ModalControl } from '@/parts/ModalControl';\n\nexport default defineComponent({\n name: 'ModalTrigger',\n components: {\n EdModal,\n },\n props: {\n text: {\n type: String,\n required: true,\n },\n },\n setup() {\n const control = new ModalControl();\n return {\n control,\n show: control.showModal,\n };\n },\n});\n","import { render } from \"./ModalTrigger.vue?vue&type=template&id=2ca2537c&ts=true&lang=pug\"\nimport script from \"./ModalTrigger.vue?vue&type=script&lang=ts\"\nexport * from \"./ModalTrigger.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { CITY_DAY_COLORS } from '@/icon-styling';\n\nexport function getOvernightIconMap(\n nights: number,\n iconClasses: string,\n): Record {\n const records: Record = {};\n for (let i = 0; i <= nights; ++i) {\n records[`overnight-${i}`] = iconClasses;\n }\n return records;\n}\n\nexport function getOvernightBorderColors(\n nights: number,\n): Record {\n const records: Record = {};\n for (let i = 0; i <= nights; ++i) {\n records[`overnight-${i}`] = CITY_DAY_COLORS[i % CITY_DAY_COLORS.length];\n }\n return records;\n}\n","import { DI } from '@/di';\nimport {\n ComputedPolyline,\n ComputedPolylineManager,\n PolylineComputationId,\n} from '@/services/map-service/points/computed-polylines.interface';\nimport { ComputedRef, onUnmounted } from 'vue';\n\nexport class ManagedComputedPoly {\n private polyService = DI.get(\n ComputedPolylineManager,\n );\n private id: PolylineComputationId = 0;\n private registered = false;\n constructor(private readonly poly: ComputedRef) {}\n\n private registerPolyComputation() {\n const oldToken = this.id;\n\n this.id = this.polyService.addPolylineComputation(this.poly);\n\n if (this.registered) this.polyService.removePolylineComputation(oldToken);\n\n this.registered = true;\n }\n\n destroy(): void {\n if (this.registered) this.polyService.removePolylineComputation(this.id);\n this.registered = false;\n }\n\n setup(): void {\n this.registerPolyComputation();\n onUnmounted(() => {\n this.destroy();\n });\n }\n}\n","import { computed, Ref, ref } from 'vue';\nimport { GENERIC_TRIP_POINT_ICON_CLASS, CITY_DAY_COLORS } from '@/icon-styling';\nimport { PointSetDisplayType } from '@/map-display';\nimport { ComputedPolyline } from '@/services/map-service/points/computed-polylines.interface';\nimport { CityPointFlattener } from './city-compute';\nimport { ManagedComputedPoly } from '../ManagedComputedPoly';\nimport { ManagedPointDisplay } from '../ManagedPointDisplay';\nimport { CityRouter } from './city-router';\n\nexport class OneCityMapDisplay {\n private readonly polyDisplay: ManagedComputedPoly;\n private readonly markerDisplay: ManagedPointDisplay;\n private highlight: Ref;\n\n constructor(flattener: CityPointFlattener, router: CityRouter) {\n this.highlight = ref('');\n this.markerDisplay = new ManagedPointDisplay(\n computed(() => {\n return flattener.flatCityPoints.value.map((p) => {\n const hlPoint = this.highlight.value === p.id;\n return {\n ...p,\n displayOptions: {\n ...p.displayOptions,\n isHighlighted: hlPoint,\n },\n };\n });\n }),\n PointSetDisplayType.Markers,\n );\n this.markerDisplay.iconClass = GENERIC_TRIP_POINT_ICON_CLASS;\n\n const polys = computed(() => {\n const dayPolys: ComputedPolyline[] = router.routeData.value.days.map(\n (route, idx) => ({\n points: route.fullRoute,\n displayInfo: {\n color: CITY_DAY_COLORS[idx % CITY_DAY_COLORS.length],\n },\n }),\n );\n return dayPolys;\n });\n this.polyDisplay = new ManagedComputedPoly(polys);\n }\n\n setHighlight(hlId: string): void {\n this.highlight.value = hlId;\n }\n\n clearHighlight(hlId: string): void {\n if (this.highlight.value === hlId) {\n this.highlight.value = '';\n }\n }\n\n setup(): void {\n this.polyDisplay.setup();\n this.markerDisplay.setup();\n }\n}\n","import { Ref, shallowRef, watch, WatchOptions, WatchSource } from 'vue';\nimport { Logger } from './logger';\n\nexport class AsyncRef {\n private readonly syncCallback: (err?: unknown) => T;\n private readonly errCallback?: (err: unknown) => T;\n private valueRef: Ref;\n doSyncOnWatchTrigger = true;\n /* eslint-disable @typescript-eslint/ban-types */\n constructor(\n watchSrc: (object | WatchSource)[] | WatchSource,\n syncCb: T | ((err?: unknown) => T),\n private readonly asyncCallback: () => Promise,\n watchOptsOrErrFn?: WatchOptions | ((err: unknown) => T),\n watchOptsWithFn?: WatchOptions,\n ) {\n /* eslint-enable @typescript-eslint/ban-types */\n this.syncCallback = syncCb instanceof Function ? syncCb : () => syncCb;\n this.valueRef = shallowRef(this.syncCallback());\n void this.doAsyncUpdate();\n\n const watchOpts =\n typeof watchOptsOrErrFn === 'function'\n ? watchOptsWithFn\n : watchOptsOrErrFn;\n\n if (typeof watchOptsOrErrFn === 'function')\n this.errCallback = watchOptsOrErrFn;\n\n watch(\n watchSrc,\n () => {\n if (this.doSyncOnWatchTrigger)\n this.valueRef.value = this.syncCallback();\n void this.doAsyncUpdate();\n },\n watchOpts,\n );\n }\n\n private async doAsyncUpdate(): Promise {\n try {\n this.valueRef.value = await this.asyncCallback();\n } catch (e) {\n if (process.env.NODE_ENV == 'development') {\n Logger.log('Error while computing async ref data');\n Logger.log(e);\n }\n if (this.errCallback) this.errCallback(e);\n }\n }\n\n get value(): T {\n return this.valueRef.value;\n }\n\n asRef(): Ref {\n return this.valueRef;\n }\n}\n","import { DI } from '@/di';\nimport { MapPoint } from '@/map-display';\nimport {\n DirectionRouterService,\n RouteLeg,\n} from '@/services/map-service/routing/direction-router.interface';\nimport { RouteType } from '@/services/map-service/routing/route-type';\nimport { TripCityPoint } from '@/services/trips/trip';\nimport { AsyncRef } from '@/utils/async-ref';\nimport { CityDayListFinder } from './day-listing';\n\nexport type RouteOptionMap = Map;\n\nexport interface IntraCityLeg {\n legOptions: RouteOptionMap;\n from: TripCityPoint;\n chosen: RouteLeg;\n}\n\nexport interface IntraCityRoute {\n fullRoute: MapPoint[];\n details: IntraCityLeg[];\n totalSeconds: number;\n}\n\nexport interface RoutedCityData {\n days: IntraCityRoute[];\n}\n\nexport class CityRouter {\n readonly routeData: AsyncRef;\n private readonly routerService: DirectionRouterService = DI.get(\n DirectionRouterService,\n );\n constructor(private readonly dayLister: CityDayListFinder) {\n this.routeData = new AsyncRef(\n [this.dayLister.dayLists],\n () => this.computeSync(),\n () => this.computeAsync(),\n { deep: true },\n );\n }\n\n protected computeSync(): RoutedCityData {\n const days = this.dayLister.dayLists.value.map((dayPoints) => {\n const fullRoute = dayPoints;\n const legs: IntraCityLeg[] = this.arrayToLegsSync(fullRoute);\n return {\n fullRoute,\n details: legs,\n totalSeconds: -1,\n };\n });\n\n return {\n days,\n };\n }\n protected async computeAsync(): Promise {\n const days = this.dayLister.dayLists.value;\n const routePromises = days.map((day) =>\n this.routerService.getRoutedPoints(day),\n );\n\n const routeResults = await Promise.allSettled(routePromises);\n\n const routes = routeResults.map((promisedRoute, i) => {\n if (promisedRoute.status === 'fulfilled') {\n return this.legsToRoute(\n (promisedRoute as PromiseFulfilledResult).value,\n days[i],\n );\n } else {\n return {\n fullRoute: days[i],\n details: this.arrayToLegsSync(days[i]),\n totalSeconds: -1,\n };\n }\n });\n\n return {\n days: routes,\n };\n }\n\n legsToRoute(\n routeOptions: RouteLeg[][],\n points: TripCityPoint[],\n ): IntraCityRoute {\n if (points.length == 0) {\n return { details: [], fullRoute: [], totalSeconds: 0 };\n }\n if (points.length === 1) {\n const opt = {\n points: [points[0]],\n seconds: -1,\n type: RouteType.WALK,\n };\n return {\n details: [\n {\n from: points[0],\n legOptions: singleLegOptionMap(opt),\n chosen: opt,\n },\n ],\n fullRoute: points,\n totalSeconds: 0,\n };\n }\n\n if (routeOptions.find((route) => route.length != points.length - 1))\n throw Error('All routes should match the number of points');\n\n const details: IntraCityLeg[] = routeOptions[0].map((leg, i) => {\n const mapping: RouteOptionMap = new Map();\n routeOptions.forEach((opt) => mapping.set(opt[i].type, opt[i]));\n const out = points[i].outgoing_travel;\n const preferred = out ? mapping.get(out) : undefined;\n const walk = mapping.get(RouteType.WALK);\n const car = mapping.get(RouteType.CAR);\n\n const chosen = this.pickFirstValidLeg([preferred, walk, car]) || {\n points: [points[i]],\n seconds: -1,\n type: RouteType.WALK,\n };\n\n return {\n legOptions: mapping,\n from: points[i],\n chosen,\n };\n });\n\n let totalSeconds = 0;\n const fullRoute = details.flatMap((leg, i) => {\n const route = leg.chosen;\n totalSeconds += route.seconds > 0 ? route.seconds : 0;\n return i < details.length - 1 ? route.points.slice(0, -1) : route.points;\n });\n return { details, fullRoute, totalSeconds };\n }\n\n pickFirstValidLeg(routes: (RouteLeg | undefined)[]): RouteLeg | undefined {\n for (const routeOpt of routes) {\n if (routeOpt && routeOpt.seconds >= 0) return routeOpt;\n }\n return undefined;\n }\n\n arrayToLegsSync(pointArr: TripCityPoint[]): IntraCityLeg[] {\n return pointArr.map((onePoint, idx) => {\n const leg =\n idx === 0\n ? {\n points: [onePoint],\n seconds: -1,\n type: RouteType.WALK,\n }\n : {\n points: [pointArr[idx - 1], onePoint],\n seconds: -1,\n type: RouteType.WALK,\n };\n return {\n from: onePoint,\n legOptions: singleLegOptionMap(leg),\n chosen: leg,\n };\n });\n }\n}\n\nfunction singleLegOptionMap(leg: RouteLeg): RouteOptionMap {\n const map: RouteOptionMap = new Map();\n map.set(leg.type, leg);\n return map;\n}\n","import { TripCity, TripCityPoint } from '@/services/trips/trip';\nimport { ComputedRef, computed, Ref } from 'vue';\nimport { CityPointAnnotator } from './city-compute';\n\nexport class CityDayListFinder {\n readonly dayLists: ComputedRef;\n constructor(\n private readonly city: Ref,\n private readonly annotator: CityPointAnnotator,\n ) {\n this.dayLists = computed(() => this.getCityDayLists());\n }\n\n protected getCityDayLists(): TripCityPoint[][] {\n const dayCount = this.city.value.nights + 1;\n const points = Array.from({ length: dayCount });\n const lists = points.map((pl, i) => {\n if (i === 0) {\n if (this.city.value.enter_via) {\n return [this.city.value.enter_via];\n } else if (this.city.value.stay_at) {\n return [this.city.value.stay_at];\n }\n }\n return [];\n });\n\n this.annotator.getAnnotatedPoints().forEach((point) => {\n lists[point.day].push(point.point);\n });\n\n lists.forEach((l, day) => {\n const isLastDay = day === dayCount - 1;\n if (isLastDay) {\n if (this.city.value.exit_via) {\n l.push(this.city.value.exit_via);\n } else if (this.city.value.stay_at) {\n l.push(this.city.value.stay_at);\n }\n } else if (lists[day + 1][0]) {\n // Take the first point from the next day. That's always the overnight\n // point in the annotator output\n l.push(lists[day + 1][0]);\n }\n });\n\n return lists;\n }\n}\n","import { DI } from '@/di';\nimport {\n TimezoneIdentifier,\n TimezoneLookupService,\n} from '@/services/timezone/timezone-lookup.interface';\nimport { TripCity, TripCityPoint, TripOptions } from '@/services/trips/trip';\nimport { AsyncRef } from '@/utils/async-ref';\nimport { NormalizedList, normalizeList } from '@/utils/normalized';\nimport { DateTime } from 'luxon';\nimport { computed, ComputedRef, Ref, toRef } from 'vue';\nimport { CityPointAnnotator } from './city-compute';\nimport { IntraCityRoute, RoutedCityData } from './city-router';\n\nexport interface PointTimeInfo {\n id: string;\n startTime: DateTime;\n endTime: DateTime;\n}\n\nexport class PointTimeInfoCalculator {\n readonly timeInfo: ComputedRef>;\n readonly timezone: AsyncRef;\n readonly tzService: TimezoneLookupService = DI.get(\n TimezoneLookupService,\n );\n constructor(\n private readonly city: Ref,\n private readonly annotator: CityPointAnnotator,\n private readonly routeData: Ref,\n private readonly options: Ref | undefined,\n ) {\n const lat = toRef(this.city.value, 'lat');\n const lng = toRef(this.city.value, 'lng');\n this.timezone = new AsyncRef(\n [lat, lng],\n () => 'America/Vancouver',\n async () => {\n return this.tzService.getTimezone({ lat: lat.value, lng: lng.value });\n },\n );\n this.timeInfo = computed(() => this.buildTimeInfo());\n }\n\n createTime(hour?: number, minute?: number): DateTime {\n return DateTime.fromObject(\n {\n hour,\n minute,\n },\n { zone: this.timezone.value },\n );\n }\n\n buildTimeInfo(): NormalizedList {\n if (this.routeData.value.days.length === 0) {\n return normalizeList([]);\n }\n const tripOpts = this.options?.value;\n const dayStart = this.createTime(\n tripOpts?.dayStartHour,\n tripOpts?.dayStartMinute,\n );\n const firstDay = [this.city.value.enter_via];\n const days = firstDay.concat(\n this.annotator.getWithVerifiedOvernights().filter((p) => p.is_overnight),\n );\n const identPoints = Array.from(\n this.cityRouteTimeInfo(days, this.routeData.value.days, dayStart),\n );\n while (identPoints.length < this.city.value.points.length) {\n identPoints.push({\n ...identPoints[identPoints.length - 1],\n id: this.city.value.points[identPoints.length].id,\n });\n }\n return normalizeList(identPoints);\n }\n\n *oneRouteTimeInfo(\n day: IntraCityRoute,\n dayStart: DateTime,\n ): Generator {\n if (day.details.length === 0) return;\n\n const fullTime = day.details.reduce(\n (sum, c) =>\n sum +\n (c.from.minutes || 0) * 60 +\n (c.chosen && c.chosen.seconds > 0 ? c.chosen.seconds : 0),\n 0,\n );\n\n yield {\n id: day.details[0].from.id,\n startTime: dayStart,\n endTime: dayStart.plus({ minutes: Math.ceil(fullTime / 60.0) }),\n };\n\n let currentTime = dayStart;\n for (let i = 0; i < day.details.length; ++i) {\n const detail = day.details[i];\n const endTime = currentTime.plus({ minutes: detail.from.minutes });\n if (i != 0)\n yield { id: day.details[i].from.id, startTime: currentTime, endTime };\n currentTime = endTime.plus({\n minutes: Math.ceil(detail.chosen.seconds / 60.0),\n });\n }\n }\n\n *cityRouteTimeInfo(\n days: (TripCityPoint | null)[],\n routes: IntraCityRoute[],\n defaultStart: DateTime,\n ): Generator {\n if (days.length != routes.length)\n throw new Error(\n `Cannot calculate time info with mismatched day/route lengths (${days.length}/${routes.length})`,\n );\n for (let i = 0; i < days.length; ++i) {\n const day = days[i];\n let start = defaultStart;\n if (day?.start_hour !== undefined && day?.start_minute !== undefined) {\n start = this.createTime(day.start_hour, day.start_minute);\n }\n yield* this.oneRouteTimeInfo(routes[i], start);\n }\n }\n}\n","import { InjectionKey, Ref } from 'vue';\nimport { TripOptions } from '../services/trips/trip';\nimport { DisplayOptions } from './DisplayOptions';\n\nexport const TRIP_OPTION_KEY: InjectionKey> =\n Symbol('TripOptions');\n\nexport const DISPLAY_OPTION_KEY: InjectionKey> =\n Symbol('DisplayOptions');\n","\nimport {\n computed,\n ComputedRef,\n defineComponent,\n inject,\n PropType,\n Ref,\n SetupContext,\n toRef,\n} from 'vue';\nimport {\n TripCity,\n TripCityPoint,\n TripPointType,\n} from '../../services/trips/trip';\nimport {\n CityPointAnnotator,\n CityPointFlattener,\n CitySpecialPointFinder,\n} from '../../parts/city/city-compute';\nimport {\n normalizedCopyAndAppend,\n NormalizedList,\n normalizeList,\n rebuildFromNormalized,\n} from '@/utils/normalized';\nimport PointList from '../utils/PointList.vue';\nimport PointListItem from '../utils/PointListItem.vue';\nimport CityPointTime from './CityPointTime.vue';\nimport PointModalContent from '@/components/trip-view/point-modal/PointModalContent.vue';\nimport OvernightModalContent from '@/components/trip-view/point-modal/OvernightModalContent.vue';\nimport PointTravelInfo from './PointTravelInfo.vue';\nimport ModalTrigger from '@/components/utils/modals/ModalTrigger.vue';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\nimport { DI } from '@/di';\nimport { TripApiService } from '@/services/trips/trip-service.interface';\nimport { MapDisplayInfoService } from '@/services/map-service/display-info/map-display-info.interface';\n\nimport {\n getOvernightIconMap,\n getOvernightBorderColors,\n} from '../../utils/city-overnight-class-utils';\nimport { getPointListBottomBorderStyle } from '@/utils/misc-styles';\nimport { OneCityMapDisplay } from '@/parts/city/one-city-map-display';\nimport { CityRouter } from '@/parts/city/city-router';\nimport { hoursAndMinutes } from '@/parts/hour-minute-string';\nimport { TripIconSet } from '@/services/trips/trip-icon-set.interface';\nimport { CityDayListFinder } from '@/parts/city/day-listing';\nimport {\n PointTimeInfo,\n PointTimeInfoCalculator,\n} from '@/parts/city/point-times';\nimport { DISPLAY_OPTION_KEY, TRIP_OPTION_KEY } from '@/parts/injection-keys';\nimport { displayTime, displayTimeRange } from '@/utils/time-fmt';\nimport { DateTime } from 'luxon';\n\ntype SpecificPoints = Pick;\n\ninterface LockableTripCityPoint extends TripCityPoint {\n locked?: boolean;\n}\n\nclass OnePointSetup {\n readonly name: ComputedRef;\n readonly iconClass: ComputedRef;\n constructor(\n private readonly model: Ref,\n private readonly key: keyof SpecificPoints,\n private readonly service: TripApiService,\n private readonly ctx: SetupContext,\n private readonly iconService: TripIconSet,\n private readonly defaultType: TripPointType,\n ) {\n this.name = computed(() => model.value[key]?.name || '');\n this.iconClass = computed(() => {\n const point = model.value[key];\n const ty = point ? point.type : this.defaultType;\n return `${this.iconService.getTripIconClass(ty)} tcv-iconized`;\n });\n }\n change(newPoint: SearchResult) {\n const item = this.service.createPointFromSearch(newPoint);\n item.type = this.defaultType;\n this.set(item);\n }\n centerMap() {\n const point = this.model.value[this.key];\n if (point != null) {\n DI.get(MapDisplayInfoService).setMapCenter(point);\n }\n }\n set(point: TripCityPoint) {\n const clone = { ...this.model.value };\n clone[this.key] = point;\n this.ctx.emit('update:modelValue', clone);\n }\n boundSet = this.set.bind(this);\n}\n\nexport default defineComponent({\n name: 'TripCityViewer',\n components: {\n PointList,\n PointListItem,\n CityPointTime,\n ModalTrigger,\n PointTravelInfo,\n PointModalContent,\n OvernightModalContent,\n },\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n },\n setup(props, ctx) {\n const service = DI.get(TripApiService);\n const { emit } = ctx;\n const city = toRef(props, 'modelValue');\n\n const tripOpts = inject(TRIP_OPTION_KEY);\n const displayOpts = inject(DISPLAY_OPTION_KEY);\n\n const specialFinder = new CitySpecialPointFinder(city);\n const annotator = new CityPointAnnotator(city);\n const flattener = new CityPointFlattener(specialFinder, annotator);\n const dayLister = new CityDayListFinder(city, annotator);\n const router = new CityRouter(dayLister);\n const listManager = new OneCityMapDisplay(flattener, router);\n const timeCalculator = new PointTimeInfoCalculator(\n city,\n annotator,\n router.routeData.asRef(),\n tripOpts,\n );\n const icons = DI.get(TripIconSet);\n\n const singlePoints = {\n stay_at: new OnePointSetup(\n city,\n 'stay_at',\n service,\n ctx,\n icons,\n TripPointType.HOTEL,\n ),\n enter_via: new OnePointSetup(\n city,\n 'enter_via',\n service,\n ctx,\n icons,\n TripPointType.ARRIVAL,\n ),\n exit_via: new OnePointSetup(\n city,\n 'exit_via',\n service,\n ctx,\n icons,\n TripPointType.AIRPORT,\n ),\n };\n\n const iconMap = computed(() =>\n getOvernightIconMap(\n city.value.nights,\n icons.getTripIconClass(city.value.stay_at?.type || TripPointType.HOTEL),\n ),\n );\n const borderMap = computed(() =>\n getOvernightBorderColors(city.value.nights),\n );\n\n const legOptions = computed(() => {\n const legOptMapping = router.routeData.value.days.flatMap((route, idx) =>\n route.details.map((detail) => ({\n id: detail.from.is_overnight ? `overnight-${idx}` : detail.from.id,\n options: detail.legOptions,\n })),\n );\n return normalizeList(legOptMapping);\n });\n\n function showPointTravelOptions(pointId: string): boolean {\n if (!legOptions.value.values[pointId]?.options.values()) return false;\n for (let opt of legOptions.value.values[pointId]?.options.values()) {\n if (opt.seconds > 0) return true;\n }\n return false;\n }\n\n const normalizedPoints = computed({\n get() {\n const listedPoints: LockableTripCityPoint[] =\n annotator.pointsWithSpecials.value.map((p) => ({ ...p.point }));\n let overnightNum = 0;\n listedPoints.forEach((p) => {\n if (p.is_overnight) {\n ++overnightNum;\n p.locked = true;\n p.name = `Day ${overnightNum}`;\n }\n });\n return normalizeList(listedPoints);\n },\n set(pnts: NormalizedList) {\n const clone = { ...city.value };\n clone.points = rebuildFromNormalized(pnts);\n emit('update:modelValue', clone);\n },\n });\n\n const normalizedDays = computed(() => {\n const zipped = annotator.pointsWithSpecials.value.map((p) => ({\n day: p.day,\n id: p.point.id,\n }));\n return normalizeList(zipped);\n });\n\n function addSearched(point: SearchResult) {\n const item = service.createPointFromSearch(point);\n normalizedPoints.value = normalizedCopyAndAppend(\n normalizedPoints.value,\n item,\n );\n }\n\n function arrivalDayHasPoints(): boolean {\n return router.routeData.value.days[0]?.details.length > 1;\n }\n\n function getDayDurationString(day: number): string {\n const pointTime = dayLister.dayLists.value[day].reduce(\n (sum, p) => sum + p.minutes * 60,\n 0,\n );\n const routeTime = router.routeData.value.days[day]?.totalSeconds || 0;\n\n if (pointTime + routeTime <= 0) return '';\n return hoursAndMinutes(pointTime + routeTime);\n }\n\n function getTimeOfDayString(pointId: string): string | undefined {\n const timeInfo = timeCalculator.timeInfo.value.values[pointId];\n if (!timeInfo) return undefined;\n return timeInfo.startTime.equals(timeInfo.endTime)\n ? displayTime(timeInfo.startTime)\n : displayTimeRange(timeInfo.startTime, timeInfo.endTime);\n }\n\n function getDayDisplayString(day: number): string {\n if (\n displayOpts?.value.useConcreteTime &&\n dayLister.dayLists.value[day].length > 0\n ) {\n const key = dayLister.dayLists.value[day][0].id;\n return getTimeOfDayString(key) || getDayDurationString(day);\n } else {\n return getDayDurationString(day);\n }\n }\n\n function getTimeInfo(\n pointId: string,\n k: keyof Omit,\n ): DateTime | undefined {\n return timeCalculator.timeInfo.value.values[pointId]?.[k];\n }\n\n function setHoverPoint(point: string | TripCityPoint | null | undefined) {\n if (!point) return;\n listManager.setHighlight(typeof point === 'string' ? point : point.id);\n }\n\n function clearHoverPoint(point: string | TripCityPoint | null | undefined) {\n if (!point) return;\n listManager.clearHighlight(typeof point === 'string' ? point : point.id);\n }\n\n listManager.setup();\n\n return {\n specialFinder,\n annotator,\n flattener,\n router,\n listManager,\n normalizedPoints,\n normalizedDays,\n legOptions,\n showPointTravelOptions,\n addSearched,\n singlePoints,\n iconMap,\n borderMap,\n arrivalDayHasPoints,\n startBottomBorderStyle: computed(() =>\n getPointListBottomBorderStyle(borderMap.value['overnight-0']),\n ),\n getDayDurationString,\n getTimeOfDayString,\n getTimeInfo,\n getDayDisplayString,\n displayOpts,\n setHoverPoint,\n clearHoverPoint,\n defaultDayHour: tripOpts?.value?.dayStartHour,\n defaultDayMinute: tripOpts?.value?.dayStartMinute,\n };\n },\n});\n","import { render } from \"./TripCityViewer.vue?vue&type=template&id=1ee26ad9&ts=true&lang=pug\"\nimport script from \"./TripCityViewer.vue?vue&type=script&lang=ts\"\nexport * from \"./TripCityViewer.vue?vue&type=script&lang=ts\"\n\nimport \"./TripCityViewer.vue?vue&type=style&index=0&id=1ee26ad9&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, vModelSelect as _vModelSelect, withDirectives as _withDirectives } from \"vue\"\n\nconst _hoisted_1 = { class: \"trip-opt-root\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"fs-5 text-center\" }, \"Start Date\", -1)\nconst _hoisted_3 = { class: \"d-flex flex-row align-items-center\" }\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"label\", { class: \"form-label-sm m-1 text-nowrap\" }, \"Day Start:\", -1)\nconst _hoisted_5 = [\"value\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"label\", { class: \"form-label-sm m-1\" }, \":\", -1)\nconst _hoisted_7 = [\"value\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_date_picker = _resolveComponent(\"date-picker\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _hoisted_2,\n _createVNode(_component_date_picker, {\n class: \"mb-2\",\n modelValue: _ctx.modelValue.startDate,\n \"onUpdate:modelValue\": _ctx.updateStartDate\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"]),\n _createElementVNode(\"form\", _hoisted_3, [\n _hoisted_4,\n _withDirectives(_createElementVNode(\"select\", {\n class: \"day-hour form-select form-select-sm\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.hour) = $event))\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.hourOptions, (v) => {\n return (_openBlock(), _createElementBlock(\"option\", {\n value: v.num\n }, _toDisplayString(v.str), 9, _hoisted_5))\n }), 256))\n ], 512), [\n [_vModelSelect, _ctx.hour]\n ]),\n _hoisted_6,\n _withDirectives(_createElementVNode(\"select\", {\n class: \"day-minute form-select form-select-sm\",\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_ctx.minute) = $event))\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.minuteOptions, (v) => {\n return (_openBlock(), _createElementBlock(\"option\", {\n value: v.num\n }, _toDisplayString(v.str), 9, _hoisted_7))\n }), 256))\n ], 512), [\n [_vModelSelect, _ctx.minute]\n ])\n ])\n ]))\n}","\nimport { TripOptions } from '@/services/trips/trip';\nimport { defineComponent, PropType } from 'vue';\nimport { DatePicker } from 'v-calendar';\nimport { DateTime } from 'luxon';\n\nimport { SettableProps } from '@/parts/SettableProps';\n\nexport default defineComponent({\n name: 'TripOptionConfig',\n components: {\n DatePicker,\n },\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n },\n setup(props, { emit }) {\n const settableProps = new SettableProps(\n () => props.modelValue,\n emit,\n 'update:modelValue',\n );\n const hour = settableProps.getPropRef('dayStartHour', parseInt);\n const minute = settableProps.getPropRef('dayStartMinute', parseInt);\n\n function* timeOptions(maxExclusive: number) {\n let i = 0;\n for (; i < maxExclusive; ++i) {\n yield { num: i, str: String(i).padStart(2, '0') };\n }\n }\n const hourOptions = Array.from(timeOptions(24));\n const minuteOptions = Array.from(timeOptions(60));\n\n function updateStartDate(newDate: Date) {\n const updateTo = newDate ? DateTime.fromJSDate(newDate) : undefined;\n const updated: TripOptions = {\n ...props.modelValue,\n startDate: updateTo,\n };\n emit('update:modelValue', updated);\n }\n\n return {\n hour,\n minute,\n hourOptions,\n minuteOptions,\n updateStartDate,\n };\n },\n});\n","import { render } from \"./TripOptionConfig.vue?vue&type=template&id=65efbd82&ts=true&lang=pug\"\nimport script from \"./TripOptionConfig.vue?vue&type=script&lang=ts\"\nexport * from \"./TripOptionConfig.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, vModelCheckbox as _vModelCheckbox, withDirectives as _withDirectives, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"form-check form-switch\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"label\", { class: \"form-check-label\" }, \"Display Dates and Times\", -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"form\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _hoisted_2,\n _withDirectives(_createElementVNode(\"input\", {\n class: \"form-check-input datetime-mode-switch\",\n type: \"checkbox\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.showTime) = $event))\n }, null, 512), [\n [_vModelCheckbox, _ctx.showTime]\n ])\n ])\n ]))\n}","\nimport { DisplayOptions } from '@/parts/DisplayOptions';\nimport { computed, defineComponent, PropType } from 'vue';\n\nexport default defineComponent({\n name: 'DisplayOptionConfig',\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n },\n setup(props, { emit }) {\n const showTime = computed({\n get() {\n return props.modelValue.useConcreteTime;\n },\n set(useConcreteTime) {\n const cl = { ...props.modelValue, useConcreteTime };\n emit('update:modelValue', cl);\n },\n });\n\n return { showTime };\n },\n});\n","import { render } from \"./DisplayOptionConfig.vue?vue&type=template&id=3364eefc&ts=true&lang=pug\"\nimport script from \"./DisplayOptionConfig.vue?vue&type=script&lang=ts\"\nexport * from \"./DisplayOptionConfig.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export class DisplayOptions {\n useConcreteTime = false;\n}\n","import { TripDetail } from '@/services/trips/trip';\n\nexport function countTripNights(trip: TripDetail): number {\n return trip.cities.reduce((acc, city) => acc + city.nights, 0);\n}\n","import { TripCity } from '@/services/trips/trip';\nimport { NormalizedList, normalizeList } from '@/utils/normalized';\nimport { DateTime } from 'luxon';\n\nexport interface CityStartDate {\n cityId: string;\n date: DateTime;\n}\n\nexport function cityStartDates(\n cities: TripCity[],\n firstStart: DateTime,\n): CityStartDate[] {\n let nights = 0;\n return cities.map((c) => {\n const result = {\n cityId: c.id,\n date: firstStart.plus({ days: nights }),\n };\n nights += c.nights;\n return result;\n });\n}\n\nexport function normalizedCityStartDates(\n cities: TripCity[],\n firstStart: DateTime,\n): NormalizedList {\n const dates = cityStartDates(cities, firstStart);\n const convertedInfo = dates.map((dateInfo) => ({\n id: dateInfo.cityId,\n ...dateInfo,\n }));\n return normalizeList(convertedInfo);\n}\n","\nimport {\n computed,\n defineComponent,\n onUnmounted,\n PropType,\n provide,\n ref,\n watch,\n} from 'vue';\nimport { ManagedPointDisplay } from '@/parts/ManagedPointDisplay';\nimport { TripCity, TripDetail, TripOptions } from '@/services/trips/trip';\nimport { CITY_PIN_ICON_CLASS, CITY_PIN_Z_INDEX } from '@/icon-styling';\nimport {\n normalizedCopyAndAppend,\n NormalizedList,\n normalizeList,\n rebuildFromNormalized,\n} from '@/utils/normalized';\nimport { SearchResult } from '@/services/map-service/location-search/search-result';\nimport CityModalContent from './city-modal/CityModalContent.vue';\nimport TripCityViewer from './TripCityViewer.vue';\nimport PointList from '../utils/PointList.vue';\nimport FaIconModalTrigger from '@/components/utils/modals/FaIconModalTrigger.vue';\nimport TripOptionConfig from '@/components/option-config/TripOptionConfig.vue';\nimport DisplayOptionConfig from '@/components/option-config/DisplayOptionConfig.vue';\nimport InlineDuration from '@/components/utils/InlineDuration.vue';\nimport ModalTrigger from '@/components/utils/modals/ModalTrigger.vue';\nimport CostDisplay from '@/components/utils/CostDisplay.vue';\nimport { DI } from '@/di';\nimport { TripApiService } from '@/services/trips/trip-service.interface';\nimport { PointSetDisplayType } from '@/map-display';\nimport { DisplayOptions } from '@/parts/DisplayOptions';\nimport { DISPLAY_OPTION_KEY } from '@/parts/injection-keys';\n\nimport { countTripNights } from '@/parts/night-counter';\n\nimport { normalizedCityStartDates } from '@/parts/city/city-start-dates';\nimport { DateTime } from 'luxon';\nimport { TotalCityCostCalculator } from '@/parts/TotalCityCostCalculator';\nimport { Debouncer } from '@/utils/Debouncer';\n\nexport default defineComponent({\n name: 'TripViewer',\n components: {\n CityModalContent,\n CostDisplay,\n DisplayOptionConfig,\n FaIconModalTrigger,\n InlineDuration,\n PointList,\n ModalTrigger,\n TripCityViewer,\n TripOptionConfig,\n },\n props: {\n modelValue: {\n type: Object as PropType,\n required: true,\n },\n },\n setup(props, { emit }) {\n const service = DI.get(TripApiService);\n const collapsed = ref(false);\n\n const changeDebounce = new Debouncer(1000, (part: Partial) => {\n const trip = { ...props.modelValue, ...part };\n emit('update:modelValue', trip);\n });\n\n onUnmounted(() => {\n changeDebounce.fireImmediately();\n });\n\n function scheduleNoteUpdate(event: InputEvent) {\n const notes = (event?.target as HTMLTextAreaElement).value;\n changeDebounce.startDebounce({ notes });\n }\n\n function scheduleCostUpdate(cost: number) {\n changeDebounce.startDebounce({ cost });\n }\n\n const displayOptions = ref(new DisplayOptions());\n provide(DISPLAY_OPTION_KEY, displayOptions);\n\n const display = new ManagedPointDisplay(\n computed(() => props.modelValue.cities),\n PointSetDisplayType.All,\n );\n display.iconClass = CITY_PIN_ICON_CLASS;\n display.zIndex = CITY_PIN_Z_INDEX;\n display.polyinfo = {\n color: '',\n };\n\n const nightTotal = computed(() => countTripNights(props.modelValue));\n const costTotal = computed(() => {\n const cityCostCalc = new TotalCityCostCalculator(props.modelValue.cities);\n return cityCostCalc.totalCost() + (props.modelValue.cost || 0);\n });\n\n const cityDateInfo = computed(() => {\n const start = props.modelValue.options?.startDate;\n if (!start) return undefined;\n else return normalizedCityStartDates(props.modelValue.cities, start);\n });\n\n const normalizedPoints = computed({\n get() {\n return normalizeList(props.modelValue.cities);\n },\n set(pnts: NormalizedList) {\n const trip = { ...props.modelValue };\n trip.cities = rebuildFromNormalized(pnts);\n trip.cities = trip.cities.map((city) => {\n const clone = { ...city };\n let overnights = 0;\n clone.points = city.points.filter((pnt) => {\n if (pnt.is_overnight) {\n ++overnights;\n return overnights <= city.nights;\n }\n return true;\n });\n const stay = clone.stay_at;\n if (stay) {\n clone.points.forEach((p) => {\n if (p.is_overnight) {\n p.lat = stay.lat;\n p.lng = stay.lng;\n }\n });\n }\n return clone;\n });\n emit('update:modelValue', trip);\n },\n });\n function addSearched(result: SearchResult) {\n const item = service.createCityFromSearch(result);\n normalizedPoints.value = normalizedCopyAndAppend(\n normalizedPoints.value,\n item,\n );\n }\n\n function emitBack() {\n emit('back');\n }\n\n function updateOptions(newOpts: TripOptions) {\n const clone = { ...props.modelValue };\n clone.options = newOpts;\n emit('update:modelValue', clone);\n }\n\n function generateNightCbObject(\n point: TripCity,\n callback: (point: TripCity) => void,\n ) {\n return {\n cb: (nights: number) => {\n callback({ ...point, nights });\n },\n };\n }\n\n function getCityNightsButtonText(cityId: string) {\n if (!displayOptions.value.useConcreteTime || !cityDateInfo.value)\n return undefined;\n else {\n const date = cityDateInfo.value.values[cityId].date;\n return date.toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY);\n }\n }\n\n // TODO Remove or restrict this to something more reasonable\n // This doesn't really seem right, but testing had the full router view\n // text getting selected when removing the collapse, which also wasn't\n // great.\n watch(collapsed, () => {\n if (!collapsed.value) document.getSelection()?.removeAllRanges();\n });\n\n display.setup();\n\n return {\n emitBack,\n cityDateInfo,\n collapsed,\n display,\n displayOptions,\n normalizedPoints,\n nightTotal,\n costTotal,\n addSearched,\n updateOptions,\n generateNightCbObject,\n getCityNightsButtonText,\n scheduleNoteUpdate,\n scheduleCostUpdate,\n popupOpen: ref(false),\n };\n },\n});\n","import { render } from \"./TripViewer.vue?vue&type=template&id=7e1d2ba4&scoped=true&ts=true&lang=pug\"\nimport script from \"./TripViewer.vue?vue&type=script&lang=ts\"\nexport * from \"./TripViewer.vue?vue&type=script&lang=ts\"\n\nimport \"./TripViewer.vue?vue&type=style&index=0&id=7e1d2ba4&lang=stylus&scoped=true\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7e1d2ba4\"]])\n\nexport default __exports__","\nimport { computed, defineComponent, provide, ref, toRef, watch } from 'vue';\nimport { DI } from '@/di';\nimport { TripDetail, TripOptions } from '@/services/trips/trip';\nimport {\n TripDetailError,\n TripApiService,\n} from '@/services/trips/trip-service.interface';\nimport TripViewer from '@/components/trip-view/TripViewer.vue';\nimport { TRIP_OPTION_KEY } from '@/parts/injection-keys';\nimport { useRouter } from 'vue-router';\n\nfunction defaultOptions(): TripOptions {\n return {\n dayStartHour: 9,\n dayStartMinute: 0,\n };\n}\n\nexport default defineComponent({\n name: 'TripManager',\n components: {\n TripViewer,\n },\n props: {\n id: {\n type: String,\n required: true,\n },\n },\n setup(props) {\n const tripService = DI.get(TripApiService);\n const selectedTrip = ref(null);\n\n const options = computed(() => selectedTrip.value?.options);\n const router = useRouter();\n\n const hadSendError = ref(false);\n const noActivity = ref(false);\n // 2 minutes\n let timeout: number | undefined = undefined;\n\n function resetActivity() {\n if (timeout !== undefined) clearTimeout(timeout);\n timeout = setTimeout(() => {\n noActivity.value = true;\n }, 1000 * 60 * 5) as unknown as number;\n noActivity.value = false;\n }\n\n resetActivity();\n\n function goToSelection() {\n router.push({ name: 'TripSelect' });\n }\n\n provide(TRIP_OPTION_KEY, options);\n\n async function setSelection(tripId: string) {\n let detail = await tripService.getTripDetail(tripId);\n if (detail === TripDetailError.NOT_FOUND) goToSelection();\n else if (detail === TripDetailError.UNKNOWN) {\n setTimeout(() => {\n setSelection(tripId);\n }, 1000);\n } else {\n detail.options = { ...defaultOptions(), ...detail.options };\n selectedTrip.value = detail;\n }\n }\n\n setSelection(props.id);\n\n watch(toRef(props, 'id'), () => setSelection(props.id));\n\n async function doTripUpdate(trip: TripDetail) {\n selectedTrip.value = trip;\n const result = await tripService.updateTrip(trip);\n hadSendError.value = !result;\n resetActivity();\n }\n\n return {\n selectedTrip,\n goToSelection,\n doTripUpdate,\n options,\n hadSendError,\n noActivity,\n resetActivity,\n };\n },\n});\n","import { render } from \"./TripDetailView.vue?vue&type=template&id=40577a8f&scoped=true&ts=true&lang=pug\"\nimport script from \"./TripDetailView.vue?vue&type=script&lang=ts\"\nexport * from \"./TripDetailView.vue?vue&type=script&lang=ts\"\n\nimport \"./TripDetailView.vue?vue&type=style&index=0&id=40577a8f&lang=stylus&scoped=true\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-40577a8f\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"left-hud ed-scrollable\" }\nconst _hoisted_2 = { class: \"d-flex flex-column align-items-center\" }\nconst _hoisted_3 = [\"onClick\"]\nconst _hoisted_4 = {\n key: 0,\n class: \"mt-2 mb-0\",\n id: \"ts-horiz-rule\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_trip_creator = _resolveComponent(\"trip-creator\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.trips, (trip) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"trip-item primary-clickable\",\n key: trip._id,\n onClick: ($event: any) => (_ctx.triggerNav(trip))\n }, _toDisplayString(trip.name), 9, _hoisted_3))\n }), 128)),\n (_ctx.trips.length > 0)\n ? (_openBlock(), _createElementBlock(\"hr\", _hoisted_4))\n : _createCommentVNode(\"\", true),\n _createVNode(_component_trip_creator, { onNewTrip: _ctx.processNewTrip }, null, 8, [\"onNewTrip\"])\n ])\n ]))\n}","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, withModifiers as _withModifiers } from \"vue\"\n\nconst _hoisted_1 = { class: \"trip-creator\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (!_ctx.creating)\n ? (_openBlock(), _createElementBlock(\"i\", {\n key: 0,\n class: \"trip-create-plus bi bi-plus text-center primary-clickable\",\n onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.startCreate && _ctx.startCreate(...args)))\n }))\n : (_openBlock(), _createElementBlock(\"form\", {\n key: 1,\n class: \"d-flex flex-row\",\n ref: \"form\",\n onSubmit: _cache[3] || (_cache[3] = _withModifiers(() => {}, [\"prevent\"])),\n onFocusout: _cache[4] || (_cache[4] = \n//@ts-ignore\n(...args) => (_ctx.focusLeaving && _ctx.focusLeaving(...args)))\n }, [\n _withDirectives(_createElementVNode(\"input\", {\n class: \"form-control\",\n id: \"tc-name-input\",\n ref: \"nameInput\",\n type: \"text\",\n placeholder: \"Trip Name\",\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_ctx.tripName) = $event))\n }, null, 512), [\n [_vModelText, _ctx.tripName]\n ]),\n _createElementVNode(\"input\", {\n class: \"btn btn-primary\",\n id: \"tc-submit\",\n type: \"submit\",\n value: \"Create\",\n onClick: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.doCreate && _ctx.doCreate(...args)))\n })\n ], 544))\n ]))\n}","\nimport { defineComponent, nextTick, ref } from 'vue';\nimport { DI } from '../di';\nimport { TripApiService } from '../services/trips/trip-service.interface';\n\nexport default defineComponent({\n setup(_props, { emit }) {\n const tripService = DI.get(TripApiService);\n const creating = ref(false);\n const form = ref(null);\n const nameInput = ref(null);\n const tripName = ref('');\n\n const startCreate = () => {\n creating.value = true;\n nextTick(() => nameInput.value?.focus());\n };\n\n const doCreate = async () => {\n let trip = await tripService.newTrip(tripName.value);\n if (trip) {\n emit('newTrip', trip);\n tripName.value = '';\n creating.value = false;\n } else {\n // TODO better error handling, show message\n }\n };\n\n const focusLeaving = (evt: FocusEvent) => {\n if (\n evt.relatedTarget &&\n !form.value?.contains(evt.relatedTarget as Node)\n ) {\n creating.value = false;\n tripName.value = '';\n }\n };\n\n return {\n creating,\n tripName,\n nameInput,\n startCreate,\n doCreate,\n form,\n focusLeaving,\n };\n },\n});\n","import { render } from \"./TripCreator.vue?vue&type=template&id=34480604&ts=true&lang=pug\"\nimport script from \"./TripCreator.vue?vue&type=script&lang=ts\"\nexport * from \"./TripCreator.vue?vue&type=script&lang=ts\"\n\nimport \"./TripCreator.vue?vue&type=style&index=0&id=34480604&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { defineComponent, ref } from 'vue';\nimport { DI } from '../di';\nimport { Trip } from '@/services/trips/trip';\nimport { TripApiService } from '@/services/trips/trip-service.interface';\nimport TripCreator from './TripCreator.vue';\nimport { Logger } from '@/utils/logger';\nimport { useRouter } from 'vue-router';\n\nexport default defineComponent({\n components: { TripCreator },\n setup() {\n const tripService = DI.get(TripApiService);\n const trips = ref([]);\n const router = useRouter();\n\n const loadTrips = async () => {\n let tripResults = await tripService.getCurrentUserTrips();\n if (tripResults != null) {\n trips.value = tripResults;\n } else {\n //TODO display an error\n Logger.error(\"Couldn't get trips for current user\");\n }\n };\n const triggerNav = (trip: Trip) => {\n router.push({ name: 'TripDetail', params: { id: trip._id } });\n };\n\n const processNewTrip = (trip: Trip) => {\n trips.value.push(trip);\n };\n\n loadTrips();\n return {\n trips,\n loadTrips,\n triggerNav,\n processNewTrip,\n };\n },\n});\n","import { render } from \"./TripSelector.vue?vue&type=template&id=d25ddcc6&ts=true&lang=pug\"\nimport script from \"./TripSelector.vue?vue&type=script&lang=ts\"\nexport * from \"./TripSelector.vue?vue&type=script&lang=ts\"\n\nimport \"./TripSelector.vue?vue&type=style&index=0&id=d25ddcc6&lang=stylus\"\n\nimport exportComponent from \"/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';\nimport Home from '../views/Home.vue';\nimport TripDetailView from '../views/TripDetailView.vue';\nimport TripSelector from '@/components/TripSelector.vue';\nimport { DI } from '@/di';\nimport { UserInfoService } from '@/services/user-management/user-info.interface';\n\nconst routes: Array = [\n {\n path: '/',\n component: Home,\n children: [\n { name: 'TripSelect', path: '', component: TripSelector },\n {\n name: 'TripDetail',\n path: '/trip/:id',\n props: true,\n component: TripDetailView,\n meta: {\n auth: true,\n },\n },\n ],\n },\n {\n path: '/about',\n name: 'About',\n // route level code-splitting\n // this generates a separate chunk (about.[hash].js) for this route\n // which is lazy-loaded when the route is visited.\n component: () =>\n import(/* webpackChunkName: \"about\" */ '../views/About.vue'),\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(process.env.BASE_URL),\n routes,\n});\n\nrouter.beforeEach(async (to) => {\n const userService = DI.get(UserInfoService);\n await userService.waitForLoad();\n if (!userService.getCurrentUser().value && to.meta['auth']) return '/';\n else return true;\n});\n\nexport default router;\n","import axios from 'axios';\nimport { createApp } from 'vue';\nimport App from './App.vue';\nimport './styling/index.styl';\nimport '@fortawesome/fontawesome-free/css/all.css';\nimport 'tippy.js';\nimport 'tippy.js/dist/tippy.css';\nimport 'tippy.js/themes/light.css';\nimport 'ol/ol.css';\nimport 'bootstrap-icons/font/bootstrap-icons.css';\nimport 'bootstrap/dist/js/bootstrap.bundle.js';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport router from './router';\nimport { bindServices } from './di';\n\nconst is_ip = window.location.hostname.match(\n /[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}/,\n);\n\naxios.defaults.baseURL = process.env.VUE_APP_BASE_URL;\n\nif (\n !axios.defaults.baseURL ||\n is_ip ||\n window.location.hostname === 'localhost'\n) {\n const port = process.env.VUE_APP_API_PORT;\n axios.defaults.baseURL = `${window.location.protocol}//${\n window.location.hostname\n }:${port || 3000}`;\n}\n\naxios.defaults.withCredentials = true;\n\nbindServices();\n\ncreateApp(App).use(router).mount('#app');\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + \"about\" + \"-legacy.\" + \"cb81d2ab\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"eighty-days-client:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkeighty_days_client\"] = self[\"webpackChunkeighty_days_client\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(2189); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["script","__exports__","render","_withScopeId","n","_hoisted_1","class","_hoisted_2","key","_hoisted_3","_","src","alt","_hoisted_4","_ctx","_cache","$props","$setup","$data","$options","_component_hud","_component_open_layers_map","_component_user_management","haveUser","id","tabindex","_component_map_marker","_component_map_polyline","map","markerPoints","marker","polylines","line","BasicOsmTileService","attribution","MapTileService","Symbol","LocationSearchService","UserInfoService","BasicUserInfoService","this","loader","refreshCurrentUser","finally","err","response","data","message","userManagementErrorMessage","value","userRef","result","axiosErr","username","password","length","setErrorMessage","TripDetailError","TripApiService","TripPointType","prepareOptionsForApi","options","startDate","toFormat","undefined","prepareTripForApi","trip","updatedCities","cities","city","clone","points","point","is_overnight","with_stay_ll","stay_at","lat","lng","subtrip","_id","newTripData","convertId","v","normalizeTripForUI","forEach","enter_via","exit_via","nights","notes","pt","minutes","cost","overnightCount","reduce","newPoints","aliasedPoint","push","BasicTripService","status","NOT_FOUND","UNKNOWN","normalized","name","location","place_id","generatedIdents","type","OTHER","outgoing_travel","JSON","stringify","parse","e","PointSetService","ArrayPointSetService","pointSets","resolvedSets","r","set","idx","findIndex","splice","ps","MapDisplayInfoService","OpenLayersMapDisplayInfoService","center","getView","getCenter","ll","mapPoint","animate","duration","getZoom","TripIconSet","ic","FAIconSet","ARRIVAL","AIRPORT","BUS_STOP","BOAT","CABLE_CAR","TRAIN_STATION","HOTEL","BUILDING","AREA","STORE","PARK","HERITAGE","SPA","WATER","RESTAURANT","CHURCH","EXPERIENCE","DirectionRouterService","TripTextualizer","ComputedPolylineManager","ArrayPolylineManager","flatPolylines","flatMap","polyref","ref","computation","filter","MapVectorJsonService","LocalOpenMapTilesVectorJsonService","window","hostname","MAX_LOCATION_PARTS","titleCaseValue","spaced","replace","split","word","charAt","toUpperCase","slice","join","BAD_VALUES","isValueUsable","indexOf","PhotonSearchService","autocompletionLimits","search","llPart","findCloseTo","zoomScale","mapZoom","queryPart","input","toLowerCase","lang","url","withCredentials","convertResultGeoJson","results","featProps","features","feat","properties","locationParts","street","countrycode","locationDrilldown","osm_value","typePart","fullDetail","detail","geometry","coordinates","osm_id","ConsoleLogger","msg","console","error","warn","log","RouteType","LoggerService","RoutingResultCache","limit","Map","ident","lru","val","mapping","delete","shift","refreshUsage","cached","get","delegateLog","k","service","DI","isBound","JEST_WORKER_ID","PathTravelType","Logger","MAX_RESULT_CACHE_SIZE","POLYLINE_PRECISION","PATH_TO_ROUTE_TYPE","CAR","WALK","BackendRouterService","req","polyline","encode","p","polystring","seconds","strippedPoints","lon","lru_cache","getResult","getRawRoutes","res","routes","route","legs","leg","polyTuples","decode","tuple","insertResult","TimezoneLookupService","ServerTzLookupService","resp","tz","GlobalClickTracker","DocumentClickTracker","callback","notify","bind","document","addEventListener","evt","observers","obs","onClick","target","remove","removeEventListener","GeoapifyTileService","apiKey","TILE_THEME","Error","retinaStr","extension","fullString","GEOAPIFY_RASTER_URL_BASE","maxZoom","PointSetDisplayType","bindServices","to","inSingletonScope","InterestType","PointSet","displayType","iconClass","color","PointSetCollapse","getPointSets","Markers","display","displayOptions","zIndex","BASE_PIN_COLOR","SEARCH_HIGHLIGHT_PIN_COLOR","CITY_STAY_AT_PIN_COLOR","CITY_STAY_AT_PIN_HIGHLIGHT","CITY_VIA_PIN_COLOR","CITY_VIA_PIN_HIGHLIGHT","CITY_PIN_ICON_CLASS","SEARCH_PIN_ICON_CLASS","GENERIC_TRIP_POINT_ICON_CLASS","CITY_PIN_Z_INDEX","SEARCH_PIN_Z_INDEX","BASE_PATH_COLOR","CITY_DAY_COLORS","CITY_DAY_HIGHLIGHTS","PolylineFinder","pointSetPolys","setService","s","Polyline","polyColor","polyinfo","polyDash","dashes","specColor","dashPattern","computedPolys","polyManager","getPolylines","compPoly","displayInfo","concat","dashArray","dashOffset","LeafletMapDisplayInfoService","getBounds","panTo","props","Object","required","String","Number","setup","icon","buildMarker","mark","addTo","buildIcon","styleString","htmlIconClass","IW","IH","Math","sqrt","className","html","iconSize","iconAnchor","reloadMarker","setLatLng","setIcon","setZIndexOffset","reloadIcon","off","deep","Array","doRouting","Boolean","routerService","routedPoints","polyPoints","buildPolyline","latlngs","setLatLngs","setStyle","requestRouting","getRoutedPoints","newRoutedPoints","newMap","tileService","zoomControl","setView","buildLeafletTileUrl","buildOptions","zoomCtrl","position","components","MapMarker","MapPolyline","displayInfoService","raw","collapser","polyFinder","doPostMountInit","setMap","destroyMap","lines","_component_open_layer_marker","_component_open_layer_polyline","onMouseenter","focusMap","polylineSource","stylefunction","_component_bounce_animation","highlighted","isHighlighted","title","hoverText","default","style","defaultedIconClasses","bouncing","animationRunning","onAnimationiteration","animationIterationComplete","onAnimationend","$event","$slots","newAnim","BounceAnimation","highlightColor","overlay","Overlay","stopEvent","positioning","elementSet","propColor","cls","updateOverlay","setPosition","setElement","addOverlay","removeOverlay","vectorSource","feature","Feature","updateGeom","mapPoints","mp","setGeometry","LineString","updateStyle","Style","stroke","Stroke","width","lineDash","addFeature","removeFeature","MIN_UPDATE_MILLIS","OpenLayerMarker","OpenLayerPolyline","mapDiv","vectorService","btns","buttons","which","elem","getTargetElement","focus","lastUpdate","resized","now","Date","delta","updateSize","setTimeout","getTileLayer","isMapboxVectorStyle","MapboxVector","styleUrl","getStyleUrl","VectorTile","declutter","source","attributions","getOpenLayersAttributions","format","MVT","buildOpenLayersTileUrl","tileLayer","polylineLayer","Vector","theMap","layers","view","View","zoom","observer","ResizeObserver","observe","_component_router_view","currentUser","userService","getCurrentUser","openForm","onFocusout","focusLeaving","expanded","onSubmit","handleSubmit","errorMessage","placeholder","submitText","doingSignup","href","role","swapText","doLogout","infoService","usernameInput","rootDiv","logoutButton","doSignup","doLogin","relatedTarget","contains","formClasses","collapsed","LeafletMap","OpenLayersMap","Hud","UserManagement","_hoisted_5","_hoisted_6","_component_trip_viewer","selectedTrip","modelValue","doTripUpdate","onBack","goToSelection","hadSendError","noActivity","resetActivity","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_component_trip_option_config","_component_cost_display","_component_display_option_config","_component_fa_icon_modal_trigger","_component_inline_duration","_component_trip_city_viewer","_component_city_modal_content","_component_point_list","emitBack","nightTotal","costTotal","updateOptions","scheduleCostUpdate","onInput","scheduleNoteUpdate","normalizedPoints","onAddSearched","addSearched","inline","updatePoint","mode","suffix","singular","plural","generateNightCbObject","cb","buttonText","getCityNightsButtonText","expansion","settings","ManagedPointDisplay","pointsWithHover","poi","setRef","pointService","removePointSet","addPointSet","register","destroy","normalizeList","list","ordering","values","normalizedCopyAndAppend","item","rebuildFromNormalized","_component_editable_title","_component_city_night_count","patchAndEmitCity","cityCost","$emit","editing","headerClicked","currentTitle","onKeyup","editComplete","emit","clickHandler","handleTitleInput","newValue","select","addObserver","removeObserver","_component_ed_popup","showPopup","picking","placement","onHidden","popupHidden","root","buttonClick","btnText","popup","min","step","singleStep","onMouseover","storedValue","number","currentSuffix","emits","tooltip","trigger","content","interactive","theme","popperOptions","strategy","openPopup","show","getSelection","empty","removeAllRanges","hide","setProps","EdPopup","mainText","invalid","isNaN","InlineDuration","updateCost","parseInt","Debouncer","debounceWait","combineDebounced","timeout","clearTimeout","TotalCityCostCalculator","stay","enter","exit","fromCity","fromPoints","acc","fromSpecial","getSpecialPointCosts","calculateOneCityCost","cityCosts","NOTE_DEBOUNCE","EditableTitle","CityNightCount","CostDisplay","changeDebounce","existing","newData","patch","newCity","startDebounce","event","fireImmediately","totalCost","_component_point_modal_content","_component_point_list_item","_component_point_travel_info","_component_city_point_time","_component_overnight_modal_content","singlePoints","handle","onSearchComplete","change","onCenterOnThis","centerMap","setHoverPoint","onMouseleave","clearHoverPoint","boundSet","startBottomBorderStyle","getDayDisplayString","legOptions","iconMap","borderMap","onItemHoverStart","onItemHoverEnd","normalizedDays","day","getTimeInfo","displayOpts","useConcreteTime","defaultDayHour","defaultDayMinute","intermediate","showPointTravelOptions","convertPoint","getTripIconClass","CitySpecialPointFinder","enterPoint","exitPoint","stayPoint","enterExitPoints","combinedPoints","allSpecials","cp","CityPointAnnotator","pointsWithSpecials","getPointsWithSpecials","pointsWithoutSpecials","getPointsWithoutSpecials","fixedOvernights","getWithVerifiedOvernights","getAnnotatedPoints","CityPointFlattener","specialFinder","annotator","flatCityPoints","noSpecials","_component_draggable","_component_hidden_finder","draggableList","group","actualDragGroup","element","itemClass","padAll","locked","idIconMap","getItemBorder","changePoint","onDelete","deletePoint","centerOnItem","onLocationChosen","addPoint","_component_location_finder","hidden","locationChosen","clearOnChosen","focusOnChosen","onUnsearch","hoverInfoText","arrow","wasHidden","swapToSearch","nameMismatch","invisible","locationName","fallbackInfoText","selected","onBlur","maybeUnsearch","loadFinalResults","showResults","i","itemClicked","setHighlight","removeHighlight","LocationSearchComponent","searchText","searching","isAuto","mapService","getMapZoom","searchRequest","isAutocomplete","getMapCenter","floor","searchService","doLocationSearch","unwrappedResults","loadResults","ResultDisplayManager","focusOnHighlight","mounted","displayed","pointSetService","index","focusMapOnResult","setMapCenter","takeMountFocus","nameAtSearchStart","searchBox","resultDiv","searchComponent","displayedResults","resultDisplay","resetResults","newLoc","LocationFinder","allowExpansion","emitPointChange","itemDescription","itemHover","allowInline","allowSettings","allowCentering","centerMapOnPoint","allowDelete","emitDelete","doExpansion","_component_ed_modal","classes","control","modalOpened","modalTriggerEntered","onHide","modalHidden","ModalControl","wasLocalHide","showModal","_props","ctx","tracker","modal","Node","EdModal","closedClass","FaIconModalTrigger","allowIntermediate","closeSettings","settingsChanging","showSettings","doSettings","searchItem","settingsClicked","hideSettings","getPointListBottomBorderStyle","generatedGroup","HiddenFinder","PointListItem","draggable","idBorderMap","dragGroup","newOrder","elemId","newPoint","pointId","displayTime","dt","displayTimeRange","start","end","startTime","endTime","useTimeOfDay","_component_city_point_config","patchAndEmitPoint","iconOptions","opt","icons","newName","setName","CityPointConfig","hour","hourOptions","num","str","minute","minuteOptions","SettableProps","emitString","prop","parser","out","defaultHour","defaultMinute","timeOptions","settable","copy","start_hour","start_minute","getPropRef","maxExclusive","padStart","from","_component_leg_info_display","pointRouteTypes","ty","getTypeInfoBinding","setSelectedTravelType","timeString","hoursAndMinutesComputer","hoursAndMinutes","totalMinutes","ceil","hours","useMinutes","hourString","minuteString","ICON_MAP","MAX_LEG_SECONDS","LEG_DISPLAY_ORDER","LegInfoDisplay","keys","sort","a","b","binding","text","getOvernightIconMap","iconClasses","records","getOvernightBorderColors","ManagedComputedPoly","poly","oldToken","polyService","addPolylineComputation","registered","removePolylineComputation","registerPolyComputation","OneCityMapDisplay","flattener","router","highlight","markerDisplay","hlPoint","polys","dayPolys","routeData","days","fullRoute","polyDisplay","hlId","AsyncRef","watchSrc","syncCb","asyncCallback","watchOptsOrErrFn","watchOptsWithFn","syncCallback","Function","valueRef","doAsyncUpdate","watchOpts","errCallback","doSyncOnWatchTrigger","CityRouter","dayLister","dayLists","computeSync","computeAsync","dayPoints","arrayToLegsSync","details","totalSeconds","routePromises","Promise","allSettled","routeResults","promisedRoute","legsToRoute","routeOptions","singleLegOptionMap","chosen","find","preferred","walk","car","pickFirstValidLeg","routeOpt","pointArr","onePoint","CityDayListFinder","getCityDayLists","dayCount","lists","pl","l","isLastDay","PointTimeInfoCalculator","timezone","tzService","getTimezone","timeInfo","buildTimeInfo","zone","tripOpts","dayStart","createTime","dayStartHour","dayStartMinute","firstDay","identPoints","cityRouteTimeInfo","fullTime","sum","c","plus","currentTime","defaultStart","oneRouteTimeInfo","TRIP_OPTION_KEY","DISPLAY_OPTION_KEY","OnePointSetup","model","iconService","defaultType","createPointFromSearch","PointList","CityPointTime","ModalTrigger","PointTravelInfo","PointModalContent","OvernightModalContent","listManager","timeCalculator","asRef","legOptMapping","listedPoints","overnightNum","pnts","zipped","arrivalDayHasPoints","getDayDurationString","pointTime","routeTime","getTimeOfDayString","equals","clearHighlight","_component_date_picker","updateStartDate","DatePicker","settableProps","newDate","updateTo","updated","showTime","cl","DisplayOptions","countTripNights","cityStartDates","firstStart","cityId","date","normalizedCityStartDates","dates","convertedInfo","dateInfo","CityModalContent","DisplayOptionConfig","TripCityViewer","TripOptionConfig","part","All","cityCostCalc","cityDateInfo","overnights","pnt","createCityFromSearch","newOpts","toLocaleString","popupOpen","defaultOptions","TripViewer","tripService","setSelection","tripId","getTripDetail","updateTrip","_component_trip_creator","trips","triggerNav","onNewTrip","processNewTrip","creating","tripName","doCreate","startCreate","form","nameInput","newTrip","TripCreator","loadTrips","getCurrentUserTrips","tripResults","params","path","component","Home","children","TripSelector","TripDetailView","meta","auth","history","beforeEach","waitForLoad","is_ip","match","port","VUE_APP_API_PORT","protocol","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","d","definition","o","defineProperty","enumerable","f","chunkId","all","promises","u","miniCssF","g","globalThis","obj","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","done","needAttach","scripts","getElementsByTagName","getAttribute","createElement","charset","nc","setAttribute","onScriptComplete","prev","onerror","onload","doneFns","parentNode","removeChild","head","appendChild","toStringTag","installedChunks","installedChunkData","promise","resolve","reject","loadingEnded","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}