Phase 9: network management + stack delete in UI (0.9.0)

- Networks: network_service (list w/ subnet/containers/in-use/owning-stack,
  create bridge/macvlan/ipvlan/overlay + optional subnet/gateway/internal,
  delete with default-network guard, prune) + routers/networks.py; real
  Networks page replaces the placeholder.
- Fix: local stacks can now be deleted from the UI — Delete button on stack
  detail (with optional keep-files-on-disk) and a trash action on stack cards,
  via a shared ConfirmDialog. (Backend DELETE existed; no UI surfaced it.)

Verified: py_compile, frontend tsc build, live network list smoke test
(defaults flagged, compose nets + in-use detected); main 104 routes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
menzelj
2026-06-07 22:37:30 +00:00
co-authored by Claude Opus 4.8
parent 5cd55382ed
commit a4e26f880a
12 changed files with 641 additions and 10 deletions
+36
View File
@@ -0,0 +1,36 @@
import api from "./client";
export interface NetworkInfo {
id: string;
name: string;
driver: string;
scope: string;
internal: boolean;
attachable: boolean;
subnet: string | null;
gateway: string | null;
containers: string[];
in_use: boolean;
stack: string | null;
labels: Record<string, string>;
created: string | null;
is_default: boolean;
}
export interface NetworkCreate {
name: string;
driver: string;
subnet?: string | null;
gateway?: string | null;
internal: boolean;
attachable: boolean;
}
export const networksApi = {
list: () => api.get<NetworkInfo[]>("/api/networks").then((r) => r.data),
create: (body: NetworkCreate) =>
api.post<NetworkInfo>("/api/networks", body).then((r) => r.data),
remove: (id: string) => api.delete(`/api/networks/${id}`).then((r) => r.data),
prune: () =>
api.post<{ NetworksDeleted: string[] | null }>("/api/networks/prune").then((r) => r.data),
};