feat: 优化批量匹配和分页默认值 (#244)

This commit is contained in:
chengma
2026-08-15 15:56:16 +08:00
parent f315b02d3d
commit ad5bd834d3
17 changed files with 340 additions and 82 deletions
+31 -8
View File
@@ -93,22 +93,18 @@
}
/* ── 每页条数立即生效 ─────────────────────────
普通 GET 表单仍是无 JavaScript 时的完整回退;脚本只做渐进增强,让采购员
选择 20/50/100 后不用再点一次“应用”。select 不能禁用,否则浏览器提交时
会丢掉 page_size。 */
采购员选择 20/50/100 后直接提交 GET 表单。select 不能禁用,否则浏览器
提交时会丢掉 page_size。 */
function setupPageSizeForms() {
document.querySelectorAll("[data-page-size-form]").forEach(function (form) {
var select = form.querySelector("[data-page-size-select]");
var submit = form.querySelector("[data-page-size-submit]");
var loading = form.querySelector("[data-page-size-loading]");
if (!select) return;
function beginSubmit() {
if (form.getAttribute("aria-busy") === "true") return false;
form.setAttribute("aria-busy", "true");
if (submit) {
submit.disabled = true;
submit.textContent = "加载中…";
}
if (loading) loading.hidden = false;
return true;
}
@@ -126,6 +122,32 @@
});
}
/* 操作结果通过 POST/Redirect/GET 返回。成功提示固定定位并自动消失,错误交给
通用弹窗;两者都不占表格高度。页面读到结果后清掉临时查询参数,避免 F5
重复弹出同一条反馈。 */
function setupTransientFeedback() {
var feedbacks = document.querySelectorAll("[data-transient-feedback]");
if (!feedbacks.length) return;
var paramsToRemove = {};
feedbacks.forEach(function (feedback) {
(feedback.getAttribute("data-transient-query") || "").split(/\s+/).forEach(function (name) {
if (name) paramsToRemove[name] = true;
});
if (feedback.hasAttribute("data-auto-dismiss-toast")) {
window.setTimeout(function () {
feedback.hidden = true;
feedback.remove();
}, 4000);
}
});
var current = new URL(window.location.href);
Object.keys(paramsToRemove).forEach(function (name) { current.searchParams.delete(name); });
var cleanURL = current.pathname + (current.search ? current.search : "") + current.hash;
window.history.replaceState(window.history.state, "", cleanURL);
}
/* ── 全选 / 反选 ──────────────────────────────
表头的勾选框控制本表格所有行的勾选框。 */
function setupCheckAll(root) {
@@ -888,6 +910,7 @@
document.addEventListener("DOMContentLoaded", function () {
setupModuleNavigationState();
setupPageSizeForms();
setupTransientFeedback();
document.querySelectorAll("table").forEach(setupCheckAll);
setupConfirmDelete();
setupConfirmSubmit();