feat: удаление своих заявок в статусе Черновик
Tests / frontend-test (push) Successful in 1m15s

This commit is contained in:
Тимур Городецкий
2026-09-24 16:52:53 +05:00
parent 852b16c327
commit 9b83c54491
18 changed files with 355 additions and 3 deletions
@@ -53,6 +53,12 @@ export interface ISubmitActionsProps {
onSubmit: () => void;
/** Подпись основной кнопки. По умолчанию — «Отправить на согласование». */
submitLabel?: string;
/**
* Удалить черновик (см. getDraftDeleteHandler). Не задан — кнопки нет: заявка ещё
* не сохранена или уже не черновик. Заморозка подачи на удаление не влияет —
* это уборка своего, а не подача.
*/
onDelete?: () => void;
}
// Единый ряд кнопок форм подачи: Отмена / Сохранить черновик / Отправить.
@@ -69,6 +75,7 @@ export const SubmitActions: React.FC<ISubmitActionsProps> = ({
onSaveDraft,
onSubmit,
submitLabel = 'Отправить на согласование',
onDelete,
}) => {
const { saving, kind } = submit;
const unfrozenForm = formId != null && UNFROZEN_FORMS.has(formId);
@@ -97,6 +104,12 @@ export const SubmitActions: React.FC<ISubmitActionsProps> = ({
<>
{frozen && !readOnly && <Alert variant="warn">Подача заявок временно недоступна.</Alert>}
<FormActions>
{onDelete && (
<Button variant="danger" onClick={onDelete} disabled={saving}>
<Icon name="trash" size="sm" />
Удалить черновик
</Button>
)}
<Button variant="secondary" onClick={onCancel} disabled={saving}>
Отмена
</Button>
@@ -0,0 +1,39 @@
import { RequestTypeId } from '../../../models/types';
import { confirmAndDeleteDraft, isDeletableStatus } from '../../draftDeletion';
import { friendlyErrorMessage } from '../../diagnostics';
import { markFormClean } from '../../unsavedChanges';
import { IRequestSubmit } from '../useRequestSubmit';
export interface IDraftDeletionParams {
formKey: RequestTypeId;
/** Id сохранённой заявки; undefined — новая, ещё не сохранённая (удалять нечего). */
requestId: number | undefined;
requestStatus: string | undefined;
listId?: string;
code?: string;
/** Ошибка удаления показывается там же, где ошибки сохранения формы. */
submit: IRequestSubmit;
/** После удаления — уйти с формы (обычно onCancel формы: к плиткам / закрыть панель). */
onDeleted: () => void;
}
/**
* Обработчик кнопки «Удалить черновик» для SubmitActions (проп onDelete).
* undefined — кнопку не показывать: заявка не сохранена или уже не черновик.
*/
export function getDraftDeleteHandler(params: IDraftDeletionParams): (() => void) | undefined {
const { formKey, requestId, requestStatus, listId, code, submit, onDeleted } = params;
if (!requestId || !isDeletableStatus(requestStatus)) return undefined;
return () => {
confirmAndDeleteDraft({ formKey, itemId: requestId, listId, code })
.then((deleted) => {
if (!deleted) return;
// Черновика больше нет — предупреждать о «несохранённых правках» при
// уходе с формы уже не о чем.
markFormClean();
onDeleted();
})
.catch((e) => submit.setError(`Не удалось удалить черновик: ${friendlyErrorMessage(e)}`));
};
}
@@ -46,6 +46,7 @@ export { OrgLetterhead } from './OrgLetterhead/OrgLetterhead';
export { LinkField } from './LinkField/LinkField';
export { ErrorOverlay } from './ErrorOverlay/ErrorOverlay';
export { SubmitActions } from './SubmitActions/SubmitActions';
export { getDraftDeleteHandler } from './SubmitActions/getDraftDeleteHandler';
export { InitiatorLine } from './InitiatorLine/InitiatorLine';
export type { IInitiatorLineProps } from './InitiatorLine/InitiatorLine';
export { useRequestSubmit } from './useRequestSubmit';