@webiny/app-headless-cms 6.6.0-alpha.0 → 6.6.0-alpha.1

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 (211) hide show
  1. package/ContentEntriesModule.js +3 -3
  2. package/ContentEntriesModule.js.map +1 -1
  3. package/HeadlessCMS.js +7 -2
  4. package/HeadlessCMS.js.map +1 -1
  5. package/admin/RoutesConfig.js +14 -1
  6. package/admin/RoutesConfig.js.map +1 -1
  7. package/admin/components/ContentEntries/BulkActions/ActionDelete.d.ts +2 -2
  8. package/admin/components/ContentEntries/BulkActions/ActionDelete.js.map +1 -1
  9. package/admin/components/ContentEntries/BulkActions/ActionMove.d.ts +2 -2
  10. package/admin/components/ContentEntries/BulkActions/ActionMove.js.map +1 -1
  11. package/admin/components/ContentEntries/BulkActions/ActionPublish.d.ts +2 -2
  12. package/admin/components/ContentEntries/BulkActions/ActionPublish.js.map +1 -1
  13. package/admin/components/ContentEntries/BulkActions/ActionUnpublish.d.ts +2 -2
  14. package/admin/components/ContentEntries/BulkActions/ActionUnpublish.js.map +1 -1
  15. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js +1 -0
  16. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
  17. package/admin/components/ContentModelEditor/FieldsSidebar.js +12 -2
  18. package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
  19. package/admin/components/ContentModelEditor/evaluateExpression.js +4 -0
  20. package/admin/components/ContentModelEditor/evaluateExpression.js.map +1 -1
  21. package/admin/components/Dialogs/PublishEntryConfirmDialog.d.ts +26 -1
  22. package/admin/components/Dialogs/PublishEntryConfirmDialog.js +4 -3
  23. package/admin/components/Dialogs/PublishEntryConfirmDialog.js.map +1 -1
  24. package/admin/components/Dialogs/UnpublishEntryConfirmDialog.d.ts +26 -1
  25. package/admin/components/Dialogs/UnpublishEntryConfirmDialog.js +4 -3
  26. package/admin/components/Dialogs/UnpublishEntryConfirmDialog.js.map +1 -1
  27. package/admin/components/FieldEditor/EditFieldDialog/PermissionsEditor/PermissionsEditor.js +3 -3
  28. package/admin/components/FieldEditor/EditFieldDialog/PermissionsEditor/PermissionsEditor.js.map +1 -1
  29. package/admin/components/FieldEditor/EditFieldDialog.d.ts +2 -2
  30. package/admin/components/FieldEditor/EditFieldDialog.js +5 -2
  31. package/admin/components/FieldEditor/EditFieldDialog.js.map +1 -1
  32. package/admin/components/FieldEditor/Field.js +1 -1
  33. package/admin/components/FieldEditor/Field.js.map +1 -1
  34. package/admin/components/FieldEditor/FieldEditor.js +2 -2
  35. package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
  36. package/admin/components/FieldEditor/FieldEditorContext.d.ts +1 -1
  37. package/admin/components/FieldEditor/FieldEditorContext.js +6 -1
  38. package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
  39. package/admin/components/LexicalCmsEditor/LexicalEditor.js +10 -6
  40. package/admin/components/LexicalCmsEditor/LexicalEditor.js.map +1 -1
  41. package/admin/components/LexicalCmsEditor/TypographyDropDown.js +3 -2
  42. package/admin/components/LexicalCmsEditor/TypographyDropDown.js.map +1 -1
  43. package/admin/config/contentEntries/editor/ContentEntryEditorConfig.d.ts +60 -2
  44. package/admin/config/contentEntries/editor/ContentEntryEditorConfig.js +18 -5
  45. package/admin/config/contentEntries/editor/ContentEntryEditorConfig.js.map +1 -1
  46. package/admin/config/contentEntries/editor/NewEntryWizard.d.ts +8 -1
  47. package/admin/config/contentEntries/editor/NewEntryWizard.js +20 -5
  48. package/admin/config/contentEntries/editor/NewEntryWizard.js.map +1 -1
  49. package/admin/config/contentEntries/list/Browser/BreadcrumbRoot.d.ts +38 -0
  50. package/admin/config/contentEntries/list/Browser/BreadcrumbRoot.js +23 -0
  51. package/admin/config/contentEntries/list/Browser/BreadcrumbRoot.js.map +1 -0
  52. package/admin/config/contentEntries/list/Browser/index.d.ts +21 -0
  53. package/admin/config/contentEntries/list/Browser/index.js +2 -0
  54. package/admin/config/contentEntries/list/Browser/index.js.map +1 -1
  55. package/admin/config/contentEntries/list/ContentEntryListConfig.d.ts +39 -0
  56. package/admin/config/contentEntries/list/ContentEntryListConfig.js +2 -1
  57. package/admin/config/contentEntries/list/ContentEntryListConfig.js.map +1 -1
  58. package/admin/graphql/contentModels.d.ts +1 -1
  59. package/admin/graphql/contentModels.js +2 -1
  60. package/admin/graphql/contentModels.js.map +1 -1
  61. package/admin/plugins/editor/formSettings/components/GeneralSettings.js +24 -1
  62. package/admin/plugins/editor/formSettings/components/GeneralSettings.js.map +1 -1
  63. package/exports/admin/cms/entry/editor.d.ts +1 -0
  64. package/exports/admin/cms/entry/editor.js +1 -0
  65. package/exports/admin/cms/entry/list.d.ts +2 -0
  66. package/exports/admin/cms/entry/list.js +2 -0
  67. package/exports/admin/cms.d.ts +2 -0
  68. package/exports/admin/cms.js +2 -0
  69. package/features/contentEntry/EntryGraphQLFields.js +1 -1
  70. package/features/contentEntry/EntryGraphQLFields.js.map +1 -1
  71. package/features/contentEntry/createEntry/CreateEntryRepository.d.ts +3 -1
  72. package/features/contentEntry/createEntry/CreateEntryRepository.js +10 -2
  73. package/features/contentEntry/createEntry/CreateEntryRepository.js.map +1 -1
  74. package/features/contentEntry/deleteEntry/DeleteEntryRepository.d.ts +3 -1
  75. package/features/contentEntry/deleteEntry/DeleteEntryRepository.js +12 -2
  76. package/features/contentEntry/deleteEntry/DeleteEntryRepository.js.map +1 -1
  77. package/features/contentEntry/refTypes.d.ts +7 -0
  78. package/features/contentEntry/refTypes.js.map +1 -1
  79. package/features/contentEntry/updateEntry/UpdateEntryRepository.d.ts +3 -1
  80. package/features/contentEntry/updateEntry/UpdateEntryRepository.js +10 -2
  81. package/features/contentEntry/updateEntry/UpdateEntryRepository.js.map +1 -1
  82. package/features/formModel/mappers/AssetFieldMapper.d.ts +12 -0
  83. package/features/formModel/mappers/AssetFieldMapper.js +13 -0
  84. package/features/formModel/mappers/AssetFieldMapper.js.map +1 -0
  85. package/features/formModel/mappers/index.js +2 -0
  86. package/features/formModel/mappers/index.js.map +1 -1
  87. package/features/model/updateModel/UpdateModelGateway.js +1 -0
  88. package/features/model/updateModel/UpdateModelGateway.js.map +1 -1
  89. package/index.d.ts +1 -1
  90. package/index.js +1 -1
  91. package/package.json +24 -24
  92. package/presentation/contentEntries/list/ContentEntriesPresenter.test.js +4 -0
  93. package/presentation/contentEntries/list/ContentEntriesPresenter.test.js.map +1 -1
  94. package/presentation/contentEntries/preview/ComponentDiscoveryIframe.d.ts +6 -0
  95. package/presentation/contentEntries/preview/ComponentDiscoveryIframe.js +47 -0
  96. package/presentation/contentEntries/preview/ComponentDiscoveryIframe.js.map +1 -0
  97. package/presentation/contentEntries/preview/LivePreviewPresenter.d.ts +14 -0
  98. package/presentation/contentEntries/preview/LivePreviewPresenter.js +33 -0
  99. package/presentation/contentEntries/preview/LivePreviewPresenter.js.map +1 -0
  100. package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.d.ts +2 -0
  101. package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js +27 -0
  102. package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js.map +1 -0
  103. package/presentation/contentEntries/preview/PreviewComponentsContext.d.ts +15 -0
  104. package/presentation/contentEntries/preview/PreviewComponentsContext.js +43 -0
  105. package/presentation/contentEntries/preview/PreviewComponentsContext.js.map +1 -0
  106. package/presentation/contentEntries/preview/PreviewDecorator.d.ts +2 -0
  107. package/presentation/contentEntries/preview/PreviewDecorator.js +48 -0
  108. package/presentation/contentEntries/preview/PreviewDecorator.js.map +1 -0
  109. package/presentation/contentEntries/preview/PreviewPane.d.ts +9 -0
  110. package/presentation/contentEntries/preview/PreviewPane.js +181 -0
  111. package/presentation/contentEntries/preview/PreviewPane.js.map +1 -0
  112. package/presentation/contentEntries/preview/abstractions.d.ts +16 -0
  113. package/presentation/contentEntries/preview/abstractions.js +5 -0
  114. package/presentation/contentEntries/preview/abstractions.js.map +1 -0
  115. package/presentation/contentEntries/preview/feature.d.ts +3 -0
  116. package/presentation/contentEntries/preview/feature.js +17 -0
  117. package/presentation/contentEntries/preview/feature.js.map +1 -0
  118. package/presentation/contentEntries/preview/resolvePreviewUrl.d.ts +5 -0
  119. package/presentation/contentEntries/preview/resolvePreviewUrl.js +29 -0
  120. package/presentation/contentEntries/preview/resolvePreviewUrl.js.map +1 -0
  121. package/presentation/contentEntries/preview/useLivePreviewPresenter.d.ts +1 -0
  122. package/presentation/contentEntries/preview/useLivePreviewPresenter.js +8 -0
  123. package/presentation/contentEntries/preview/useLivePreviewPresenter.js.map +1 -0
  124. package/presentation/contentEntries/trashBin/CmsTrashBin.d.ts +2 -2
  125. package/presentation/contentEntries/views/CmsAdvancedSearch.d.ts +2 -2
  126. package/presentation/contentEntries/views/ContentEntriesBreadcrumbs.d.ts +13 -0
  127. package/presentation/contentEntries/views/ContentEntriesBreadcrumbs.js +54 -0
  128. package/presentation/contentEntries/views/ContentEntriesBreadcrumbs.js.map +1 -0
  129. package/presentation/contentEntries/views/ContentEntriesListLayout.d.ts +2 -2
  130. package/presentation/contentEntries/views/ContentEntriesListLayout.js +3 -2
  131. package/presentation/contentEntries/views/ContentEntriesListLayout.js.map +1 -1
  132. package/presentation/contentEntries/views/ContentEntryFormView.d.ts +2 -2
  133. package/presentation/contentEntries/views/ContentEntryFormView.js +5 -6
  134. package/presentation/contentEntries/views/ContentEntryFormView.js.map +1 -1
  135. package/presentation/contentEntries/views/RevisionDrawer.d.ts +2 -2
  136. package/presentation/contentEntries/views/RevisionsList.d.ts +2 -2
  137. package/presentation/contentEntries/views/SingleEntryLayout.d.ts +2 -2
  138. package/presentation/contentEntries/views/Table/Table.d.ts +2 -2
  139. package/presentation/contentEntries/views/actions/CreateNewRevisionButton.d.ts +2 -2
  140. package/presentation/contentEntries/views/actions/DeleteEntryMenuItem.d.ts +2 -2
  141. package/presentation/contentEntries/views/actions/PublishOnlyButton.d.ts +2 -2
  142. package/presentation/contentEntries/views/actions/RevisionSelector.d.ts +2 -2
  143. package/presentation/contentEntries/views/actions/SaveAndPublishButton.d.ts +2 -2
  144. package/presentation/contentEntries/views/actions/SaveContentButton.d.ts +2 -2
  145. package/presentation/contentEntries/views/actions/ShowRevisionListMenuItem.d.ts +2 -2
  146. package/presentation/contentEntries/views/layout/ContentEntryForm.d.ts +12 -12
  147. package/presentation/contentEntries/views/layout/ContentEntryFormContent.d.ts +10 -6
  148. package/presentation/contentEntries/views/layout/ContentEntryFormContent.js +7 -2
  149. package/presentation/contentEntries/views/layout/ContentEntryFormContent.js.map +1 -1
  150. package/presentation/contentModels/components/CloneContentModelDialog.d.ts +2 -2
  151. package/presentation/contentModels/components/ContentModels.d.ts +2 -2
  152. package/presentation/contentModels/components/ContentModelsDataList.d.ts +2 -2
  153. package/presentation/contentModels/components/NewContentModelDialog.d.ts +2 -2
  154. package/presentation/contentModels/components/fullDelete/types.js.map +1 -1
  155. package/presentation/fieldEditor/FieldEditorPresenter.js +1 -1
  156. package/presentation/fieldEditor/FieldEditorPresenter.js.map +1 -1
  157. package/presentation/fieldEditor/groups/ValidationsGroup.js +1 -1
  158. package/presentation/fieldEditor/groups/ValidationsGroup.js.map +1 -1
  159. package/presentation/fieldEditor/renderers/CmsAccessControlRulesRenderer.js +3 -3
  160. package/presentation/fieldEditor/renderers/CmsAccessControlRulesRenderer.js.map +1 -1
  161. package/presentation/fieldRenderers/ref/CmsRefDetailedMultipleRenderer.js +8 -0
  162. package/presentation/fieldRenderers/ref/CmsRefDetailedMultipleRenderer.js.map +1 -1
  163. package/presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.js +8 -0
  164. package/presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.js.map +1 -1
  165. package/presentation/fieldRenderers/ref/components/EditEntryDrawer.d.ts +10 -0
  166. package/presentation/fieldRenderers/ref/components/EditEntryDrawer.js +94 -0
  167. package/presentation/fieldRenderers/ref/components/EditEntryDrawer.js.map +1 -0
  168. package/presentation/fieldRenderers/ref/components/EntryCard.d.ts +2 -0
  169. package/presentation/fieldRenderers/ref/components/EntryCard.js +13 -3
  170. package/presentation/fieldRenderers/ref/components/EntryCard.js.map +1 -1
  171. package/presentation/fieldRenderers/ref/components/RefFieldOptions.d.ts +2 -2
  172. package/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.d.ts +2 -1
  173. package/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.js +6 -0
  174. package/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.js.map +1 -1
  175. package/presentation/fieldRenderers/ref/detailed/abstractions.d.ts +2 -1
  176. package/presentation/fieldRenderers/ref/detailed/abstractions.js.map +1 -1
  177. package/presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.d.ts +13 -0
  178. package/presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.js +25 -0
  179. package/presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.js.map +1 -0
  180. package/presentation/fieldRenderers/ref/editEntry/abstractions.d.ts +10 -0
  181. package/presentation/fieldRenderers/ref/editEntry/abstractions.js +5 -0
  182. package/presentation/fieldRenderers/ref/editEntry/abstractions.js.map +1 -0
  183. package/presentation/fieldRenderers/ref/editEntry/feature.d.ts +3 -0
  184. package/presentation/fieldRenderers/ref/editEntry/feature.js +17 -0
  185. package/presentation/fieldRenderers/ref/editEntry/feature.js.map +1 -0
  186. package/presentation/fieldTypes/abstractions.d.ts +12 -0
  187. package/presentation/fieldTypes/abstractions.js.map +1 -1
  188. package/presentation/fieldTypes/renderers/common/SelectBoxRenderer.js +1 -1
  189. package/presentation/fieldTypes/renderers/common/SelectBoxRenderer.js.map +1 -1
  190. package/presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.js +6 -2
  191. package/presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.js.map +1 -1
  192. package/presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.js +2 -0
  193. package/presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.js.map +1 -1
  194. package/presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.js +6 -0
  195. package/presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.js.map +1 -1
  196. package/presentation/fieldTypes/types/DynamicZoneFieldType.d.ts +3 -6
  197. package/presentation/fieldTypes/types/DynamicZoneFieldType.js +2 -12
  198. package/presentation/fieldTypes/types/DynamicZoneFieldType.js.map +1 -1
  199. package/presentation/fieldTypes/types/dynamicZone/TemplateDialog.js +25 -3
  200. package/presentation/fieldTypes/types/dynamicZone/TemplateDialog.js.map +1 -1
  201. package/presentation/importContentModels/ImportContentModelsDialog.d.ts +2 -2
  202. package/presentation/importContentModels/components/DataList.d.ts +2 -2
  203. package/presentation/importContentModels/components/FileUpload.d.ts +2 -2
  204. package/presentation/importContentModels/components/Model/DataListModels.d.ts +2 -2
  205. package/presentation/menus/ContentGroupsMenuItems.d.ts +2 -2
  206. package/presentation/modelGroup/ModelGroupPresenter.d.ts +3 -1
  207. package/presentation/modelGroup/ModelGroupPresenter.js +7 -9
  208. package/presentation/modelGroup/ModelGroupPresenter.js.map +1 -1
  209. package/presentation/modelGroup/components/ContentModelGroups.d.ts +2 -2
  210. package/presentation/modelGroup/components/ContentModelGroupsDataList.d.ts +6 -2
  211. package/presentation/modelGroup/components/ContentModelGroupsForm.d.ts +8 -2
