| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import Combine from "../Base/Combine" | 
					
						
							|  |  |  | import { FlowStep } from "./FlowStep" | 
					
						
							|  |  |  | import { BBox } from "../../Logic/BBox" | 
					
						
							|  |  |  | import LayerConfig from "../../Models/ThemeConfig/LayerConfig" | 
					
						
							|  |  |  | import { Store, UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  | import CreateNoteImportLayer from "../../Models/ThemeConfig/Conversion/CreateNoteImportLayer" | 
					
						
							|  |  |  | import FilteredLayer, { FilterState } from "../../Models/FilteredLayer" | 
					
						
							|  |  |  | import GeoJsonSource from "../../Logic/FeatureSource/Sources/GeoJsonSource" | 
					
						
							|  |  |  | import MetaTagging from "../../Logic/MetaTagging" | 
					
						
							|  |  |  | import FilteringFeatureSource from "../../Logic/FeatureSource/Sources/FilteringFeatureSource" | 
					
						
							|  |  |  | import Minimap from "../Base/Minimap" | 
					
						
							|  |  |  | import ShowDataLayer from "../ShowDataLayer/ShowDataLayer" | 
					
						
							|  |  |  | import FeatureInfoBox from "../Popup/FeatureInfoBox" | 
					
						
							|  |  |  | import { ImportUtils } from "./ImportUtils" | 
					
						
							| 
									
										
										
										
											2023-02-08 01:14:21 +01:00
										 |  |  | import import_candidate from "../../assets/layers/import_candidate/import_candidate.json" | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource" | 
					
						
							|  |  |  | import Title from "../Base/Title" | 
					
						
							|  |  |  | import Loading from "../Base/Loading" | 
					
						
							|  |  |  | import { VariableUiElement } from "../Base/VariableUIElement" | 
					
						
							| 
									
										
										
										
											2023-02-08 01:14:21 +01:00
										 |  |  | import known_layers from "../../assets/generated/known_layers.json" | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" | 
					
						
							|  |  |  | import Translations from "../i18n/Translations" | 
					
						
							| 
									
										
										
										
											2023-01-12 01:16:22 +01:00
										 |  |  | import { Feature } from "geojson" | 
					
						
							|  |  |  | import DivContainer from "../Base/DivContainer" | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Filters out points for which the import-note already exists, to prevent duplicates | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | export class CompareToAlreadyExistingNotes | 
					
						
							|  |  |  |     extends Combine | 
					
						
							|  |  |  |     implements FlowStep<{ bbox: BBox; layer: LayerConfig; features: any[]; theme: string }> | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  |     public IsValid: Store<boolean> | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     public Value: Store<{ bbox: BBox; layer: LayerConfig; features: any[]; theme: string }> | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     constructor(state, params: { bbox: BBox; layer: LayerConfig; features: any[]; theme: string }) { | 
					
						
							| 
									
										
										
										
											2022-04-14 01:32:04 +02:00
										 |  |  |         const t = Translations.t.importHelper.compareToAlreadyExistingNotes | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const layerConfig = known_layers.layers.filter((l) => l.id === params.layer.id)[0] | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         if (layerConfig === undefined) { | 
					
						
							| 
									
										
										
										
											2022-01-22 02:56:35 +01:00
										 |  |  |             console.error("WEIRD: layer not found in the builtin layer overview") | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const importLayerJson = new CreateNoteImportLayer(150).convertStrict( | 
					
						
							|  |  |  |             <LayerConfigJson>layerConfig, | 
					
						
							|  |  |  |             "CompareToAlreadyExistingNotes" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         const importLayer = new LayerConfig(importLayerJson, "import-layer-dynamic") | 
					
						
							|  |  |  |         const flayer: FilteredLayer = { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             appliedFilters: new UIEventSource<Map<string, FilterState>>( | 
					
						
							|  |  |  |                 new Map<string, FilterState>() | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             isDisplayed: new UIEventSource<boolean>(true), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             layerDef: importLayer, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-22 02:56:35 +01:00
										 |  |  |         const allNotesWithinBbox = new GeoJsonSource(flayer, params.bbox.padAbsolute(0.0001)) | 
					
						
							| 
									
										
										
										
											2022-04-14 01:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         allNotesWithinBbox.features.map((f) => | 
					
						
							|  |  |  |             MetaTagging.addMetatags( | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                 f, | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |                     getFeaturesWithin: () => [], | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     getFeatureById: () => undefined, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 importLayer, | 
					
						
							|  |  |  |                 state, | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     includeDates: true, | 
					
						
							|  |  |  |                     // We assume that the non-dated metatags are already set by the cache generator
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     includeNonDates: true, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const alreadyOpenImportNotes = new FilteringFeatureSource( | 
					
						
							|  |  |  |             state, | 
					
						
							|  |  |  |             undefined, | 
					
						
							|  |  |  |             allNotesWithinBbox | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         const map = Minimap.createMiniMap() | 
					
						
							|  |  |  |         map.SetClass("w-full").SetStyle("height: 500px") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-22 02:56:35 +01:00
										 |  |  |         const comparisonMap = Minimap.createMiniMap({ | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             location: map.location, | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-22 02:56:35 +01:00
										 |  |  |         comparisonMap.SetClass("w-full").SetStyle("height: 500px") | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         new ShowDataLayer({ | 
					
						
							|  |  |  |             layerToShow: importLayer, | 
					
						
							|  |  |  |             state, | 
					
						
							|  |  |  |             zoomToFeatures: true, | 
					
						
							|  |  |  |             leafletMap: map.leafletMap, | 
					
						
							| 
									
										
										
										
											2022-01-22 02:56:35 +01:00
										 |  |  |             features: alreadyOpenImportNotes, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             popup: (tags, layer) => new FeatureInfoBox(tags, layer, state), | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |         const maxDistance = new UIEventSource<number>(10) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const partitionedImportPoints = ImportUtils.partitionFeaturesIfNearby( | 
					
						
							|  |  |  |             params, | 
					
						
							|  |  |  |             alreadyOpenImportNotes.features.map((ff) => ({ features: ff.map((ff) => ff.feature) })), | 
					
						
							|  |  |  |             maxDistance | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         new ShowDataLayer({ | 
					
						
							|  |  |  |             layerToShow: new LayerConfig(import_candidate), | 
					
						
							|  |  |  |             state, | 
					
						
							|  |  |  |             zoomToFeatures: true, | 
					
						
							| 
									
										
										
										
											2022-01-22 02:56:35 +01:00
										 |  |  |             leafletMap: comparisonMap.leafletMap, | 
					
						
							| 
									
										
										
										
											2023-03-23 01:42:47 +01:00
										 |  |  |             features: new StaticFeatureSource( | 
					
						
							| 
									
										
										
										
											2023-01-12 01:16:22 +01:00
										 |  |  |                 partitionedImportPoints.map((p) => <Feature[]>p.hasNearby) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             ), | 
					
						
							|  |  |  |             popup: (tags, layer) => new FeatureInfoBox(tags, layer, state), | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super([ | 
					
						
							| 
									
										
										
										
											2022-04-14 01:32:04 +02:00
										 |  |  |             new Title(t.titleLong), | 
					
						
							| 
									
										
										
										
											2022-01-22 02:56:35 +01:00
										 |  |  |             new VariableUiElement( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 alreadyOpenImportNotes.features.map( | 
					
						
							|  |  |  |                     (notesWithImport) => { | 
					
						
							|  |  |  |                         if ( | 
					
						
							|  |  |  |                             allNotesWithinBbox.state.data !== undefined && | 
					
						
							|  |  |  |                             allNotesWithinBbox.state.data["error"] !== undefined | 
					
						
							|  |  |  |                         ) { | 
					
						
							|  |  |  |                             const error = allNotesWithinBbox.state.data["error"] | 
					
						
							|  |  |  |                             t.loadingFailed.Subs({ error }) | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         if ( | 
					
						
							|  |  |  |                             allNotesWithinBbox.features.data === undefined || | 
					
						
							|  |  |  |                             allNotesWithinBbox.features.data.length === 0 | 
					
						
							|  |  |  |                         ) { | 
					
						
							|  |  |  |                             return new Loading(t.loading) | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         if (notesWithImport.length === 0) { | 
					
						
							|  |  |  |                             return t.noPreviousNotesFound.SetClass("thanks") | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         return new Combine([ | 
					
						
							|  |  |  |                             t.mapExplanation.Subs(params.features), | 
					
						
							|  |  |  |                             map, | 
					
						
							| 
									
										
										
										
											2023-01-12 01:16:22 +01:00
										 |  |  |                             new DivContainer("fullscreen"), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                             new VariableUiElement( | 
					
						
							|  |  |  |                                 partitionedImportPoints.map(({ noNearby, hasNearby }) => { | 
					
						
							|  |  |  |                                     if (noNearby.length === 0) { | 
					
						
							|  |  |  |                                         // Nothing can be imported
 | 
					
						
							|  |  |  |                                         return t.completelyImported | 
					
						
							|  |  |  |                                             .SetClass("alert w-full block") | 
					
						
							|  |  |  |                                             .SetStyle("padding: 0.5rem") | 
					
						
							|  |  |  |                                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                                     if (hasNearby.length === 0) { | 
					
						
							|  |  |  |                                         // All points can be imported
 | 
					
						
							|  |  |  |                                         return t.nothingNearby | 
					
						
							|  |  |  |                                             .SetClass("thanks w-full block") | 
					
						
							|  |  |  |                                             .SetStyle("padding: 0.5rem") | 
					
						
							|  |  |  |                                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                                     return new Combine([ | 
					
						
							|  |  |  |                                         t.someNearby | 
					
						
							|  |  |  |                                             .Subs({ | 
					
						
							|  |  |  |                                                 hasNearby: hasNearby.length, | 
					
						
							|  |  |  |                                                 distance: maxDistance.data, | 
					
						
							|  |  |  |                                             }) | 
					
						
							|  |  |  |                                             .SetClass("alert"), | 
					
						
							|  |  |  |                                         t.wontBeImported, | 
					
						
							|  |  |  |                                         comparisonMap.SetClass("w-full"), | 
					
						
							|  |  |  |                                     ]).SetClass("w-full") | 
					
						
							|  |  |  |                                 }) | 
					
						
							|  |  |  |                             ), | 
					
						
							|  |  |  |                         ]).SetClass("flex flex-col") | 
					
						
							|  |  |  |                     }, | 
					
						
							|  |  |  |                     [allNotesWithinBbox.features, allNotesWithinBbox.state] | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         this.SetClass("flex flex-col") | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.Value = partitionedImportPoints.map(({ noNearby }) => ({ | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |             features: noNearby, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             bbox: params.bbox, | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |             layer: params.layer, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             theme: params.theme, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         })) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.IsValid = alreadyOpenImportNotes.features.map( | 
					
						
							|  |  |  |             (ff) => { | 
					
						
							|  |  |  |                 if (allNotesWithinBbox.features.data.length === 0) { | 
					
						
							|  |  |  |                     // Not yet loaded
 | 
					
						
							|  |  |  |                     return false | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (ff.length == 0) { | 
					
						
							|  |  |  |                     // No import notes at all
 | 
					
						
							|  |  |  |                     return true | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 return partitionedImportPoints.data.noNearby.length > 0 // at least _something_ can be imported
 | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             [partitionedImportPoints, allNotesWithinBbox.features] | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } |