diff --git a/provisioning/manifests/ct.provisioning.json b/provisioning/manifests/ct.provisioning.json index c917f72..e550a7c 100644 --- a/provisioning/manifests/ct.provisioning.json +++ b/provisioning/manifests/ct.provisioning.json @@ -255,6 +255,11 @@ "type": "Lookup", "lookupList": "Поставщики", "lookupShowField": "name" + }, + { + "internalName": "criteriaLabel", + "title": "Название доп.условия", + "type": "Text" } ] }, diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaChoiceCell.tsx b/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaChoiceCell.tsx new file mode 100644 index 0000000..e902ab3 --- /dev/null +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaChoiceCell.tsx @@ -0,0 +1,33 @@ +import * as React from 'react'; +import styles from './Step3ComparisonTable.module.scss'; + +export interface CriteriaChoiceOption { + value: string; + label: string; +} + +interface Props { + value: string; + options: CriteriaChoiceOption[]; + onChange: (value: string) => void; + ariaLabel: string; +} + +// Ячейка-выбор «Дополнительной информации» (условия поставки, сертификаты). Значение не из списка +// (напр. свободный текст от ИИ) показываем отдельным пунктом — чтобы не потерялось и его можно было сменить. +export const CriteriaChoiceCell: React.FC = ({ value, options, onChange, ariaLabel }) => { + const current = value.trim(); + const isKnown = current === '' || options.some(o => o.value === current); + return ( + + ); +}; diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaTable.tsx b/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaTable.tsx index 274d900..0d96352 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaTable.tsx +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaTable.tsx @@ -2,13 +2,21 @@ import * as React from 'react'; import { Button, IconButton, TextInput, TextArea, Icon } from '@tnsu/ui-kit'; import { Step3Matrix } from './useStep3Matrix'; import { CriteriaEntry } from './matrixTypes'; -import { DELIVERY_TYPE_OPTIONS } from './matrixHelpers'; +import { CERTIFICATE_OPTIONS, DELIVERY_TYPE_OPTIONS } from './matrixHelpers'; +import { CriteriaChoiceCell, CriteriaChoiceOption } from './CriteriaChoiceCell'; +import { PaymentTypeCell } from './PaymentTypeCell'; import styles from './Step3ComparisonTable.module.scss'; interface Props { matrix: Step3Matrix; } +// Поля-выбор: условия поставки (Incoterms — в списке описание, храним код) и сертификаты Да/Нет. +const CHOICE_OPTIONS: Partial> = { + deliveryType: DELIVERY_TYPE_OPTIONS.map(o => ({ value: o.code, label: o.label })), + sertificates: CERTIFICATE_OPTIONS.map(o => ({ value: o, label: o })), +}; + // Блок «Дополнительная информация» (условия оплаты/поставки/сроки/сертификаты + произвольные условия). // Перенесено 1:1 из Step3ComparisonTable (§стайл-гайд: чистая вёрстка, логика — в useStep3Matrix). export function CriteriaTable({ matrix }: Props): JSX.Element | null { @@ -54,24 +62,22 @@ export function CriteriaTable({ matrix }: Props): JSX.Element | null { return ( {!isReadOnly ? ( - row.key === 'deliveryType' ? ( - (criteriaMap[s.id]?.deliveryType ?? '').trim() ? ( - // Уже заполнено (в т.ч. ИИ) — показываем как текст, без селекта. - criteriaMap[s.id]?.deliveryType - ) : ( - // Пусто — даём выбрать условие поставки из списка. - - ) + CHOICE_OPTIONS[row.key] ? ( + // Выбор из списка — всегда, даже если поле уже заполнено (в т.ч. ИИ): раньше + // заполненное условие поставки показывалось текстом и его нельзя было сменить. + updateCriteriaValue(s.id, row.key, val)} + ariaLabel={`${row.label} — ${s.name}`} + /> + ) : row.key === 'paymentType' ? ( + updateCriteriaValue(s.id, 'paymentType', val)} + ariaLabel={`${row.label} — ${s.name}`} + isRequiredEmpty={Boolean(row.required) && isEmpty} + /> ) : (