41 lines
1.9 KiB
Plaintext
41 lines
1.9 KiB
Plaintext
<%#
|
|
Dashboard: the gated post-login app home. The built-in default is a short instructional
|
|
starter — what /dashboard is and how to replace it from a plugin. Composes the app shell (the one
|
|
global menu via model.nav) around the prose. A plugin owns the real dashboard via a `dashboard`
|
|
handler; this renders until then. Data: model { nav, shell }.
|
|
%><%
|
|
const nav = include("partials/nav-tree", { nodes: model.nav });
|
|
const body = `
|
|
<div class="form-page">
|
|
<section class="form-card">
|
|
<h2 class="card-title">Starter dashboard</h2>
|
|
<p>This is the built-in <code>/dashboard</code> — the gated home shown to a signed-in user.
|
|
It's a placeholder so a fresh clone has something here; it holds no real data.</p>
|
|
<p>Replace it from a plugin: export a <code>dashboard</code> handler from your plugin's
|
|
manifest and it owns this page, rendered against your own views with the native app shell
|
|
(the same menu you see now) via <code>ctx.chrome</code>.</p>
|
|
<pre class="code-block"><code>export default definePlugin({
|
|
apiVersion: "1.0.0",
|
|
// view names plugins/<id>/views/<view>.ejs, rendered in this same shell
|
|
dashboard: (ctx) => ({ view: "dashboard", data: { /* … */ } }),
|
|
});</code></pre>
|
|
<p>See the plugin contract in <code>docs/plugin-contract.md</code> (the landing-pages section)
|
|
and the bundled <code>plugins/scheduling/</code> reference.</p>
|
|
<div class="form-actions">
|
|
<a class="btn btn-primary" href="/scheduling"><svg class="ico ico-sm" aria-hidden="true"><use href="#i-grid"/></svg>Browse the example plugin</a>
|
|
</div>
|
|
</section>
|
|
</div>`;
|
|
-%>
|
|
<%- include("partials/shell", {
|
|
body,
|
|
brand: model.shell.brand,
|
|
breadcrumbs: model.shell.breadcrumbs,
|
|
csrfToken: model.shell.csrfToken,
|
|
nav,
|
|
signInHref: model.shell.signInHref,
|
|
theme: model.shell.theme,
|
|
title: model.shell.title,
|
|
user: model.shell.user,
|
|
}) %>
|