forked from MapComplete/MapComplete
		
	Fix autoapply for GRB theme
This commit is contained in:
		
							parent
							
								
									db770f2c35
								
							
						
					
					
						commit
						30be86668e
					
				
					 16 changed files with 392 additions and 209 deletions
				
			
		|  | @ -21,7 +21,7 @@ import ShowDataLayer from "../ShowDataLayer/ShowDataLayer"; | |||
| import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource"; | ||||
| import ShowDataMultiLayer from "../ShowDataLayer/ShowDataMultiLayer"; | ||||
| import CreateWayWithPointReuseAction, {MergePointConfig} from "../../Logic/Osm/Actions/CreateWayWithPointReuseAction"; | ||||
| import OsmChangeAction, {OsmCreateAction} from "../../Logic/Osm/Actions/OsmChangeAction"; | ||||
| import OsmChangeAction from "../../Logic/Osm/Actions/OsmChangeAction"; | ||||
| import FeatureSource from "../../Logic/FeatureSource/FeatureSource"; | ||||
| import {OsmObject, OsmWay} from "../../Logic/Osm/OsmObject"; | ||||
| import FeaturePipelineState from "../../Logic/State/FeaturePipelineState"; | ||||
|  | @ -37,12 +37,17 @@ import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; | |||
| import * as conflation_json from "../../assets/layers/conflation/conflation.json"; | ||||
| import {GeoOperations} from "../../Logic/GeoOperations"; | ||||
| import {LoginToggle} from "./LoginButton"; | ||||
| import {AutoAction} from "./AutoApplyButton"; | ||||
| import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; | ||||
| import {Changes} from "../../Logic/Osm/Changes"; | ||||
| import {ElementStorage} from "../../Logic/ElementStorage"; | ||||
| 
 | ||||
| /** | ||||
|  * A helper class for the various import-flows. | ||||
|  * An import-flow always starts with a 'Import this'-button. Upon click, a custom confirmation panel is provided | ||||
|  */ | ||||
| abstract class AbstractImportButton implements SpecialVisualizations { | ||||
|     protected static importedIds = new Set<string>() | ||||
|     public readonly funcName: string | ||||
|     public readonly docs: string | ||||
|     public readonly args: { name: string, defaultValue?: string, doc: string }[] | ||||
|  | @ -157,7 +162,10 @@ ${Utils.special_visualizations_importRequirementDocs} | |||
|             state.featureSwitchUserbadge) | ||||
| 
 | ||||
| 
 | ||||
|         const isImported = tagSource.map(tags => tags._imported === "yes") | ||||
|         const isImported = tagSource.map(tags => { | ||||
|             AbstractImportButton.importedIds.add(tags.id) | ||||
|             return tags._imported === "yes"; | ||||
|         }) | ||||
| 
 | ||||
| 
 | ||||
|         /**** THe actual panel showing the import guiding map ****/ | ||||
|  | @ -269,7 +277,7 @@ ${Utils.special_visualizations_importRequirementDocs} | |||
|         return new Combine([confirmationMap, confirmButton, cancel]).SetClass("flex flex-col") | ||||
|     } | ||||
| 
 | ||||