@@ -5,10 +5,14 @@ class DynamicZoneRendererImpl {
5
5
  }
6
6
  buildSettingsForm(form) {
7
7
  form.fields((fields)=>({
8
- open: fields.boolean().label("Expand Accordion").defaultValue(false)
8
+ container: fields.boolean().label("Show container").defaultValue(true),
9
+ open: fields.boolean().label("Expand Accordion").defaultValue(false),
10
+ addItemLabel: fields.text().label('"Add Item" button label')
9
11
  }));
10
12
  form.layout((layout)=>[
11
- layout.row("open")
13
+ layout.row("container"),
14
+ layout.row("open"),
15
+ layout.row("addItemLabel")
12
16
  ]);
13
17
  }
14
18
  constructor(){
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass DynamicZoneRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"dynamicZone\";\n formRenderer = \"dynamicZone\";\n name = \"Dynamic Zone\";\n description = \"Renders a dynamic zone.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"dynamicZone\";\n }\n\n buildSettingsForm(form: CmsFieldRenderer.FormBuilder) {\n form.fields(fields => ({\n open: fields.boolean().label(\"Expand Accordion\").defaultValue(false)\n }));\n form.layout(layout => [layout.row(\"open\")]);\n }\n}\n\nexport const DynamicZoneRenderer = CmsFieldRenderer.createImplementation({\n implementation: DynamicZoneRendererImpl,\n dependencies: []\n});\n"],"names":["DynamicZoneRendererImpl","field","form","fields","layout","DynamicZoneRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,kBAAfA,MAAM,IAAI;IACrB;IAEA,kBAAkBC,IAAkC,EAAE;QAClDA,KAAK,MAAM,CAACC,CAAAA,SAAW;gBACnB,MAAMA,OAAO,OAAO,GAAG,KAAK,CAAC,oBAAoB,YAAY,CAAC;YAClE;QACAD,KAAK,MAAM,CAACE,CAAAA,SAAU;gBAACA,OAAO,GAAG,CAAC;aAAQ;IAC9C;;aAdA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAYlB;AAEO,MAAMC,sBAAsBC,iBAAiB,oBAAoB,CAAC;IACrE,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass DynamicZoneRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"dynamicZone\";\n formRenderer = \"dynamicZone\";\n name = \"Dynamic Zone\";\n description = \"Renders a dynamic zone.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"dynamicZone\";\n }\n\n buildSettingsForm(form: CmsFieldRenderer.FormBuilder) {\n form.fields(fields => ({\n container: fields.boolean().label(\"Show container\").defaultValue(true),\n open: fields.boolean().label(\"Expand Accordion\").defaultValue(false),\n addItemLabel: fields.text().label('\"Add Item\" button label')\n }));\n form.layout(layout => [\n layout.row(\"container\"),\n layout.row(\"open\"),\n layout.row(\"addItemLabel\")\n ]);\n }\n}\n\nexport const DynamicZoneRenderer = CmsFieldRenderer.createImplementation({\n implementation: DynamicZoneRendererImpl,\n dependencies: []\n});\n"],"names":["DynamicZoneRendererImpl","field","form","fields","layout","DynamicZoneRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,kBAAfA,MAAM,IAAI;IACrB;IAEA,kBAAkBC,IAAkC,EAAE;QAClDA,KAAK,MAAM,CAACC,CAAAA,SAAW;gBACnB,WAAWA,OAAO,OAAO,GAAG,KAAK,CAAC,kBAAkB,YAAY,CAAC;gBACjE,MAAMA,OAAO,OAAO,GAAG,KAAK,CAAC,oBAAoB,YAAY,CAAC;gBAC9D,cAAcA,OAAO,IAAI,GAAG,KAAK,CAAC;YACtC;QACAD,KAAK,MAAM,CAACE,CAAAA,SAAU;gBAClBA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;aACd;IACL;;aApBA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAkBlB;AAEO,MAAMC,sBAAsBC,iBAAiB,oBAAoB,CAAC;IACrE,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
@@ -5,9 +5,11 @@ class ObjectAccordionRendererImpl {
5
5
  }
6
6
  buildSettingsForm(form) {
7
7
  form.fields((fields)=>({
8
+ container: fields.boolean().label("Show container").defaultValue(true),
8
9
  open: fields.boolean().label("Expand Accordion").defaultValue(false)
9
10
  }));
10
11
  form.layout((layout)=>[
12
+ layout.row("container"),
11
13
  layout.row("open")
12
14
  ]);
13
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass ObjectAccordionRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"object-accordion\";\n formRenderer = \"objectAccordionSingle\";\n name = \"Accordion\";\n description = \"Renders fields within an accordion.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"object\" && !field.list;\n }\n\n buildSettingsForm(form: CmsFieldRenderer.FormBuilder) {\n form.fields(fields => ({\n open: fields.boolean().label(\"Expand Accordion\").defaultValue(false)\n }));\n form.layout(layout => [layout.row(\"open\")]);\n }\n}\n\nexport const ObjectAccordionRenderer = CmsFieldRenderer.createImplementation({\n implementation: ObjectAccordionRendererImpl,\n dependencies: []\n});\n"],"names":["ObjectAccordionRendererImpl","field","form","fields","layout","ObjectAccordionRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,aAAfA,MAAM,IAAI,IAAiB,CAACA,MAAM,IAAI;IACjD;IAEA,kBAAkBC,IAAkC,EAAE;QAClDA,KAAK,MAAM,CAACC,CAAAA,SAAW;gBACnB,MAAMA,OAAO,OAAO,GAAG,KAAK,CAAC,oBAAoB,YAAY,CAAC;YAClE;QACAD,KAAK,MAAM,CAACE,CAAAA,SAAU;gBAACA,OAAO,GAAG,CAAC;aAAQ;IAC9C;;aAdA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAYlB;AAEO,MAAMC,0BAA0BC,iBAAiB,oBAAoB,CAAC;IACzE,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass ObjectAccordionRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"object-accordion\";\n formRenderer = \"objectAccordionSingle\";\n name = \"Accordion\";\n description = \"Renders fields within an accordion.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"object\" && !field.list;\n }\n\n buildSettingsForm(form: CmsFieldRenderer.FormBuilder) {\n form.fields(fields => ({\n container: fields.boolean().label(\"Show container\").defaultValue(true),\n open: fields.boolean().label(\"Expand Accordion\").defaultValue(false)\n }));\n form.layout(layout => [layout.row(\"container\"), layout.row(\"open\")]);\n }\n}\n\nexport const ObjectAccordionRenderer = CmsFieldRenderer.createImplementation({\n implementation: ObjectAccordionRendererImpl,\n dependencies: []\n});\n"],"names":["ObjectAccordionRendererImpl","field","form","fields","layout","ObjectAccordionRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,aAAfA,MAAM,IAAI,IAAiB,CAACA,MAAM,IAAI;IACjD;IAEA,kBAAkBC,IAAkC,EAAE;QAClDA,KAAK,MAAM,CAACC,CAAAA,SAAW;gBACnB,WAAWA,OAAO,OAAO,GAAG,KAAK,CAAC,kBAAkB,YAAY,CAAC;gBACjE,MAAMA,OAAO,OAAO,GAAG,KAAK,CAAC,oBAAoB,YAAY,CAAC;YAClE;QACAD,KAAK,MAAM,CAACE,CAAAA,SAAU;gBAACA,OAAO,GAAG,CAAC;gBAAcA,OAAO,GAAG,CAAC;aAAQ;IACvE;;aAfA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAalB;AAEO,MAAMC,0BAA0BC,iBAAiB,oBAAoB,CAAC;IACzE,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
@@ -5,11 +5,17 @@ class ObjectsAccordionRendererImpl {
5
5
  }
6
6
  buildSettingsForm(form) {
7
7
  form.fields((fields)=>({
8
+ container: fields.boolean().label("Show container").defaultValue(true),
8
9
  addItemLabel: fields.text().label('"Add Item" button label'),
10
+ itemTitle: fields.text().label("Item title").placeholder("Field ID to use as item title").help("The field ID whose value will be displayed as the accordion item title."),
11
+ itemDescription: fields.text().label("Item description").placeholder("Field ID to use as item description").help("The field ID whose value will be displayed as the accordion item description."),
9
12
  open: fields.boolean().label("Expand Accordion").defaultValue(false)
10
13
  }));
11
14
  form.layout((layout)=>[
15
+ layout.row("container"),
12
16
  layout.row("addItemLabel"),
17
+ layout.row("itemTitle"),
18
+ layout.row("itemDescription"),
13
19
  layout.row("open")
14
20
  ]);
15
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass ObjectsAccordionRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"objects-accordion\";\n formRenderer = \"objectAccordionMultiple\";\n name = \"Accordion\";\n description = \"Renders fields within an accordion.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"object\" && !!field.list;\n }\n\n buildSettingsForm(form: CmsFieldRenderer.FormBuilder) {\n form.fields(fields => ({\n addItemLabel: fields.text().label('\"Add Item\" button label'),\n open: fields.boolean().label(\"Expand Accordion\").defaultValue(false)\n }));\n form.layout(layout => [layout.row(\"addItemLabel\"), layout.row(\"open\")]);\n }\n}\n\nexport const ObjectsAccordionRenderer = CmsFieldRenderer.createImplementation({\n implementation: ObjectsAccordionRendererImpl,\n dependencies: []\n});\n"],"names":["ObjectsAccordionRendererImpl","field","form","fields","layout","ObjectsAccordionRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,aAAfA,MAAM,IAAI,IAAiB,CAAC,CAACA,MAAM,IAAI;IAClD;IAEA,kBAAkBC,IAAkC,EAAE;QAClDA,KAAK,MAAM,CAACC,CAAAA,SAAW;gBACnB,cAAcA,OAAO,IAAI,GAAG,KAAK,CAAC;gBAClC,MAAMA,OAAO,OAAO,GAAG,KAAK,CAAC,oBAAoB,YAAY,CAAC;YAClE;QACAD,KAAK,MAAM,CAACE,CAAAA,SAAU;gBAACA,OAAO,GAAG,CAAC;gBAAiBA,OAAO,GAAG,CAAC;aAAQ;IAC1E;;aAfA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAalB;AAEO,MAAMC,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass ObjectsAccordionRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"objects-accordion\";\n formRenderer = \"objectAccordionMultiple\";\n name = \"Accordion\";\n description = \"Renders fields within an accordion.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"object\" && !!field.list;\n }\n\n buildSettingsForm(form: CmsFieldRenderer.FormBuilder) {\n form.fields(fields => ({\n container: fields.boolean().label(\"Show container\").defaultValue(true),\n addItemLabel: fields.text().label('\"Add Item\" button label'),\n itemTitle: fields\n .text()\n .label(\"Item title\")\n .placeholder(\"Field ID to use as item title\")\n .help(\"The field ID whose value will be displayed as the accordion item title.\"),\n itemDescription: fields\n .text()\n .label(\"Item description\")\n .placeholder(\"Field ID to use as item description\")\n .help(\n \"The field ID whose value will be displayed as the accordion item description.\"\n ),\n open: fields.boolean().label(\"Expand Accordion\").defaultValue(false)\n }));\n form.layout(layout => [\n layout.row(\"container\"),\n layout.row(\"addItemLabel\"),\n layout.row(\"itemTitle\"),\n layout.row(\"itemDescription\"),\n layout.row(\"open\")\n ]);\n }\n}\n\nexport const ObjectsAccordionRenderer = CmsFieldRenderer.createImplementation({\n implementation: ObjectsAccordionRendererImpl,\n dependencies: []\n});\n"],"names":["ObjectsAccordionRendererImpl","field","form","fields","layout","ObjectsAccordionRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,aAAfA,MAAM,IAAI,IAAiB,CAAC,CAACA,MAAM,IAAI;IAClD;IAEA,kBAAkBC,IAAkC,EAAE;QAClDA,KAAK,MAAM,CAACC,CAAAA,SAAW;gBACnB,WAAWA,OAAO,OAAO,GAAG,KAAK,CAAC,kBAAkB,YAAY,CAAC;gBACjE,cAAcA,OAAO,IAAI,GAAG,KAAK,CAAC;gBAClC,WAAWA,OACN,IAAI,GACJ,KAAK,CAAC,cACN,WAAW,CAAC,iCACZ,IAAI,CAAC;gBACV,iBAAiBA,OACZ,IAAI,GACJ,KAAK,CAAC,oBACN,WAAW,CAAC,uCACZ,IAAI,CACD;gBAER,MAAMA,OAAO,OAAO,GAAG,KAAK,CAAC,oBAAoB,YAAY,CAAC;YAClE;QACAD,KAAK,MAAM,CAACE,CAAAA,SAAU;gBAClBA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;aACd;IACL;;aAlCA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAgClB;AAEO,MAAMC,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  import { CmsFieldType } from "../abstractions.js";
3
3
  import type { CmsModelField } from "../../../types.js";
4
- import type { CmsModelFieldValidatorsGroup } from "../abstractions.js";
5
4
  declare class DynamicZoneFieldTypeImpl implements CmsFieldType.Interface {
6
5
  type: string;
7
6
  label: string;
@@ -10,18 +9,16 @@ declare class DynamicZoneFieldTypeImpl implements CmsFieldType.Interface {
10
9
  allowList: boolean;
11
10
  listLabel: string;
12
11
  allowPredefinedValues: boolean;
13
- validators: (field: CmsModelField) => string[] | {
12
+ validators: (field: CmsModelField) => string[];
13
+ listValidators: {
14
14
  validators: string[];
15
15
  title: string;
16
16
  description: string;
17
17
  };
18
- listValidators: CmsModelFieldValidatorsGroup;
19
18
  renderEditor(): React.JSX.Element;
20
19
  createField(): {
21
20
  type: string;
22
- listValidation: {
23
- name: string;
24
- }[];
21
+ listValidation: never[];
25
22
  renderer: {
26
23
  name: string;
27
24
  };
@@ -17,11 +17,7 @@ class DynamicZoneFieldTypeImpl {
17
17
  createField() {
18
18
  return {
19
19
  type: this.type,
20
- listValidation: [
21
- {
22
- name: "dynamicZone"
23
- }
24
- ],
20
+ listValidation: [],
25
21
  renderer: {
26
22
  name: "dynamicZone"
27
23
  },
@@ -39,13 +35,7 @@ class DynamicZoneFieldTypeImpl {
39
35
  this.listLabel = "Use as a list of values";
40
36
  this.allowPredefinedValues = false;
41
37
  this.validators = (field)=>{
42
- if (field.list) return {
43
- validators: [
44
- "dynamicZone"
45
- ],
46
- title: "Template Validators",
47
- description: "Validators for each of the templates in this dynamic zone."
48
- };
38
+ if (field.list) return [];
49
39
  return [
50
40
  "required"
51
41
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldTypes/types/DynamicZoneFieldType.js","sources":["../../../../src/presentation/fieldTypes/types/DynamicZoneFieldType.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as DynamicZoneIcon } from \"@webiny/icons/dynamic_form.svg\";\nimport { CmsFieldType } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { CmsModelFieldValidatorsGroup } from \"../abstractions.js\";\nimport { DynamicZone } from \"./dynamicZone/DynamicZone.js\";\n\nconst listValidators: CmsModelFieldValidatorsGroup = {\n validators: [\"minLength\", \"maxLength\"],\n title: \"List validators\",\n description: \"These validators are applied to the entire dynamic zone.\"\n};\n\nclass DynamicZoneFieldTypeImpl implements CmsFieldType.Interface {\n type = \"dynamicZone\";\n label = \"Dynamic Zone\";\n description = \"Define content templates to be used during content creation.\";\n icon = <DynamicZoneIcon />;\n allowList = true;\n listLabel = \"Use as a list of values\";\n allowPredefinedValues = false;\n validators = (field: CmsModelField) => {\n if (field.list) {\n return {\n validators: [\"dynamicZone\"],\n title: \"Template Validators\",\n description: \"Validators for each of the templates in this dynamic zone.\"\n };\n }\n return [\"required\"];\n };\n listValidators = listValidators;\n\n renderEditor() {\n return <DynamicZone />;\n }\n\n createField() {\n return {\n type: this.type,\n listValidation: [{ name: \"dynamicZone\" }],\n renderer: { name: \"dynamicZone\" },\n settings: { templates: [] }\n };\n }\n}\n\nexport const DynamicZoneFieldType = CmsFieldType.createImplementation({\n implementation: DynamicZoneFieldTypeImpl,\n dependencies: []\n});\n"],"names":["listValidators","DynamicZoneFieldTypeImpl","DynamicZone","DynamicZoneIcon","field","DynamicZoneFieldType","CmsFieldType"],"mappings":";;;;AAOA,MAAMA,iBAA+C;IACjD,YAAY;QAAC;QAAa;KAAY;IACtC,OAAO;IACP,aAAa;AACjB;AAEA,MAAMC;IAoBF,eAAe;QACX,OAAO,WAAP,GAAO,oBAACC,aAAWA;IACvB;IAEA,cAAc;QACV,OAAO;YACH,MAAM,IAAI,CAAC,IAAI;YACf,gBAAgB;gBAAC;oBAAE,MAAM;gBAAc;aAAE;YACzC,UAAU;gBAAE,MAAM;YAAc;YAChC,UAAU;gBAAE,WAAW,EAAE;YAAC;QAC9B;IACJ;;aA9BA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAAG;aACd,IAAI,GAAG,WAAP,GAAO,oBAACC,gBAAeA;aACvB,SAAS,GAAG;aACZ,SAAS,GAAG;aACZ,qBAAqB,GAAG;aACxB,UAAU,GAAG,CAACC;YACV,IAAIA,MAAM,IAAI,EACV,OAAO;gBACH,YAAY;oBAAC;iBAAc;gBAC3B,OAAO;gBACP,aAAa;YACjB;YAEJ,OAAO;gBAAC;aAAW;QACvB;aACA,cAAc,GAAGJ;;AAcrB;AAEO,MAAMK,uBAAuBC,aAAa,oBAAoB,CAAC;IAClE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"presentation/fieldTypes/types/DynamicZoneFieldType.js","sources":["../../../../src/presentation/fieldTypes/types/DynamicZoneFieldType.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as DynamicZoneIcon } from \"@webiny/icons/dynamic_form.svg\";\nimport { CmsFieldType } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { DynamicZone } from \"./dynamicZone/DynamicZone.js\";\n\nconst listValidators = {\n validators: [\"minLength\", \"maxLength\"],\n title: \"List validators\",\n description: \"These validators are applied to the entire dynamic zone.\"\n};\n\nclass DynamicZoneFieldTypeImpl implements CmsFieldType.Interface {\n type = \"dynamicZone\";\n label = \"Dynamic Zone\";\n description = \"Define content templates to be used during content creation.\";\n icon = <DynamicZoneIcon />;\n allowList = true;\n listLabel = \"Use as a list of values\";\n allowPredefinedValues = false;\n validators = (field: CmsModelField) => {\n if (field.list) {\n return [];\n }\n return [\"required\"];\n };\n listValidators = listValidators;\n\n renderEditor() {\n return <DynamicZone />;\n }\n\n createField() {\n return {\n type: this.type,\n listValidation: [],\n renderer: { name: \"dynamicZone\" },\n settings: { templates: [] }\n };\n }\n}\n\nexport const DynamicZoneFieldType = CmsFieldType.createImplementation({\n implementation: DynamicZoneFieldTypeImpl,\n dependencies: []\n});\n"],"names":["listValidators","DynamicZoneFieldTypeImpl","DynamicZone","DynamicZoneIcon","field","DynamicZoneFieldType","CmsFieldType"],"mappings":";;;;AAMA,MAAMA,iBAAiB;IACnB,YAAY;QAAC;QAAa;KAAY;IACtC,OAAO;IACP,aAAa;AACjB;AAEA,MAAMC;IAgBF,eAAe;QACX,OAAO,WAAP,GAAO,oBAACC,aAAWA;IACvB;IAEA,cAAc;QACV,OAAO;YACH,MAAM,IAAI,CAAC,IAAI;YACf,gBAAgB,EAAE;YAClB,UAAU;gBAAE,MAAM;YAAc;YAChC,UAAU;gBAAE,WAAW,EAAE;YAAC;QAC9B;IACJ;;aA1BA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAAG;aACd,IAAI,GAAG,WAAP,GAAO,oBAACC,gBAAeA;aACvB,SAAS,GAAG;aACZ,SAAS,GAAG;aACZ,qBAAqB,GAAG;aACxB,UAAU,GAAG,CAACC;YACV,IAAIA,MAAM,IAAI,EACV,OAAO,EAAE;YAEb,OAAO;gBAAC;aAAW;QACvB;aACA,cAAc,GAAGJ;;AAcrB;AAEO,MAAMK,uBAAuBC,aAAa,oBAAoB,CAAC;IAClE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
@@ -3,7 +3,8 @@ import { Form } from "@webiny/form";
3
3
  import { validation } from "@webiny/validation";
4
4
  import { generateAlphaNumericLowerCaseId } from "@webiny/utils";
5
5
  import { IconPicker } from "../../../../admin/components/IconPicker.js";
6
- import { Alert, Dialog, Grid, Input, Tags, Textarea } from "@webiny/admin-ui";
6
+ import { Alert, Dialog, Grid, Input, Select, Tags, Textarea } from "@webiny/admin-ui";
7
+ import { useLivePreviewPresenter } from "../../../contentEntries/preview/useLivePreviewPresenter.js";
7
8
  const typeNameValidator = (value)=>{
8
9
  const regex = new RegExp("^[A-Z]+[_0-9A-Za-z]+$");
9
10
  if (regex.test(value)) return true;
@@ -15,6 +16,9 @@ const getGraphQLTypeName = (value)=>{
15
16
  };
16
17
  const TemplateDialog = (props)=>{
17
18
  const [showWarning, setWarning] = useState(false);
19
+ const livePreview = useLivePreviewPresenter();
20
+ const components = livePreview.vm.components;
21
+ console.log("[TemplateDialog] components:", components.length, components);
18
22
  const newTemplate = !props.template;
19
23
  const dialogTitle = newTemplate ? "Add Template" : "Edit Template";
20
24
  const submitLabel = newTemplate ? "Add Template" : "Update Template";
@@ -53,7 +57,7 @@ const TemplateDialog = (props)=>{
53
57
  onSubmit: onSubmit,
54
58
  data: props.template,
55
59
  onChange: onFormChange
56
- }, ({ Bind, submit, form })=>/*#__PURE__*/ react.createElement(Dialog, {
60
+ }, ({ Bind, submit, form, data: formData })=>/*#__PURE__*/ react.createElement(Dialog, {
57
61
  open: true,
58
62
  onClose: props.onClose,
59
63
  title: dialogTitle,
@@ -114,7 +118,25 @@ const TemplateDialog = (props)=>{
114
118
  defaultValue: []
115
119
  }, /*#__PURE__*/ react.createElement(Tags, {
116
120
  label: "Tags"
117
- }))))));
121
+ }))), components.length > 0 ? /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Grid.Column, {
122
+ span: 12
123
+ }, /*#__PURE__*/ react.createElement(Bind, {
124
+ name: "componentName"
125
+ }, /*#__PURE__*/ react.createElement(Select, {
126
+ label: "Frontend Component",
127
+ description: "Select the frontend component that renders this template.",
128
+ note: components.find((c)=>c.name === formData.componentName)?.description,
129
+ options: [
130
+ {
131
+ value: "",
132
+ label: "None"
133
+ },
134
+ ...components.map((c)=>({
135
+ value: c.name,
136
+ label: c.label
137
+ }))
138
+ ]
139
+ })))) : null)));
118
140
  };
