Merge branch 'dev' into feat/ip-filtering

This commit is contained in:
Fred KISSIE
2026-08-21 23:24:09 +02:00
622 changed files with 64427 additions and 8040 deletions
+74 -4
View File
@@ -2,9 +2,11 @@
import { ColumnFilter } from "@app/components/ColumnFilter";
import { DateTimeValue } from "@app/components/DateTimePicker";
import { LogDataTable } from "@app/components/LogDataTable";
import LogRetentionWarning from "@app/components/LogRetentionWarning";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { Button } from "@app/components/ui/button";
import { useEnvContext } from "@app/hooks/useEnvContext";
import { useOrgContext } from "@app/hooks/useOrgContext";
import { toast } from "@app/hooks/useToast";
import { createApiClient } from "@app/lib/api";
import { useTranslations } from "next-intl";
@@ -31,6 +33,8 @@ export default function GeneralPage() {
const { orgId } = useParams();
const searchParams = useSearchParams();
const { org } = useOrgContext();
const [isExporting, startTransition] = useTransition();
const [currentPage, setCurrentPage] = useState<number>(0);
@@ -155,6 +159,23 @@ export default function GeneralPage() {
setCurrentPage(newPage);
};
const handleRefresh = () => {
// When the end date has no explicit time, it represents an
// open-ended "up to now" upper bound. Since dateRange is only
// recomputed on user interaction, that upper bound otherwise stays
// frozen at whenever the page first loaded, so refreshing would
// never surface logs created since then. Bump it to the current
// time so the query key changes and refetches the latest window.
if (dateRange.endDate?.date && !dateRange.endDate.time) {
setDateRange((prev) => ({
...prev,
endDate: { date: new Date() }
}));
} else {
refetch();
}
};
const handlePageSizeChange = (newPageSize: number) => {
setPageSize(newPageSize);
setCurrentPage(0);
@@ -259,6 +280,7 @@ export default function GeneralPage() {
// 106 - Valid email
// 107 - Valid SSO
// 108 - Connected Client
// 109 - Valid Virtual API Key
// 201 - Resource Not Found
// 202 - Resource Blocked
@@ -277,6 +299,7 @@ export default function GeneralPage() {
106: t("validEmail"),
107: t("validSSO"),
108: t("connectedClient"),
109: t("validVirtualAPIKey"),
201: t("resourceNotFound"),
202: t("resourceBlocked"),
203: t("droppedByRule"),
@@ -357,7 +380,14 @@ export default function GeneralPage() {
}
/>
</span>
)
),
cell: ({ row }) => {
return row.original.ip ? (
row.original.ip
) : (
<span className="text-xs text-muted-foreground">-</span>
);
}
},
{
accessorKey: "location",
@@ -422,6 +452,14 @@ export default function GeneralPage() {
);
},
cell: ({ row }) => {
if (
!row.original.resourceNiceId ||
!row.original.resourceName
) {
return (
<span className="text-xs text-muted-foreground">-</span>
);
}
return (
<Link
href={
@@ -464,6 +502,11 @@ export default function GeneralPage() {
);
},
cell: ({ row }) => {
if (!row.original.host) {
return (
<span className="text-xs text-muted-foreground">-</span>
);
}
return (
<span className="flex items-center gap-1">
{row.original.tls ? (
@@ -496,6 +539,13 @@ export default function GeneralPage() {
/>
</div>
);
},
cell: ({ row }) => {
return row.original.path ? (
row.original.path
) : (
<span className="text-xs text-muted-foreground">-</span>
);
}
},
@@ -530,6 +580,13 @@ export default function GeneralPage() {
/>
</div>
);
},
cell: ({ row }) => {
return row.original.method ? (
row.original.method
) : (
<span className="text-xs text-muted-foreground">-</span>
);
}
},
{
@@ -572,7 +629,11 @@ export default function GeneralPage() {
cell: ({ row }) => {
return (
<span className="flex items-center gap-1">
{reasonMap[row.original.reason]}
{reasonMap[row.original.reason] ?? (
<span className="text-xs text-muted-foreground">
-
</span>
)}
</span>
);
}
@@ -611,7 +672,9 @@ export default function GeneralPage() {
{row.original.actor}
</>
) : (
<>-</>
<span className="text-xs text-muted-foreground">
-
</span>
)}
</span>
);
@@ -685,13 +748,20 @@ export default function GeneralPage() {
description={t("requestLogsDescription")}
/>
{org.org.settingsLogRetentionDaysRequest === 0 && (
<LogRetentionWarning
orgId={orgId as string}
logTypeLabel={t("requestLogs")}
/>
)}
<LogDataTable
columns={columns}
data={rows}
title={t("requestLogs")}
searchPlaceholder={t("searchLogs")}
searchColumn="host"
onRefresh={() => refetch()}
onRefresh={handleRefresh}
isRefreshing={isFetching}
onExport={() => startTransition(exportData)}
isExporting={isExporting}