fix(ui): подтверждать переключение правил Firewall
This commit is contained in:
1 parent
14be83a869
commit
131ecb8668
6 files changed
+89
-11
No files matched your search
@@ -1935,6 +1935,10 @@ function FirewallPageInner() {
|
||||
const [dataLoading, setDataLoading] = useState(false)
|
||||
const [dataError, setDataError] = useState<string | null>(null)
|
||||
const [busy, setBusy] = useState(false)
|
||||
const toggleLock = useRef(false)
|
||||
const [togglePending, setTogglePending] = useState(false)
|
||||
const [toggleStatus, setToggleStatus] = useState<string | null>(null)
|
||||
const [toggleError, setToggleError] = useState<string | null>(null)
|
||||
|
||||
const [selectedServerId, setSelectedServerId] = useState(serverFromQuery ?? ALL_SERVERS_ID)
|
||||
const appliedQueryRef = useRef(false)
|
||||
@@ -2136,18 +2140,27 @@ function FirewallPageInner() {
|
||||
|
||||
async function toggleRule(id: string) {
|
||||
const r = displayRules.find((x) => x.id === id)
|
||||
if (!r) return
|
||||
if (!r || toggleLock.current || busy || historyRestoring) return
|
||||
if (isLive) {
|
||||
const key = ruleKey(r)
|
||||
if (!key) return
|
||||
toggleLock.current = true
|
||||
setTogglePending(true)
|
||||
setToggleError(null)
|
||||
setToggleStatus(`Ожидание изменения правила ${r.comment || r.rosId || r.id}…`)
|
||||
try {
|
||||
await apiFetch("/api/firewall/rules", {
|
||||
const result = await apiFetch<{ ok: boolean }>("/api/firewall/rules", {
|
||||
method: "PATCH",
|
||||
body: JSON.stringify({ ...key, disabled: r.enabled }),
|
||||
})
|
||||
if (result?.ok !== true) throw new Error("Сервер не подтвердил изменение правила")
|
||||
await loadLive()
|
||||
} catch (e) {
|
||||
toast.error(e instanceof Error ? e.message : "Не удалось переключить правило")
|
||||
setToggleError(`${r.comment || r.rosId || r.id}: ${e instanceof Error ? e.message : "Не удалось переключить правило"}`)
|
||||
} finally {
|
||||
toggleLock.current = false
|
||||
setTogglePending(false)
|
||||
setToggleStatus(null)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -2468,6 +2481,8 @@ function FirewallPageInner() {
|
||||
</span>
|
||||
</div>
|
||||
|
||||
{toggleStatus && <p role="status" className="text-sm text-muted-foreground">{toggleStatus}</p>}
|
||||
{toggleError && <p role="alert" className="text-sm text-destructive">{toggleError}</p>}
|
||||
<KpiStatGrid
|
||||
aria-label="Сводка Firewall"
|
||||
items={[
|
||||
@@ -2570,10 +2585,11 @@ function FirewallPageInner() {
|
||||
|
||||
<FirewallRulesDataGrid
|
||||
rules={filteredRules}
|
||||
mutationsDisabled={togglePending || busy || historyRestoring}
|
||||
onToggle={(id) => { void toggleRule(id) }}
|
||||
onEdit={openEdit}
|
||||
onDelete={(r) => { void deleteRule(r) }}
|
||||
onReorder={canReorder ? (activeId, overId) => { void reorderRules(activeId, overId) } : undefined}
|
||||
onReorder={canReorder && !togglePending ? (activeId, overId) => { void reorderRules(activeId, overId) } : undefined}
|
||||
showServer={showServerCol}
|
||||
/>
|
||||
</DataPageCard>
|
||||
|
||||
Reference in new issue
Block a user