@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.
Files changed (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -0
  3. package/dist/admin/api/newsletter-client.d.ts +64 -0
  4. package/dist/admin/api/newsletter-client.d.ts.map +1 -0
  5. package/dist/admin/api/newsletter-client.js +71 -0
  6. package/dist/admin/api/newsletter-client.js.map +1 -0
  7. package/dist/admin/email-variables.d.ts +21 -0
  8. package/dist/admin/email-variables.d.ts.map +1 -0
  9. package/dist/admin/email-variables.js +48 -0
  10. package/dist/admin/email-variables.js.map +1 -0
  11. package/dist/admin/index.d.ts +44 -0
  12. package/dist/admin/index.d.ts.map +1 -0
  13. package/dist/admin/index.js +149 -0
  14. package/dist/admin/index.js.map +1 -0
  15. package/dist/admin/pages/AutomationBuilder.d.ts +8 -0
  16. package/dist/admin/pages/AutomationBuilder.d.ts.map +1 -0
  17. package/dist/admin/pages/AutomationBuilder.js +131 -0
  18. package/dist/admin/pages/AutomationBuilder.js.map +1 -0
  19. package/dist/admin/pages/AutomationsPage.d.ts +8 -0
  20. package/dist/admin/pages/AutomationsPage.d.ts.map +1 -0
  21. package/dist/admin/pages/AutomationsPage.js +43 -0
  22. package/dist/admin/pages/AutomationsPage.js.map +1 -0
  23. package/dist/admin/pages/BlocksPage.d.ts +8 -0
  24. package/dist/admin/pages/BlocksPage.d.ts.map +1 -0
  25. package/dist/admin/pages/BlocksPage.js +110 -0
  26. package/dist/admin/pages/BlocksPage.js.map +1 -0
  27. package/dist/admin/pages/CampaignEditor.d.ts +8 -0
  28. package/dist/admin/pages/CampaignEditor.d.ts.map +1 -0
  29. package/dist/admin/pages/CampaignEditor.js +144 -0
  30. package/dist/admin/pages/CampaignEditor.js.map +1 -0
  31. package/dist/admin/pages/CampaignStats.d.ts +8 -0
  32. package/dist/admin/pages/CampaignStats.d.ts.map +1 -0
  33. package/dist/admin/pages/CampaignStats.js +45 -0
  34. package/dist/admin/pages/CampaignStats.js.map +1 -0
  35. package/dist/admin/pages/CampaignsPage.d.ts +8 -0
  36. package/dist/admin/pages/CampaignsPage.d.ts.map +1 -0
  37. package/dist/admin/pages/CampaignsPage.js +28 -0
  38. package/dist/admin/pages/CampaignsPage.js.map +1 -0
  39. package/dist/admin/pages/ProviderSettingsPage.d.ts +8 -0
  40. package/dist/admin/pages/ProviderSettingsPage.d.ts.map +1 -0
  41. package/dist/admin/pages/ProviderSettingsPage.js +64 -0
  42. package/dist/admin/pages/ProviderSettingsPage.js.map +1 -0
  43. package/dist/admin/pages/SubscribersPage.d.ts +8 -0
  44. package/dist/admin/pages/SubscribersPage.d.ts.map +1 -0
  45. package/dist/admin/pages/SubscribersPage.js +55 -0
  46. package/dist/admin/pages/SubscribersPage.js.map +1 -0
  47. package/dist/admin/pages/TagsPage.d.ts +8 -0
  48. package/dist/admin/pages/TagsPage.d.ts.map +1 -0
  49. package/dist/admin/pages/TagsPage.js +114 -0
  50. package/dist/admin/pages/TagsPage.js.map +1 -0
  51. package/dist/backend/entities/newsletter-automation-run.entity.d.ts +19 -0
  52. package/dist/backend/entities/newsletter-automation-run.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/newsletter-automation-run.entity.js +72 -0
  54. package/dist/backend/entities/newsletter-automation-run.entity.js.map +1 -0
  55. package/dist/backend/entities/newsletter-automation.entity.d.ts +22 -0
  56. package/dist/backend/entities/newsletter-automation.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/newsletter-automation.entity.js +86 -0
  58. package/dist/backend/entities/newsletter-automation.entity.js.map +1 -0
  59. package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts +6 -0
  60. package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/newsletter-campaign-subscriber.entity.js +30 -0
  62. package/dist/backend/entities/newsletter-campaign-subscriber.entity.js.map +1 -0
  63. package/dist/backend/entities/newsletter-campaign.entity.d.ts +22 -0
  64. package/dist/backend/entities/newsletter-campaign.entity.d.ts.map +1 -0
  65. package/dist/backend/entities/newsletter-campaign.entity.js +102 -0
  66. package/dist/backend/entities/newsletter-campaign.entity.js.map +1 -0
  67. package/dist/backend/entities/newsletter-custom-field.entity.d.ts +12 -0
  68. package/dist/backend/entities/newsletter-custom-field.entity.d.ts.map +1 -0
  69. package/dist/backend/entities/newsletter-custom-field.entity.js +53 -0
  70. package/dist/backend/entities/newsletter-custom-field.entity.js.map +1 -0
  71. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts +7 -0
  72. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts.map +1 -0
  73. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js +35 -0
  74. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js.map +1 -0
  75. package/dist/backend/entities/newsletter-email-block.entity.d.ts +21 -0
  76. package/dist/backend/entities/newsletter-email-block.entity.d.ts.map +1 -0
  77. package/dist/backend/entities/newsletter-email-block.entity.js +78 -0
  78. package/dist/backend/entities/newsletter-email-block.entity.js.map +1 -0
  79. package/dist/backend/entities/newsletter-engagement-event.entity.d.ts +12 -0
  80. package/dist/backend/entities/newsletter-engagement-event.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/newsletter-engagement-event.entity.js +54 -0
  82. package/dist/backend/entities/newsletter-engagement-event.entity.js.map +1 -0
  83. package/dist/backend/entities/newsletter-send-record.entity.d.ts +23 -0
  84. package/dist/backend/entities/newsletter-send-record.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/newsletter-send-record.entity.js +89 -0
  86. package/dist/backend/entities/newsletter-send-record.entity.js.map +1 -0
  87. package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts +6 -0
  88. package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/newsletter-subscriber-tag.entity.js +31 -0
  90. package/dist/backend/entities/newsletter-subscriber-tag.entity.js.map +1 -0
  91. package/dist/backend/entities/newsletter-subscriber.entity.d.ts +63 -0
  92. package/dist/backend/entities/newsletter-subscriber.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/newsletter-subscriber.entity.js +147 -0
  94. package/dist/backend/entities/newsletter-subscriber.entity.js.map +1 -0
  95. package/dist/backend/entities/newsletter-suppression.entity.d.ts +14 -0
  96. package/dist/backend/entities/newsletter-suppression.entity.d.ts.map +1 -0
  97. package/dist/backend/entities/newsletter-suppression.entity.js +51 -0
  98. package/dist/backend/entities/newsletter-suppression.entity.js.map +1 -0
  99. package/dist/backend/entities/newsletter-tag.entity.d.ts +12 -0
  100. package/dist/backend/entities/newsletter-tag.entity.d.ts.map +1 -0
  101. package/dist/backend/entities/newsletter-tag.entity.js +53 -0
  102. package/dist/backend/entities/newsletter-tag.entity.js.map +1 -0
  103. package/dist/backend/index.d.ts +120 -0
  104. package/dist/backend/index.d.ts.map +1 -0
  105. package/dist/backend/index.js +139 -0
  106. package/dist/backend/index.js.map +1 -0
  107. package/dist/backend/plugin.d.ts +114 -0
  108. package/dist/backend/plugin.d.ts.map +1 -0
  109. package/dist/backend/plugin.js +171 -0
  110. package/dist/backend/plugin.js.map +1 -0
  111. package/dist/backend/routes.admin.d.ts +27 -0
  112. package/dist/backend/routes.admin.d.ts.map +1 -0
  113. package/dist/backend/routes.admin.js +118 -0
  114. package/dist/backend/routes.admin.js.map +1 -0
  115. package/dist/backend/routes.self.d.ts +15 -0
  116. package/dist/backend/routes.self.d.ts.map +1 -0
  117. package/dist/backend/routes.self.js +28 -0
  118. package/dist/backend/routes.self.js.map +1 -0
  119. package/dist/backend/routes.storefront.d.ts +24 -0
  120. package/dist/backend/routes.storefront.d.ts.map +1 -0
  121. package/dist/backend/routes.storefront.js +79 -0
  122. package/dist/backend/routes.storefront.js.map +1 -0
  123. package/dist/backend/services/audience-resolver.d.ts +20 -0
  124. package/dist/backend/services/audience-resolver.d.ts.map +1 -0
  125. package/dist/backend/services/audience-resolver.js +41 -0
  126. package/dist/backend/services/audience-resolver.js.map +1 -0
  127. package/dist/backend/services/automation.service.d.ts +58 -0
  128. package/dist/backend/services/automation.service.d.ts.map +1 -0
  129. package/dist/backend/services/automation.service.js +301 -0
  130. package/dist/backend/services/automation.service.js.map +1 -0
  131. package/dist/backend/services/campaign-dispatch.service.d.ts +50 -0
  132. package/dist/backend/services/campaign-dispatch.service.d.ts.map +1 -0
  133. package/dist/backend/services/campaign-dispatch.service.js +130 -0
  134. package/dist/backend/services/campaign-dispatch.service.js.map +1 -0
  135. package/dist/backend/services/campaign.service.d.ts +40 -0
  136. package/dist/backend/services/campaign.service.d.ts.map +1 -0
  137. package/dist/backend/services/campaign.service.js +195 -0
  138. package/dist/backend/services/campaign.service.js.map +1 -0
  139. package/dist/backend/services/consent-block-seeder.d.ts +30 -0
  140. package/dist/backend/services/consent-block-seeder.d.ts.map +1 -0
  141. package/dist/backend/services/consent-block-seeder.js +52 -0
  142. package/dist/backend/services/consent-block-seeder.js.map +1 -0
  143. package/dist/backend/services/content.service.d.ts +52 -0
  144. package/dist/backend/services/content.service.d.ts.map +1 -0
  145. package/dist/backend/services/content.service.js +48 -0
  146. package/dist/backend/services/content.service.js.map +1 -0
  147. package/dist/backend/services/custom-field.service.d.ts +16 -0
  148. package/dist/backend/services/custom-field.service.d.ts.map +1 -0
  149. package/dist/backend/services/custom-field.service.js +67 -0
  150. package/dist/backend/services/custom-field.service.js.map +1 -0
  151. package/dist/backend/services/email-block.service.d.ts +26 -0
  152. package/dist/backend/services/email-block.service.d.ts.map +1 -0
  153. package/dist/backend/services/email-block.service.js +120 -0
  154. package/dist/backend/services/email-block.service.js.map +1 -0
  155. package/dist/backend/services/opt-in.service.d.ts +25 -0
  156. package/dist/backend/services/opt-in.service.d.ts.map +1 -0
  157. package/dist/backend/services/opt-in.service.js +46 -0
  158. package/dist/backend/services/opt-in.service.js.map +1 -0
  159. package/dist/backend/services/provider/console-provider.d.ts +32 -0
  160. package/dist/backend/services/provider/console-provider.d.ts.map +1 -0
  161. package/dist/backend/services/provider/console-provider.js +31 -0
  162. package/dist/backend/services/provider/console-provider.js.map +1 -0
  163. package/dist/backend/services/provider/provider-registry.d.ts +51 -0
  164. package/dist/backend/services/provider/provider-registry.d.ts.map +1 -0
  165. package/dist/backend/services/provider/provider-registry.js +84 -0
  166. package/dist/backend/services/provider/provider-registry.js.map +1 -0
  167. package/dist/backend/services/provider/smtp-provider.d.ts +30 -0
  168. package/dist/backend/services/provider/smtp-provider.d.ts.map +1 -0
  169. package/dist/backend/services/provider/smtp-provider.js +42 -0
  170. package/dist/backend/services/provider/smtp-provider.js.map +1 -0
  171. package/dist/backend/services/provider-admin.service.d.ts +39 -0
  172. package/dist/backend/services/provider-admin.service.d.ts.map +1 -0
  173. package/dist/backend/services/provider-admin.service.js +59 -0
  174. package/dist/backend/services/provider-admin.service.js.map +1 -0
  175. package/dist/backend/services/provider-admin.types.d.ts +6 -0
  176. package/dist/backend/services/provider-admin.types.d.ts.map +1 -0
  177. package/dist/backend/services/provider-admin.types.js +2 -0
  178. package/dist/backend/services/provider-admin.types.js.map +1 -0
  179. package/dist/backend/services/queues/newsletter-queues.d.ts +34 -0
  180. package/dist/backend/services/queues/newsletter-queues.d.ts.map +1 -0
  181. package/dist/backend/services/queues/newsletter-queues.js +58 -0
  182. package/dist/backend/services/queues/newsletter-queues.js.map +1 -0
  183. package/dist/backend/services/self.service.d.ts +17 -0
  184. package/dist/backend/services/self.service.d.ts.map +1 -0
  185. package/dist/backend/services/self.service.js +44 -0
  186. package/dist/backend/services/self.service.js.map +1 -0
  187. package/dist/backend/services/stats.service.d.ts +10 -0
  188. package/dist/backend/services/stats.service.d.ts.map +1 -0
  189. package/dist/backend/services/stats.service.js +45 -0
  190. package/dist/backend/services/stats.service.js.map +1 -0
  191. package/dist/backend/services/subscriber-admin.service.d.ts +26 -0
  192. package/dist/backend/services/subscriber-admin.service.d.ts.map +1 -0
  193. package/dist/backend/services/subscriber-admin.service.js +163 -0
  194. package/dist/backend/services/subscriber-admin.service.js.map +1 -0
  195. package/dist/backend/services/subscriber.service.d.ts +91 -0
  196. package/dist/backend/services/subscriber.service.d.ts.map +1 -0
  197. package/dist/backend/services/subscriber.service.js +280 -0
  198. package/dist/backend/services/subscriber.service.js.map +1 -0
  199. package/dist/backend/services/tag.service.d.ts +16 -0
  200. package/dist/backend/services/tag.service.d.ts.map +1 -0
  201. package/dist/backend/services/tag.service.js +79 -0
  202. package/dist/backend/services/tag.service.js.map +1 -0
  203. package/dist/backend/services/token.helper.d.ts +32 -0
  204. package/dist/backend/services/token.helper.d.ts.map +1 -0
  205. package/dist/backend/services/token.helper.js +76 -0
  206. package/dist/backend/services/token.helper.js.map +1 -0
  207. package/dist/backend/services/tracking.service.d.ts +14 -0
  208. package/dist/backend/services/tracking.service.d.ts.map +1 -0
  209. package/dist/backend/services/tracking.service.js +45 -0
  210. package/dist/backend/services/tracking.service.js.map +1 -0
  211. package/dist/manifest.d.ts +192 -0
  212. package/dist/manifest.d.ts.map +1 -0
  213. package/dist/manifest.js +211 -0
  214. package/dist/manifest.js.map +1 -0
  215. package/dist/migrations/20260629T200954_newsletter_init.d.ts +6 -0
  216. package/dist/migrations/20260629T200954_newsletter_init.d.ts.map +1 -0
  217. package/dist/migrations/20260629T200954_newsletter_init.js +261 -0
  218. package/dist/migrations/20260629T200954_newsletter_init.js.map +1 -0
  219. package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts +116 -0
  220. package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts.map +1 -0
  221. package/dist/migrations/20260830T212736_newsletter_organization_attribution.js +186 -0
  222. package/dist/migrations/20260830T212736_newsletter_organization_attribution.js.map +1 -0
  223. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts +6 -0
  224. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts.map +1 -0
  225. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js +58 -0
  226. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js.map +1 -0
  227. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts +23 -0
  228. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts.map +1 -0
  229. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js +27 -0
  230. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js.map +1 -0
  231. package/dist/migrations/index.d.ts +30 -0
  232. package/dist/migrations/index.d.ts.map +1 -0
  233. package/dist/migrations/index.js +35 -0
  234. package/dist/migrations/index.js.map +1 -0
  235. package/docs/newsletter.md +94 -0
  236. package/i18n/en.json +27 -0
  237. package/i18n/pl.json +27 -0
  238. package/package.json +119 -0
  239. 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":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC7I,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,SAAS,GAAS,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAE7D,SAAS,MAAM,CAAC,OAAgB;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,OAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgC,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAO,SAAS,CAAC,CAAC;IACpE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAOtB,IAAI,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,gBAAgB;aACb,UAAU,EAAE;aACZ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aAC9B,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB;aACb,gBAAgB,EAAE;aAClB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACrC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,EAAU,EAAQ,EAAE;QACjD,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,gBAAgB;aACb,QAAQ,CAAC,EAAE,CAAC;aACZ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,OAAO,CAAC;gBACN,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,UAAU,GAAG,CAAC,EAA0B;QAC3C,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,OAAO,CACL,KAAC,KAAK,cACJ,KAAC,gBAAgB,qEAAsE,GACjF,CACT,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjG,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,UAAU,IAAC,KAAK,EAAC,gCAA2B,EAAC,WAAW,EAAC,oDAAoD,GAAG,EAChH,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,KAAK,IAAC,OAAO,EAAC,aAAa,YAC1B,KAAC,gBAAgB,cAAE,KAAK,GAAoB,GACtC,CACT,CAAC,CAAC,CAAC,IAAI,EACR,MAAC,sBAAsB,IAAC,SAAS,EAAE,SAAS,aACzC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAClB,MAAC,IAAI,eACH,KAAC,UAAU,cACT,KAAC,SAAS,6BAAuB,GACtB,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,WAAW,aAChC,KAAC,KAAK,IAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,QAAC,QAAQ,QAAC,SAAS,EAAC,oBAAoB,GAAG,EAC5E,KAAC,KAAK,IACJ,WAAW,EAAC,MAAM,EAClB,KAAK,EAAE,IAAI,CAAC,IAAI,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EACrF,SAAS,EAAC,UAAU,GACpB,EACF,KAAC,eAAe,IACd,SAAS,EAAE,YAAY,IAAI,CAAC,EAAE,EAAE,EAChC,IAAI,EAAE,IAAI,CAAC,OAAO,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EACjF,cAAc,EAAC,YAAY,KACvB,CAAC,QAAQ;4CACX,CAAC,CAAC;gDACE,gBAAgB,EAAE,KAAK,EACrB,IAAoC,EACpC,UAAgB,EAChB,EAAE;oDACF,MAAM,yBAAyB,CAAC;wDAC9B,GAAG,IAAI;wDACP,IAAI,EAAE,UAAU;wDAChB,SAAS,EAAE,CAAC,OAAO,CAAC;wDACpB,cAAc,EAAE,OAAO;qDACxB,CAAC,CAAC;gDACL,CAAC;6CACF;4CACH,CAAC,CAAC,EAAE,CAAC,EACP,uBAAuB,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAC/D,uBAAuB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,GACrF,EACF,iBAAO,SAAS,EAAC,iCAAiC,aAChD,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,IAAI,CAAC,MAAM,EACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GACzF,cAEI,EACR,eAAK,SAAS,EAAC,YAAY,aACzB,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CACZ,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;oDAClB,MAAM,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE;wDAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;wDACf,OAAO,EAAE,IAAI,CAAC,OAAkC;wDAChD,MAAM,EAAE,IAAI,CAAC,MAAM;wDACnB,eAAe,EAAE,IAAI,CAAC,OAAO;qDAC9B,CAAC,CAAC;oDACH,OAAO,CAAC,IAAI,CAAC,CAAC;gDAChB,CAAC,CAAC,6BAIG,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,uBAEvD,IACL,IACM,IACT,CACR,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACnB,MAAC,IAAI,eACH,KAAC,UAAU,cACT,KAAC,SAAS,4BAAsB,GACrB,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,WAAW,aAChC,KAAC,KAAK,IAAC,WAAW,EAAC,0BAA0B,EAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAC,UAAU,GAAG,EAC5H,KAAC,KAAK,IAAC,WAAW,EAAC,MAAM,EAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAC,UAAU,GAAG,EACxG,KAAC,eAAe,IACd,SAAS,EAAE,gBAAgB,IAAI,IAAI,OAAO,EAAE,EAC5C,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,gBAAgB,EAC1B,cAAc,EAAC,YAAY,EAC3B,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;4CAC3C,MAAM,yBAAyB,CAAC;gDAC9B,GAAG,IAAI;gDACP,IAAI,EAAE,UAAU;gDAChB,SAAS,EAAE,CAAC,OAAO,CAAC;gDACpB,cAAc,EAAE,OAAO;6CACxB,CAAC,CAAC;wCACL,CAAC,EACD,uBAAuB,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAC/D,uBAAuB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,GACrF,EACF,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CACZ,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;4CAClB,MAAM,gBAAgB,CAAC,WAAW,CAAC;gDACjC,IAAI;gDACJ,IAAI;gDACJ,OAAO,EAAE,aAAwC;6CAClD,CAAC,CAAC;4CACH,OAAO,CAAC,EAAE,CAAC,CAAC;4CACZ,OAAO,CAAC,EAAE,CAAC,CAAC;4CACZ,gBAAgB,CAAC,SAAS,CAAC,CAAC;wCAC9B,CAAC,CAAC,6BAIG,IACG,IACT,CACR,CAAC,CAAC,CAAC,IAAI,IACe,EACzB,KAAC,IAAI,cACH,KAAC,WAAW,IAAC,SAAS,EAAC,KAAK,YAC1B,iBAAO,SAAS,EAAC,gBAAgB,aAC/B,gBAAO,SAAS,EAAC,0CAA0C,YACzD,yBACE,aAAI,SAAS,EAAC,iBAAiB,qBAAU,EACzC,aAAI,SAAS,EAAC,iBAAiB,qBAAU,EACzC,aAAI,SAAS,EAAC,iBAAiB,uBAAY,EAC3C,aAAI,SAAS,EAAC,iBAAiB,uBAAY,EAC1C,QAAQ,CAAC,CAAC,CAAC,aAAI,SAAS,EAAC,iBAAiB,wBAAa,CAAC,CAAC,CAAC,IAAI,IAC5D,GACC,EACR,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,cAAe,SAAS,EAAC,0CAA0C,aACjE,aAAI,SAAS,EAAC,uBAAuB,YAAE,CAAC,CAAC,IAAI,GAAM,EACnD,aAAI,SAAS,EAAC,KAAK,YAAE,CAAC,CAAC,IAAI,GAAM,EACjC,aAAI,SAAS,EAAC,KAAK,YAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAM,EACjD,aAAI,SAAS,EAAC,KAAK,YAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAM,EAClD,QAAQ,CAAC,CAAC,CAAC,CACV,aAAI,SAAS,EAAC,KAAK,YACjB,eAAK,SAAS,EAAC,YAAY,aACzB,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,qBAEvD,EACR,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACb,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,uBAE1F,CACV,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,2CAA2C,0BAAiB,CAC7E,IACG,GACH,CACN,CAAC,CAAC,CAAC,IAAI,KApBD,CAAC,CAAC,EAAE,CAqBR,CACN,CAAC,EACD,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,uBACE,aAAI,SAAS,EAAC,2BAA2B,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,+BAE9D,GACF,CACN,CAAC,CAAC,CAAC,IAAI,IACF,IACF,GACI,GACT,IACH,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,eAAe,UAAU,CAAC"}
