| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  | import {SubtleButton} from "../Base/SubtleButton"; | 
					
						
							|  |  |  | import Combine from "../Base/Combine"; | 
					
						
							|  |  |  | import Svg from "../../Svg"; | 
					
						
							|  |  |  | import {OsmConnection} from "../../Logic/Osm/OsmConnection"; | 
					
						
							|  |  |  | import Toggle from "../Input/Toggle"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import Translations from "../i18n/Translations"; | 
					
						
							|  |  |  | import {VariableUiElement} from "../Base/VariableUIElement"; | 
					
						
							|  |  |  | import {Translation} from "../i18n/Translation"; | 
					
						
							|  |  |  | import BaseUIElement from "../BaseUIElement"; | 
					
						
							|  |  |  | import LocationInput from "../Input/LocationInput"; | 
					
						
							|  |  |  | import Loc from "../../Models/Loc"; | 
					
						
							|  |  |  | import {GeoOperations} from "../../Logic/GeoOperations"; | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | import {OsmObject} from "../../Logic/Osm/OsmObject"; | 
					
						
							|  |  |  | import {Changes} from "../../Logic/Osm/Changes"; | 
					
						
							|  |  |  | import ChangeLocationAction from "../../Logic/Osm/Actions/ChangeLocationAction"; | 
					
						
							|  |  |  | import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  | import MoveConfig from "../../Models/ThemeConfig/MoveConfig"; | 
					
						
							|  |  |  | import {ElementStorage} from "../../Logic/ElementStorage"; | 
					
						
							| 
									
										
										
										
											2021-10-15 14:52:11 +02:00
										 |  |  | import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers"; | 
					
						
							| 
									
										
										
										
											2021-11-21 02:44:35 +01:00
										 |  |  | import BaseLayer from "../../Models/BaseLayer"; | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | interface MoveReason { | 
					
						
							|  |  |  |     text: Translation | string, | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |     invitingText: Translation | string, | 
					
						
							| 
									
										
										
										
											2021-10-14 17:38:00 +02:00
										 |  |  |     icon: BaseUIElement, | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |     changesetCommentValue: string, | 
					
						
							|  |  |  |     lockBounds: true | boolean, | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |     background: undefined | "map" | "photo" | string | string[], | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |     startZoom: number, | 
					
						
							|  |  |  |     minZoom: number | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class MoveWizard extends Toggle { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * The UI-element which helps moving a point | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     constructor( | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |         featureToMove: any, | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |         state: { | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |             osmConnection: OsmConnection, | 
					
						
							|  |  |  |             featureSwitchUserbadge: UIEventSource<boolean>, | 
					
						
							|  |  |  |             changes: Changes, | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |             layoutToUse: LayoutConfig, | 
					
						
							|  |  |  |             allElements: ElementStorage | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         }, options: MoveConfig) { | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const t = Translations.t.move | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |         const loginButton = new Toggle( | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |             t.loginToMove.SetClass("btn").onClick(() => state.osmConnection.AttemptLogin()), | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             undefined, | 
					
						
							|  |  |  |             state.featureSwitchUserbadge | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const reasons: MoveReason[] = [] | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |         if (options.enableRelocation) { | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             reasons.push({ | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                 text: t.reasons.reasonRelocation, | 
					
						
							|  |  |  |                 invitingText: t.inviteToMove.reasonRelocation, | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |                 icon: Svg.relocation_svg(), | 
					
						
							|  |  |  |                 changesetCommentValue: "relocated", | 
					
						
							|  |  |  |                 lockBounds: false, | 
					
						
							|  |  |  |                 background: undefined, | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 startZoom: 12, | 
					
						
							|  |  |  |                 minZoom: 6 | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             }) | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         if (options.enableImproveAccuracy) { | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             reasons.push({ | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                 text: t.reasons.reasonInaccurate, | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |                 invitingText: t.inviteToMove.reasonInaccurate, | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |                 icon: Svg.crosshair_svg(), | 
					
						
							|  |  |  |                 changesetCommentValue: "improve_accuracy", | 
					
						
							|  |  |  |                 lockBounds: true, | 
					
						
							|  |  |  |                 background: "photo", | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 startZoom: 17, | 
					
						
							|  |  |  |                 minZoom: 16 | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const currentStep = new UIEventSource<"start" | "reason" | "pick_location" | "moved">("start") | 
					
						
							|  |  |  |         const moveReason = new UIEventSource<MoveReason>(undefined) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         let moveButton: BaseUIElement; | 
					
						
							|  |  |  |         if (reasons.length === 1) { | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |             const reason = reasons[0] | 
					
						
							|  |  |  |             moveReason.setData(reason) | 
					
						
							|  |  |  |             moveButton = new SubtleButton( | 
					
						
							| 
									
										
										
										
											2021-12-21 21:36:03 +01:00
										 |  |  |                 reason.icon.SetStyle("height: 1.5rem; width: 1.5rem;"), | 
					
						
							| 
									
										
										
										
											2022-04-21 12:39:28 +02:00
										 |  |  |                 Translations.T(reason.invitingText) | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |             ).onClick(() => { | 
					
						
							|  |  |  |                 currentStep.setData("pick_location") | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |             moveButton = new SubtleButton( | 
					
						
							| 
									
										
										
										
											2021-12-21 21:36:03 +01:00
										 |  |  |                 Svg.move_ui().SetStyle("width: 1.5rem; height: 1.5rem"), | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                 t.inviteToMove.generic | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |             ).onClick(() => { | 
					
						
							|  |  |  |                 currentStep.setData("reason") | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const moveAgainButton = new SubtleButton( | 
					
						
							|  |  |  |             Svg.move_ui(), | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |             t.inviteToMoveAgain | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |         ).onClick(() => { | 
					
						
							|  |  |  |             currentStep.setData("reason") | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |         const selectReason = new Combine(reasons.map(r => new SubtleButton(r.icon, r.text).onClick(() => { | 
					
						
							|  |  |  |             moveReason.setData(r) | 
					
						
							|  |  |  |             currentStep.setData("pick_location") | 
					
						
							|  |  |  |         }))) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |         const cancelButton = new SubtleButton(Svg.close_svg(), t.cancel).onClick(() => currentStep.setData("start")) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |         const [lon, lat] = GeoOperations.centerpointCoordinates(featureToMove) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |         const locationInput = moveReason.map(reason => { | 
					
						
							|  |  |  |             if (reason === undefined) { | 
					
						
							|  |  |  |                 return undefined | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const loc = new UIEventSource<Loc>({ | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |                 lon: lon, | 
					
						
							|  |  |  |                 lat: lat, | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 zoom: reason?.startZoom ?? 16 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 18:59:21 +02:00
										 |  |  |             let background: string[] | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             if (typeof reason.background == "string") { | 
					
						
							| 
									
										
										
										
											2021-10-14 18:59:21 +02:00
										 |  |  |                 background = [reason.background] | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2021-10-14 18:59:21 +02:00
										 |  |  |                 background = reason.background | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-21 02:44:35 +01:00
										 |  |  |             const preferredBackground = AvailableBaseLayers.SelectBestLayerAccordingTo(loc, new UIEventSource(background)).data | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |             const locationInput = new LocationInput({ | 
					
						
							|  |  |  |                 minZoom: reason.minZoom, | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |                 centerLocation: loc, | 
					
						
							| 
									
										
										
										
											2021-11-21 02:44:35 +01:00
										 |  |  |                 mapBackground: new UIEventSource<BaseLayer>(preferredBackground) // We detach the layer
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |             }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (reason.lockBounds) { | 
					
						
							|  |  |  |                 locationInput.installBounds(0.05, true) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             locationInput.SetStyle("height: 17.5rem") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const confirmMove = new SubtleButton(Svg.move_confirm_svg(), t.confirmMove) | 
					
						
							|  |  |  |             confirmMove.onClick(() => { | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |                 const loc = locationInput.GetValue().data | 
					
						
							|  |  |  |                 state.changes.applyAction(new ChangeLocationAction(featureToMove.properties.id, [loc.lon, loc.lat], { | 
					
						
							| 
									
										
										
										
											2021-10-25 20:48:06 +02:00
										 |  |  |                     reason: reason.changesetCommentValue, | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |                     theme: state.layoutToUse.id | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 })) | 
					
						
							| 
									
										
										
										
											2021-10-14 03:46:09 +02:00
										 |  |  |                 featureToMove.properties._lat = loc.lat | 
					
						
							|  |  |  |                 featureToMove.properties._lon = loc.lon | 
					
						
							|  |  |  |                 state.allElements.getEventSourceById(id).ping() | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 currentStep.setData("moved") | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |             const zoomInFurhter = t.zoomInFurther.SetClass("alert block m-6") | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |             return new Combine([ | 
					
						
							|  |  |  |                 locationInput, | 
					
						
							|  |  |  |                 new Toggle(confirmMove, zoomInFurhter, locationInput.GetValue().map(l => l.zoom >= 19)) | 
					
						
							|  |  |  |             ]).SetClass("flex flex-col") | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const dialogClasses = "p-2 md:p-4 m-2 border border-gray-400 rounded-xl flex flex-col" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const moveFlow = new Toggle( | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             new VariableUiElement(currentStep.map(currentStep => { | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 switch (currentStep) { | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |                     case "start": | 
					
						
							|  |  |  |                         return moveButton; | 
					
						
							|  |  |  |                     case "reason": | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                         return new Combine([t.whyMove.SetClass("text-lg font-bold"), selectReason, cancelButton]).SetClass(dialogClasses); | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |                     case "pick_location": | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                         return new Combine([t.moveTitle.SetClass("text-lg font-bold"), new VariableUiElement(locationInput), cancelButton]).SetClass(dialogClasses) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                     case "moved": | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                         return new Combine([t.pointIsMoved.SetClass("thanks"), moveAgainButton]).SetClass("flex flex-col"); | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |             })), | 
					
						
							|  |  |  |             loginButton, | 
					
						
							|  |  |  |             state.osmConnection.isLoggedIn | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |         let id = featureToMove.properties.id | 
					
						
							|  |  |  |         const backend = state.osmConnection._oauth_config.url | 
					
						
							|  |  |  |         if (id.startsWith(backend)) { | 
					
						
							|  |  |  |             id = id.substring(backend.length) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const moveDisallowedReason = new UIEventSource<BaseUIElement>(undefined) | 
					
						
							|  |  |  |         if (id.startsWith("way")) { | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |             moveDisallowedReason.setData(t.isWay) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |         } else if (id.startsWith("relation")) { | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |             moveDisallowedReason.setData(t.isRelation) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         } else if (id.indexOf("-") < 0) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |             OsmObject.DownloadReferencingWays(id).then(referencing => { | 
					
						
							|  |  |  |                 if (referencing.length > 0) { | 
					
						
							|  |  |  |                     console.log("Got a referencing way, move not allowed") | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                     moveDisallowedReason.setData(t.partOfAWay) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             OsmObject.DownloadReferencingRelations(id).then(partOf => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (partOf.length > 0) { | 
					
						
							| 
									
										
										
										
											2021-10-26 01:14:22 +02:00
										 |  |  |                     moveDisallowedReason.setData(t.partOfRelation) | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         super( | 
					
						
							|  |  |  |             moveFlow, | 
					
						
							|  |  |  |             new Combine([ | 
					
						
							| 
									
										
										
										
											2021-10-14 18:29:39 +02:00
										 |  |  |                 Svg.move_not_allowed_svg().SetStyle("height: 2rem").SetClass("m-2"), | 
					
						
							| 
									
										
										
										
											2021-10-25 21:50:38 +02:00
										 |  |  |                 new Combine([t.cannotBeMoved, | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |                     new VariableUiElement(moveDisallowedReason).SetClass("subtle") | 
					
						
							|  |  |  |                 ]).SetClass("flex flex-col") | 
					
						
							| 
									
										
										
										
											2021-10-14 18:29:39 +02:00
										 |  |  |             ]).SetClass("flex m-2 p-2 rounded-lg bg-gray-200"), | 
					
						
							| 
									
										
										
										
											2021-10-13 03:09:37 +02:00
										 |  |  |             moveDisallowedReason.map(r => r === undefined) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-11 00:54:35 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |