Align search experience with settings

This commit is contained in:
2026-07-04 17:09:12 +08:00
parent f3e04b6598
commit 6ff2d15c5a
8 changed files with 555 additions and 139 deletions
+3
View File
@@ -49,6 +49,9 @@
} else {
url.searchParams.delete("aksrt_category");
}
if (url.searchParams.get("aksrt_search_type") && url.searchParams.get("aksrt_search_type") !== "post") {
url.searchParams.delete("aksrt_category");
}
url.searchParams.delete("paged");
window.location.href = url.toString();
});
+66 -44
View File
@@ -5,8 +5,6 @@
"use strict";
function initSearchPanel() {
var btn = document.getElementById("search-toggle");
var panel = document.getElementById("nav-search-panel");
var mobileOverlay = document.getElementById("tabbar-search-overlay");
var mobileInput = document.getElementById("tabbar-search-input");
var mobileClose = document.getElementById("tabbar-search-close");
@@ -18,7 +16,8 @@
var historyClear = document.getElementById("tabbar-search-history-clear");
var suggestionsWrap = document.getElementById("tabbar-search-suggestions");
var suggestionsSection = document.getElementById("tabbar-search-suggestions-section");
if (!btn || !panel) return;
var searchForms = Array.prototype.slice.call(document.querySelectorAll("[data-aksrt-search-form]"));
if (!searchForms.length && !mobileForm) return;
var HISTORY_KEY = "aksrt-mobile-search-history";
var suggestTimer = null;
var searchConfig = (window.aksrtData && aksrtData.search) || {};
@@ -32,20 +31,66 @@
suggestionsSection.hidden = true;
}
function getDesktopSearchType() {
if (!searchForms.length) return searchConfig.defaultType || "post";
var input = searchForms[0].querySelector('input[name="aksrt_search_type"]');
var value = input ? (input.value || "") : "";
return value || searchConfig.defaultType || "post";
}
function getDesktopCategory() {
if (!searchForms.length) return "0";
var input = searchForms[0].querySelector('input[name="aksrt_category"]');
return input ? (input.value || "0") : "0";
}
function syncSearchForms(type, category) {
searchForms.forEach(function (form) {
var typeInput = form.querySelector('input[name="aksrt_search_type"]');
if (typeInput) {
typeInput.value = type || searchConfig.defaultType || "post";
}
var categoryInput = form.querySelector('input[name="aksrt_category"]');
if (categoryInput) {
if ((type || searchConfig.defaultType || "post") === "post" && category && category !== "0") {
categoryInput.value = category;
} else {
categoryInput.value = "";
}
}
form.querySelectorAll("[data-search-type]").forEach(function (button) {
button.classList.toggle("is-active", button.getAttribute("data-search-type") === (type || searchConfig.defaultType || "post"));
});
});
}
function syncCategorySelectors(type, category) {
document.querySelectorAll("[data-search-category-select]").forEach(function (select) {
select.value = category && category !== "" ? category : "0";
select.disabled = (type || searchConfig.defaultType || "post") !== "post";
});
}
function getSearchType() {
return mobileTypeInput ? (mobileTypeInput.value || "post") : "post";
if (mobileTypeInput) {
return mobileTypeInput.value || getDesktopSearchType();
}
return getDesktopSearchType();
}
function setSearchType(type) {
if (!mobileTypeInput) return;
mobileTypeInput.value = type;
var nextType = type || searchConfig.defaultType || getDesktopSearchType();
if (mobileTypeInput) {
mobileTypeInput.value = nextType;
}
mobileTypeButtons.forEach(function (button) {
button.classList.toggle("is-active", button.getAttribute("data-search-type") === type);
button.classList.toggle("is-active", button.getAttribute("data-search-type") === nextType);
});
syncSearchForms(nextType, getDesktopCategory());
syncCategorySelectors(nextType, getDesktopCategory());
requestSuggestions();
}
function readHistory() {
if (!historyEnabled) return [];
if (aksrtData.isLoggedIn) return [];
try {
@@ -218,34 +263,10 @@
document.body.classList.remove("tabbar-search-open");
if (suggestionsSection) suggestionsSection.hidden = true;
}
btn.setAttribute("aria-expanded", open ? "true" : "false");
return;
}
panel.classList.toggle("is-open", open);
btn.setAttribute("aria-expanded", open ? "true" : "false");
if (open) {
var input = panel.querySelector('input[type="search"]');
if (input) input.focus();
}
}
btn.addEventListener("click", function (e) {
e.stopPropagation();
if (isMobileSearchMode()) {
setOpen(!mobileOverlay || mobileOverlay.hasAttribute("hidden"));
return;
}
setOpen(!panel.classList.contains("is-open"));
});
document.addEventListener("click", function (e) {
if (isMobileSearchMode()) return;
if (!panel.classList.contains("is-open")) return;
if (panel.contains(e.target) || btn.contains(e.target)) return;
setOpen(false);
});
if (mobileOverlay) {
mobileOverlay.addEventListener("click", function (e) {
if (e.target === mobileOverlay) setOpen(false);
@@ -280,6 +301,14 @@
});
}
document.querySelectorAll("[data-search-category-select]").forEach(function (select) {
select.addEventListener("change", function () {
var nextCategory = this.value || "0";
syncSearchForms(getSearchType(), nextCategory);
syncCategorySelectors(getSearchType(), nextCategory);
});
});
mobileTypeButtons.forEach(function (button) {
button.addEventListener("click", function () {
setSearchType(button.getAttribute("data-search-type") || "post");
@@ -298,18 +327,20 @@
});
}
document.querySelectorAll("[data-aksrt-search-form]").forEach(function (form) {
searchForms.forEach(function (form) {
if (form === mobileForm) return;
form.addEventListener("submit", function () {
if (!historyEnabled) return;
var input = form.querySelector('input[name="s"]');
var typeInput = form.querySelector('input[name="aksrt_search_type"]');
var keyword = input ? (input.value || "").trim() : "";
var type = typeInput ? (typeInput.value || "post") : "post";
var type = typeInput ? (typeInput.value || searchConfig.defaultType || "post") : (searchConfig.defaultType || "post");
pushHistory(keyword, type);
});
});
syncSearchForms(getSearchType(), getDesktopCategory());
syncCategorySelectors(getSearchType(), getDesktopCategory());
setSearchType(getSearchType());
if (historyEnabled && aksrtData.isLoggedIn) {
requestHistorySync("get", null, function (items) {
@@ -318,17 +349,8 @@
}
document.addEventListener("keydown", function (e) {
if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k") {
e.preventDefault();
setOpen(true);
}
if (e.key === "Escape" && panel.classList.contains("is-open")) {
setOpen(false);
btn.focus();
}
if (e.key === "Escape" && isMobileSearchMode() && mobileOverlay && !mobileOverlay.hasAttribute("hidden")) {
setOpen(false);
btn.focus();
}
});