import React from 'react'; import { Definition } from 'sync-ql'; import { Button, } from '@mui/material'; import { DataFilterSet, DataFilterType, DataFilterOperation, FiltersMessage, DataOption, FiltersStore, ExternalFilter } from '../types/filter.type'; import { FilterActionsContainer, FiltersContainer } from './style'; import { DataTableFilter, operationsConstrains } from './filter'; import { DataColumnExtra } from '../types/table.type'; export interface DataTableFiltersProps { filters: FiltersStore, external: ExternalFilter, columns: DataColumnExtra[] messages: FiltersMessage, onChange: (filters: FiltersStore) => void, onExternalChange: (filter: ExternalFilter) => void, onApply: (filters: FiltersStore) => void, onClose: () => void } export const DataTableFilters: React.FC = ({ filters: filtersStore, external, columns, messages, onChange, onExternalChange, onApply, onClose }) => { const getFilterOperation = (column: { name: string, type: DataFilterSet | 'none' }) => { let result = filtersStore[column.name] && filtersStore[column.name].operation ? filtersStore[column.name].operation : column.type === 'date' ? 'between' : column.type === 'text' || column.type === 'set' ? 'auto' : 'equal' if (!operationsConstrains[column.type][result]) { result = Object.keys(operationsConstrains[column.type])[0] as Definition; } return result; } const getFilterRange = (column: { name: string }) => { return filtersStore[column.name] ? filtersStore[column.name].range : undefined } const getFilterValue = (column: { name: string }) => { return filtersStore[column.name] ? filtersStore[column.name].value : null } const handleFilterChange = (column: { name: string }) => (operation: DataFilterOperation, value: DataFilterType | [DataFilterType, DataFilterType]) => { onChange({ ...filtersStore, [column.name]: { operation, value: value } }) } const handleExternalFilterChange = (operation: DataFilterOperation, value: DataFilterType | [DataFilterType, DataFilterType]) => { onExternalChange({ ...external, operation, value: value }) } const handleFilterOptionsLoad = (column: { options?: (text: string) => Promise }) => async (inputText: string): Promise => { if (column.options) { return await column.options(inputText); } return [] } const handleExternalFilterOptionsLoad = async (inputText: string): Promise => { if (external.options) { return await external.options(inputText); } return [] } const handleApplyFilters = () => { const filters: FiltersStore = {}; Object.keys(filtersStore).forEach(key => { filters[key] = { ...filtersStore[key] } }) onApply(filters); } const handleClose = () => { onClose(); } return ( <> { external && } { columns.map(column => ( !column.hidden && column.type !== 'none' && )) }
) }