Перейти к основному содержимому

Шаг 4: Behaviors для занятости

Управление полями, специфичными для занятости и расчётом доходов.

Обзор

Шаг 4 обрабатывает разные статусы занятости с их специфичными полями:

  1. Условная видимость - Показать поля компании для работающих, поля бизнеса для ИП
  2. Отслеживание и сброс - Очистить поля при изменении статуса занятости
  3. Вычисляемое: Общий доход - Сумма основного дохода и дополнительного дохода
  4. Отключение вычисляемого - Сделать общий доход только для чтения

Реализация

reformer-tutorial/src/forms/credit-application/schemas/behaviors/employment.ts
import { enableWhen, watch, computeFrom, disableWhen } from '@reformer/core/behaviors';
import type { BehaviorSchemaFn, FieldPath } from '@reformer/core';
import type { CreditApplicationForm } from '@/types';

export const employmentBehaviorSchema: BehaviorSchemaFn<CreditApplicationForm> = (
path: FieldPath<CreditApplicationForm>
) => {
// ==========================================
// Показать поля компании для работающих
// ==========================================
enableWhen(path.companyName, path.employmentStatus, (s) => s === 'employed');
enableWhen(path.companyInn, path.employmentStatus, (s) => s === 'employed');
enableWhen(path.companyPhone, path.employmentStatus, (s) => s === 'employed');
enableWhen(path.companyAddress, path.employmentStatus, (s) => s === 'employed');
enableWhen(path.position, path.employmentStatus, (s) => s === 'employed');
enableWhen(path.workExperienceTotal, path.employmentStatus, (s) => s === 'employed');
enableWhen(path.workExperienceCurrent, path.employmentStatus, (s) => s === 'employed');

// ==========================================
// Показать поля бизнеса для ИП
// ==========================================
enableWhen(path.businessType, path.employmentStatus, (s) => s === 'selfEmployed');
enableWhen(path.businessInn, path.employmentStatus, (s) => s === 'selfEmployed');
enableWhen(path.businessActivity, path.employmentStatus, (s) => s === 'selfEmployed');

// ==========================================
// Отслеживание: Очистить поля при изменении статуса
// ==========================================
watch(path.employmentStatus, (value, { form }) => {
// Очистить поля компании если не работающий
if (value !== 'employed') {
form.field(path.companyName).setValue('', { emitEvent: false });
form.field(path.companyInn).setValue('', { emitEvent: false });
form.field(path.companyPhone).setValue('', { emitEvent: false });
form.field(path.companyAddress).setValue('', { emitEvent: false });
form.field(path.position).setValue('', { emitEvent: false });
form.field(path.workExperienceTotal).setValue(null, { emitEvent: false });
form.field(path.workExperienceCurrent).setValue(null, { emitEvent: false });
}

// Очистить поля бизнеса если не ИП
if (value !== 'selfEmployed') {
form.field(path.businessType).setValue('', { emitEvent: false });
form.field(path.businessInn).setValue('', { emitEvent: false });
form.field(path.businessActivity).setValue('', { emitEvent: false });
}
});

// ==========================================
// Вычисляемое: Общий доход
// ==========================================
computeFrom([path.monthlyIncome, path.additionalIncome], path.totalIncome, (values) => {
const main = (values.monthlyIncome as number) || 0;
const additional = (values.additionalIncome as number) || 0;
return main + additional;
});

// Отключить totalIncome (только для чтения)
disableWhen(path.totalIncome, path.totalIncome, () => true);
};

Ключевые моменты

Несколько условных полей:

  • Группируйте связанные поля по условию (работающий vs ИП)
  • Используйте enableWhen для каждого поля отдельно
  • Поля скрываются/показываются вместе при изменении статуса

Паттерн сброса полей:

  • Очищайте значения при переключении типов занятости
  • Предотвращайте устаревшие данные (например, название компании для ИП)
  • Используйте { emitEvent: false } чтобы избежать запуска валидаций

Общий доход:

  • Простая сумма двух источников дохода
  • Обрабатывает отсутствующие значения (|| 0)
  • Обновляется автоматически когда изменяется любой из доходов

Результат

Шаг 4 теперь имеет:

  • ✅ Поля специфичные для занятости (компания/бизнес)
  • ✅ Автоматический сброс полей при изменении статуса
  • ✅ Расчет общего дохода
  • ✅ Чистый условный UI

Следующий шаг

Давайте добавим behaviors для Шага 5: Дополнительная информация, обработка массивов и созаёмщиков.