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 &&