fix(ui): продолжать частичное сохранение пользователя без дублей

This commit is contained in:
Denozordec committed 2026-10-01 09:53:23 +07:00
1 parent 02ca48ef9c
commit 4896d8ef6f
9 files changed
+286 -113

No files matched your search

+12 -16
View File
@@ -141,12 +141,16 @@ interface UserSheetProps {
isLive: boolean
backendUrl: string
saving?: boolean
saveError?: string | null
saveBlocked?: boolean
saveResume?: boolean
onCheckCatalogs?: () => void
onSave: (form: AppUserForm) => void
onClose: () => void
}
function UserSheet({
open, user, users, servers, isLive, backendUrl, saving, onSave, onClose,
open, user, users, servers, isLive, backendUrl, saving, saveError, saveBlocked, saveResume, onCheckCatalogs, onSave, onClose,
}: UserSheetProps) {
const isCreate = user === null
const [sheetStep, setSheetStep] = useState(1)
@@ -158,17 +162,6 @@ function UserSheet({
const [expandedWg, setExpandedWg] = useState<string | null>(null)
const [newComment, setNewComment] = useState("")
useEffect(() => {
if (!open) return
setForm(user ? toForm(user) : emptyForm(servers))
setSheetStep(1)
setErrors({})
setCatalogServerId(servers[0]?.id ?? "")
setSelectedPicks([])
setExpandedWg(null)
setNewComment("")
}, [open, user, servers])
useEffect(() => {
if (!open || !catalogServerId) {
setCatalog([])
@@ -298,7 +291,7 @@ function UserSheet({
const selectedPickKeys = useMemo(() => new Set(selectedPicks.map(pickKey)), [selectedPicks])
return (
<Sheet open={open} onOpenChange={(v) => { if (!v) onClose() }}>
<Sheet open={open} onOpenChange={(v) => { if (!v && !saving) onClose() }}>
<SheetContent side="right" className="w-full sm:max-w-lg flex flex-col gap-0 p-0">
<SheetHeader className="px-6 pt-6 pb-4 border-b shrink-0">
<SheetTitle>{isCreate ? "Новый пользователь" : "Редактировать пользователя"}</SheetTitle>
@@ -307,6 +300,8 @@ function UserSheet({
</SheetDescription>
</SheetHeader>
{saveError && <div role="alert" aria-label="Сохранение пользователя" className="px-6 py-3 text-sm text-destructive">{saveError}{saveBlocked && <Button type="button" variant="outline" disabled={saving} onClick={onCheckCatalogs}>Проверить список пользователей</Button>}</div>}
<fieldset disabled={saving} className="flex-1 min-h-0 flex flex-col">
<Stepper value={sheetStep} onValueChange={setSheetStep} className="flex-1 flex flex-col min-h-0 px-6 py-5">
<StepperNav className="mb-5">
<StepperItem step={1}>
@@ -670,18 +665,19 @@ function UserSheet({
</Stepper>
<SheetFooter className="px-6 py-4 border-t shrink-0 flex-row gap-2">
<SheetClose render={<Button variant="outline" />}>Отмена</SheetClose>
<SheetClose render={<Button type="button" variant="outline" disabled={saving} />}>Отмена</SheetClose>
{sheetStep > 1 && (
<Button variant="outline" onClick={() => setSheetStep((s) => s - 1)}>Назад</Button>
)}
{sheetStep < 4 ? (
<Button className="ml-auto" onClick={() => setSheetStep((s) => s + 1)}>Далее</Button>
) : (
<Button className="ml-auto" disabled={saving} onClick={submit}>
{isCreate ? "Создать" : "Сохранить"}
<Button className="ml-auto" disabled={saving || saveBlocked} aria-busy={saving} onClick={submit}>
{saveResume ? "Продолжить сохранение" : isCreate ? "Создать" : "Сохранить"}
</Button>
)}
</SheetFooter>
</fieldset>
</SheetContent>
</Sheet>
)