feat(frontend): persist page filters in query params
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { useSearchParams } from "react-router-dom";
|
||||
import { History, ShieldCheck, SlidersHorizontal } from "lucide-react";
|
||||
import { toast } from "sonner";
|
||||
|
||||
@@ -14,6 +15,7 @@ import { LogsFeed } from "../components/logs/LogsFeed";
|
||||
import { LogsFilterBar, type LogsFilterDraft } from "../components/logs/LogsFilterBar";
|
||||
import { useWorkspace } from "../context/WorkspaceContext";
|
||||
import { useTranslation } from "../hooks/useTranslation";
|
||||
import { readStringParam, updateQueryParams } from "../lib/queryParams";
|
||||
import { canWorkspace, WORKSPACE_LOGS_VIEW } from "../lib/permissions";
|
||||
|
||||
const DEFAULT_FILTERS: LogsFilterDraft = {
|
||||
@@ -26,12 +28,22 @@ const DEFAULT_FILTERS: LogsFilterDraft = {
|
||||
ordering: "-timestamp",
|
||||
};
|
||||
|
||||
const DEFAULT_QUERY_FILTERS: Record<string, string> = {
|
||||
search: DEFAULT_FILTERS.search,
|
||||
section: DEFAULT_FILTERS.section,
|
||||
event: DEFAULT_FILTERS.event,
|
||||
actor: DEFAULT_FILTERS.actor,
|
||||
from: DEFAULT_FILTERS.from,
|
||||
to: DEFAULT_FILTERS.to,
|
||||
ordering: DEFAULT_FILTERS.ordering,
|
||||
};
|
||||
|
||||
const PAGE_SIZE = 20;
|
||||
|
||||
export default function Logs() {
|
||||
const { t, lang } = useTranslation();
|
||||
const { activeWorkspace } = useWorkspace();
|
||||
const [filters, setFilters] = useState<LogsFilterDraft>(DEFAULT_FILTERS);
|
||||
const [searchParams, setSearchParams] = useSearchParams();
|
||||
const [memberships, setMemberships] = useState<WorkspaceMembership[]>([]);
|
||||
const [logs, setLogs] = useState<WorkspaceLogItem[]>([]);
|
||||
const [totalLogs, setTotalLogs] = useState(0);
|
||||
@@ -45,9 +57,20 @@ export default function Logs() {
|
||||
const workspaceRole = activeWorkspace?.my_role;
|
||||
const canViewLogs = canWorkspace(workspaceRole, WORKSPACE_LOGS_VIEW);
|
||||
const isWorkspaceRoleResolved = Boolean(workspaceRole);
|
||||
const filters = useMemo<LogsFilterDraft>(
|
||||
() => ({
|
||||
search: readStringParam(searchParams, "search", DEFAULT_FILTERS.search),
|
||||
section: readStringParam(searchParams, "section", DEFAULT_FILTERS.section) as LogsFilterDraft["section"],
|
||||
event: readStringParam(searchParams, "event", DEFAULT_FILTERS.event) as LogsFilterDraft["event"],
|
||||
actor: readStringParam(searchParams, "actor", DEFAULT_FILTERS.actor),
|
||||
from: readStringParam(searchParams, "from", DEFAULT_FILTERS.from),
|
||||
to: readStringParam(searchParams, "to", DEFAULT_FILTERS.to),
|
||||
ordering: readStringParam(searchParams, "ordering", DEFAULT_FILTERS.ordering) as LogsFilterDraft["ordering"],
|
||||
}),
|
||||
[searchParams],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setFilters(DEFAULT_FILTERS);
|
||||
setLogs([]);
|
||||
setTotalLogs(0);
|
||||
setSelectedLogId(null);
|
||||
@@ -284,7 +307,25 @@ export default function Logs() {
|
||||
users={memberships}
|
||||
isLoadingUsers={isLoadingUsers}
|
||||
canSelectUsers={canViewLogs}
|
||||
onApply={setFilters}
|
||||
onApply={(nextFilters) =>
|
||||
setSearchParams(
|
||||
(current) =>
|
||||
updateQueryParams(
|
||||
current,
|
||||
{
|
||||
search: nextFilters.search,
|
||||
section: nextFilters.section,
|
||||
event: nextFilters.event,
|
||||
actor: nextFilters.actor,
|
||||
from: nextFilters.from,
|
||||
to: nextFilters.to,
|
||||
ordering: nextFilters.ordering,
|
||||
},
|
||||
DEFAULT_QUERY_FILTERS,
|
||||
),
|
||||
{ replace: true },
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
||||
<LogsFeed
|
||||
|
||||
Reference in New Issue
Block a user