From 19632ecfbbb454bf6a64e06f13745d62c7353ec8 Mon Sep 17 00:00:00 2001 From: Osama Sayegh Date: Mon, 23 Aug 2021 21:03:52 +0300 Subject: [PATCH] FIX: Discard old search results if search term changes when moving posts to a different topic (#14117) This also fixes an incorrect usage of `debounce`. Meta topic: https://meta.discourse.org/t/odd-search-behaviour-when-moving-messages-as-a-staff-member/201261?u=osama. --- .../discourse/app/components/choose-topic.js | 83 ++++++++++--------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/choose-topic.js b/app/assets/javascripts/discourse/app/components/choose-topic.js index d7d164d9863..6454ae049af 100644 --- a/app/assets/javascripts/discourse/app/components/choose-topic.js +++ b/app/assets/javascripts/discourse/app/components/choose-topic.js @@ -4,6 +4,7 @@ import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import { next, schedule } from "@ember/runloop"; import { searchForTerm } from "discourse/lib/search"; +import { INPUT_DELAY } from "discourse-common/config/environment"; export default Component.extend({ loading: null, @@ -68,7 +69,7 @@ export default Component.extend({ oldTopicTitle: this.topicTitle, }); - this.search(this.topicTitle); + this.searchDebounced(this.topicTitle); }, @discourseComputed("label") @@ -85,48 +86,48 @@ export default Component.extend({ this.set("loading", false); }, + searchDebounced(title) { + discourseDebounce(this, this.search, title, INPUT_DELAY); + }, + search(title) { - discourseDebounce( - this, - function () { - if (!this.element || this.isDestroying || this.isDestroyed) { - return; + if (!this.element || this.isDestroying || this.isDestroyed) { + return; + } + + if (isEmpty(title) && isEmpty(this.additionalFilters)) { + this.setProperties({ topics: null, loading: false }); + return; + } + + const currentTopicId = this.currentTopicId; + const titleWithFilters = `${title} ${this.additionalFilters}`; + let searchParams = {}; + + if (!isEmpty(title)) { + searchParams.typeFilter = "topic"; + searchParams.restrictToArchetype = "regular"; + searchParams.searchForId = true; + } + + searchForTerm(titleWithFilters, searchParams).then((results) => { + // search term changed after the request was fired but before we + // got a response, ignore results. + if (title !== this.topicTitle) { + return; + } + if (results && results.posts && results.posts.length > 0) { + this.set( + "topics", + results.posts.mapBy("topic").filter((t) => t.id !== currentTopicId) + ); + if (this.topics.length === 1) { + this.send("chooseTopic", this.topics[0]); } - - if (isEmpty(title) && isEmpty(this.additionalFilters)) { - this.setProperties({ topics: null, loading: false }); - return; - } - - const currentTopicId = this.currentTopicId; - const titleWithFilters = `${title} ${this.additionalFilters}`; - let searchParams = {}; - - if (!isEmpty(title)) { - searchParams.typeFilter = "topic"; - searchParams.restrictToArchetype = "regular"; - searchParams.searchForId = true; - } - - searchForTerm(titleWithFilters, searchParams).then((results) => { - if (results && results.posts && results.posts.length > 0) { - this.set( - "topics", - results.posts - .mapBy("topic") - .filter((t) => t.id !== currentTopicId) - ); - if (this.topics.length === 1) { - this.send("chooseTopic", this.topics[0]); - } - } else { - this.setProperties({ topics: null, loading: false }); - } - }); - }, - title, - 300 - ); + } else { + this.setProperties({ topics: null, loading: false }); + } + }); }, actions: {