e22d24aa8a
Collapse the three nav builders into buildPluginChrome: chrome.bestHref does longest-prefix matching so deep admin routes mark their leaf. Delete adminNav; buildConfirmModel and the admin model builders take the resolved nav. The same role-filtered sidebar now renders signed in or out, collapsing to a burger on narrow screens. shell.ejs gains menu (default true; menu:false -> single-column .app-bare), docTitle (separate <title> from the topbar, so the body keeps the single <h1>), and hideSignIn (suppress the footer Sign-in on auth pages to avoid a login loop). auth/home/landing now render inside the shell. Dashboard is a replaceable instructional starter (definePlugin snippet, no mock data). Email stays delegated to Kratos: documented its built-in courier.template_override_path instead of adding web-side SMTP.
26 lines
1.1 KiB
TypeScript
26 lines
1.1 KiB
TypeScript
// Dashboard view model (todo §10): the gated "/dashboard" app home. By default a short instructional
|
|
// starter — what the dashboard is and how to replace it by exporting a `dashboard` handler from a
|
|
// plugin (views/index.ejs holds the prose). A plugin owns the real one (PluginManifest.dashboard);
|
|
// this placeholder renders until then. Pure: `nav` is the one global menu (ctx.chrome.nav), built
|
|
// once per request by the host, so the dashboard shows the exact same menu as every other page.
|
|
|
|
import type { User } from "./context.ts";
|
|
import { DEFAULT_MENU, type MenuConfig } from "./menu-config.ts";
|
|
import type { NavNode } from "./nav.ts";
|
|
import { buildShellContext } from "./shell-context.ts";
|
|
|
|
export function buildDashboardModel(opts: { csrfToken?: string; menu?: MenuConfig; nav?: NavNode[]; user?: User | null } = {}) {
|
|
return {
|
|
nav: opts.nav ?? [],
|
|
shell: buildShellContext({
|
|
breadcrumbs: [{ label: "Dashboard" }],
|
|
csrfToken: opts.csrfToken ?? "",
|
|
menu: opts.menu ?? DEFAULT_MENU,
|
|
title: "Dashboard",
|
|
user: opts.user ?? null,
|
|
}),
|
|
};
|
|
}
|
|
|
|
export type DashboardModel = ReturnType<typeof buildDashboardModel>;
|