fix: убрать заголовок «Заявка», вернуть стиль секции для сумм списания
Tests / frontend-test (pull_request) Successful in 1m10s

Заменил CollapseSection на FormGrid (без заголовка/иконки) в Clearance,
Dismissal, Vacation и UnpaidLeave — заголовок «Заявка» не нёс смысла
и полностью убран, а не переименован. В Clearance «Суммы к списанию»
вынесены в отдельную CollapseSection — тот же визуальный стиль
заголовка, что раньше был у общей «Заявка», вместо самодельной подписи
через RequestSection.module.scss (файл удалён как более не нужный).
This commit is contained in:
gorbenko.pavel
2026-08-26 15:06:06 +05:00
parent 4eaf133954
commit 6d154b7608
6 changed files with 52 additions and 61 deletions
@@ -55,9 +55,9 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова
заведённых руками, ссылки нет и поле не рендерится. заведённых руками, ссылки нет и поле не рендерится.
## Суммы к списанию (согласование) ## Суммы к списанию (согласование)
Общий заголовок-подпись «СУММЫ К СПИСАНИЮ» (`RequestSection.module.scss`, Отдельная `CollapseSection title="Суммы к списанию"` (в стиле бывшего общего
`.writeOffLabel`) объединяет визуально ДВЕ РАЗНЫЕ по правам вещи, идущие сразу заголовка формы «Заявка», удалённого — см. `docs/forms.md`) объединяет
за подписью: визуально ДВЕ РАЗНЫЕ по правам вещи:
1. **`TrainingAmount`** («Обучение») — доступность КАК И РАНЬШЕ: правит 1. **`TrainingAmount`** («Обучение») — доступность КАК И РАНЬШЕ: правит
только КДП (`hrRecordsEditable`, `approverRights.ts`), сумма НЕ блокируется только КДП (`hrRecordsEditable`, `approverRights.ts`), сумма НЕ блокируется
@@ -65,10 +65,10 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова
(не требует комментария решения). Изменилась ТОЛЬКО колонка хранения — пишется (не требует комментария решения). Изменилась ТОЛЬКО колонка хранения — пишется
и читается через `WriteOffTrainingAmount` (`ClearanceView.saveApproverFields`, и читается через `WriteOffTrainingAmount` (`ClearanceView.saveApproverFields`,
`submit.ts.buildItem`, `load.ts`), а не через одноимённую `TrainingAmount` — `submit.ts.buildItem`, `load.ts`), а не через одноимённую `TrainingAmount` —
та осталась в схеме списка неиспользуемой. Заголовок рисуется независимо от та осталась в схеме списка неиспользуемой. Секция видна независимо от
поля (`writeOffEditableKeys && <div>…</div>`, а само поле — БЕЗ этого условия), `writeOffEditableKeys` (само поле — без этого условия), поэтому на форме
поэтому на форме подачи (`ClearanceForm`, `writeOffEditableKeys` не передан) подачи (`ClearanceForm`, `writeOffEditableKeys` не передан) поле видно и без
поле видно и без заголовка. пяти сумм ниже.
2. **5 НЕЗАВИСИМЫХ сумм**, компактной сеткой (короткие подписи, обычная 2. **5 НЕЗАВИСИМЫХ сумм**, компактной сеткой (короткие подписи, обычная
2-колоночная сетка секции), колонки `WriteOff{Assets,Ppe,Accountable,Nma, 2-колоночная сетка секции), колонки `WriteOff{Assets,Ppe,Accountable,Nma,
Tmc}Amount` (см. `model.ts WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная Tmc}Amount` (см. `model.ts WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная
@@ -103,8 +103,9 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова
## Секции формы ## Секции формы
RequestSection (сотрудник · должность · подразделение · дата расторжения · RequestSection (сотрудник · должность · подразделение · дата расторжения ·
парковочная карта · карта СКУД · «Суммы к списанию»: обучение + 5 сумм списания парковочная карта · карта СКУД — без заголовка, `FormGrid`) + отдельная
компактно под общим заголовком · ссылка на заявление) CollapseSection «Суммы к списанию» (обучение + 5 сумм списания) + ссылка на
заявление
## Точки входа ## Точки входа
- rptype: `clearance-form` - rptype: `clearance-form`
@@ -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;
}
@@ -1,7 +1,6 @@
import * as React from 'react'; 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 { ISectionProps, EMPLOYEE_PLACEHOLDER, WRITE_OFF_CATEGORIES } from '../model';
import styles from './RequestSection.module.scss';
// Подразделение подтягивается автоматически при выборе сотрудника (см. // Подразделение подтягивается автоматически при выборе сотрудника (см.
// ClearanceForm.handleEmployeeChange — SharePoint User Profile) — свободный // ClearanceForm.handleEmployeeChange — SharePoint User Profile) — свободный
@@ -34,7 +33,8 @@ export const RequestSection: React.FC<IRequestSectionProps> = ({
writeOffEditableKeys writeOffEditableKeys
}) => { }) => {
return ( return (
<CollapseSection title="Заявка" icon="people"> <>
<FormGrid>
<FormField label="Сотрудник" htmlFor="Employee" required full> <FormField label="Сотрудник" htmlFor="Employee" required full>
<PeopleField <PeopleField
context={context} context={context}
@@ -90,23 +90,28 @@ export const RequestSection: React.FC<IRequestSectionProps> = ({
readOnly={hrRecordsEditable ? false : undefined} readOnly={hrRecordsEditable ? false : undefined}
/> />
</FormField> </FormField>
{/* Суммы к списанию — TrainingAmount («Обучение: сумма») ПОДВЕДЕНА под </FormGrid>
тот же заголовок, что и 5 сумм ниже, — визуально одна группа «Суммы к {/* Суммы к списанию — своя CollapseSection (тот же стиль заголовка, что
списанию», хотя ДОСТУПНОСТЬ у них РАЗНАЯ: раньше был у общего «Заявка»), объединяет визуально ДВЕ РАЗНЫЕ по
- TrainingAmount — как раньше: правит только КДП (hrRecordsEditable), правам вещи:
без блокировки после ввода; хранится в WriteOffTrainingAmount (не - TrainingAmount («Обучение») — как раньше: правит только КДП
одноимённой колонке, см. IFormData.TrainingAmount), но это деталь (hrRecordsEditable), без блокировки после ввода; хранится в
хранения, на форму не влияет; WriteOffTrainingAmount (не одноимённой колонке, см.
- WRITE_OFF_CATEGORIES (5 сумм) — заполнить может ЛЮБОЙ активный IFormData.TrainingAmount), но это деталь хранения, на форму не
согласующий (не только профильный), но как только сумма указана, влияет. Показывается всегда, даже без writeOffEditableKeys (форма
блокируется НАВСЕГДА для всех, поэтому у незаблокированных подачи).
(writeOffEditableKeys.has(cat.key)) readOnly={false}, у остальных - WRITE_OFF_CATEGORIES (5 сумм) — заполнить может ЛЮБОЙ активный
— обычное поведение FormMode. «За что конкретно» у них — своего согласующий (не только профильный), но как только сумма указана,
поля нет: заполнил хоть одну сумму — обязательным становится блокируется НАВСЕГДА для всех, поэтому у незаблокированных
СТАНДАРТНЫЙ комментарий решения в DecisionPanel («Ваше решение»), (writeOffEditableKeys.has(cat.key)) readOnly={false}, у остальных
см. ClearanceView (commentRequired/commentPlaceholder). У — обычное поведение FormMode. «За что конкретно» у них — своего
TrainingAmount этого правила нет — комментарий не требует. */} поля нет: заполнил хоть одну сумму — обязательным становится
{writeOffEditableKeys && <div className={styles.writeOffLabel}>Суммы к списанию</div>} СТАНДАРТНЫЙ комментарий решения в DecisionPanel («Ваше решение»),
см. ClearanceView (commentRequired/commentPlaceholder). У
TrainingAmount этого правила нет — комментарий не требует. Сама
секция видна всегда (Обучение доступно и на форме подачи), а 5
категорий — только на согласовании (writeOffEditableKeys задан). */}
<CollapseSection title="Суммы к списанию" icon="calculator">
<FormField label="Обучение" htmlFor="TrainingAmount"> <FormField label="Обучение" htmlFor="TrainingAmount">
<MoneyInput <MoneyInput
id="TrainingAmount" id="TrainingAmount"
@@ -129,13 +134,14 @@ export const RequestSection: React.FC<IRequestSectionProps> = ({
</FormField> </FormField>
); );
})} })}
{/* Есть только у листов, созданных автоматически по согласованному заявлению
на увольнение (см. forms/Dismissal/createClearance.ts). */}
<LinkField
label="Заявление на увольнение"
url={data.DismissalUrl}
text="Открыть заявление, по которому создан этот лист"
/>
</CollapseSection> </CollapseSection>
{/* Есть только у листов, созданных автоматически по согласованному заявлению
на увольнение (см. forms/Dismissal/createClearance.ts). */}
<LinkField
label="Заявление на увольнение"
url={data.DismissalUrl}
text="Открыть заявление, по которому создан этот лист"
/>
</>
); );
}; };
@@ -1,5 +1,5 @@
import * as React from 'react'; 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 { ISectionProps, EMPLOYEE_PLACEHOLDER, MIN_NOTICE_MONTHS } from '../model';
import { isoDatePlusMonths } from '../../../shared/dateUtils'; import { isoDatePlusMonths } from '../../../shared/dateUtils';
import { OrganizationsTable } from './OrganizationsTable'; import { OrganizationsTable } from './OrganizationsTable';
@@ -28,7 +28,7 @@ export const RequestSection: React.FC<IRequestSectionProps> = ({
onRemoveOrganization, onRemoveOrganization,
assetsAcceptorEditable assetsAcceptorEditable
}) => ( }) => (
<CollapseSection title="Заявка" icon="document"> <FormGrid>
<FormField label="Сотрудник" htmlFor="Employee" required full> <FormField label="Сотрудник" htmlFor="Employee" required full>
<PeopleField <PeopleField
context={context} context={context}
@@ -91,5 +91,5 @@ export const RequestSection: React.FC<IRequestSectionProps> = ({
readOnly={assetsAcceptorEditable ? false : true} readOnly={assetsAcceptorEditable ? false : true}
/> />
</FormField> </FormField>
</CollapseSection> </FormGrid>
); );
@@ -1,11 +1,11 @@
import * as React from 'react'; 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 { ISectionProps, EMPLOYEE_PLACEHOLDER, SUBSTITUTE_PLACEHOLDER, MIN_NOTICE_DAYS } from '../model';
import { isoDatePlusDays } from '../../../shared/dateUtils'; import { isoDatePlusDays } from '../../../shared/dateUtils';
/** Единственная секция формы «Отпуск без содержания»: сотрудник, должность, период, основание, замещающий. */ /** Единственная секция формы «Отпуск без содержания»: сотрудник, должность, период, основание, замещающий. */
export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, onEmployeeChange }) => ( export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, onEmployeeChange }) => (
<CollapseSection title="Заявка" icon="people"> <FormGrid>
<FormField label="Сотрудник" htmlFor="Employee" required full> <FormField label="Сотрудник" htmlFor="Employee" required full>
<PeopleField <PeopleField
context={context} context={context}
@@ -41,5 +41,5 @@ export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, on
placeholder={SUBSTITUTE_PLACEHOLDER} placeholder={SUBSTITUTE_PLACEHOLDER}
/> />
</FormField> </FormField>
</CollapseSection> </FormGrid>
); );
@@ -1,11 +1,11 @@
import * as React from 'react'; 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 { ISectionProps, EMPLOYEE_PLACEHOLDER, SUBSTITUTE_PLACEHOLDER, MIN_NOTICE_DAYS } from '../model';
import { isoDatePlusDays } from '../../../shared/dateUtils'; import { isoDatePlusDays } from '../../../shared/dateUtils';
/** Единственная секция формы «Заявка на отпуск»: сотрудник, должность, даты. */ /** Единственная секция формы «Заявка на отпуск»: сотрудник, должность, даты. */
export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, onEmployeeChange }) => ( export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, onEmployeeChange }) => (
<CollapseSection title="Заявка" icon="people"> <FormGrid>
<FormField label="Сотрудник" htmlFor="Employee" required full> <FormField label="Сотрудник" htmlFor="Employee" required full>
<PeopleField <PeopleField
context={context} context={context}
@@ -38,5 +38,5 @@ export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, on
placeholder={SUBSTITUTE_PLACEHOLDER} placeholder={SUBSTITUTE_PLACEHOLDER}
/> />
</FormField> </FormField>
</CollapseSection> </FormGrid>
); );