fix: Admin-UX aus dem Review – Live-Gruppenfeedback, Protokollfilter, Divi-Hinweis, Rollen-Rückfrage

- Tools: „Ganze Gruppe“ und „Nur lesen“ wirken sofort auf die Zeilen
  (Option „wie Gruppe (…)“, gesperrte Selects mit Hinweis), der Server
  bleibt die Wahrheit; Markup trägt die nötigen data-Attribute.
- Protokoll: Filter in eigenem Block über der Tabelle (Core blendet
  .tablenav .actions auf Telefonen aus); „Protokoll leeren“ nur bei
  Einträgen, rechtsbündig, mit Gesamtzahl über ChangeLog::count().
- Divi: Beschreibung unter „Prüfung starten“, Button primär solange
  ungetestet ohne frischen Bericht.
- Zugriff: Rückfrage vor dem Speichern ohne Rolle oder ohne eigene Rolle.
- Verbindung: HTTPS-Hinweis nicht doppelt neben der Statusliste.
- Mobil: breitere Einstellungs-Spalte im Tools-Reiter.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-08 16:39:44 +02:00
co-authored by Claude Fable 5.1
parent cc72f9b946
commit 1b73f0652a
17 changed files with 462 additions and 150 deletions
+36 -6
View File
@@ -200,7 +200,7 @@ final class ToolsTabTest extends TestCase
self::assertStringContainsString('name="lit_mcp_exposure[@readonly:divi]" value="1" checked="checked"', $html);
$update = $this->row($html, 'lit/divi-update');
self::assertStringContainsString('<select name="lit_mcp_exposure[lit/divi-update]" disabled', $update);
self::assertMatchesRegularExpression('#<select name="lit_mcp_exposure\[lit/divi-update\]"[^>]* disabled#', $update);
self::assertStringContainsString('Durch „Nur lesen“ aus', $update);
self::assertStringContainsString(
'<input type="hidden" name="lit_mcp_exposure[lit/divi-update]" value="indirect">',
@@ -211,6 +211,36 @@ final class ToolsTabTest extends TestCase
self::assertStringNotContainsString('Nur lesen', $outline);
}
/** The admin script mirrors a group's mode and "nur lesen" switch onto its rows before saving. */
public function testMarkupCarriesWhatTheScriptNeedsForLiveGroupFeedback(): void
{
$html = $this->render([]);
self::assertStringContainsString('<div class="lit-mcp-groups" data-like-group="wie Gruppe (%s)">', $html);
self::assertStringContainsString('class="lit-mcp-group-mode"', $this->select($html, '@group:divi'));
self::assertStringContainsString('class="lit-mcp-group-readonly"', $this->group($html, 'Divi'));
$update = $this->select($html, 'lit/divi-update');
self::assertStringContainsString('class="lit-mcp-tool-mode"', $update);
self::assertStringContainsString('data-default-label="Standard (direkt)"', $update);
self::assertStringContainsString('data-writes="1"', $update);
self::assertStringNotContainsString('data-writes', $this->select($html, 'lit/divi-outline'));
self::assertStringContainsString('data-required="1"', $this->select($html, 'lit/guide'));
self::assertStringContainsString('data-direct-only="1"', $this->select($html, 'lit/media-preview'));
self::assertStringNotContainsString('data-direct-only', $update);
// Every write row carries the "nur lesen" note, hidden until the switch is on.
self::assertStringContainsString(
'<p class="description lit-mcp-readonly-note" hidden>Durch „Nur lesen“ aus</p>',
$this->row($html, 'lit/divi-update')
);
self::assertStringNotContainsString('lit-mcp-readonly-note', $this->row($html, 'lit/divi-outline'));
$locked = $this->render(['@readonly:divi' => true]);
self::assertStringContainsString(
'<p class="description lit-mcp-readonly-note">Durch „Nur lesen“ aus</p>',
$this->row($locked, 'lit/divi-update')
);
}
public function testCountsDirectToolsUnderTheSavedSettings(): void
{
$html = $this->render(['@group:divi' => 'disabled']);
@@ -338,7 +368,7 @@ final class ToolsTabTest extends TestCase
$html = $this->render([]);
$divi = $this->group($html, 'Divi');
self::assertStringContainsString('<div id="lit-mcp-group-divi" class="postbox lit-mcp-group">', $divi);
self::assertStringContainsString('<div id="lit-mcp-group-divi" class="postbox lit-mcp-group" data-group="divi">', $divi);
self::assertStringContainsString('<div class="postbox-header">', $divi);
self::assertStringContainsString('<button type="button" class="handlediv" aria-expanded="true">', $divi);
self::assertStringContainsString('<span class="screen-reader-text">Gruppe ein-/ausblenden: Divi</span>', $divi);
@@ -367,11 +397,11 @@ final class ToolsTabTest extends TestCase
$default = $this->render(['@group:divi' => 'disabled']);
$saved = $this->render(['@group:divi' => 'disabled'], null, ['lit-mcp-group-media']);
self::assertStringContainsString('<div id="lit-mcp-group-divi" class="postbox lit-mcp-group closed">', $default);
self::assertStringContainsString('<div id="lit-mcp-group-divi" class="postbox lit-mcp-group closed" data-group="divi">', $default);
self::assertStringContainsString('<button type="button" class="handlediv" aria-expanded="false">', $this->group($default, 'Divi'));
self::assertStringContainsString('<div id="lit-mcp-group-media" class="postbox lit-mcp-group">', $default);
self::assertStringContainsString('<div id="lit-mcp-group-media" class="postbox lit-mcp-group" data-group="media">', $default);
self::assertStringContainsString('<div id="lit-mcp-group-divi" class="postbox lit-mcp-group">', $saved);
self::assertStringContainsString('<div id="lit-mcp-group-media" class="postbox lit-mcp-group closed">', $saved);
self::assertStringContainsString('<div id="lit-mcp-group-divi" class="postbox lit-mcp-group" data-group="divi">', $saved);
self::assertStringContainsString('<div id="lit-mcp-group-media" class="postbox lit-mcp-group closed" data-group="media">', $saved);
}
}