Search: load the popup of the OSM-object when clicked on the map, also when zoomed out

This commit is contained in:
Pieter Vander Vennet 2024-10-11 00:15:56 +02:00
parent a9d6aaa448
commit 48dc03b1e6
2 changed files with 34 additions and 7 deletions

View file

@ -2,14 +2,14 @@ import { Store, UIEventSource } from "../../UIEventSource"
import { FeatureSource, IndexedFeatureSource, UpdatableFeatureSource } from "../FeatureSource"
import { Feature } from "geojson"
import { Utils } from "../../../Utils"
import { OsmFeature } from "../../../Models/OsmFeature"
/**
* The featureSourceMerger receives complete geometries from various sources.
* If multiple sources contain the same object (as determined by 'id'), only one copy of them is retained
*/
export default class FeatureSourceMerger<Src extends FeatureSource = FeatureSource>
implements IndexedFeatureSource
{
implements IndexedFeatureSource {
public features: UIEventSource<Feature[]> = new UIEventSource([])
public readonly featuresById: Store<Map<string, Feature>>
protected readonly _featuresById: UIEventSource<Map<string, Feature>>
@ -50,6 +50,24 @@ export default class FeatureSourceMerger<Src extends FeatureSource = FeatureSour
this.addData(sources.map((s) => s.features.data))
}
/**
* Add the given feature if it isn't in the dictionary yet.
* Returns 'true' if this was a previously unseen item.
* If the item was already present, nothing will happen
*/
public addItem(f: OsmFeature): boolean {
const id = f.properties.id
const all = this._featuresById.data
if (!all.has(id)) {
all.set(id, f)
this._featuresById.ping()
this.features.data.push(f)
this.features.ping()
return true
}
}
protected addData(sources: Feature[][]) {
sources = Utils.NoNull(sources)
let somethingChanged = false
@ -100,14 +118,14 @@ export default class FeatureSourceMerger<Src extends FeatureSource = FeatureSour
}
export class UpdatableFeatureSourceMerger<
Src extends UpdatableFeatureSource = UpdatableFeatureSource
>
Src extends UpdatableFeatureSource = UpdatableFeatureSource
>
extends FeatureSourceMerger<Src>
implements IndexedFeatureSource, UpdatableFeatureSource
{
implements IndexedFeatureSource, UpdatableFeatureSource {
constructor(...sources: Src[]) {
super(...sources)
}
async updateAsync() {
await Promise.all(this._sources.map((src) => src.updateAsync()))
}

View file

@ -135,12 +135,21 @@ export default class SearchState {
}
}
clickedOnMap(feature: Feature) {
async clickedOnMap(feature: Feature) {
const osmid = feature.properties.osm_id
const localElement = this.state.indexedFeatures.featuresById.data.get(osmid)
if (localElement) {
this.state.selectedElement.set(localElement)
return
}
// This feature might not be loaded because we zoomed out
const object = await this.state.osmObjectDownloader.DownloadObjectAsync(osmid)
if(object === "deleted"){
return
}
const f = object.asGeoJson()
this.state.indexedFeatures.addItem(f)
this.state.featureProperties.trackFeature(f)
this.state.selectedElement.set(f)
}
}