feat: памятка HR и подсветка ошибок полей в заявках на отпуск
Tests / frontend-test (push) Successful in 2m5s

LeavePrintNotice заменён общим LeaveNotice с заголовком и пунктами из model.ts
каждой формы: в отпуске — примечание HR (ст. 92 ТК РК, срок подачи, подписание
в отделе кадров), в отпуске без содержания — прежняя памятка про печать.
Проверки отпуска вынесены в validation.ts и показываются под полями через
FieldIssuesProvider, как в приёме и подборе.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-15 15:13:02 +05:00
parent e811186cec
commit ac1b66d0df
12 changed files with 137 additions and 58 deletions
@@ -0,0 +1,8 @@
.list {
margin: 6px 0 0;
padding-left: 20px;
}
.item + .item {
margin-top: 4px;
}
@@ -0,0 +1,39 @@
import * as React from 'react';
import { Alert } from '@tnsu/ui-kit';
import styles from './LeaveNotice.module.scss';
interface Props {
/** Заголовок плашки, например «Примечание» или «Памятка». */
title: string;
/** Пункты текста. Один пункт — идёт сразу за заголовком, несколько — списком. */
items: string[];
}
/**
* Плашка с правилами для заявлений на отпуск (трудовой и без содержания).
* Тексты у форм разные, поэтому приходят из model.ts каждой формы.
* Вариант warn, а не info: нейтральная плашка терялась на фоне формы.
* На печать не выводится — это подсказка для сотрудника, а не часть заявления.
*/
export const LeaveNotice: React.FC<Props> = ({ title, items }) => {
if (items.length === 0) return null;
return (
<div className="rp-no-print">
<Alert variant="warn">
<strong>{title}.</strong>
{items.length === 1 ? (
<> {items[0]}</>
) : (
<ul className={styles.list}>
{items.map((item) => (
<li key={item} className={styles.item}>
{item}
</li>
))}
</ul>
)}
</Alert>
</div>
);
};
@@ -1,22 +0,0 @@
import * as React from 'react';
import { Alert } from '@tnsu/ui-kit';
/** Пользовательские тексты памятки — в одном месте (задел под локализацию). */
const NOTICE_TITLE = 'Памятка';
const NOTICE_TEXT =
'После согласования заявления его необходимо распечатать с портала (кнопка «Печать» на странице заявки), ' +
'собственноручно подписать и передать специалисту отдела кадров.';
/**
* Памятка для заявлений на отпуск (трудовой и без содержания): что сделать после
* согласования. Подписанный бумажный экземпляр нужен отделу кадров, поэтому
* напоминаем и при подаче, и при просмотре. На печать не выводится.
* Вариант warn, а не info: нейтральная плашка терялась на фоне формы.
*/
export const LeavePrintNotice: React.FC = () => (
<div className="rp-no-print">
<Alert variant="warn">
<strong>{NOTICE_TITLE}.</strong> {NOTICE_TEXT}
</Alert>
</div>
);
@@ -59,6 +59,6 @@ export { issueLabels } from './FieldIssues/fieldIssues';
export { getDraftDeleteHandler } from './SubmitActions/getDraftDeleteHandler';
export { InitiatorLine } from './InitiatorLine/InitiatorLine';
export type { IInitiatorLineProps } from './InitiatorLine/InitiatorLine';
export { LeavePrintNotice } from './LeavePrintNotice/LeavePrintNotice';
export { LeaveNotice } from './LeaveNotice/LeaveNotice';
export { useRequestSubmit } from './useRequestSubmit';
export type { IRequestSubmit, SubmitKind } from './useRequestSubmit';