119
141
  export { TemplateDialog };
120
142
 
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldTypes/types/dynamicZone/TemplateDialog.js","sources":["../../../../../src/presentation/fieldTypes/types/dynamicZone/TemplateDialog.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport type { FormAPI, FormOnSubmit } from \"@webiny/form\";\nimport { Form } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport type { CmsDynamicZoneTemplate } from \"~/types.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils\";\nimport { IconPicker } from \"~/admin/components/IconPicker.js\";\nimport { Tags } from \"@webiny/admin-ui\";\nimport { Alert, Dialog, Grid, Input, Textarea } from \"@webiny/admin-ui\";\n\nconst typeNameValidator = (value: string) => {\n const regex = new RegExp(\"^[A-Z]+[_0-9A-Za-z]+$\");\n if (regex.test(value)) {\n return true;\n }\n\n throw Error(\n `Must start with a capital letter, may contain numbers, and must not contain spaces.`\n );\n};\n\nconst getGraphQLTypeName = (value: string) => {\n const titleCase = value.charAt(0).toUpperCase() + value.slice(1);\n return titleCase.replace(/[^a-zA-Z0-9]/g, \"\");\n};\n\ninterface TemplateDialogProps {\n onClose: () => void;\n template?: CmsDynamicZoneTemplate;\n onTemplate: (template: CmsDynamicZoneTemplate) => void;\n}\n\nexport const TemplateDialog = (props: TemplateDialogProps) => {\n const [showWarning, setWarning] = useState(false);\n const newTemplate = !props.template;\n const dialogTitle = newTemplate ? \"Add Template\" : \"Edit Template\";\n const submitLabel = newTemplate ? \"Add Template\" : \"Update Template\";\n\n const onSubmit: FormOnSubmit<CmsDynamicZoneTemplate> = template => {\n if (template.id) {\n props.onTemplate(template);\n } else {\n props.onTemplate({\n ...template,\n id: generateAlphaNumericLowerCaseId(),\n fields: [],\n layout: []\n });\n }\n props.onClose();\n };\n\n const showGqlTypeNameWarning = () => {\n setWarning(true);\n };\n\n const hideGqlTypeNameWarning = () => {\n setWarning(false);\n };\n\n const checkGqlType: FormOnSubmit<CmsDynamicZoneTemplate> = data => {\n if (newTemplate) {\n return;\n }\n\n if (data.gqlTypeName !== props.template?.gqlTypeName) {\n showGqlTypeNameWarning();\n } else {\n hideGqlTypeNameWarning();\n }\n };\n\n const nameOnBlur = (form: FormAPI<CmsDynamicZoneTemplate>) => () => {\n if (!form.data.gqlTypeName) {\n /**\n * There is a possibility that name is undefined, so let's check for it.\n */\n const name = form.data.name;\n if (!name) {\n return;\n }\n form.setValue(\"gqlTypeName\", getGraphQLTypeName(name));\n }\n };\n\n const onFormChange: FormOnSubmit<CmsDynamicZoneTemplate> = (data, form) => {\n checkGqlType(data, form);\n };\n\n return (\n <Form<CmsDynamicZoneTemplate>\n onSubmit={onSubmit}\n data={props.template}\n onChange={onFormChange}\n >\n {({ Bind, submit, form }) => (\n <Dialog\n open={true}\n onClose={props.onClose}\n title={dialogTitle}\n actions={\n <>\n <Dialog.CancelAction />\n <Dialog.ConfirmAction onClick={submit} text={submitLabel} />\n </>\n }\n >\n <Grid>\n <>\n {showWarning ? (\n <Grid.Column span={12}>\n <Alert title={\"GraphQL Schema Change\"} type={\"danger\"}>\n You&apos;ve changed the GraphQL schema type name! If your\n API is being queried by a 3rd party application, this will\n affect the GraphQL queries in those applications. Make sure\n your consumers are informed about this change!\n </Alert>\n </Grid.Column>\n ) : null}\n </>\n <Grid.Column span={12}>\n <Bind name={\"name\"} validators={[validation.create(\"required\")]}>\n <Input label={\"Name\"} onBlur={nameOnBlur(form)} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name={\"gqlTypeName\"}\n validators={[validation.create(\"required\"), typeNameValidator]}\n >\n <Input\n autoFocus={false}\n label={\"GraphQL Type Name\"}\n description={\n \"This string will be used to generate the GraphQL schema. \"\n }\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"icon\"} validators={[validation.create(\"required\")]}>\n <IconPicker label={\"Icon\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"description\"} validators={[validation.create(\"required\")]}>\n <Textarea rows={3} label={\"Description\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"tags\"} defaultValue={[]}>\n <Tags label={\"Tags\"} />\n </Bind>\n </Grid.Column>\n </Grid>\n </Dialog>\n )}\n </Form>\n );\n};\n"],"names":["typeNameValidator","value","regex","RegExp","Error","getGraphQLTypeName","titleCase","TemplateDialog","props","showWarning","setWarning","useState","newTemplate","dialogTitle","submitLabel","onSubmit","template","generateAlphaNumericLowerCaseId","showGqlTypeNameWarning","hideGqlTypeNameWarning","checkGqlType","data","nameOnBlur","form","name","onFormChange","Form","Bind","submit","Dialog","Grid","Alert","validation","Input","IconPicker","Textarea","Tags"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/fieldTypes/types/dynamicZone/TemplateDialog.js","sources":["../../../../../src/presentation/fieldTypes/types/dynamicZone/TemplateDialog.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport type { FormAPI, FormOnSubmit } from \"@webiny/form\";\nimport { Form } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport type { CmsDynamicZoneTemplate } from \"~/types.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils\";\nimport { IconPicker } from \"~/admin/components/IconPicker.js\";\nimport { Tags } from \"@webiny/admin-ui\";\nimport { Alert, Dialog, Grid, Input, Select, Textarea } from \"@webiny/admin-ui\";\nimport { useLivePreviewPresenter } from \"~/presentation/contentEntries/preview/useLivePreviewPresenter.js\";\n\nconst typeNameValidator = (value: string) => {\n const regex = new RegExp(\"^[A-Z]+[_0-9A-Za-z]+$\");\n if (regex.test(value)) {\n return true;\n }\n\n throw Error(\n `Must start with a capital letter, may contain numbers, and must not contain spaces.`\n );\n};\n\nconst getGraphQLTypeName = (value: string) => {\n const titleCase = value.charAt(0).toUpperCase() + value.slice(1);\n return titleCase.replace(/[^a-zA-Z0-9]/g, \"\");\n};\n\ninterface TemplateDialogProps {\n onClose: () => void;\n template?: CmsDynamicZoneTemplate;\n onTemplate: (template: CmsDynamicZoneTemplate) => void;\n}\n\nexport const TemplateDialog = (props: TemplateDialogProps) => {\n const [showWarning, setWarning] = useState(false);\n const livePreview = useLivePreviewPresenter();\n const components = livePreview.vm.components;\n console.log(\"[TemplateDialog] components:\", components.length, components);\n const newTemplate = !props.template;\n const dialogTitle = newTemplate ? \"Add Template\" : \"Edit Template\";\n const submitLabel = newTemplate ? \"Add Template\" : \"Update Template\";\n\n const onSubmit: FormOnSubmit<CmsDynamicZoneTemplate> = template => {\n if (template.id) {\n props.onTemplate(template);\n } else {\n props.onTemplate({\n ...template,\n id: generateAlphaNumericLowerCaseId(),\n fields: [],\n layout: []\n });\n }\n props.onClose();\n };\n\n const showGqlTypeNameWarning = () => {\n setWarning(true);\n };\n\n const hideGqlTypeNameWarning = () => {\n setWarning(false);\n };\n\n const checkGqlType: FormOnSubmit<CmsDynamicZoneTemplate> = data => {\n if (newTemplate) {\n return;\n }\n\n if (data.gqlTypeName !== props.template?.gqlTypeName) {\n showGqlTypeNameWarning();\n } else {\n hideGqlTypeNameWarning();\n }\n };\n\n const nameOnBlur = (form: FormAPI<CmsDynamicZoneTemplate>) => () => {\n if (!form.data.gqlTypeName) {\n const name = form.data.name;\n if (!name) {\n return;\n }\n form.setValue(\"gqlTypeName\", getGraphQLTypeName(name));\n }\n };\n\n const onFormChange: FormOnSubmit<CmsDynamicZoneTemplate> = (data, form) => {\n checkGqlType(data, form);\n };\n\n return (\n <Form<CmsDynamicZoneTemplate>\n onSubmit={onSubmit}\n data={props.template}\n onChange={onFormChange}\n >\n {({ Bind, submit, form, data: formData }) => (\n <Dialog\n open={true}\n onClose={props.onClose}\n title={dialogTitle}\n actions={\n <>\n <Dialog.CancelAction />\n <Dialog.ConfirmAction onClick={submit} text={submitLabel} />\n </>\n }\n >\n <Grid>\n <>\n {showWarning ? (\n <Grid.Column span={12}>\n <Alert title={\"GraphQL Schema Change\"} type={\"danger\"}>\n You&apos;ve changed the GraphQL schema type name! If your\n API is being queried by a 3rd party application, this will\n affect the GraphQL queries in those applications. Make sure\n your consumers are informed about this change!\n </Alert>\n </Grid.Column>\n ) : null}\n </>\n <Grid.Column span={12}>\n <Bind name={\"name\"} validators={[validation.create(\"required\")]}>\n <Input label={\"Name\"} onBlur={nameOnBlur(form)} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name={\"gqlTypeName\"}\n validators={[validation.create(\"required\"), typeNameValidator]}\n >\n <Input\n autoFocus={false}\n label={\"GraphQL Type Name\"}\n description={\n \"This string will be used to generate the GraphQL schema. \"\n }\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"icon\"} validators={[validation.create(\"required\")]}>\n <IconPicker label={\"Icon\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"description\"} validators={[validation.create(\"required\")]}>\n <Textarea rows={3} label={\"Description\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"tags\"} defaultValue={[]}>\n <Tags label={\"Tags\"} />\n </Bind>\n </Grid.Column>\n {components.length > 0 ? (\n <>\n <Grid.Column span={12}>\n <Bind name={\"componentName\"}>\n <Select\n label={\"Frontend Component\"}\n description={\n \"Select the frontend component that renders this template.\"\n }\n note={\n components.find(\n c => c.name === formData.componentName\n )?.description\n }\n options={[\n { value: \"\", label: \"None\" },\n ...components.map(c => ({\n value: c.name,\n label: c.label\n }))\n ]}\n />\n </Bind>\n </Grid.Column>\n </>\n ) : null}\n </Grid>\n </Dialog>\n )}\n </Form>\n );\n};\n"],"names":["typeNameValidator","value","regex","RegExp","Error","getGraphQLTypeName","titleCase","TemplateDialog","props","showWarning","setWarning","useState","livePreview","useLivePreviewPresenter","components","console","newTemplate","dialogTitle","submitLabel","onSubmit","template","generateAlphaNumericLowerCaseId","showGqlTypeNameWarning","hideGqlTypeNameWarning","checkGqlType","data","nameOnBlur","form","name","onFormChange","Form","Bind","submit","formData","Dialog","Grid","Alert","validation","Input","IconPicker","Textarea","Tags","Select","c"],"mappings":"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"}
@@ -2,6 +2,6 @@ import React from "react";
2
2
  export interface ImportContentModelsDialogProps {
3
3
  onClose: () => void;
4
4
  }
