@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,180 @@
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 { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Input, Label, PageHeader, SaveButtonGroup, Textarea } from '@endora-commerce/admin-kit/ui';
5
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
6
+ import { ContentLanguageTabs, ScopePicker } from '@endora-commerce/admin-kit/components';
7
+ import { CmsContentEditorLayout } from '../components/CmsContentEditorLayout.js';
8
+ import { PageBuilderEditor } from '../components/PageBuilderEditor.js';
9
+ import { emptyPageBuilderData } from '@endora-commerce/page-builder-admin';
10
+ import { listCmsTemplatesForApply, loadCmsTemplateCanvas, saveCanvasAsCmsTemplate, } from '../components/cms-template-layout.js';
11
+ import { resolveScopedContentLanguage } from '../components/scope-utils.js';
12
+ import { cmsClient } from '../api/cms-client.js';
13
+ const blankForm = { name: '', code: '', description: '' };
14
+ function dataFor(template, language) {
15
+ if (!template || !language)
16
+ return null;
17
+ const data = template.content.languages[language];
18
+ if (data && typeof data === 'object')
19
+ return data;
20
+ return { root: { props: {} }, content: [] };
21
+ }
22
+ export function TemplateEditor() {
23
+ const t = useTranslation('cms');
24
+ const { id } = useParams();
25
+ const isNew = !id || id === 'new';
26
+ const navigate = useNavigate();
27
+ const [template, setTemplate] = useState(null);
28
+ const [form, setForm] = useState(blankForm);
29
+ const [scope, setScope] = useState({ salesChannelIds: [], languages: [] });
30
+ const [activeLanguage, setActiveLanguage] = useState(null);
31
+ const [draftData, setDraftData] = useState(null);
32
+ const [languageContentOverrides, setLanguageContentOverrides] = useState({});
33
+ const [error, setError] = useState(null);
34
+ const [saving, setSaving] = useState(false);
35
+ const load = useCallback(async () => {
36
+ if (isNew || !id)
37
+ return;
38
+ const loaded = await cmsClient.getTemplate(id);
39
+ setTemplate(loaded);
40
+ setForm({
41
+ name: loaded.name,
42
+ code: loaded.code,
43
+ description: loaded.description ?? '',
44
+ });
45
+ setScope({ salesChannelIds: loaded.salesChannelIds, languages: loaded.languages });
46
+ setActiveLanguage(loaded.languages[0] ?? null);
47
+ }, [id, isNew]);
48
+ useEffect(() => {
49
+ void load().catch((err) => setError(err instanceof Error ? err.message : String(err)));
50
+ }, [load]);
51
+ useEffect(() => {
52
+ if (!isNew)
53
+ return;
54
+ setTemplate(null);
55
+ setForm(blankForm);
56
+ setScope({ salesChannelIds: [], languages: [] });
57
+ setActiveLanguage(null);
58
+ setDraftData(null);
59
+ setLanguageContentOverrides({});
60
+ setError(null);
61
+ }, [isNew, id]);
62
+ useEffect(() => {
63
+ setDraftData(null);
64
+ setLanguageContentOverrides({});
65
+ }, [id]);
66
+ useEffect(() => {
67
+ if (!activeLanguage && scope.languages.length > 0)
68
+ setActiveLanguage(scope.languages[0] ?? null);
69
+ if (activeLanguage && !scope.languages.includes(activeLanguage)) {
70
+ setActiveLanguage(scope.languages[0] ?? null);
71
+ }
72
+ }, [activeLanguage, scope.languages]);
73
+ const currentData = useMemo(() => {
74
+ if (draftData)
75
+ return draftData;
76
+ if (activeLanguage && languageContentOverrides[activeLanguage]) {
77
+ return languageContentOverrides[activeLanguage] ?? null;
78
+ }
79
+ return dataFor(template, activeLanguage);
80
+ }, [activeLanguage, draftData, languageContentOverrides, template]);
81
+ const save = async () => {
82
+ if (scope.salesChannelIds.length === 0) {
83
+ setError(t('templateEditor.errors.selectChannel'));
84
+ return false;
85
+ }
86
+ if (scope.languages.length === 0) {
87
+ setError(t('templateEditor.errors.selectLanguage'));
88
+ return false;
89
+ }
90
+ const contentLanguage = resolveScopedContentLanguage(scope, activeLanguage);
91
+ if (!contentLanguage) {
92
+ setError(t('templateEditor.errors.selectLanguage'));
93
+ return false;
94
+ }
95
+ setSaving(true);
96
+ setError(null);
97
+ try {
98
+ let saved = isNew
99
+ ? await cmsClient.createTemplate({
100
+ name: form.name,
101
+ code: form.code,
102
+ description: form.description || null,
103
+ salesChannelIds: scope.salesChannelIds,
104
+ languages: scope.languages,
105
+ })
106
+ : await cmsClient.patchTemplate(template.id, {
107
+ name: form.name,
108
+ code: form.code,
109
+ description: form.description || null,
110
+ salesChannelIds: scope.salesChannelIds,
111
+ languages: scope.languages,
112
+ version: template.version,
113
+ });
114
+ if (currentData) {
115
+ saved = await cmsClient.putTemplateContent(saved.id, contentLanguage, {
116
+ data: currentData,
117
+ version: saved.version,
118
+ });
119
+ }
120
+ for (const [lang, data] of Object.entries(languageContentOverrides)) {
121
+ if (lang === contentLanguage)
122
+ continue;
123
+ saved = await cmsClient.putTemplateContent(saved.id, lang, {
124
+ data,
125
+ version: saved.version,
126
+ });
127
+ }
128
+ setTemplate(saved);
129
+ setDraftData(null);
130
+ setLanguageContentOverrides({});
131
+ if (isNew)
132
+ navigate(`/cms/templates/${saved.id}`, { replace: true });
133
+ return true;
134
+ }
135
+ catch (err) {
136
+ setError(err instanceof Error ? err.message : String(err));
137
+ return false;
138
+ }
139
+ finally {
140
+ setSaving(false);
141
+ }
142
+ };
143
+ const saveAndExit = async () => {
144
+ if (await save())
145
+ navigate('/cms/templates');
146
+ };
147
+ return (_jsx(CmsContentEditorLayout, { header: _jsxs(_Fragment, { children: [_jsx(PageHeader, { title: isNew ? t('templateEditor.title.new') : form.name || t('templateEditor.title.edit'), description: t('templateEditor.description'), actions: _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { asChild: true, variant: "outline", children: _jsx(Link, { to: "/cms/templates", 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('templateEditor.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) => setForm({ ...form, name: event.target.value }) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: t('fields.code') }), _jsx(Input, { value: form.code, onChange: (event) => setForm({ ...form, code: event.target.value }) })] }), _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) => {
148
+ if (activeLanguage && draftData) {
149
+ setLanguageContentOverrides((prev) => ({
150
+ ...prev,
151
+ [activeLanguage]: draftData,
152
+ }));
153
+ }
154
+ setDraftData(null);
155
+ setActiveLanguage(language);
156
+ } }), builder: _jsx(PageBuilderEditor, { data: currentData, onChange: setDraftData, contentKey: `${id ?? 'new'}:${activeLanguage ?? ''}`, languages: scope.languages, activeLanguage: activeLanguage, onResolveLanguageContent: (language) => {
157
+ if (language === activeLanguage && draftData) {
158
+ return structuredClone(draftData);
159
+ }
160
+ if (languageContentOverrides[language]) {
161
+ return structuredClone(languageContentOverrides[language]);
162
+ }
163
+ return structuredClone(dataFor(template, language) ?? emptyPageBuilderData());
164
+ }, onSaveAsTemplate: async (meta, canvasData) => {
165
+ await saveCanvasAsCmsTemplate({
166
+ ...meta,
167
+ data: canvasData,
168
+ salesChannelIds: scope.salesChannelIds,
169
+ languages: scope.languages,
170
+ activeLanguage,
171
+ });
172
+ }, onListTemplatesForApply: listCmsTemplatesForApply, onResolveTemplateLayout: (templateId) => loadCmsTemplateCanvas(templateId, activeLanguage) }) }));
173
+ }
174
+ /**
175
+ * The registry loads a route component through a dynamic-import factory and
176
+ * reads its default export (feature 091, FR-013). The named export stays: it is
177
+ * the spelling this module's own code and its tests use.
178
+ */
179
+ export default TemplateEditor;
180
+ //# sourceMappingURL=TemplateEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateEditor.js","sourceRoot":"","sources":["../../../src/admin/editors/TemplateEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `cms`' admin surface — eleven routes and four sidebar entries (feature 091,
3
+ * Phase 4 batch 16).
4
+ *
5
+ * **The heaviest owner in the table, and the last to move.** With `blog` beside
6
+ * it these eighteen routes and seven nav entries are the last module-owned
7
+ * registrations `admin/src/App.tsx` and `admin/src/components/AppShell.tsx`
8
+ * hold, which is SC-007.
9
+ *
10
+ * **This module publishes a component as well as contributing a surface**, and
11
+ * that is what makes it batch 16's one judgement rather than its largest
12
+ * directory. `blog`'s two editors render `PageBuilderEditor`, which is `cms`'
13
+ * screen — the two keys in
14
+ * `backend/scripts/ledgers/cross-module-imports/blog.ts`. Both endpoints are in
15
+ * this batch, so the seam was decided here rather than inherited: Z1 reads the
16
+ * signature, the signature is `data` in and `onChange` back, so the **consumer**
17
+ * decides that the canvas appears and the exit is a published component. It is
18
+ * on `./admin-ui` — D-191's subpath, `credentials`' exit from batch 10 — and
19
+ * `src/admin-ui/index.ts` carries the whole of that reasoning, including why
20
+ * the kit and `@endora-commerce/page-builder-admin` both refuse it and why the
21
+ * two ledger keys are re-keyed rather than retired.
22
+ *
23
+ * **Eleven `admin/src` files go with the move and are not this module's**: the
24
+ * nine re-export shims P5b left at
25
+ * `admin/src/modules/cms/components/…` pointing into
26
+ * `@endora-commerce/page-builder-admin`, and the two P8 left pointing into
27
+ * `@endora-commerce/admin-kit/components` (`ContentLanguageTabs`,
28
+ * `ScopePicker`). A shim exists so that the files still under `admin/src` reach
29
+ * a moved binding by the specifier they always used; with the last of those
30
+ * files here, the shims have no reader and the screens name the packages
31
+ * directly.
32
+ *
33
+ * **This entry exports data and nothing else** (R2); every component is a
34
+ * dynamic-import factory (R6).
35
+ */
36
+ import type { AdminContributions } from '@endora-commerce/admin-kit/contributions';
37
+ export declare const contributions: AdminContributions;
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAyBnF,eAAO,MAAM,aAAa,EAAE,kBA0H3B,CAAC"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * The code that opens every screen below.
3
+ *
4
+ * `packages/modules/cms/src/backend/routes.admin.ts` gates every `GET` with
5
+ * `cms.read` and every mutation with `cms.write`, and it is the read code that
6
+ * opens a screen (issue #232) — the code all four hand-written sidebar rows
7
+ * carried.
8
+ *
9
+ * **The three `/new` routes take the write code**, for the reason
10
+ * `packages/modules/blog/src/admin/index.ts` records at length: this module's
11
+ * `new-page` action advertises `/cms/pages/new` under `cms.write`, and a
12
+ * read-gated create route would make the palette advertise a screen the
13
+ * advertised code cannot open. The three create buttons are gated on the same
14
+ * code, so the link is not a dead end.
15
+ */
16
+ const READ_PERMISSION = 'cms.read';
17
+ /** The code the three create forms open on, and the one their saves enforce. */
18
+ const WRITE_PERMISSION = 'cms.write';
19
+ /** The module's landing route: the page list. */
20
+ const ROUTE_PATH = '/cms/pages';
21
+ export const contributions = {
22
+ routes: [
23
+ {
24
+ // The bare section path, which `App.tsx` has rendered onto the page list
25
+ // since the CMS screens were written. It is kept as a second declaration
26
+ // of the same component rather than turned into a redirect: a redirect
27
+ // would be the admin application's own route — that is how
28
+ // `check:admin-registrations` once attributed `/settings/dhl-parcel` —
29
+ // and moving a `cms` deep link into the host's registry is the direction
30
+ // this feature exists to reverse.
31
+ //
32
+ // **That precedent has since been withdrawn rather than extended**:
33
+ // feature 134's wave 1 deleted the `/settings/dhl-parcel` redirect,
34
+ // because attributing by *element* left the host declaring a route whose
35
+ // *destination* only a departing module declares. The conclusion here is
36
+ // unchanged and better supported than it was — keeping both ends with
37
+ // `cms` is right for exactly the reason the redirect case went on to
38
+ // prove.
39
+ path: '/cms',
40
+ component: () => import('./pages/PagesListPage.js'),
41
+ requiredPermission: READ_PERMISSION,
42
+ },
43
+ {
44
+ path: ROUTE_PATH,
45
+ component: () => import('./pages/PagesListPage.js'),
46
+ requiredPermission: READ_PERMISSION,
47
+ // The landing route is the one the sidebar points at, which is
48
+ // `/cms/pages` and not `/cms`.
49
+ index: true,
50
+ },
51
+ {
52
+ // Declared before `/cms/pages/:id`, as `App.tsx` declared it, for the
53
+ // reason recorded in `blog`'s declaration: `<Routes>` ranks by
54
+ // specificity, so the ordering is a reader's convenience rather than a
55
+ // correctness condition.
56
+ path: `${ROUTE_PATH}/new`,
57
+ component: () => import('./editors/PageEditor.js'),
58
+ requiredPermission: WRITE_PERMISSION,
59
+ },
60
+ {
61
+ path: `${ROUTE_PATH}/:id`,
62
+ component: () => import('./editors/PageEditor.js'),
63
+ requiredPermission: READ_PERMISSION,
64
+ },
65
+ {
66
+ path: '/cms/blocks',
67
+ component: () => import('./pages/BlocksListPage.js'),
68
+ requiredPermission: READ_PERMISSION,
69
+ },
70
+ {
71
+ path: '/cms/blocks/new',
72
+ component: () => import('./editors/BlockEditor.js'),
73
+ requiredPermission: WRITE_PERMISSION,
74
+ },
75
+ {
76
+ path: '/cms/blocks/:id',
77
+ component: () => import('./editors/BlockEditor.js'),
78
+ requiredPermission: READ_PERMISSION,
79
+ },
80
+ {
81
+ path: '/cms/templates',
82
+ component: () => import('./pages/TemplatesListPage.js'),
83
+ requiredPermission: READ_PERMISSION,
84
+ },
85
+ {
86
+ path: '/cms/templates/new',
87
+ component: () => import('./editors/TemplateEditor.js'),
88
+ requiredPermission: WRITE_PERMISSION,
89
+ },
90
+ {
91
+ path: '/cms/templates/:id',
92
+ component: () => import('./editors/TemplateEditor.js'),
93
+ requiredPermission: READ_PERMISSION,
94
+ },
95
+ {
96
+ path: '/cms/hooks',
97
+ component: () => import('./pages/HooksPage.js'),
98
+ requiredPermission: READ_PERMISSION,
99
+ },
100
+ ],
101
+ nav: [
102
+ {
103
+ to: ROUTE_PATH,
104
+ // Module-relative (R8), out of `packages/modules/cms/i18n/`. It was
105
+ // `appShell.nav.cmsPages` in the shared `_i18n` bundle.
106
+ labelKey: 'nav.cmsPages.label',
107
+ icon: 'Newspaper',
108
+ section: 'content',
109
+ // First to fourth of eight in the hand-written *Content* table.
110
+ // `megamenu` has declared 500 since batch 8 against a comment saying it
111
+ // sits after these four and before `blog`'s three; 100–400 here and
112
+ // 600–800 there are what make that comment true again.
113
+ weight: 100,
114
+ requiredPermission: READ_PERMISSION,
115
+ },
116
+ {
117
+ to: '/cms/blocks',
118
+ labelKey: 'nav.cmsBlocks.label',
119
+ icon: 'Newspaper',
120
+ section: 'content',
121
+ weight: 200,
122
+ requiredPermission: READ_PERMISSION,
123
+ },
124
+ {
125
+ to: '/cms/templates',
126
+ labelKey: 'nav.cmsTemplates.label',
127
+ icon: 'Newspaper',
128
+ section: 'content',
129
+ weight: 300,
130
+ requiredPermission: READ_PERMISSION,
131
+ },
132
+ {
133
+ to: '/cms/hooks',
134
+ // The one row of the four with a glyph of its own, and it is kept: a
135
+ // unified icon would be an operator-visible change bought for nothing.
136
+ labelKey: 'nav.cmsHooks.label',
137
+ icon: 'Webhook',
138
+ section: 'content',
139
+ weight: 400,
140
+ requiredPermission: READ_PERMISSION,
141
+ },
142
+ ],
143
+ };
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function BlocksListPage(): 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 BlocksListPage;
9
+ //# sourceMappingURL=BlocksListPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlocksListPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/BlocksListPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBzE,wBAAgB,cAAc,IAAI,SAAS,CAiG1C;AAED;;;;GAIG;AACH,eAAe,cAAc,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Link } from 'react-router-dom';
4
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, CardHeader, CardTitle, PageHeader } from '@endora-commerce/admin-kit/ui';
5
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@endora-commerce/admin-kit/ui';
6
+ import { useAuth } from '@endora-commerce/admin-kit/lib';
7
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
8
+ import { cmsClient } from '../api/cms-client.js';
9
+ export function BlocksListPage() {
10
+ const t = useTranslation('cms');
11
+ const { hasPermission } = useAuth();
12
+ // The create route this screen links to takes the **write** code (feature
13
+ // 091, batch 16), so the button is gated on the same one: a link whose
14
+ // destination the operator's codes cannot open answers the admin's not-found
15
+ // page, which says nothing about permissions at all. That is batch 14's
16
+ // `/sales-channels/new` shape, applied to the five create entry points these
17
+ // two modules have.
18
+ const canWrite = hasPermission('cms.write');
19
+ const [rows, setRows] = useState([]);
20
+ const [loading, setLoading] = useState(true);
21
+ const [error, setError] = useState(null);
22
+ const load = useCallback(async () => {
23
+ setLoading(true);
24
+ setError(null);
25
+ try {
26
+ const out = await cmsClient.listBlocks();
27
+ setRows(out.data);
28
+ }
29
+ catch (err) {
30
+ setError(err instanceof Error ? err.message : String(err));
31
+ }
32
+ finally {
33
+ setLoading(false);
34
+ }
35
+ }, []);
36
+ useEffect(() => {
37
+ void load();
38
+ }, [load]);
39
+ return (_jsxs("div", { className: "b2b-page b2b-page--wide space-y-4", children: [_jsx(PageHeader, { title: t('blocksList.title'), description: t('blocksList.description'), actions: canWrite ? (_jsx(Button, { asChild: true, children: _jsx(Link, { to: "/cms/blocks/new", children: t('blocksList.new') }) })) : null }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: t('blocksList.cardTitle') }) }), _jsx(CardContent, { children: loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('blocksList.loading') })) : rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('blocksList.empty') })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('columns.name') }), _jsx(TableHead, { children: t('columns.code') }), _jsx(TableHead, { children: t('columns.state') }), _jsx(TableHead, { children: t('columns.languages') })] }) }), _jsx(TableBody, { children: rows.map((block) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsx(Link, { to: `/cms/blocks/${block.id}`, className: "font-medium text-primary hover:underline", children: block.name }) }), _jsx(TableCell, { className: "font-mono text-xs", children: block.code }), _jsx(TableCell, { children: _jsx(Badge, { variant: block.active ? 'default' : 'outline', children: block.active ? t('state.active') : t('state.inactive') }) }), _jsx(TableCell, { className: "text-xs text-muted-foreground", children: block.languages.join(', ') })] }, block.id))) })] })) })] })] }));
40
+ }
41
+ /**
42
+ * The registry loads a route component through a dynamic-import factory and
43
+ * reads its default export (feature 091, FR-013). The named export stays: it is
44
+ * the spelling this module's own code and its tests use.
45
+ */
46
+ export default BlocksListPage;
47
+ //# sourceMappingURL=BlocksListPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlocksListPage.js","sourceRoot":"","sources":["../../../src/admin/pages/BlocksListPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function HooksPage(): 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 HooksPage;
9
+ //# sourceMappingURL=HooksPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HooksPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/HooksPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAezE,wBAAgB,SAAS,IAAI,SAAS,CA+GrC;AAED;;;;GAIG;AACH,eAAe,SAAS,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, CardHeader, CardTitle, PageHeader } from '@endora-commerce/admin-kit/ui';
4
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@endora-commerce/admin-kit/ui';
5
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
6
+ import { cmsClient } from '../api/cms-client.js';
7
+ import { HookBlockAttachmentsPanel } from '../components/HookBlockAttachmentsPanel.js';
8
+ export function HooksPage() {
9
+ const t = useTranslation('cms');
10
+ const [rows, setRows] = useState([]);
11
+ const [selectedId, setSelectedId] = useState(null);
12
+ const [loading, setLoading] = useState(true);
13
+ const [error, setError] = useState(null);
14
+ const load = useCallback(async () => {
15
+ setLoading(true);
16
+ setError(null);
17
+ try {
18
+ const out = await cmsClient.listHooks();
19
+ setRows(out.data);
20
+ setSelectedId((current) => current ?? out.data[0]?.id ?? null);
21
+ }
22
+ catch (err) {
23
+ setError(err instanceof Error ? err.message : String(err));
24
+ }
25
+ finally {
26
+ setLoading(false);
27
+ }
28
+ }, []);
29
+ useEffect(() => {
30
+ void load();
31
+ }, [load]);
32
+ const selected = rows.find((hook) => hook.id === selectedId) ?? null;
33
+ return (_jsxs("div", { className: "b2b-page b2b-page--wide space-y-4", children: [_jsx(PageHeader, { title: t('hooksList.title'), description: t('hooksList.description'), actions: _jsx(Button, { type: "button", variant: "outline", onClick: () => void load(), disabled: loading, children: t('common.refresh') }) }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs("div", { className: "grid grid-cols-12 gap-4", children: [_jsxs(Card, { className: "col-span-7", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: t('hooksList.cardTitle') }) }), _jsx(CardContent, { children: loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('hooksList.loading') })) : rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('hooksList.empty') })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('columns.name') }), _jsx(TableHead, { children: t('columns.code') }), _jsx(TableHead, { children: t('columns.state') }), _jsx(TableHead, { className: "text-right", children: t('columns.channels') }), _jsx(TableHead, { className: "text-right", children: t('columns.blocks') })] }) }), _jsx(TableBody, { children: rows.map((hook) => (_jsxs(TableRow, { className: hook.id === selectedId ? 'bg-muted/50' : undefined, children: [_jsx(TableCell, { children: _jsx("button", { type: "button", className: "text-left font-medium text-primary hover:underline", onClick: () => setSelectedId(hook.id), children: hook.name }) }), _jsx(TableCell, { className: "font-mono text-xs", children: hook.code }), _jsx(TableCell, { children: _jsxs("div", { className: "flex flex-wrap gap-1", children: [_jsx(Badge, { variant: hook.active ? 'default' : 'outline', children: hook.active ? t('state.active') : t('state.inactive') }), hook.isSystem ? (_jsx(Badge, { variant: "outline", children: t('state.system') })) : (_jsx(Badge, { variant: "secondary", children: t('state.custom') }))] }) }), _jsx(TableCell, { className: "text-right text-xs text-muted-foreground", children: hook.salesChannelIds.length }), _jsx(TableCell, { className: "text-right text-xs text-muted-foreground", children: hook.attachmentCount })] }, hook.id))) })] })) })] }), _jsx("div", { className: "col-span-5", children: _jsx(HookBlockAttachmentsPanel, { hook: selected, onChanged: () => void load() }) })] })] }));
34
+ }
35
+ /**
36
+ * The registry loads a route component through a dynamic-import factory and
37
+ * reads its default export (feature 091, FR-013). The named export stays: it is
38
+ * the spelling this module's own code and its tests use.
39
+ */
40
+ export default HooksPage;
41
+ //# sourceMappingURL=HooksPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HooksPage.js","sourceRoot":"","sources":["../../../src/admin/pages/HooksPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function PagesListPage(): 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 PagesListPage;
9
+ //# sourceMappingURL=PagesListPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesListPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/PagesListPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBzE,wBAAgB,aAAa,IAAI,SAAS,CAuHzC;AAED;;;;GAIG;AACH,eAAe,aAAa,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Link } from 'react-router-dom';
4
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, CardHeader, CardTitle, Input, PageHeader } from '@endora-commerce/admin-kit/ui';
5
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@endora-commerce/admin-kit/ui';
6
+ import { useAuth } from '@endora-commerce/admin-kit/lib';
7
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
8
+ import { cmsClient } from '../api/cms-client.js';
9
+ export function PagesListPage() {
10
+ const t = useTranslation('cms');
11
+ const { hasPermission } = useAuth();
12
+ // The create route this screen links to takes the **write** code (feature
13
+ // 091, batch 16), so the button is gated on the same one: a link whose
14
+ // destination the operator's codes cannot open answers the admin's not-found
15
+ // page, which says nothing about permissions at all. That is batch 14's
16
+ // `/sales-channels/new` shape, applied to the five create entry points these
17
+ // two modules have.
18
+ const canWrite = hasPermission('cms.write');
19
+ const [rows, setRows] = useState([]);
20
+ const [q, setQ] = useState('');
21
+ const [loading, setLoading] = useState(true);
22
+ const [error, setError] = useState(null);
23
+ const load = useCallback(async () => {
24
+ setLoading(true);
25
+ setError(null);
26
+ try {
27
+ const out = await cmsClient.listPages({ ...(q ? { q } : {}), limit: 50 });
28
+ setRows(out.data);
29
+ }
30
+ catch (err) {
31
+ setError(err instanceof Error ? err.message : String(err));
32
+ }
33
+ finally {
34
+ setLoading(false);
35
+ }
36
+ }, [q]);
37
+ useEffect(() => {
38
+ void load();
39
+ }, [load]);
40
+ return (_jsxs("div", { className: "b2b-page b2b-page--wide space-y-4", children: [_jsx(PageHeader, { title: t('pagesList.title'), description: t('pagesList.description'), actions: canWrite ? (_jsx(Button, { asChild: true, children: _jsx(Link, { to: "/cms/pages/new", children: t('pagesList.new') }) })) : null }), error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between gap-2", children: [_jsx(CardTitle, { className: "text-base", children: t('pagesList.cardTitle') }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { value: q, onChange: (event) => setQ(event.target.value), onKeyDown: (event) => {
41
+ if (event.key === 'Enter')
42
+ void load();
43
+ }, placeholder: t('pagesList.searchPlaceholder'), className: "w-64" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => void load(), children: t('common.search') })] })] }), _jsx(CardContent, { children: loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('pagesList.loading') })) : rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('pagesList.empty') })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('columns.name') }), _jsx(TableHead, { children: t('columns.slug') }), _jsx(TableHead, { children: t('columns.status') }), _jsx(TableHead, { children: t('columns.languages') })] }) }), _jsx(TableBody, { children: rows.map((page) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsx(Link, { to: `/cms/pages/${page.id}`, className: "font-medium text-primary hover:underline", children: page.name }) }), _jsx(TableCell, { className: "font-mono text-xs", children: page.slug }), _jsxs(TableCell, { children: [_jsx(Badge, { variant: page.status === 'published' ? 'default' : 'outline', children: t(`status.${page.status}`) }), !page.active ? (_jsx(Badge, { variant: "outline", className: "ml-2", children: t('state.inactive') })) : null] }), _jsx(TableCell, { className: "text-xs text-muted-foreground", children: page.languages.join(', ') })] }, page.id))) })] })) })] })] }));
44
+ }
45
+ /**
46
+ * The registry loads a route component through a dynamic-import factory and
47
+ * reads its default export (feature 091, FR-013). The named export stays: it is
48
+ * the spelling this module's own code and its tests use.
49
+ */
50
+ export default PagesListPage;
51
+ //# sourceMappingURL=PagesListPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesListPage.js","sourceRoot":"","sources":["../../../src/admin/pages/PagesListPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function TemplatesListPage(): 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 TemplatesListPage;
9
+ //# sourceMappingURL=TemplatesListPage.d.ts.map