Правки (#16)
Tests / frontend-test (push) Successful in 1m11s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/16
This commit was merged in pull request #16.
This commit is contained in:
2026-08-26 11:10:26 +00:00
parent 418e30dfc3
commit 92b95050fa
18 changed files with 271 additions and 244 deletions
@@ -33,6 +33,17 @@ interface IDecisionPanelProps {
search?: (query: string) => Promise<ISiteUser[]>;
/** Вызывается после успешного переназначения (обновить экран/матрицу). */
onDelegated?: () => void;
/**
* Дополнительное условие обязательности комментария — СВЕРХ обычного
* «возврат/отклонение». Форме есть что объяснять не только при отказе:
* например, «Обходной лист» требует его на ЛЮБОЕ решение, если согласующий
* только что заполнил сумму к списанию — своего поля «за что конкретно» у
* формы нет, вместо него используется этот самый комментарий (см.
* ClearanceView.writeOffTouchedCategories).
*/
commentRequired?: boolean;
/** Переопределить плейсхолдер поля комментария (по умолчанию — про возврат/отклонение). */
commentPlaceholder?: string;
}
// Панель решения текущего шага: согласующий (Согласовать/Вернуть/Отклонить) или
@@ -45,6 +56,8 @@ export const DecisionPanel: React.FC<IDecisionPanelProps> = ({
onBeforeDecide,
search,
onDelegated,
commentRequired,
commentPlaceholder,
}) => {
const [checking, setChecking] = useState<boolean>(true);
const [pendingRow, setPendingRow] = useState<IPendingRow | undefined>(undefined);
@@ -84,10 +97,15 @@ export const DecisionPanel: React.FC<IDecisionPanelProps> = ({
if (!pendingRow) {
return;
}
if ((decision === 'return' || decision === 'reject') && comment.trim().length === 0) {
const commentEmpty = comment.trim().length === 0;
if (commentEmpty && (decision === 'return' || decision === 'reject')) {
setError('Для возврата или отклонения укажите комментарий.');
return;
}
if (commentEmpty && commentRequired) {
setError('Укажите комментарий.');
return;
}
setError(null);
setSubmitting(true);
try {
@@ -300,12 +318,12 @@ export const DecisionPanel: React.FC<IDecisionPanelProps> = ({
<div className={styles.panel}>
<div className={styles.title}>Ваше решение</div>
{error && <Alert variant="err">{error}</Alert>}
<FormField label="Комментарий" htmlFor="decisionComment">
<FormField label="Комментарий" htmlFor="decisionComment" required={commentRequired}>
<TextArea
id="decisionComment"
value={comment}
onChange={setComment}
placeholder="Комментарий (обязателен при возврате или отклонении)"
placeholder={commentPlaceholder || 'Комментарий (обязателен при возврате или отклонении)'}
/>
</FormField>
<div className={styles.actions}>