diff --git a/webui/src/features/campaigns/CampaignOverviewPage.tsx b/webui/src/features/campaigns/CampaignOverviewPage.tsx
index 83ae27d..32056f4 100644
--- a/webui/src/features/campaigns/CampaignOverviewPage.tsx
+++ b/webui/src/features/campaigns/CampaignOverviewPage.tsx
@@ -2,7 +2,7 @@ import { useEffect, useMemo, useState } from "react";
import { Archive, CalendarClock, Copy, ExternalLink, LockKeyhole, LockOpen, Pause, Play, Trash2 } from "lucide-react";
import { Link } from "react-router";
import type { ApiSettings, AuthInfo } from "../../types";
-import { Button } from "@govoplan/core-webui";
+import { FormGrid, Button } from "@govoplan/core-webui";
import { Card } from "@govoplan/core-webui";
import { ConfirmDialog } from "@govoplan/core-webui";
import { Dialog } from "@govoplan/core-webui";
@@ -389,7 +389,7 @@ export default function CampaignOverviewPage({ settings, auth, campaignId }: {se
title="i18n:govoplan-campaign.campaign_identity.a00ca574"
collapsible
actions={ i18n:govoplan-campaign.edit_with_wizard.672a7d1a}>
-
diff --git a/webui/src/features/campaigns/GlobalSettingsPage.tsx b/webui/src/features/campaigns/GlobalSettingsPage.tsx
index c4c6120..7832a45 100644
--- a/webui/src/features/campaigns/GlobalSettingsPage.tsx
+++ b/webui/src/features/campaigns/GlobalSettingsPage.tsx
@@ -6,7 +6,7 @@ import {
type CampaignCalendarCatalog,
type CampaignPostboxCatalog
} from "../../api/campaigns";
-import { Button } from "@govoplan/core-webui";
+import { FormGrid, ContentGrid, Button } from "@govoplan/core-webui";
import { Card } from "@govoplan/core-webui";
import { FormField } from "@govoplan/core-webui";
import { DismissibleAlert } from "@govoplan/core-webui";
@@ -211,7 +211,7 @@ export default function GlobalSettingsPage({ settings, auth, campaignId, view =
}
-
+
> :
<>
{data.campaign && }
-
+
-
+
patch(["delivery", "rate_limit", "messages_per_minute"], Number(event.target.value || 1))} />
patch(["delivery", "rate_limit", "concurrency"], Number(event.target.value || 1))} />
patch(["delivery", "retry", "max_attempts"], Number(event.target.value || 1))} />
patch(["status_tracking", "enabled"], checked)} />
-
+
{postboxModuleInstalled &&
@@ -375,7 +375,7 @@ export default function GlobalSettingsPage({ settings, auth, campaignId, view =
-
+
patch(["delivery", "calendar_invitation", "description_template"], event.target.value)}
/>
-
+
{!mailModuleInstalled &&
Mail must be active to deliver iCalendar invitations.
@@ -483,7 +483,7 @@ export default function GlobalSettingsPage({ settings, auth, campaignId, view =
i18n:govoplan-campaign.these_opt_ins_are_stored_in_the_draft_editor_met.dc6ffbfd
-
+
>
}
diff --git a/webui/src/features/campaigns/MailSettingsPage.tsx b/webui/src/features/campaigns/MailSettingsPage.tsx
index bcf2016..45a3964 100644
--- a/webui/src/features/campaigns/MailSettingsPage.tsx
+++ b/webui/src/features/campaigns/MailSettingsPage.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from "react";
-import {
+import { FormGrid,
Button,
Card,
Dialog,
@@ -375,7 +375,7 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting
Add campaign credential
}>
The campaign stores stable references to the envelope, selected servers, and credentials.
-
+
selectMailProfile(event.target.value)}>
i18n:govoplan-campaign.select_a_mail_profile.76480af0
@@ -410,7 +410,7 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting
)}
-
+
{selectedProfileUnavailable && i18n:govoplan-campaign.the_referenced_mail_profile_is_inactive_unavaila.abeebe26 }
{selectedProfile &&
@@ -427,12 +427,12 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting
{profileError &&
{profileError} }
}
-
setCredentialDialogOpen(false)}
closeDisabled={credentialSaving}
- className="admin-dialog admin-dialog-wide adaptive-config-dialog"
+ className="adaptive-config-dialog"
footerClassName="button-row compact-actions"
footer={
<>
@@ -459,7 +459,7 @@ export default function MailSettingsPage({ settings, campaignId, view = "setting
Campaign login
This credential belongs to this campaign and can use only the selected mail servers.
-
-
+
+
{selectedSmtpServer && setCredentialDraft({ ...credentialDraft, useSmtp })} label={`Use for SMTP: ${selectedSmtpServer.name}`} />}
{selectedImapServer && setCredentialDraft({ ...credentialDraft, useImap })} label={`Use for IMAP: ${selectedImapServer.name}`} />}
-
+
{!isPolicyView &&
-
+
>}>
-
+
The request covers the exact built message, attachment, recipient, policy, and transport snapshot. Rebuilding invalidates and removes this gate.
setApprovalSelectorKind(event.target.value as typeof approvalSelectorKind)}>
@@ -1933,7 +1933,7 @@ export default function ReviewSendPage({
})} />)}
-
+
{singleSendConfirmRow && (
-
+
)}
-
+
)}
diff --git a/webui/src/features/campaigns/TemplateDataPage.tsx b/webui/src/features/campaigns/TemplateDataPage.tsx
index 1250763..77f5e30 100644
--- a/webui/src/features/campaigns/TemplateDataPage.tsx
+++ b/webui/src/features/campaigns/TemplateDataPage.tsx
@@ -11,7 +11,7 @@ import {
type CampaignContentLibraryTarget,
type CampaignPrintTemplate
} from "../../api/campaigns";
-import { Button } from "@govoplan/core-webui";
+import { FormGrid, ContentGrid, Button } from "@govoplan/core-webui";
import { Card } from "@govoplan/core-webui";
import { Dialog } from "@govoplan/core-webui";
import { FormField } from "@govoplan/core-webui";
@@ -433,9 +433,9 @@ export default function TemplateDataPage({ settings, campaignId }: {settings: Ap
<>
-
+
-
+
{printTemplatesError && {printTemplatesError} }
{!printTemplatesError && !printTemplatesAvailable && (
@@ -565,7 +565,7 @@ export default function TemplateDataPage({ settings, campaignId }: {settings: Ap
/>
>
)}
-
+
@@ -598,7 +598,7 @@ export default function TemplateDataPage({ settings, campaignId }: {settings: Ap
-
+
>
diff --git a/webui/src/features/campaigns/components/MessagePreviewOverlay.tsx b/webui/src/features/campaigns/components/MessagePreviewOverlay.tsx
index 2fa62bf..d9cc93d 100644
--- a/webui/src/features/campaigns/components/MessagePreviewOverlay.tsx
+++ b/webui/src/features/campaigns/components/MessagePreviewOverlay.tsx
@@ -1,6 +1,6 @@
import { useEffect, useRef, type ReactNode } from "react";
import { ArrowBigLeft, ArrowBigLeftDash, ArrowBigRight, ArrowBigRightDash } from "lucide-react";
-import { Button, Dialog, MessageDisplayPanel, type MessageDisplayAttachment } from "@govoplan/core-webui";
+import { ActionToolbar, Button, Dialog, MessageDisplayPanel, type MessageDisplayAttachment } from "@govoplan/core-webui";
// Campaign review/template/mock previews need recipient navigation, review notes,
// raw MIME inspection and attachment grouping. Generic mailbox reading uses
@@ -106,7 +106,7 @@ export default function CampaignMessagePreviewOverlay({
>
{(recipientLabel || recipientNote || navigation) &&
-
+
{recipientLabel &&
{recipientLabel} }
{recipientNote &&
{recipientNote}
}
@@ -120,7 +120,7 @@ export default function CampaignMessagePreviewOverlay({
= navigation.total - 1} title="i18n:govoplan-campaign.last_message.83741110" aria-label="i18n:govoplan-campaign.last_message.83741110">
}
-
+
}
}
>
-
+
{showMerge &&
Add target
-
+
{error &&
{error} }
{draftTargets.length === 0 &&
@@ -181,7 +181,7 @@ function PostboxTargetRow({
{ id: "remove", label: "Remove target", icon:
, disabled: locked, variant: "danger", onClick: onRemove }
]} />
-
+
}
-
+
);
}
diff --git a/webui/src/features/campaigns/wizard/steps/CreateWizardSteps.tsx b/webui/src/features/campaigns/wizard/steps/CreateWizardSteps.tsx
index dee8ae7..698dd62 100644
--- a/webui/src/features/campaigns/wizard/steps/CreateWizardSteps.tsx
+++ b/webui/src/features/campaigns/wizard/steps/CreateWizardSteps.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from "react";
-import { Button } from "@govoplan/core-webui";
+import { FormGrid, Button } from "@govoplan/core-webui";
import { FieldLabel } from "@govoplan/core-webui";
import { FormField } from "@govoplan/core-webui";
import { ToggleSwitch } from "@govoplan/core-webui";
@@ -22,7 +22,7 @@ export type WizardStepProps = {
export function BasicsStep({ draft, patch }: WizardStepProps) {
const campaign = asRecord(draft.campaign);
return (
-
+
patch(["campaign", "name"], event.target.value)} />
@@ -39,7 +39,7 @@ export function BasicsStep({ draft, patch }: WizardStepProps) {
-
);
+ );
}
@@ -54,7 +54,7 @@ export function SenderStep({ draft, patch }: WizardStepProps) {
const delivery = asRecord(draft.delivery);
const imapAppend = asRecord(delivery.imap_append_sent);
return (
-
+
i18n:govoplan-campaign.select_the_delivery_profile_on_the_mail_settings.a89cbb5f
patch(["delivery", "imap_append_sent", "enabled"], checked)} />
- );
+ );
}
@@ -144,7 +144,7 @@ export function TemplateStep({ draft, patch }: WizardStepProps) {
i18n:govoplan-campaign.template.3ec1ae06
i18n:govoplan-campaign.compose_the_subject_and_body_merge_fields_can_la.4fb6e97b
-
+
);
}
@@ -170,12 +170,12 @@ export function AttachmentsStep({ draft, patch }: WizardStepProps) {
i18n:govoplan-campaign.attachments.6771ade6
i18n:govoplan-campaign.configure_campaign_wide_attachment_behavior_and_.441a6cd2
-
+
patch(["attachments", "base_path"], event.target.value)} />
patch(["attachments", "missing_behavior"], event.target.value)}>{behaviorOptions.map((option) => {option} )}
patch(["attachments", "ambiguous_behavior"], event.target.value)}>{behaviorOptions.map((option) => {option} )}
patch(["attachments", "allow_individual"], checked)} />
-
+
patch(["attachments", "global"], value)} />
);
@@ -208,10 +208,10 @@ export function SendStep({ draft, patch }: WizardStepProps) {
i18n:govoplan-campaign.send_preparation.6e078f43
i18n:govoplan-campaign.configure_rate_limits_and_prepare_the_final_send.af3d4e48
-
+
patch(["delivery", "rate_limit", "messages_per_minute"], Number(event.target.value || 1))} />
patch(["delivery", "rate_limit", "concurrency"], Number(event.target.value || 1))} />
-
+
i18n:govoplan-campaign.test_send_and_queue_actions_remain_in_the_send_w.60dee716
);
diff --git a/webui/src/features/reports/AggregateReportsPage.tsx b/webui/src/features/reports/AggregateReportsPage.tsx
index b9c9be2..92412b1 100644
--- a/webui/src/features/reports/AggregateReportsPage.tsx
+++ b/webui/src/features/reports/AggregateReportsPage.tsx
@@ -1,7 +1,7 @@
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { Eye, RefreshCw } from "lucide-react";
import { useSearchParams } from "react-router";
-import {
+import { ContentGrid,
Button,
Card,
DataGrid,
@@ -208,7 +208,7 @@ export default function AggregateReportsPage({ settings }: {settings: ApiSetting
{/* Aggregate outcome cards are deliberately not filter shortcuts: each subgroup
would require a separately suppressed aggregate response from the server. */}
-
+
@@ -220,7 +220,7 @@ export default function AggregateReportsPage({ settings }: {settings: ApiSetting
-
+
diff --git a/webui/src/features/templates/TemplatesPage.tsx b/webui/src/features/templates/TemplatesPage.tsx
index d58d561..dd25940 100644
--- a/webui/src/features/templates/TemplatesPage.tsx
+++ b/webui/src/features/templates/TemplatesPage.tsx
@@ -1,6 +1,6 @@
import { useMemo, useState } from "react";
import { ExternalLink } from "lucide-react";
-import { Button } from "@govoplan/core-webui";
+import { FormGrid, ContentGrid, Button } from "@govoplan/core-webui";
import { Card } from "@govoplan/core-webui";
import { PageLayout, WorkspaceLayout } from "@govoplan/core-webui";
import { FieldLabel } from "@govoplan/core-webui";
@@ -204,7 +204,7 @@ export default function TemplatesPage() {
function TemplateOverview({ template }: {template: TemplateRecord;}) {
return (
-
+
i18n:govoplan-campaign.status.bae7d5be
@@ -221,7 +221,7 @@ function TemplateOverview({ template }: {template: TemplateRecord;}) {
i18n:govoplan-campaign.a_mapping_wizard_can_be_added_later.6b2fe0f3
- );
+ );
}
@@ -231,10 +231,10 @@ function TemplateContent({ template }: {template: TemplateRecord;}) {
const body = translateText(template.body);
return (
i18n:govoplan-campaign.save_changes.179359b3}>
-
+
i18n:govoplan-campaign.subject.8d183dbd
i18n:govoplan-campaign.body.718a7e8a
-
+
);
}