import ImportFlow from "./ImportFlow" import { ConflateFlowArguments } from "./ConflateImportButtonViz" import { SpecialVisualizationState } from "../../SpecialVisualization" import { Feature, LineString, Polygon } from "geojson" import { Store, UIEventSource } from "../../../Logic/UIEventSource" import { Tag } from "../../../Logic/Tags/Tag" import OsmChangeAction from "../../../Logic/Osm/Actions/OsmChangeAction" import ReplaceGeometryAction from "../../../Logic/Osm/Actions/ReplaceGeometryAction" import { GeoOperations } from "../../../Logic/GeoOperations" import { TagUtils } from "../../../Logic/Tags/TagUtils" import { MergePointConfig } from "../../../Logic/Osm/Actions/CreateWayWithPointReuseAction" import { And } from "../../../Logic/Tags/And" import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig" import { Changes } from "../../../Logic/Osm/Changes" import { FeatureSource, IndexedFeatureSource } from "../../../Logic/FeatureSource/FeatureSource" import FullNodeDatabaseSource from "../../../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource" import { OsmConnection } from "../../../Logic/Osm/OsmConnection" export default class ConflateImportFlowState extends ImportFlow { public readonly originalFeature: Feature private readonly action: OsmChangeAction & { getPreview?(): Promise newElementId?: string } constructor( state: SpecialVisualizationState, originalFeature: Feature, args: ConflateFlowArguments, tagsToApply: Store, originalFeatureTags: UIEventSource>, idOfFeatureToReplaceGeometry: string ) { super(state, args, tagsToApply, originalFeatureTags) this.originalFeature = originalFeature this.action = ConflateImportFlowState.createAction( originalFeature, args, state, idOfFeatureToReplaceGeometry, tagsToApply ) } // noinspection JSUnusedGlobalSymbols public GetPreview(): Promise { return this.action.getPreview() } 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 static createAction( feature: Feature, args: ConflateFlowArguments, state: { osmConnection: OsmConnection layout: LayoutConfig changes: Changes indexedFeatures: IndexedFeatureSource fullNodeDatabase?: FullNodeDatabaseSource }, idOfFeatureToReplaceGeometry, tagsToApply: Store ): OsmChangeAction & { getPreview?(): Promise; newElementId?: string } { const nodesMustMatch = args.snap_onto_layers ?.split(";") ?.map((tag, i) => TagUtils.Tag(tag, "TagsSpec for import button " + i)) const mergeConfigs = [] if (nodesMustMatch !== undefined && nodesMustMatch.length > 0) { const mergeConfig: MergePointConfig = { mode: args.point_move_mode == "move_osm" ? "move_osm_point" : "reuse_osm_point", ifMatches: new And(nodesMustMatch), withinRangeOfM: Number(args.max_snap_distance ?? 0), } mergeConfigs.push(mergeConfig) } return new ReplaceGeometryAction( state, GeoOperations.removeOvernoding(feature), idOfFeatureToReplaceGeometry, { theme: state.layout.id, newTags: tagsToApply.data, } ) } }