forked from MapComplete/MapComplete
		
	Search: refactoring searching for themes, refactor allThemesGui, incidentally fix #1679
This commit is contained in:
		
							parent
							
								
									9b8c300e77
								
							
						
					
					
						commit
						d90b6d82d0
					
				
					 18 changed files with 421 additions and 334 deletions
				
			
		|  | @ -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)) { | ||||
|  |  | |||
|  | @ -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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
|             } | ||||
|  |  | |||
|  | @ -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 | ||||
|                     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue