"use client"; import { useMemo, useState } from "react"; import { Paper, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography } from "@mui/material"; import SearchIcon from "@mui/icons-material/Search"; type EventRow = { id: number; created_at: string; user: string; summary: string; }; export default function AuditLogClient({ events }: { events: EventRow[] }) { const [searchTerm, setSearchTerm] = useState(""); const filteredEvents = useMemo(() => { if (!searchTerm.trim()) return events; const search = searchTerm.toLowerCase(); return events.filter((event) => { // Search in user if (event.user.toLowerCase().includes(search)) return true; // Search in summary if (event.summary.toLowerCase().includes(search)) return true; // Search in timestamp if (new Date(event.created_at).toLocaleString().toLowerCase().includes(search)) return true; return false; }); }, [events, searchTerm]); return ( Audit Log Review configuration changes and user activity. setSearchTerm(e.target.value)} slotProps={{ input: { startAdornment: } }} sx={{ maxWidth: 500, "& .MuiOutlinedInput-root": { bgcolor: "rgba(20, 20, 22, 0.6)", "&:hover": { bgcolor: "rgba(20, 20, 22, 0.8)" } } }} /> When User Summary {filteredEvents.length === 0 ? ( {searchTerm ? "No audit log entries match your search." : "No audit log entries found."} ) : ( filteredEvents.map((event) => ( {new Date(event.created_at).toLocaleString()} {event.user} {event.summary} )) )}
); }