forked from MapComplete/MapComplete
		
	More refactoring
This commit is contained in:
		
							parent
							
								
									231f4f2c97
								
							
						
					
					
						commit
						6890c5189e
					
				
					 12 changed files with 52 additions and 59 deletions
				
			
		|  | @ -25,7 +25,9 @@ export default class BackgroundSelector extends VariableUiElement { | |||
|                     if (baseLayers.length <= 1) { | ||||
|                         return undefined; | ||||
|                     } | ||||
|                     return new DropDown(Translations.t.general.backgroundMap.Clone(), baseLayers, State.state.backgroundLayer) | ||||
|                     return new DropDown(Translations.t.general.backgroundMap.Clone(), baseLayers, State.state.backgroundLayer, { | ||||
|                         select_class: 'bg-indigo-100 p-1 rounded hover:bg-indigo-200 w-full' | ||||
|                     }) | ||||
|                 } | ||||
|             ) | ||||
|         ) | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ export class DownloadPanel extends Toggle { | |||
|     constructor() { | ||||
|         const state: { | ||||
|             featurePipeline: FeaturePipeline, | ||||
|             layoutToUse: UIEventSource<LayoutConfig>, | ||||
|             layoutToUse: LayoutConfig, | ||||
|             currentBounds: UIEventSource<BBox> | ||||
|         } = State.state | ||||
|          | ||||
|  |  | |||
|  | @ -31,14 +31,14 @@ export default class ImportButton extends Toggle { | |||
|         const button = new SubtleButton(imageUrl, message) | ||||
| 
 | ||||
| 
 | ||||
|         button.onClick(() => { | ||||
|         button.onClick(async () => { | ||||
|             if (isImported.data) { | ||||
|                 return | ||||
|             } | ||||
|             originalTags.data["_imported"] = "yes" | ||||
|             originalTags.ping() // will set isImported as per its definition
 | ||||
|             const newElementAction = new CreateNewNodeAction(newTags.data, lat, lon) | ||||
|             State.state.changes.applyAction(newElementAction) | ||||
|             await State.state.changes.applyAction(newElementAction) | ||||
|             State.state.selectedElement.setData(State.state.allElements.ContainingFeatures.get( | ||||
|                 newElementAction.newElementId | ||||
|             )) | ||||
|  |  | |||
|  | @ -56,9 +56,9 @@ export default class SimpleAddUI extends Toggle { | |||
|         const presetsOverview = SimpleAddUI.CreateAllPresetsPanel(selectedPreset) | ||||
| 
 | ||||
| 
 | ||||
|         function createNewPoint(tags: any[], location: { lat: number, lon: number }, snapOntoWay?: OsmWay) { | ||||
|        async function createNewPoint(tags: any[], location: { lat: number, lon: number }, snapOntoWay?: OsmWay) { | ||||
|             const newElementAction = new CreateNewNodeAction(tags, location.lat, location.lon, {snapOnto: snapOntoWay}) | ||||
|             State.state.changes.applyAction(newElementAction) | ||||
|             await State.state.changes.applyAction(newElementAction) | ||||
|             selectedPreset.setData(undefined) | ||||
|             isShown.setData(false) | ||||
|             State.state.selectedElement.setData(State.state.allElements.ContainingFeatures.get( | ||||
|  |  | |||
|  | @ -15,15 +15,15 @@ export default class DeleteImage extends Toggle { | |||
|         const isDeletedBadge = Translations.t.image.isDeleted.Clone() | ||||
|             .SetClass("rounded-full p-1") | ||||
|             .SetStyle("color:white;background:#ff8c8c") | ||||
|             .onClick(() => { | ||||
|                 State.state?.changes?.applyAction(new ChangeTagAction(tags.data.id, new Tag(key, oldValue), tags.data)) | ||||
|             .onClick(async() => { | ||||
|                await State.state?.changes?.applyAction(new ChangeTagAction(tags.data.id, new Tag(key, oldValue), tags.data)) | ||||
|             }); | ||||
| 
 | ||||
|         const deleteButton = Translations.t.image.doDelete.Clone() | ||||
|             .SetClass("block w-full pl-4 pr-4") | ||||
|             .SetStyle("color:white;background:#ff8c8c; border-top-left-radius:30rem; border-top-right-radius: 30rem;") | ||||
|             .onClick(() => { | ||||
|                 State.state?.changes?.applyAction( | ||||
|             .onClick( async() => { | ||||
|              await   State.state?.changes?.applyAction( | ||||
|                     new ChangeTagAction(tags.data.id, new Tag(key, ""), tags.data) | ||||
|                 ) | ||||
|             }); | ||||
|  |  | |||
|  | @ -29,10 +29,10 @@ export class ImageUploadFlow extends Toggle { | |||
|                 key = imagePrefix + ":" + freeIndex; | ||||
|             } | ||||
|             console.log("Adding image:" + key, url); | ||||
|             State.state.changes | ||||
|            Promise.resolve(State.state.changes | ||||
|                 .applyAction(new ChangeTagAction( | ||||
|                     tags.id, new Tag(key, url), tagsSource.data | ||||
|                 )) | ||||
|                 ))) | ||||
|         }) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ export class DropDown<T> extends InputElement<T> { | |||
|         } | ||||
| 
 | ||||
|         options = options ?? {} | ||||
|         options.select_class = options.select_class ?? 'bg-indigo-100 p-1 rounded hover:bg-indigo-200 w-full' | ||||
|         options.select_class = options.select_class ?? 'bg-indigo-100 p-1 rounded hover:bg-indigo-200' | ||||
| 
 | ||||
| 
 | ||||
|         { | ||||
|  |  | |||
|  | @ -51,14 +51,14 @@ export default class DeleteWizard extends Toggle { | |||
|         const confirm = new UIEventSource<boolean>(false) | ||||
| 
 | ||||
| 
 | ||||
|         function softDelete(reason: string, tagsToApply: { k: string, v: string }[]) { | ||||
|         async function softDelete(reason: string, tagsToApply: { k: string, v: string }[]) { | ||||
|             if (reason !== undefined) { | ||||
|                 tagsToApply.splice(0, 0, { | ||||
|                     k: "fixme", | ||||
|                     v: `A mapcomplete user marked this feature to be deleted (${reason})` | ||||
|                 }) | ||||
|             } | ||||
|             (State.state?.changes ?? new Changes()) | ||||
|             await (State.state?.changes ?? new Changes()) | ||||
|                 .applyAction(new ChangeTagAction( | ||||
|                     id, new And(tagsToApply.map(kv => new Tag(kv.k, kv.v))), tagsSource.data | ||||
|                 )) | ||||
|  |  | |||
|  | @ -58,10 +58,10 @@ export default class TagRenderingQuestion extends Combine { | |||
|             console.error("MultiAnswer failed - probably not a single option was possible", configuration) | ||||
|             throw "MultiAnswer failed - probably not a single option was possible" | ||||
|         } | ||||
|         const save = () => { | ||||
|         const save = async () => { | ||||
|             const selection = inputElement.GetValue().data; | ||||
|             if (selection) { | ||||
|                 (State.state?.changes ?? new Changes()) | ||||
|                await (State.state?.changes ?? new Changes()) | ||||
|                     .applyAction(new ChangeTagAction( | ||||
|                         tags.data.id, selection, tags.data | ||||
|                     )) | ||||
|  |  | |||
|  | @ -63,6 +63,7 @@ export default class ShowDataLayer { | |||
| 
 | ||||
|         }) | ||||
| 
 | ||||
|          | ||||
|         State.state.selectedElement.addCallbackAndRunD(selected => { | ||||
|             if (self._leafletMap.data === undefined) { | ||||
|                 return; | ||||
|  | @ -76,17 +77,20 @@ export default class ShowDataLayer { | |||
|             if (leafletLayer.getPopup().isOpen()) { | ||||
|                 return; | ||||
|             } | ||||
|             if (selected.properties.id === feature.properties.id) { | ||||
|                 // A small sanity check to prevent infinite loops:
 | ||||
|                 if (selected.geometry.type === feature.geometry.type  // If a feature is rendered both as way and as point, opening one popup might trigger the other to open, which might trigger the one to open again
 | ||||
|                     && feature.id === feature.properties.id // the feature might have as id 'node/-1' and as 'feature.properties.id' = 'the newly assigned id'. That is no good too
 | ||||
|                 ) { | ||||
|                     leafletLayer.openPopup() | ||||
|                 } | ||||
|                 if (feature.id !== feature.properties.id) { | ||||
|                     console.trace("Not opening the popup for", feature) | ||||
|                 } | ||||
| 
 | ||||
|             if (selected.properties.id !== feature.properties.id) { | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             if (feature.id !== feature.properties.id) { | ||||
|                 // Probably a feature which has renamed
 | ||||
|                 console.trace("Not opening the popup for", feature) | ||||
|                 return; | ||||
|             } | ||||
|             if (selected.geometry.type === feature.geometry.type  // If a feature is rendered both as way and as point, opening one popup might trigger the other to open, which might trigger the one to open again
 | ||||
|                 && feature.id === feature.properties.id // the feature might have as id 'node/-1' and as 'feature.properties.id' = 'the newly assigned id'. That is no good too
 | ||||
|             ) { | ||||
|                 console.log("Opening popup of feature", feature) | ||||
|                 leafletLayer.openPopup() | ||||
|             } | ||||
|         }) | ||||
| 
 | ||||
|  | @ -167,8 +171,10 @@ export default class ShowDataLayer { | |||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const tagSource = feature.properties.id === undefined ? new UIEventSource<any>(feature.properties) : | ||||
|             State.state.allElements.getEventSourceById(feature.properties.id) | ||||
|         let tagSource = State.state.allElements.getEventSourceById(feature.properties.id) | ||||
|         if(tagSource === undefined){ | ||||
|            tagSource = new UIEventSource<any>(feature.properties)  | ||||
|         } | ||||
|         const clickable = !(layer.title === undefined && (layer.tagRenderings ?? []).length === 0) | ||||
|         const style = layer.GenerateLeafletStyle(tagSource, clickable); | ||||
|         const baseElement = style.icon.html; | ||||
|  |  | |||
|  | @ -1,32 +1,14 @@ | |||
| import FeatureSource, {Tiled} from "../../Logic/FeatureSource/FeatureSource"; | ||||
| import {UIEventSource} from "../../Logic/UIEventSource"; | ||||
| import {Utils} from "../../Utils"; | ||||
| import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; | ||||
| import ShowDataLayer from "./ShowDataLayer"; | ||||
| import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource"; | ||||
| import {GeoOperations} from "../../Logic/GeoOperations"; | ||||
| import {Tiles} from "../../Models/TileRange"; | ||||
| 
 | ||||
| import * as clusterstyle from "../../assets/layers/cluster_style/cluster_style.json" | ||||
| export default class ShowTileInfo { | ||||
|     public static readonly styling = new LayerConfig({ | ||||
|         id: "tileinfo_styling", | ||||
|         title: { | ||||
|             render: "Tile {z}/{x}/{y}" | ||||
|         }, | ||||
|         tagRenderings: [ | ||||
|             "all_tags" | ||||
|         ], | ||||
|         source: { | ||||
|             osmTags: "tileId~*" | ||||
|         }, | ||||
|         color: {"render": "#3c3"}, | ||||
|         width: { | ||||
|             "render": "1" | ||||
|         }, | ||||
|         label: { | ||||
|             render: "<div class='rounded-full text-xl font-bold' style='width: 2rem; height: 2rem; background: white'>{count}</div>" | ||||
|         } | ||||
|     }, "tileinfo", true) | ||||
|     public static readonly styling = new LayerConfig( | ||||
|         clusterstyle, "tileinfo", true) | ||||
| 
 | ||||
|     constructor(options: { | ||||
|         source: FeatureSource & Tiled, leafletMap: UIEventSource<any>, layer?: LayerConfig, | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ export class TileHierarchyAggregator implements FeatureSource { | |||
|     public readonly name; | ||||
| 
 | ||||
|     private readonly featuresStatic = [] | ||||
|     private readonly featureProperties: { count: number, tileId: number }; | ||||
|     private readonly featureProperties: { count: string, tileId: string, id: string }; | ||||
| 
 | ||||
|     private constructor(parent: TileHierarchyAggregator, z: number, x: number, y: number) { | ||||
|         this._parent = parent; | ||||
|  | @ -34,8 +34,9 @@ export class TileHierarchyAggregator implements FeatureSource { | |||
|         this.name = "Count(" + this._tileIndex + ")" | ||||
| 
 | ||||
|         const totals = { | ||||
|             tileId: this._tileIndex, | ||||
|             count: 0 | ||||
|             id: ""+this._tileIndex, | ||||
|             tileId: ""+this._tileIndex, | ||||
|             count: ""+0 | ||||
|         } | ||||
|         this.featureProperties = totals | ||||
| 
 | ||||
|  | @ -106,7 +107,7 @@ export class TileHierarchyAggregator implements FeatureSource { | |||
|         if (total === 0) { | ||||
|             this.features.setData(TileHierarchyAggregator.empty) | ||||
|         } else { | ||||
|             this.featureProperties.count = total; | ||||
|             this.featureProperties.count = "" + total; | ||||
|             this.features.data = this.featuresStatic | ||||
|             this.features.ping() | ||||
|         } | ||||
|  | @ -145,7 +146,6 @@ export class TileHierarchyAggregator implements FeatureSource { | |||
|         return new TileHierarchyAggregator(undefined, 0, 0, 0) | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private visitSubTiles(f : (aggr: TileHierarchyAggregator) => boolean){ | ||||
|         const visitFurther = f(this) | ||||
|         if(visitFurther){ | ||||
|  | @ -153,8 +153,9 @@ export class TileHierarchyAggregator implements FeatureSource { | |||
|         } | ||||
|     } | ||||
|      | ||||
|     getCountsForZoom(locationControl: UIEventSource<{ zoom : number }>, cutoff: number) : FeatureSource{ | ||||
|     getCountsForZoom(locationControl: UIEventSource<{ zoom : number }>, cutoff: number = 0) : FeatureSource{ | ||||
|         const self = this | ||||
|          | ||||
|         return new StaticFeatureSource( | ||||
|             locationControl.map(loc => { | ||||
|                 const features = [] | ||||
|  | @ -205,9 +206,11 @@ class SingleTileCounter implements Tiled { | |||
|         const self = this | ||||
| 
 | ||||
|         source.features.map(f => { | ||||
|             self.countsPerLayer.data.set(layer.id, f.length) | ||||
|             const isDisplayed = source.layer.isDisplayed.data | ||||
|             self.countsPerLayer.data.set(layer.id, isDisplayed ? f.length : 0) | ||||
|             self.countsPerLayer.ping() | ||||
|         }) | ||||
|         }, [source.layer.isDisplayed]) | ||||
|          | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue