| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import { BBox } from "../../Logic/BBox" | 
					
						
							|  |  |  | import LayerConfig from "../../Models/ThemeConfig/LayerConfig" | 
					
						
							|  |  |  | import Combine from "../Base/Combine" | 
					
						
							|  |  |  | import Title from "../Base/Title" | 
					
						
							|  |  |  | import { Overpass } from "../../Logic/Osm/Overpass" | 
					
						
							|  |  |  | import { Store, UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  | import Constants from "../../Models/Constants" | 
					
						
							|  |  |  | import RelationsTracker from "../../Logic/Osm/RelationsTracker" | 
					
						
							|  |  |  | import { VariableUiElement } from "../Base/VariableUIElement" | 
					
						
							|  |  |  | import { FlowStep } from "./FlowStep" | 
					
						
							|  |  |  | import Loading from "../Base/Loading" | 
					
						
							|  |  |  | import { SubtleButton } from "../Base/SubtleButton" | 
					
						
							|  |  |  | import Svg from "../../Svg" | 
					
						
							|  |  |  | import { Utils } from "../../Utils" | 
					
						
							|  |  |  | import { IdbLocalStorage } from "../../Logic/Web/IdbLocalStorage" | 
					
						
							|  |  |  | import Minimap from "../Base/Minimap" | 
					
						
							|  |  |  | import BaseLayer from "../../Models/BaseLayer" | 
					
						
							|  |  |  | import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers" | 
					
						
							|  |  |  | import Loc from "../../Models/Loc" | 
					
						
							|  |  |  | import Attribution from "../BigComponents/Attribution" | 
					
						
							|  |  |  | import ShowDataLayer from "../ShowDataLayer/ShowDataLayer" | 
					
						
							|  |  |  | import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource" | 
					
						
							|  |  |  | import ValidatedTextField from "../Input/ValidatedTextField" | 
					
						
							|  |  |  | import { LocalStorageSource } from "../../Logic/Web/LocalStorageSource" | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  | import * as import_candidate from "../../assets/layers/import_candidate/import_candidate.json" | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import { GeoOperations } from "../../Logic/GeoOperations" | 
					
						
							|  |  |  | import FeatureInfoBox from "../Popup/FeatureInfoBox" | 
					
						
							|  |  |  | import { ImportUtils } from "./ImportUtils" | 
					
						
							|  |  |  | import Translations from "../i18n/Translations" | 
					
						
							|  |  |  | import ShowDataMultiLayer from "../ShowDataLayer/ShowDataMultiLayer" | 
					
						
							|  |  |  | import FilteredLayer, { FilterState } from "../../Models/FilteredLayer" | 
					
						
							|  |  |  | import { Feature, FeatureCollection } from "@turf/turf" | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  | import * as currentview from "../../assets/layers/current_view/current_view.json" | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import { CheckBox } from "../Input/Checkboxes" | 
					
						
							|  |  |  | import BackgroundMapSwitch from "../BigComponents/BackgroundMapSwitch" | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Given the data to import, the bbox and the layer, will query overpass for similar items | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | export default class ConflationChecker | 
					
						
							|  |  |  |     extends Combine | 
					
						
							|  |  |  |     implements FlowStep<{ features: any[]; theme: string }> | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |     public readonly IsValid | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     public readonly Value: Store<{ features: any[]; theme: string }> | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     constructor(state, params: { bbox: BBox; layer: LayerConfig; theme: string; features: any[] }) { | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         const t = Translations.t.importHelper.conflationChecker | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         const bbox = params.bbox.padAbsolute(0.0001) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const layer = params.layer | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const toImport: { features: any[] } = params | 
					
						
							|  |  |  |         let overpassStatus = new UIEventSource< | 
					
						
							|  |  |  |             { error: string } | "running" | "success" | "idle" | "cached" | 
					
						
							|  |  |  |         >("idle") | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         function loadDataFromOverpass() { | 
					
						
							| 
									
										
										
										
											2022-04-20 02:16:41 +02:00
										 |  |  |             // Load the data!
 | 
					
						
							|  |  |  |             const url = Constants.defaultOverpassUrls[1] | 
					
						
							|  |  |  |             const relationTracker = new RelationsTracker() | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const overpass = new Overpass( | 
					
						
							|  |  |  |                 params.layer.source.osmTags, | 
					
						
							|  |  |  |                 [], | 
					
						
							|  |  |  |                 url, | 
					
						
							|  |  |  |                 new UIEventSource<number>(180), | 
					
						
							|  |  |  |                 relationTracker, | 
					
						
							|  |  |  |                 true | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-04-20 02:16:41 +02:00
										 |  |  |             console.log("Loading from overpass!") | 
					
						
							|  |  |  |             overpassStatus.setData("running") | 
					
						
							|  |  |  |             overpass.queryGeoJson(bbox).then( | 
					
						
							|  |  |  |                 ([data, date]) => { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     console.log( | 
					
						
							|  |  |  |                         "Received overpass-data: ", | 
					
						
							|  |  |  |                         data.features.length, | 
					
						
							|  |  |  |                         "features are loaded at ", | 
					
						
							|  |  |  |                         date | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2022-04-20 02:16:41 +02:00
										 |  |  |                     overpassStatus.setData("success") | 
					
						
							|  |  |  |                     fromLocalStorage.setData([data, date]) | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 (error) => { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     overpassStatus.setData({ error }) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-04-20 02:16:41 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const fromLocalStorage = IdbLocalStorage.Get<[any, Date]>( | 
					
						
							|  |  |  |             "importer-overpass-cache-" + layer.id, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 whenLoaded: (v) => { | 
					
						
							|  |  |  |                     if (v !== undefined && v !== null) { | 
					
						
							|  |  |  |                         console.log("Loaded from local storage:", v) | 
					
						
							|  |  |  |                         overpassStatus.setData("cached") | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         loadDataFromOverpass() | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const cacheAge = fromLocalStorage.map((d) => { | 
					
						
							|  |  |  |             if (d === undefined || d[1] === undefined) { | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |                 return undefined | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const [_, loadedDate] = d | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return (new Date().getTime() - loadedDate.getTime()) / 1000 | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         cacheAge.addCallbackD((timeDiff) => { | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             if (timeDiff < 24 * 60 * 60) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 // Recently cached!
 | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |                 overpassStatus.setData("cached") | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 return | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 loadDataFromOverpass() | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const geojson: Store<FeatureCollection> = fromLocalStorage.map((d) => { | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             if (d === undefined) { | 
					
						
							|  |  |  |                 return undefined | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return d[0] | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         const background = new UIEventSource<BaseLayer>(AvailableBaseLayers.osmCarto) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const location = new UIEventSource<Loc>({ lat: 0, lon: 0, zoom: 1 }) | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         const currentBounds = new UIEventSource<BBox>(undefined) | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         const zoomLevel = ValidatedTextField.ForType("pnat").ConstructInputElement({ | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             value: LocalStorageSource.GetParsed<string>("importer-zoom-level", "0"), | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         zoomLevel.SetClass("ml-1 border border-black") | 
					
						
							|  |  |  |         const osmLiveData = Minimap.createMiniMap({ | 
					
						
							|  |  |  |             allowMoving: true, | 
					
						
							|  |  |  |             location, | 
					
						
							|  |  |  |             background, | 
					
						
							|  |  |  |             bounds: currentBounds, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             attribution: new Attribution( | 
					
						
							|  |  |  |                 location, | 
					
						
							|  |  |  |                 state.osmConnection.userDetails, | 
					
						
							|  |  |  |                 undefined, | 
					
						
							|  |  |  |                 currentBounds | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  |         osmLiveData.SetClass("w-full").SetStyle("height: 500px") | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const geojsonFeatures: Store<Feature[]> = geojson.map( | 
					
						
							|  |  |  |             (geojson) => { | 
					
						
							|  |  |  |                 if (geojson?.features === undefined) { | 
					
						
							|  |  |  |                     return [] | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 const currentZoom = zoomLevel.GetValue().data | 
					
						
							|  |  |  |                 const zoomedEnough: boolean = osmLiveData.location.data.zoom >= Number(currentZoom) | 
					
						
							|  |  |  |                 if (currentZoom !== undefined && !zoomedEnough) { | 
					
						
							|  |  |  |                     return [] | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 const bounds = osmLiveData.bounds.data | 
					
						
							|  |  |  |                 if (bounds === undefined) { | 
					
						
							|  |  |  |                     return geojson.features | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 return geojson.features.filter((f) => BBox.get(f).overlapsWith(bounds)) | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             [osmLiveData.bounds, zoomLevel.GetValue()] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         const preview = StaticFeatureSource.fromGeojsonStore(geojsonFeatures) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         new ShowDataLayer({ | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             layerToShow: new LayerConfig(currentview), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             state, | 
					
						
							|  |  |  |             leafletMap: osmLiveData.leafletMap, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             popup: undefined, | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             zoomToFeatures: true, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             features: StaticFeatureSource.fromGeojson([bbox.asGeoJson({})]), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         new ShowDataMultiLayer({ | 
					
						
							|  |  |  |             //layerToShow: layer,
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             layers: new UIEventSource<FilteredLayer[]>([ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     layerDef: layer, | 
					
						
							|  |  |  |                     isDisplayed: new UIEventSource<boolean>(true), | 
					
						
							|  |  |  |                     appliedFilters: new UIEventSource<Map<string, FilterState>>(undefined), | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             ]), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             state, | 
					
						
							|  |  |  |             leafletMap: osmLiveData.leafletMap, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, { setHash: false }), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             zoomToFeatures: false, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             features: preview, | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         new ShowDataLayer({ | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             layerToShow: new LayerConfig(import_candidate), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             state, | 
					
						
							|  |  |  |             leafletMap: osmLiveData.leafletMap, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, { setHash: false }), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             zoomToFeatures: false, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             features: StaticFeatureSource.fromGeojson(toImport.features), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-12 02:53:41 +01:00
										 |  |  |         const nearbyCutoff = ValidatedTextField.ForType("pnat").ConstructInputElement() | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         nearbyCutoff.SetClass("ml-1 border border-black") | 
					
						
							|  |  |  |         nearbyCutoff.GetValue().syncWith(LocalStorageSource.Get("importer-cutoff", "25"), true) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         const matchedFeaturesMap = Minimap.createMiniMap({ | 
					
						
							|  |  |  |             allowMoving: true, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             background, | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  |         matchedFeaturesMap.SetClass("w-full").SetStyle("height: 500px") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         // Featuresource showing OSM-features which are nearby a toImport-feature
 | 
					
						
							|  |  |  |         const geojsonMapped: Store<Feature[]> = geojson.map( | 
					
						
							|  |  |  |             (osmData) => { | 
					
						
							|  |  |  |                 if (osmData?.features === undefined) { | 
					
						
							|  |  |  |                     return [] | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 const maxDist = Number(nearbyCutoff.GetValue().data) | 
					
						
							|  |  |  |                 return osmData.features.filter((f) => | 
					
						
							|  |  |  |                     toImport.features.some( | 
					
						
							|  |  |  |                         (imp) => | 
					
						
							|  |  |  |                             maxDist >= | 
					
						
							|  |  |  |                             GeoOperations.distanceBetween( | 
					
						
							|  |  |  |                                 imp.geometry.coordinates, | 
					
						
							|  |  |  |                                 GeoOperations.centerpointCoordinates(f) | 
					
						
							|  |  |  |                             ) | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             [nearbyCutoff.GetValue().stabilized(500)] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         const nearbyFeatures = StaticFeatureSource.fromGeojsonStore(geojsonMapped) | 
					
						
							|  |  |  |         const paritionedImport = ImportUtils.partitionFeaturesIfNearby( | 
					
						
							|  |  |  |             toImport, | 
					
						
							|  |  |  |             geojson, | 
					
						
							|  |  |  |             nearbyCutoff.GetValue().map(Number) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         // Featuresource showing OSM-features which are nearby a toImport-feature
 | 
					
						
							|  |  |  |         const toImportWithNearby = StaticFeatureSource.fromGeojsonStore( | 
					
						
							|  |  |  |             paritionedImport.map((els) => els?.hasNearby ?? []) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         toImportWithNearby.features.addCallback((nearby) => | 
					
						
							|  |  |  |             console.log("The following features are near an already existing object:", nearby) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         new ShowDataLayer({ | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             layerToShow: new LayerConfig(import_candidate), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             state, | 
					
						
							|  |  |  |             leafletMap: matchedFeaturesMap.leafletMap, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, { setHash: false }), | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             zoomToFeatures: false, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             features: toImportWithNearby, | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         const showOsmLayer = new CheckBox(t.showOsmLayerInConflationMap, true) | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         new ShowDataLayer({ | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             layerToShow: layer, | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             state, | 
					
						
							|  |  |  |             leafletMap: matchedFeaturesMap.leafletMap, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, { setHash: false }), | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             zoomToFeatures: true, | 
					
						
							|  |  |  |             features: nearbyFeatures, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             doShowLayer: showOsmLayer.GetValue(), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const conflationMaps = new Combine([ | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             new VariableUiElement( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 geojson.map((geojson) => { | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |                     if (geojson === undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                         return undefined | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     return new SubtleButton(Svg.download_svg(), t.downloadOverpassData).onClick( | 
					
						
							|  |  |  |                         () => { | 
					
						
							|  |  |  |                             Utils.offerContentsAsDownloadableFile( | 
					
						
							|  |  |  |                                 JSON.stringify(geojson, null, "  "), | 
					
						
							|  |  |  |                                 "mapcomplete-" + layer.id + ".geojson", | 
					
						
							|  |  |  |                                 { | 
					
						
							|  |  |  |                                     mimetype: "application/json+geo", | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                             ) | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             new VariableUiElement( | 
					
						
							|  |  |  |                 cacheAge.map((age) => { | 
					
						
							|  |  |  |                     if (age === undefined) { | 
					
						
							|  |  |  |                         return undefined | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (age < 0) { | 
					
						
							|  |  |  |                         return t.cacheExpired | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     return new Combine([ | 
					
						
							|  |  |  |                         t.loadedDataAge.Subs({ age: Utils.toHumanTime(age) }), | 
					
						
							|  |  |  |                         new SubtleButton(Svg.reload_svg().SetClass("h-8"), t.reloadTheCache) | 
					
						
							|  |  |  |                             .onClick(loadDataFromOverpass) | 
					
						
							|  |  |  |                             .SetClass("h-12"), | 
					
						
							|  |  |  |                     ]) | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-14 19:46:14 +02:00
										 |  |  |             new Title(t.titleLive), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             t.importCandidatesCount.Subs({ count: toImport.features.length }), | 
					
						
							|  |  |  |             new VariableUiElement( | 
					
						
							|  |  |  |                 geojson.map((geojson) => { | 
					
						
							|  |  |  |                     if ( | 
					
						
							|  |  |  |                         geojson?.features?.length === undefined || | 
					
						
							|  |  |  |                         geojson?.features?.length === 0 | 
					
						
							|  |  |  |                     ) { | 
					
						
							|  |  |  |                         return t.nothingLoaded.Subs(layer).SetClass("alert") | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     return new Combine([ | 
					
						
							|  |  |  |                         t.osmLoaded.Subs({ count: geojson.features.length, name: layer.name }), | 
					
						
							|  |  |  |                     ]) | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             osmLiveData, | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             new Combine([ | 
					
						
							|  |  |  |                 t.zoomLevelSelection, | 
					
						
							|  |  |  |                 zoomLevel, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 new VariableUiElement( | 
					
						
							|  |  |  |                     osmLiveData.location.map((location) => { | 
					
						
							|  |  |  |                         return t.zoomIn.Subs(<any>{ current: location.zoom }) | 
					
						
							|  |  |  |                     }) | 
					
						
							|  |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             ]).SetClass("flex"), | 
					
						
							| 
									
										
										
										
											2022-04-14 19:46:14 +02:00
										 |  |  |             new Title(t.titleNearby), | 
					
						
							|  |  |  |             new Combine([t.mapShowingNearbyIntro, nearbyCutoff]).SetClass("flex"), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             new VariableUiElement( | 
					
						
							|  |  |  |                 toImportWithNearby.features.map((feats) => | 
					
						
							|  |  |  |                     t.nearbyWarn.Subs({ count: feats.length }).SetClass("alert") | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  |             t.setRangeToZero, | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             matchedFeaturesMap, | 
					
						
							|  |  |  |             new Combine([ | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 new BackgroundMapSwitch( | 
					
						
							|  |  |  |                     { backgroundLayer: background, locationControl: matchedFeaturesMap.location }, | 
					
						
							|  |  |  |                     background | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 showOsmLayer, | 
					
						
							|  |  |  |             ]).SetClass("flex"), | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         ]).SetClass("flex flex-col") | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         super([ | 
					
						
							| 
									
										
										
										
											2022-04-14 19:46:14 +02:00
										 |  |  |             new Title(t.title), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             new VariableUiElement( | 
					
						
							|  |  |  |                 overpassStatus.map((d) => { | 
					
						
							|  |  |  |                     if (d === "idle") { | 
					
						
							|  |  |  |                         return new Loading(t.states.idle) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (d === "running") { | 
					
						
							|  |  |  |                         return new Loading(t.states.running) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (d["error"] !== undefined) { | 
					
						
							|  |  |  |                         return t.states.error.Subs({ error: d["error"] }).SetClass("alert") | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     if (d === "cached") { | 
					
						
							|  |  |  |                         return conflationMaps | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (d === "success") { | 
					
						
							|  |  |  |                         return conflationMaps | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     return t.states.unexpected.Subs({ state: d }).SetClass("alert") | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |         ]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.Value = paritionedImport.map((feats) => ({ | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |             theme: params.theme, | 
					
						
							|  |  |  |             features: feats?.noNearby, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             layer: params.layer, | 
					
						
							| 
									
										
										
										
											2022-07-08 03:14:55 +02:00
										 |  |  |         })) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.IsValid = this.Value.map((v) => v?.features !== undefined && v.features.length > 0) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } |