43 lines
2.3 KiB
TypeScript
43 lines
2.3 KiB
TypeScript
import { confirmModal } from '@tnsu/ui-kit';
|
|
|
|
// Есть ли в открытой форме «Новая заявка» правки, которые ещё не сохранены.
|
|
//
|
|
// Нужно, потому что раздел «Новая заявка» держится смонтированным при
|
|
// переключении вкладок (см. RequestPortal.tsx), и единственное, что реально
|
|
// пересоздаёт форму, — переход «создать на основе». Перед ним и спрашиваем,
|
|
// но только если терять действительно есть что.
|
|
//
|
|
// Флаг ставится по факту пользовательского ввода (событие input/change из
|
|
// раздела формы — см. RequestPortal), а снимается после сохранения: черновик
|
|
// тоже считается сохранением, форма зовёт onSaved и в обоих случаях
|
|
// («Сохранить черновик» и «Отправить»), см. forms/*/Form.tsx.
|
|
let dirty = false;
|
|
|
|
export function markFormDirty(): void {
|
|
dirty = true;
|
|
}
|
|
|
|
export function markFormClean(): void {
|
|
dirty = false;
|
|
}
|
|
|
|
export function hasUnsavedFormChanges(): boolean {
|
|
return dirty;
|
|
}
|
|
|
|
// Спросить подтверждение, если несохранённые правки есть. Промис резолвится в
|
|
// true — можно продолжать (правок нет либо пользователь согласился их потерять),
|
|
// false — отменить действие. Асинхронно, потому что показываем модалку в стиле
|
|
// портала (см. shared/ui/ConfirmDialog) вместо нативного window.confirm.
|
|
export function confirmDiscardFormChanges(): Promise<boolean> {
|
|
if (!dirty) return Promise.resolve(true);
|
|
return confirmModal({
|
|
title: 'Несохранённые изменения',
|
|
message:
|
|
'В открытой форме «Новая заявка» есть несохранённые изменения — они будут потеряны. Продолжить?',
|
|
confirmText: 'Да, продолжить',
|
|
cancelText: 'Остаться',
|
|
danger: true,
|
|
});
|
|
}
|