Files
dobetternorge-tools/includes/nav.php
T
daveadmin c997f204b5 feat: add Do Better Norge MCP server — token system, runtime API, interactive setup page
- UserMcpTokens: per-user SHA256-hashed token mint/validate/revoke (Plus/Pro only)
- DbnMcpRuntime: 19 MCP tools (search, ask, summarize, timeline, redact, translate,
  legal_analysis, korrespond, barnevernet_analyze, advocate_brief, deep_research,
  discrepancy_find, transcribe_audio, corpus_stats, list_documents, get_document,
  citation_graph, case_workbench_plan, save_to_case)
- api/mcp/user/: session/tools/invoke HTTP endpoints with Bearer token auth
- api/mcp-tokens.php: token create/revoke/list REST API
- mcp.php: interactive setup page with token management, 5-client config tabs,
  auto-fill on token creation, tool catalog grid, privacy notice
- account.php: simplified MCP section with link to mcp.php
- nav.php: MCP nav link
- .htaccess: Authorization header passthrough, MCP route rewrite, CORS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 11:01:13 +02:00

111 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* Unified site navbar — included by layout.php, layout_dashboard.php, and standalone pages.
* Assumes bootstrap.php (and i18n.php) has already been required.
*/
$_navGuest = !dbnToolsIsAuthenticated();
$_navAuth = $_navGuest ? null : dbnToolsAuthenticatedUser();
$_navEmail = (string)($_navAuth['email'] ?? '');
$_navUser = $_navEmail !== '' ? (strstr($_navEmail, '@', true) ?: $_navEmail) : '';
$_navLang = dbnToolsCurrentLanguage();
$_navTools = dbnToolsLaunchedTools($_navLang);
$_navPath = strtok((string)($_SERVER['REQUEST_URI'] ?? '/'), '?') ?: '/';
$_navOnDash = str_starts_with($_navPath, '/dashboard');
$_navReturnUrl = urlencode($_navPath);
?>
<nav class="dbn-nav" role="navigation" aria-label="<?= htmlspecialchars(dbnToolsT('suite_title', $_navLang)) ?>">
<a class="dbn-nav__brand" href="/dashboard.php">
<span class="dbn-nav__brandmark" aria-hidden="true">⚖</span>
<span class="dbn-nav__brandname">Do Better Norge</span>
</a>
<div class="dbn-nav__links" role="menubar">
<div class="dbn-nav__dropdown" data-nav-dropdown>
<button class="dbn-nav__link dbn-nav__dropper"
type="button"
aria-haspopup="menu"
aria-expanded="false"
aria-controls="navToolsPanel">
<?= htmlspecialchars(dbnToolsT('nav_tools', $_navLang)) ?>
<span class="dbn-nav__caret" aria-hidden="true">▾</span>
</button>
<div class="dbn-nav__panel" id="navToolsPanel" role="menu" aria-label="<?= htmlspecialchars(dbnToolsT('nav_tools', $_navLang)) ?>">
<?php foreach ($_navTools as $slug => $item): ?>
<a class="dbn-nav__panel-item" href="<?= htmlspecialchars($item['url']) ?>" role="menuitem">
<span class="dbn-nav__panel-badge" aria-hidden="true"><?= htmlspecialchars($item['icon']) ?></span>
<span class="dbn-nav__panel-label"><?= htmlspecialchars($item['label']) ?></span>
<span class="dbn-nav__panel-sub"><?= htmlspecialchars($item['sub']) ?></span>
</a>
<?php endforeach; ?>
</div>
</div>
<a class="dbn-nav__link<?= $_navOnDash ? ' is-active' : '' ?>"
href="/dashboard.php"
role="menuitem"
<?= $_navOnDash ? 'aria-current="page"' : '' ?>>
<?= htmlspecialchars(dbnToolsT('nav_dashboard', $_navLang)) ?>
</a>
<?php $_navOnMcp = ($_navPath === '/mcp.php'); ?>
<a class="dbn-nav__link<?= $_navOnMcp ? ' is-active' : '' ?>"
href="/mcp.php"
role="menuitem"
<?= $_navOnMcp ? 'aria-current="page"' : '' ?>>
MCP
</a>
</div>
<div class="dbn-nav__right">
<nav class="dbn-nav__langs" aria-label="Language">
<?php foreach (dbnToolsSupportedLanguages() as $lc): ?>
<a href="<?= htmlspecialchars($_navPath . '?lang=' . $lc) ?>"
class="dbn-nav__lang<?= $lc === $_navLang ? ' is-active' : '' ?>"
hreflang="<?= htmlspecialchars($lc) ?>"
aria-label="<?= htmlspecialchars(dbnToolsLanguageName($lc)) ?>"
title="<?= htmlspecialchars(dbnToolsLanguageName($lc)) ?>"><?= htmlspecialchars(strtoupper($lc)) ?></a>
<?php endforeach; ?>
</nav>
<?php if ($_navGuest): ?>
<a href="/?return=<?= $_navReturnUrl ?>" class="dbn-nav__login">
<?= htmlspecialchars(dbnToolsT('nav_login', $_navLang)) ?>
</a>
<?php else: ?>
<a class="dbn-nav__account-link" href="/account.php" title="<?= htmlspecialchars($_navEmail) ?>">
<?php if ($_navUser !== ''): ?>
<span class="dbn-nav__username"><?= htmlspecialchars($_navUser) ?></span>
<?php endif; ?>
<span class="dbn-nav__account-badge"><?= htmlspecialchars(dbnToolsT('nav_account', $_navLang)) ?></span>
</a>
<a href="/api/logout.php" class="dbn-nav__logout">
<?= htmlspecialchars(dbnToolsT('nav_logout', $_navLang)) ?>
</a>
<?php endif; ?>
</div>
</nav>
<script>
(function () {
var dropdowns = document.querySelectorAll('[data-nav-dropdown]');
dropdowns.forEach(function (dd) {
var btn = dd.querySelector('.dbn-nav__dropper');
var panel = dd.querySelector('.dbn-nav__panel');
if (!btn || !panel) return;
function open() { dd.classList.add('is-open'); btn.setAttribute('aria-expanded', 'true'); }
function close() { dd.classList.remove('is-open'); btn.setAttribute('aria-expanded', 'false'); }
function toggle() { dd.classList.contains('is-open') ? close() : open(); }
btn.addEventListener('click', function (e) { e.stopPropagation(); toggle(); });
document.addEventListener('click', function (e) {
if (!dd.contains(e.target)) close();
});
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') close();
});
});
}());
</script>