import { Button, Classes } from '@blueprintjs/core'; import type { ReactNode } from 'react'; import { useFormContext, useWatch } from 'react-hook-form'; import { FaPlus, FaRegTrashAlt } from 'react-icons/fa'; import type { MatrixFilter } from '../../../data/matrixGeneration.js'; import { getMatrixFilters, normalCase, } from '../../../data/matrixGeneration.js'; import { CheckController } from '../../elements/CheckController.js'; import { GroupPane } from '../../elements/GroupPane.js'; import { Input2Controller } from '../../elements/Input2Controller.js'; import Label from '../../elements/Label.js'; import { NumberInput2Controller } from '../../elements/NumberInput2Controller.js'; import { Select2Controller } from '../../elements/Select2Controller.js'; import { DEFAULT_MATRIX_FILTERS, GroupPanelStyle, } from './MatrixGenerationPanel.js'; interface SelectMatrixFilter extends MatrixFilter { label: string; } const matrixFilters: SelectMatrixFilter[] = getMatrixFilters().map((item) => ({ ...item, label: normalCase(item.name), })); export function FiltersOptions() { const filters = useWatch({ name: 'filters' }); if (!filters || !Array.isArray(filters)) { return null; } return filters.map((filter: any, index) => { return ( ( )} > ); }); } function Fields(props: { filter: MatrixFilter; basePath: string }) { const fields = Object.entries(props.filter.properties); const { control } = useFormContext(); return (
{fields.map(([key, field]) => { const keyPath = `${props.basePath}.options.${key}`; switch (field.type) { case 'label': { const fieldsGroupName = key.split('.')?.[field.level] || ''; return ( ); } case 'string': { return ( ); } case 'number': { return ( ); } case 'boolean': { return ( ); } case 'select': { return ( ); } default: return null; } })}
); } function mapSelectList(array: string[]) { return array.map((val) => ({ value: val, label: normalCase(val) })); } function FiltersPanelGroupHeader({ index }: { index: number }) { const { setValue } = useFormContext(); const filters = useWatch({ name: 'filters' }); function handleSelectFilter(value: any, index: number) { const clonedFilters = filters.slice(); clonedFilters.splice(index, 1, value); setValue('filters', clonedFilters); } function handleAdd(index: number) { if (filters) { setValue('filters', [ ...filters.slice(0, index), DEFAULT_MATRIX_FILTERS[0], ...filters.slice(index), ]); } } function handleDelete(index: number) { setValue( 'filters', filters.filter((_: any, i: number) => i !== index), ); } return (

{index + 1}-

handleSelectFilter(value, index)} fill itemTextKey="label" itemValueKey="name" selectedButtonProps={{ size: 'small' }} popoverProps={{ matchTargetWidth: true }} filterable />
); } // eslint-disable-next-line @typescript-eslint/no-unused-vars function FieldInfo(props: { children: ReactNode; description: string }) { return (
{props.children} {props.description}
); } function LevelLabel({ field, children }: any) { const { name, level } = field; return ( ); }