fix: count tag-matched servers in the workflows list

This commit is contained in:
2026-08-04 17:28:01 +01:00
parent 3388d2f895
commit 50a9ac5fdc
4 changed files with 63 additions and 17 deletions
+28
View File
@@ -0,0 +1,28 @@
import { Server } from "@/lib/api";
/*
* The browser's copy of services.ResolveTargets.
*
* This is a deliberate duplication: the authority is UnionTargets/MatchesTags in
* server/internal/services/targets.go, and this exists only so a screen can
* answer "how many servers?" without a round trip, since the browser already
* holds the fleet. It must stay identical in MEANING to the Go version and
* change in the same commit as it.
*
* It lives here rather than in a component because it had already been written
* twice — once in the designer and once, wrongly, on the workflows list, where
* the count ignored tags entirely and a tag-only workflow reported zero targets.
*/
/** True when srv carries every pair in sel. Tag keys AND together. */
export function matchesTags(srv: Server, sel: Record<string, string>): boolean {
// An EMPTY selector matches NOTHING, not everything. The alternative turns a
// cleared field in the editor into a fleet-wide run.
if (Object.keys(sel).length === 0) return false;
return Object.entries(sel).every(([k, v]) => srv.tags?.[k] === v);
}
/** The distinct union of the named servers and the tag matches, in fleet order. */
export function resolveTargets(servers: Server[], ids: string[], sel: Record<string, string>): Server[] {
return servers.filter((s) => ids.includes(s.server_id) || matchesTags(s, sel));
}