diff --git a/src/components/audit/AuditFilters.tsx b/src/components/audit/AuditFilters.tsx index c6cf985..9171c70 100644 --- a/src/components/audit/AuditFilters.tsx +++ b/src/components/audit/AuditFilters.tsx @@ -1,13 +1,16 @@ import { useState } from 'react'; -import { AuditAction, QueryAuditLogsParams } from '@/services/api'; +import { AuditAction, QueryAuditLogsParams, User } from '@/services/api'; import { getAuditActionLabel } from '@/hooks/useAudit'; -import { Filter, X } from 'lucide-react'; +import { Filter, X, Search } from 'lucide-react'; import clsx from 'clsx'; interface AuditFiltersProps { filters: QueryAuditLogsParams; onFiltersChange: (filters: QueryAuditLogsParams) => void; entityTypes?: string[]; + users?: Pick[]; + onSearchChange?: (search: string) => void; + searchValue?: string; } const AUDIT_ACTIONS: AuditAction[] = [ @@ -21,8 +24,16 @@ const AUDIT_ACTIONS: AuditAction[] = [ 'import', ]; -export function AuditFilters({ filters, onFiltersChange, entityTypes = [] }: AuditFiltersProps) { +export function AuditFilters({ + filters, + onFiltersChange, + entityTypes = [], + users = [], + onSearchChange, + searchValue = '', +}: AuditFiltersProps) { const [isOpen, setIsOpen] = useState(false); + const [localSearch, setLocalSearch] = useState(searchValue); const activeFiltersCount = [ filters.action, @@ -32,6 +43,21 @@ export function AuditFilters({ filters, onFiltersChange, entityTypes = [] }: Aud filters.to_date, ].filter(Boolean).length; + const getUserDisplayName = (user: Pick) => { + const fullName = `${user.first_name || ''} ${user.last_name || ''}`.trim(); + return fullName || user.email; + }; + + const handleSearchSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onSearchChange?.(localSearch); + }; + + const handleSearchClear = () => { + setLocalSearch(''); + onSearchChange?.(''); + }; + const handleChange = (key: keyof QueryAuditLogsParams, value: string | undefined) => { onFiltersChange({ ...filters, @@ -46,41 +72,66 @@ export function AuditFilters({ filters, onFiltersChange, entityTypes = [] }: Aud return (
- {/* Filter toggle button */} -
- - - {activeFiltersCount > 0 && ( - + {/* Search and Filter toggle */} +
+ {/* Search input */} + {onSearchChange && ( +
+ + setLocalSearch(e.target.value)} + placeholder="Search logs by description, entity ID..." + className="w-full pl-10 pr-10 py-2 rounded-lg border border-secondary-300 dark:border-secondary-600 bg-white dark:bg-secondary-700 text-secondary-900 dark:text-secondary-100 placeholder-secondary-400 focus:ring-2 focus:ring-primary-500 focus:border-primary-500 text-sm" + /> + {localSearch && ( + + )} + )} + +
+ + + {activeFiltersCount > 0 && ( + + )} +
{/* Filter panel */} {isOpen && (
-
+
{/* Action filter */}
+ {/* User filter */} + {users.length > 0 && ( +
+ + +
+ )} + {/* From date filter */}