diff --git a/src/webparts/requestPortal/forms/Clearance/README.md b/src/webparts/requestPortal/forms/Clearance/README.md
index c3eea21..048fa68 100644
--- a/src/webparts/requestPortal/forms/Clearance/README.md
+++ b/src/webparts/requestPortal/forms/Clearance/README.md
@@ -55,9 +55,9 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова
заведённых руками, ссылки нет и поле не рендерится.
## Суммы к списанию (согласование)
-Общий заголовок-подпись «СУММЫ К СПИСАНИЮ» (`RequestSection.module.scss`,
-`.writeOffLabel`) объединяет визуально ДВЕ РАЗНЫЕ по правам вещи, идущие сразу
-за подписью:
+Отдельная `CollapseSection title="Суммы к списанию"` (в стиле бывшего общего
+заголовка формы «Заявка», удалённого — см. `docs/forms.md`) объединяет
+визуально ДВЕ РАЗНЫЕ по правам вещи:
1. **`TrainingAmount`** («Обучение») — доступность КАК И РАНЬШЕ: правит
только КДП (`hrRecordsEditable`, `approverRights.ts`), сумма НЕ блокируется
@@ -65,10 +65,10 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова
(не требует комментария решения). Изменилась ТОЛЬКО колонка хранения — пишется
и читается через `WriteOffTrainingAmount` (`ClearanceView.saveApproverFields`,
`submit.ts.buildItem`, `load.ts`), а не через одноимённую `TrainingAmount` —
- та осталась в схеме списка неиспользуемой. Заголовок рисуется независимо от
- поля (`writeOffEditableKeys &&
…
`, а само поле — БЕЗ этого условия),
- поэтому на форме подачи (`ClearanceForm`, `writeOffEditableKeys` не передан)
- поле видно и без заголовка.
+ та осталась в схеме списка неиспользуемой. Секция видна независимо от
+ `writeOffEditableKeys` (само поле — без этого условия), поэтому на форме
+ подачи (`ClearanceForm`, `writeOffEditableKeys` не передан) поле видно и без
+ пяти сумм ниже.
2. **5 НЕЗАВИСИМЫХ сумм**, компактной сеткой (короткие подписи, обычная
2-колоночная сетка секции), колонки `WriteOff{Assets,Ppe,Accountable,Nma,
Tmc}Amount` (см. `model.ts WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная
@@ -103,8 +103,9 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова
## Секции формы
RequestSection (сотрудник · должность · подразделение · дата расторжения ·
-парковочная карта · карта СКУД · «Суммы к списанию»: обучение + 5 сумм списания
-компактно под общим заголовком · ссылка на заявление)
+парковочная карта · карта СКУД — без заголовка, `FormGrid`) + отдельная
+CollapseSection «Суммы к списанию» (обучение + 5 сумм списания) + ссылка на
+заявление
## Точки входа
- rptype: `clearance-form`
diff --git a/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.module.scss b/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.module.scss
deleted file mode 100644
index 7110a9a..0000000
--- a/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.module.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-@import '../../../../../styles/design-tokens';
-
-// Заголовок группы полей ВНУТРИ секции (не отдельная CollapseSection) — нужен
-// только затем, чтобы 6 сумм к списанию не читались продолжением полей выше
-// (в частности — не путались с «Обучение: сумма», отдельным полем КДП чуть
-// выше по форме: без подписи оба «Обучение» рядом выглядели одним и тем же).
-.writeOffLabel {
- grid-column: 1 / -1;
- margin-top: $sp-2;
- color: $gray-500;
- font-family: $font-sans;
- font-size: $fs-overline;
- font-weight: 600;
- letter-spacing: 1.4px;
- text-transform: uppercase;
-}
diff --git a/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx
index 46ef9cb..9d1850f 100644
--- a/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx
+++ b/src/webparts/requestPortal/forms/Clearance/sections/RequestSection.tsx
@@ -1,7 +1,6 @@
import * as React from 'react';
-import { CollapseSection, FormField, TextInput, MoneyInput, Toggle, PeopleField, OrganizationField, LinkField } from '../../../shared/ui';
+import { FormGrid, CollapseSection, FormField, TextInput, MoneyInput, Toggle, PeopleField, OrganizationField, LinkField } from '../../../shared/ui';
import { ISectionProps, EMPLOYEE_PLACEHOLDER, WRITE_OFF_CATEGORIES } from '../model';
-import styles from './RequestSection.module.scss';
// Подразделение подтягивается автоматически при выборе сотрудника (см.
// ClearanceForm.handleEmployeeChange — SharePoint User Profile) — свободный
@@ -34,7 +33,8 @@ export const RequestSection: React.FC = ({
writeOffEditableKeys
}) => {
return (
-
+ <>
+
= ({
readOnly={hrRecordsEditable ? false : undefined}
/>
- {/* Суммы к списанию — TrainingAmount («Обучение: сумма») ПОДВЕДЕНА под
- тот же заголовок, что и 5 сумм ниже, — визуально одна группа «Суммы к
- списанию», хотя ДОСТУПНОСТЬ у них РАЗНАЯ:
- - TrainingAmount — как раньше: правит только КДП (hrRecordsEditable),
- без блокировки после ввода; хранится в WriteOffTrainingAmount (не
- одноимённой колонке, см. IFormData.TrainingAmount), но это деталь
- хранения, на форму не влияет;
- - WRITE_OFF_CATEGORIES (5 сумм) — заполнить может ЛЮБОЙ активный
- согласующий (не только профильный), но как только сумма указана,
- блокируется НАВСЕГДА для всех, поэтому у незаблокированных
- (writeOffEditableKeys.has(cat.key)) readOnly={false}, у остальных
- — обычное поведение FormMode. «За что конкретно» у них — своего
- поля нет: заполнил хоть одну сумму — обязательным становится
- СТАНДАРТНЫЙ комментарий решения в DecisionPanel («Ваше решение»),
- см. ClearanceView (commentRequired/commentPlaceholder). У
- TrainingAmount этого правила нет — комментарий не требует. */}
- {writeOffEditableKeys && Суммы к списанию
}
+
+ {/* Суммы к списанию — своя CollapseSection (тот же стиль заголовка, что
+ раньше был у общего «Заявка»), объединяет визуально ДВЕ РАЗНЫЕ по
+ правам вещи:
+ - TrainingAmount («Обучение») — как раньше: правит только КДП
+ (hrRecordsEditable), без блокировки после ввода; хранится в
+ WriteOffTrainingAmount (не одноимённой колонке, см.
+ IFormData.TrainingAmount), но это деталь хранения, на форму не
+ влияет. Показывается всегда, даже без writeOffEditableKeys (форма
+ подачи).
+ - WRITE_OFF_CATEGORIES (5 сумм) — заполнить может ЛЮБОЙ активный
+ согласующий (не только профильный), но как только сумма указана,
+ блокируется НАВСЕГДА для всех, поэтому у незаблокированных
+ (writeOffEditableKeys.has(cat.key)) readOnly={false}, у остальных
+ — обычное поведение FormMode. «За что конкретно» у них — своего
+ поля нет: заполнил хоть одну сумму — обязательным становится
+ СТАНДАРТНЫЙ комментарий решения в DecisionPanel («Ваше решение»),
+ см. ClearanceView (commentRequired/commentPlaceholder). У
+ TrainingAmount этого правила нет — комментарий не требует. Сама
+ секция видна всегда (Обучение доступно и на форме подачи), а 5
+ категорий — только на согласовании (writeOffEditableKeys задан). */}
+
= ({
);
})}
- {/* Есть только у листов, созданных автоматически по согласованному заявлению
- на увольнение (см. forms/Dismissal/createClearance.ts). */}
-
+ {/* Есть только у листов, созданных автоматически по согласованному заявлению
+ на увольнение (см. forms/Dismissal/createClearance.ts). */}
+
+ >
);
};
diff --git a/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx
index 9d09fa2..3fe75c0 100644
--- a/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx
+++ b/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx
@@ -1,5 +1,5 @@
import * as React from 'react';
-import { CollapseSection, FormField, TextInput, TextArea, PhoneInput, PeopleField, LinkField } from '../../../shared/ui';
+import { FormGrid, FormField, TextInput, TextArea, PhoneInput, PeopleField, LinkField } from '../../../shared/ui';
import { ISectionProps, EMPLOYEE_PLACEHOLDER, MIN_NOTICE_MONTHS } from '../model';
import { isoDatePlusMonths } from '../../../shared/dateUtils';
import { OrganizationsTable } from './OrganizationsTable';
@@ -28,7 +28,7 @@ export const RequestSection: React.FC = ({
onRemoveOrganization,
assetsAcceptorEditable
}) => (
-
+
= ({
readOnly={assetsAcceptorEditable ? false : true}
/>
-
+
);
diff --git a/src/webparts/requestPortal/forms/UnpaidLeave/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/UnpaidLeave/sections/RequestSection.tsx
index 039fba1..a88f83a 100644
--- a/src/webparts/requestPortal/forms/UnpaidLeave/sections/RequestSection.tsx
+++ b/src/webparts/requestPortal/forms/UnpaidLeave/sections/RequestSection.tsx
@@ -1,11 +1,11 @@
import * as React from 'react';
-import { CollapseSection, FormField, TextInput, TextArea, PeopleField, OrganizationField } from '../../../shared/ui';
+import { FormGrid, FormField, TextInput, TextArea, PeopleField, OrganizationField } from '../../../shared/ui';
import { ISectionProps, EMPLOYEE_PLACEHOLDER, SUBSTITUTE_PLACEHOLDER, MIN_NOTICE_DAYS } from '../model';
import { isoDatePlusDays } from '../../../shared/dateUtils';
/** Единственная секция формы «Отпуск без содержания»: сотрудник, должность, период, основание, замещающий. */
export const RequestSection: React.FC = ({ data, set, context, onEmployeeChange }) => (
-
+
= ({ data, set, context, on
placeholder={SUBSTITUTE_PLACEHOLDER}
/>
-
+
);
diff --git a/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx
index 0b80dcb..abe6cba 100644
--- a/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx
+++ b/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx
@@ -1,11 +1,11 @@
import * as React from 'react';
-import { CollapseSection, FormField, TextInput, PeopleField, OrganizationField } from '../../../shared/ui';
+import { FormGrid, FormField, TextInput, PeopleField, OrganizationField } from '../../../shared/ui';
import { ISectionProps, EMPLOYEE_PLACEHOLDER, SUBSTITUTE_PLACEHOLDER, MIN_NOTICE_DAYS } from '../model';
import { isoDatePlusDays } from '../../../shared/dateUtils';
/** Единственная секция формы «Заявка на отпуск»: сотрудник, должность, даты. */
export const RequestSection: React.FC = ({ data, set, context, onEmployeeChange }) => (
-
+
= ({ data, set, context, on
placeholder={SUBSTITUTE_PLACEHOLDER}
/>
-
+
);