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>
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
const form = document.getElementById('workbenchForm');
|
||||
const clearButton = document.getElementById('workbenchClear');
|
||||
const status = document.getElementById('workbenchStatus');
|
||||
const storageKey = 'dbn.caseWorkbench.v1';
|
||||
let statusTimer = 0;
|
||||
|
||||
if (!form) {
|
||||
return;
|
||||
}
|
||||
|
||||
function setStatus(message) {
|
||||
if (!status) {
|
||||
return;
|
||||
}
|
||||
status.textContent = message;
|
||||
window.clearTimeout(statusTimer);
|
||||
statusTimer = window.setTimeout(function () {
|
||||
status.textContent = '';
|
||||
}, 2200);
|
||||
}
|
||||
|
||||
function collect() {
|
||||
const data = {};
|
||||
const fields = form.querySelectorAll('input, select, textarea');
|
||||
fields.forEach(function (field) {
|
||||
if (!field.name) {
|
||||
return;
|
||||
}
|
||||
if (field.type === 'checkbox') {
|
||||
if (!Array.isArray(data[field.name])) {
|
||||
data[field.name] = [];
|
||||
}
|
||||
if (field.checked) {
|
||||
data[field.name].push(field.value);
|
||||
}
|
||||
return;
|
||||
}
|
||||
data[field.name] = field.value;
|
||||
});
|
||||
data.saved_at = new Date().toISOString();
|
||||
return data;
|
||||
}
|
||||
|
||||
function restore(data) {
|
||||
if (!data || typeof data !== 'object') {
|
||||
return;
|
||||
}
|
||||
const fields = form.querySelectorAll('input, select, textarea');
|
||||
fields.forEach(function (field) {
|
||||
if (!field.name) {
|
||||
return;
|
||||
}
|
||||
if (field.type === 'checkbox') {
|
||||
const values = Array.isArray(data[field.name]) ? data[field.name] : [];
|
||||
field.checked = values.indexOf(field.value) !== -1;
|
||||
return;
|
||||
}
|
||||
if (Object.prototype.hasOwnProperty.call(data, field.name)) {
|
||||
field.value = data[field.name] || '';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function save() {
|
||||
try {
|
||||
window.sessionStorage.setItem(storageKey, JSON.stringify(collect()));
|
||||
setStatus('Saved in this browser session.');
|
||||
} catch (error) {
|
||||
setStatus('Could not save this session locally.');
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const raw = window.sessionStorage.getItem(storageKey);
|
||||
if (raw) {
|
||||
restore(JSON.parse(raw));
|
||||
setStatus('Restored local workbench notes.');
|
||||
}
|
||||
} catch (error) {
|
||||
window.sessionStorage.removeItem(storageKey);
|
||||
}
|
||||
|
||||
form.addEventListener('input', save);
|
||||
form.addEventListener('change', save);
|
||||
|
||||
if (clearButton) {
|
||||
clearButton.addEventListener('click', function () {
|
||||
window.sessionStorage.removeItem(storageKey);
|
||||
form.reset();
|
||||
setStatus('Workbench session cleared.');
|
||||
});
|
||||
}
|
||||
}());
|
||||
Reference in New Issue
Block a user