import types from 'Components/Calculation/config/elements-types'; import type * as Values from 'Components/Calculation/config/map/values'; import type * as Insurance from 'Components/Calculation/Form/Insurance/InsuranceTable/types'; import { reaction } from 'mobx'; import type { ReactionsContext } from 'process/types'; import type { BaseOption } from 'ui/elements/types'; function hasInvalidValueOrOptions(value: unknown, options: BaseOption[]) { if (value === null) { return false; } return (value && !options?.length) || !options.some((x) => x.value === value); } export default function validationReactions({ store }: ReactionsContext) { const { $calculation, $tables } = store; reaction( () => { const hasElementsErrors = Object.values($calculation.$validation).some( (validation) => validation.hasErrors ); const hasPaymentsErrors = $tables.payments.validation.hasErrors; const hasInsuranceErrors = $tables.insurance.validation.hasErrors; const hasFingapErrors = $tables.fingap.validation.hasErrors; return hasElementsErrors || hasPaymentsErrors || hasInsuranceErrors || hasFingapErrors; }, (hasErrors) => { if (hasErrors) { $calculation.$status.setStatus('btnCalculate', 'Disabled'); $calculation.$status.setStatus('btnCreateKP', 'Disabled'); } else { $calculation.$status.setStatus('btnCalculate', 'Default'); $calculation.$status.setStatus('btnCreateKP', 'Default'); } }, { fireImmediately: true, } ); /** * Проверяем, что выбранное значение элемента есть в списке */ function validateOptionsElement(elementName: Values.Elements) { const type = types[elementName]; if (type().typeName !== 'Options') { return; } const element = $calculation.element(elementName); reaction( () => { const options = element.getOptions(); const value = element.getValue(); return { value, options, }; }, ({ value, options }) => { element.validate({ invalid: hasInvalidValueOrOptions(value, options), message: 'Выбранное значение отсутствует в списке', silent: true, }); }, { delay: 100, } ); reaction( () => element.getOptions(), (options) => { const value = element.getValue(); if (hasInvalidValueOrOptions(value, options)) { element.resetValue(); } }, { delay: 100, } ); } (Object.keys(types) as Values.Elements[]).forEach((elementName) => validateOptionsElement(elementName) ); function validateInsuranceCompany(rowKey: Insurance.Keys) { const row = $tables.insurance.row(rowKey); reaction( () => { const options = row.getOptions('insuranceCompany'); const value = row.getValue('insuranceCompany'); return { value, options, }; }, ({ value, options }) => { $tables.insurance.validate({ invalid: hasInvalidValueOrOptions(value, options), message: 'Выбранное значение отсутствует в списке', silent: true, }); }, { delay: 100, } ); reaction( () => row.getOptions('insuranceCompany'), (options) => { const value = row.getValue('insuranceCompany'); if (hasInvalidValueOrOptions(value, options)) { row.resetValue('insuranceCompany'); } }, { delay: 100, } ); } validateInsuranceCompany('kasko'); validateInsuranceCompany('osago'); validateInsuranceCompany('fingap'); }