5
- export declare const ImportContentModelsDialog: ((props: ImportContentModelsDialogProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const ImportContentModelsDialog: ((props: ImportContentModelsDialogProps) => React.JSX.Element) & React.NamedExoticComponent<ImportContentModelsDialogProps> & {
6
+ readonly type: (props: ImportContentModelsDialogProps) => React.JSX.Element;
7
7
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const DataList: (() => React.JSX.Element | null) & {
3
- displayName: string;
2
+ export declare const DataList: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const FileUpload: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const FileUpload: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -3,7 +3,7 @@ import type { ImportModelData } from "../../types.js";
3
3
  interface DataListModelsProps {
4
4
  models: ImportModelData[];
5
5
  }
6
- export declare const DataListModels: (({ models }: DataListModelsProps) => React.JSX.Element) & {
7
- displayName: string;
6
+ export declare const DataListModels: (({ models }: DataListModelsProps) => React.JSX.Element) & React.NamedExoticComponent<DataListModelsProps> & {
7
+ readonly type: ({ models }: DataListModelsProps) => React.JSX.Element;
8
8
  };
9
9
  export {};
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const ContentGroupsMenuItems: (() => React.JSX.Element | null) & {
3
- displayName: string;
2
+ export declare const ContentGroupsMenuItems: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
4
  };
@@ -1,3 +1,4 @@
1
+ import { StringFormatter } from "@webiny/app-admin/features/stringFormatter/abstractions.js";
1
2
  import { ListPresenter } from "@webiny/app-admin/presentation/listPresenter/abstractions.js";
2
3
  import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
3
4
  import type { ModelGroupDto } from "../../features/modelGroup/listModelGroups/abstractions.js";
@@ -17,12 +18,13 @@ declare class ModelGroupPresenterImpl implements IModelGroupPresenter {
17
18
  private updateModelGroupUseCase;
18
19
  private deleteModelGroupUseCase;
19
20
  private cache;
21
+ private stringFormatter;
20
22
  private selectedGroup;
21
23
  private loading;
22
24
  private saving;
23
25
  private showForm;
24
26
  private form;
25
- constructor(listPresenter: ListPresenter.Interface<ModelGroupDto>, formModelFactory: FormModelFactory.Interface, listModelGroupsUseCase: ListModelGroupsUseCase.Interface, getRoleUseCase: GetModelGroupUseCase.Interface, createModelGroupUseCase: CreateModelGroupUseCase.Interface, updateModelGroupUseCase: UpdateModelGroupUseCase.Interface, deleteModelGroupUseCase: DeleteModelGroupUseCase.Interface, cache: ModelGroupsCache.Interface);
27
+ constructor(listPresenter: ListPresenter.Interface<ModelGroupDto>, formModelFactory: FormModelFactory.Interface, listModelGroupsUseCase: ListModelGroupsUseCase.Interface, getRoleUseCase: GetModelGroupUseCase.Interface, createModelGroupUseCase: CreateModelGroupUseCase.Interface, updateModelGroupUseCase: UpdateModelGroupUseCase.Interface, deleteModelGroupUseCase: DeleteModelGroupUseCase.Interface, cache: ModelGroupsCache.Interface, stringFormatter: StringFormatter.Interface);
26
28
  get vm(): IModelGroupPresenterViewModel;
27
29
  get list(): ListPresenter.Interface<ModelGroupDto>;
28
30
  init(): void;
@@ -1,5 +1,5 @@
1
1
  import { computed, makeAutoObservable, runInAction } from "mobx";
2
- import slugify from "slugify";
2
+ import { StringFormatter } from "@webiny/app-admin/features/stringFormatter/abstractions.js";
3
3
  import { ListPresenter } from "@webiny/app-admin/presentation/listPresenter/abstractions.js";
4
4
  import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
5
5
  import { ListModelGroupsUseCase } from "../../features/modelGroup/listModelGroups/abstractions.js";
@@ -22,7 +22,7 @@ function toIconValue(name) {
22
22
  };
23
23
  }
24
24
  class ModelGroupPresenterImpl {
25
- constructor(listPresenter, formModelFactory, listModelGroupsUseCase, getRoleUseCase, createModelGroupUseCase, updateModelGroupUseCase, deleteModelGroupUseCase, cache){
25
+ constructor(listPresenter, formModelFactory, listModelGroupsUseCase, getRoleUseCase, createModelGroupUseCase, updateModelGroupUseCase, deleteModelGroupUseCase, cache, stringFormatter){
26
26
  this.listPresenter = listPresenter;
27
27
  this.formModelFactory = formModelFactory;
28
28
  this.listModelGroupsUseCase = listModelGroupsUseCase;
@@ -31,6 +31,7 @@ class ModelGroupPresenterImpl {
31
31
  this.updateModelGroupUseCase = updateModelGroupUseCase;
32
32
  this.deleteModelGroupUseCase = deleteModelGroupUseCase;
33
33
  this.cache = cache;
34
+ this.stringFormatter = stringFormatter;
34
35
  this.selectedGroup = null;
35
36
  this.loading = false;
36
37
  this.saving = false;
@@ -44,6 +45,7 @@ class ModelGroupPresenterImpl {
44
45
  updateModelGroupUseCase: false,
45
46
  deleteModelGroupUseCase: false,
46
47
  cache: false,
48
+ stringFormatter: false,
47
49
  vm: computed
48
50
  });
49
51
  }
@@ -176,12 +178,7 @@ class ModelGroupPresenterImpl {
176
178
  name: fields.text().label("Name").required("Name is required.").disabled(!canModify).onBlur((value, { form })=>{
177
179
  const slugValue = form.field("slug").getValue();
178
180
  if (slugValue || !value) return;
179
- form.field("slug").setValue(slugify(String(value), {
180
- replacement: "-",
181
- lower: true,
182
- remove: /[*#?<>_{}[\]+~.()'"!:;@]/g,
183
- trim: false
184
- }));
181
+ form.field("slug").setValue(this.stringFormatter.slugify(String(value)));
185
182
  }),
186
183
  slug: fields.text().label("Slug").required("Slug is required.").disabled(!isNew || !canModify),
187
184
  icon: fields.text().label("Group icon").required("Icon is required.").disabled(!canModify).renderer("cmsIconPicker"),
@@ -206,7 +203,8 @@ const ModelGroupPresenter_ModelGroupPresenter = ModelGroupPresenter.createImplem
206
203
  CreateModelGroupUseCase,
207
204
  UpdateModelGroupUseCase,
208
205
  DeleteModelGroupUseCase,
209
- ModelGroupsCache
206
+ ModelGroupsCache,
207
+ StringFormatter
210
208
  ]
211
209
  });
212
210
  export { ModelGroupPresenter_ModelGroupPresenter as ModelGroupPresenter };
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/modelGroup/ModelGroupPresenter.js","sources":["../../../src/presentation/modelGroup/ModelGroupPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { ModelGroupDto } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { ListModelGroupsUseCase } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { GetModelGroupUseCase } from \"~/features/modelGroup/getModelGroup/abstractions.js\";\nimport { CreateModelGroupUseCase } from \"~/features/modelGroup/createModelGroup/abstractions.js\";\nimport { UpdateModelGroupUseCase } from \"~/features/modelGroup/updateModelGroup/abstractions.js\";\nimport { DeleteModelGroupUseCase } from \"~/features/modelGroup/deleteModelGroup/abstractions.js\";\nimport { ModelGroupsCache } from \"~/features/modelGroup/abstractions.js\";\nimport {\n ModelGroupPresenter as Abstraction,\n type IModelGroupPresenter,\n type IModelGroupPresenterViewModel\n} from \"./abstractions.js\";\nimport { ModelGroupDataSource } from \"./ModelGroupDataSource.js\";\n\nfunction extractIconName(icon: unknown): string {\n if (icon !== null && typeof icon === \"object\" && \"name\" in icon) {\n return (icon as { name: string }).name;\n }\n if (typeof icon === \"string\") {\n return icon;\n }\n return \"\";\n}\n\nfunction toIconValue(name: string): { type: string; name: string } {\n return { type: \"icon\", name };\n}\n\nclass ModelGroupPresenterImpl implements IModelGroupPresenter {\n private selectedGroup: ModelGroupDto | null = null;\n private loading = false;\n private saving = false;\n private showForm = false;\n private form: IFormModel;\n\n constructor(\n private listPresenter: ListPresenter.Interface<ModelGroupDto>,\n private formModelFactory: FormModelFactory.Interface,\n private listModelGroupsUseCase: ListModelGroupsUseCase.Interface,\n private getRoleUseCase: GetModelGroupUseCase.Interface,\n private createModelGroupUseCase: CreateModelGroupUseCase.Interface,\n private updateModelGroupUseCase: UpdateModelGroupUseCase.Interface,\n private deleteModelGroupUseCase: DeleteModelGroupUseCase.Interface,\n private cache: ModelGroupsCache.Interface\n ) {\n this.form = this.buildForm(false, false);\n makeAutoObservable<\n ModelGroupPresenterImpl,\n | \"formModelFactory\"\n | \"listModelGroupsUseCase\"\n | \"getRoleUseCase\"\n | \"createModelGroupUseCase\"\n | \"updateModelGroupUseCase\"\n | \"deleteModelGroupUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listModelGroupsUseCase: false,\n getRoleUseCase: false,\n createModelGroupUseCase: false,\n updateModelGroupUseCase: false,\n deleteModelGroupUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): IModelGroupPresenterViewModel {\n const group = this.selectedGroup;\n const isPluginGroup = group !== null && (group.plugin ?? false);\n\n return {\n selectedGroup: this.selectedGroup,\n loading: this.loading,\n saving: this.saving,\n showForm: this.showForm,\n canModify: !isPluginGroup,\n isPluginGroup,\n form: this.form.vm\n };\n }\n\n get list(): ListPresenter.Interface<ModelGroupDto> {\n return this.listPresenter;\n }\n\n init(): void {\n const dataSource = new ModelGroupDataSource(this.listModelGroupsUseCase, this.cache);\n\n this.listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectGroup(id: string): Promise<void> {\n runInAction(() => {\n this.loading = true;\n this.showForm = true;\n });\n\n try {\n const group = await this.getRoleUseCase.execute(id);\n const isPluginGroup = group.plugin ?? false;\n const canModify = !isPluginGroup;\n\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, canModify);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n\n createNew(): void {\n this.selectedGroup = null;\n this.form = this.buildForm(true, true);\n this.form.setData({ icon: \"fas/star\", description: \"\" });\n this.showForm = true;\n }\n\n deselect(): void {\n this.selectedGroup = null;\n this.showForm = false;\n }\n\n async save(): Promise<ModelGroupDto | null> {\n const data = await this.form.submit<ModelGroupDto>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this.saving = true;\n });\n\n try {\n const isUpdate = this.selectedGroup !== null && this.selectedGroup.createdOn;\n\n const iconValue = toIconValue(data.icon as unknown as string);\n\n if (isUpdate) {\n const group = await this.updateModelGroupUseCase.execute({\n id: this.selectedGroup!.id,\n name: data.name as unknown as string,\n slug: this.selectedGroup!.slug,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n });\n return group;\n } else {\n const group = await this.createModelGroupUseCase.execute({\n name: data.name as unknown as string,\n slug: data.slug as unknown as string,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, true);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n return group;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this.saving = false;\n });\n }\n }\n\n async deleteGroup(id: string): Promise<void> {\n await this.deleteModelGroupUseCase.execute(id);\n\n runInAction(() => {\n if (this.selectedGroup !== null && this.selectedGroup.id === id) {\n this.selectedGroup = null;\n this.showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n icon: fields\n .text()\n .label(\"Group icon\")\n .required(\"Icon is required.\")\n .disabled(!canModify)\n .renderer(\"cmsIconPicker\"),\n description: fields\n .text()\n .label(\"Description\")\n .defaultValue(\"\")\n .renderer(\"textarea\")\n .disabled(!canModify)\n }),\n layout: layout => [\n layout.row(\"name\"),\n layout.row(\"slug\"),\n layout.row(\"icon\"),\n layout.row(\"description\")\n ]\n });\n }\n}\n\nexport const ModelGroupPresenter = Abstraction.createImplementation({\n implementation: ModelGroupPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListModelGroupsUseCase,\n GetModelGroupUseCase,\n CreateModelGroupUseCase,\n UpdateModelGroupUseCase,\n DeleteModelGroupUseCase,\n ModelGroupsCache\n ]\n});\n"],"names":["extractIconName","icon","toIconValue","name","ModelGroupPresenterImpl","listPresenter","formModelFactory","listModelGroupsUseCase","getRoleUseCase","createModelGroupUseCase","updateModelGroupUseCase","deleteModelGroupUseCase","cache","makeAutoObservable","computed","group","isPluginGroup","dataSource","ModelGroupDataSource","id","runInAction","canModify","data","isUpdate","iconValue","isNew","fields","value","form","slugValue","slugify","String","layout","ModelGroupPresenter","Abstraction","ListPresenter","FormModelFactory","ListModelGroupsUseCase","GetModelGroupUseCase","CreateModelGroupUseCase","UpdateModelGroupUseCase","DeleteModelGroupUseCase","ModelGroupsCache"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/modelGroup/ModelGroupPresenter.js","sources":["../../../src/presentation/modelGroup/ModelGroupPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport { StringFormatter } from \"@webiny/app-admin/features/stringFormatter/abstractions.js\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { ModelGroupDto } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { ListModelGroupsUseCase } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { GetModelGroupUseCase } from \"~/features/modelGroup/getModelGroup/abstractions.js\";\nimport { CreateModelGroupUseCase } from \"~/features/modelGroup/createModelGroup/abstractions.js\";\nimport { UpdateModelGroupUseCase } from \"~/features/modelGroup/updateModelGroup/abstractions.js\";\nimport { DeleteModelGroupUseCase } from \"~/features/modelGroup/deleteModelGroup/abstractions.js\";\nimport { ModelGroupsCache } from \"~/features/modelGroup/abstractions.js\";\nimport {\n ModelGroupPresenter as Abstraction,\n type IModelGroupPresenter,\n type IModelGroupPresenterViewModel\n} from \"./abstractions.js\";\nimport { ModelGroupDataSource } from \"./ModelGroupDataSource.js\";\n\nfunction extractIconName(icon: unknown): string {\n if (icon !== null && typeof icon === \"object\" && \"name\" in icon) {\n return (icon as { name: string }).name;\n }\n if (typeof icon === \"string\") {\n return icon;\n }\n return \"\";\n}\n\nfunction toIconValue(name: string): { type: string; name: string } {\n return { type: \"icon\", name };\n}\n\nclass ModelGroupPresenterImpl implements IModelGroupPresenter {\n private selectedGroup: ModelGroupDto | null = null;\n private loading = false;\n private saving = false;\n private showForm = false;\n private form: IFormModel;\n\n constructor(\n private listPresenter: ListPresenter.Interface<ModelGroupDto>,\n private formModelFactory: FormModelFactory.Interface,\n private listModelGroupsUseCase: ListModelGroupsUseCase.Interface,\n private getRoleUseCase: GetModelGroupUseCase.Interface,\n private createModelGroupUseCase: CreateModelGroupUseCase.Interface,\n private updateModelGroupUseCase: UpdateModelGroupUseCase.Interface,\n private deleteModelGroupUseCase: DeleteModelGroupUseCase.Interface,\n private cache: ModelGroupsCache.Interface,\n private stringFormatter: StringFormatter.Interface\n ) {\n this.form = this.buildForm(false, false);\n makeAutoObservable<\n ModelGroupPresenterImpl,\n | \"formModelFactory\"\n | \"listModelGroupsUseCase\"\n | \"getRoleUseCase\"\n | \"createModelGroupUseCase\"\n | \"updateModelGroupUseCase\"\n | \"deleteModelGroupUseCase\"\n | \"cache\"\n | \"stringFormatter\"\n >(this, {\n formModelFactory: false,\n listModelGroupsUseCase: false,\n getRoleUseCase: false,\n createModelGroupUseCase: false,\n updateModelGroupUseCase: false,\n deleteModelGroupUseCase: false,\n cache: false,\n stringFormatter: false,\n vm: computed\n });\n }\n\n get vm(): IModelGroupPresenterViewModel {\n const group = this.selectedGroup;\n const isPluginGroup = group !== null && (group.plugin ?? false);\n\n return {\n selectedGroup: this.selectedGroup,\n loading: this.loading,\n saving: this.saving,\n showForm: this.showForm,\n canModify: !isPluginGroup,\n isPluginGroup,\n form: this.form.vm\n };\n }\n\n get list(): ListPresenter.Interface<ModelGroupDto> {\n return this.listPresenter;\n }\n\n init(): void {\n const dataSource = new ModelGroupDataSource(this.listModelGroupsUseCase, this.cache);\n\n this.listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectGroup(id: string): Promise<void> {\n runInAction(() => {\n this.loading = true;\n this.showForm = true;\n });\n\n try {\n const group = await this.getRoleUseCase.execute(id);\n const isPluginGroup = group.plugin ?? false;\n const canModify = !isPluginGroup;\n\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, canModify);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n\n createNew(): void {\n this.selectedGroup = null;\n this.form = this.buildForm(true, true);\n this.form.setData({ icon: \"fas/star\", description: \"\" });\n this.showForm = true;\n }\n\n deselect(): void {\n this.selectedGroup = null;\n this.showForm = false;\n }\n\n async save(): Promise<ModelGroupDto | null> {\n const data = await this.form.submit<ModelGroupDto>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this.saving = true;\n });\n\n try {\n const isUpdate = this.selectedGroup !== null && this.selectedGroup.createdOn;\n\n const iconValue = toIconValue(data.icon as unknown as string);\n\n if (isUpdate) {\n const group = await this.updateModelGroupUseCase.execute({\n id: this.selectedGroup!.id,\n name: data.name as unknown as string,\n slug: this.selectedGroup!.slug,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n });\n return group;\n } else {\n const group = await this.createModelGroupUseCase.execute({\n name: data.name as unknown as string,\n slug: data.slug as unknown as string,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, true);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n return group;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this.saving = false;\n });\n }\n }\n\n async deleteGroup(id: string): Promise<void> {\n await this.deleteModelGroupUseCase.execute(id);\n\n runInAction(() => {\n if (this.selectedGroup !== null && this.selectedGroup.id === id) {\n this.selectedGroup = null;\n this.showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(this.stringFormatter.slugify(String(value)));\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n icon: fields\n .text()\n .label(\"Group icon\")\n .required(\"Icon is required.\")\n .disabled(!canModify)\n .renderer(\"cmsIconPicker\"),\n description: fields\n .text()\n .label(\"Description\")\n .defaultValue(\"\")\n .renderer(\"textarea\")\n .disabled(!canModify)\n }),\n layout: layout => [\n layout.row(\"name\"),\n layout.row(\"slug\"),\n layout.row(\"icon\"),\n layout.row(\"description\")\n ]\n });\n }\n}\n\nexport const ModelGroupPresenter = Abstraction.createImplementation({\n implementation: ModelGroupPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListModelGroupsUseCase,\n GetModelGroupUseCase,\n CreateModelGroupUseCase,\n UpdateModelGroupUseCase,\n DeleteModelGroupUseCase,\n ModelGroupsCache,\n StringFormatter\n ]\n});\n"],"names":["extractIconName","icon","toIconValue","name","ModelGroupPresenterImpl","listPresenter","formModelFactory","listModelGroupsUseCase","getRoleUseCase","createModelGroupUseCase","updateModelGroupUseCase","deleteModelGroupUseCase","cache","stringFormatter","makeAutoObservable","computed","group","isPluginGroup","dataSource","ModelGroupDataSource","id","runInAction","canModify","data","isUpdate","iconValue","isNew","fields","value","form","slugValue","String","layout","ModelGroupPresenter","Abstraction","ListPresenter","FormModelFactory","ListModelGroupsUseCase","GetModelGroupUseCase","CreateModelGroupUseCase","UpdateModelGroupUseCase","DeleteModelGroupUseCase","ModelGroupsCache","StringFormatter"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- declare const ContentModelGroups: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ declare const ContentModelGroups: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
5
5
  export default ContentModelGroups;
@@ -1,6 +1,10 @@
1
1
  import React from "react";
2
2
  export declare const ContentModelGroupsDataList: (({ activeId }: {
3
3
  activeId: string | undefined;
4
- }) => React.JSX.Element) & {
5
- displayName: string;
4
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
5
+ activeId: string | undefined;
6
+ }> & {
7
+ readonly type: ({ activeId }: {
8
+ activeId: string | undefined;
9
+ }) => React.JSX.Element;
6
10
  };
@@ -2,6 +2,12 @@ import React from "react";
2
2
  export declare const ContentModelGroupsForm: (({ newEntry, id }: {
3
3
  newEntry: boolean;
4
4
  id: string | undefined;
5
- }) => React.JSX.Element) & {
6
- displayName: string;
5
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
6
+ newEntry: boolean;
7
+ id: string | undefined;
8
+ }> & {
9
+ readonly type: ({ newEntry, id }: {
10
+ newEntry: boolean;
11
+ id: string | undefined;
12
+ }) => React.JSX.Element;
7
13
  };