@endora-commerce/mod-newsletter 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/admin/api/newsletter-client.d.ts +64 -0
- package/dist/admin/api/newsletter-client.d.ts.map +1 -0
- package/dist/admin/api/newsletter-client.js +71 -0
- package/dist/admin/api/newsletter-client.js.map +1 -0
- package/dist/admin/email-variables.d.ts +21 -0
- package/dist/admin/email-variables.d.ts.map +1 -0
- package/dist/admin/email-variables.js +48 -0
- package/dist/admin/email-variables.js.map +1 -0
- package/dist/admin/index.d.ts +44 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +149 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/AutomationBuilder.d.ts +8 -0
- package/dist/admin/pages/AutomationBuilder.d.ts.map +1 -0
- package/dist/admin/pages/AutomationBuilder.js +131 -0
- package/dist/admin/pages/AutomationBuilder.js.map +1 -0
- package/dist/admin/pages/AutomationsPage.d.ts +8 -0
- package/dist/admin/pages/AutomationsPage.d.ts.map +1 -0
- package/dist/admin/pages/AutomationsPage.js +43 -0
- package/dist/admin/pages/AutomationsPage.js.map +1 -0
- package/dist/admin/pages/BlocksPage.d.ts +8 -0
- package/dist/admin/pages/BlocksPage.d.ts.map +1 -0
- package/dist/admin/pages/BlocksPage.js +110 -0
- package/dist/admin/pages/BlocksPage.js.map +1 -0
- package/dist/admin/pages/CampaignEditor.d.ts +8 -0
- package/dist/admin/pages/CampaignEditor.d.ts.map +1 -0
- package/dist/admin/pages/CampaignEditor.js +144 -0
- package/dist/admin/pages/CampaignEditor.js.map +1 -0
- package/dist/admin/pages/CampaignStats.d.ts +8 -0
- package/dist/admin/pages/CampaignStats.d.ts.map +1 -0
- package/dist/admin/pages/CampaignStats.js +45 -0
- package/dist/admin/pages/CampaignStats.js.map +1 -0
- package/dist/admin/pages/CampaignsPage.d.ts +8 -0
- package/dist/admin/pages/CampaignsPage.d.ts.map +1 -0
- package/dist/admin/pages/CampaignsPage.js +28 -0
- package/dist/admin/pages/CampaignsPage.js.map +1 -0
- package/dist/admin/pages/ProviderSettingsPage.d.ts +8 -0
- package/dist/admin/pages/ProviderSettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/ProviderSettingsPage.js +64 -0
- package/dist/admin/pages/ProviderSettingsPage.js.map +1 -0
- package/dist/admin/pages/SubscribersPage.d.ts +8 -0
- package/dist/admin/pages/SubscribersPage.d.ts.map +1 -0
- package/dist/admin/pages/SubscribersPage.js +55 -0
- package/dist/admin/pages/SubscribersPage.js.map +1 -0
- package/dist/admin/pages/TagsPage.d.ts +8 -0
- package/dist/admin/pages/TagsPage.d.ts.map +1 -0
- package/dist/admin/pages/TagsPage.js +114 -0
- package/dist/admin/pages/TagsPage.js.map +1 -0
- package/dist/backend/entities/newsletter-automation-run.entity.d.ts +19 -0
- package/dist/backend/entities/newsletter-automation-run.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-automation-run.entity.js +72 -0
- package/dist/backend/entities/newsletter-automation-run.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-automation.entity.d.ts +22 -0
- package/dist/backend/entities/newsletter-automation.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-automation.entity.js +86 -0
- package/dist/backend/entities/newsletter-automation.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts +6 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.js +30 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-campaign.entity.d.ts +22 -0
- package/dist/backend/entities/newsletter-campaign.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-campaign.entity.js +102 -0
- package/dist/backend/entities/newsletter-campaign.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-custom-field.entity.d.ts +12 -0
- package/dist/backend/entities/newsletter-custom-field.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-custom-field.entity.js +53 -0
- package/dist/backend/entities/newsletter-custom-field.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts +7 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js +35 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-email-block.entity.d.ts +21 -0
- package/dist/backend/entities/newsletter-email-block.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-email-block.entity.js +78 -0
- package/dist/backend/entities/newsletter-email-block.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.d.ts +12 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.js +54 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-send-record.entity.d.ts +23 -0
- package/dist/backend/entities/newsletter-send-record.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-send-record.entity.js +89 -0
- package/dist/backend/entities/newsletter-send-record.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts +6 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.js +31 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-subscriber.entity.d.ts +63 -0
- package/dist/backend/entities/newsletter-subscriber.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-subscriber.entity.js +147 -0
- package/dist/backend/entities/newsletter-subscriber.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-suppression.entity.d.ts +14 -0
- package/dist/backend/entities/newsletter-suppression.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-suppression.entity.js +51 -0
- package/dist/backend/entities/newsletter-suppression.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-tag.entity.d.ts +12 -0
- package/dist/backend/entities/newsletter-tag.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-tag.entity.js +53 -0
- package/dist/backend/entities/newsletter-tag.entity.js.map +1 -0
- package/dist/backend/index.d.ts +120 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +139 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +114 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +171 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +27 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +118 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.self.d.ts +15 -0
- package/dist/backend/routes.self.d.ts.map +1 -0
- package/dist/backend/routes.self.js +28 -0
- package/dist/backend/routes.self.js.map +1 -0
- package/dist/backend/routes.storefront.d.ts +24 -0
- package/dist/backend/routes.storefront.d.ts.map +1 -0
- package/dist/backend/routes.storefront.js +79 -0
- package/dist/backend/routes.storefront.js.map +1 -0
- package/dist/backend/services/audience-resolver.d.ts +20 -0
- package/dist/backend/services/audience-resolver.d.ts.map +1 -0
- package/dist/backend/services/audience-resolver.js +41 -0
- package/dist/backend/services/audience-resolver.js.map +1 -0
- package/dist/backend/services/automation.service.d.ts +58 -0
- package/dist/backend/services/automation.service.d.ts.map +1 -0
- package/dist/backend/services/automation.service.js +301 -0
- package/dist/backend/services/automation.service.js.map +1 -0
- package/dist/backend/services/campaign-dispatch.service.d.ts +50 -0
- package/dist/backend/services/campaign-dispatch.service.d.ts.map +1 -0
- package/dist/backend/services/campaign-dispatch.service.js +130 -0
- package/dist/backend/services/campaign-dispatch.service.js.map +1 -0
- package/dist/backend/services/campaign.service.d.ts +40 -0
- package/dist/backend/services/campaign.service.d.ts.map +1 -0
- package/dist/backend/services/campaign.service.js +195 -0
- package/dist/backend/services/campaign.service.js.map +1 -0
- package/dist/backend/services/consent-block-seeder.d.ts +30 -0
- package/dist/backend/services/consent-block-seeder.d.ts.map +1 -0
- package/dist/backend/services/consent-block-seeder.js +52 -0
- package/dist/backend/services/consent-block-seeder.js.map +1 -0
- package/dist/backend/services/content.service.d.ts +52 -0
- package/dist/backend/services/content.service.d.ts.map +1 -0
- package/dist/backend/services/content.service.js +48 -0
- package/dist/backend/services/content.service.js.map +1 -0
- package/dist/backend/services/custom-field.service.d.ts +16 -0
- package/dist/backend/services/custom-field.service.d.ts.map +1 -0
- package/dist/backend/services/custom-field.service.js +67 -0
- package/dist/backend/services/custom-field.service.js.map +1 -0
- package/dist/backend/services/email-block.service.d.ts +26 -0
- package/dist/backend/services/email-block.service.d.ts.map +1 -0
- package/dist/backend/services/email-block.service.js +120 -0
- package/dist/backend/services/email-block.service.js.map +1 -0
- package/dist/backend/services/opt-in.service.d.ts +25 -0
- package/dist/backend/services/opt-in.service.d.ts.map +1 -0
- package/dist/backend/services/opt-in.service.js +46 -0
- package/dist/backend/services/opt-in.service.js.map +1 -0
- package/dist/backend/services/provider/console-provider.d.ts +32 -0
- package/dist/backend/services/provider/console-provider.d.ts.map +1 -0
- package/dist/backend/services/provider/console-provider.js +31 -0
- package/dist/backend/services/provider/console-provider.js.map +1 -0
- package/dist/backend/services/provider/provider-registry.d.ts +51 -0
- package/dist/backend/services/provider/provider-registry.d.ts.map +1 -0
- package/dist/backend/services/provider/provider-registry.js +84 -0
- package/dist/backend/services/provider/provider-registry.js.map +1 -0
- package/dist/backend/services/provider/smtp-provider.d.ts +30 -0
- package/dist/backend/services/provider/smtp-provider.d.ts.map +1 -0
- package/dist/backend/services/provider/smtp-provider.js +42 -0
- package/dist/backend/services/provider/smtp-provider.js.map +1 -0
- package/dist/backend/services/provider-admin.service.d.ts +39 -0
- package/dist/backend/services/provider-admin.service.d.ts.map +1 -0
- package/dist/backend/services/provider-admin.service.js +59 -0
- package/dist/backend/services/provider-admin.service.js.map +1 -0
- package/dist/backend/services/provider-admin.types.d.ts +6 -0
- package/dist/backend/services/provider-admin.types.d.ts.map +1 -0
- package/dist/backend/services/provider-admin.types.js +2 -0
- package/dist/backend/services/provider-admin.types.js.map +1 -0
- package/dist/backend/services/queues/newsletter-queues.d.ts +34 -0
- package/dist/backend/services/queues/newsletter-queues.d.ts.map +1 -0
- package/dist/backend/services/queues/newsletter-queues.js +58 -0
- package/dist/backend/services/queues/newsletter-queues.js.map +1 -0
- package/dist/backend/services/self.service.d.ts +17 -0
- package/dist/backend/services/self.service.d.ts.map +1 -0
- package/dist/backend/services/self.service.js +44 -0
- package/dist/backend/services/self.service.js.map +1 -0
- package/dist/backend/services/stats.service.d.ts +10 -0
- package/dist/backend/services/stats.service.d.ts.map +1 -0
- package/dist/backend/services/stats.service.js +45 -0
- package/dist/backend/services/stats.service.js.map +1 -0
- package/dist/backend/services/subscriber-admin.service.d.ts +26 -0
- package/dist/backend/services/subscriber-admin.service.d.ts.map +1 -0
- package/dist/backend/services/subscriber-admin.service.js +163 -0
- package/dist/backend/services/subscriber-admin.service.js.map +1 -0
- package/dist/backend/services/subscriber.service.d.ts +91 -0
- package/dist/backend/services/subscriber.service.d.ts.map +1 -0
- package/dist/backend/services/subscriber.service.js +280 -0
- package/dist/backend/services/subscriber.service.js.map +1 -0
- package/dist/backend/services/tag.service.d.ts +16 -0
- package/dist/backend/services/tag.service.d.ts.map +1 -0
- package/dist/backend/services/tag.service.js +79 -0
- package/dist/backend/services/tag.service.js.map +1 -0
- package/dist/backend/services/token.helper.d.ts +32 -0
- package/dist/backend/services/token.helper.d.ts.map +1 -0
- package/dist/backend/services/token.helper.js +76 -0
- package/dist/backend/services/token.helper.js.map +1 -0
- package/dist/backend/services/tracking.service.d.ts +14 -0
- package/dist/backend/services/tracking.service.d.ts.map +1 -0
- package/dist/backend/services/tracking.service.js +45 -0
- package/dist/backend/services/tracking.service.js.map +1 -0
- package/dist/manifest.d.ts +192 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +211 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260629T200954_newsletter_init.d.ts +6 -0
- package/dist/migrations/20260629T200954_newsletter_init.d.ts.map +1 -0
- package/dist/migrations/20260629T200954_newsletter_init.js +261 -0
- package/dist/migrations/20260629T200954_newsletter_init.js.map +1 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts +116 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts.map +1 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.js +186 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.js.map +1 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts +6 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts.map +1 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js +58 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js.map +1 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts +23 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts.map +1 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js +27 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js.map +1 -0
- package/dist/migrations/index.d.ts +30 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +35 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/newsletter.md +94 -0
- package/i18n/en.json +27 -0
- package/i18n/pl.json +27 -0
- package/package.json +119 -0
- package/tailwind.css +14 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { useNavigate, useParams } from 'react-router-dom';
|
|
4
|
+
import { useAuth } from '@endora-commerce/admin-kit/lib';
|
|
5
|
+
import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Input, PageHeader } from '@endora-commerce/admin-kit/ui';
|
|
6
|
+
import { EmailEditorPane, EmailSubjectWithVariables, EmailVariablesProvider, listEmailTemplatesForApply, loadEmailTemplateCanvas, saveCanvasAsEmailTemplate, } from '@endora-commerce/page-builder-admin/email';
|
|
7
|
+
import { newsletterVariables } from '../email-variables.js';
|
|
8
|
+
import { newsletterClient } from '../api/newsletter-client.js';
|
|
9
|
+
const emptyData = { root: { props: {} }, content: [] };
|
|
10
|
+
function toApiSteps(steps) {
|
|
11
|
+
return steps.map((s) => s.type === 'send'
|
|
12
|
+
? { type: 'send', subject: s.subject, content: s.content }
|
|
13
|
+
: { type: 'wait', days: s.days });
|
|
14
|
+
}
|
|
15
|
+
function fromApiSteps(steps) {
|
|
16
|
+
return steps.map((s) => {
|
|
17
|
+
if (s.type === 'wait')
|
|
18
|
+
return { type: 'wait', days: s.days };
|
|
19
|
+
return {
|
|
20
|
+
type: 'send',
|
|
21
|
+
subject: s.subject,
|
|
22
|
+
content: s.content ?? emptyData,
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function AutomationBuilder() {
|
|
27
|
+
const { id } = useParams();
|
|
28
|
+
const isNew = !id || id === 'new';
|
|
29
|
+
const navigate = useNavigate();
|
|
30
|
+
const { hasPermission } = useAuth();
|
|
31
|
+
const canWrite = hasPermission('newsletter:write');
|
|
32
|
+
const [detail, setDetail] = useState(null);
|
|
33
|
+
const [tags, setTags] = useState([]);
|
|
34
|
+
const [customFields, setCustomFields] = useState([]);
|
|
35
|
+
const [name, setName] = useState('');
|
|
36
|
+
const [triggerType, setTriggerType] = useState('all');
|
|
37
|
+
const [triggerTagIds, setTriggerTagIds] = useState([]);
|
|
38
|
+
const [steps, setSteps] = useState([{ type: 'send', subject: '', content: emptyData }]);
|
|
39
|
+
const [error, setError] = useState(null);
|
|
40
|
+
const [notice, setNotice] = useState(null);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
newsletterClient.listTags().then((r) => setTags(r.items)).catch(() => undefined);
|
|
43
|
+
newsletterClient
|
|
44
|
+
.listCustomFields()
|
|
45
|
+
.then((r) => setCustomFields(r.items))
|
|
46
|
+
.catch(() => undefined);
|
|
47
|
+
if (!isNew && id) {
|
|
48
|
+
newsletterClient
|
|
49
|
+
.getAutomation(id)
|
|
50
|
+
.then((a) => {
|
|
51
|
+
setDetail(a);
|
|
52
|
+
setName(a.name);
|
|
53
|
+
setTriggerType(a.triggerType);
|
|
54
|
+
setTriggerTagIds(a.triggerTagIds);
|
|
55
|
+
setSteps(fromApiSteps(a.steps));
|
|
56
|
+
})
|
|
57
|
+
.catch((err) => setError(err instanceof Error ? err.message : String(err)));
|
|
58
|
+
}
|
|
59
|
+
}, [id, isNew]);
|
|
60
|
+
function move(idx, dir) {
|
|
61
|
+
setSteps((prev) => {
|
|
62
|
+
const next = [...prev];
|
|
63
|
+
const j = idx + dir;
|
|
64
|
+
if (j < 0 || j >= next.length)
|
|
65
|
+
return prev;
|
|
66
|
+
[next[idx], next[j]] = [next[j], next[idx]];
|
|
67
|
+
return next;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async function save() {
|
|
71
|
+
setError(null);
|
|
72
|
+
try {
|
|
73
|
+
const payload = {
|
|
74
|
+
name,
|
|
75
|
+
triggerType,
|
|
76
|
+
triggerTagIds,
|
|
77
|
+
language: detail?.language ?? 'en-US',
|
|
78
|
+
reentryPolicy: detail?.reentryPolicy ?? 'once',
|
|
79
|
+
steps: toApiSteps(steps),
|
|
80
|
+
};
|
|
81
|
+
const saved = isNew
|
|
82
|
+
? await newsletterClient.createAutomation(payload)
|
|
83
|
+
: await newsletterClient.updateAutomation(id, { ...payload, expectedVersion: detail.version });
|
|
84
|
+
setDetail(saved);
|
|
85
|
+
setNotice('Saved.');
|
|
86
|
+
if (isNew)
|
|
87
|
+
navigate(`/newsletter/automations/${saved.id}`, { replace: true });
|
|
88
|
+
return saved;
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function activate() {
|
|
96
|
+
const saved = (await save()) ?? detail;
|
|
97
|
+
if (!saved)
|
|
98
|
+
return;
|
|
99
|
+
try {
|
|
100
|
+
const a = await newsletterClient.activateAutomation(saved.id, saved.version);
|
|
101
|
+
setDetail(a);
|
|
102
|
+
setNotice('Activated.');
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!hasPermission('newsletter:read')) {
|
|
109
|
+
return (_jsx(Alert, { children: _jsx(AlertDescription, { children: "You do not have permission to view the newsletter." }) }));
|
|
110
|
+
}
|
|
111
|
+
const variables = newsletterVariables(customFields.map((f) => ({ key: f.key, label: f.label })));
|
|
112
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(PageHeader, { title: isNew ? 'New automation' : name || 'Automation', back: { label: 'Automations', to: '/newsletter/automations' }, actions: canWrite ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => void save(), children: "Save" }), _jsx(Button, { onClick: () => void activate(), children: "Activate" })] })) : null }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, notice ? (_jsx(Alert, { children: _jsx(AlertDescription, { children: notice }) })) : null, _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Trigger" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsx(Input, { placeholder: "Automation name", value: name, onChange: (e) => setName(e.target.value), disabled: !canWrite }), _jsxs("select", { className: "border rounded px-2 py-1 text-sm", value: triggerType, onChange: (e) => setTriggerType(e.target.value), disabled: !canWrite, children: [_jsx("option", { value: "all", children: "All subscribers" }), _jsx("option", { value: "tag", children: "Tag" }), _jsx("option", { value: "tag_list", children: "Tag list" })] }), (triggerType === 'tag' || triggerType === 'tag_list') ? (_jsx("div", { className: "flex flex-wrap gap-2", children: tags.map((t) => (_jsxs("label", { className: "flex items-center gap-1 text-sm", children: [_jsx("input", { type: "checkbox", checked: triggerTagIds.includes(t.id), onChange: (e) => setTriggerTagIds((prev) => (e.target.checked ? [...prev, t.id] : prev.filter((x) => x !== t.id))), disabled: !canWrite }), t.name] }, t.id))) })) : null] })] }), _jsx(EmailVariablesProvider, { variables: variables, children: _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Steps" }) }), _jsxs(CardContent, { className: "space-y-3", children: [steps.map((step, idx) => (_jsxs("div", { className: "rounded border p-3 space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("span", { className: "text-sm font-medium", children: [idx + 1, ". ", step.type === 'send' ? 'Send email' : 'Wait'] }), canWrite ? (_jsxs("span", { className: "flex gap-1", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: () => move(idx, -1), children: "\u2191" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => move(idx, 1), children: "\u2193" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setSteps((p) => p.filter((_, i) => i !== idx)), children: "\u2715" })] })) : null] }), step.type === 'send' ? (_jsxs(_Fragment, { children: [_jsx(EmailSubjectWithVariables, { value: step.subject, onChange: (subject) => setSteps((p) => p.map((s, i) => (i === idx && s.type === 'send' ? { ...s, subject } : s))), disabled: !canWrite, placeholder: "Subject" }), _jsx(EmailEditorPane, { editorKey: `automation:${id ?? 'new'}:step:${idx}`, data: step.content, onChange: (content) => setSteps((p) => p.map((s, i) => (i === idx && s.type === 'send' ? { ...s, content } : s))), builderContext: "newsletter", ...(canWrite
|
|
113
|
+
? {
|
|
114
|
+
onSaveAsTemplate: async (meta, canvasData) => {
|
|
115
|
+
await saveCanvasAsEmailTemplate({
|
|
116
|
+
...meta,
|
|
117
|
+
data: canvasData,
|
|
118
|
+
languages: ['en-US'],
|
|
119
|
+
activeLanguage: 'en-US',
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
: {}), onListTemplatesForApply: () => listEmailTemplatesForApply(null), onResolveTemplateLayout: (templateId) => loadEmailTemplateCanvas(templateId, 'en-US') })] })) : (_jsxs("label", { className: "flex items-center gap-2 text-sm", children: ["Wait", _jsx(Input, { type: "number", min: 1, className: "w-24", value: step.days, onChange: (e) => setSteps((p) => p.map((s, i) => (i === idx && s.type === 'wait' ? { ...s, days: Number(e.target.value) } : s))), disabled: !canWrite }), "days"] }))] }, idx))), canWrite ? (_jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => setSteps((p) => [...p, { type: 'send', subject: '', content: emptyData }]), children: "+ Send email" }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => setSteps((p) => [...p, { type: 'wait', days: 1 }]), children: "+ Wait" })] })) : null] })] }) })] }));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
127
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
128
|
+
* the spelling this module's own code and its tests use.
|
|
129
|
+
*/
|
|
130
|
+
export default AutomationBuilder;
|
|
131
|
+
//# sourceMappingURL=AutomationBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutomationBuilder.js","sourceRoot":"","sources":["../../../src/admin/pages/AutomationBuilder.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function AutomationsPage(): React.ReactElement;
|
|
2
|
+
/**
|
|
3
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
4
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
5
|
+
* the spelling this module's own code and its tests use.
|
|
6
|
+
*/
|
|
7
|
+
export default AutomationsPage;
|
|
8
|
+
//# sourceMappingURL=AutomationsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutomationsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/AutomationsPage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,IAAI,KAAK,CAAC,YAAY,CAsGpD;AAED;;;;GAIG;AACH,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState, useCallback } from 'react';
|
|
3
|
+
import { Link } from 'react-router-dom';
|
|
4
|
+
import { useAuth } from '@endora-commerce/admin-kit/lib';
|
|
5
|
+
import { Alert, AlertDescription, Button, Card, CardContent, PageHeader } from '@endora-commerce/admin-kit/ui';
|
|
6
|
+
import { newsletterClient } from '../api/newsletter-client.js';
|
|
7
|
+
export function AutomationsPage() {
|
|
8
|
+
const { hasPermission } = useAuth();
|
|
9
|
+
const canWrite = hasPermission('newsletter:write');
|
|
10
|
+
const [items, setItems] = useState([]);
|
|
11
|
+
const [error, setError] = useState(null);
|
|
12
|
+
const load = useCallback(() => {
|
|
13
|
+
newsletterClient
|
|
14
|
+
.listAutomations()
|
|
15
|
+
.then((r) => setItems(r.items))
|
|
16
|
+
.catch((err) => setError(err instanceof Error ? err.message : String(err)));
|
|
17
|
+
}, []);
|
|
18
|
+
useEffect(() => load(), [load]);
|
|
19
|
+
async function toggle(id, activate) {
|
|
20
|
+
try {
|
|
21
|
+
const detail = await newsletterClient.getAutomation(id);
|
|
22
|
+
if (activate)
|
|
23
|
+
await newsletterClient.activateAutomation(id, detail.version);
|
|
24
|
+
else
|
|
25
|
+
await newsletterClient.pauseAutomation(id, detail.version);
|
|
26
|
+
load();
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (!hasPermission('newsletter:read')) {
|
|
33
|
+
return (_jsx(Alert, { children: _jsx(AlertDescription, { children: "You do not have permission to view the newsletter." }) }));
|
|
34
|
+
}
|
|
35
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(PageHeader, { title: "Newsletter \u2014 Automations", description: "Linear send/wait sequences.", actions: canWrite ? (_jsx(Link, { to: "/newsletter/automations/new", children: _jsx(Button, { children: "New automation" }) })) : null }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "border-b text-left text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "p-3 font-medium", children: "Name" }), _jsx("th", { className: "p-3 font-medium", children: "Trigger" }), _jsx("th", { className: "p-3 font-medium", children: "Steps" }), _jsx("th", { className: "p-3 font-medium", children: "Status" }), canWrite ? _jsx("th", { className: "p-3 font-medium", children: "Actions" }) : null] }) }), _jsxs("tbody", { children: [items.map((a) => (_jsxs("tr", { className: "border-b last:border-0 hover:bg-muted/40", children: [_jsx("td", { className: "p-3", children: _jsx(Link, { className: "font-medium text-primary hover:underline", to: `/newsletter/automations/${a.id}`, children: a.name }) }), _jsx("td", { className: "p-3 text-xs", children: a.triggerType }), _jsx("td", { className: "p-3", children: a.stepCount }), _jsx("td", { className: "p-3", children: a.status }), canWrite ? (_jsx("td", { className: "p-3", children: a.status === 'active' ? (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => void toggle(a.id, false), children: "Pause" })) : (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => void toggle(a.id, true), children: "Activate" })) })) : null] }, a.id))), items.length === 0 ? (_jsx("tr", { children: _jsx("td", { className: "p-3 text-muted-foreground", colSpan: canWrite ? 5 : 4, children: "No automations yet." }) })) : null] })] }) }) })] }));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
39
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
40
|
+
* the spelling this module's own code and its tests use.
|
|
41
|
+
*/
|
|
42
|
+
export default AutomationsPage;
|
|
43
|
+
//# sourceMappingURL=AutomationsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutomationsPage.js","sourceRoot":"","sources":["../../../src/admin/pages/AutomationsPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function BlocksPage(): React.ReactElement;
|
|
2
|
+
/**
|
|
3
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
4
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
5
|
+
* the spelling this module's own code and its tests use.
|
|
6
|
+
*/
|
|
7
|
+
export default BlocksPage;
|
|
8
|
+
//# sourceMappingURL=BlocksPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlocksPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/BlocksPage.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,UAAU,IAAI,KAAK,CAAC,YAAY,CAiP/C;AAED;;;;GAIG;AACH,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState, useCallback } from 'react';
|
|
3
|
+
import { useAuth } from '@endora-commerce/admin-kit/lib';
|
|
4
|
+
import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Input, PageHeader } from '@endora-commerce/admin-kit/ui';
|
|
5
|
+
import { EmailEditorPane, EmailVariablesProvider, listEmailTemplatesForApply, loadEmailTemplateCanvas, saveCanvasAsEmailTemplate, } from '@endora-commerce/page-builder-admin/email';
|
|
6
|
+
import { newsletterVariables } from '../email-variables.js';
|
|
7
|
+
import { newsletterClient } from '../api/newsletter-client.js';
|
|
8
|
+
const emptyData = { root: { props: {} }, content: [] };
|
|
9
|
+
function asData(content) {
|
|
10
|
+
if (!content || typeof content !== 'object')
|
|
11
|
+
return emptyData;
|
|
12
|
+
return content;
|
|
13
|
+
}
|
|
14
|
+
export function BlocksPage() {
|
|
15
|
+
const { hasPermission } = useAuth();
|
|
16
|
+
const canWrite = hasPermission('newsletter:write');
|
|
17
|
+
const [items, setItems] = useState([]);
|
|
18
|
+
const [customFields, setCustomFields] = useState([]);
|
|
19
|
+
const [error, setError] = useState(null);
|
|
20
|
+
const [code, setCode] = useState('');
|
|
21
|
+
const [name, setName] = useState('');
|
|
22
|
+
const [createContent, setCreateContent] = useState(emptyData);
|
|
23
|
+
const [edit, setEdit] = useState(null);
|
|
24
|
+
const load = useCallback(() => {
|
|
25
|
+
newsletterClient
|
|
26
|
+
.listBlocks()
|
|
27
|
+
.then((r) => setItems(r.items))
|
|
28
|
+
.catch((e) => setError(e instanceof Error ? e.message : String(e)));
|
|
29
|
+
}, []);
|
|
30
|
+
useEffect(() => load(), [load]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
newsletterClient
|
|
33
|
+
.listCustomFields()
|
|
34
|
+
.then((r) => setCustomFields(r.items))
|
|
35
|
+
.catch(() => undefined);
|
|
36
|
+
}, []);
|
|
37
|
+
const startEdit = useCallback((id) => {
|
|
38
|
+
setError(null);
|
|
39
|
+
newsletterClient
|
|
40
|
+
.getBlock(id)
|
|
41
|
+
.then((b) => {
|
|
42
|
+
setEdit({
|
|
43
|
+
id: b.id,
|
|
44
|
+
code: b.code,
|
|
45
|
+
name: b.name,
|
|
46
|
+
content: asData(b.content),
|
|
47
|
+
active: b.active,
|
|
48
|
+
version: b.version,
|
|
49
|
+
});
|
|
50
|
+
})
|
|
51
|
+
.catch((e) => setError(e instanceof Error ? e.message : String(e)));
|
|
52
|
+
}, []);
|
|
53
|
+
async function run(fn) {
|
|
54
|
+
setError(null);
|
|
55
|
+
try {
|
|
56
|
+
await fn();
|
|
57
|
+
load();
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (!hasPermission('newsletter:read')) {
|
|
64
|
+
return (_jsx(Alert, { children: _jsx(AlertDescription, { children: "You do not have permission to view the newsletter." }) }));
|
|
65
|
+
}
|
|
66
|
+
const variables = newsletterVariables(customFields.map((f) => ({ key: f.key, label: f.label })));
|
|
67
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(PageHeader, { title: "Newsletter \u2014 Email blocks", description: "Reusable email-safe blocks (e.g. header / footer)." }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs(EmailVariablesProvider, { variables: variables, children: [canWrite && edit ? (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Edit block" }) }), _jsxs(CardContent, { className: "space-y-2", children: [_jsx(Input, { value: edit.code, readOnly: true, disabled: true, className: "max-w-sm font-mono" }), _jsx(Input, { placeholder: "name", value: edit.name, onChange: (e) => setEdit((prev) => (prev ? { ...prev, name: e.target.value } : prev)), className: "max-w-sm" }), _jsx(EmailEditorPane, { editorKey: `nl-block:${edit.id}`, data: edit.content, onChange: (data) => setEdit((prev) => (prev ? { ...prev, content: data } : prev)), builderContext: "newsletter", ...(canWrite
|
|
68
|
+
? {
|
|
69
|
+
onSaveAsTemplate: async (meta, canvasData) => {
|
|
70
|
+
await saveCanvasAsEmailTemplate({
|
|
71
|
+
...meta,
|
|
72
|
+
data: canvasData,
|
|
73
|
+
languages: ['en-US'],
|
|
74
|
+
activeLanguage: 'en-US',
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
: {}), onListTemplatesForApply: () => listEmailTemplatesForApply(null), onResolveTemplateLayout: (templateId) => loadEmailTemplateCanvas(templateId, 'en-US') }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: edit.active, onChange: (e) => setEdit((prev) => (prev ? { ...prev, active: e.target.checked } : prev)) }), "Active"] }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { size: "sm", onClick: () => void run(async () => {
|
|
79
|
+
await newsletterClient.updateBlock(edit.id, {
|
|
80
|
+
name: edit.name,
|
|
81
|
+
content: edit.content,
|
|
82
|
+
active: edit.active,
|
|
83
|
+
expectedVersion: edit.version,
|
|
84
|
+
});
|
|
85
|
+
setEdit(null);
|
|
86
|
+
}), children: "Save changes" }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => setEdit(null), children: "Cancel" })] })] })] })) : null, canWrite && !edit ? (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "New block" }) }), _jsxs(CardContent, { className: "space-y-2", children: [_jsx(Input, { placeholder: "code (e.g. promo_footer)", value: code, onChange: (e) => setCode(e.target.value), className: "max-w-sm" }), _jsx(Input, { placeholder: "name", value: name, onChange: (e) => setName(e.target.value), className: "max-w-sm" }), _jsx(EmailEditorPane, { editorKey: `nl-block:new:${code || 'draft'}`, data: createContent, onChange: setCreateContent, builderContext: "newsletter", onSaveAsTemplate: async (meta, canvasData) => {
|
|
87
|
+
await saveCanvasAsEmailTemplate({
|
|
88
|
+
...meta,
|
|
89
|
+
data: canvasData,
|
|
90
|
+
languages: ['en-US'],
|
|
91
|
+
activeLanguage: 'en-US',
|
|
92
|
+
});
|
|
93
|
+
}, onListTemplatesForApply: () => listEmailTemplatesForApply(null), onResolveTemplateLayout: (templateId) => loadEmailTemplateCanvas(templateId, 'en-US') }), _jsx(Button, { size: "sm", onClick: () => void run(async () => {
|
|
94
|
+
await newsletterClient.createBlock({
|
|
95
|
+
code,
|
|
96
|
+
name,
|
|
97
|
+
content: createContent,
|
|
98
|
+
});
|
|
99
|
+
setCode('');
|
|
100
|
+
setName('');
|
|
101
|
+
setCreateContent(emptyData);
|
|
102
|
+
}), children: "Create block" })] })] })) : null] }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "border-b text-left text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "p-3 font-medium", children: "Code" }), _jsx("th", { className: "p-3 font-medium", children: "Name" }), _jsx("th", { className: "p-3 font-medium", children: "Active" }), _jsx("th", { className: "p-3 font-medium", children: "System" }), canWrite ? _jsx("th", { className: "p-3 font-medium", children: "Actions" }) : null] }) }), _jsxs("tbody", { children: [items.map((b) => (_jsxs("tr", { className: "border-b last:border-0 hover:bg-muted/40", children: [_jsx("td", { className: "p-3 font-mono text-xs", children: b.code }), _jsx("td", { className: "p-3", children: b.name }), _jsx("td", { className: "p-3", children: b.active ? 'Yes' : '—' }), _jsx("td", { className: "p-3", children: b.isSystem ? 'Yes' : '—' }), canWrite ? (_jsx("td", { className: "p-3", children: _jsxs("div", { className: "flex gap-1", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: () => startEdit(b.id), children: "Edit" }), !b.isSystem ? (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => void run(() => newsletterClient.deleteBlock(b.id)), children: "Delete" })) : (_jsx("span", { className: "self-center text-xs text-muted-foreground", children: "protected" }))] }) })) : null] }, b.id))), items.length === 0 ? (_jsx("tr", { children: _jsx("td", { className: "p-3 text-muted-foreground", colSpan: canWrite ? 5 : 4, children: "No blocks yet." }) })) : null] })] }) }) })] }));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
106
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
107
|
+
* the spelling this module's own code and its tests use.
|
|
108
|
+
*/
|
|
109
|
+
export default BlocksPage;
|
|
110
|
+
//# sourceMappingURL=BlocksPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlocksPage.js","sourceRoot":"","sources":["../../../src/admin/pages/BlocksPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function CampaignEditor(): React.ReactElement;
|
|
2
|
+
/**
|
|
3
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
4
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
5
|
+
* the spelling this module's own code and its tests use.
|
|
6
|
+
*/
|
|
7
|
+
export default CampaignEditor;
|
|
8
|
+
//# sourceMappingURL=CampaignEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CampaignEditor.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/CampaignEditor.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,cAAc,IAAI,KAAK,CAAC,YAAY,CA8RnD;AAED;;;;GAIG;AACH,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { Link, useNavigate, useParams } from 'react-router-dom';
|
|
4
|
+
import { useAuth } from '@endora-commerce/admin-kit/lib';
|
|
5
|
+
import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Input, PageHeader } from '@endora-commerce/admin-kit/ui';
|
|
6
|
+
import { EmailEditorPane, EmailSubjectWithVariables, EmailVariablesProvider, listEmailTemplatesForApply, loadEmailTemplateCanvas, saveCanvasAsEmailTemplate, } from '@endora-commerce/page-builder-admin/email';
|
|
7
|
+
import { newsletterVariables } from '../email-variables.js';
|
|
8
|
+
import { newsletterClient } from '../api/newsletter-client.js';
|
|
9
|
+
const emptyData = { root: { props: {} }, content: [] };
|
|
10
|
+
function asData(content) {
|
|
11
|
+
if (!content || typeof content !== 'object')
|
|
12
|
+
return emptyData;
|
|
13
|
+
return content;
|
|
14
|
+
}
|
|
15
|
+
export function CampaignEditor() {
|
|
16
|
+
const { id } = useParams();
|
|
17
|
+
const isNew = !id || id === 'new';
|
|
18
|
+
const navigate = useNavigate();
|
|
19
|
+
const { hasPermission } = useAuth();
|
|
20
|
+
const canWrite = hasPermission('newsletter:write');
|
|
21
|
+
const [campaign, setCampaign] = useState(null);
|
|
22
|
+
const [tags, setTags] = useState([]);
|
|
23
|
+
const [customFields, setCustomFields] = useState([]);
|
|
24
|
+
const [subscribers, setSubscribers] = useState([]);
|
|
25
|
+
const [targetSubscriberIds, setTargetSubscriberIds] = useState([]);
|
|
26
|
+
const [groupTouched, setGroupTouched] = useState(false);
|
|
27
|
+
const [name, setName] = useState('');
|
|
28
|
+
const [language, setLanguage] = useState('en-US');
|
|
29
|
+
const [subject, setSubject] = useState('');
|
|
30
|
+
const [content, setContent] = useState(emptyData);
|
|
31
|
+
const [targetType, setTargetType] = useState('all');
|
|
32
|
+
const [targetTagIds, setTargetTagIds] = useState([]);
|
|
33
|
+
const [error, setError] = useState(null);
|
|
34
|
+
const [notice, setNotice] = useState(null);
|
|
35
|
+
const [preview, setPreview] = useState(null);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
newsletterClient.listTags().then((r) => setTags(r.items)).catch(() => undefined);
|
|
38
|
+
newsletterClient
|
|
39
|
+
.listCustomFields()
|
|
40
|
+
.then((r) => setCustomFields(r.items))
|
|
41
|
+
.catch(() => undefined);
|
|
42
|
+
newsletterClient
|
|
43
|
+
.listSubscribers({ status: 'active', pageSize: 200 })
|
|
44
|
+
.then((r) => setSubscribers(r.items))
|
|
45
|
+
.catch(() => undefined);
|
|
46
|
+
if (!isNew && id) {
|
|
47
|
+
newsletterClient
|
|
48
|
+
.getCampaign(id)
|
|
49
|
+
.then((c) => {
|
|
50
|
+
setCampaign(c);
|
|
51
|
+
setName(c.name);
|
|
52
|
+
setLanguage(c.language);
|
|
53
|
+
setSubject(c.subject);
|
|
54
|
+
setContent(asData(c.content));
|
|
55
|
+
setTargetType(c.targetType);
|
|
56
|
+
setTargetTagIds(c.targetTagIds);
|
|
57
|
+
})
|
|
58
|
+
.catch((err) => setError(err instanceof Error ? err.message : String(err)));
|
|
59
|
+
}
|
|
60
|
+
}, [id, isNew]);
|
|
61
|
+
async function save() {
|
|
62
|
+
setError(null);
|
|
63
|
+
try {
|
|
64
|
+
const payload = {
|
|
65
|
+
name,
|
|
66
|
+
language,
|
|
67
|
+
subject,
|
|
68
|
+
content: content,
|
|
69
|
+
targetType,
|
|
70
|
+
targetTagIds,
|
|
71
|
+
};
|
|
72
|
+
let saved = isNew
|
|
73
|
+
? await newsletterClient.createCampaign(payload)
|
|
74
|
+
: await newsletterClient.updateCampaign(id, { ...payload, expectedVersion: campaign.version });
|
|
75
|
+
if (targetType === 'group' && (isNew || groupTouched)) {
|
|
76
|
+
saved = await newsletterClient.setCampaignGroup(saved.id, targetSubscriberIds);
|
|
77
|
+
}
|
|
78
|
+
setCampaign(saved);
|
|
79
|
+
setNotice('Saved.');
|
|
80
|
+
if (isNew)
|
|
81
|
+
navigate(`/newsletter/campaigns/${saved.id}`, { replace: true });
|
|
82
|
+
return saved;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function doPreview() {
|
|
90
|
+
const saved = campaign ?? (await save());
|
|
91
|
+
if (!saved)
|
|
92
|
+
return;
|
|
93
|
+
try {
|
|
94
|
+
const r = await newsletterClient.previewCampaign(saved.id);
|
|
95
|
+
setPreview(r.html);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function doSend() {
|
|
102
|
+
const saved = (await save()) ?? campaign;
|
|
103
|
+
if (!saved)
|
|
104
|
+
return;
|
|
105
|
+
try {
|
|
106
|
+
const sent = await newsletterClient.sendCampaign(saved.id, saved.version);
|
|
107
|
+
setCampaign(sent);
|
|
108
|
+
setNotice(`Campaign ${sent.status}.`);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!hasPermission('newsletter:read')) {
|
|
115
|
+
return (_jsx(Alert, { children: _jsx(AlertDescription, { children: "You do not have permission to view the newsletter." }) }));
|
|
116
|
+
}
|
|
117
|
+
const variables = newsletterVariables(customFields.map((f) => ({ key: f.key, label: f.label })));
|
|
118
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(PageHeader, { title: isNew ? 'New campaign' : name || 'Campaign', back: { label: 'Campaigns', to: '/newsletter/campaigns' }, actions: canWrite ? (_jsxs(_Fragment, { children: [!isNew ? (_jsx(Link, { to: `/newsletter/campaigns/${id}/stats`, children: _jsx(Button, { variant: "outline", children: "Stats" }) })) : null, _jsx(Button, { variant: "outline", onClick: () => void doPreview(), children: "Preview" }), _jsx(Button, { variant: "outline", onClick: () => void save(), children: "Save" }), _jsx(Button, { onClick: () => void doSend(), children: "Send" })] })) : null }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, notice ? (_jsx(Alert, { children: _jsx(AlertDescription, { children: notice }) })) : null, _jsx(EmailVariablesProvider, { variables: variables, children: _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Content" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsx(Input, { placeholder: "Campaign name", value: name, onChange: (e) => setName(e.target.value), disabled: !canWrite }), _jsx(Input, { placeholder: "Language (e.g. en-US)", value: language, onChange: (e) => setLanguage(e.target.value), disabled: !canWrite }), _jsx(EmailSubjectWithVariables, { value: subject, onChange: setSubject, disabled: !canWrite, placeholder: "Subject (supports {{var \u2026}})" }), _jsx(EmailEditorPane, { editorKey: `campaign:${id ?? 'new'}:${language}`, data: content, onChange: setContent, builderContext: "newsletter", ...(canWrite
|
|
119
|
+
? {
|
|
120
|
+
onSaveAsTemplate: async (meta, canvasData) => {
|
|
121
|
+
await saveCanvasAsEmailTemplate({
|
|
122
|
+
...meta,
|
|
123
|
+
data: canvasData,
|
|
124
|
+
languages: [language || 'en-US'],
|
|
125
|
+
activeLanguage: language || null,
|
|
126
|
+
});
|
|
127
|
+
},
|
|
128
|
+
}
|
|
129
|
+
: {}), onListTemplatesForApply: () => listEmailTemplatesForApply(null), onResolveTemplateLayout: (templateId) => loadEmailTemplateCanvas(templateId, language || null) })] })] }) }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Audience" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("select", { className: "border rounded px-2 py-1 text-sm", value: targetType, onChange: (e) => setTargetType(e.target.value), disabled: !canWrite, children: [_jsx("option", { value: "all", children: "All subscribers" }), _jsx("option", { value: "tag", children: "Single tag" }), _jsx("option", { value: "tag_list", children: "Tag list" }), _jsx("option", { value: "group", children: "Manual group" })] }), (targetType === 'tag' || targetType === 'tag_list') ? (tags.length === 0 ? (_jsxs("p", { className: "text-sm text-muted-foreground", children: ["No tags yet \u2014 create tags on the", ' ', _jsx(Link, { to: "/newsletter/tags", className: "underline", children: "Tags & fields" }), ' ', "page first."] })) : (_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx("p", { className: "w-full text-sm text-muted-foreground", children: targetType === 'tag' ? 'Select a tag:' : 'Select one or more tags:' }), tags.map((t) => (_jsxs("label", { className: "flex items-center gap-1 text-sm", children: [_jsx("input", { type: "checkbox", checked: targetTagIds.includes(t.id), onChange: (e) => setTargetTagIds((prev) => e.target.checked
|
|
130
|
+
? targetType === 'tag'
|
|
131
|
+
? [t.id]
|
|
132
|
+
: [...prev, t.id]
|
|
133
|
+
: prev.filter((x) => x !== t.id)), disabled: !canWrite }), t.name] }, t.id)))] }))) : null, targetType === 'group' ? (subscribers.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "No active subscribers to add to a manual group yet." })) : (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Pick the subscribers for this campaign's manual group:" }), _jsx("div", { className: "flex max-h-64 flex-col gap-1 overflow-y-auto rounded border p-2", children: subscribers.map((s) => (_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: targetSubscriberIds.includes(s.id), onChange: (e) => {
|
|
134
|
+
setGroupTouched(true);
|
|
135
|
+
setTargetSubscriberIds((prev) => e.target.checked ? [...prev, s.id] : prev.filter((x) => x !== s.id));
|
|
136
|
+
}, disabled: !canWrite }), s.email] }, s.id))) }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [targetSubscriberIds.length, " selected \u2014 saved when you save the campaign."] })] }))) : null] })] }), preview ? (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Preview" }) }), _jsx(CardContent, { children: _jsx("iframe", { title: "preview", srcDoc: preview, className: "h-96 w-full rounded border" }) })] })) : null] }));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
140
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
141
|
+
* the spelling this module's own code and its tests use.
|
|
142
|
+
*/
|
|
143
|
+
export default CampaignEditor;
|
|
144
|
+
//# sourceMappingURL=CampaignEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CampaignEditor.js","sourceRoot":"","sources":["../../../src/admin/pages/CampaignEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function CampaignStats(): React.ReactElement;
|
|
2
|
+
/**
|
|
3
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
4
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
5
|
+
* the spelling this module's own code and its tests use.
|
|
6
|
+
*/
|
|
7
|
+
export default CampaignStats;
|
|
8
|
+
//# sourceMappingURL=CampaignStats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CampaignStats.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/CampaignStats.tsx"],"names":[],"mappings":"AASA,wBAAgB,aAAa,IAAI,KAAK,CAAC,YAAY,CAqFlD;AAED;;;;GAIG;AACH,eAAe,aAAa,CAAC"}
|