feat: scan history browser, user-scoped viewer tokens, export fixes, email fixes (v1.6.20)
- Scan history browser (history.js, GET /api/db/sessions, get_sessions(), get_session_items(ref_scan_id)) — review any past session without rescanning - User-scoped viewer tokens (#34) — scope by individual employee across M365 and GWS; autocomplete from Accounts list; dual-email support - Fix: GWS scan never marked finished (end_scan → finish_scan) and emitted wrong SSE event (scan_done → google_scan_done), excluding GWS items from all exports - Fix: file scan begin_scan called with wrong keyword args (TypeError swallowed), so local/SMB items were never written to DB - Fix: Graph sendMail reported failure on success — _post() now returns {} on empty 202 response instead of raising JSONDecodeError - Fix: Graph error hidden behind generic "No SMTP host" message when both Graph and SMTP were unavailable - Fix: Gmail vs Google Workspace SMTP error messages distinguished by username domain; Workspace errors point to admin console, not personal security settings - Docs: update README, MANUAL-EN, MANUAL-DA, CLAUDE.md, TODO.md, CHANGELOG.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
e64d7eb958
commit
c9aab19a97
24 files changed
+753
-70
No files matched your search
+6
-1
@@ -399,6 +399,7 @@ function _attachScanListeners(source) {
|
||||
if (d.delta) checkDeltaStatus();
|
||||
markOverdueCards();
|
||||
loadTrend();
|
||||
window.invalidateHistoryCache?.();
|
||||
});
|
||||
source.addEventListener('google_scan_done', function(e) {
|
||||
var d = JSON.parse(e.data);
|
||||
@@ -427,6 +428,7 @@ function _attachScanListeners(source) {
|
||||
log('Google scan complete \u2014 ' + d.flagged_count + ' flagged of ' + d.total_scanned, 'ok');
|
||||
markOverdueCards();
|
||||
loadTrend();
|
||||
window.invalidateHistoryCache?.();
|
||||
});
|
||||
source.addEventListener('file_scan_done', function(e) {
|
||||
var d = JSON.parse(e.data);
|
||||
@@ -452,9 +454,10 @@ function _attachScanListeners(source) {
|
||||
applyFilters();
|
||||
}
|
||||
}
|
||||
log('Bestandsscan fuldført \u2014 ' + d.flagged_count + ' flagget af ' + d.total_scanned, 'ok');
|
||||
log('Bestandsscan fuldf\u00f8rt \u2014 ' + d.flagged_count + ' flagget af ' + d.total_scanned, 'ok');
|
||||
markOverdueCards();
|
||||
loadTrend();
|
||||
window.invalidateHistoryCache?.();
|
||||
});
|
||||
// sse_replay_done marks end of buffer replay — log a note so the user knows
|
||||
// earlier events above were replayed from an already-running scan
|
||||
@@ -520,6 +523,8 @@ function startScan(resume) {
|
||||
document.getElementById('statsSection').style.display = 'none';
|
||||
document.getElementById('statsPill').style.display = 'none';
|
||||
}
|
||||
// Exit history mode — live SSE takes over
|
||||
window.exitHistoryMode?.();
|
||||
document.getElementById('resumeBanner').style.display = 'none';
|
||||
document.getElementById('logPanel').innerHTML = '<div class="log-line log-live" id="logLive" style="display:none"></div>';
|
||||
try { sessionStorage.removeItem(_LOG_SESSION_KEY); } catch(e) {}
|
||||
|
||||
Reference in new issue
Block a user