import { useEffect, useMemo, useState } from 'react'; import { Filters } from '/@/renderer/components/query-builder'; import { ActionIcon } from '/@/shared/components/action-icon/action-icon'; import { DateInput } from '/@/shared/components/date-picker/date-picker'; import { Group } from '/@/shared/components/group/group'; import { NumberInput } from '/@/shared/components/number-input/number-input'; import { Select } from '/@/shared/components/select/select'; import { TextInput } from '/@/shared/components/text-input/text-input'; import { QueryBuilderRule } from '/@/shared/types/types'; type DeleteArgs = { groupIndex: number[]; level: number; uniqueId: string; }; interface QueryOptionProps { data: QueryBuilderRule; filters: Filters; groupIndex: number[]; level: number; noRemove: boolean; onChangeField: (args: any) => void; onChangeOperator: (args: any) => void; onChangeValue: (args: any) => void; onDeleteRule: (args: DeleteArgs) => void; operators: { boolean: { label: string; value: string }[]; date: { label: string; value: string }[]; number: { label: string; value: string }[]; string: { label: string; value: string }[]; }; selectData?: { label: string; value: string }[]; } const QueryValueInput = ({ data, defaultValue, onChange, operator, type, value: valueProp, ...props }: any) => { const [numberRange, setNumberRange] = useState([0, 0]); // Parse date value helper - converts date string (YYYY-MM-DD) to Date for display const parseDateValue = (val: any): Date | null => { if (!val) return null; if (val instanceof Date) return val; if (typeof val === 'string') { // Handle YYYY-MM-DD format strings const parsed = new Date(val); if (isNaN(parsed.getTime())) return null; return parsed; } return null; }; const value = valueProp !== undefined ? valueProp : defaultValue; // Store date range as strings for state management const [dateRange, setDateRange] = useState<[null | string, null | string]>(() => { const currentValue = value !== undefined ? value : defaultValue; if (currentValue && Array.isArray(currentValue)) { return [ typeof currentValue[0] === 'string' ? currentValue[0] : null, typeof currentValue[1] === 'string' ? currentValue[1] : null, ]; } return [null, null]; }); // Sync dateRange state when value changes useEffect(() => { const currentValue = value !== undefined ? value : defaultValue; if (operator === 'inTheRangeDate' && currentValue && Array.isArray(currentValue)) { setDateRange([ typeof currentValue[0] === 'string' ? currentValue[0] : null, typeof currentValue[1] === 'string' ? currentValue[1] : null, ]); } }, [value, defaultValue, operator]); // Sync numberRange state when value changes useEffect(() => { const currentValue = value !== undefined ? value : defaultValue; if (operator === 'inTheRange' && currentValue && Array.isArray(currentValue)) { setNumberRange([ typeof currentValue[0] === 'number' ? currentValue[0] : Number(currentValue[0]) || 0, typeof currentValue[1] === 'number' ? currentValue[1] : Number(currentValue[1]) || 0, ]); } }, [value, defaultValue, operator]); // Check if operator requires DatePicker const isDatePickerOperator = operator === 'beforeDate' || operator === 'afterDate' || operator === 'inTheRangeDate'; const BooleanSelectComponent = useMemo( () => ( ; case 'string': return ; default: return <>; } }; export const QueryBuilderOption = ({ data, filters, groupIndex, level, noRemove, onChangeField, onChangeOperator, onChangeValue, onDeleteRule, operators, selectData, }: QueryOptionProps) => { const { field, operator, uniqueId, value } = data; const handleDeleteRule = () => { onDeleteRule({ groupIndex, level, uniqueId }); }; const handleChangeField = (e: any) => { onChangeField({ groupIndex, level, uniqueId, value: e }); }; const handleChangeOperator = (e: any) => { onChangeOperator({ groupIndex, level, uniqueId, value: e }); }; const handleChangeValue = (e: any) => { const isDirectValue = typeof e === 'string' || typeof e === 'number' || typeof e === 'undefined'; if (isDirectValue) { return onChangeValue({ groupIndex, level, uniqueId, value: e, }); } // const isDate = e instanceof Date; // if (isDate) { // return onChangeValue({ // groupIndex, // level, // uniqueId, // value: dayjs(e).format('YYYY-MM-DD'), // }); // } const isArray = Array.isArray(e); if (isArray) { return onChangeValue({ groupIndex, level, uniqueId, value: e, }); } return onChangeValue({ groupIndex, level, uniqueId, value: e.currentTarget.value, }); }; // Handle both grouped and flat filter data const flatFilters = filters.some((f: any) => f.group && f.items) ? filters.flatMap((group: any) => group.items || []) : filters; const fieldType = flatFilters.find((f: any) => f.value === field)?.type; const operatorsByFieldType = operators[fieldType as keyof typeof operators]; const ml = 20; return ( {field ? ( ) : ( )} ); };