@@ -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":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAShE,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC7I,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,SAAS,GAAS,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAE7D,SAAS,MAAM,CAAC,OAA4C;IAC1D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,OAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,EAAE,EAAE,GAAG,SAAS,EAAkB,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC;IAClC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAEnD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAsB,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAO,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAqB,KAAK,CAAC,CAAC;IACxE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjF,gBAAgB;aACb,gBAAgB,EAAE;aAClB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACrC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1B,gBAAgB;aACb,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;aACpD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACpC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACjB,gBAAgB;iBACb,WAAW,CAAC,EAAE,CAAC;iBACf,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,WAAW,CAAC,CAAC,CAAC,CAAC;gBACf,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChB,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACxB,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACtB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9B,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC5B,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAClC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAEhB,KAAK,UAAU,IAAI;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,OAAO,GAAG;gBACd,IAAI;gBACJ,QAAQ;gBACR,OAAO;gBACP,OAAO,EAAE,OAAkC;gBAC3C,UAAU;gBACV,YAAY;aACb,CAAC;YACF,IAAI,KAAK,GAAG,KAAK;gBACf,CAAC,CAAC,MAAM,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC;gBAChD,CAAC,CAAC,MAAM,gBAAgB,CAAC,cAAc,CAAC,EAAG,EAAE,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,QAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YACnG,IAAI,UAAU,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,EAAE,CAAC;gBACtD,KAAK,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACjF,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS,CAAC,QAAQ,CAAC,CAAC;YACpB,IAAI,KAAK;gBAAE,QAAQ,CAAC,yBAAyB,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,UAAU,SAAS;QACtB,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3D,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,UAAU,MAAM;QACnB,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1E,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS,CAAC,YAAY,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,OAAO,CACL,KAAC,KAAK,cACJ,KAAC,gBAAgB,qEAAsE,GACjF,CACT,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjG,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,UAAU,IACT,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,UAAU,EAClD,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,uBAAuB,EAAE,EACzD,OAAO,EACL,QAAQ,CAAC,CAAC,CAAC,CACT,8BACG,CAAC,KAAK,CAAC,CAAC,CAAC,CACR,KAAC,IAAI,IAAC,EAAE,EAAE,yBAAyB,EAAE,QAAQ,YAC3C,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,sBAAe,GACnC,CACR,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,EAAE,wBAEhD,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,qBAE3C,EACT,KAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,qBAAe,IAClD,CACJ,CAAC,CAAC,CAAC,IAAI,GAEV,EACD,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,KAAK,IAAC,OAAO,EAAC,aAAa,YAC1B,KAAC,gBAAgB,cAAE,KAAK,GAAoB,GACtC,CACT,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,KAAK,cACJ,KAAC,gBAAgB,cAAE,MAAM,GAAoB,GACvC,CACT,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,sBAAsB,IAAC,SAAS,EAAE,SAAS,YAC1C,MAAC,IAAI,eACH,KAAC,UAAU,cACT,KAAC,SAAS,0BAAoB,GACnB,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,WAAW,aAChC,KAAC,KAAK,IAAC,WAAW,EAAC,eAAe,EAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,GAAI,EACjH,KAAC,KAAK,IAAC,WAAW,EAAC,uBAAuB,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,GAAI,EACjI,KAAC,yBAAyB,IACxB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,CAAC,QAAQ,EACnB,WAAW,EAAC,mCAA8B,GAC1C,EACF,KAAC,eAAe,IACd,SAAS,EAAE,YAAY,EAAE,IAAI,KAAK,IAAI,QAAQ,EAAE,EAChD,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,UAAU,EACpB,cAAc,EAAC,YAAY,KACvB,CAAC,QAAQ;wCACX,CAAC,CAAC;4CACE,gBAAgB,EAAE,KAAK,EACrB,IAAoC,EACpC,UAAgB,EAChB,EAAE;gDACF,MAAM,yBAAyB,CAAC;oDAC9B,GAAG,IAAI;oDACP,IAAI,EAAE,UAAU;oDAChB,SAAS,EAAE,CAAC,QAAQ,IAAI,OAAO,CAAC;oDAChC,cAAc,EAAE,QAAQ,IAAI,IAAI;iDACjC,CAAC,CAAC;4CACL,CAAC;yCACF;wCACH,CAAC,CAAC,EAAE,CAAC,EACP,uBAAuB,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAC/D,uBAAuB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,uBAAuB,CAAC,UAAU,EAAE,QAAQ,IAAI,IAAI,CAAC,GAC9F,IACU,IACT,GACgB,EAEzB,MAAC,IAAI,eACH,KAAC,UAAU,cACT,KAAC,SAAS,2BAAqB,GACpB,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,WAAW,aAChC,kBACE,SAAS,EAAC,kCAAkC,EAC5C,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAA2B,CAAC,EACpE,QAAQ,EAAE,CAAC,QAAQ,aAEnB,iBAAQ,KAAK,EAAC,KAAK,gCAAyB,EAC5C,iBAAQ,KAAK,EAAC,KAAK,2BAAoB,EACvC,iBAAQ,KAAK,EAAC,UAAU,yBAAkB,EAC1C,iBAAQ,KAAK,EAAC,OAAO,6BAAsB,IACpC,EACR,CAAC,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CACrD,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAClB,aAAG,SAAS,EAAC,+BAA+B,sDACT,GAAG,EACpC,KAAC,IAAI,IAAC,EAAE,EAAC,kBAAkB,EAAC,SAAS,EAAC,WAAW,8BAE1C,EAAC,GAAG,mBAET,CACL,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,sBAAsB,aACnC,YAAG,SAAS,EAAC,sCAAsC,YAChD,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,0BAA0B,GAClE,EACH,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,iBAAkB,SAAS,EAAC,iCAAiC,aAC3D,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EACpC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,CAAC,CAAC,MAAM,CAAC,OAAO;oDACd,CAAC,CAAC,UAAU,KAAK,KAAK;wDACpB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wDACR,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;oDACnB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CACnC,EAEH,QAAQ,EAAE,CAAC,QAAQ,GACnB,EACD,CAAC,CAAC,IAAI,KAfG,CAAC,CAAC,EAAE,CAgBR,CACT,CAAC,IACE,CACP,CACF,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,CACxB,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACzB,YAAG,SAAS,EAAC,+BAA+B,oEAExC,CACL,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,WAAW,aACxB,YAAG,SAAS,EAAC,+BAA+B,uEAExC,EACJ,cAAK,SAAS,EAAC,iEAAiE,YAC7E,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACtB,iBAAkB,SAAS,EAAC,iCAAiC,aAC3D,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;wDACd,eAAe,CAAC,IAAI,CAAC,CAAC;wDACtB,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CACpE,CAAC;oDACJ,CAAC,EACD,QAAQ,EAAE,CAAC,QAAQ,GACnB,EACD,CAAC,CAAC,KAAK,KAZE,CAAC,CAAC,EAAE,CAaR,CACT,CAAC,GACE,EACN,aAAG,SAAS,EAAC,+BAA+B,aACzC,mBAAmB,CAAC,MAAM,0DACzB,IACA,CACP,CACF,CAAC,CAAC,CAAC,IAAI,IACI,IACT,EAEN,OAAO,CAAC,CAAC,CAAC,CACT,MAAC,IAAI,eACH,KAAC,UAAU,cACT,KAAC,SAAS,0BAAoB,GACnB,EACb,KAAC,WAAW,cACV,iBAAQ,KAAK,EAAC,SAAS,EAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAC,4BAA4B,GAAG,GACtE,IACT,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,eAAe,cAAc,CAAC"}
@@ -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"}