187 lines
6.3 KiB
JavaScript
187 lines
6.3 KiB
JavaScript
(function () {
|
||
"use strict";
|
||
|
||
var toastEl = document.querySelector(".toast");
|
||
var toastTimer = null;
|
||
function toast(msg) {
|
||
if (!toastEl) return;
|
||
toastEl.textContent = msg;
|
||
toastEl.classList.add("show");
|
||
clearTimeout(toastTimer);
|
||
toastTimer = setTimeout(function () {
|
||
toastEl.classList.remove("show");
|
||
}, 2200);
|
||
}
|
||
window.awToast = toast;
|
||
|
||
async function postJson(url, body, method) {
|
||
var res = await fetch(url, {
|
||
method: method || "POST",
|
||
headers: { "content-type": "application/json" },
|
||
body: JSON.stringify(body || {}),
|
||
});
|
||
var json = null;
|
||
try {
|
||
json = await res.json();
|
||
} catch (e) {}
|
||
if (!res.ok || (json && json.ok === false)) {
|
||
throw new Error((json && json.error && json.error.message) || "请求失败(" + res.status + ")");
|
||
}
|
||
return json;
|
||
}
|
||
window.awApi = postJson;
|
||
|
||
document.querySelectorAll("[data-copy]").forEach(function (btn) {
|
||
btn.addEventListener("click", function () {
|
||
var text = btn.getAttribute("data-copy");
|
||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||
navigator.clipboard.writeText(text).then(
|
||
function () { toast("已复制"); },
|
||
function () { toast("复制失败,请手动选择文本"); }
|
||
);
|
||
} else {
|
||
toast("当前环境不支持自动复制");
|
||
}
|
||
});
|
||
});
|
||
|
||
var searchInput = document.getElementById("q");
|
||
var echo = document.getElementById("query-echo");
|
||
if (searchInput && echo) {
|
||
var paint = function () {
|
||
var q = searchInput.value.trim();
|
||
echo.textContent = q
|
||
? '→ mcp: search_entries({ "q": "' + q + '", "limit": 20 })'
|
||
: '→ mcp: search_entries({ "q": "…" })';
|
||
};
|
||
searchInput.addEventListener("input", paint);
|
||
paint();
|
||
}
|
||
|
||
var searchForm = document.getElementById("search-form");
|
||
if (searchForm) {
|
||
searchForm.addEventListener("submit", function (e) {
|
||
e.preventDefault();
|
||
var q = searchForm.querySelector("#q") ? searchForm.querySelector("#q").value.trim() : "";
|
||
location.href = "/entries" + (q ? "?q=" + encodeURIComponent(q) : "");
|
||
});
|
||
}
|
||
|
||
var randomBtn = document.getElementById("random-btn");
|
||
if (randomBtn) {
|
||
randomBtn.addEventListener("click", function () {
|
||
location.href = "/random";
|
||
});
|
||
}
|
||
|
||
var navToggle = document.querySelector(".nav-toggle");
|
||
if (navToggle) {
|
||
navToggle.addEventListener("click", function () {
|
||
var bar = document.querySelector(".topbar");
|
||
var open = bar.classList.toggle("menu-open");
|
||
navToggle.setAttribute("aria-expanded", open ? "true" : "false");
|
||
});
|
||
}
|
||
|
||
var railToggle = document.getElementById("rail-toggle");
|
||
if (railToggle) {
|
||
railToggle.addEventListener("click", function () {
|
||
document.getElementById("filter-rail").classList.toggle("open");
|
||
});
|
||
}
|
||
|
||
document.querySelectorAll(".tree-row[data-tree]").forEach(function (row) {
|
||
row.addEventListener("click", function () {
|
||
var target = document.getElementById(row.getAttribute("data-tree"));
|
||
if (!target) return;
|
||
var open = target.classList.toggle("open");
|
||
row.setAttribute("aria-expanded", open ? "true" : "false");
|
||
});
|
||
});
|
||
|
||
document.querySelectorAll(".view-tabs button[data-view]").forEach(function (tab) {
|
||
tab.addEventListener("click", function () {
|
||
document
|
||
.querySelectorAll(".view-tabs button[data-view]")
|
||
.forEach(function (t) { t.setAttribute("aria-selected", "false"); });
|
||
tab.setAttribute("aria-selected", "true");
|
||
var view = tab.getAttribute("data-view");
|
||
document.querySelectorAll("[data-view-panel]").forEach(function (p) {
|
||
p.hidden = p.getAttribute("data-view-panel") !== view;
|
||
});
|
||
});
|
||
});
|
||
|
||
document.querySelectorAll(".filter-auto input[type=checkbox], .filter-auto select").forEach(function (el) {
|
||
el.addEventListener("change", function () {
|
||
el.form && el.form.submit();
|
||
});
|
||
});
|
||
|
||
document.querySelectorAll("[data-eye-toggle]").forEach(function (btn) {
|
||
btn.addEventListener("click", function () {
|
||
var input = btn.closest(".pwd-field, .ai-key-field")
|
||
? btn.closest(".pwd-field, .ai-key-field").querySelector("input")
|
||
: null;
|
||
if (!input) return;
|
||
var show = input.type === "password";
|
||
input.type = show ? "text" : "password";
|
||
btn.setAttribute("aria-label", show ? "隐藏密码" : "显示密码");
|
||
var open = btn.querySelector(".eye-open");
|
||
var closed = btn.querySelector(".eye-closed");
|
||
if (open) open.hidden = show;
|
||
if (closed) closed.hidden = !show;
|
||
});
|
||
});
|
||
|
||
var loginForm = document.getElementById("login-form");
|
||
if (loginForm) {
|
||
loginForm.addEventListener("submit", function (e) {
|
||
e.preventDefault();
|
||
if (!loginForm.reportValidity()) return;
|
||
postJson("/api/admin/login", {
|
||
username: loginForm.username.value,
|
||
password: loginForm.password.value,
|
||
remember: loginForm.remember ? loginForm.remember.checked : true,
|
||
})
|
||
.then(function () {
|
||
toast("登录成功,正在进入管理台…");
|
||
setTimeout(function () { location.href = "/admin"; }, 400);
|
||
})
|
||
.catch(function (err) { toast(err.message); });
|
||
});
|
||
}
|
||
|
||
var commentForm = document.querySelector(".comment-form[data-entry-id]");
|
||
if (commentForm) {
|
||
commentForm.addEventListener("submit", function (e) {
|
||
e.preventDefault();
|
||
if (!commentForm.reportValidity()) return;
|
||
postJson("/api/comments", {
|
||
entryId: Number(commentForm.getAttribute("data-entry-id")),
|
||
authorName: commentForm.querySelector("[name=authorName]").value,
|
||
body: commentForm.querySelector("[name=body]").value,
|
||
})
|
||
.then(function () {
|
||
toast("评论已发布");
|
||
setTimeout(function () { location.reload(); }, 500);
|
||
})
|
||
.catch(function (err) { toast(err.message); });
|
||
});
|
||
}
|
||
|
||
var feedbackForm = document.querySelector(".feedback[data-feedback]");
|
||
if (feedbackForm) {
|
||
feedbackForm.addEventListener("submit", function (e) {
|
||
e.preventDefault();
|
||
if (!feedbackForm.reportValidity()) return;
|
||
postJson("/api/feedback", { body: feedbackForm.querySelector("textarea").value })
|
||
.then(function () {
|
||
toast("已收到,感谢反馈");
|
||
feedbackForm.reset();
|
||
})
|
||
.catch(function (err) { toast(err.message); });
|
||
});
|
||
}
|
||
})();
|