Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2026-03-20 16:55:49 +01:00
parent 7b320916af
commit 3b5122da5e

View File

@@ -5,23 +5,23 @@ import {
Button,
IconChevronDown,
Spinner,
Table,
Tbody,
Td,
Th,
Thead,
Table,
Tr,
} from "@probo/ui";
import {
type PreloadedQuery,
graphql,
type PreloadedQuery,
useFragment,
usePaginationFragment,
usePreloadedQuery,
} from "react-relay";
import type { AuditLogSettingsPageQuery } from "#/__generated__/iam/AuditLogSettingsPageQuery.graphql";
import type { AuditLogSettingsPageFragment$key } from "#/__generated__/iam/AuditLogSettingsPageFragment.graphql";
import type { AuditLogSettingsPageQuery } from "#/__generated__/iam/AuditLogSettingsPageQuery.graphql";
import type { AuditLogSettingsPageRefetchQuery } from "#/__generated__/iam/AuditLogSettingsPageRefetchQuery.graphql";
import type { AuditLogSettingsPageRowFragment$key } from "#/__generated__/iam/AuditLogSettingsPageRowFragment.graphql";
@@ -93,10 +93,10 @@ function ActionBadge({ action }: { action: string }) {
const verb = parts[parts.length - 1];
if (
verb === "create" ||
verb === "upload" ||
verb === "import" ||
verb === "publish"
verb === "create"
|| verb === "upload"
|| verb === "import"
|| verb === "publish"
) {
return <Badge variant="success" size="sm">{action}</Badge>;
}
@@ -104,10 +104,10 @@ function ActionBadge({ action }: { action: string }) {
return <Badge variant="danger" size="sm">{action}</Badge>;
}
if (
verb === "update" ||
verb === "assign" ||
verb === "unassign" ||
verb === "unarchive"
verb === "update"
|| verb === "assign"
|| verb === "unassign"
|| verb === "unarchive"
) {
return <Badge variant="warning" size="sm">{action}</Badge>;
}
@@ -169,13 +169,13 @@ export function AuditLogSettingsPage(props: {
throw new Error("Relay node is not an organization");
}
const { data, loadNext, hasNext, isLoadingNext } =
usePaginationFragment<
const { data, loadNext, hasNext, isLoadingNext }
= usePaginationFragment<
AuditLogSettingsPageRefetchQuery,
AuditLogSettingsPageFragment$key
>(auditLogSettingsPageFragment, organization);
const entries = data?.auditLogEntries?.edges?.map((e) => e.node) ?? [];
const entries = data?.auditLogEntries?.edges?.map(e => e.node) ?? [];
const totalCount = data?.auditLogEntries?.totalCount ?? 0;
return (
@@ -189,45 +189,47 @@ export function AuditLogSettingsPage(props: {
</p>
</div>
{entries.length === 0 ? (
<div className="text-center py-8">
<p className="text-sm text-txt-tertiary">
{__("No audit log entries yet.")}
</p>
</div>
) : (
<div className="space-y-4">
<p className="text-sm text-txt-tertiary">
{`${__("Showing")} ${entries.length} ${__("of")} ${totalCount} ${__("entries")}`}
</p>
<Table>
<Thead>
<Tr>
<Th>{__("Date")}</Th>
<Th>{__("Actor")}</Th>
<Th>{__("Action")}</Th>
<Th>{__("Resource")}</Th>
</Tr>
</Thead>
<Tbody>
{entries.map((entry) => (
<AuditLogEntryRow key={entry.id} entryKey={entry} />
))}
</Tbody>
</Table>
{hasNext && (
<Button
variant="tertiary"
onClick={() => loadNext(50)}
className="mx-auto"
disabled={isLoadingNext}
icon={isLoadingNext ? Spinner : IconChevronDown}
>
{__("Show more")}
</Button>
{entries.length === 0
? (
<div className="text-center py-8">
<p className="text-sm text-txt-tertiary">
{__("No audit log entries yet.")}
</p>
</div>
)
: (
<div className="space-y-4">
<p className="text-sm text-txt-tertiary">
{`${__("Showing")} ${entries.length} ${__("of")} ${totalCount} ${__("entries")}`}
</p>
<Table>
<Thead>
<Tr>
<Th>{__("Date")}</Th>
<Th>{__("Actor")}</Th>
<Th>{__("Action")}</Th>
<Th>{__("Resource")}</Th>
</Tr>
</Thead>
<Tbody>
{entries.map(entry => (
<AuditLogEntryRow key={entry.id} entryKey={entry} />
))}
</Tbody>
</Table>
{hasNext && (
<Button
variant="tertiary"
onClick={() => loadNext(50)}
className="mx-auto"
disabled={isLoadingNext}
icon={isLoadingNext ? Spinner : IconChevronDown}
>
{__("Show more")}
</Button>
)}
</div>
)}
</div>
)}
</div>
);
}