forked from MapComplete/MapComplete
Feature(geocoding): pressing enter will now zoom to the first search result; refactor away type synonym
This commit is contained in:
parent
9e8aaab086
commit
686ad70511
8 changed files with 64 additions and 49 deletions
|
@ -1,4 +1,4 @@
|
|||
import GeocodingProvider, { type SearchResult } from "../Search/GeocodingProvider"
|
||||
import GeocodingProvider, { GeocodeResult, GeocodingUtils } from "../Search/GeocodingProvider"
|
||||
import { ImmutableStore, Store, Stores, UIEventSource } from "../UIEventSource"
|
||||
import CombinedSearcher from "../Search/CombinedSearcher"
|
||||
import FilterSearch, { FilterSearchResult } from "../Search/FilterSearch"
|
||||
|
@ -16,12 +16,13 @@ import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
|
|||
import { FeatureSource } from "../FeatureSource/FeatureSource"
|
||||
import { Feature } from "geojson"
|
||||
import OpenLocationCodeSearch from "../Search/OpenLocationCodeSearch"
|
||||
import { BBox } from "../BBox"
|
||||
|
||||
export default class SearchState {
|
||||
public readonly feedback: UIEventSource<Translation> = new UIEventSource<Translation>(undefined)
|
||||
public readonly searchTerm: UIEventSource<string> = new UIEventSource<string>("")
|
||||
public readonly searchIsFocused = new UIEventSource(false)
|
||||
public readonly suggestions: Store<SearchResult[]>
|
||||
public readonly suggestions: Store<GeocodeResult[]>
|
||||
public readonly filterSuggestions: Store<FilterSearchResult[]>
|
||||
public readonly themeSuggestions: Store<MinimalThemeInformation[]>
|
||||
public readonly layerSuggestions: Store<LayerConfig[]>
|
||||
|
@ -60,7 +61,7 @@ export default class SearchState {
|
|||
return new ImmutableStore(true)
|
||||
}
|
||||
return Stores.concat(suggestions).map((suggestions) =>
|
||||
suggestions.some((list, i) => list === undefined)
|
||||
suggestions.some(list => list === undefined)
|
||||
)
|
||||
})
|
||||
this.suggestions = suggestionsList.bindD((suggestions) =>
|
||||
|
@ -100,7 +101,7 @@ export default class SearchState {
|
|||
|
||||
this.showSearchDrawer = new UIEventSource(false)
|
||||
|
||||
this.searchIsFocused.addCallbackAndRunD((sugg) => {
|
||||
this.searchIsFocused.addCallbackAndRunD(sugg => {
|
||||
if (sugg) {
|
||||
this.showSearchDrawer.set(true)
|
||||
}
|
||||
|
@ -124,7 +125,6 @@ export default class SearchState {
|
|||
const state = this.state
|
||||
|
||||
const layersToShow = payload.map((fsr) => fsr.layer.id)
|
||||
console.log("Layers to show are", layersToShow)
|
||||
for (const otherLayer of state.layerState.filteredLayers.values()) {
|
||||
const layer = otherLayer.layerDef
|
||||
if (!layer.isNormal()) {
|
||||
|
@ -167,4 +167,45 @@ export default class SearchState {
|
|||
this.state.featureProperties.trackFeature(f)
|
||||
this.state.selectedElement.set(f)
|
||||
}
|
||||
|
||||
public moveToBestMatch() {
|
||||
const suggestion = this.suggestions.data?.[0]
|
||||
if (suggestion) {
|
||||
this.applyGeocodeResult(suggestion)
|
||||
}
|
||||
if (this.suggestionsSearchRunning.data) {
|
||||
this.suggestionsSearchRunning.addCallback(() => {
|
||||
this.applyGeocodeResult(this.suggestions.data?.[0])
|
||||
return true // unregister
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
applyGeocodeResult(entry: GeocodeResult) {
|
||||
if (!entry) {
|
||||
console.error("ApplyGeocodeResult got undefined/null")
|
||||
}
|
||||
console.log("Moving to", entry.description)
|
||||
const state = this.state
|
||||
if (entry.boundingbox) {
|
||||
const [lat0, lat1, lon0, lon1] = entry.boundingbox
|
||||
state.mapProperties.bounds.set(
|
||||
new BBox([
|
||||
[lon0, lat0],
|
||||
[lon1, lat1]
|
||||
]).pad(0.01)
|
||||
)
|
||||
} else {
|
||||
state.mapProperties.flyTo(
|
||||
entry.lon,
|
||||
entry.lat,
|
||||
GeocodingUtils.categoryToZoomLevel[entry.category] ?? 17
|
||||
)
|
||||
}
|
||||
if (entry.feature?.properties?.id) {
|
||||
state.selectedElement.set(entry.feature)
|
||||
}
|
||||
state.userRelatedState.recentlyVisitedSearch.add(entry)
|
||||
this.closeIfFullscreen()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue