document-processor/app/templates/base.html

147 lines
4.2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}Document Processor{% endblock %}</title>
<link rel="stylesheet" href="/static/app.css?v=154">
<link rel="stylesheet" href="/static/app-shell.css?v=66">
</head>
<body>
<button id="mobile-nav-toggle" class="mobile-nav-toggle" type="button" aria-label="Toggle navigation">
<span></span><span></span><span></span>
</button>
<div class="app-shell">
{% include "partials/sidebar.html" %}
{% include "partials/header.html" %}
<main class="main">
<div class="main-content">
{% block content %}{% endblock %}
</div>
</main>
</div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const menuToggle = document.getElementById("menu-toggle");
const mobileNavToggle = document.getElementById("mobile-nav-toggle");
const appShell = document.querySelector(".app-shell");
if (appShell) {
const toggleNav = () => appShell.classList.toggle("nav-open");
if (menuToggle) {
menuToggle.addEventListener("click", toggleNav);
menuToggle.addEventListener("keydown", (e) => {
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
toggleNav();
}
});
}
if (mobileNavToggle) {
mobileNavToggle.addEventListener("click", toggleNav);
}
}
const modeButtons = document.querySelectorAll("[data-detail-mode]");
if (modeButtons.length) {
const body = document.body;
const key = "documentDetailMobileMode";
const saved = localStorage.getItem(key) || "split";
const applyMode = (mode) => {
body.classList.remove("detail-mode-split", "detail-mode-preview", "detail-mode-review");
body.classList.add("detail-mode-" + mode);
modeButtons.forEach((btn) => {
btn.classList.toggle("active", btn.dataset.detailMode === mode);
});
localStorage.setItem(key, mode);
};
applyMode(saved);
modeButtons.forEach((btn) => {
btn.addEventListener("click", () => applyMode(btn.dataset.detailMode));
});
}
const tabButtons = document.querySelectorAll("[data-tab]");
const tabPanels = document.querySelectorAll("[data-panel]");
if (tabButtons.length && tabPanels.length) {
const activateTab = (tabName) => {
tabButtons.forEach((btn) => {
btn.classList.toggle("active", btn.dataset.tab === tabName);
});
tabPanels.forEach((panel) => {
panel.classList.toggle("active", panel.dataset.panel === tabName);
});
};
const initialActive =
document.querySelector(".tab-button.active")?.dataset.tab ||
"ocr-review";
activateTab(initialActive);
tabButtons.forEach((btn) => {
btn.addEventListener("click", () => activateTab(btn.dataset.tab));
});
}
});
</script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const tabButtons = document.querySelectorAll(".right-pane-tabs [data-tab]");
const tabPanels = document.querySelectorAll(".tab-panel[data-panel]");
if (!(tabButtons.length && tabPanels.length)) return;
const tabKey = "documentDetailActiveTab";
const applyTab = (tabName) => {
tabButtons.forEach((btn) => {
btn.classList.toggle("active", btn.dataset.tab === tabName);
});
tabPanels.forEach((panel) => {
panel.classList.toggle("active", panel.dataset.panel === tabName);
});
localStorage.setItem(tabKey, tabName);
};
const url = new URL(window.location.href);
const urlTab = url.searchParams.get("tab");
const savedTab = localStorage.getItem(tabKey);
const defaultTab =
urlTab ||
savedTab ||
document.querySelector(".right-pane-tabs .tab-button.active")?.dataset.tab ||
tabButtons[0]?.dataset.tab;
if (defaultTab) {
applyTab(defaultTab);
}
tabButtons.forEach((btn) => {
btn.addEventListener("click", () => {
const nextTab = btn.dataset.tab;
applyTab(nextTab);
const nextUrl = new URL(window.location.href);
nextUrl.searchParams.set("tab", nextTab);
window.history.replaceState({}, "", nextUrl.toString());
});
});
});
</script>
</body>
</html>