| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import {OsmConnection} from "../../Logic/Osm/OsmConnection"; | 
					
						
							|  |  |  | import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline"; | 
					
						
							|  |  |  | import BaseUIElement from "../BaseUIElement"; | 
					
						
							|  |  |  | import LocationInput from "../Input/LocationInput"; | 
					
						
							|  |  |  | import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers"; | 
					
						
							|  |  |  | import {BBox} from "../../Logic/BBox"; | 
					
						
							|  |  |  | import {TagUtils} from "../../Logic/Tags/TagUtils"; | 
					
						
							|  |  |  | import {SubtleButton} from "../Base/SubtleButton"; | 
					
						
							|  |  |  | import Combine from "../Base/Combine"; | 
					
						
							|  |  |  | import Translations from "../i18n/Translations"; | 
					
						
							|  |  |  | import Svg from "../../Svg"; | 
					
						
							|  |  |  | import Toggle from "../Input/Toggle"; | 
					
						
							|  |  |  | import SimpleAddUI, {PresetInfo} from "../BigComponents/SimpleAddUI"; | 
					
						
							| 
									
										
										
										
											2021-11-30 18:10:46 +01:00
										 |  |  | import BaseLayer from "../../Models/BaseLayer"; | 
					
						
							| 
									
										
										
										
											2022-02-09 03:38:40 +01:00
										 |  |  | import Img from "../Base/Img"; | 
					
						
							|  |  |  | import Title from "../Base/Title"; | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class ConfirmLocationOfPoint extends Combine { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor( | 
					
						
							|  |  |  |         state: { | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             featureSwitchIsTesting: UIEventSource<boolean>; | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             osmConnection: OsmConnection, | 
					
						
							| 
									
										
										
										
											2021-11-30 18:10:46 +01:00
										 |  |  |             featurePipeline: FeaturePipeline, | 
					
						
							| 
									
										
										
										
											2021-11-30 19:19:53 +01:00
										 |  |  |             backgroundLayer?: UIEventSource<BaseLayer> | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |         }, | 
					
						
							|  |  |  |         filterViewIsOpened: UIEventSource<boolean>, | 
					
						
							|  |  |  |         preset: PresetInfo, | 
					
						
							|  |  |  |         confirmText: BaseUIElement, | 
					
						
							|  |  |  |         loc: { lon: number, lat: number }, | 
					
						
							|  |  |  |         confirm: (tags: any[], location: { lat: number, lon: number }, snapOntoWayId: string) => void, | 
					
						
							|  |  |  |         cancel: () => void, | 
					
						
							| 
									
										
										
										
											2022-01-08 04:22:50 +01:00
										 |  |  |         closePopup: () => void | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |     ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let preciseInput: LocationInput = undefined | 
					
						
							|  |  |  |         if (preset.preciseInput !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-02-09 03:38:40 +01:00
										 |  |  |             // Create location input
 | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |              | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             // We uncouple the event source
 | 
					
						
							|  |  |  |             const zloc = {...loc, zoom: 19} | 
					
						
							|  |  |  |             const locationSrc = new UIEventSource(zloc); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-30 18:10:46 +01:00
										 |  |  |             let backgroundLayer = new UIEventSource(state?.backgroundLayer?.data ?? AvailableBaseLayers.osmCarto); | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             if (preset.preciseInput.preferredBackground) { | 
					
						
							| 
									
										
										
										
											2021-11-30 18:10:46 +01:00
										 |  |  |                 const defaultBackground = AvailableBaseLayers.SelectBestLayerAccordingTo(locationSrc, new UIEventSource<string | string[]>(preset.preciseInput.preferredBackground)); | 
					
						
							|  |  |  |                 // Note that we _break the link_ here, as the minimap will take care of the switching!
 | 
					
						
							|  |  |  |                 backgroundLayer.setData(defaultBackground.data) | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             let snapToFeatures: UIEventSource<{ feature: any }[]> = undefined | 
					
						
							|  |  |  |             let mapBounds: UIEventSource<BBox> = undefined | 
					
						
							|  |  |  |             if (preset.preciseInput.snapToLayers && preset.preciseInput.snapToLayers.length > 0) { | 
					
						
							|  |  |  |                 snapToFeatures = new UIEventSource<{ feature: any }[]>([]) | 
					
						
							|  |  |  |                 mapBounds = new UIEventSource<BBox>(undefined) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const tags = TagUtils.KVtoProperties(preset.tags ?? []); | 
					
						
							|  |  |  |             preciseInput = new LocationInput({ | 
					
						
							|  |  |  |                 mapBackground: backgroundLayer, | 
					
						
							|  |  |  |                 centerLocation: locationSrc, | 
					
						
							|  |  |  |                 snapTo: snapToFeatures, | 
					
						
							|  |  |  |                 snappedPointTags: tags, | 
					
						
							|  |  |  |                 maxSnapDistance: preset.preciseInput.maxSnapDistance, | 
					
						
							|  |  |  |                 bounds: mapBounds | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2022-01-25 21:55:51 +01:00
										 |  |  |             preciseInput.installBounds(preset.boundsFactor ?? 0.25, true) | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |             preciseInput.SetClass("h-40 rounded-xl overflow-hidden border border-gray").SetStyle("height: 12rem;") | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (preset.preciseInput.snapToLayers && preset.preciseInput.snapToLayers.length > 0) { | 
					
						
							|  |  |  |                 // We have to snap to certain layers.
 | 
					
						
							|  |  |  |                 // Lets fetch them
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 let loadedBbox: BBox = undefined | 
					
						
							|  |  |  |                 mapBounds?.addCallbackAndRunD(bbox => { | 
					
						
							|  |  |  |                     if (loadedBbox !== undefined && bbox.isContainedIn(loadedBbox)) { | 
					
						
							|  |  |  |                         // All is already there
 | 
					
						
							|  |  |  |                         // return;
 | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-07 02:12:51 +01:00
										 |  |  |                     bbox = bbox.pad(Math.max(preset.boundsFactor ?? 0.25, 2), Math.max(preset.boundsFactor ?? 0.25, 2)); | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |                     loadedBbox = bbox; | 
					
						
							|  |  |  |                     const allFeatures: { feature: any }[] = [] | 
					
						
							|  |  |  |                     preset.preciseInput.snapToLayers.forEach(layerId => { | 
					
						
							|  |  |  |                         console.log("Snapping to", layerId) | 
					
						
							|  |  |  |                         state.featurePipeline.GetFeaturesWithin(layerId, bbox)?.forEach(feats => allFeatures.push(...feats.map(f => ({feature: f})))) | 
					
						
							|  |  |  |                     }) | 
					
						
							|  |  |  |                     console.log("Snapping to", allFeatures) | 
					
						
							|  |  |  |                     snapToFeatures.setData(allFeatures) | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let confirmButton: BaseUIElement = new SubtleButton(preset.icon(), | 
					
						
							|  |  |  |             new Combine([ | 
					
						
							|  |  |  |                 confirmText, | 
					
						
							|  |  |  |                 Translations.t.general.add.warnVisibleForEveryone.Clone().SetClass("alert") | 
					
						
							|  |  |  |             ]).SetClass("flex flex-col") | 
					
						
							|  |  |  |         ).SetClass("font-bold break-words") | 
					
						
							|  |  |  |             .onClick(() => { | 
					
						
							| 
									
										
										
										
											2021-12-05 05:21:03 +01:00
										 |  |  |                 console.log("The confirmLocationPanel - precise input yielded ", preciseInput?.GetValue()?.data) | 
					
						
							|  |  |  |                 confirm(preset.tags, preciseInput?.GetValue()?.data ?? loc, preciseInput?.snappedOnto?.data?.properties?.id); | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (preciseInput !== undefined) { | 
					
						
							|  |  |  |             confirmButton = new Combine([preciseInput, confirmButton]) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const openLayerControl = | 
					
						
							|  |  |  |             new SubtleButton( | 
					
						
							|  |  |  |                 Svg.layers_ui(), | 
					
						
							|  |  |  |                 new Combine([ | 
					
						
							|  |  |  |                     Translations.t.general.add.layerNotEnabled | 
					
						
							|  |  |  |                         .Subs({layer: preset.layerToAddTo.layerDef.name}) | 
					
						
							|  |  |  |                         .SetClass("alert"), | 
					
						
							|  |  |  |                     Translations.t.general.add.openLayerControl | 
					
						
							|  |  |  |                 ]) | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |                 .onClick(() => filterViewIsOpened.setData(true)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const openLayerOrConfirm = new Toggle( | 
					
						
							|  |  |  |             confirmButton, | 
					
						
							|  |  |  |             openLayerControl, | 
					
						
							|  |  |  |             preset.layerToAddTo.isDisplayed | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const disableFilter = new SubtleButton( | 
					
						
							|  |  |  |             new Combine([ | 
					
						
							|  |  |  |                 Svg.filter_ui().SetClass("absolute w-full"), | 
					
						
							|  |  |  |                 Svg.cross_bottom_right_svg().SetClass("absolute red-svg") | 
					
						
							|  |  |  |             ]).SetClass("relative"), | 
					
						
							|  |  |  |             new Combine( | 
					
						
							|  |  |  |                 [ | 
					
						
							|  |  |  |                     Translations.t.general.add.disableFiltersExplanation.Clone(), | 
					
						
							|  |  |  |                     Translations.t.general.add.disableFilters.Clone().SetClass("text-xl") | 
					
						
							|  |  |  |                 ] | 
					
						
							|  |  |  |             ).SetClass("flex flex-col") | 
					
						
							|  |  |  |         ).onClick(() => { | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-08 04:22:50 +01:00
										 |  |  |             const appliedFilters = preset.layerToAddTo.appliedFilters; | 
					
						
							|  |  |  |             appliedFilters.data.forEach((_, k) => appliedFilters.data.set(k, undefined)) | 
					
						
							|  |  |  |             appliedFilters.ping() | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             cancel() | 
					
						
							| 
									
										
										
										
											2022-01-08 04:22:50 +01:00
										 |  |  |             closePopup() | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-08 04:22:50 +01:00
										 |  |  |         const hasActiveFilter = preset.layerToAddTo.appliedFilters | 
					
						
							|  |  |  |             .map(appliedFilters => { | 
					
						
							|  |  |  |                 const activeFilters = Array.from(appliedFilters.values()).filter(f => f?.currentFilter !== undefined); | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |                 return activeFilters.length === 0; | 
					
						
							| 
									
										
										
										
											2022-01-08 04:22:50 +01:00
										 |  |  |             }) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-08 04:22:50 +01:00
										 |  |  |         // If at least one filter is active which _might_ hide a newly added item, this blocks the preset and requests the filter to be disabled
 | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |         const disableFiltersOrConfirm = new Toggle( | 
					
						
							|  |  |  |             openLayerOrConfirm, | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             disableFilter, | 
					
						
							| 
									
										
										
										
											2022-01-08 04:22:50 +01:00
										 |  |  |             hasActiveFilter) | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const tagInfo = SimpleAddUI.CreateTagInfoFor(preset, state.osmConnection); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const cancelButton = new SubtleButton(Svg.close_ui(), | 
					
						
							|  |  |  |             Translations.t.general.cancel | 
					
						
							|  |  |  |         ).onClick(cancel) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 03:38:40 +01:00
										 |  |  |          | 
					
						
							|  |  |  |         let examples : BaseUIElement = undefined; | 
					
						
							|  |  |  |         if(preset.exampleImages !== undefined && preset.exampleImages.length > 0){ | 
					
						
							|  |  |  |             examples = new Combine([ | 
					
						
							|  |  |  |              new Title( preset.exampleImages.length == 1 ?  Translations.t.general.example :  Translations.t.general.examples), | 
					
						
							| 
									
										
										
										
											2022-02-09 22:37:21 +01:00
										 |  |  |                 new Combine(preset.exampleImages.map(img => new Img(img).SetClass("h-64 m-1 w-auto rounded-lg"))).SetClass("flex flex-wrap items-stretch") | 
					
						
							| 
									
										
										
										
											2022-02-09 03:38:40 +01:00
										 |  |  |             ]) | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |         super([ | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             new Toggle( | 
					
						
							|  |  |  |                 Translations.t.general.testing.SetClass("alert"), | 
					
						
							|  |  |  |                 undefined, | 
					
						
							|  |  |  |                 state.featureSwitchIsTesting | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             disableFiltersOrConfirm, | 
					
						
							|  |  |  |             cancelButton, | 
					
						
							|  |  |  |             preset.description, | 
					
						
							| 
									
										
										
										
											2022-02-09 03:38:40 +01:00
										 |  |  |             examples, | 
					
						
							| 
									
										
										
										
											2021-10-31 02:08:39 +01:00
										 |  |  |             tagInfo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.SetClass("flex flex-col") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |