From 65e6498802f592af59413f8ff5f2a553e5d8c248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Wed, 23 Jul 2025 18:50:16 +0400 Subject: [PATCH] feat: ajoute composant VersionFilters --- components/versions/version-filters.js | 205 +++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 components/versions/version-filters.js diff --git a/components/versions/version-filters.js b/components/versions/version-filters.js new file mode 100644 index 0000000..b1a82df --- /dev/null +++ b/components/versions/version-filters.js @@ -0,0 +1,205 @@ +import {useState, useMemo} from 'react' +import PropTypes from 'prop-types' +import Box from '@mui/material/Box' +import FormControl from '@mui/material/FormControl' +import InputLabel from '@mui/material/InputLabel' +import Select from '@mui/material/Select' +import MenuItem from '@mui/material/MenuItem' +import TextField from '@mui/material/TextField' +import Chip from '@mui/material/Chip' +import Button from '@mui/material/Button' +import ClearIcon from '@mui/icons-material/Clear' +import FilterListIcon from '@mui/icons-material/FilterList' +import {formatDate} from '@/lib/format.js' + +export default function VersionFilters({data, onFiltersChange}) { + const [filters, setFilters] = useState({ + author: '', + dateFrom: '', + dateTo: '', + status: '' + }) + + // Extract unique authors from data + const authors = useMemo(() => { + const authorSet = new Set() + for (const version of data) { + if (version.user_created) { + const authorName = version.user_created.split('-')[0] + authorSet.add(authorName) + } + } + + return [...authorSet].sort() + }, [data]) + + // Extract date range from data + const dateRange = useMemo(() => { + if (data.length === 0) { + return {min: '', max: ''} + } + + const dates = data.map(v => new Date(v.date_created)) + const minDate = new Date(Math.min(...dates)) + const maxDate = new Date(Math.max(...dates)) + + return { + min: minDate.toISOString().split('T')[0], + max: maxDate.toISOString().split('T')[0] + } + }, [data]) + + const handleFilterChange = (filterKey, value) => { + const newFilters = {...filters, [filterKey]: value} + setFilters(newFilters) + onFiltersChange(newFilters) + } + + const clearAllFilters = () => { + const emptyFilters = { + author: '', + dateFrom: '', + dateTo: '', + status: '' + } + setFilters(emptyFilters) + onFiltersChange(emptyFilters) + } + + const hasActiveFilters = Object.values(filters).some(value => value !== '') + + return ( + + + + + + Auteur + + + + handleFilterChange('dateFrom', event.target.value)} + /> + + handleFilterChange('dateTo', event.target.value)} + /> + + + Statut + + + + {hasActiveFilters && ( + + )} + + + {/* Active filters display */} + {hasActiveFilters && ( + + {filters.author && ( + handleFilterChange('author', '')} + /> + )} + {filters.dateFrom && ( + handleFilterChange('dateFrom', '')} + /> + )} + {filters.dateTo && ( + handleFilterChange('dateTo', '')} + /> + )} + {filters.status && ( + handleFilterChange('status', '')} + /> + )} + + )} + + ) +} + +VersionFilters.propTypes = { + data: PropTypes.array.isRequired, + onFiltersChange: PropTypes.func.isRequired +}