@endora-commerce/mod-cms 0.0.0-stage → 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 (264) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -2
  3. package/dist/admin/api/cms-client.d.ts +77 -0
  4. package/dist/admin/api/cms-client.d.ts.map +1 -0
  5. package/dist/admin/api/cms-client.js +162 -0
  6. package/dist/admin/api/cms-client.js.map +1 -0
  7. package/dist/admin/components/AdminCatalogPreviewProvider.d.ts +6 -0
  8. package/dist/admin/components/AdminCatalogPreviewProvider.d.ts.map +1 -0
  9. package/dist/admin/components/AdminCatalogPreviewProvider.js +74 -0
  10. package/dist/admin/components/AdminCatalogPreviewProvider.js.map +1 -0
  11. package/dist/admin/components/AdminCmsAssetProvider.d.ts +9 -0
  12. package/dist/admin/components/AdminCmsAssetProvider.d.ts.map +1 -0
  13. package/dist/admin/components/AdminCmsAssetProvider.js +50 -0
  14. package/dist/admin/components/AdminCmsAssetProvider.js.map +1 -0
  15. package/dist/admin/components/BackgroundFields.d.ts +4 -0
  16. package/dist/admin/components/BackgroundFields.d.ts.map +1 -0
  17. package/dist/admin/components/BackgroundFields.js +40 -0
  18. package/dist/admin/components/BackgroundFields.js.map +1 -0
  19. package/dist/admin/components/ButtonLinkFields.d.ts +6 -0
  20. package/dist/admin/components/ButtonLinkFields.d.ts.map +1 -0
  21. package/dist/admin/components/ButtonLinkFields.js +127 -0
  22. package/dist/admin/components/ButtonLinkFields.js.map +1 -0
  23. package/dist/admin/components/CarouselPreviewNav.d.ts +12 -0
  24. package/dist/admin/components/CarouselPreviewNav.d.ts.map +1 -0
  25. package/dist/admin/components/CarouselPreviewNav.js +31 -0
  26. package/dist/admin/components/CarouselPreviewNav.js.map +1 -0
  27. package/dist/admin/components/CmsContentEditorLayout.d.ts +12 -0
  28. package/dist/admin/components/CmsContentEditorLayout.d.ts.map +1 -0
  29. package/dist/admin/components/CmsContentEditorLayout.js +9 -0
  30. package/dist/admin/components/CmsContentEditorLayout.js.map +1 -0
  31. package/dist/admin/components/ComponentDragHandle.d.ts +6 -0
  32. package/dist/admin/components/ComponentDragHandle.d.ts.map +1 -0
  33. package/dist/admin/components/ComponentDragHandle.js +119 -0
  34. package/dist/admin/components/ComponentDragHandle.js.map +1 -0
  35. package/dist/admin/components/ContentSliderActionBarExtras.d.ts +6 -0
  36. package/dist/admin/components/ContentSliderActionBarExtras.d.ts.map +1 -0
  37. package/dist/admin/components/ContentSliderActionBarExtras.js +109 -0
  38. package/dist/admin/components/ContentSliderActionBarExtras.js.map +1 -0
  39. package/dist/admin/components/HookBlockAttachmentsPanel.d.ts +9 -0
  40. package/dist/admin/components/HookBlockAttachmentsPanel.d.ts.map +1 -0
  41. package/dist/admin/components/HookBlockAttachmentsPanel.js +137 -0
  42. package/dist/admin/components/HookBlockAttachmentsPanel.js.map +1 -0
  43. package/dist/admin/components/PageBuilderActionBar.d.ts +10 -0
  44. package/dist/admin/components/PageBuilderActionBar.d.ts.map +1 -0
  45. package/dist/admin/components/PageBuilderActionBar.js +118 -0
  46. package/dist/admin/components/PageBuilderActionBar.js.map +1 -0
  47. package/dist/admin/components/PageBuilderDrawer.d.ts +16 -0
  48. package/dist/admin/components/PageBuilderDrawer.d.ts.map +1 -0
  49. package/dist/admin/components/PageBuilderDrawer.js +53 -0
  50. package/dist/admin/components/PageBuilderDrawer.js.map +1 -0
  51. package/dist/admin/components/PageBuilderEditor.d.ts +45 -0
  52. package/dist/admin/components/PageBuilderEditor.d.ts.map +1 -0
  53. package/dist/admin/components/PageBuilderEditor.js +632 -0
  54. package/dist/admin/components/PageBuilderEditor.js.map +1 -0
  55. package/dist/admin/components/PuckActionGuard.d.ts +12 -0
  56. package/dist/admin/components/PuckActionGuard.d.ts.map +1 -0
  57. package/dist/admin/components/PuckActionGuard.js +30 -0
  58. package/dist/admin/components/PuckActionGuard.js.map +1 -0
  59. package/dist/admin/components/RowLayoutPicker.d.ts +8 -0
  60. package/dist/admin/components/RowLayoutPicker.d.ts.map +1 -0
  61. package/dist/admin/components/RowLayoutPicker.js +17 -0
  62. package/dist/admin/components/RowLayoutPicker.js.map +1 -0
  63. package/dist/admin/components/SliderPreviewActionBarExtras.d.ts +6 -0
  64. package/dist/admin/components/SliderPreviewActionBarExtras.d.ts.map +1 -0
  65. package/dist/admin/components/SliderPreviewActionBarExtras.js +32 -0
  66. package/dist/admin/components/SliderPreviewActionBarExtras.js.map +1 -0
  67. package/dist/admin/components/admin-catalog-preview-map.d.ts +17 -0
  68. package/dist/admin/components/admin-catalog-preview-map.d.ts.map +1 -0
  69. package/dist/admin/components/admin-catalog-preview-map.js +18 -0
  70. package/dist/admin/components/admin-catalog-preview-map.js.map +1 -0
  71. package/dist/admin/components/build-viewports.d.ts +23 -0
  72. package/dist/admin/components/build-viewports.d.ts.map +1 -0
  73. package/dist/admin/components/build-viewports.js +23 -0
  74. package/dist/admin/components/build-viewports.js.map +1 -0
  75. package/dist/admin/components/cms-template-layout.d.ts +16 -0
  76. package/dist/admin/components/cms-template-layout.d.ts.map +1 -0
  77. package/dist/admin/components/cms-template-layout.js +53 -0
  78. package/dist/admin/components/cms-template-layout.js.map +1 -0
  79. package/dist/admin/components/page-builder-i18n.d.ts +27 -0
  80. package/dist/admin/components/page-builder-i18n.d.ts.map +1 -0
  81. package/dist/admin/components/page-builder-i18n.js +34 -0
  82. package/dist/admin/components/page-builder-i18n.js.map +1 -0
  83. package/dist/admin/components/puck-safe.d.ts +10 -0
  84. package/dist/admin/components/puck-safe.d.ts.map +1 -0
  85. package/dist/admin/components/puck-safe.js +22 -0
  86. package/dist/admin/components/puck-safe.js.map +1 -0
  87. package/dist/admin/components/scope-utils.d.ts +4 -0
  88. package/dist/admin/components/scope-utils.d.ts.map +1 -0
  89. package/dist/admin/components/scope-utils.js +7 -0
  90. package/dist/admin/components/scope-utils.js.map +1 -0
  91. package/dist/admin/editors/BlockEditor.d.ts +9 -0
  92. package/dist/admin/editors/BlockEditor.d.ts.map +1 -0
  93. package/dist/admin/editors/BlockEditor.js +217 -0
  94. package/dist/admin/editors/BlockEditor.js.map +1 -0
  95. package/dist/admin/editors/PageEditor.d.ts +9 -0
  96. package/dist/admin/editors/PageEditor.d.ts.map +1 -0
  97. package/dist/admin/editors/PageEditor.js +316 -0
  98. package/dist/admin/editors/PageEditor.js.map +1 -0
  99. package/dist/admin/editors/TemplateEditor.d.ts +9 -0
  100. package/dist/admin/editors/TemplateEditor.d.ts.map +1 -0
  101. package/dist/admin/editors/TemplateEditor.js +180 -0
  102. package/dist/admin/editors/TemplateEditor.js.map +1 -0
  103. package/dist/admin/index.d.ts +38 -0
  104. package/dist/admin/index.d.ts.map +1 -0
  105. package/dist/admin/index.js +144 -0
  106. package/dist/admin/index.js.map +1 -0
  107. package/dist/admin/pages/BlocksListPage.d.ts +9 -0
  108. package/dist/admin/pages/BlocksListPage.d.ts.map +1 -0
  109. package/dist/admin/pages/BlocksListPage.js +47 -0
  110. package/dist/admin/pages/BlocksListPage.js.map +1 -0
  111. package/dist/admin/pages/HooksPage.d.ts +9 -0
  112. package/dist/admin/pages/HooksPage.d.ts.map +1 -0
  113. package/dist/admin/pages/HooksPage.js +41 -0
  114. package/dist/admin/pages/HooksPage.js.map +1 -0
  115. package/dist/admin/pages/PagesListPage.d.ts +9 -0
  116. package/dist/admin/pages/PagesListPage.d.ts.map +1 -0
  117. package/dist/admin/pages/PagesListPage.js +51 -0
  118. package/dist/admin/pages/PagesListPage.js.map +1 -0
  119. package/dist/admin/pages/TemplatesListPage.d.ts +9 -0
  120. package/dist/admin/pages/TemplatesListPage.d.ts.map +1 -0
  121. package/dist/admin/pages/TemplatesListPage.js +47 -0
  122. package/dist/admin/pages/TemplatesListPage.js.map +1 -0
  123. package/dist/admin-ui/index.d.ts +90 -0
  124. package/dist/admin-ui/index.d.ts.map +1 -0
  125. package/dist/admin-ui/index.js +89 -0
  126. package/dist/admin-ui/index.js.map +1 -0
  127. package/dist/backend/cli/block-names.d.ts +92 -0
  128. package/dist/backend/cli/block-names.d.ts.map +1 -0
  129. package/dist/backend/cli/block-names.js +132 -0
  130. package/dist/backend/cli/block-names.js.map +1 -0
  131. package/dist/backend/entities/cms-block.entity.d.ts +20 -0
  132. package/dist/backend/entities/cms-block.entity.d.ts.map +1 -0
  133. package/dist/backend/entities/cms-block.entity.js +77 -0
  134. package/dist/backend/entities/cms-block.entity.js.map +1 -0
  135. package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts +15 -0
  136. package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts.map +1 -0
  137. package/dist/backend/entities/cms-hook-block-attachment.entity.js +46 -0
  138. package/dist/backend/entities/cms-hook-block-attachment.entity.js.map +1 -0
  139. package/dist/backend/entities/cms-hook.entity.d.ts +20 -0
  140. package/dist/backend/entities/cms-hook.entity.d.ts.map +1 -0
  141. package/dist/backend/entities/cms-hook.entity.js +73 -0
  142. package/dist/backend/entities/cms-hook.entity.js.map +1 -0
  143. package/dist/backend/entities/cms-page.entity.d.ts +43 -0
  144. package/dist/backend/entities/cms-page.entity.d.ts.map +1 -0
  145. package/dist/backend/entities/cms-page.entity.js +140 -0
  146. package/dist/backend/entities/cms-page.entity.js.map +1 -0
  147. package/dist/backend/entities/cms-template.entity.d.ts +20 -0
  148. package/dist/backend/entities/cms-template.entity.d.ts.map +1 -0
  149. package/dist/backend/entities/cms-template.entity.js +73 -0
  150. package/dist/backend/entities/cms-template.entity.js.map +1 -0
  151. package/dist/backend/index.d.ts +157 -0
  152. package/dist/backend/index.d.ts.map +1 -0
  153. package/dist/backend/index.js +317 -0
  154. package/dist/backend/index.js.map +1 -0
  155. package/dist/backend/plugin.d.ts +81 -0
  156. package/dist/backend/plugin.d.ts.map +1 -0
  157. package/dist/backend/plugin.js +81 -0
  158. package/dist/backend/plugin.js.map +1 -0
  159. package/dist/backend/routes.admin.d.ts +19 -0
  160. package/dist/backend/routes.admin.d.ts.map +1 -0
  161. package/dist/backend/routes.admin.js +164 -0
  162. package/dist/backend/routes.admin.js.map +1 -0
  163. package/dist/backend/routes.storefront.d.ts +6 -0
  164. package/dist/backend/routes.storefront.d.ts.map +1 -0
  165. package/dist/backend/routes.storefront.js +89 -0
  166. package/dist/backend/routes.storefront.js.map +1 -0
  167. package/dist/backend/services/asset-embed-resolver.d.ts +17 -0
  168. package/dist/backend/services/asset-embed-resolver.d.ts.map +1 -0
  169. package/dist/backend/services/asset-embed-resolver.js +40 -0
  170. package/dist/backend/services/asset-embed-resolver.js.map +1 -0
  171. package/dist/backend/services/asset-references.d.ts +4 -0
  172. package/dist/backend/services/asset-references.d.ts.map +1 -0
  173. package/dist/backend/services/asset-references.js +55 -0
  174. package/dist/backend/services/asset-references.js.map +1 -0
  175. package/dist/backend/services/cms-block-read-port.d.ts +27 -0
  176. package/dist/backend/services/cms-block-read-port.d.ts.map +1 -0
  177. package/dist/backend/services/cms-block-read-port.js +50 -0
  178. package/dist/backend/services/cms-block-read-port.js.map +1 -0
  179. package/dist/backend/services/cms-block-seed-port.d.ts +31 -0
  180. package/dist/backend/services/cms-block-seed-port.d.ts.map +1 -0
  181. package/dist/backend/services/cms-block-seed-port.js +68 -0
  182. package/dist/backend/services/cms-block-seed-port.js.map +1 -0
  183. package/dist/backend/services/cms-block-service.d.ts +38 -0
  184. package/dist/backend/services/cms-block-service.d.ts.map +1 -0
  185. package/dist/backend/services/cms-block-service.js +218 -0
  186. package/dist/backend/services/cms-block-service.js.map +1 -0
  187. package/dist/backend/services/cms-cache.d.ts +54 -0
  188. package/dist/backend/services/cms-cache.d.ts.map +1 -0
  189. package/dist/backend/services/cms-cache.js +113 -0
  190. package/dist/backend/services/cms-cache.js.map +1 -0
  191. package/dist/backend/services/cms-hook-service.d.ts +35 -0
  192. package/dist/backend/services/cms-hook-service.d.ts.map +1 -0
  193. package/dist/backend/services/cms-hook-service.js +216 -0
  194. package/dist/backend/services/cms-hook-service.js.map +1 -0
  195. package/dist/backend/services/cms-language-reference.d.ts +11 -0
  196. package/dist/backend/services/cms-language-reference.d.ts.map +1 -0
  197. package/dist/backend/services/cms-language-reference.js +26 -0
  198. package/dist/backend/services/cms-language-reference.js.map +1 -0
  199. package/dist/backend/services/cms-page-read-port.d.ts +23 -0
  200. package/dist/backend/services/cms-page-read-port.d.ts.map +1 -0
  201. package/dist/backend/services/cms-page-read-port.js +54 -0
  202. package/dist/backend/services/cms-page-read-port.js.map +1 -0
  203. package/dist/backend/services/cms-page-service.d.ts +104 -0
  204. package/dist/backend/services/cms-page-service.d.ts.map +1 -0
  205. package/dist/backend/services/cms-page-service.js +468 -0
  206. package/dist/backend/services/cms-page-service.js.map +1 -0
  207. package/dist/backend/services/cms-reference-registry.d.ts +30 -0
  208. package/dist/backend/services/cms-reference-registry.d.ts.map +1 -0
  209. package/dist/backend/services/cms-reference-registry.js +98 -0
  210. package/dist/backend/services/cms-reference-registry.js.map +1 -0
  211. package/dist/backend/services/cms-template-service.d.ts +37 -0
  212. package/dist/backend/services/cms-template-service.d.ts.map +1 -0
  213. package/dist/backend/services/cms-template-service.js +205 -0
  214. package/dist/backend/services/cms-template-service.js.map +1 -0
  215. package/dist/backend/services/content-tree-walker.d.ts +7 -0
  216. package/dist/backend/services/content-tree-walker.d.ts.map +1 -0
  217. package/dist/backend/services/content-tree-walker.js +89 -0
  218. package/dist/backend/services/content-tree-walker.js.map +1 -0
  219. package/dist/backend/services/page-builder-registry.d.ts +120 -0
  220. package/dist/backend/services/page-builder-registry.d.ts.map +1 -0
  221. package/dist/backend/services/page-builder-registry.js +220 -0
  222. package/dist/backend/services/page-builder-registry.js.map +1 -0
  223. package/dist/backend/services/seed-hooks.d.ts +22 -0
  224. package/dist/backend/services/seed-hooks.d.ts.map +1 -0
  225. package/dist/backend/services/seed-hooks.js +94 -0
  226. package/dist/backend/services/seed-hooks.js.map +1 -0
  227. package/dist/backend/services/storefront-resolver.d.ts +71 -0
  228. package/dist/backend/services/storefront-resolver.d.ts.map +1 -0
  229. package/dist/backend/services/storefront-resolver.js +329 -0
  230. package/dist/backend/services/storefront-resolver.js.map +1 -0
  231. package/dist/manifest.d.ts +225 -0
  232. package/dist/manifest.d.ts.map +1 -0
  233. package/dist/manifest.js +695 -0
  234. package/dist/manifest.js.map +1 -0
  235. package/dist/migrations/20260425T162418_cms_pages_init.d.ts +10 -0
  236. package/dist/migrations/20260425T162418_cms_pages_init.d.ts.map +1 -0
  237. package/dist/migrations/20260425T162418_cms_pages_init.js +30 -0
  238. package/dist/migrations/20260425T162418_cms_pages_init.js.map +1 -0
  239. package/dist/migrations/20260505T130214_cms_init.d.ts +28 -0
  240. package/dist/migrations/20260505T130214_cms_init.d.ts.map +1 -0
  241. package/dist/migrations/20260505T130214_cms_init.js +332 -0
  242. package/dist/migrations/20260505T130214_cms_init.js.map +1 -0
  243. package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts +6 -0
  244. package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts.map +1 -0
  245. package/dist/migrations/20260903T101741_cms_namespace_block_names.js +60 -0
  246. package/dist/migrations/20260903T101741_cms_namespace_block_names.js.map +1 -0
  247. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts +27 -0
  248. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts.map +1 -0
  249. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js +44 -0
  250. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js.map +1 -0
  251. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts +32 -0
  252. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts.map +1 -0
  253. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js +36 -0
  254. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js.map +1 -0
  255. package/dist/migrations/index.d.ts +31 -0
  256. package/dist/migrations/index.d.ts.map +1 -0
  257. package/dist/migrations/index.js +37 -0
  258. package/dist/migrations/index.js.map +1 -0
  259. package/docs/cms/extending-page-builder.md +256 -0
  260. package/docs/cms/index.md +233 -0
  261. package/i18n/en.json +231 -0
  262. package/i18n/pl.json +231 -0
  263. package/package.json +125 -3
  264. package/tailwind.css +16 -0
