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
+25 -13
View File
@@ -151,19 +151,19 @@ final class LogTab implements AdminTab
$filters = $this->filters();
$extra = $this->extraFilters();
return new LogListTable($this->log, $filters + $extra, $this->toolLabels());
}
/** @return array<string, string> ability name => label */
private function toolLabels(): array
{
$labels = [];
foreach ($this->registry->abilities() as $ability) {
$labels[$ability->name()] = $ability->label();
}
return new LogListTable(
$this->log,
$filters + $extra,
function () use ($filters, $extra, $labels): void {
$this->renderFilterControls($filters, $extra, $labels);
},
$labels
);
return $labels;
}
public function render(): void
@@ -190,12 +190,20 @@ final class LogTab implements AdminTab
echo '<form method="get">';
printf('<input type="hidden" name="page" value="%s">', esc_attr(SettingsPage::SLUG));
printf('<input type="hidden" name="tab" value="%s">', esc_attr($this->slug()));
// Own block, not the table nav: core hides ".tablenav .actions" on phones.
echo '<div class="lit-mcp-log-filters">';
$this->renderFilterControls($this->filters(), $this->extraFilters(), $this->toolLabels());
echo '</div>';
$table = $this->table ?? $this->createTable();
$table->prepare_items();
$table->display();
echo '</form>';
$this->renderClearForm();
// The whole log, not the filtered page: "leeren" removes everything.
$total = $this->log->count();
if ($total > 0) {
$this->renderClearForm($total);
}
}
/**
@@ -306,9 +314,9 @@ final class LogTab implements AdminTab
);
}
private function renderClearForm(): void
private function renderClearForm(int $total): void
{
printf('<form method="post" action="%s">', esc_url(admin_url('admin-post.php')));
printf('<div class="lit-mcp-clear-log"><form method="post" action="%s">', esc_url(admin_url('admin-post.php')));
printf('<input type="hidden" name="action" value="%s">', esc_attr(self::CLEAR_ACTION));
wp_nonce_field(self::CLEAR_ACTION);
$confirmMessage = esc_js(__(
@@ -316,13 +324,17 @@ final class LogTab implements AdminTab
'wp-lit-mcp'
));
submit_button(
__('Protokoll leeren', 'wp-lit-mcp'),
sprintf(
/* translators: %d: number of log entries */
_n('Protokoll leeren (%d Eintrag)', 'Protokoll leeren (%d Einträge)', $total, 'wp-lit-mcp'),
$total
),
'delete',
'submit',
false,
['onclick' => "return window.confirm('" . $confirmMessage . "');"]
);
echo '</form>';
echo '</form></div>';
}
public function handleClear(): void