Files
gunshiz 188cec9bda
CI / Verify (push) Successful in 2m2s
CI / Build immutable images and deploy (push) Successful in 2m47s
feat : copy buzzy audit logs
2026-09-27 17:00:25 +07:00

77 lines
2.1 KiB
TypeScript

"use client";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { FilterIcon, RotateCcwIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field";
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const ALL = "all";
export function AuditLogFilters({
actors,
initialActorId,
}: {
actors: Array<{ id: string; label: string }>;
initialActorId?: string;
}) {
const router = useRouter();
const [actorId, setActorId] = useState(initialActorId ?? ALL);
function applyFilters() {
const query = new URLSearchParams();
if (actorId !== ALL) query.set("actor", actorId);
const suffix = query.toString();
router.push(suffix ? `/admin/activity?${suffix}` : "/admin/activity");
}
return (
<FieldGroup className="rounded-xl border p-4 md:flex-row md:items-end">
<Field>
<FieldLabel htmlFor="audit-actor">ผู้ดูแล</FieldLabel>
<Select value={actorId} onValueChange={(value) => value && setActorId(value)}>
<SelectTrigger id="audit-actor" className="w-full md:w-64">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem value={ALL}>ทั้งหมด</SelectItem>
{actors.map((actor) => (
<SelectItem key={actor.id} value={actor.id}>
{actor.label}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
</Field>
<div className="flex gap-2">
<Button type="button" onClick={applyFilters}>
<FilterIcon data-icon="inline-start" />
กรอง
</Button>
<Button
type="button"
variant="outline"
onClick={() => {
setActorId(ALL);
router.push("/admin/activity");
}}
>
<RotateCcwIcon data-icon="inline-start" />
ล้าง
</Button>
</div>
</FieldGroup>
);
}