nitro-v36-with-renderer-v36
/
src /
components /
wired /
views /
arrays /
WiredArrayCriteriaEditor.tsx
WiredArrayCriteriaEditor.tsx 5 Ko
Télécharger le fichier
import { FC } from 'react';
import {
createWiredArrayCriterion,
IWiredArrayCriterion,
IWiredArrayEditorDefinition,
localizeWithFallback,
WIRED_ARRAY_COMPARISONS,
WIRED_ARRAY_MAX_FIELDS,
wiredArrayComparisonSymbol,
wiredArrayFieldsOf
} from '../../../../api';
import { Text } from '../../../../common';
import { WiredArrayValueField } from './WiredArrayValueField';
import { Select } from '../../../../common/Select';
import { BaseButton } from '../../../../common/BaseButton';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';
interface WiredArrayCriteriaEditorProps {
criteria: IWiredArrayCriterion[];
definition: IWiredArrayEditorDefinition | null;
onChange: (criteria: IWiredArrayCriterion[]) => void;
}
export const WiredArrayCriteriaEditor: FC<WiredArrayCriteriaEditorProps> = (props) => {
const { criteria, definition, onChange } = props;
const fields = wiredArrayFieldsOf(definition);
const replace = (index: number, criterion: IWiredArrayCriterion) => onChange(criteria.map((entry, position) => (position === index ? criterion : entry)));
return (
<NativeTextTree>
<div className="flex flex-col gap-2">
<Text bold>{localizeWithFallback('wiredfurni.params.arrays.criteria', 'Entries that match')}</Text>
{!criteria.length && (
<Text small className="text-black/60">
{localizeWithFallback('wiredfurni.params.arrays.criteria.empty', 'Add at least one rule.')}
</Text>
)}
{criteria.map((criterion, index) => (
<div key={index} className="flex flex-col gap-1 octane-wired__divider-top">
<div className="flex gap-2 items-end">
<div className="flex flex-col gap-1">
<Text small>{localizeWithFallback('wiredfurni.params.arrays.criteria.field', 'Field')}</Text>
<Select
className="form-select form-select-sm"
value={criterion.fieldId}
onChange={(event) => replace(index, { ...criterion, fieldId: parseInt(event.target.value, 10) })}
>
{fields.map((field) => (
<option key={field.id} value={field.id}>
{field.name || localizeWithFallback('wiredfurni.params.arrays.criteria.value', 'Value')}
</option>
))}
</Select>
</div>
<div className="flex flex-col gap-1">
<Text small>{localizeWithFallback('wiredfurni.params.arrays.criteria.comparison', 'Is')}</Text>
<Select
className="form-select form-select-sm"
value={criterion.comparison}
onChange={(event) => replace(index, { ...criterion, comparison: parseInt(event.target.value, 10) })}
>
{WIRED_ARRAY_COMPARISONS.map((comparison) => (
<option key={comparison} value={comparison}>
{wiredArrayComparisonSymbol(comparison)}
</option>
))}
</Select>
</div>
<BaseButton className="btn btn-sm btn-danger" type="button" onClick={() => onChange(criteria.filter((_, position) => position !== index))}>
{localizeWithFallback('wiredfurni.params.arrays.criteria.remove', 'Remove')}
</BaseButton>
</div>
<WiredArrayValueField
label={localizeWithFallback('wiredfurni.params.arrays.criteria.target', 'Compared with')}
recentScope={`array-criterion-${index}`}
value={criterion.reference}
onChange={(reference) => replace(index, { ...criterion, reference })}
/>
</div>
))}
{criteria.length < WIRED_ARRAY_MAX_FIELDS && (
<BaseButton
className="btn btn-sm btn-primary"
type="button"
onClick={() => onChange([...criteria, createWiredArrayCriterion(fields[0]?.id)])}
>
{localizeWithFallback('wiredfurni.params.arrays.criteria.add', 'Add a rule')}
</BaseButton>
)}
</div>
</NativeTextTree>
);
};
