Search: refactoring searching for themes, refactor allThemesGui, incidentally fix #1679

This commit is contained in:
Pieter Vander Vennet 2024-09-05 02:25:03 +02:00
parent 9b8c300e77
commit d90b6d82d0
18 changed files with 421 additions and 334 deletions

View file

@ -7,11 +7,9 @@ import Constants from "../../Models/Constants"
export default class FilterSearch implements GeocodingProvider {
private readonly _state: SpecialVisualizationState
private readonly suggestions
constructor(state: SpecialVisualizationState) {
this._state = state
this.suggestions = this.getSuggestions()
}
async search(query: string): Promise<SearchResult[]> {
@ -58,7 +56,6 @@ export default class FilterSearch implements GeocodingProvider {
Utils.NoNullInplace(terms)
const distances = queries.flatMap(query => terms.map(entry => {
const d = Utils.levenshteinDistance(query, entry.slice(0, query.length))
console.log(query, "? +", terms, "=", d)
const dRelative = d / query.length
return dRelative
}))
@ -79,10 +76,10 @@ export default class FilterSearch implements GeocodingProvider {
}
/**
* Create a random list of filters
*/
getSuggestions(): FilterPayload[] {
if (this.suggestions) {
// return this.suggestions
}
const result: FilterPayload[] = []
for (const [id, filteredLayer] of this._state.layerState.filteredLayers) {
if (!Array.isArray(filteredLayer.layerDef.filters)) {

View file

@ -13,7 +13,6 @@ export class RecentSearch {
constructor(state: { layout: LayoutConfig, osmConnection: OsmConnection, selectedElement: Store<Feature> }) {
const prefs = state.osmConnection.preferencesHandler.GetLongPreference("previous-searches")
prefs.set(null)
this._seenThisSession = new UIEventSource<GeocodeResult[]>([])//UIEventSource.asObject<GeoCodeResult[]>(prefs, [])
this.seenThisSession = this._seenThisSession

View file

@ -1,8 +1,7 @@
import GeocodingProvider, { SearchResult, GeocodingOptions } from "./GeocodingProvider"
import GeocodingProvider, { GeocodingOptions, SearchResult } from "./GeocodingProvider"
import * as themeOverview from "../../assets/generated/theme_overview.json"
import { MinimalLayoutInformation } from "../../Models/ThemeConfig/LayoutConfig"
import { SpecialVisualizationState } from "../../UI/SpecialVisualization"
import { Utils } from "../../Utils"
import MoreScreen from "../../UI/BigComponents/MoreScreen"
import { ImmutableStore, Store } from "../UIEventSource"
@ -12,11 +11,16 @@ export default class ThemeSearch implements GeocodingProvider {
private readonly _state: SpecialVisualizationState
private readonly _knownHiddenThemes: Store<Set<string>>
private readonly _suggestionLimit: number
private readonly _layersToIgnore: string[]
private readonly _otherThemes: MinimalLayoutInformation[]
constructor(state: SpecialVisualizationState, suggestionLimit: number) {
this._state = state
this._layersToIgnore = state.layout.layers.map(l => l.id)
this._suggestionLimit = suggestionLimit
this._knownHiddenThemes = MoreScreen.knownHiddenThemes(this._state.osmConnection)
this._otherThemes = MoreScreen.officialThemes.themes
.filter(th => th.id !== state.layout.id)
}
async search(query: string): Promise<SearchResult[]> {
@ -40,11 +44,11 @@ export default class ThemeSearch implements GeocodingProvider {
if (query.length < 1) {
return []
}
query = Utils.simplifyStringForSearch(query)
return ThemeSearch.allThemes
const sorted = MoreScreen.sortedByLowest(query, this._otherThemes, this._layersToIgnore)
console.log(">>>", sorted)
return sorted
.map(th => th.theme)
.filter(th => !th.hideFromOverview || this._knownHiddenThemes.data.has(th.id))
.filter(th => th.id !== this._state.layout.id)
.filter(th => MoreScreen.MatchesLayout(th, query))
.slice(0, limit)
}

View file

@ -154,7 +154,7 @@ export default class SearchState {
const poi = result[0]
if (poi.category === "theme") {
const theme = <MinimalLayoutInformation>poi.payload
const url = MoreScreen.createUrlFor(theme, false)
const url = MoreScreen.createUrlFor(theme)
window.location = <any>url
return true
}

View file

@ -1,4 +1,4 @@
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"
import LayoutConfig, { MinimalLayoutInformation } from "../../Models/ThemeConfig/LayoutConfig"
import { OsmConnection } from "../Osm/OsmConnection"
import { MangroveIdentity } from "../Web/MangroveReviews"
import { Store, Stores, UIEventSource } from "../UIEventSource"
@ -141,8 +141,9 @@ export default class UserRelatedState {
this._recentlyVisitedThemes = UIEventSource.asObject(prefs.GetLongPreference("recently-visited-themes"), [])
this.recentlyVisitedThemes = this._recentlyVisitedThemes
if (layout) {
const osmConn =this.osmConnection
const osmConn = this.osmConnection
const recentlyVisited = this._recentlyVisitedThemes
function update() {
if (!osmConn.isLoggedIn.data) {
return
@ -203,16 +204,7 @@ export default class UserRelatedState {
}
}
public GetUnofficialTheme(id: string):
| {
id: string
icon: string
title: any
shortDescription: any
definition?: any
isOfficial: boolean
}
| undefined {
public getUnofficialTheme(id: string): (MinimalLayoutInformation & { definition }) | undefined {
const pref = this.osmConnection.GetLongPreference("unofficial-theme-" + id)
const str = pref.data
@ -222,16 +214,7 @@ export default class UserRelatedState {
}
try {
const value: {
id: string
icon: string
title: any
shortDescription: any
definition?: any
isOfficial: boolean
} = JSON.parse(str)
value.isOfficial = false
return value
return <MinimalLayoutInformation & { definition: string }>JSON.parse(str)
} catch (e) {
console.warn(
"Removing theme " +
@ -464,7 +447,7 @@ export default class UserRelatedState {
}
if (tags[key + "-combined-0"]) {
// A combined value exists
if(tags[key].startsWith("undefined")){
if (tags[key].startsWith("undefined")) {
// Sometimes, a long string of 'undefined' will show up, we ignore them
continue
}