feat: implemented form lifecycle hool and state machine

This commit is contained in:
Тимур Городецкий
2026-08-04 17:00:04 +05:00
parent ed21944628
commit ba4e3feee5
25 changed files with 504 additions and 171 deletions
@@ -0,0 +1,50 @@
import * as React from 'react';
import { Button } from '../Button/Button';
import { Icon } from '../Icon/Icon';
import { FormActions } from '../FormActions/FormActions';
import { IRequestSubmit } from '../useRequestSubmit';
export interface ISubmitActionsProps {
submit: IRequestSubmit;
isValid: boolean;
/** Заявка в нередактируемом статусе (На согласовании/…): сохранять нельзя. */
readOnly: boolean;
onCancel: () => void;
onSaveDraft: () => void;
onSubmit: () => void;
/** Подпись основной кнопки. По умолчанию — «Отправить на согласование». */
submitLabel?: string;
}
// Единый ряд кнопок форм подачи: Отмена / Сохранить черновик / Отправить.
// Логика доступности — здесь, в одном месте, чтобы все формы вели себя одинаково:
// • сохранять/отправлять нельзя, пока идёт сохранение или заявка уже read-only;
// • «Отмена» доступна всегда (возврат к списку), кроме момента сохранения.
export const SubmitActions: React.FC<ISubmitActionsProps> = ({
submit,
isValid,
readOnly,
onCancel,
onSaveDraft,
onSubmit,
submitLabel = 'Отправить на согласование',
}) => {
const { saving, kind } = submit;
const locked = saving || readOnly;
return (
<FormActions>
<Button variant="secondary" onClick={onCancel} disabled={saving}>
Отмена
</Button>
<Button variant="secondary" onClick={onSaveDraft} disabled={!isValid || locked}>
<Icon name="document" size="sm" />
Сохранить черновик
</Button>
<Button variant="accent" onClick={onSubmit} disabled={!isValid || locked}>
<Icon name="send" size="sm" />
{saving && kind === 'submit' ? 'Отправка…' : submitLabel}
</Button>
</FormActions>
);
};