From 5dfb51a8d27e391f21ae99b1da91bdd08baaebce Mon Sep 17 00:00:00 2001 From: Thomas Piccirello <8296030+Piccirello@users.noreply.github.com> Date: Fri, 6 Jun 2025 02:32:47 -0700 Subject: [PATCH] WebUI: Add ability to refresh search WebUI equivalent of #22122. Refreshing maintains all existing filters. PR #22805. --- src/webui/www/private/scripts/search.js | 66 +++++++++++++++++++++++++ src/webui/www/private/views/search.html | 1 + 2 files changed, 67 insertions(+) diff --git a/src/webui/www/private/scripts/search.js b/src/webui/www/private/scripts/search.js index ce3edf6cd..bff6030eb 100644 --- a/src/webui/www/private/scripts/search.js +++ b/src/webui/www/private/scripts/search.js @@ -90,6 +90,7 @@ window.qBittorrent.Search ??= (() => { targets: ".searchTab", menu: "searchResultsTabsMenu", actions: { + refreshTab: (tab) => { refreshSearch(tab); }, closeTab: (tab) => { closeSearchTab(tab); }, closeAllTabs: () => { for (const tab of document.querySelectorAll("#searchTabs .searchTab")) @@ -233,6 +234,41 @@ window.qBittorrent.Search ??= (() => { updateSearchResultsData(searchId); }; + const refreshSearchTab = (oldSearchId, searchId, pattern) => { + fetch("api/v2/search/delete", { + method: "POST", + body: new URLSearchParams({ + id: oldSearchId + }) + }); + + const searchJobs = JSON.parse(LocalPreferences.get("search_jobs", "[]")); + const jobIndex = searchJobs.findIndex((job) => job.id === oldSearchId); + if (jobIndex >= 0) { + searchJobs[jobIndex].id = searchId; + LocalPreferences.set("search_jobs", JSON.stringify(searchJobs)); + } + + // update existing tab w/ new search id + const tab = document.getElementById(`${searchTabIdPrefix}${oldSearchId}`); + tab.id = `${searchTabIdPrefix}${searchId}`; + + updateStatusIconElement(searchId, "QBT_TR(Searching...)QBT_TR[CONTEXT=SearchJobWidget]", "images/queued.svg"); + + // copy over relevant state + const state = searchState.get(oldSearchId); + state.rows = []; + state.rowId = 0; + state.selectedRowIds = []; + state.running = true; + state.loadResultsTimer = -1; + searchState.set(searchId, state); + searchState.delete(oldSearchId); + + searchResultsTable.clear(); + updateSearchResultsData(searchId); + }; + const closeSearchTab = (el) => { const tab = el.closest("li.searchTab"); if (!tab) @@ -421,6 +457,36 @@ window.qBittorrent.Search ??= (() => { }); }; + const refreshSearch = (el) => { + const tab = el.closest("li.searchTab"); + if (!tab) + return; + + const oldSearchId = getSearchIdFromTab(tab); + const state = searchState.get(oldSearchId); + const pattern = state.searchPattern; + + searchPatternChanged = false; + fetch("api/v2/search/start", { + method: "POST", + body: new URLSearchParams({ + pattern: state.searchPattern, + category: document.getElementById("categorySelect").value, + plugins: document.getElementById("pluginsSelect").value + }) + }) + .then(async (response) => { + if (!response.ok) + return; + + const responseJSON = await response.json(); + + document.getElementById("startSearchButton").lastChild.textContent = "QBT_TR(Stop)QBT_TR[CONTEXT=SearchEngineWidget]"; + const searchId = responseJSON.id; + refreshSearchTab(oldSearchId, searchId, pattern); + }); + }; + const stopSearch = (searchId) => { fetch("api/v2/search/stop", { method: "POST", diff --git a/src/webui/www/private/views/search.html b/src/webui/www/private/views/search.html index 187586c90..1a4800e0d 100644 --- a/src/webui/www/private/views/search.html +++ b/src/webui/www/private/views/search.html @@ -215,6 +215,7 @@