From 432590f8d9f535d0cf42eb2e4f45c8ec159e89b4 Mon Sep 17 00:00:00 2001 From: Keegan George Date: Tue, 21 Nov 2023 16:51:08 -0800 Subject: [PATCH] DEV: Run AI search before submit if query params present (#303) --- .../semantic-search.gjs | 150 +++++++++--------- 1 file changed, 79 insertions(+), 71 deletions(-) diff --git a/assets/javascripts/discourse/connectors/full-page-search-below-search-header/semantic-search.gjs b/assets/javascripts/discourse/connectors/full-page-search-below-search-header/semantic-search.gjs index b4787004..db7ebccd 100644 --- a/assets/javascripts/discourse/connectors/full-page-search-below-search-header/semantic-search.gjs +++ b/assets/javascripts/discourse/connectors/full-page-search-below-search-header/semantic-search.gjs @@ -1,59 +1,19 @@ import Component from "@glimmer/component"; -import { action } from "@ember/object"; -import I18n from "I18n"; import { tracked } from "@glimmer/tracking"; -import { ajax } from "discourse/lib/ajax"; -import { isValidSearchTerm, translateResults } from "discourse/lib/search"; -import discourseDebounce from "discourse-common/lib/debounce"; -import { inject as service } from "@ember/service"; -import { bind } from "discourse-common/utils/decorators"; -import { SEARCH_TYPE_DEFAULT } from "discourse/controllers/full-page-search"; -import DToggleSwitch from "discourse/components/d-toggle-switch"; import { on } from "@ember/modifier"; +import { action } from "@ember/object"; import didInsert from "@ember/render-modifiers/modifiers/did-insert"; -import willDestroy from "@ember/render-modifiers/modifiers/will-destroy"; -import icon from "discourse-common/helpers/d-icon"; +import { inject as service } from "@ember/service"; +import DToggleSwitch from "discourse/components/d-toggle-switch"; +import { SEARCH_TYPE_DEFAULT } from "discourse/controllers/full-page-search"; +import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { withPluginApi } from "discourse/lib/plugin-api"; +import { isValidSearchTerm, translateResults } from "discourse/lib/search"; +import icon from "discourse-common/helpers/d-icon"; +import I18n from "I18n"; export default class SemanticSearch extends Component { - - static shouldRender(_args, { siteSettings }) { return siteSettings.ai_embeddings_semantic_search_enabled; } @@ -64,6 +24,7 @@ export default class SemanticSearch extends Component { @tracked searching = false; @tracked AIResults = []; @tracked showingAIResults = false; + initialSearchTerm = this.args.outletArgs.search; get disableToggleSwitch() { if (this.searching || this.AIResults.length === 0) { @@ -100,6 +61,11 @@ export default class SemanticSearch extends Component { } get searchTerm() { + if (this.initialSearchTerm !== this.args.outletArgs.search) { + this.initialSearchTerm = undefined; + this.resetAIResults(); + } + return this.args.outletArgs.search; } @@ -127,36 +93,78 @@ export default class SemanticSearch extends Component { } @action - performHyDESearch() { + handleSearch() { if (!this.searchEnabled) { return; } + if (this.initialSearchTerm) { + return this.performHyDESearch(); + } + withPluginApi("1.15.0", (api) => { api.onAppEvent("full-page-search:trigger-search", () => { - this.searching = true; - this.resetAIResults(); - - ajax("/discourse-ai/embeddings/semantic-search", { - data: { q: this.searchTerm }, - }) - .then(async (results) => { - const model = (await translateResults(results)) || {}; - - if (model.posts?.length === 0) { - this.searching = false; - return; - } - - model.posts.forEach((post) => { - post.generatedByAI = true; - }); - - this.AIResults = model.posts; - }) - .catch(popupAjaxError) - .finally(() => (this.searching = false)); + return this.performHyDESearch(); }); }); } + + performHyDESearch() { + this.searching = true; + this.resetAIResults(); + + ajax("/discourse-ai/embeddings/semantic-search", { + data: { q: this.searchTerm }, + }) + .then(async (results) => { + const model = (await translateResults(results)) || {}; + + if (model.posts?.length === 0) { + this.searching = false; + return; + } + + model.posts.forEach((post) => { + post.generatedByAI = true; + }); + + this.AIResults = model.posts; + }) + .catch(popupAjaxError) + .finally(() => (this.searching = false)); + } + + }