fix(backups): адаптировать историю и формы к узким экранам

This commit is contained in:
Denozordec committed 2026-10-01 16:45:41 +07:00
1 parent 11e357cc94
commit b74084b67c
16 files changed
+83 -10

No files matched your search

+8 -4
View File
@@ -1,6 +1,7 @@
"use client"
import { Suspense, useCallback, useEffect, useRef, useState } from "react"
import { Frame, FramePanel } from "@/components/reui/frame"
import { PageHeader } from "@/components/page-header"
import { backups as mockBackups, servers as mockServers, type Backup, type Server } from "@/lib/data"
import { useBackupsUrlState } from "@/hooks/use-backups-url-state"
@@ -147,7 +148,7 @@ function BackupsContent() {
canReadServers ? requestJson<unknown>(backendUrl, "/api/servers", { signal }).then(payload => {
const rows = serverListSchema.parse(payload)
if (!active()) return
setLiveServers(rows.map(toFrontendServer)); success("servers")
setLiveServers(rows.map(row => ({ ...toFrontendServer(row), status: row.status ?? "unknown" }))); success("servers")
}).catch(error => failure("servers", error)) : Promise.resolve(),
getBackupScheduleSettings(backendUrl, { signal }).then(row => {
if (!active()) return
@@ -366,7 +367,7 @@ function BackupsContent() {
}
return (
<div className="flex flex-col h-full">
<div className="flex min-h-0 min-w-0 flex-col h-full">
<PageHeader
crumbs={[{ label: "Управление" }, { label: "Бэкапы" }]}
actions={
@@ -394,13 +395,13 @@ function BackupsContent() {
}
/>
<div className="flex-1 overflow-y-auto p-6">
<div className="min-w-0 flex-1 overflow-y-auto p-3 sm:p-6">
<div className="flex flex-col gap-5">
{urlError && <Alert variant="warning" aria-label="Контекст резервных копий"><AlertTitle>Не удалось прочитать ссылку</AlertTitle><AlertDescription>{urlError}</AlertDescription><AlertAction><Button type="button" variant="outline" onClick={resetContext}>Сбросить контекст</Button></AlertAction></Alert>}
{!isLive && <p role="status" className="text-sm text-muted-foreground">Демонстрационные данные. Операции и сохранение недоступны.</p>}
{!canRead && <p role="status">Нет права mm:backups:read</p>}
{isLive && !canReadServers && <p role="status">Каталог устройств недоступен без mm:servers:read.</p>}
{isLive && canRead && <div className="flex items-center gap-3 text-sm text-muted-foreground">
{isLive && canRead && <div className="flex flex-wrap items-center gap-3 text-sm text-muted-foreground">
<Button type="button" variant="outline" size="sm" onClick={() => void loadLive()} disabled={loading || scheduleSaveBusy || opBusy}>Обновить</Button>
<span role="status">{loading ? "Обновление данных…" : resources.backups.receivedAt ? "Получено: " + new Date(resources.backups.receivedAt).toLocaleString("ru-RU") : "Резервные копии пока неизвестны"}</span>
</div>}
@@ -419,6 +420,7 @@ function BackupsContent() {
</Alert>}
{opError && <Alert variant="warning" aria-label="Операция резервных копий"><AlertTitle>Операция не подтверждена</AlertTitle><AlertDescription>{opError}</AlertDescription></Alert>}
{(job.error || job.storageError) && <Alert variant="warning" aria-label="Задача резервного копирования"><AlertTitle>{jobTerminal ? "Задача завершена с ограничениями" : "Результат задачи пока неизвестен"}</AlertTitle><AlertDescription>{job.error || job.storageError}</AlertDescription></Alert>}
<div><h1 className="text-xl font-semibold">Резервные копии</h1><p className="text-sm text-muted-foreground">История файлов, расписание и подтверждения операций</p></div>
<KpiStatGrid
aria-label="Сводка бэкапов"
items={[
@@ -470,6 +472,7 @@ function BackupsContent() {
</AlertAction>
</Alert>
<Frame dense className="min-w-0"><FramePanel className="min-w-0 p-3 sm:p-5">
<Tabs
value={tab}
onValueChange={(v) => setTab(String(v) as PageTab)}
@@ -537,6 +540,7 @@ function BackupsContent() {
</TabsContent>
</Tabs>
</FramePanel></Frame>
</div>
</div>