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 (
);
}