ui: declarative per-page tab titles via definePage title

This commit is contained in:
2026-09-04 21:59:09 +00:00
parent 6476695d29
commit 6229c39347
18 changed files with 84 additions and 4 deletions
+4
View File
@@ -25,6 +25,7 @@ const _mounted = new Map();
* Define a page component.
*
* @param {object} def — Page definition
* @param {string} [def.title] — Full browser tab title; applied to document.title on mount
* @param {function} def.init — Return initial state object
* @param {function} [def.load] — Optional one-time setup called on mount
* @param {function} def.render — Render function that returns vnodes
@@ -52,6 +53,7 @@ export function definePage(def) {
},
load: def.load || null,
onUnmount: def.onUnmount || null,
title: def.title || null,
};
return renderer;
@@ -65,6 +67,8 @@ export function mountComponent(key, renderer) {
const pd = renderer._pageDef;
if (!pd) return;
if (pd.title) document.title = pd.title;
let entry = _mounted.get(key);
if (entry) {
+1
View File
@@ -256,6 +256,7 @@ export function openBackendModal(state, backend) {
// Page
// ---------------------------------------------------------------------------
export default definePage({
title: 'Backends - Vacuum Wall',
init() {
return {
backends: getModel('backends'),
+1
View File
@@ -326,6 +326,7 @@ async function pollCertIssue(rid) {
}
export default definePage({
title: 'Certificates - Vacuum Wall',
init() {
return {
acme: getModel('acme'),
+1
View File
@@ -41,6 +41,7 @@ function diffLine(d) {
}
export default definePage({
title: 'Dashboard - Vacuum Wall',
init() {
return {
firewall: getModel('firewall'),
+1
View File
@@ -107,6 +107,7 @@ const addDns = QuickModal({
});
export default definePage({
title: 'DHCP & DNS - Vacuum Wall',
init() {
return {
dnsmasq: getModel('dnsmasq'),
+1
View File
@@ -35,6 +35,7 @@ const cfgModalFn = QuickModal({
});
export default definePage({
title: 'Interfaces - Vacuum Wall',
init() {
return {
firewall: getModel('firewall'),
+2 -1
View File
@@ -205,8 +205,9 @@ const passkeyMouseLeaveHandler = () => {
};
const Page = definePage({
title: 'Login - Vacuum Wall',
init() {
document.title = 'Login — Vacuum Wall';
return {};
},
load() {
+1
View File
@@ -9,6 +9,7 @@ const logTabs = [
];
export default definePage({
title: 'Logs - Vacuum Wall',
init() {
return {
logs: getModel('logs'),
+1
View File
@@ -24,6 +24,7 @@ const addFwd = QuickModal({
});
export default definePage({
title: 'NAT - Vacuum Wall',
init() {
return {
firewall: getModel('firewall'),
+1
View File
@@ -1,6 +1,7 @@
import { html, PageHeader, definePage } from '/static/hoover/index.js';
export default definePage({
title: '404 - Vacuum Wall',
init() {
return { path: location.hash.slice(1) || '' };
},
+1 -1
View File
@@ -257,8 +257,8 @@ function CredentialsPage() {
}
const Page = definePage({
title: 'Passkeys - Vacuum Wall',
init() {
document.title = 'Passkeys — Vacuum Wall';
return state;
},
+1
View File
@@ -250,6 +250,7 @@ function backendSection(section, state, set) {
}
export default definePage({
title: 'Proxy - Vacuum Wall',
init() {
return {
nginx: getModel('nginx'),
+1
View File
@@ -15,6 +15,7 @@ const addRule = QuickModal({
});
export default definePage({
title: 'Rules - Vacuum Wall',
init() {
return {
firewall: getModel('firewall'),
+1
View File
@@ -252,6 +252,7 @@ function UsersPage() {
}
export default definePage({
title: 'Users - Vacuum Wall',
init() {
return state;
},
+1
View File
@@ -402,6 +402,7 @@ function renderAccessClasses(config, status) {
/* ── Main Page ───────────────────────────────────────────────── */
export default definePage({
title: 'WireGuard - Vacuum Wall',
init() {
return {
wireguard: getModel('wireguard'),
+1
View File
@@ -24,6 +24,7 @@ const addZone = QuickModal({
});
export default definePage({
title: 'Zones - Vacuum Wall',
init() {
return {
firewall: getModel('firewall'),