awesome/public/js/main.js
cheney c09857cc81
All checks were successful
Build and Deploy / build (push) Successful in 56s
Build and Deploy / deploy (push) Successful in 28s
feat: 登录记住本机+密码可见、内容分简介与主体、Markdown 渲染、首页随机条目
2026-09-01 10:53:17 +08:00

187 lines
6.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(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); });
});
}
})();