@@ -0,0 +1,217 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { Link, useNavigate, useParams } from 'react-router-dom';
4
+ import { slugify } from '@endora-commerce/contracts';
5
+ import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Input, Label, PageHeader, SaveButtonGroup, Textarea } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ import { ContentLanguageTabs, ScopePicker } from '@endora-commerce/admin-kit/components';
8
+ import { CmsContentEditorLayout } from '../components/CmsContentEditorLayout.js';
9
+ import { PageBuilderEditor } from '../components/PageBuilderEditor.js';
10
+ import { emptyPageBuilderData } from '@endora-commerce/page-builder-admin';
11
+ import { listCmsTemplatesForApply, loadCmsTemplateCanvas, saveCanvasAsCmsTemplate, } from '../components/cms-template-layout.js';
12
+ import { resolveScopedContentLanguage } from '../components/scope-utils.js';
13
+ import { cmsClient } from '../api/cms-client.js';
14
+ const blankForm = { name: '', code: '', active: true, description: '' };
15
+ /**
16
+ * Derive a CMS block code from a free-text name (so `Łatwy blok` gives
17
+ * `latwy-blok`). The result is a subset of the `cmsCodeRe` charset
18
+ * (`[a-z0-9._-]`), so it always validates.
19
+ *
20
+ * `slugify` from `@endora-commerce/contracts`, **imported, never re-implemented** (issue
21
+ * #245). This site's four-line chain was already correct — it and `PageEditor`
22
+ * were the only two of eight that cut to length *before* stripping the trailing
23
+ * separator — so nothing about its output moves; it is here because eight
24
+ * copies of a correct chain are still eight places for the ninth to be wrong.
25
+ * The 180-character cap is passed explicitly, as every caller's is.
26
+ */
27
+ function codeFromName(input) {
28
+ return slugify(input, { maxLength: 180 });
29
+ }
30
+ function dataFor(block, language) {
31
+ if (!block || !language)
32
+ return null;
33
+ const data = block.content.languages[language];
34
+ if (data && typeof data === 'object')
35
+ return data;
36
+ return { root: { props: {} }, content: [] };
37
+ }
38
+ export function BlockEditor() {
39
+ const t = useTranslation('cms');
40
+ const { id } = useParams();
41
+ const isNew = !id || id === 'new';
42
+ const navigate = useNavigate();
43
+ const [block, setBlock] = useState(null);
44
+ const [form, setForm] = useState(blankForm);
45
+ // For a new block the code auto-derives from the name until the editor types
46
+ // into the code field, at which point it stops auto-syncing.
47
+ const [codeEdited, setCodeEdited] = useState(false);
48
+ const [scope, setScope] = useState({ salesChannelIds: [], languages: [] });
49
+ const [activeLanguage, setActiveLanguage] = useState(null);
50
+ const [draftData, setDraftData] = useState(null);
51
+ const [languageContentOverrides, setLanguageContentOverrides] = useState({});
52
+ const [error, setError] = useState(null);
53
+ const [saving, setSaving] = useState(false);
54
+ const load = useCallback(async () => {
55
+ if (isNew || !id)
56
+ return;
57
+ const loaded = await cmsClient.getBlock(id);
58
+ setBlock(loaded);
59
+ setForm({
60
+ name: loaded.name,
61
+ code: loaded.code,
62
+ active: loaded.active,
63
+ description: loaded.description ?? '',
64
+ });
65
+ setScope({ salesChannelIds: loaded.salesChannelIds, languages: loaded.languages });
66
+ setActiveLanguage(loaded.languages[0] ?? null);
67
+ }, [id, isNew]);
68
+ useEffect(() => {
69
+ void load().catch((err) => setError(err instanceof Error ? err.message : String(err)));
70
+ }, [load]);
71
+ useEffect(() => {
72
+ if (!isNew)
73
+ return;
74
+ setBlock(null);
75
+ setForm(blankForm);
76
+ setScope({ salesChannelIds: [], languages: [] });
77
+ setActiveLanguage(null);
78
+ setDraftData(null);
79
+ setLanguageContentOverrides({});
80
+ setCodeEdited(false);
81
+ setError(null);
82
+ }, [isNew, id]);
83
+ // React Router reuses this component instance across `/cms/blocks/:id`
84
+ // navigations, so local state survives an id change. Drop any unsaved draft
85
+ // when the edited block changes, otherwise the previous block's edits would
86
+ // mask the newly-loaded content.
87
+ useEffect(() => {
88
+ setDraftData(null);
89
+ setLanguageContentOverrides({});
90
+ }, [id]);
91
+ useEffect(() => {
92
+ if (!activeLanguage && scope.languages.length > 0)
93
+ setActiveLanguage(scope.languages[0] ?? null);
94
+ if (activeLanguage && !scope.languages.includes(activeLanguage)) {
95
+ setActiveLanguage(scope.languages[0] ?? null);
96
+ }
97
+ }, [activeLanguage, scope.languages]);
98
+ const currentData = useMemo(() => {
99
+ if (draftData)
100
+ return draftData;
101
+ if (activeLanguage && languageContentOverrides[activeLanguage]) {
102
+ return languageContentOverrides[activeLanguage] ?? null;
103
+ }
104
+ return dataFor(block, activeLanguage);
105
+ }, [activeLanguage, block, draftData, languageContentOverrides]);
106
+ const save = async () => {
107
+ if (scope.salesChannelIds.length === 0) {
108
+ setError(t('blockEditor.errors.selectChannel'));
109
+ return false;
110
+ }
111
+ if (scope.languages.length === 0) {
112
+ setError(t('blockEditor.errors.selectLanguage'));
113
+ return false;
114
+ }
115
+ const contentLanguage = resolveScopedContentLanguage(scope, activeLanguage);
116
+ if (!contentLanguage) {
117
+ setError(t('blockEditor.errors.selectLanguage'));
118
+ return false;
119
+ }
120
+ setSaving(true);
121
+ setError(null);
122
+ try {
123
+ let saved = isNew
124
+ ? await cmsClient.createBlock({
125
+ name: form.name,
126
+ code: form.code,
127
+ active: form.active,
128
+ description: form.description || null,
129
+ salesChannelIds: scope.salesChannelIds,
130
+ languages: scope.languages,
131
+ })
132
+ : await cmsClient.patchBlock(block.id, {
133
+ name: form.name,
134
+ code: form.code,
135
+ active: form.active,
136
+ description: form.description || null,
137
+ salesChannelIds: scope.salesChannelIds,
138
+ languages: scope.languages,
139
+ version: block.version,
140
+ });
141
+ if (currentData) {
142
+ saved = await cmsClient.putBlockContent(saved.id, contentLanguage, {
143
+ data: currentData,
144
+ version: saved.version,
145
+ });
146
+ }
147
+ for (const [lang, data] of Object.entries(languageContentOverrides)) {
148
+ if (lang === contentLanguage)
149
+ continue;
150
+ saved = await cmsClient.putBlockContent(saved.id, lang, {
151
+ data,
152
+ version: saved.version,
153
+ });
154
+ }
155
+ setBlock(saved);
156
+ setDraftData(null);
157
+ setLanguageContentOverrides({});
158
+ if (isNew)
159
+ navigate(`/cms/blocks/${saved.id}`, { replace: true });
160
+ return true;
161
+ }
162
+ catch (err) {
163
+ setError(err instanceof Error ? err.message : String(err));
164
+ return false;
165
+ }
166
+ finally {
167
+ setSaving(false);
168
+ }
169
+ };
170
+ const saveAndExit = async () => {
171
+ if (await save())
172
+ navigate('/cms/blocks');
173
+ };
174
+ return (_jsx(CmsContentEditorLayout, { header: _jsxs(_Fragment, { children: [_jsx(PageHeader, { title: isNew ? t('blockEditor.title.new') : form.name || t('blockEditor.title.edit'), description: t('blockEditor.description'), actions: _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { asChild: true, variant: "outline", children: _jsx(Link, { to: "/cms/blocks", children: t('common.back') }) }), _jsx(SaveButtonGroup, { onSave: () => void save(), onSaveAndExit: () => void saveAndExit(), saving: saving, saveLabel: t('common.save'), savingLabel: t('common.saving'), saveAndExitLabel: t('common.saveAndExit') })] }) }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null] }), settings: _jsxs(_Fragment, { children: [_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: t('blockEditor.metadata') }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.name') }), _jsx(Input, { value: form.name, onChange: (event) => {
175
+ const name = event.target.value;
176
+ setForm((f) => ({
177
+ ...f,
178
+ name,
179
+ ...(isNew && !codeEdited ? { code: codeFromName(name) } : {}),
180
+ }));
181
+ } })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.code') }), _jsx(Input, { value: form.code, className: "font-mono", onChange: (event) => {
182
+ setCodeEdited(true);
183
+ setForm((f) => ({ ...f, code: event.target.value.toLowerCase() }));
184
+ } })] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.active, onChange: (event) => setForm({ ...form, active: event.target.checked }) }), t('fields.active')] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.description') }), _jsx(Textarea, { value: form.description, onChange: (event) => setForm({ ...form, description: event.target.value }) })] })] })] }), _jsx(ScopePicker, { value: scope, onChange: setScope })] }), languageTabs: _jsx(ContentLanguageTabs, { languages: scope.languages, activeLanguage: activeLanguage, onChange: (language) => {
185
+ if (activeLanguage && draftData) {
186
+ setLanguageContentOverrides((prev) => ({
187
+ ...prev,
188
+ [activeLanguage]: draftData,
189
+ }));
190
+ }
191
+ setDraftData(null);
192
+ setActiveLanguage(language);
193
+ } }), builder: _jsx(PageBuilderEditor, { data: currentData, onChange: setDraftData, contentKey: `${id ?? 'new'}:${activeLanguage ?? ''}`, languages: scope.languages, activeLanguage: activeLanguage, onResolveLanguageContent: (language) => {
194
+ if (language === activeLanguage && draftData) {
195
+ return structuredClone(draftData);
196
+ }
197
+ if (languageContentOverrides[language]) {
198
+ return structuredClone(languageContentOverrides[language]);
199
+ }
200
+ return structuredClone(dataFor(block, language) ?? emptyPageBuilderData());
201
+ }, onSaveAsTemplate: async (meta, canvasData) => {
202
+ await saveCanvasAsCmsTemplate({
203
+ ...meta,
204
+ data: canvasData,
205
+ salesChannelIds: scope.salesChannelIds,
206
+ languages: scope.languages,
207
+ activeLanguage,
208
+ });
209
+ }, onListTemplatesForApply: listCmsTemplatesForApply, onResolveTemplateLayout: (templateId) => loadCmsTemplateCanvas(templateId, activeLanguage) }) }));
210
+ }
211
+ /**
212
+ * The registry loads a route component through a dynamic-import factory and
213
+ * reads its default export (feature 091, FR-013). The named export stays: it is
214
+ * the spelling this module's own code and its tests use.
215
+ */
216
+ export default BlockEditor;
217
+ //# sourceMappingURL=BlockEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockEditor.js","sourceRoot":"","sources":["../../../src/admin/editors/BlockEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function PageEditor(): ReactNode;
3
+ /**
4
+ * The registry loads a route component through a dynamic-import factory and
5
+ * reads its default export (feature 091, FR-013). The named export stays: it is
6
+ * the spelling this module's own code and its tests use.
7
+ */
8
+ export default PageEditor;
9
+ //# sourceMappingURL=PageEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageEditor.d.ts","sourceRoot":"","sources":["../../../src/admin/editors/PageEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA4DlF,wBAAgB,UAAU,IAAI,SAAS,CA8atC;AAED;;;;GAIG;AACH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,316 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { Link, useNavigate, useParams } from 'react-router-dom';
4
+ import { firstSlugSegment, slugify as slugifyText } from '@endora-commerce/contracts';
5
+ import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Input, Label, PageHeader, SaveButtonGroup, Select, Textarea } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ import { ContentLanguageTabs, ScopePicker } from '@endora-commerce/admin-kit/components';
8
+ import { CmsContentEditorLayout } from '../components/CmsContentEditorLayout.js';
9
+ import { PageBuilderEditor } from '../components/PageBuilderEditor.js';
10
+ import { emptyPageBuilderData } from '@endora-commerce/page-builder-admin';
11
+ import { listCmsTemplatesForApply, loadCmsTemplateCanvas, saveCanvasAsCmsTemplate, } from '../components/cms-template-layout.js';
12
+ import { resolveScopedContentLanguage } from '../components/scope-utils.js';
13
+ import { cmsClient } from '../api/cms-client.js';
14
+ const blankForm = {
15
+ name: '',
16
+ slug: '',
17
+ active: true,
18
+ description: '',
19
+ metaTitle: '',
20
+ metaDescription: '',
21
+ metaKeywords: '',
22
+ };
23
+ /**
24
+ * Build a URL slug from a free-text page name (so Polish `Łatwy poradnik` gives
25
+ * `latwy-poradnik`), within the 180-character limit the CMS slug validation
26
+ * regex enforces.
27
+ *
28
+ * `slugify` from `@endora-commerce/contracts`, **imported, never re-implemented** (issue
29
+ * #245) — aliased because this wrapper keeps the local name the JSX reads. This
30
+ * site's chain was already correct: it and `BlockEditor` were the only two of
31
+ * eight that cut to length *before* stripping the trailing separator, so
32
+ * nothing about its output moves.
33
+ */
34
+ function slugify(input) {
35
+ return slugifyText(input, { maxLength: 180 });
36
+ }
37
+ function dataFor(page, language) {
38
+ if (!page || !language)
39
+ return null;
40
+ const data = page.content.languages[language];
41
+ if (data && typeof data === 'object')
42
+ return data;
43
+ return { root: { props: {} }, content: [] };
44
+ }
45
+ export function PageEditor() {
46
+ const t = useTranslation('cms');
47
+ const { id } = useParams();
48
+ const isNew = !id || id === 'new';
49
+ const navigate = useNavigate();
50
+ const [page, setPage] = useState(null);
51
+ const [form, setForm] = useState(blankForm);
52
+ const [scope, setScope] = useState({ salesChannelIds: [], languages: [] });
53
+ const [activeLanguage, setActiveLanguage] = useState(null);
54
+ const [draftData, setDraftData] = useState(null);
55
+ const [languageContentOverrides, setLanguageContentOverrides] = useState({});
56
+ const [error, setError] = useState(null);
57
+ const [saving, setSaving] = useState(false);
58
+ // For a new page the slug is auto-derived from the name until the operator
59
+ // edits the slug field themselves, after which it is left untouched.
60
+ const [slugEdited, setSlugEdited] = useState(false);
61
+ /**
62
+ * The deployment's reserved first path segments (feature 105, FR-033).
63
+ *
64
+ * Read once when the editor loads, from the **same** value the backend's
65
+ * save-time refusal enforces — one source, two readers. Two lists would be
66
+ * two answers waiting to disagree, and a warning that disagrees with a
67
+ * refusal is worse than no warning.
68
+ */
69
+ const [reservedSegments, setReservedSegments] = useState([]);
70
+ const load = useCallback(async () => {
71
+ if (isNew || !id)
72
+ return;
73
+ setError(null);
74
+ const loaded = await cmsClient.getPage(id);
75
+ setPage(loaded);
76
+ setForm({
77
+ name: loaded.name,
78
+ slug: loaded.slug,
79
+ active: loaded.active,
80
+ description: loaded.description ?? '',
81
+ metaTitle: loaded.meta?.['en-US']?.title ?? '',
82
+ metaDescription: loaded.meta?.['en-US']?.description ?? '',
83
+ metaKeywords: loaded.meta?.['en-US']?.keywords ?? '',
84
+ });
85
+ setScope({ salesChannelIds: loaded.salesChannelIds, languages: loaded.languages });
86
+ setActiveLanguage(loaded.languages[0] ?? null);
87
+ }, [id, isNew]);
88
+ useEffect(() => {
89
+ void load().catch((err) => setError(err instanceof Error ? err.message : String(err)));
90
+ }, [load]);
91
+ useEffect(() => {
92
+ let cancelled = false;
93
+ cmsClient
94
+ .getReservedSlugSegments()
95
+ .then((segments) => {
96
+ if (!cancelled)
97
+ setReservedSegments(segments);
98
+ })
99
+ .catch(() => {
100
+ // Deliberately silent, and this is the one place in this editor where
101
+ // that is right: the warning is an *advance* notice of a refusal the
102
+ // backend performs anyway (FR-031). A deployment that reserves nothing
103
+ // is the ordinary case, so a failed read must not put an error banner
104
+ // over an editor whose page is fine — and it cannot let a bad save
105
+ // through, because the refusal does not read this value.
106
+ if (!cancelled)
107
+ setReservedSegments([]);
108
+ });
109
+ return () => {
110
+ cancelled = true;
111
+ };
112
+ }, []);
113
+ /**
114
+ * The address this slug produces (FR-030, §5.5) — for **every** slug, not
115
+ * only a colliding one, because the common mistake is a slug that is
116
+ * perfectly legal and simply not what the operator meant.
117
+ *
118
+ * The storefront-root path rather than an origin-qualified URL: a page
119
+ * belongs to *n* sales channels and a storefront origin is a per-channel
120
+ * value another module owns, so an absolute address here would be either *n*
121
+ * addresses or one arbitrary pick.
122
+ */
123
+ const publicPath = form.slug.trim().length > 0 ? `/${form.slug.trim()}` : null;
124
+ /** The reserved segment this slug would lose to, or `null` (§5.1, US4.2). */
125
+ const reservedSegment = (() => {
126
+ const segment = firstSlugSegment(form.slug);
127
+ return segment.length > 0 && reservedSegments.includes(segment) ? segment : null;
128
+ })();
129
+ useEffect(() => {
130
+ if (!isNew)
131
+ return;
132
+ setPage(null);
133
+ setForm(blankForm);
134
+ setScope({ salesChannelIds: [], languages: [] });
135
+ setActiveLanguage(null);
136
+ setDraftData(null);
137
+ setLanguageContentOverrides({});
138
+ setSlugEdited(false);
139
+ setError(null);
140
+ }, [isNew, id]);
141
+ // React Router reuses this component instance across `/cms/pages/:id`
142
+ // navigations, so local state survives an id change. Drop any unsaved draft
143
+ // when the edited page changes, otherwise the previous page's edits would
144
+ // mask the newly-loaded content.
145
+ useEffect(() => {
146
+ setDraftData(null);
147
+ setLanguageContentOverrides({});
148
+ }, [id]);
149
+ useEffect(() => {
150
+ if (!activeLanguage && scope.languages.length > 0)
151
+ setActiveLanguage(scope.languages[0] ?? null);
152
+ if (activeLanguage && !scope.languages.includes(activeLanguage)) {
153
+ setActiveLanguage(scope.languages[0] ?? null);
154
+ }
155
+ }, [activeLanguage, scope.languages]);
156
+ const currentData = useMemo(() => {
157
+ // Prefer the in-progress draft for the active tab; otherwise a stashed
158
+ // per-language override; otherwise the last saved content.
159
+ if (draftData)
160
+ return draftData;
161
+ if (activeLanguage && languageContentOverrides[activeLanguage]) {
162
+ return languageContentOverrides[activeLanguage] ?? null;
163
+ }
164
+ return dataFor(page, activeLanguage);
165
+ }, [activeLanguage, draftData, languageContentOverrides, page]);
166
+ const saveMeta = async (contentLanguage) => {
167
+ const meta = contentLanguage && (form.metaTitle || form.metaDescription || form.metaKeywords)
168
+ ? {
169
+ [contentLanguage]: {
170
+ ...(form.metaTitle ? { title: form.metaTitle } : {}),
171
+ ...(form.metaDescription ? { description: form.metaDescription } : {}),
172
+ ...(form.metaKeywords ? { keywords: form.metaKeywords } : {}),
173
+ },
174
+ }
175
+ : undefined;
176
+ if (isNew) {
177
+ return cmsClient.createPage({
178
+ name: form.name,
179
+ slug: form.slug,
180
+ active: form.active,
181
+ description: form.description || null,
182
+ salesChannelIds: scope.salesChannelIds,
183
+ languages: scope.languages,
184
+ ...(meta ? { meta } : {}),
185
+ });
186
+ }
187
+ if (!page)
188
+ throw new Error(t('pageEditor.notLoaded'));
189
+ return cmsClient.patchPage(page.id, {
190
+ name: form.name,
191
+ slug: form.slug,
192
+ active: form.active,
193
+ description: form.description || null,
194
+ salesChannelIds: scope.salesChannelIds,
195
+ languages: scope.languages,
196
+ ...(meta ? { meta } : {}),
197
+ version: page.version,
198
+ });
199
+ };
200
+ const save = async () => {
201
+ if (scope.salesChannelIds.length === 0) {
202
+ setError(t('pageEditor.errors.selectChannel'));
203
+ return false;
204
+ }
205
+ if (scope.languages.length === 0) {
206
+ setError(t('pageEditor.errors.selectLanguage'));
207
+ return false;
208
+ }
209
+ const contentLanguage = resolveScopedContentLanguage(scope, activeLanguage);
210
+ if (!contentLanguage) {
211
+ setError(t('pageEditor.errors.selectLanguage'));
212
+ return false;
213
+ }
214
+ setSaving(true);
215
+ setError(null);
216
+ try {
217
+ let saved = await saveMeta(contentLanguage);
218
+ if (currentData) {
219
+ saved = await cmsClient.putPageContent(saved.id, contentLanguage, {
220
+ data: currentData,
221
+ version: saved.version,
222
+ });
223
+ }
224
+ for (const [lang, data] of Object.entries(languageContentOverrides)) {
225
+ if (lang === contentLanguage)
226
+ continue;
227
+ saved = await cmsClient.putPageContent(saved.id, lang, {
228
+ data,
229
+ version: saved.version,
230
+ });
231
+ }
232
+ setPage(saved);
233
+ setDraftData(null);
234
+ setLanguageContentOverrides({});
235
+ if (isNew)
236
+ navigate(`/cms/pages/${saved.id}`, { replace: true });
237
+ return true;
238
+ }
239
+ catch (err) {
240
+ setError(err instanceof Error ? err.message : String(err));
241
+ return false;
242
+ }
243
+ finally {
244
+ setSaving(false);
245
+ }
246
+ };
247
+ const saveAndExit = async () => {
248
+ if (await save())
249
+ navigate('/cms/pages');
250
+ };
251
+ const lifecycle = async (action) => {
252
+ if (!page)
253
+ return;
254
+ setSaving(true);
255
+ setError(null);
256
+ try {
257
+ const updated = action === 'publish'
258
+ ? await cmsClient.publishPage(page.id)
259
+ : action === 'archive'
260
+ ? await cmsClient.archivePage(page.id)
261
+ : await cmsClient.unarchivePage(page.id);
262
+ setPage(updated);
263
+ }
264
+ catch (err) {
265
+ setError(err instanceof Error ? err.message : String(err));
266
+ }
267
+ finally {
268
+ setSaving(false);
269
+ }
270
+ };
271
+ return (_jsx(CmsContentEditorLayout, { header: _jsxs(_Fragment, { children: [_jsx(PageHeader, { title: isNew ? t('pageEditor.title.new') : form.name || t('pageEditor.title.edit'), description: t('pageEditor.description'), actions: _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { asChild: true, variant: "outline", children: _jsx(Link, { to: "/cms/pages", children: t('common.back') }) }), !isNew && page?.status !== 'published' ? (_jsx(Button, { type: "button", variant: "outline", onClick: () => void lifecycle('publish'), children: t('common.publish') })) : null, !isNew && page?.status === 'published' ? (_jsx(Button, { type: "button", variant: "outline", onClick: () => void lifecycle('archive'), children: t('common.archive') })) : null, !isNew && page?.status === 'archived' ? (_jsx(Button, { type: "button", variant: "outline", onClick: () => void lifecycle('unarchive'), children: t('common.unarchive') })) : null, _jsx(SaveButtonGroup, { onSave: () => void save(), onSaveAndExit: () => void saveAndExit(), saving: saving, saveLabel: t('common.save'), savingLabel: t('common.saving'), saveAndExitLabel: t('common.saveAndExit') })] }) }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null] }), settings: _jsxs(_Fragment, { children: [_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: t('pageEditor.metadata') }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.name') }), _jsx(Input, { value: form.name, onChange: (event) => {
272
+ const name = event.target.value;
273
+ setForm((f) => ({
274
+ ...f,
275
+ name,
276
+ ...(isNew && !slugEdited ? { slug: slugify(name) } : {}),
277
+ }));
278
+ } })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.slug') }), _jsx(Input, { value: form.slug, onChange: (event) => {
279
+ setSlugEdited(true);
280
+ setForm((f) => ({ ...f, slug: event.target.value.toLowerCase() }));
281
+ } }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [_jsxs("span", { className: "mr-1", children: [t('pageEditor.publicAddress'), ":"] }), publicPath ? (_jsx("code", { className: "font-mono", children: publicPath })) : (_jsx("span", { children: t('pageEditor.publicAddressEmpty') }))] }), reservedSegment ? (_jsx(Alert, { variant: "warning", children: _jsx(AlertDescription, { children: t('pageEditor.reservedSegmentWarning', { segment: reservedSegment }) }) })) : null] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.status') }), _jsxs(Select, { value: page?.status ?? 'draft', disabled: true, children: [_jsx("option", { value: "draft", children: t('status.draft') }), _jsx("option", { value: "published", children: t('status.published') }), _jsx("option", { value: "archived", children: t('status.archived') })] })] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.active, onChange: (event) => setForm({ ...form, active: event.target.checked }) }), t('fields.active')] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.description') }), _jsx(Textarea, { value: form.description, onChange: (event) => setForm({ ...form, description: event.target.value }) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.metaTitle') }), _jsx(Input, { value: form.metaTitle, onChange: (event) => setForm({ ...form, metaTitle: event.target.value }) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.metaDescription') }), _jsx(Textarea, { value: form.metaDescription, onChange: (event) => setForm({ ...form, metaDescription: event.target.value }) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.metaKeywords') }), _jsx(Input, { value: form.metaKeywords, onChange: (event) => setForm({ ...form, metaKeywords: event.target.value }) })] })] })] }), _jsx(ScopePicker, { value: scope, onChange: setScope })] }), languageTabs: _jsx(ContentLanguageTabs, { languages: scope.languages, activeLanguage: activeLanguage, onChange: (language) => {
282
+ // Keep unsaved canvas per language — clearing draft without stashing
283
+ // would drop edits when switching tabs.
284
+ if (activeLanguage && draftData) {
285
+ setLanguageContentOverrides((prev) => ({
286
+ ...prev,
287
+ [activeLanguage]: draftData,
288
+ }));
289
+ }
290
+ setDraftData(null);
291
+ setActiveLanguage(language);
292
+ } }), builder: _jsx(PageBuilderEditor, { data: currentData, onChange: setDraftData, contentKey: `${id ?? 'new'}:${activeLanguage ?? ''}`, pageContainer: true, languages: scope.languages, activeLanguage: activeLanguage, onResolveLanguageContent: (language) => {
293
+ if (language === activeLanguage && draftData) {
294
+ return structuredClone(draftData);
295
+ }
296
+ if (languageContentOverrides[language]) {
297
+ return structuredClone(languageContentOverrides[language]);
298
+ }
299
+ return structuredClone(dataFor(page, language) ?? emptyPageBuilderData());
300
+ }, onSaveAsTemplate: async (meta, canvasData) => {
301
+ await saveCanvasAsCmsTemplate({
302
+ ...meta,
303
+ data: canvasData,
304
+ salesChannelIds: scope.salesChannelIds,
305
+ languages: scope.languages,
306
+ activeLanguage,
307
+ });
308
+ }, onListTemplatesForApply: listCmsTemplatesForApply, onResolveTemplateLayout: (templateId) => loadCmsTemplateCanvas(templateId, activeLanguage) }) }));
309
+ }
310
+ /**
311
+ * The registry loads a route component through a dynamic-import factory and
312
+ * reads its default export (feature 091, FR-013). The named export stays: it is
313
+ * the spelling this module's own code and its tests use.
314
+ */
315
+ export default PageEditor;
316
+ //# sourceMappingURL=PageEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageEditor.js","sourceRoot":"","sources":["../../../src/admin/editors/PageEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function TemplateEditor(): ReactNode;
3
+ /**
4
+ * The registry loads a route component through a dynamic-import factory and
5
+ * reads its default export (feature 091, FR-013). The named export stays: it is
6
+ * the spelling this module's own code and its tests use.
7
+ */
8
+ export default TemplateEditor;
9
+ //# sourceMappingURL=TemplateEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateEditor.d.ts","sourceRoot":"","sources":["../../../src/admin/editors/TemplateEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAiClF,wBAAgB,cAAc,IAAI,SAAS,CAyO1C;AAED;;;;GAIG;AACH,eAAe,cAAc,CAAC"}