import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Checkbox, FieldHint, FieldLabel, IconButton, SingleSelect, TextInput, TextArea, type SelectOption, } from '@nstart/ui' import { TrashIcon, ArrowUpIcon, ArrowDownIcon } from '@phosphor-icons/react' import type { PropertyDef, PropertyKind } from './types' import { PROPERTY_KINDS } from './types' import { useDictionaries } from '@/api/queries' type Props = { prop: PropertyDef index: number total: number onChange: (next: PropertyDef) => void onRemove: () => void onMoveUp: () => void onMoveDown: () => void } export const PropertyEditor = ({ prop, index, total, onChange, onRemove, onMoveUp, onMoveDown, }: Props) => { const { t } = useTranslation() // 'opaque' исключён из dropdown — admin не может вручную выбрать сложный // тип. Поле получает opaque только через parseSchemaJson (когда уже было // в исходной schema). Для NEW поля admin использует обычные kinds. const kindOptions: SelectOption[] = PROPERTY_KINDS .filter((k) => k !== 'opaque') .map((k) => ({ id: k, label: t(`schema.kind.${k}`), })) const update = (patch: Partial) => onChange({ ...prop, ...patch }) return (
{t('schema.property')} #{index + 1}
} onClick={onMoveUp} /> } onClick={onMoveDown} /> } onClick={onRemove} />
update({ name: e.target.value })} /> update({ kind: id as PropertyKind })} />
update({ required: e.target.checked })} /> update({ unique: e.target.checked })} />