1246b7a804
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>
97 lines
2.4 KiB
JavaScript
97 lines
2.4 KiB
JavaScript
(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.');
|
|
});
|
|
}
|
|
}());
|