{"version":3,"mappings":"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","names":["selector","init","$","idx","el","e","$this","TransitInfo_Modal","plainText","marker_tpl","_template","marker_template","default_selector","buildingMapMarker","public_transport_route_data_cache","route_groups","setMapMarker","market_lat_lng","data","map_layer","L","load_route_data_promise","public_transport_route_id","Promise","resolve","__vitePreload","Routes","q_ajax_3","LeafletSettings","load_route","route_layer_group","routeSegments","$transit_route_button","transport_type_icon","polyline_hex_color_code","name","latitude","longitude","lat","lng","stopLatLng","markerOptions","marker","route","sele","promises","$el","$mapCanvas","myCenter","baidu_latlng","Geometry_Coordinates_ValueFromWgs84ToGsj02Conversion_Op","Sidebar","LeafletMapTileLayer","map_tile_layer","transit_map","AppMapZoomLevels","Page","zoomControl","route_id_string","maps","Map","CELL_CLASS_NAME","CELL_INITIALIZED_CLASS_NAME","maps_promises","url","Modal","maps_of_maps","all_maps","CitiesPublicTransportInfoTable"],"ignoreList":[],"sources":["../../../app/assets/javascripts/concepts/cities/public_transport/modal/index.ts","../../../app/assets/javascripts/concepts/cities/public_transport/info/components/map/marker.html._tpl","../../../app/assets/javascripts/concepts/cities/public_transport/info/components/map/index.ts","../../../app/assets/javascripts/concepts/cities/public_transport/info/index.ts"],"sourcesContent":["\nimport $ from \"jquery\"\nimport \"bootstrap-tap\"\n\nconst selector = {\n scope: \".cell--cities--transit-info--modal\",\n tabs: \".modal-transit__btn-group\",\n btn: \".js-btn-select-group\",\n}\n\nconst init = () => {\n $(selector.scope).each((idx, el) => {\n const $el = $(el)\n const $tabs = $el.find(selector.tabs)\n const $btn = $tabs.find(selector.btn)\n\n // # Register the event\n $btn.on(\"click\", (e) => {\n e.preventDefault()\n\n const $this = $(e.target)\n\n // # This switch tab\n $this.tab(\"show\")\n // # This creates the button switch effect\n // $tab_btn_group.find(\".active\").removeClass(\"active\")\n $this.addClass(\"active\")\n })\n })\n}\n\nexport default {init}\n","
\n\t
\n\t\t
\n\t\t\t<%= text %>\n\t\t
\n\t\t
\n\t\t
\n\t\t
\n\t
\n
\n","\n// region JS Imports\n\n// region External Modules\nimport u from \"umbrellajs\"\nimport _template from \"lodash/template\"\nimport Promise from \"plugins/bluebird/index\"\nimport L from \"plugins/leaflet/index\"\n// endregion External Modules\n\n// Private Modules\nimport {Page} from \"app/multi_device\"\n\nimport AppMapZoomLevels from \"app/map/zoom_levels\"\nimport LeafletMapTileLayer from \"app/map/leaflet/map_tile_layer\"\nimport LeafletSettings from \"app/map/leaflet/settings\"\n\nimport Geometry_Coordinates_ValueFromWgs84ToGsj02Conversion_Op from \"app/geometry/coordinates/value_from_wgs84_to_gsj02_conversion/operation\"\n\nimport {\n q_ajax_3,\n} from \"app/utils/q_ajax/q_ajax_3\"\n// Private Modules\n\n// region Public Components\nimport Sidebar from \"components/map/sidebar/index\"\n// endregion Public Components\n\n// region Private Components\nimport marker_template from \"./marker.html._tpl\"\nconst marker_tpl = _template(marker_template)\n// endregion Private Components\n\n// endregion JS Imports\n\n\ninterface InputSelector {\n scope?: string | Element\n main?: string\n btn?: string\n}\nconst default_selector = {\n scope: \".cell--cities--public-transport--info\",\n main: \"#map-canvas__listing-transit\",\n btn: \".cell--cities--public-transport--info__load-route-data-button\",\n}\n\n\n// # Internal\nlet buildingMapMarker = null\nconst public_transport_route_data_cache = {} as {[record_id: string]: RouteDataEntry}\n\nconst route_groups = {} as {[record_id: string]: L.LayerGroup}\n\n\n// ###\n// Set map marker to show building location\n// ###\nconst setMapMarker = (market_lat_lng: L.LatLng, data: {text: string}, map_layer: L.Map) => {\n buildingMapMarker = L.marker(\n market_lat_lng,\n {\n interactive: false,\n riseOnHover: true,\n\n icon: L.divIcon({\n className: \"map-marker-sign-with-arrow-container\",\n html: marker_tpl({text: data.text}),\n }),\n },\n );\n (buildingMapMarker as any).data = data\n\n map_layer.addLayer(buildingMapMarker)\n}\n\n\n\ninterface RouteDataEntry {\n record: {\n transport_type_identifier: string\n hex_color_code: null | string\n\n public_transport_stops: Array<{\n name: string\n latitude: number | string\n longitude: number | string\n }>\n }\n}\n\n\nconst load_route_data_promise = (public_transport_route_id: string): Promise => {\n return new Promise((resolve) => {\n if (public_transport_route_data_cache[public_transport_route_id] != null){\n return resolve(public_transport_route_data_cache[public_transport_route_id])\n }\n\n Promise.resolve(\n import(\n \"plugins/js-routes\"\n )\n )\n .then((Routes) => {\n q_ajax_3({\n url: Routes.show_many_api_web_app_public_transport_data_routes_map_data_entries_path({\n public_transport_route_id: public_transport_route_id,\n use_baidu_maps: LeafletSettings.get_use_baidu_maps(),\n }),\n method: \"GET\",\n dataType: \"JSON\",\n })\n .then(({data}) => {\n public_transport_route_data_cache[public_transport_route_id] = data.data\n resolve(data.data)\n })\n .done()\n })\n .done()\n })\n}\n\nconst load_route = (public_transport_route_id: string, map_layer: L.Map) => {\n const route_layer_group = route_groups[public_transport_route_id] != null ?\n route_groups[public_transport_route_id] : L.layerGroup()\n\n return load_route_data_promise(public_transport_route_id)\n .then((data) => {\n const routeSegments = [] as L.LatLng[]\n\n const $transit_route_button = u(`.cell--cities--public-transport--info--route-${public_transport_route_id}`)\n\n // # Fallback icon\n let transport_type_icon = \"fa fa-car\"\n switch (data.record.transport_type_identifier){\n case \"train\":\n case \"tram\":\n transport_type_icon = \"fa fa-train\"\n break\n case \"bus\":\n case \"minibus\":\n transport_type_icon = \"fa fa-bus\"\n break\n case \"ferry\":\n transport_type_icon = \"fa fa-ship\"\n break\n }\n const polyline_hex_color_code = data.record.hex_color_code || \"#444444\"\n\n // # if already displayed, then don\"t send request and remove layer instead\n if (map_layer.hasLayer(route_layer_group)){\n map_layer.removeLayer(route_layer_group)\n $transit_route_button.removeClass(\"active\")\n }\n else {\n data.record.public_transport_stops.forEach(({name, latitude, longitude}) => {\n const lat = typeof latitude === \"number\" ? latitude : parseFloat(latitude)\n const lng = typeof longitude === \"number\" ? longitude : parseFloat(longitude)\n\n const stopLatLng = L.latLng(lat, lng)\n\n const markerOptions = {\n icon: L.divIcon({\n className: \"map-marker-public-transport\",\n html: `
`,\n }),\n riseOnHover: true,\n }\n\n\n const marker = L.marker(\n stopLatLng,\n markerOptions\n )\n\n marker.bindTooltip(name, {\n className: \"medium\",\n })\n\n routeSegments.push(stopLatLng)\n\n route_layer_group.addLayer(marker)\n })\n\n\n\n const route = L.polyline([routeSegments], {\n color: polyline_hex_color_code,\n })\n\n route_layer_group.addLayer(route)\n\n route_groups[public_transport_route_id] = route_layer_group\n map_layer.addLayer(route_layer_group)\n $transit_route_button.addClass(\"active\")\n }\n })\n}\n\n\n\nconst init = (selector?: InputSelector): Promise => {\n const sele = Object.assign({}, default_selector, selector)\n const promises = u(sele.scope).nodes.map((el): Promise => {\n const $el = u(el)\n const $mapCanvas = $el.find(sele.main)\n if ($mapCanvas.length !== 1) {\n return Promise.reject(new Error(`$mapCanvas.length != 1 <${$mapCanvas.length}>`))\n }\n\n const lat = parseFloat($mapCanvas.data(\"lat\"))\n const lng = parseFloat($mapCanvas.data(\"lng\"))\n let myCenter = L.latLng(lat, lng)\n\n if (LeafletSettings.get_use_baidu_maps()) {\n const baidu_latlng = (new Geometry_Coordinates_ValueFromWgs84ToGsj02Conversion_Op({\n latitude: lat,\n longitude: lng,\n })).call()\n\n myCenter = L.latLng(baidu_latlng.latitude, baidu_latlng.longitude)\n }\n\n\n Sidebar.initJSMapSidebarToggle( \".js-map-sidebar-toggle\")\n\n // If we add map tile layer AFTER creating map object\n // The location of tile layer is drifted on load\n // To workaround this we create tile layer first and\n // pass it on map object creation\n return LeafletMapTileLayer.getNewTileLayerPromise()\n .then((map_tile_layer) => {\n const transit_map: L.Map = LeafletSettings.get_use_baidu_maps() ?\n L.map(\"map-canvas__listing-transit\", {\n center: myCenter,\n zoom: 15,\n minZoom: 10,\n maxZoom: AppMapZoomLevels.max,\n\n scrollWheelZoom: false,\n // Using custom zoom control\n zoomControl: false,\n\n attributionControl: false,\n\n dragging: (Page.isForDesktop() || Page.isForTablet()),\n // `tap` is also required to be disabled for mobile\n // in order to allow page scroll\n // https://github.com/Leaflet/Leaflet/issues/5425#issuecomment-342055520\n tap: (Page.isForDesktop() || Page.isForTablet()),\n\n layers: [\n map_tile_layer,\n ],\n })\n :\n L.map(\"map-canvas__listing-transit\", {\n center: myCenter,\n zoom: 15,\n minZoom: 10,\n maxZoom: AppMapZoomLevels.max,\n\n scrollWheelZoom: false,\n // Using custom zoom control\n zoomControl: false,\n\n attributionControl: false,\n\n dragging: (Page.isForDesktop() || Page.isForTablet()),\n // `tap` is also required to be disabled for mobile\n // in order to allow page scroll\n // https://github.com/Leaflet/Leaflet/issues/5425#issuecomment-342055520\n tap: (Page.isForDesktop() || Page.isForTablet()),\n\n layers: [\n map_tile_layer,\n ],\n })\n\n // zoom control at custom position\n const zoomControl = L.control.zoom({position: \"topright\"})\n transit_map.addControl(zoomControl)\n\n setMapMarker(\n myCenter,\n {\n text: $mapCanvas.data(\"name\"),\n },\n transit_map,\n )\n\n $el.find(sele.btn).on(\"click\", (e) => {\n const $this = u(e.currentTarget as HTMLElement)\n const public_transport_route_id = $this.data(\"public-transport-route-id\")\n\n if (public_transport_route_id == null) { return }\n\n // # Sometimes there is not data\n const route_id_string = typeof public_transport_route_id === \"string\" ?\n public_transport_route_id : public_transport_route_id.toString()\n load_route(route_id_string, transit_map)\n .done()\n })\n\n return transit_map\n })\n })\n return Promise.all(promises)\n .then((maps) => {\n return Promise.all(maps)\n })\n}\n\nexport default {init}\n","\n// region JS Imports\n\n// region External Modules\nimport $ from \"jquery\"\nimport u from \"umbrellajs\"\nimport Promise from \"plugins/bluebird\"\nimport L from \"plugins/leaflet/index\"\n// endregion External Modules\n\n// Private Modules\nimport Modal from \"app/modal/show-modal\"\n\nimport {\n q_ajax_3,\n ERROR_HANDLER_ACTIONS as AJAX_ERROR_HANDLER_ACTIONS,\n} from \"app/utils/q_ajax/q_ajax_3\"\n// Private Modules\n\n// region Public Components\nimport TransitInfo_Modal from \"concepts/cities/public_transport/modal/index\"\n// endregion Public Components\n\n// region Private Components\nimport Map from \"./components/map/index\"\n// endregion Private Components\n\n// endregion JS Imports\n\n\nconst CELL_CLASS_NAME = \"cell--cities--public-transport--info\"\nconst CELL_INITIALIZED_CLASS_NAME = `${CELL_CLASS_NAME}--js-spacious-initialized`\n\ninterface PromiseOutput {\n maps_promise: Promise\n}\n\nconst init = (): Promise => {\n return new Promise((resolve) => {\n const maps_promises: Array> = u(`.${CELL_CLASS_NAME}`).nodes\n .reduce>>((promises, el) => {\n const $el = u(el)\n\n if (el.classList.contains(CELL_INITIALIZED_CLASS_NAME)) { return promises }\n el.classList.add(CELL_INITIALIZED_CLASS_NAME)\n\n const $load_route_modal_buttons = $el.find(\".cell--cities--public-transport--info__load-route-modal-button\")\n\n // # Register the event\n $load_route_modal_buttons.on(\"click\", (e) => {\n e.preventDefault()\n\n // `e.target` could be element inside anchor\n // To ensure it's the element we attached event listener on\n // Use `e.currentTarget`\n const $load_route_modal_button = u(e.currentTarget as HTMLElement)\n const url: string = $load_route_modal_button.attr(\"href\").toString() || \"\"\n\n q_ajax_3({\n url: url,\n method: \"GET\",\n dataType: \"html\",\n })\n .then(({data}) => {\n Modal.showModalWithContent(data)\n TransitInfo_Modal.init()\n })\n .done()\n })\n\n promises.push(\n Map.init({\n scope: el,\n }),\n )\n return promises\n }, [])\n\n resolve({\n maps_promise: Promise.all(maps_promises)\n .then((maps_of_maps) => {\n // Flatten the results\n return maps_of_maps.reduce((maps, all_maps) => {\n return all_maps.concat(maps)\n }, [])\n })\n .catch(() => {\n // It's ok that there is no map\n return []\n }),\n })\n })\n}\n\nexport default {\n init,\n}\n"],"file":"assets/index-C1CXfuUD.js"}