diff --git a/src/Api.ps1 b/src/Api.ps1 index 05ae7fa..622edb2 100644 --- a/src/Api.ps1 +++ b/src/Api.ps1 @@ -1622,7 +1622,7 @@ function Invoke-DeviceActionEndpoint { if ($err) { return $err } $action = [string]$Body.action - $allowed = @('syncDevice','rebootNow','remoteLock','collectDiagnostics','rotateBitLockerKeys','retire','autopilotReset') + $allowed = @('syncDevice','rebootNow','remoteLock','collectDiagnostics','rotateBitLockerKeys','retire','autopilotReset','wipe') if ($action -notin $allowed) { return @{ statusCode = 400; error = "Unbekannte Aktion: $action" } } @@ -1630,6 +1630,10 @@ function Invoke-DeviceActionEndpoint { if ($action -eq 'autopilotReset') { $uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/$DeviceId/wipe" $bodyJson = '{"keepEnrollmentData":true,"keepUserData":false}' + } elseif ($action -eq 'wipe') { + $keepUserData = if ($Body.keepUserData) { 'true' } else { 'false' } + $uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/$DeviceId/wipe" + $bodyJson = "{""keepEnrollmentData"":false,""keepUserData"":$keepUserData}" } else { $uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/$DeviceId/$action" $bodyJson = '{}' diff --git a/www/app.js b/www/app.js index 2612265..2962669 100644 --- a/www/app.js +++ b/www/app.js @@ -5395,6 +5395,25 @@ function devRenderDetail(d) { if (autopilotBtn) autopilotBtn.style.display = isWin ? '' : 'none'; } +// Wipe-Dialog (Promise: true=keepUserData, false=löschen, null=abgebrochen) +function devWipeDialog(deviceName) { + return new Promise(resolve => { + document.getElementById('wipeDeviceName').textContent = deviceName; + document.getElementById('wipeKeepUserData').checked = false; + const backdrop = document.getElementById('wipeModalBackdrop'); + backdrop.classList.remove('hidden'); + + const close = (result) => { + backdrop.classList.add('hidden'); + resolve(result); + }; + document.getElementById('wipeCancel').onclick = () => close(null); + document.getElementById('wipeModalClose').onclick = () => close(null); + document.getElementById('wipeConfirm').onclick = () => close(document.getElementById('wipeKeepUserData').checked); + backdrop.onclick = (e) => { if (e.target === backdrop) close(null); }; + }); +} + // Aktion ausführen document.getElementById('devActions')?.addEventListener('click', async (e) => { const btn = e.target.closest('.dev-action-btn'); @@ -5409,10 +5428,38 @@ document.getElementById('devActions')?.addEventListener('click', async (e) => { collectDiagnostics: 'Diagnose sammeln', rotateBitLockerKeys: 'BitLocker-Schlüssel rotieren', autopilotReset: 'Autopilot Reset', - retire: 'Retire (MDM entfernen)' + retire: 'Retire (MDM entfernen)', + wipe: 'Wipe' }; - const isDangerous = action === 'retire' || action === 'autopilotReset'; const devName = DevState.selected.DeviceName || DevState.selected.Id; + + // Wipe: eigener Dialog mit Benutzerdaten-Option + if (action === 'wipe') { + const keepUserData = await devWipeDialog(devName); + if (keepUserData === null) return; + btn.disabled = true; + const origText2 = btn.textContent.trim(); + btn.textContent = '…'; + try { + await api(`/api/devices/${encodeURIComponent(DevState.selected.Id)}/action`, { + method: 'POST', + body: JSON.stringify({ action: 'wipe', keepUserData }) + }); + toast(`Wipe gesendet${keepUserData ? ' (Benutzerdaten behalten)' : ''}`, 'ok'); + DevState.items = DevState.items.filter(d => d.Id !== DevState.selected.Id); + DevState.selected = null; + document.getElementById('devDetail').classList.add('hidden'); + devApplyFilters(); + } catch (e) { + toast(`Fehler bei Wipe: ${e}`, 'error'); + } finally { + btn.disabled = false; + btn.textContent = origText2; + } + return; + } + + const isDangerous = action === 'retire' || action === 'autopilotReset'; const dangerMsg = { retire: `ACHTUNG: "Retire" auf "${devName}" ausführen?\n\nDas MDM-Profil wird entfernt — Gerät wird nicht mehr verwaltet.`, autopilotReset: `ACHTUNG: "Autopilot Reset" auf "${devName}" ausführen?\n\nDas Gerät wird auf OOBE zurückgesetzt. Enrollment-Daten bleiben erhalten, Benutzerdaten werden gelöscht.` @@ -5431,7 +5478,6 @@ document.getElementById('devActions')?.addEventListener('click', async (e) => { }); toast(`${labels[action]}: Aktion wurde gesendet`, 'ok'); if (action === 'retire') { - // Gerät aus Liste entfernen DevState.items = DevState.items.filter(d => d.Id !== DevState.selected.Id); DevState.selected = null; document.getElementById('devDetail').classList.add('hidden'); diff --git a/www/index.html b/www/index.html index 27c5780..1c3d7bb 100644 --- a/www/index.html +++ b/www/index.html @@ -548,12 +548,37 @@ Retire + + +
+ diff --git a/www/styles.css b/www/styles.css index facd430..e2b13b9 100644 --- a/www/styles.css +++ b/www/styles.css @@ -5214,7 +5214,7 @@ body.read-only .app-row { border-bottom: 1px solid var(--hairline-soft); flex-shrink: 0; } -.dev-toolbar .search-wrap { flex: 1; max-width: 380px; } +.dev-toolbar .search-wrap { flex: 1; max-width: 600px; } .input-select { padding: 5px 8px; border: 1px solid var(--hairline);