diff --git a/src/pyob/pyob_dashboard.py b/src/pyob/pyob_dashboard.py
index 95409a3..a8c1029 100644
--- a/src/pyob/pyob_dashboard.py
+++ b/src/pyob/pyob_dashboard.py
@@ -66,6 +66,10 @@
Scanning structure...
+
Manual Override
@@ -94,7 +98,28 @@
document.getElementById('analysis').innerText = data.analysis || "Parsing...";
const queueDiv = document.getElementById('queue');
queueDiv.innerText = data.cascade_queue?.length > 0 ? data.cascade_queue.join('\\n') : "EMPTY";
- } catch (e) { document.getElementById('status-pill').innerText = "OFFLINE"; }
+
+ // Fetch pending patches and render them
+ const patchesResponse = await fetch('/api/pending_patches');
+ const patchesData = await patchesResponse.json();
+ const pendingPatchesDiv = document.getElementById('pending-patches');
+ if (patchesData.patches && patchesData.patches.length > 0) {
+ pendingPatchesDiv.innerHTML = patchesData.patches.map(patch => `
+
+
Patch ID: ${patch.id}
+
${patch.description || 'No description provided.'}
+
+
+
+ `).join('');
+ } else {
+ pendingPatchesDiv.innerText = "No pending patches.";
+ }
+
+ } catch (e) {
+ console.error("Error updating stats:", e);
+ document.getElementById('status-pill').innerText = "OFFLINE";
+ }
}
async function setManualTarget() {
@@ -108,6 +133,15 @@
document.getElementById('manualTargetFile').value = '';
}
+ async function reviewPatch(patchId, action) {
+ await fetch('/api/review_patch', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ patch_id: patchId, action: action })
+ });
+ updateStats(); // Refresh the dashboard after review
+ }
+
setInterval(updateStats, 3000);
updateStats();