From 1b32427813b435fd47c92c95242d6029741743ec Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Mon, 24 Aug 2026 11:36:33 +0200 Subject: [PATCH] fix(webui): bind consequential campaign controls to help --- package.json | 2 +- pyproject.toml | 2 +- src/govoplan_campaign/backend/manifest.py | 4 ++-- webui/package.json | 2 +- .../src/features/campaigns/AttachmentsDataPage.tsx | 8 ++++++++ .../features/campaigns/CampaignOverviewPage.tsx | 2 ++ .../src/features/campaigns/CampaignReportPage.tsx | 4 ++-- webui/src/features/campaigns/CampaignWorkPage.tsx | 2 +- .../src/features/campaigns/GlobalSettingsPage.tsx | 2 ++ webui/src/features/campaigns/MailSettingsPage.tsx | 14 +++++++------- webui/src/features/campaigns/ReviewSendPage.tsx | 2 +- .../campaigns/components/CampaignAccessCard.tsx | 4 ++-- 12 files changed, 30 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index f31ee59..6ee5c54 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/campaign-webui", - "version": "0.1.26", + "version": "0.1.27", "private": true, "type": "module", "main": "webui/src/index.ts", diff --git a/pyproject.toml b/pyproject.toml index 053f248..3ef3939 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-campaign" -version = "0.1.26" +version = "0.1.27" description = "GovOPlaN campaigns module with backend and WebUI integration." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_campaign/backend/manifest.py b/src/govoplan_campaign/backend/manifest.py index e035eb2..b08120c 100644 --- a/src/govoplan_campaign/backend/manifest.py +++ b/src/govoplan_campaign/backend/manifest.py @@ -463,8 +463,8 @@ def _campaigns_router(context: ModuleContext): manifest = ModuleManifest( id="campaigns", name="Campaigns", - version="0.1.26", - workflow_definitions=campaign_workflow_definitions(module_version="0.1.26"), + version="0.1.27", + workflow_definitions=campaign_workflow_definitions(module_version="0.1.27"), required_capabilities=( CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR, diff --git a/webui/package.json b/webui/package.json index 8bccd6d..1746ff2 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/campaign-webui", - "version": "0.1.26", + "version": "0.1.27", "private": true, "type": "module", "main": "src/index.ts", diff --git a/webui/src/features/campaigns/AttachmentsDataPage.tsx b/webui/src/features/campaigns/AttachmentsDataPage.tsx index f8a59c1..ce54395 100644 --- a/webui/src/features/campaigns/AttachmentsDataPage.tsx +++ b/webui/src/features/campaigns/AttachmentsDataPage.tsx @@ -615,6 +615,8 @@ function zipArchiveColumns({ disabled, archives, invalidNameIndexes, onEditName, value={archive.method} disabled={disabled} aria-label="Archive password encryption" + data-help-context-id="campaign.archive-encryption" + data-help-module-id="campaigns" onChange={(event) => { const method = event.target.value === "zip_standard" ? "zip_standard" : "aes"; patchArchive(index, method === "zip_standard" ? { @@ -640,6 +642,8 @@ function zipArchiveColumns({ disabled, archives, invalidNameIndexes, onEditName, value={archive.password_delivery_channel} disabled={disabled || !archive.password_enabled} aria-label="Separate password-delivery channel" + data-help-context-id="campaign.archive-encryption" + data-help-module-id="campaigns" onChange={(event) => patchArchive(index, { password_delivery_channel: event.target.value as AttachmentZipArchive["password_delivery_channel"] })}> {(["separate_mail", "sms", "letter", "phone", "in_person"] as const).map((channel) => @@ -653,6 +657,8 @@ function zipArchiveColumns({ disabled, archives, invalidNameIndexes, onEditName,
patchArchive(index, { legacy_zipcrypto_acknowledged: checked })} /> @@ -663,6 +669,8 @@ function zipArchiveColumns({ disabled, archives, invalidNameIndexes, onEditName, maxLength={1000} placeholder="Operational reason (at least 10 characters)" aria-label="Reason for weak legacy encryption" + data-help-context-id="campaign.archive-encryption" + data-help-module-id="campaigns" onChange={(event) => patchArchive(index, { legacy_zipcrypto_reason: event.target.value })} />
: Not required for AES, value: (archive) => archive.legacy_zipcrypto_reason diff --git a/webui/src/features/campaigns/CampaignOverviewPage.tsx b/webui/src/features/campaigns/CampaignOverviewPage.tsx index c3f6bd4..bf58ca0 100644 --- a/webui/src/features/campaigns/CampaignOverviewPage.tsx +++ b/webui/src/features/campaigns/CampaignOverviewPage.tsx @@ -433,6 +433,8 @@ export default function CampaignOverviewPage({ settings, auth, campaignId }: {se destructiveActions={<> {canDelete && - + @@ -591,7 +591,7 @@ export default function CampaignReportPage({ settings, campaignId }: {settings: footer={
- +
}> diff --git a/webui/src/features/campaigns/CampaignWorkPage.tsx b/webui/src/features/campaigns/CampaignWorkPage.tsx index 1d437c2..29cb708 100644 --- a/webui/src/features/campaigns/CampaignWorkPage.tsx +++ b/webui/src/features/campaigns/CampaignWorkPage.tsx @@ -359,7 +359,7 @@ export default function CampaignWorkPage({ ) : null} {canComplete && (assignment.status === "open" || assignment.status === "in_progress") ? ( - diff --git a/webui/src/features/campaigns/GlobalSettingsPage.tsx b/webui/src/features/campaigns/GlobalSettingsPage.tsx index 5a552be..275aa2b 100644 --- a/webui/src/features/campaigns/GlobalSettingsPage.tsx +++ b/webui/src/features/campaigns/GlobalSettingsPage.tsx @@ -379,6 +379,8 @@ export default function GlobalSettingsPage({ settings, auth, campaignId, view = patch(["delivery", "calendar_invitation", "enabled"], checked)} diff --git a/webui/src/features/campaigns/MailSettingsPage.tsx b/webui/src/features/campaigns/MailSettingsPage.tsx index 66c657b..9ecb9cc 100644 --- a/webui/src/features/campaigns/MailSettingsPage.tsx +++ b/webui/src/features/campaigns/MailSettingsPage.tsx @@ -383,7 +383,7 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting title="i18n:govoplan-campaign.reusable_mail_profile.f9c9aab1" actions={
- +
}>

The campaign stores stable references to the envelope, selected servers, and credentials.

@@ -399,8 +399,8 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting {smtpServers.map((item) => )} - - selectCredential("smtp", event.target.value)}> {selectedSmtpServer?.credentials.filter((item) => item.is_active).map((item) => @@ -413,8 +413,8 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting {imapServers.map((item) => )} - - selectCredential("imap", event.target.value)}> {selectedImapServer?.credentials.filter((item) => item.is_active).map((item) => @@ -476,8 +476,8 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting setCredentialDraft({ ...credentialDraft, username: event.target.value })} /> - - setCredentialDraft({ ...credentialDraft, password })} disabled={credentialSaving} generator autoComplete="new-password" /> + + setCredentialDraft({ ...credentialDraft, password })} disabled={credentialSaving} generator autoComplete="new-password" /> diff --git a/webui/src/features/campaigns/ReviewSendPage.tsx b/webui/src/features/campaigns/ReviewSendPage.tsx index af5c7a6..0675a08 100644 --- a/webui/src/features/campaigns/ReviewSendPage.tsx +++ b/webui/src/features/campaigns/ReviewSendPage.tsx @@ -1638,7 +1638,7 @@ export default function ReviewSendPage({

i18n:govoplan-campaign.mock_delivery_uses_the_mail_module_development_m.9d645a5f

}
- + diff --git a/webui/src/features/campaigns/components/CampaignAccessCard.tsx b/webui/src/features/campaigns/components/CampaignAccessCard.tsx index 9035f0d..a9c4352 100644 --- a/webui/src/features/campaigns/components/CampaignAccessCard.tsx +++ b/webui/src/features/campaigns/components/CampaignAccessCard.tsx @@ -429,7 +429,7 @@ export default function CampaignAccessCard({ return ( <> - {canProposeOwnership ? : null}{canRequestOwnership ? : null}
}> + {canProposeOwnership ? : null}{canRequestOwnership ? : null}}>

i18n:govoplan-campaign.owner.719379ae {ownerLabel}

Ownership changes require acceptance by the new owner. They never transfer private encryption keys. A completed transfer clears owner-scoped mail profile selection and requires revalidation.

{ownershipTransfers.length > 0 ? ( @@ -489,7 +489,7 @@ export default function CampaignAccessCard({ )}
- !busy && closeOwnerDialog()} footer={<>}> + !busy && closeOwnerDialog()} footer={<>}>