import React, { useState } from "react"; import { hasValue } from "../../core/utils"; import PropTypes from "prop-types"; //Контроль свойств компонента import { Stack, Chip, Typography, Box } from "@mui/material"; //Интерфейсные компоненты import { P8P_DATA_TYPES } from "../../core/data_types"; import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; import { P8P_BOX_HEADER_FILTER_CUSTOM } from "../../theme/styles/box"; import { P8P_TYPOGRAPHY_VARIANT } from "../../theme/p8p_typography"; import { P8P_TYPOGRAPHY_MAX_LINES } from "../../theme/styles/typography"; import { P8P_STACK_HEADER_FILTER } from "../../theme/styles/stack"; import { P8PTableColumnFilterDialog } from "../p8p_table/p8p_table_column_filter_dialog"; const FilterComponent = ({ filter, columnDef, valueFromCaption, valueToCaption, valueFormatter, onFilterChanged }) => { //Собственное состояние - фильтруемая колонка const [filterColumn, setFilterColumn] = useState(null); const isClickable = false; //Значения фильтра фильтруемой колонки const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => { return filter ? [filter.from == null ? "" : filter.from, filter.to == null ? "" : filter.to] : ["", ""]; })() : ["", ""]; //Отработка ввода значения фильтра колонки const handleFilterOk = (columnName, from, to) => { if (onFilterChanged) onFilterChanged({ columnName, from: from === "" ? null : from, to: to === "" ? null : to }); setFilterColumn(null); }; //Отработка очистки значения фильтра колонки const handleFilterClear = columnName => { if (onFilterChanged) onFilterChanged({ columnName, from: null, to: null }); setFilterColumn(null); }; //Отработка отмены ввода значения фильтра колонки const handleFilterCancel = () => { setFilterColumn(null); }; return ( <> {columnDef.name} setFilterColumn(columnDef.name)}> {hasValue(filter.from) && !columnDef.values && columnDef.dataType != P8P_DATA_TYPES.STR ? `${valueFromCaption.toLowerCase()} ` : null} {hasValue(filter.from) ? (valueFormatter ? valueFormatter({ value: filter.from, columnDef }) : filter.from) : null} {hasValue(filter.to) && !columnDef.values && columnDef.dataType != P8P_DATA_TYPES.STR ? ` ${valueToCaption.toLowerCase()} ` : null} {hasValue(filter.to) ? (valueFormatter ? valueFormatter({ value: filter.to, columnDef }) : filter.to) : null} {filterColumn ? ( ) : null} ); }; //Контроль свойств - Текст FilterComponent.propTypes = { filter: PropTypes.object, columnDef: PropTypes.object, valueFromCaption: PropTypes.string, valueToCaption: PropTypes.string, valueFormatter: PropTypes.func, onFilterChanged: PropTypes.func }; //Форматирование фильтра таблицы const formatFilterDataGrid = ({ filters, columnsDef, valueFromCaption = P8P_DATA_GRID_CONFIG_PROPS.valueFromCaption, valueToCaption = P8P_DATA_GRID_CONFIG_PROPS.valueToCaption, valueFormatter, onClick, onFilterChanged, objectsCopier }) => { //Форматируем фильтры под заголовок const formattedFilters = filters.map(filter => { //Определяем колонку const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name); //Формирование содержимого фильтра const buildFilterContent = () => { //Инициализируем части const parts = []; //Если есть "Значение с" if (hasValue(filter.from)) { //Если необходимо добавить префикс if (!columnDef.values && columnDef.dataType != P8P_DATA_TYPES.STR) { parts.push(`${valueFromCaption.toLowerCase()} `); } //Добавляем "Значение с" parts.push(valueFormatter ? valueFormatter({ value: filter.from, columnDef }) : filter.from); } //Если есть "Значение по" if (hasValue(filter.to)) { //Если необходимо добавить префикс if (!columnDef.values && columnDef.dataType != P8P_DATA_TYPES.STR) { parts.push(` ${valueToCaption.toLowerCase()} `); } //Добавляем "Значение по" parts.push(valueFormatter ? valueFormatter({ value: filter.to, columnDef }) : filter.to); } //Возвращаем массив элементов return parts; }; //При изменении состояния фильтра const handleFilterChanged = ({ columnName, from, to }) => { let newFilters = objectsCopier(filters); let curFilter = newFilters.find(f => f.name == columnName); if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1); if ((from != null || to != null) && !curFilter) newFilters.push({ name: columnName, from, to }); if ((from != null || to != null) && curFilter) { curFilter.from = from; curFilter.to = to; } if (onFilterChanged) onFilterChanged({ filters: newFilters }); }; //Инициализируем содержмое значения const content = buildFilterContent(); //Возвращаем результат return { caption: columnDef.caption, // from: valueFormatter ? ( // // {React.Children.toArray(content)} // // ) : ( // content.join("") // ), from: ( ), customView: ( ), onClick: () => onClick && onClick(columnDef.name) }; }); return formattedFilters; }; export const P8P_HEADER_FILTER_FORMAT = { DATA_GRID: ({ filters, columnsDef, valueFromCaption = P8P_DATA_GRID_CONFIG_PROPS.valueFromCaption, valueToCaption = P8P_DATA_GRID_CONFIG_PROPS.valueToCaption, valueFormatter, onClick, onFilterChanged, objectsCopier }) => formatFilterDataGrid({ filters, columnsDef, valueFromCaption, valueToCaption, valueFormatter, onClick, onFilterChanged, objectsCopier }) };