From 7a6d20cbed33ca32cf0096c94387335aaa3da3ca Mon Sep 17 00:00:00 2001 From: boban Date: Mon, 22 Jun 2026 00:44:03 +0200 Subject: [PATCH] =?UTF-8?q?fix(ui):=20add=20wire:key=20to=20list=20rows=20?= =?UTF-8?q?=E2=80=94=20stops=20"pending=20is=20not=20defined"=20(v0.9.53)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lists rendered loop rows without a wire:key. On re-render Livewire's morph matched rows by position and cloned them, dropping the inline Alpine x-data (modalTrigger) scope on the buttons — the console threw "Alpine Expression Error: pending is not defined" (and a follow-on "undefined is not valid JSON" as the snapshot merge broke). Reported in the file manager; the same pattern existed across the app. Added a stable wire:key to every loop whose rows carry inline Alpine / x-modal- trigger state: files (entries + breadcrumbs), services, the release-channel selector, settings (users, webauthn keys, login-protection bans) and the server detail page (hardening, firewall rules, SSH keys, fail2ban exceptions). Keys use a stable identifier (id / fingerprint / md5 of the natural key), not the loop index. 372 tests pass (the Livewire tests render these blades, so a broken key would fail them); /system, /settings, /files load 200 with no console errors. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 10 +++++++++- config/clusev.php | 2 +- resources/views/livewire/files/index.blade.php | 9 ++++++--- resources/views/livewire/servers/show.blade.php | 8 ++++---- resources/views/livewire/services/index.blade.php | 4 +++- .../views/livewire/settings/login-protection.blade.php | 2 +- resources/views/livewire/settings/users.blade.php | 2 +- .../views/livewire/settings/webauthn-keys.blade.php | 2 +- resources/views/livewire/system/index.blade.php | 3 +++ 9 files changed, 29 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f7db02..f0fba51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,15 @@ getaggte Releases (Kanal `stable`, optional `beta`) — niemals Entwicklungs-Bui _Keine offenen Änderungen — der nächste Stand wird hier gesammelt und als `vX.Y.Z` getaggt._ -## [0.9.52] - 2026-06-22 +## [0.9.53] - 2026-06-22 + +### Behoben +- **JavaScript-Fehler im Datei-Manager (und anderen Listen): „pending is not defined".** In Listen + ohne stabilen `wire:key` ordnete Livewires DOM-Abgleich die Zeilen beim Neu-Rendern nach Position + zu und verlor dabei den Alpine-Zustand der Buttons (Modal-Auslöser) — die Konsole warf „pending is + not defined" und Aktionen klemmten. Alle betroffenen Listen haben jetzt einen stabilen `wire:key`: + Datei-Manager (Einträge + Pfad), Dienste, Release-Kanal-Auswahl, Benutzer, Sicherheitsschlüssel, + IP-Sperren sowie die Server-Detailseite (Härtung, Firewall-Regeln, SSH-Schlüssel, fail2ban-Ausnahmen). ### Behoben - **Audit-Panel auf dem Dashboard zeigte noch Roh-Codes.** Die „letzten Ereignisse" auf dem Dashboard diff --git a/config/clusev.php b/config/clusev.php index 458b3d0..b5066e2 100644 --- a/config/clusev.php +++ b/config/clusev.php @@ -2,7 +2,7 @@ return [ // First tagged release is v0.1.0 (semantic, not -dev). - 'version' => '0.9.52', + 'version' => '0.9.53', // Deployed commit + branch. install.sh bakes these into .env from the host's .git (the prod // image ships no .git); the Versions page prefers them and falls back to a live .git read in diff --git a/resources/views/livewire/files/index.blade.php b/resources/views/livewire/files/index.blade.php index ba1d5c1..717145b 100644 --- a/resources/views/livewire/files/index.blade.php +++ b/resources/views/livewire/files/index.blade.php @@ -35,9 +35,9 @@ @foreach ($this->crumbs as $crumb) @if (! $loop->first) - / + / @endif -