From 961e4e59c78ca3d027f6cfffdcbc1b72b1acae4d Mon Sep 17 00:00:00 2001 From: Brian Savage Date: Sun, 25 Oct 2026 11:07:41 -0400 Subject: [PATCH 1/3] Only update searchResults if most recent search --- src/components/AppMap.ts | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/components/AppMap.ts b/src/components/AppMap.ts index 9d71532..f5c2682 100644 --- a/src/components/AppMap.ts +++ b/src/components/AppMap.ts @@ -236,7 +236,7 @@ export default defineComponent({ markerGroups: new Map(), - searchThrottler: ui.late<() => void>(), + searchThrottler: ui.late<(id: number) => void>(), searchResultMarkers: [] as MapMarkers.MapMarkerSearchResult[], hardModeExcludeSet: ui.late(), @@ -280,6 +280,7 @@ export default defineComponent({ searchPresets: SEARCH_PRESETS, searchExcludedSets: [] as SearchExcludeSet[], MAX_SEARCH_RESULT_COUNT: 2000, + searchID: 0, shownAreaMap: '', areaWhitelist: '', @@ -321,7 +322,7 @@ export default defineComponent({ if (this.$route.query.q) { this.searchQuery = this.$route.query.q.toString(); - this.search(); + this.searchOnInput(); this.switchPane('spane-search'); } @@ -1023,7 +1024,7 @@ export default defineComponent({ }, initSearch() { - this.searchThrottler = debounce(() => this.search(), 200); + this.searchThrottler = debounce((id: number) => this.search(id), 200); this.map.registerZoomCb(() => { for (const group of this.searchGroups) @@ -1045,7 +1046,8 @@ export default defineComponent({ searchOnInput() { this.searching = true; - this.searchThrottler(); + this.searchID += 1 + this.searchThrottler(this.searchID); }, searchSetLink() { @@ -1061,13 +1063,13 @@ export default defineComponent({ searchOnAdd() { this.searchAddGroup(this.searchGetQuery()); this.searchQuery = ''; - this.search(); + this.searchOnInput(); }, searchOnExclude() { this.searchAddExcludedSet(this.searchGetQuery()); this.searchQuery = ''; - this.search(); + this.searchOnInput(); }, async searchAddExcludedSet(query: string, label?: string): Promise { @@ -1100,7 +1102,7 @@ export default defineComponent({ searchViewGroup(idx: number) { const group = this.searchGroups[idx]; this.searchQuery = group.query; - this.search(); + this.searchOnInput(); }, searchRemoveGroup(idx: number) { @@ -1115,20 +1117,33 @@ export default defineComponent({ group.update(SearchResultUpdateMode.UpdateVisibility, this.searchExcludedSets); }, - async search(): Promise { + async search(time: number): Promise { this.searching = true; this.searchResultMarkers.forEach(m => m.getMarker().remove()); this.searchResultMarkers = []; + let searchResults: ObjectMinData[] = [] + let searchLastSearchFailed = false; + const query = this.searchGetQuery(); + // Async - start interuptable try { - this.searchResults = await MapMgr.getInstance().getObjs(this.settings.mapType, this.settings.mapName, query, false, this.MAX_SEARCH_RESULT_COUNT); - this.searchLastSearchFailed = false; + if(query.trim().length) { + searchResults = await MapMgr.getInstance().getObjs(this.settings.mapType, this.settings.mapName, query, false, this.MAX_SEARCH_RESULT_COUNT); + searchLastSearchFailed = false; + } } catch (e) { - this.searchResults = []; - this.searchLastSearchFailed = true; + searchResults = []; + searchLastSearchFailed = true; + } + // Async - end interuptable (this.searchID may changed during async work) + if(time != this.searchID) { + // If the search input was updated during network activity, discard the results + return } + this.searchResults = [...searchResults]; + this.searchLastSearchFailed = searchLastSearchFailed; for (const result of this.searchResults) { const marker = new MapMarkers.MapMarkerSearchResult(this.map, result); this.searchResultMarkers.push(marker); From 357890473e960aa296b3772e4ad0efa654d57993 Mon Sep 17 00:00:00 2001 From: Brian Savage Date: Sun, 25 Oct 2026 11:14:09 -0400 Subject: [PATCH 2/3] Rename time to searchID --- src/components/AppMap.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/AppMap.ts b/src/components/AppMap.ts index f5c2682..4216811 100644 --- a/src/components/AppMap.ts +++ b/src/components/AppMap.ts @@ -1117,7 +1117,7 @@ export default defineComponent({ group.update(SearchResultUpdateMode.UpdateVisibility, this.searchExcludedSets); }, - async search(time: number): Promise { + async search(searchID: number): Promise { this.searching = true; this.searchResultMarkers.forEach(m => m.getMarker().remove()); this.searchResultMarkers = []; @@ -1137,7 +1137,7 @@ export default defineComponent({ searchLastSearchFailed = true; } // Async - end interuptable (this.searchID may changed during async work) - if(time != this.searchID) { + if(searchID != this.searchID) { // If the search input was updated during network activity, discard the results return } From f5af575d0d91a432bf73f9d7d39070621cdabd81 Mon Sep 17 00:00:00 2001 From: Brian Savage Date: Sun, 25 Oct 2026 19:52:41 -0400 Subject: [PATCH 3/3] Use this.searchQuery as the sentinel, not searchID --- src/components/AppMap.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/components/AppMap.ts b/src/components/AppMap.ts index 4216811..f36856f 100644 --- a/src/components/AppMap.ts +++ b/src/components/AppMap.ts @@ -236,7 +236,7 @@ export default defineComponent({ markerGroups: new Map(), - searchThrottler: ui.late<(id: number) => void>(), + searchThrottler: ui.late<(id: string) => void>(), searchResultMarkers: [] as MapMarkers.MapMarkerSearchResult[], hardModeExcludeSet: ui.late(), @@ -280,7 +280,6 @@ export default defineComponent({ searchPresets: SEARCH_PRESETS, searchExcludedSets: [] as SearchExcludeSet[], MAX_SEARCH_RESULT_COUNT: 2000, - searchID: 0, shownAreaMap: '', areaWhitelist: '', @@ -1024,7 +1023,7 @@ export default defineComponent({ }, initSearch() { - this.searchThrottler = debounce((id: number) => this.search(id), 200); + this.searchThrottler = debounce((query: string) => this.search(query), 200); this.map.registerZoomCb(() => { for (const group of this.searchGroups) @@ -1046,8 +1045,7 @@ export default defineComponent({ searchOnInput() { this.searching = true; - this.searchID += 1 - this.searchThrottler(this.searchID); + this.searchThrottler(this.searchQuery); }, searchSetLink() { @@ -1117,7 +1115,7 @@ export default defineComponent({ group.update(SearchResultUpdateMode.UpdateVisibility, this.searchExcludedSets); }, - async search(searchID: number): Promise { + async search(searchQuery: string): Promise { this.searching = true; this.searchResultMarkers.forEach(m => m.getMarker().remove()); this.searchResultMarkers = []; @@ -1136,8 +1134,8 @@ export default defineComponent({ searchResults = []; searchLastSearchFailed = true; } - // Async - end interuptable (this.searchID may changed during async work) - if(searchID != this.searchID) { + // Async - end interuptable (this.searchQuery may changed during async work) + if(searchQuery != this.searchQuery) { // If the search input was updated during network activity, discard the results return }