fix(ui): подтверждать перемещение правил Firewall

This commit is contained in:
Denozordec committed 2026-09-30 10:18:34 +07:00
1 parent b47c5645d5
commit 14f8b1ee9a
5 files changed
+114 -8

No files matched your search

+20 -5
View File
@@ -1950,6 +1950,9 @@ function FirewallPageInner() {
const [formError, setFormError] = useState<string | null>(null)
const mutationLock = useRef(false)
const [togglePending, setTogglePending] = useState(false)
const [movePending, setMovePending] = useState(false)
const [moveStatus, setMoveStatus] = useState<string | null>(null)
const [moveError, setMoveError] = useState<string | null>(null)
const [toggleStatus, setToggleStatus] = useState<string | null>(null)
const [toggleError, setToggleError] = useState<string | null>(null)
const [pendingDelete, setPendingDelete] = useState<{ kind: "rule"; item: FirewallRule } | { kind: "address"; item: AddressListEntry } | null>(null)
@@ -2226,6 +2229,7 @@ function FirewallPageInner() {
}, [filteredRules])
async function reorderRules(activeId: string, overId: string) {
if (mutationLock.current || busy || historyRestoring) return
const source = isLive ? liveRules : mockRules
const next = reorderWithinGroup(source, activeId, overId)
if (!next) {
@@ -2245,19 +2249,28 @@ function FirewallPageInner() {
const dest = rosMoveDestination(source, activeId, overId)
if (!dest) return
const prev = source
mutationLock.current = true
setMovePending(true)
setMoveError(null)
setMoveStatus("Ожидание перемещения правила " + (active?.comment || active?.rosId || activeId) + "…")
setLiveRules(next)
try {
await apiFetch("/api/firewall/rules/move", {
const result = await apiFetch<{ ok: boolean }>("/api/firewall/rules/move", {
method: "POST",
body: JSON.stringify({
...key,
...(dest.dest ? { destinationRosId: dest.dest } : {}),
}),
})
if (result?.ok !== true) throw new Error("Сервер не подтвердил перемещение правила")
await loadLive()
} catch (e) {
setLiveRules(prev)
toast.error(e instanceof Error ? e.message : "Не удалось переместить правило")
setMoveError((active?.comment || active?.rosId || activeId) + ": " + (e instanceof Error ? e.message : "Не удалось переместить правило"))
} finally {
mutationLock.current = false
setMovePending(false)
setMoveStatus(null)
}
}
@@ -2531,6 +2544,8 @@ function FirewallPageInner() {
</span>
</div>
{moveStatus && <p role="status" className="text-sm text-muted-foreground">{moveStatus}</p>}
{moveError && <p role="alert" className="text-sm text-destructive">{moveError}</p>}
{toggleStatus && <p role="status" className="text-sm text-muted-foreground">{toggleStatus}</p>}
{toggleError && <p role="alert" className="text-sm text-destructive">{toggleError}</p>}
<KpiStatGrid
@@ -2594,7 +2609,7 @@ function FirewallPageInner() {
{chainGroup === "address-lists" ? (
<AddressListsTab
entries={familyAddrLists}
mutationsDisabled={togglePending || deletePending || busy || historyRestoring}
mutationsDisabled={togglePending || deletePending || movePending || busy || historyRestoring}
onAdd={() => openAddAddr()}
onAddToList={(list) => openAddAddr(list)}
onToggle={(e) => { void toggleAddr(e) }}
@@ -2636,11 +2651,11 @@ function FirewallPageInner() {
<FirewallRulesDataGrid
rules={filteredRules}
mutationsDisabled={togglePending || deletePending || busy || historyRestoring}
mutationsDisabled={togglePending || deletePending || movePending || busy || historyRestoring}
onToggle={(id) => { void toggleRule(id) }}
onEdit={openEdit}
onDelete={(item) => requestDelete({ kind: "rule", item })}
onReorder={canReorder && !togglePending && !deletePending ? (activeId, overId) => { void reorderRules(activeId, overId) } : undefined}
onReorder={canReorder && !togglePending && !deletePending && !movePending && !busy && !historyRestoring ? (activeId, overId) => { void reorderRules(activeId, overId) } : undefined}
showServer={showServerCol}
/>
</DataPageCard>