aboutsummaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/client-scripts/src/backbutton.ts7
-rw-r--r--ui/client-scripts/src/transition.ts15
-rw-r--r--ui/locale/src/lib.rs2
3 files changed, 13 insertions, 11 deletions
diff --git a/ui/client-scripts/src/backbutton.ts b/ui/client-scripts/src/backbutton.ts
index b1b5c0f..5c1a8cb 100644
--- a/ui/client-scripts/src/backbutton.ts
+++ b/ui/client-scripts/src/backbutton.ts
@@ -7,7 +7,8 @@
import { e } from "./jshelper/mod.ts";
globalThis.addEventListener("DOMContentLoaded", () => {
- document.getElementsByTagName("nav").item(0)?.prepend(
- e("a", { class: "back", onclick() { history.back() } }, e("span", "Back"))
- )
+ const nav = document.getElementsByTagName("nav").item(0) as HTMLElement
+ if (nav.dataset.hasBackButton) return
+ nav.dataset.hasBackButton = "1"
+ nav.prepend(e("a", { class: "back", onclick() { history.back() } }, e("span", "Back")))
})
diff --git a/ui/client-scripts/src/transition.ts b/ui/client-scripts/src/transition.ts
index dadb266..2bf11ce 100644
--- a/ui/client-scripts/src/transition.ts
+++ b/ui/client-scripts/src/transition.ts
@@ -29,6 +29,8 @@ function patch_page() {
document.querySelectorAll("a").forEach(el => {
if (!el.href.startsWith("http")) return
if (el.target && el.target != "_self") return
+ if (el.dataset.hasTransitionHook) return
+ el.dataset.hasTransitionHook = "1"
el.addEventListener("click", async ev => {
ev.preventDefault()
await transition_to(el.href)
@@ -53,7 +55,7 @@ function show_message(mesg: string, mode: "error" | "success" = "error") {
let i = 0;
function prepare_load(href: string, state?: HistoryState) {
- const r_promise = fetch(href, { headers: { accept: "text/html" }, redirect: "manual" })
+ const r_promise = fetch(href + "?no_scaff", { headers: { accept: "text/html" }, redirect: "manual" })
return async () => {
let rt = ""
try {
@@ -70,12 +72,10 @@ function prepare_load(href: string, state?: HistoryState) {
if (e instanceof TypeError) return show_message("Navigation failed. Check your connection.")
return show_message("unknown error when fetching page")
}
- const [head, body] = rt.split("<head>")[1].split("</head>")
globalThis.history.replaceState({ top: globalThis.scrollY, index: i++ } as HistoryState, "")
if (!state) globalThis.history.pushState({}, "", href)
clear_spinner()
- document.head.innerHTML = head
- document.body.outerHTML = body
+ document.getElementById("main")!.innerHTML = rt
globalThis.dispatchEvent(new Event("DOMContentLoaded"))
globalThis.scrollTo({ top: state?.top ?? 0 });
fade(true)
@@ -88,8 +88,9 @@ function clear_spinner() {
if (spinner_element) spinner_element.remove()
spinner_element = spinner_timeout = undefined;
}
+let overlay: HTMLDivElement | undefined
function fade(dir: boolean) {
- const overlay = document.createElement("div")
+ if (!overlay) overlay = document.createElement("div")
overlay.classList.add("jst-fade")
overlay.style.backgroundColor = dir ? "black" : "transparent"
overlay.style.animationName = dir ? "jst-fadeout" : "jst-fadein"
@@ -98,9 +99,9 @@ function fade(dir: boolean) {
document.body.appendChild(overlay)
return new Promise<void>(res => {
setTimeout(() => {
- if (dir) document.body.removeChild(overlay)
+ if (dir && overlay) { document.body.removeChild(overlay); overlay = undefined }
spinner_timeout = setTimeout(() => {
- overlay.append(spinner_element = e("div", { class: "jst-spinner" }, "This is a spinner."))
+ overlay?.append(spinner_element = e("div", { class: "jst-spinner" }, "This is a spinner."))
}, 500)
res()
}, DURATION)
diff --git a/ui/locale/src/lib.rs b/ui/locale/src/lib.rs
index 49e570b..e890e5d 100644
--- a/ui/locale/src/lib.rs
+++ b/ui/locale/src/lib.rs
@@ -13,7 +13,7 @@ macro_rules! languages {
const LANGUAGES: &[(&str, &str)] = &[$(($lang, include_str!(concat!("../../../locale/", $lang, ".ini")))),*];
};
}
-languages!("en", "de");
+languages!("en", "de", "nl", "zh_Hans");
pub static LANG_TABLES: LazyLock<HashMap<&'static str, HashMap<&'static str, &'static str>>> =
LazyLock::new(|| {