merge branch
Tests / frontend-test (push) Successful in 1m10s

This commit is contained in:
Тимур Городецкий
2026-08-26 16:03:49 +05:00
40 changed files with 2462 additions and 47 deletions
@@ -11,8 +11,20 @@ interface IDecisionPanelProps {
service: ApproverService;
/** Id заявки (элемент списка данных). */
requestId: number;
/** Уведомление после сохранения решения (например, обновить статус на экране). */
onDecided?: (status: string) => void;
/**
* Уведомление после сохранения решения (например, обновить статус на экране).
*
* Может вернуть Promise — тогда панель ДОЖДЁТСЯ его и только потом покажет
* «Решение сохранено». Так работают побочные действия решения, без которых
* ответ «согласовано» неполон: по согласованному заявлению на увольнение
* автоматически создаётся обходной лист (см. forms/Dismissal), и сообщать об
* успехе, пока он не создан, — значит показывать успех раньше времени.
*
* Отказ (reject) панель НЕ считает провалом решения — решение к этому моменту
* уже применено на сервере; сообщить о проблеме побочного действия должен сам
* обработчик (у него для этого есть своя область экрана).
*/
onDecided?: (status: string) => void | Promise<void>;
/** Выполнить ПЕРЕД применением решения (напр. сохранить поля, заполненные
* согласующим). Если бросит — решение не применяется, показывается ошибка. */
onBeforeDecide?: () => Promise<void>;
@@ -83,11 +95,19 @@ export const DecisionPanel: React.FC<IDecisionPanelProps> = ({
await onBeforeDecide();
}
const status = await service.decide(requestId, pendingRow.id, decision, comment.trim());
// Сначала побочные действия решения, потом «сохранено»: пока onDecided не
// отработал, кнопки остаются заблокированными (submitting), и пользователь не
// видит успеха раньше, чем всё сделано. Провал onDecided на статус решения не
// влияет — оно уже применено, поэтому сообщение показываем всё равно.
if (onDecided) {
try {
await onDecided(status);
} catch (e) {
console.error('Побочное действие после решения не выполнилось', e);
}
}
setResultStatus(status);
setSubmitting(false);
if (onDecided) {
onDecided(status);
}
} catch (e) {
setError(`Не удалось сохранить решение: ${(e as Error).message}`);
setSubmitting(false);