> ScanGitHub(CancellationToken ct)
{
diff --git a/wwwroot/index.html b/wwwroot/index.html
index b0029ad..1396bc0 100644
--- a/wwwroot/index.html
+++ b/wwwroot/index.html
@@ -580,7 +580,9 @@
Key Scanner
-
+
+
+
diff --git a/wwwroot/js/api.js b/wwwroot/js/api.js
index 4216ebf..900569d 100644
--- a/wwwroot/js/api.js
+++ b/wwwroot/js/api.js
@@ -226,7 +226,7 @@ function apiCheckApiKey(id) { return _post('/api/admin/api-keys/' + id + '/check
// ── Key Scanner API (Admin) ──
-function apiTriggerScan() { return _post('/api/admin/api-keys/scan', undefined, 'Fehler beim Starten des Scans'); }
+function apiTriggerScan(mode) { return _post('/api/admin/api-keys/scan?mode=' + (mode || 'full'), undefined, 'Fehler beim Starten des Scans'); }
function apiScanStatus() { return _get('/api/admin/api-keys/scan/status', {}); }
function apiGetScannedKeys() { return _get('/api/admin/api-keys/scanned', []); }
function apiRecheckScannedKey(id) { return _post('/api/admin/api-keys/scanned/' + id + '/recheck', undefined, 'Fehler beim Prüfen'); }
diff --git a/wwwroot/js/pages/api-keys-page.js b/wwwroot/js/pages/api-keys-page.js
index ffd1610..597b6c4 100644
--- a/wwwroot/js/pages/api-keys-page.js
+++ b/wwwroot/js/pages/api-keys-page.js
@@ -318,7 +318,10 @@ registerPage('api-keys', {
// ── Scanner UI ──
- var scanBtn = document.getElementById('scanTriggerBtn');
+ var scanQuickBtn = document.getElementById('scanQuickBtn');
+ var scanWebBtn = document.getElementById('scanWebBtn');
+ var scanFullBtn = document.getElementById('scanFullBtn');
+ var scanBtns = [scanQuickBtn, scanWebBtn, scanFullBtn];
var scanStatusEl = document.getElementById('scanStatus');
var scannedList = document.getElementById('scannedKeysList');
var scannedKeys = [];
@@ -435,14 +438,29 @@ registerPage('api-keys', {
} catch (err) { showToast(err.message, 'error'); }
}
+ var scanBtnDefaults = [
+ { btn: scanQuickBtn, icon: 'fa-bolt', label: 'Quick' },
+ { btn: scanWebBtn, icon: 'fa-globe', label: 'Web' },
+ { btn: scanFullBtn, icon: 'fa-search', label: 'Full' }
+ ];
+
+ function setScanButtonsDisabled(disabled) {
+ scanBtnDefaults.forEach(function(d) { d.btn.disabled = disabled; });
+ }
+
+ function resetScanButtons() {
+ scanBtnDefaults.forEach(function(d) {
+ d.btn.innerHTML = ' ' + d.label;
+ d.btn.disabled = false;
+ });
+ }
+
async function updateScanStatus() {
try {
var s = await apiScanStatus();
if (s.running) {
scanStatusEl.textContent = '⏳ Scan läuft…';
- scanBtn.disabled = true;
- scanBtn.innerHTML = ' Läuft…';
- // Polling starten wenn noch nicht aktiv
+ setScanButtonsDisabled(true);
if (!pollTimer) {
pollTimer = setInterval(async function() {
var st = await apiScanStatus();
@@ -450,15 +468,13 @@ registerPage('api-keys', {
if (!st.running) {
clearInterval(pollTimer);
pollTimer = null;
- scanBtn.disabled = false;
- scanBtn.innerHTML = ' Jetzt scannen';
+ resetScanButtons();
scanStatusEl.textContent = st.lastResult ? '✅ ' + st.lastResult : '';
}
}, 3000);
}
} else {
- scanBtn.disabled = false;
- scanBtn.innerHTML = ' Jetzt scannen';
+ resetScanButtons();
if (s.lastResult) {
var timeStr = s.lastRun ? new Date(s.lastRun).toLocaleString() + ' – ' : '';
scanStatusEl.textContent = timeStr + s.lastResult;
@@ -467,15 +483,22 @@ registerPage('api-keys', {
} catch (err) { /* ignore */ }
}
- scanBtn.addEventListener('click', async function() {
+ async function triggerScan(mode, btn) {
try {
- await apiTriggerScan();
- showToast('Scan gestartet');
+ btn.innerHTML = ' Läuft…';
+ setScanButtonsDisabled(true);
+ await apiTriggerScan(mode);
+ showToast(mode.charAt(0).toUpperCase() + mode.slice(1) + '-Scan gestartet');
await updateScanStatus();
} catch (err) {
showToast(err.message, 'error');
+ resetScanButtons();
}
- });
+ }
+
+ scanQuickBtn.addEventListener('click', function() { triggerScan('quick', scanQuickBtn); });
+ scanWebBtn.addEventListener('click', function() { triggerScan('web', scanWebBtn); });
+ scanFullBtn.addEventListener('click', function() { triggerScan('full', scanFullBtn); });
await loadScannedKeys();
await updateScanStatus();