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