| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  | import ImportFlow, { ImportFlowArguments } from "./ImportFlow" | 
					
						
							|  |  |  | import { SpecialVisualizationState } from "../../SpecialVisualization" | 
					
						
							|  |  |  | import { Feature, LineString, Polygon } from "geojson" | 
					
						
							|  |  |  | import { Store, UIEventSource } from "../../../Logic/UIEventSource" | 
					
						
							|  |  |  | import { Tag } from "../../../Logic/Tags/Tag" | 
					
						
							|  |  |  | import { And } from "../../../Logic/Tags/And" | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  | import CreateWayWithPointReuseAction, { | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     MergePointConfig, | 
					
						
							|  |  |  | } from "../../../Logic/Osm/Actions/CreateWayWithPointReuseAction" | 
					
						
							|  |  |  | import { TagUtils } from "../../../Logic/Tags/TagUtils" | 
					
						
							|  |  |  | import { OsmCreateAction, PreviewableAction } from "../../../Logic/Osm/Actions/OsmChangeAction" | 
					
						
							|  |  |  | import { FeatureSource, IndexedFeatureSource } from "../../../Logic/FeatureSource/FeatureSource" | 
					
						
							|  |  |  | import CreateMultiPolygonWithPointReuseAction from "../../../Logic/Osm/Actions/CreateMultiPolygonWithPointReuseAction" | 
					
						
							|  |  |  | import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig" | 
					
						
							|  |  |  | import { Changes } from "../../../Logic/Osm/Changes" | 
					
						
							|  |  |  | import FullNodeDatabaseSource from "../../../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource" | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  | export interface WayImportFlowArguments extends ImportFlowArguments { | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |     max_snap_distance: string | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     snap_onto_layers: string | 
					
						
							|  |  |  |     snap_to_layer_max_distance: string | 
					
						
							|  |  |  |     max_move_distance: string | 
					
						
							|  |  |  |     move_osm_point_if | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |     snap_to_point_if | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default class WayImportFlowState extends ImportFlow<WayImportFlowArguments> { | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     public readonly originalFeature: Feature<LineString | Polygon> | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     private readonly action: OsmCreateAction & { getPreview?(): Promise<FeatureSource> } | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     constructor( | 
					
						
							|  |  |  |         state: SpecialVisualizationState, | 
					
						
							|  |  |  |         originalFeature: Feature<LineString | Polygon>, | 
					
						
							|  |  |  |         args: WayImportFlowArguments, | 
					
						
							|  |  |  |         tagsToApply: Store<Tag[]>, | 
					
						
							|  |  |  |         originalFeatureTags: UIEventSource<Record<string, string>> | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |         super(state, args, tagsToApply, originalFeatureTags) | 
					
						
							|  |  |  |         this.originalFeature = originalFeature | 
					
						
							| 
									
										
										
										
											2023-06-01 02:52:21 +02:00
										 |  |  |         const mergeConfigs = WayImportFlowState.GetMergeConfig(args) | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |         this.action = WayImportFlowState.CreateAction( | 
					
						
							|  |  |  |             originalFeature, | 
					
						
							|  |  |  |             args, | 
					
						
							|  |  |  |             state, | 
					
						
							|  |  |  |             tagsToApply, | 
					
						
							|  |  |  |             mergeConfigs | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public static CreateAction( | 
					
						
							|  |  |  |         feature: Feature<LineString | Polygon>, | 
					
						
							|  |  |  |         args: WayImportFlowArguments, | 
					
						
							|  |  |  |         state: { | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |             layout: LayoutConfig | 
					
						
							|  |  |  |             changes: Changes | 
					
						
							|  |  |  |             indexedFeatures: IndexedFeatureSource | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |             fullNodeDatabase?: FullNodeDatabaseSource | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         tagsToApply: Store<Tag[]>, | 
					
						
							|  |  |  |         mergeConfigs: MergePointConfig[] | 
					
						
							| 
									
										
										
										
											2023-06-01 02:52:21 +02:00
										 |  |  |     ): OsmCreateAction & PreviewableAction & { newElementId?: string } { | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |         if (feature.geometry.type === "Polygon" && feature.geometry.coordinates.length > 1) { | 
					
						
							|  |  |  |             const coors = (<Polygon>feature.geometry).coordinates | 
					
						
							|  |  |  |             const outer = coors[0] | 
					
						
							|  |  |  |             const inner = [...coors] | 
					
						
							|  |  |  |             inner.splice(0, 1) | 
					
						
							|  |  |  |             return new CreateMultiPolygonWithPointReuseAction( | 
					
						
							|  |  |  |                 tagsToApply.data, | 
					
						
							|  |  |  |                 outer, | 
					
						
							|  |  |  |                 inner, | 
					
						
							|  |  |  |                 state, | 
					
						
							|  |  |  |                 mergeConfigs, | 
					
						
							|  |  |  |                 "import" | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         } else if (feature.geometry.type === "Polygon") { | 
					
						
							|  |  |  |             const coors = feature.geometry.coordinates | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const outer = coors[0] | 
					
						
							|  |  |  |             return new CreateWayWithPointReuseAction(tagsToApply.data, outer, state, mergeConfigs) | 
					
						
							|  |  |  |         } else if (feature.geometry.type === "LineString") { | 
					
						
							|  |  |  |             const coors = feature.geometry.coordinates | 
					
						
							|  |  |  |             return new CreateWayWithPointReuseAction(tagsToApply.data, coors, state, mergeConfigs) | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             throw "Unsupported type" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-01 02:52:21 +02:00
										 |  |  |     public static GetMergeConfig(args: WayImportFlowArguments): MergePointConfig[] { | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |         const nodesMustMatch = args.snap_to_point_if | 
					
						
							|  |  |  |             ?.split(";") | 
					
						
							|  |  |  |             ?.map((tag, i) => TagUtils.Tag(tag, "TagsSpec for import button " + i)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const mergeConfigs = [] | 
					
						
							|  |  |  |         if (nodesMustMatch !== undefined && nodesMustMatch.length > 0) { | 
					
						
							|  |  |  |             const mergeConfig: MergePointConfig = { | 
					
						
							|  |  |  |                 mode: "reuse_osm_point", | 
					
						
							|  |  |  |                 ifMatches: new And(nodesMustMatch), | 
					
						
							|  |  |  |                 withinRangeOfM: Number(args.max_snap_distance), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             mergeConfigs.push(mergeConfig) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const moveOsmPointIfTags = args["move_osm_point_if"] | 
					
						
							|  |  |  |             ?.split(";") | 
					
						
							|  |  |  |             ?.map((tag, i) => TagUtils.Tag(tag, "TagsSpec for import button " + i)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (nodesMustMatch !== undefined && moveOsmPointIfTags.length > 0) { | 
					
						
							|  |  |  |             const moveDistance = Math.min(20, Number(args["max_move_distance"])) | 
					
						
							|  |  |  |             const mergeConfig: MergePointConfig = { | 
					
						
							|  |  |  |                 mode: "move_osm_point", | 
					
						
							|  |  |  |                 ifMatches: new And(moveOsmPointIfTags), | 
					
						
							|  |  |  |                 withinRangeOfM: moveDistance, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             mergeConfigs.push(mergeConfig) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return mergeConfigs | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-01 02:52:21 +02:00
										 |  |  |     // noinspection JSUnusedGlobalSymbols
 | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |     public async onConfirm() { | 
					
						
							|  |  |  |         const originalFeatureTags = this._originalFeatureTags | 
					
						
							|  |  |  |         originalFeatureTags.data["_imported"] = "yes" | 
					
						
							|  |  |  |         originalFeatureTags.ping() // will set isImported as per its definition
 | 
					
						
							|  |  |  |         const action = this.action | 
					
						
							|  |  |  |         await this.state.changes.applyAction(action) | 
					
						
							|  |  |  |         const newId = action.newElementId ?? action.mainObjectId | 
					
						
							|  |  |  |         this.state.selectedLayer.setData(this.targetLayer.layerDef) | 
					
						
							|  |  |  |         this.state.selectedElement.setData(this.state.indexedFeatures.featuresById.data.get(newId)) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public GetPreview(): undefined | Promise<FeatureSource> { | 
					
						
							|  |  |  |         if (!this.action?.getPreview) { | 
					
						
							|  |  |  |             return undefined | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return this.action.getPreview() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |