feat(webui): add campaign metric drill-downs

This commit is contained in:
2026-08-19 18:47:45 +02:00
parent 039ce35e78
commit 8e2f9d743d
17 changed files with 124 additions and 73 deletions
@@ -11,6 +11,8 @@ const reviewPresentation = readFileSync(
"utf8"
);
const operatorPage = readFileSync("src/features/operator/OperatorQueuePage.tsx", "utf8");
const overviewPage = readFileSync("src/features/campaigns/CampaignOverviewPage.tsx", "utf8");
const attachmentsPage = readFileSync("src/features/campaigns/AttachmentsDataPage.tsx", "utf8");
const deliveryMode = readFileSync("src/features/campaigns/utils/deliveryMode.ts", "utf8");
const translationCatalog = readFileSync("src/i18n/generatedTranslations.ts", "utf8");
@@ -49,6 +51,13 @@ const outcomeCardsStart = page.indexOf("Aggregate outcome cards are deliberately
const outcomeCardsEnd = page.indexOf('<Card title="i18n:govoplan-campaign.population_and_exclusions', outcomeCardsStart);
assert(outcomeCardsStart >= 0 && outcomeCardsEnd > outcomeCardsStart, "the aggregate privacy boundary is documented beside the outcome cards");
assert(!page.slice(outcomeCardsStart, outcomeCardsEnd).includes("onClick"), "aggregate outcome cards cannot create unsuppressed filtered subgroups");
assert(!page.slice(outcomeCardsStart, outcomeCardsEnd).includes("drilldown="), "privacy-suppressed aggregates remain informational metrics");
assert(overviewPage.includes("drilldown={{"), "campaign overview metrics expose explicit destinations");
assert(overviewPage.includes("openSection(\"recipients\")"), "the recipient count opens its owning collection");
assert(attachmentsPage.includes('revealAttachmentSection("campaign-global-attachments")'), "attachment counts reveal their underlying editor section");
assert(attachmentsPage.includes("openRecipients"), "per-recipient attachment counts open recipient details");
assert(reviewPage.includes("showBuiltDetails({ validation:"), "review counts apply a relevant table filter");
assert(reviewPage.includes('revealReviewElement("campaign-attachment-preview")'), "attachment-result counts reveal the evidence preview");
assert(!page.includes("{report.population.denominator_definition}"), "the known denominator contract uses a localized UI explanation");
assert(!page.includes("{report.privacy.rule}"), "the known privacy contract uses a localized UI explanation");
assert(page.includes("all_persisted_recipient_delivery_jobs_for_the_se.208e90cc"), "the denominator explanation is bilingual");