fix(ui): подтверждать перемещение правил Firewall
This commit is contained in:
1 parent
b47c5645d5
commit
14f8b1ee9a
5 files changed
+114
-8
No files matched your search
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user