Files
dobetternorge-tools/workbench.php
T
daveadmin 1246b7a804 feat(workbench): add DBN Case Workbench guided case-preparation hub
Additive-only change: new workbench.php authenticated page with guided
intake flow, evidence map, tool sequence, output checklist, and
sessionStorage-only note persistence. Dashboard and public index get
a new Case Workbench card. No existing tools, APIs, or prompts modified.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 19:08:16 +02:00

207 lines
10 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/bootstrap.php';
if (!dbnToolsIsAuthenticated()) {
header('Location: /?return=' . urlencode($_SERVER['REQUEST_URI'] ?? '/workbench.php'));
exit;
}
$uiLang = dbnToolsCurrentLanguage();
$tools = dbnToolsLaunchedTools($uiLang);
$copy = dbnToolsWorkbenchCopy($uiLang);
$langPath = '/workbench.php';
$toolFlow = [
['slug' => 'transcribe', 'step' => '01', 'bring' => $copy['bring_transcribe']],
['slug' => 'timeline', 'step' => '02', 'bring' => $copy['bring_timeline']],
['slug' => 'redact', 'step' => '03', 'bring' => $copy['bring_redact']],
['slug' => 'barnevernet', 'step' => '04', 'bring' => $copy['bring_barnevernet']],
['slug' => 'advocate', 'step' => '05', 'bring' => $copy['bring_advocate']],
['slug' => 'deep-research', 'step' => '06', 'bring' => $copy['bring_research']],
['slug' => 'corpus', 'step' => '07', 'bring' => $copy['bring_corpus']],
];
?>
<!doctype html>
<html lang="<?= htmlspecialchars($uiLang) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?= htmlspecialchars($copy['title']) ?> - Do Better Norge</title>
<meta name="robots" content="noindex, nofollow">
<meta name="theme-color" content="#00205B">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap">
<link rel="stylesheet" href="assets/css/tools.css">
</head>
<body data-authenticated="true" class="lt-app workbench-page">
<script>
window.DBN_TOOLS_AUTHENTICATED = true;
window.DBN_TOOLS_LANG = <?= json_encode($uiLang, JSON_UNESCAPED_UNICODE) ?>;
</script>
<main id="appShell" class="app-shell workbench-shell">
<header class="topbar">
<div>
<p class="eyebrow"><?= htmlspecialchars(dbnToolsT('brand_line', $uiLang)) ?></p>
<h1><?= htmlspecialchars($copy['title']) ?></h1>
<div class="case-no">
<span class="pulse"></span>
<span>family-legal</span>
<span class="case-sep">.</span>
<span><?= htmlspecialchars(dbnToolsT('retention', $uiLang)) ?></span>
</div>
</div>
<div class="topbar-actions">
<nav class="shell-lang-switcher" aria-label="Language">
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
<?php endforeach; ?>
</nav>
<a class="secondary-button workbench-dashboard-link" href="/dashboard.php"><?= htmlspecialchars($copy['all_tools']) ?></a>
<span id="healthPill" class="status-pill"><?= htmlspecialchars(dbnToolsT('session_active', $uiLang)) ?></span>
<button id="healthButton" class="secondary-button" type="button"><?= htmlspecialchars(dbnToolsT('health', $uiLang)) ?></button>
</div>
</header>
<section class="workbench-hero" aria-labelledby="workbenchHeroTitle">
<div class="workbench-hero__copy">
<p class="workbench-kicker"><?= htmlspecialchars($copy['kicker']) ?></p>
<h2 id="workbenchHeroTitle"><?= htmlspecialchars($copy['hero_title']) ?></h2>
<p><?= htmlspecialchars($copy['hero_text']) ?></p>
</div>
<div class="workbench-hero__panel" aria-label="<?= htmlspecialchars($copy['privacy_title']) ?>">
<strong><?= htmlspecialchars($copy['privacy_title']) ?></strong>
<p><?= htmlspecialchars($copy['privacy_text']) ?></p>
<button id="workbenchClear" class="workbench-clear" type="button"><?= htmlspecialchars($copy['clear_session']) ?></button>
<p id="workbenchStatus" class="workbench-status" role="status" aria-live="polite"></p>
</div>
</section>
<div class="disclaimer" role="note"><?= htmlspecialchars(dbnToolsT('disclaimer', $uiLang)) ?></div>
<form id="workbenchForm" class="workbench-grid" autocomplete="off">
<section class="workbench-panel workbench-panel--intake" aria-labelledby="workbenchIntakeTitle">
<div class="workbench-section-head">
<p class="workbench-kicker">01</p>
<h2 id="workbenchIntakeTitle"><?= htmlspecialchars($copy['intake_title']) ?></h2>
</div>
<div class="workbench-form-grid">
<label class="workbench-field" for="wbRole">
<span><?= htmlspecialchars($copy['role']) ?></span>
<select id="wbRole" name="role">
<option value=""><?= htmlspecialchars($copy['choose']) ?></option>
<option><?= htmlspecialchars($copy['role_parent']) ?></option>
<option><?= htmlspecialchars($copy['role_family']) ?></option>
<option><?= htmlspecialchars($copy['role_advocate']) ?></option>
<option><?= htmlspecialchars($copy['role_supporter']) ?></option>
</select>
</label>
<label class="workbench-field" for="wbCaseType">
<span><?= htmlspecialchars($copy['case_type']) ?></span>
<select id="wbCaseType" name="case_type">
<option value=""><?= htmlspecialchars($copy['choose']) ?></option>
<option><?= htmlspecialchars($copy['case_barnevernet']) ?></option>
<option><?= htmlspecialchars($copy['case_custody']) ?></option>
<option><?= htmlspecialchars($copy['case_access']) ?></option>
<option><?= htmlspecialchars($copy['case_echr']) ?></option>
</select>
</label>
<label class="workbench-field" for="wbDeadline">
<span><?= htmlspecialchars($copy['deadline']) ?></span>
<input id="wbDeadline" name="deadline" type="date">
</label>
<label class="workbench-field" for="wbLanguage">
<span><?= htmlspecialchars($copy['language']) ?></span>
<select id="wbLanguage" name="language">
<option>English</option>
<option>Norwegian</option>
<option>Ukrainian</option>
<option>Polish</option>
</select>
</label>
</div>
<label class="workbench-field workbench-field--wide" for="wbConcern">
<span><?= htmlspecialchars($copy['main_concern']) ?></span>
<textarea id="wbConcern" name="main_concern" rows="5" placeholder="<?= htmlspecialchars($copy['main_concern_hint']) ?>"></textarea>
</label>
</section>
<section class="workbench-panel workbench-panel--evidence" aria-labelledby="workbenchEvidenceTitle">
<div class="workbench-section-head">
<p class="workbench-kicker">02</p>
<h2 id="workbenchEvidenceTitle"><?= htmlspecialchars($copy['evidence_title']) ?></h2>
</div>
<div class="workbench-evidence-list">
<?php
$evidenceFields = [
['documents', $copy['documents'], $copy['documents_hint']],
['meetings', $copy['meetings'], $copy['meetings_hint']],
['dates', $copy['dates'], $copy['dates_hint']],
['claims', $copy['claims'], $copy['claims_hint']],
['missing', $copy['missing'], $copy['missing_hint']],
];
foreach ($evidenceFields as [$name, $label, $hint]):
$id = 'wb' . ucfirst($name);
?>
<label class="workbench-field" for="<?= htmlspecialchars($id) ?>">
<span><?= htmlspecialchars($label) ?></span>
<textarea id="<?= htmlspecialchars($id) ?>" name="<?= htmlspecialchars($name) ?>" rows="4" placeholder="<?= htmlspecialchars($hint) ?>"></textarea>
</label>
<?php endforeach; ?>
</div>
</section>
<section class="workbench-panel workbench-panel--flow" aria-labelledby="workbenchFlowTitle">
<div class="workbench-section-head">
<p class="workbench-kicker">03</p>
<h2 id="workbenchFlowTitle"><?= htmlspecialchars($copy['flow_title']) ?></h2>
</div>
<div class="workbench-flow">
<?php foreach ($toolFlow as $item):
$tool = $tools[$item['slug']] ?? null;
if (!$tool) {
continue;
}
?>
<article class="workbench-step">
<div class="workbench-step__index"><?= htmlspecialchars($item['step']) ?></div>
<div class="workbench-step__body">
<p><?= htmlspecialchars($tool['sub']) ?></p>
<h3><?= htmlspecialchars($tool['label']) ?></h3>
<span><?= htmlspecialchars($item['bring']) ?></span>
</div>
<a class="workbench-tool-link" href="<?= htmlspecialchars($tool['url']) ?>"><?= htmlspecialchars($copy['open_tool']) ?></a>
</article>
<?php endforeach; ?>
</div>
</section>
<section class="workbench-panel workbench-panel--outputs" aria-labelledby="workbenchOutputsTitle">
<div class="workbench-section-head">
<p class="workbench-kicker">04</p>
<h2 id="workbenchOutputsTitle"><?= htmlspecialchars($copy['outputs_title']) ?></h2>
</div>
<div class="workbench-checklist">
<?php foreach (['lawyer', 'barnevernet_response', 'meeting_prep', 'strasbourg'] as $outputKey): ?>
<label class="workbench-check">
<input type="checkbox" name="outputs[]" value="<?= htmlspecialchars($outputKey) ?>">
<span><?= htmlspecialchars($copy['output_' . $outputKey]) ?></span>
</label>
<?php endforeach; ?>
</div>
<label class="workbench-field workbench-field--wide" for="wbNextStep">
<span><?= htmlspecialchars($copy['next_step']) ?></span>
<textarea id="wbNextStep" name="next_step" rows="4" placeholder="<?= htmlspecialchars($copy['next_step_hint']) ?>"></textarea>
</label>
</section>
</form>
</main>
<?php require_once __DIR__ . '/includes/footer.php'; ?>
<script src="assets/js/tools.js" defer></script>
<script src="assets/js/workbench.js" defer></script>
</body>
</html>