diff --git a/src/pages/RepoPage/shared/components/SearchFilters/SearchFilters.tsx b/src/pages/RepoPage/shared/components/SearchFilters/SearchFilters.tsx new file mode 100644 index 0000000000..3673f01a04 --- /dev/null +++ b/src/pages/RepoPage/shared/components/SearchFilters/SearchFilters.tsx @@ -0,0 +1,141 @@ +import { useEffect, useState } from 'react' + +interface SearchFiltersProps { + onFilterChange: (filters: FilterState) => void + initialFilters?: FilterState +} + +interface FilterState { + searchTerm: string + status: string[] + dateRange: { start: string; end: string } | null +} + +export function SearchFilters({ + onFilterChange, + initialFilters, +}: SearchFiltersProps) { + const [filters, setFilters] = useState( + initialFilters || { + searchTerm: '', + status: [], + dateRange: null, + } + ) + const [hasChanges, setHasChanges] = useState(false) + + useEffect(() => { + if (initialFilters && !hasChanges) { + setFilters(initialFilters) + } + }, [initialFilters, hasChanges]) + + useEffect(() => { + if (hasChanges) { + onFilterChange(filters) + setHasChanges(false) + } + }, [filters, hasChanges, onFilterChange]) + + const handleSearchChange = (searchTerm: string) => { + setFilters((prev) => ({ ...prev, searchTerm })) + setHasChanges(true) + } + + const handleStatusToggle = (status: string) => { + setFilters((prev) => ({ + ...prev, + status: prev.status.includes(status) + ? prev.status.filter((s) => s !== status) + : [...prev.status, status], + })) + setHasChanges(true) + } + + const handleDateRangeChange = (start: string, end: string) => { + setFilters((prev) => ({ + ...prev, + dateRange: { start, end }, + })) + setHasChanges(true) + } + + const handleClearFilters = () => { + const clearedFilters = { + searchTerm: '', + status: [], + dateRange: null, + } + setFilters(clearedFilters) + setHasChanges(true) + } + + return ( +
+
+ + handleSearchChange(e.target.value)} + placeholder="Search..." + className="w-full rounded border border-ds-gray-tertiary px-3 py-2 text-sm" + /> +
+ +
+ +
+ {['passed', 'failed', 'skipped'].map((status) => ( + + ))} +
+
+ +
+ +
+ + handleDateRangeChange( + e.target.value, + filters.dateRange?.end || '' + ) + } + className="flex-1 rounded border border-ds-gray-tertiary px-3 py-2 text-sm" + /> + + handleDateRangeChange( + filters.dateRange?.start || '', + e.target.value + ) + } + className="flex-1 rounded border border-ds-gray-tertiary px-3 py-2 text-sm" + /> +
+
+ + +
+ ) +} + +export default SearchFilters