diff --git a/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx b/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx index 10e5097..b317840 100644 --- a/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx +++ b/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx @@ -47,6 +47,7 @@ import { saveContractChangeRequest, contractChangeApprovalService } from './subm import { loadContractChangeRequest } from './load'; import { useSelfEmployee } from './useSelfEmployee'; import { RequestSection } from './sections/RequestSection'; +import { ChangeTypeSections } from './byType/ChangeTypeSections'; import { useStableCallback } from '../../shared/useStableCallback'; const ContractChangeForm: React.FC = ({ @@ -258,6 +259,7 @@ const ContractChangeForm: React.FC = ({ + = ({ context, itemI > + diff --git a/src/webparts/requestPortal/forms/ContractChange/README.md b/src/webparts/requestPortal/forms/ContractChange/README.md index ab64438..551a720 100644 --- a/src/webparts/requestPortal/forms/ContractChange/README.md +++ b/src/webparts/requestPortal/forms/ContractChange/README.md @@ -39,13 +39,24 @@ RequestTypeId» в `docs/forms.md`). Тип и маршрут в админке менять только вместе с `provisioning.json`. - **Заголовок элемента** (`Title`): `Изменение условий ТД — {ФИО} — дд.мм.гггг`. +## Поля по видам +Каждый вид — своя секция в `byType/<Вид>/`, подключается строкой в +`byType/ChangeTypeSections.tsx`; ключи модели и колонки SP — с префиксом вида. +Колонки невыбранного вида при сохранении очищаются (`null`), чтобы в заявке не +оставалось скрытых значений после смены вида. + +| Вид | Секция | Поля (все необязательные, без ограничений) | +| --- | --- | --- | +| Повышение должностного оклада | `SalaryIncrease` | текущий оклад, новый оклад (`MoneyInput`, Number), дата изменения, причина (испытательный срок / расширение функционала / иное), обоснование — при «иное» это и есть текст причины | +| Остальные 9 | — | ещё не разобраны с кадрами | + ## Открытые вопросы (проверить на тесте) - Выдаёт ли бэкенд (вебхуки) права на элемент по People-колонке `Employee`? Если да — сотрудник, за которого подали заявку, её не увидит (такой колонки здесь нет). - `Employee/FullBase`: ищет ли `Fio` по подстроке; что фильтрует `Status`. ## Секции формы -RequestSection (сотрудник · вид изменения) +RequestSection (сотрудник · вид изменения) · ChangeTypeSections (секция выбранного вида, см. «Поля по видам») ## Точки входа - rptype: `hr-contract-change` diff --git a/src/webparts/requestPortal/forms/ContractChange/byType/ChangeTypeSections.tsx b/src/webparts/requestPortal/forms/ContractChange/byType/ChangeTypeSections.tsx new file mode 100644 index 0000000..5f8ed6b --- /dev/null +++ b/src/webparts/requestPortal/forms/ContractChange/byType/ChangeTypeSections.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; +import { ChangeType } from '../changeTypes'; +import { ISectionProps } from '../model'; +import { SalaryIncreaseSection } from './SalaryIncrease/SalaryIncreaseSection'; + +/** + * Вид изменения → секция с его полями. Partial: поля видов добавляются по мере + * согласования с кадрами; у вида без секции под выбором просто ничего не появится. + * Новый вид = папка byType/<Вид>/ + строка здесь. + */ +const SECTION_BY_TYPE: Partial>> = { + 'salary-increase': SalaryIncreaseSection +}; + +/** Секции всех выбранных видов, в порядке выбора (сейчас вид один — см. MAX_CHANGE_TYPES). */ +export const ChangeTypeSections: React.FC = (props) => ( + <> + {props.data.ChangeTypes.map((type) => { + const Section = SECTION_BY_TYPE[type]; + return Section ?
: undefined; + })} + +); diff --git a/src/webparts/requestPortal/forms/ContractChange/byType/SalaryIncrease/SalaryIncreaseSection.tsx b/src/webparts/requestPortal/forms/ContractChange/byType/SalaryIncrease/SalaryIncreaseSection.tsx new file mode 100644 index 0000000..c094885 --- /dev/null +++ b/src/webparts/requestPortal/forms/ContractChange/byType/SalaryIncrease/SalaryIncreaseSection.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import { CollapseSection, FormField, MoneyInput, TextInput, TextArea, Select } from '../../../../shared/ui'; +import { CHANGE_TYPE_LABELS } from '../../changeTypes'; +import { ISectionProps } from '../../model'; +import { SALARY_INCREASE_REASONS } from './reasons'; + +/** + * Поля вида «Повышение должностного оклада». Состав согласован с Тимуром по ТЗ + * кадров: было/стало, дата, причина (а/б/в) и обоснование. Все необязательные, + * без ограничений — по решению от 2026-10-28. + * + * Поля — прямо в CollapseSection, без FormGrid: тело секции само является + * двухколоночной сеткой, вложенная FormGrid сжала бы всё в одну её ячейку. + */ +export const SalaryIncreaseSection: React.FC = ({ data, set }) => ( + + + set('SalaryIncreaseCurrent', v)} + /> + + + set('SalaryIncreaseNew', v)} + /> + + + set('SalaryIncreaseDate', v)} + /> + + +