167 lines
4.7 KiB
TypeScript
167 lines
4.7 KiB
TypeScript
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 type { ProcessContext } from '@/process/types';
|
|
import ValidationHelper from '@/stores/validation/helper';
|
|
import { disposableReaction } from '@/utils/mobx';
|
|
import { reaction } from 'mobx';
|
|
import { shake, uid } from 'radash';
|
|
import type { BaseOption } from 'ui/elements/types';
|
|
|
|
function hasInvalidValueOrOptions(value: unknown, options: Array<BaseOption<unknown>>) {
|
|
if (value === null) {
|
|
return false;
|
|
}
|
|
|
|
return (value && !options?.length) || !options.some((x) => x.value === value);
|
|
}
|
|
|
|
export default function reactions({ store }: ProcessContext) {
|
|
const { $calculation, $tables, $process } = store;
|
|
|
|
disposableReaction(
|
|
() => $process.has('Unlimited'),
|
|
() => {
|
|
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');
|
|
$calculation.$status.setStatus('btnCreateKPMini', 'Disabled');
|
|
} else {
|
|
$calculation.$status.setStatus('btnCalculate', 'Default');
|
|
$calculation.$status.setStatus('btnCreateKP', 'Default');
|
|
$calculation.$status.setStatus('btnCreateKPMini', 'Default');
|
|
}
|
|
},
|
|
{
|
|
fireImmediately: true,
|
|
}
|
|
);
|
|
|
|
/**
|
|
* Проверяем, что выбранное значение элемента есть в списке
|
|
*/
|
|
|
|
const key = uid(7);
|
|
const message = 'Выбранное значение отсутствует в списке';
|
|
|
|
function validateOptionsElement(elementName: Values.Elements) {
|
|
const type = types[elementName];
|
|
if (type().typeName !== 'Options') {
|
|
return;
|
|
}
|
|
|
|
const element = $calculation.element(elementName);
|
|
|
|
const validationHelper = new ValidationHelper();
|
|
|
|
reaction(
|
|
() => {
|
|
const options = element.getOptions();
|
|
const value = element.getValue();
|
|
|
|
return {
|
|
options,
|
|
value,
|
|
};
|
|
},
|
|
({ value, options }) => {
|
|
if (hasInvalidValueOrOptions(value, options)) {
|
|
const removeError = element.setError({
|
|
key,
|
|
message,
|
|
silent: true,
|
|
});
|
|
if (removeError) validationHelper.add(removeError);
|
|
} else {
|
|
validationHelper.removeErrors();
|
|
}
|
|
},
|
|
{
|
|
delay: 100,
|
|
}
|
|
);
|
|
|
|
disposableReaction(
|
|
() => $process.has('LoadKP'),
|
|
() => element.getOptions(),
|
|
(options) => {
|
|
const value = element.getValue();
|
|
if (hasInvalidValueOrOptions(value, options)) {
|
|
element.resetValue();
|
|
}
|
|
},
|
|
{
|
|
delay: 100,
|
|
}
|
|
);
|
|
}
|
|
|
|
const optionsTypes = shake(types, (type) => type().typeName !== 'Options');
|
|
|
|
(Object.keys(optionsTypes) as Values.Elements[]).forEach((elementName) =>
|
|
validateOptionsElement(elementName)
|
|
);
|
|
|
|
function validateInsuranceCompany(rowKey: Insurance.Keys) {
|
|
const row = $tables.insurance.row(rowKey);
|
|
|
|
const validationHelper = new ValidationHelper();
|
|
|
|
reaction(
|
|
() => {
|
|
const options = row.getOptions('insuranceCompany');
|
|
const value = row.getValue('insuranceCompany');
|
|
|
|
return {
|
|
options,
|
|
value,
|
|
};
|
|
},
|
|
({ value, options }) => {
|
|
if (hasInvalidValueOrOptions(value, options)) {
|
|
const removeError = $tables.insurance.setError({
|
|
key,
|
|
message,
|
|
silent: true,
|
|
});
|
|
validationHelper.add(removeError);
|
|
} else {
|
|
validationHelper.removeErrors();
|
|
}
|
|
},
|
|
{
|
|
delay: 100,
|
|
}
|
|
);
|
|
|
|
disposableReaction(
|
|
() => $process.has('LoadKP'),
|
|
() => row.getOptions('insuranceCompany'),
|
|
(options) => {
|
|
const value = row.getValue('insuranceCompany');
|
|
if (hasInvalidValueOrOptions(value, options)) {
|
|
row.resetValue('insuranceCompany');
|
|
}
|
|
},
|
|
{
|
|
delay: 100,
|
|
}
|
|
);
|
|
}
|
|
|
|
validateInsuranceCompany('kasko');
|
|
validateInsuranceCompany('osago');
|
|
validateInsuranceCompany('fingap');
|
|
}
|