WebUI: Add ability to refresh search

WebUI equivalent of #22122. Refreshing maintains all existing filters.

PR #22805.
This commit is contained in:
Thomas Piccirello 2025-06-06 02:32:47 -07:00 committed by GitHub
parent 526abdf7ce
commit 5dfb51a8d2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 67 additions and 0 deletions

View file

@ -90,6 +90,7 @@ window.qBittorrent.Search ??= (() => {
targets: ".searchTab", targets: ".searchTab",
menu: "searchResultsTabsMenu", menu: "searchResultsTabsMenu",
actions: { actions: {
refreshTab: (tab) => { refreshSearch(tab); },
closeTab: (tab) => { closeSearchTab(tab); }, closeTab: (tab) => { closeSearchTab(tab); },
closeAllTabs: () => { closeAllTabs: () => {
for (const tab of document.querySelectorAll("#searchTabs .searchTab")) for (const tab of document.querySelectorAll("#searchTabs .searchTab"))
@ -233,6 +234,41 @@ window.qBittorrent.Search ??= (() => {
updateSearchResultsData(searchId); 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 closeSearchTab = (el) => {
const tab = el.closest("li.searchTab"); const tab = el.closest("li.searchTab");
if (!tab) 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) => { const stopSearch = (searchId) => {
fetch("api/v2/search/stop", { fetch("api/v2/search/stop", {
method: "POST", method: "POST",

View file

@ -215,6 +215,7 @@
</li> </li>
</ul> </ul>
<ul id="searchResultsTabsMenu" class="contextMenu"> <ul id="searchResultsTabsMenu" class="contextMenu">
<li><a href="#refreshTab">QBT_TR(Refresh tab)QBT_TR[CONTEXT=SearchJobWidget]</a></li>
<li><a href="#closeTab">QBT_TR(Close tab)QBT_TR[CONTEXT=SearchJobWidget]</a></li> <li><a href="#closeTab">QBT_TR(Close tab)QBT_TR[CONTEXT=SearchJobWidget]</a></li>
<li><a href="#closeAllTabs">QBT_TR(Close all tabs)QBT_TR[CONTEXT=SearchJobWidget]</a></li> <li><a href="#closeAllTabs">QBT_TR(Close all tabs)QBT_TR[CONTEXT=SearchJobWidget]</a></li>
</ul> </ul>