mirror of
https://github.com/andwati/dokploy.git
synced 2026-11-08 04:55:17 +00:00
feat: add user filtering to session management and update search functionality
This commit is contained in:
@@ -84,10 +84,14 @@ export const ShowSessions = () => {
|
|||||||
} = api.user.listSessions.useQuery();
|
} = api.user.listSessions.useQuery();
|
||||||
const { mutateAsync: revoke, isPending: isRevoking } =
|
const { mutateAsync: revoke, isPending: isRevoking } =
|
||||||
api.user.revokeSession.useMutation();
|
api.user.revokeSession.useMutation();
|
||||||
|
const { data: members } = api.user.all.useQuery(undefined, {
|
||||||
|
enabled: isOwner,
|
||||||
|
});
|
||||||
|
|
||||||
const [statusFilter, setStatusFilter] = useState<
|
const [statusFilter, setStatusFilter] = useState<
|
||||||
"all" | "active" | "expired"
|
"all" | "active" | "expired"
|
||||||
>("all");
|
>("all");
|
||||||
|
const [userFilter, setUserFilter] = useState("all");
|
||||||
const [globalFilter, setGlobalFilter] = useState("");
|
const [globalFilter, setGlobalFilter] = useState("");
|
||||||
const [sorting, setSorting] = useState<SortingState>([
|
const [sorting, setSorting] = useState<SortingState>([
|
||||||
{ id: "createdAt", desc: true },
|
{ id: "createdAt", desc: true },
|
||||||
@@ -119,23 +123,21 @@ export const ShowSessions = () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isOwner && userFilter !== "all") {
|
||||||
|
list = list.filter((s) => s.userId === userFilter);
|
||||||
|
}
|
||||||
|
|
||||||
if (globalFilter.trim()) {
|
if (globalFilter.trim()) {
|
||||||
const query = globalFilter.toLowerCase();
|
const query = globalFilter.toLowerCase();
|
||||||
list = list.filter((s) =>
|
list = list.filter((s) =>
|
||||||
[
|
[s.ipAddress, s.userAgent ? parseUserAgent(s.userAgent) : null]
|
||||||
s.firstName,
|
|
||||||
s.lastName,
|
|
||||||
s.email,
|
|
||||||
s.ipAddress,
|
|
||||||
s.userAgent ? parseUserAgent(s.userAgent) : null,
|
|
||||||
]
|
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.some((field) => field?.toLowerCase().includes(query)),
|
.some((field) => field?.toLowerCase().includes(query)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}, [sessions, statusFilter, globalFilter]);
|
}, [sessions, statusFilter, userFilter, isOwner, globalFilter]);
|
||||||
|
|
||||||
const columns = useMemo<ColumnDef<SessionRow>[]>(
|
const columns = useMemo<ColumnDef<SessionRow>[]>(
|
||||||
() => [
|
() => [
|
||||||
@@ -303,7 +305,7 @@ export const ShowSessions = () => {
|
|||||||
<>
|
<>
|
||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
<Input
|
<Input
|
||||||
placeholder="Search by user, IP, device..."
|
placeholder="Search by IP, device..."
|
||||||
value={globalFilter}
|
value={globalFilter}
|
||||||
onChange={(e) => setGlobalFilter(e.target.value)}
|
onChange={(e) => setGlobalFilter(e.target.value)}
|
||||||
className="max-w-xs"
|
className="max-w-xs"
|
||||||
@@ -323,6 +325,22 @@ export const ShowSessions = () => {
|
|||||||
<SelectItem value="expired">Expired</SelectItem>
|
<SelectItem value="expired">Expired</SelectItem>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
|
{isOwner && (
|
||||||
|
<Select value={userFilter} onValueChange={setUserFilter}>
|
||||||
|
<SelectTrigger className="w-[200px]">
|
||||||
|
<SelectValue placeholder="User" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value="all">All users</SelectItem>
|
||||||
|
{members?.map((m) => (
|
||||||
|
<SelectItem key={m.user.id} value={m.user.id}>
|
||||||
|
{m.user.firstName} {m.user.lastName} ({m.user.email}
|
||||||
|
)
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="rounded-md border overflow-x-auto">
|
<div className="rounded-md border overflow-x-auto">
|
||||||
<Table>
|
<Table>
|
||||||
|
|||||||
Reference in New Issue
Block a user