+ {/* Quick-filter pills. Failed-only is the most common
admin "is something wrong" question — keep the one-tap shortcut. */}
-
-
{
- setPage(1);
- setActor(e.target.value);
- }}
- aria-label={t("admin.section.auditLog.filterActor")}
- />
+ {/* Detailed filter row */}
+
+ {
+ setPage(1);
+ setActor(e.target.value);
+ }}
+ aria-label={t("admin.section.auditLog.filterActor")}
+ />
+
+ {
+ setPage(1);
+ setTarget(e.target.value);
+ }}
+ aria-label={t("admin.section.auditLog.filterTarget")}
+ />
+
+
+
+ {/* Toolbar row: per-page + export */}
+
+
+
+ {t("admin.section.auditLog.perPage")}
+
- {
- setPage(1);
- setTarget(e.target.value);
- }}
- aria-label={t("admin.section.auditLog.filterTarget")}
- />
-
+
+
- {/* Toolbar row: per-page + export */}
-
-
-
- {t("admin.section.auditLog.perPage")}
-
-
-
-
+ {isLoading ? (
+
+
-
- {isLoading ? (
-
-
-
- ) : !entries.length ? (
-
}
- title={
- filter === "failed"
- ? t("admin.loginEmptyFailedTitle")
- : t("admin.section.auditLog.empty")
- }
- description={
- filter === "failed"
- ? t("admin.loginEmptyFailedDescription")
- : t("admin.loginEmptyDescription")
- }
- action={
- filter === "failed" ? (
-
- ) : undefined
- }
- />
- ) : (
-
-
-
-
- |
- {t("admin.status")}
- |
-
- {t("admin.users")}
- |
-
- {t("admin.action")}
- |
-
- {t("admin.provider")}
- |
-
- {t("admin.ip")}
- |
- {/*
+ ) : !entries.length ? (
+ }
+ title={
+ filter === "failed"
+ ? t("admin.loginEmptyFailedTitle")
+ : t("admin.section.auditLog.empty")
+ }
+ description={
+ filter === "failed"
+ ? t("admin.loginEmptyFailedDescription")
+ : t("admin.loginEmptyDescription")
+ }
+ action={
+ filter === "failed" ? (
+
+ ) : undefined
+ }
+ />
+ ) : (
+
+
+
+
+ |
+ {t("admin.status")}
+ |
+
+ {t("admin.users")}
+ |
+
+ {t("admin.action")}
+ |
+
+ {t("admin.provider")}
+ |
+
+ {t("admin.ip")}
+ |
+ {/*
v1.4.25 W8b — Standort column. Previously rendered
`text-right`, which on wide audit tables let the
`Berlin, DE` label drift to the table edge and
@@ -408,103 +390,102 @@ export function LoginOverviewSection() {
consistency) makes Standort a first-class column
that admins actually notice.
*/}
-
-
-
- {t("admin.location")}
-
- |
-
- {t("admin.timestamp")}
- |
-
-
-
- {entries.map((entry, i) => {
- const isFailed = entry.action === "auth.login.failed";
- const provider = providerForAction(entry.action);
- const ProviderIcon = iconForAuthProvider(provider);
- return (
-
+
+
+ {t("admin.location")}
+
+
+ |
+ {t("admin.timestamp")}
+ |
+
+
+
+ {entries.map((entry, i) => {
+ const isFailed = entry.action === "auth.login.failed";
+ const provider = providerForAction(entry.action);
+ const ProviderIcon = iconForAuthProvider(provider);
+ return (
+
+ |
+ {isFailed ? (
+
+ ) : (
+
+ )}
+ |
+
- |
- {isFailed ? (
-
- ) : (
-
- )}
- |
-
- {entry.user?.username ?? t("common.unknown")}
- |
-
- {AUTH_ACTION_LABELS[entry.action] ?? entry.action}
- |
-
-
-
- {AUTH_PROVIDER_LABELS[provider]}
-
- |
-
- {entry.ipAddress ?? "—"}
- |
-
- {entry.location ?? "—"}
- |
-
- {formatDateTime(entry.createdAt)}
- |
-
- );
- })}
-
-
-
+ {entry.user?.username ?? t("common.unknown")}
+
+
+ {AUTH_ACTION_LABELS[entry.action] ?? entry.action}
+ |
+
+
+
+ {AUTH_PROVIDER_LABELS[provider]}
+
+ |
+
+ {entry.ipAddress ?? "—"}
+ |
+
+ {entry.location ?? "—"}
+ |
+
+ {formatDateTime(entry.createdAt)}
+ |
+
+ );
+ })}
+
+
+
+
+ {t("admin.showingEntries", {
+ count: entries.length,
+ total,
+ })}
+
+
+
- {t("admin.showingEntries", {
- count: entries.length,
- total,
+ {t("admin.section.auditLog.pageOf", {
+ page,
+ total: lastPage,
})}
-
-
-
- {t("admin.section.auditLog.pageOf", {
- page,
- total: lastPage,
- })}
-
-
-
+
- )}
-
- )}
+
+ )}
+