Dashboard: kind filters on Programs, tools off Services page, in-app confirm modals

- /services was returning every non-job deployment (tools, statics, remotes);
  filter it to kind==service so the Services page shows only services.
- Programs page gains kind-filter chips (All / Service / Job / Tool / Static /
  Reference) with per-kind counts, colored to match KindBadge.
- Replace window.confirm with a reusable ConfirmModal (styled, danger variant,
  Esc/Enter, preserves bulleted bodies); FormFooter's delete uses it, so program/
  service/job deletion now confirms in-app with the enumerated cascade list.

castle-api 58 passed; /services live drops from 37 to 15 (services only).
This commit is contained in:
2026-07-01 11:59:14 -07:00
parent 38074806c1
commit 876b424722
7 changed files with 200 additions and 22 deletions

View File

@@ -405,9 +405,9 @@ def list_services(include_remote: bool = False) -> list[ServiceSummary]:
summaries: list[ServiceSummary] = []
seen: set[str] = set()
# Deployed services (non-scheduled)
# Deployed services only — not jobs, tools (path), statics (caddy), or remotes.
for name, deployed in registry.deployed.items():
if deployed.schedule:
if deployed.kind != "service":
continue
s = _service_from_deployed(name, deployed)
s.node = hostname