{"version":3,"file":"js/app.9425fe1a.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/routing-result-cache.ts","webpack://eighty-days-client/./src/services/map-service/routing/route-type.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","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","export enum RouteType {\n WALK = 'walk',\n CAR = 'car',\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\" + \".\" + \"e8641af0\" + \".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__(4879); })\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","buildLeafletTileUrl","buildOptions","attribution","MapTileService","Symbol","LocationSearchService","UserInfoService","BasicUserInfoService","constructor","this","loader","refreshCurrentUser","finally","setErrorMessage","err","response","data","message","userManagementErrorMessage","value","getCurrentUser","userRef","result","e","axiosErr","username","password","length","TripApiService","TripDetailError","TripPointType","prepareOptionsForApi","options","startDate","toFormat","undefined","prepareTripForApi","trip","updatedCities","cities","city","clone","points","point","is_overnight","with_stay_ll","stay_at","lat","lng","_id","subtrip","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","createCityFromSearch","location","place_id","generatedIdents","createPointFromSearch","type","OTHER","outgoing_travel","tripToText","JSON","stringify","textToTrip","parse","PointSetService","ArrayPointSetService","pointSets","resolvedSets","r","getPointSets","removePointSet","set","idx","findIndex","splice","addPointSet","ps","clearPointSets","MapDisplayInfoService","OpenLayersMapDisplayInfoService","setMap","getMapCenter","center","getView","getCenter","ll","setMapCenter","mapPoint","animate","duration","getMapZoom","getZoom","TripIconSet","ic","FAIconSet","getTripIconClass","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","addPolylineComputation","ref","computation","removePolylineComputation","filter","getPolylines","MapVectorJsonService","LocalOpenMapTilesVectorJsonService","getStyleUrl","buildOpenLayersTileUrl","window","hostname","getOpenLayersAttributions","MAX_LOCATION_PARTS","titleCaseValue","spaced","replace","split","word","charAt","toUpperCase","slice","join","BAD_VALUES","isValueUsable","indexOf","PhotonSearchService","getEngineSpecification","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","LoggerService","RoutingResultCache","limit","Map","refreshUsage","ident","lru","val","insertResult","mapping","delete","shift","getResult","cached","get","RouteType","delegateLog","k","service","DI","isBound","JEST_WORKER_ID","Logger","MAX_RESULT_CACHE_SIZE","POLYLINE_PRECISION","PathTravelType","PATH_TO_ROUTE_TYPE","CAR","WALK","BackendRouterService","req","polyline","encode","p","polystring","seconds","strippedPoints","lon","lru_cache","res","getRawRoutes","routes","route","legs","leg","polyTuples","decode","tuple","TimezoneLookupService","ServerTzLookupService","resp","tz","GlobalClickTracker","DocumentClickTracker","callback","notify","bind","document","addEventListener","evt","observers","obs","onClick","target","addObserver","removeObserver","remove","unregister","removeEventListener","GeoapifyTileService","apiKey","TILE_THEME","Error","retinaStr","extension","fullString","GEOAPIFY_RASTER_URL_BASE","maxZoom","bindServices","to","inSingletonScope","PointSetDisplayType","InterestType","PointSet","displayType","iconClass","color","PointSetCollapse","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","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","async","requestRouting","newRoutedPoints","getRoutedPoints","newMap","tileService","zoomControl","setView","zoomCtrl","position","components","MapMarker","MapPolyline","displayInfoService","raw","collapser","polyFinder","doPostMountInit","destroyMap","lines","_component_open_layer_marker","_component_open_layer_polyline","onMouseenter","args","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","VectorTile","declutter","source","attributions","format","MVT","tileLayer","polylineLayer","Vector","theMap","layers","view","View","zoom","observer","ResizeObserver","observe","_component_router_view","currentUser","userService","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","destroy","pointService","register","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","_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","startDebounce","timeout","clearTimeout","fireImmediately","TotalCityCostCalculator","getSpecialPointCosts","stay","enter","exit","calculateOneCityCost","fromCity","fromPoints","acc","fromSpecial","cityCosts","normalizedCityCosts","totalCost","NOTE_DEBOUNCE","EditableTitle","CityNightCount","CostDisplay","changeDebounce","existing","newData","patch","newCity","event","_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","CitySpecialPointFinder","enterPoint","exitPoint","stayPoint","enterExitPoints","combinedPoints","allSpecials","cp","CityPointAnnotator","pointsWithSpecials","getPointsWithSpecials","pointsWithoutSpecials","getPointsWithoutSpecials","getWithVerifiedOvernights","fixedOvernights","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","searchRequest","isAutocomplete","floor","unwrappedResults","searchService","doLocationSearch","loadResults","resetResults","ResultDisplayManager","focusOnHighlight","mounted","displayed","pointSetService","index","focusMapOnResult","takeMountFocus","nameAtSearchStart","searchBox","resultDiv","searchComponent","displayedResults","resultDisplay","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","getPropRef","prop","parser","out","defaultHour","defaultMinute","settable","copy","start_hour","start_minute","timeOptions","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","registerPolyComputation","oldToken","polyService","registered","OneCityMapDisplay","flattener","router","highlight","markerDisplay","hlPoint","polys","dayPolys","routeData","days","fullRoute","polyDisplay","hlId","clearHighlight","AsyncRef","watchSrc","syncCb","asyncCallback","watchOptsOrErrFn","watchOptsWithFn","syncCallback","Function","valueRef","doAsyncUpdate","watchOpts","errCallback","doSyncOnWatchTrigger","asRef","CityRouter","dayLister","dayLists","computeSync","computeAsync","dayPoints","arrayToLegsSync","details","totalSeconds","routePromises","routeResults","Promise","allSettled","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","createTime","zone","tripOpts","dayStart","dayStartHour","dayStartMinute","firstDay","identPoints","cityRouteTimeInfo","fullTime","sum","c","plus","currentTime","defaultStart","oneRouteTimeInfo","TRIP_OPTION_KEY","DISPLAY_OPTION_KEY","OnePointSetup","model","iconService","defaultType","PointList","CityPointTime","ModalTrigger","PointTravelInfo","PointModalContent","OvernightModalContent","listManager","timeCalculator","legOptMapping","listedPoints","overnightNum","pnts","zipped","arrivalDayHasPoints","getDayDurationString","pointTime","routeTime","getTimeOfDayString","equals","_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","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","tripResults","getCurrentUserTrips","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":""}