@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user