diff --git a/src/webparts/requestPortal/forms/Clearance/README.md b/src/webparts/requestPortal/forms/Clearance/README.md index e6d71fc..9709ab2 100644 --- a/src/webparts/requestPortal/forms/Clearance/README.md +++ b/src/webparts/requestPortal/forms/Clearance/README.md @@ -55,13 +55,21 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова заведённых руками, ссылки нет и поле не рендерится. ## Суммы к списанию (согласование) -5 НЕЗАВИСИМЫХ сумм, компактной сеткой под подписью «СУММЫ К СПИСАНИЮ» (короткие -подписи, обычная 2-колоночная сетка секции), колонки -`WriteOff{Assets,Ppe,Accountable,Nma,Tmc}Amount` (см. `model.ts -WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная сумма», «НМА», «ТМЦ». -Обучение сюда НЕ входит — у него уже есть `TrainingAmount` (см. выше) с ДРУГИМ -поведением (правит только КДП); заводить второе одноимённое поле с иным -поведением рядом только путало. +Общий заголовок-подпись «СУММЫ К СПИСАНИЮ» (`RequestSection.module.scss`, +`.writeOffLabel`) объединяет визуально ДВЕ РАЗНЫЕ по правам вещи, идущие сразу +за подписью: + +1. **`TrainingAmount`** («Обучение: сумма») — уже существовавшее поле, правит + только КДП (`hrRecordsEditable`, `approverRights.ts`), сумма НЕ блокируется + после ввода. Заголовок рисуется независимо от него (`writeOffEditableKeys && +
…
`, а само поле — БЕЗ этого условия), поэтому на форме подачи + (`ClearanceForm`, `writeOffEditableKeys` не передан) поле видно и без заголовка. +2. **5 НЕЗАВИСИМЫХ сумм**, компактной сеткой (короткие подписи, обычная + 2-колоночная сетка секции), колонки `WriteOff{Assets,Ppe,Accountable,Nma, + Tmc}Amount` (см. `model.ts WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная + сумма», «НМА», «ТМЦ» — правит любой активный согласующий, см. ниже. Раньше + среди них было ещё и «Обучение» — убрали как дубль `TrainingAmount` с ДРУГИМ + поведением под тем же названием; общий заголовок группы остался. - **Не привязаны к должности**, в отличие от отметок выше: заполнить может ЛЮБОЙ согласующий, у которого сейчас активный шаг (`ClearanceView.canEditWriteOffs`, @@ -89,9 +97,9 @@ WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная сумм поведение существующего поля. ## Секции формы -RequestSection (сотрудник · должность · подразделение · дата расторжения · сумма -обучения · парковочная карта · карта СКУД · суммы к списанию (компактно) · -ссылка на заявление) +RequestSection (сотрудник · должность · подразделение · дата расторжения · +парковочная карта · карта СКУД · «Суммы к списанию»: обучение + 5 сумм списания +компактно под общим заголовком · ссылка на заявление) ## Точки входа - rptype: `clearance-form` diff --git a/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx index 22b72c4..2dfca87 100644 --- a/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx +++ b/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx @@ -74,16 +74,6 @@ export const RequestSection: React.FC = ({ onChange={(v) => set('TerminationDate', v)} /> - {/* Явный readOnly={false} перебивает read-only контекст просмотра (профильный - согласующий правит своё поле); undefined — обычное поведение из FormMode. */} - - set('TrainingAmount', v)} - readOnly={hrRecordsEditable ? false : undefined} - /> - = ({ readOnly={hrRecordsEditable ? false : undefined} /> - {/* Суммы к списанию — 6 независимых сумм, компактной сеткой (обычная - 2-колоночная сетка секции, короткие подписи — без full). Заголовок - группы ОБЯЗАТЕЛЕН: без него «Обучение» здесь читается продолжением - «Обучение: сумма» чуть выше (разные поля — то принадлежит КДП, это - любому согласующему, см. README «Отдельный механизм от TrainingAmount»). - Каждую сумму может заполнить ЛЮБОЙ активный согласующий (не только - профильный, в отличие от отметок выше) — но как только сумма указана, - блокируется навсегда для всех, поэтому у незаблокированных - (writeOffEditableKeys.has(cat.key)) есть readOnly={false}, у остальных - — обычное поведение FormMode (просмотр — заблокировано и так). «За что - конкретно» — своего поля здесь нет: заполнил хоть одну сумму — - обязательным становится СТАНДАРТНЫЙ комментарий решения в DecisionPanel - («Ваше решение»), см. ClearanceView (commentRequired/commentPlaceholder). */} - {writeOffEditableKeys && ( - <> -
Суммы к списанию
- {WRITE_OFF_CATEGORIES.map((cat) => { - const editable = writeOffEditableKeys.has(cat.key); - return ( - - set(cat.amountField, v)} - readOnly={editable ? false : undefined} - /> - - ); - })} - - )} + {/* Суммы к списанию — TrainingAmount («Обучение: сумма», правит только + КДП) ПОДВЕДЕНА под тот же заголовок, что и 5 сумм ниже (правит любой + активный согласующий, см. WRITE_OFF_CATEGORIES) — визуально одна + группа «Суммы к списанию», хотя права на них разные. Без заголовка + «Обучение» из WRITE_OFF_CATEGORIES читалось бы дублем «Обучение: + сумма» — их когда-то было два похожих поля, оставили одно (TrainingAmount, + см. README «Отдельный механизм от TrainingAmount»), но заголовок группы + пригодился и без второго «Обучение». + Явный readOnly={false} у TrainingAmount перебивает read-only контекст + просмотра (профильный согласующий правит своё поле); undefined — + обычное поведение из FormMode. У сумм из WRITE_OFF_CATEGORIES — + заполнить может ЛЮБОЙ активный согласующий (не только профильный), но + как только сумма указана, блокируется навсегда для всех, поэтому у + незаблокированных (writeOffEditableKeys.has(cat.key)) readOnly={false}, + у остальных — обычное поведение FormMode. «За что конкретно» — своего + поля здесь нет: заполнил хоть одну сумму — обязательным становится + СТАНДАРТНЫЙ комментарий решения в DecisionPanel («Ваше решение»), см. + ClearanceView (commentRequired/commentPlaceholder). */} + {writeOffEditableKeys &&
Суммы к списанию
} + + set('TrainingAmount', v)} + readOnly={hrRecordsEditable ? false : undefined} + /> + + {writeOffEditableKeys && + WRITE_OFF_CATEGORIES.map((cat) => { + const editable = writeOffEditableKeys.has(cat.key); + return ( + + set(cat.amountField, v)} + readOnly={editable ? false : undefined} + /> + + ); + })} {/* Есть только у листов, созданных автоматически по согласованному заявлению на увольнение (см. forms/Dismissal/createClearance.ts). */}