|     private parseArgs(argsRaw: string[], originalFeatureTags: UIEventSource<any>): { minzoom: string, max_snap_distance: string, snap_onto_layers: string, icon: string, text: string, tags: string, targetLayer: string, newTags: UIEventSource<Tag[]> } { | ||||
|     protected parseArgs(argsRaw: string[], originalFeatureTags: UIEventSource<any>): { minzoom: string, max_snap_distance: string, snap_onto_layers: string, icon: string, text: string, tags: string, targetLayer: string, newTags: UIEventSource<Tag[]> } { | ||||
|         const baseArgs = Utils.ParseVisArgs(this.args, argsRaw) | ||||
|         if (originalFeatureTags !== undefined) { | ||||
| 
 | ||||
|  | @ -351,7 +359,8 @@ export class ConflateButton extends AbstractImportButton { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| export class ImportWayButton extends AbstractImportButton { | ||||
| export class ImportWayButton extends AbstractImportButton implements AutoAction { | ||||
|     public readonly supportsAutoAction = true; | ||||
| 
 | ||||
|     constructor() { | ||||
|         super("import_way_button", | ||||
|  | @ -386,6 +395,39 @@ export class ImportWayButton extends AbstractImportButton { | |||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     async applyActionOn(state: { layoutToUse: LayoutConfig; changes: Changes, allElements: ElementStorage }, | ||||
|                         originalFeatureTags: UIEventSource<any>, | ||||
|                         argument: string[]): Promise<void> { | ||||
|         const id = originalFeatureTags.data.id; | ||||
|         if (AbstractImportButton.importedIds.has(originalFeatureTags.data.id) | ||||
|         ) { | ||||
|             return; | ||||
|         } | ||||
|         AbstractImportButton.importedIds.add(originalFeatureTags.data.id) | ||||
|         const args = this.parseArgs(argument, originalFeatureTags) | ||||
|         const feature = state.allElements.ContainingFeatures.get(id) | ||||
|         console.log("Geometry to auto-import is:", feature) | ||||
|         const geom = feature.geometry | ||||
|         let coordinates: [number, number][] | ||||
|         if (geom.type === "LineString") { | ||||
|             coordinates = geom.coordinates | ||||
|         } else if (geom.type === "Polygon") { | ||||
|             coordinates = geom.coordinates[0] | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         const mergeConfigs = this.GetMergeConfig(args); | ||||
| 
 | ||||
|         const action = this.CreateAction( | ||||
|             feature, | ||||
|             args, | ||||
|             <FeaturePipelineState>state, | ||||
|             mergeConfigs, | ||||
|             coordinates | ||||
|         ) | ||||
|         await state.changes.applyAction(action) | ||||
|     } | ||||
| 
 | ||||
|     canBeImported(feature: any) { | ||||
|         const type = feature.geometry.type | ||||
|         return type === "LineString" || type === "Polygon" | ||||
|  | @ -420,7 +462,24 @@ export class ImportWayButton extends AbstractImportButton { | |||
|         } else if (geom.type === "Polygon") { | ||||
|             coordinates = geom.coordinates[0] | ||||
|         } | ||||
|         const mergeConfigs = this.GetMergeConfig(args); | ||||
| 
 | ||||
| 
 | ||||
|         let action = this.CreateAction(feature, args, state, mergeConfigs, coordinates); | ||||
| 
 | ||||
|         return this.createConfirmPanelForWay( | ||||
|             state, | ||||
|             args, | ||||
|             feature, | ||||
|             originalFeatureTags, | ||||
|             action, | ||||
|             onCancel | ||||
|         ) | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private GetMergeConfig(args: { max_snap_distance: string; snap_onto_layers: string; icon: string; text: string; tags: string; newTags: UIEventSource<any>; targetLayer: string }) | ||||
|         : MergePointConfig[] { | ||||
|         const nodesMustMatch = args["snap_to_point_if"]?.split(";")?.map((tag, i) => TagUtils.Tag(tag, "TagsSpec for import button " + i)) | ||||
| 
 | ||||
|         const mergeConfigs = [] | ||||
|  | @ -446,14 +505,21 @@ export class ImportWayButton extends AbstractImportButton { | |||
|             mergeConfigs.push(mergeConfig) | ||||
|         } | ||||
| 
 | ||||
|         let action: OsmCreateAction & { getPreview(): Promise<FeatureSource> }; | ||||
|         return mergeConfigs; | ||||
|     } | ||||
| 
 | ||||
|     private CreateAction(feature, | ||||
|                          args: { max_snap_distance: string; snap_onto_layers: string; icon: string; text: string; tags: string; newTags: UIEventSource<any>; targetLayer: string }, | ||||
|                          state: FeaturePipelineState, | ||||
|                          mergeConfigs: any[], | ||||
|                          coordinates: [number, number][]) { | ||||
| 
 | ||||
|         const coors = feature.geometry.coordinates | ||||
|         if (feature.geometry.type === "Polygon" && coors.length > 1) { | ||||
|             const outer = coors[0] | ||||
|             const inner = [...coors] | ||||
|             inner.splice(0, 1) | ||||
|             action = new CreateMultiPolygonWithPointReuseAction( | ||||
|             return new CreateMultiPolygonWithPointReuseAction( | ||||
|                 args.newTags.data, | ||||
|                 outer, | ||||
|                 inner, | ||||
|  | @ -463,24 +529,13 @@ export class ImportWayButton extends AbstractImportButton { | |||
|             ) | ||||
|         } else { | ||||
| 
 | ||||
|             action = new CreateWayWithPointReuseAction( | ||||
|             return new CreateWayWithPointReuseAction( | ||||
|                 args.newTags.data, | ||||
|                 coordinates, | ||||
|                 state, | ||||
|                 mergeConfigs | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         return this.createConfirmPanelForWay( | ||||
|             state, | ||||
|             args, | ||||
|             feature, | ||||
|             originalFeatureTags, | ||||
|             action, | ||||
|             onCancel | ||||
|         ) | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -525,11 +580,11 @@ export class ImportPointButton extends AbstractImportButton { | |||
|             let specialMotivation = undefined | ||||
| 
 | ||||
|             let note_id = args.note_id | ||||
|             if (args.note_id !== undefined &&  isNaN(Number(args.note_id))) { | ||||
|             if (args.note_id !== undefined && isNaN(Number(args.note_id))) { | ||||
|                 note_id = originalFeatureTags.data[args.note_id] | ||||
|                 specialMotivation = "source: https://osm.org/note/" + note_id | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             const newElementAction = new CreateNewNodeAction(tags, location.lat, location.lon, { | ||||
|                 theme: state.layoutToUse.id, | ||||
|                 changeType: "import", | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue