@webiny/app-headless-cms 0.0.0-unstable.9f53ea597d → 0.0.0-unstable.a4f3e4ea8b

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 (67) hide show
  1. package/ContentEntriesModule.js +6 -1
  2. package/ContentEntriesModule.js.map +1 -1
  3. package/admin/components/ContentEntries/Table/Cells/CellLive.js +9 -2
  4. package/admin/components/ContentEntries/Table/Cells/CellLive.js.map +1 -1
  5. package/admin/components/Dialogs/EditRevisionNoteDialog.d.ts +2 -0
  6. package/admin/components/Dialogs/EditRevisionNoteDialog.js +33 -0
  7. package/admin/components/Dialogs/EditRevisionNoteDialog.js.map +1 -0
  8. package/admin/components/LexicalCmsEditor/LexicalEditor.js +10 -6
  9. package/admin/components/LexicalCmsEditor/LexicalEditor.js.map +1 -1
  10. package/admin/components/LexicalCmsEditor/TypographyDropDown.js +3 -2
  11. package/admin/components/LexicalCmsEditor/TypographyDropDown.js.map +1 -1
  12. package/admin/plugins/editor/formSettings/components/GeneralSettings.js +0 -16
  13. package/admin/plugins/editor/formSettings/components/GeneralSettings.js.map +1 -1
  14. package/features/contentEntry/valueTransformers/DynamicZoneValueTransformer.js +7 -2
  15. package/features/contentEntry/valueTransformers/DynamicZoneValueTransformer.js.map +1 -1
  16. package/features/contentEntry/valueTransformers/ObjectValueTransformer.js +16 -2
  17. package/features/contentEntry/valueTransformers/ObjectValueTransformer.js.map +1 -1
  18. package/features/formModel/mappers/DynamicZoneFieldMapper.js +4 -2
  19. package/features/formModel/mappers/DynamicZoneFieldMapper.js.map +1 -1
  20. package/features/formModel/mappers/ObjectFieldMapper.js +2 -0
  21. package/features/formModel/mappers/ObjectFieldMapper.js.map +1 -1
  22. package/package.json +20 -19
  23. package/presentation/contentEntries/form/ContentEntryFormPresenter.d.ts +2 -0
  24. package/presentation/contentEntries/form/ContentEntryFormPresenter.js +10 -0
  25. package/presentation/contentEntries/form/ContentEntryFormPresenter.js.map +1 -1
  26. package/presentation/contentEntries/form/abstractions.d.ts +1 -0
  27. package/presentation/contentEntries/form/abstractions.js.map +1 -1
  28. package/presentation/contentEntries/form/getFieldBuilders.test.js +2 -2
  29. package/presentation/contentEntries/form/getFieldBuilders.test.js.map +1 -1
  30. package/presentation/contentEntries/list/ContentEntriesDataSource.js +5 -2
  31. package/presentation/contentEntries/list/ContentEntriesDataSource.js.map +1 -1
  32. package/presentation/contentEntries/preview/ComponentDiscoveryIframe.d.ts +3 -2
  33. package/presentation/contentEntries/preview/ComponentDiscoveryIframe.js +2 -2
  34. package/presentation/contentEntries/preview/ComponentDiscoveryIframe.js.map +1 -1
  35. package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js +8 -5
  36. package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js.map +1 -1
  37. package/presentation/contentEntries/preview/PreviewDecorator.js +6 -5
  38. package/presentation/contentEntries/preview/PreviewDecorator.js.map +1 -1
  39. package/presentation/contentEntries/preview/PreviewPane.d.ts +3 -3
  40. package/presentation/contentEntries/preview/PreviewPane.js +3 -3
  41. package/presentation/contentEntries/preview/PreviewPane.js.map +1 -1
  42. package/presentation/contentEntries/preview/resolvePreviewUrl.d.ts +2 -2
  43. package/presentation/contentEntries/preview/resolvePreviewUrl.js +12 -9
  44. package/presentation/contentEntries/preview/resolvePreviewUrl.js.map +1 -1
  45. package/presentation/contentEntries/revisionsList/RevisionsListPresenter.d.ts +15 -1
  46. package/presentation/contentEntries/revisionsList/RevisionsListPresenter.js +117 -4
  47. package/presentation/contentEntries/revisionsList/RevisionsListPresenter.js.map +1 -1
  48. package/presentation/contentEntries/revisionsList/RevisionsListPresenter.test.d.ts +1 -0
  49. package/presentation/contentEntries/revisionsList/RevisionsListPresenter.test.js +257 -0
  50. package/presentation/contentEntries/revisionsList/RevisionsListPresenter.test.js.map +1 -0
  51. package/presentation/contentEntries/revisionsList/abstractions.d.ts +3 -0
  52. package/presentation/contentEntries/revisionsList/abstractions.js.map +1 -1
  53. package/presentation/contentEntries/views/ContentEntriesListLayout.js +1 -0
  54. package/presentation/contentEntries/views/ContentEntriesListLayout.js.map +1 -1
  55. package/presentation/contentEntries/views/ContentEntryFormView.js +2 -1
  56. package/presentation/contentEntries/views/ContentEntryFormView.js.map +1 -1
  57. package/presentation/contentEntries/views/OlderRevisionAlert.d.ts +4 -0
  58. package/presentation/contentEntries/views/OlderRevisionAlert.js +43 -0
  59. package/presentation/contentEntries/views/OlderRevisionAlert.js.map +1 -0
  60. package/presentation/contentEntries/views/RevisionDrawer.js +4 -0
  61. package/presentation/contentEntries/views/RevisionDrawer.js.map +1 -1
  62. package/presentation/contentEntries/views/RevisionListItem.js +80 -13
  63. package/presentation/contentEntries/views/RevisionListItem.js.map +1 -1
  64. package/presentation/contentEntries/views/actions/CreateNewRevisionButton.js +11 -0
  65. package/presentation/contentEntries/views/actions/CreateNewRevisionButton.js.map +1 -1
  66. package/presentation/fieldRenderers/ref/components/EntryCard.js +10 -8
  67. package/presentation/fieldRenderers/ref/components/EntryCard.js.map +1 -1
@@ -14,7 +14,8 @@ import { TrashEntryConfirmDialog } from "./admin/components/Dialogs/TrashEntryCo
14
14
  import { PublishEntryConfirmDialog } from "./admin/components/Dialogs/PublishEntryConfirmDialog.js";
15
15
  import { UnpublishEntryConfirmDialog } from "./admin/components/Dialogs/UnpublishEntryConfirmDialog.js";
16
16
  import { DeleteRevisionConfirmDialog } from "./admin/components/Dialogs/DeleteRevisionConfirmDialog.js";
17
- import { DELETE_REVISION_DIALOG } from "./presentation/contentEntries/revisionsList/RevisionsListPresenter.js";
17
+ import { EditRevisionNoteDialog } from "./admin/components/Dialogs/EditRevisionNoteDialog.js";
18
+ import { DELETE_REVISION_DIALOG, EDIT_REVISION_NOTE_DIALOG } from "./presentation/contentEntries/revisionsList/RevisionsListPresenter.js";
18
19
  import { RevisionSelector } from "./presentation/contentEntries/views/actions/RevisionSelector.js";
19
20
  import { ContentFormOptionsMenu } from "./presentation/contentEntries/views/actions/ContentFormOptionsMenu.js";
20
21
  import { SaveContentButton } from "./presentation/contentEntries/views/actions/SaveContentButton.js";
@@ -37,6 +38,9 @@ const ContentEntriesModule = ()=>/*#__PURE__*/ react.createElement(react.Fragmen
37
38
  }), /*#__PURE__*/ react.createElement(AdminConfig.Dialog, {
38
39
  name: DELETE_REVISION_DIALOG,
39
40
  element: /*#__PURE__*/ react.createElement(DeleteRevisionConfirmDialog, null)
41
+ }), /*#__PURE__*/ react.createElement(AdminConfig.Dialog, {
42
+ name: EDIT_REVISION_NOTE_DIALOG,
43
+ element: /*#__PURE__*/ react.createElement(EditRevisionNoteDialog, null)
40
44
  })), /*#__PURE__*/ react.createElement(InternalContentEntryListConfig, null, /*#__PURE__*/ react.createElement(AdvancedSearchConfigs, null), /*#__PURE__*/ react.createElement(IsModelPublishable, null, /*#__PURE__*/ react.createElement(Browser.Filter, {
41
45
  name: "status",
42
46
  element: /*#__PURE__*/ react.createElement(FilterByStatus, null)
@@ -107,6 +111,7 @@ const ContentEntriesModule = ()=>/*#__PURE__*/ react.createElement(react.Fragmen
107
111
  name: "live",
108
112
  header: "Live",
109
113
  truncate: false,
114
+ sortable: true,
110
115
  cell: /*#__PURE__*/ react.createElement(CellLive, null)
111
116
  })), /*#__PURE__*/ react.createElement(Browser.Table.Column, {
112
117
  name: "actions",
@@ -1 +1 @@
1
- {"version":3,"file":"ContentEntriesModule.js","sources":["../src/ContentEntriesModule.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"@webiny/app-admin\";\nimport { AdvancedSearchConfigs } from \"@webiny/app-aco/components/AdvancedSearch/AdvancedSearchConfigs\";\nimport {\n InternalContentEntryEditorConfig,\n InternalContentEntryListConfig\n} from \"~/admin/config/contentEntries/index.js\";\n\nimport {\n ActionDelete,\n ActionMove,\n ActionPublish,\n ActionUnpublish\n} from \"~/admin/components/ContentEntries/BulkActions/index.js\";\n\nimport {\n TRASH_ENTRY_DIALOG,\n PUBLISH_ENTRY_DIALOG,\n UNPUBLISH_ENTRY_DIALOG\n} from \"~/presentation/contentEntries/list/ContentEntriesPresenter.js\";\nimport { DeleteFolder, EditFolder, SetFolderPermissions } from \"@webiny/app-aco\";\nimport {\n ChangeEntryStatus,\n DeleteEntry,\n EditEntry,\n MoveEntry\n} from \"~/admin/components/ContentEntries/Table/Actions/index.js\";\nimport {\n CellActions,\n CellAuthor,\n CellCreated,\n CellLive,\n CellModified,\n CellName,\n CellStatus\n} from \"~/admin/components/ContentEntries/Table/Cells/index.js\";\nimport { IsModelPublishable } from \"~/admin/components/IsModelPublishable.js\";\nimport { FilterByStatus } from \"~/admin/components/ContentEntries/FilterByStatus.js\";\nimport { CmsTrashBin } from \"~/presentation/contentEntries/trashBin/CmsTrashBin.js\";\nimport { TrashEntryConfirmDialog } from \"~/admin/components/Dialogs/TrashEntryConfirmDialog.js\";\nimport { PublishEntryConfirmDialog } from \"~/admin/components/Dialogs/PublishEntryConfirmDialog.js\";\nimport { UnpublishEntryConfirmDialog } from \"~/admin/components/Dialogs/UnpublishEntryConfirmDialog.js\";\nimport { DeleteRevisionConfirmDialog } from \"~/admin/components/Dialogs/DeleteRevisionConfirmDialog.js\";\nimport { DELETE_REVISION_DIALOG } from \"~/presentation/contentEntries/revisionsList/RevisionsListPresenter.js\";\nimport { RevisionSelector } from \"~/presentation/contentEntries/views/actions/RevisionSelector.js\";\nimport { ContentFormOptionsMenu } from \"~/presentation/contentEntries/views/actions/ContentFormOptionsMenu.js\";\nimport { SaveContentButton } from \"~/presentation/contentEntries/views/actions/SaveContentButton.js\";\nimport { SaveAndPublishButton } from \"~/presentation/contentEntries/views/actions/SaveAndPublishButton.js\";\nimport { DeleteEntryMenuItem } from \"~/presentation/contentEntries/views/actions/DeleteEntryMenuItem.js\";\nimport { ShowRevisionListMenuItem } from \"~/presentation/contentEntries/views/actions/ShowRevisionListMenuItem.js\";\nimport { CreateNewRevisionButton } from \"~/presentation/contentEntries/views/actions/CreateNewRevisionButton.js\";\nimport { PublishOnlyButton } from \"~/presentation/contentEntries/views/actions/PublishOnlyButton.js\";\n\nconst { Browser } = InternalContentEntryListConfig;\nconst { Actions } = InternalContentEntryEditorConfig;\n\nexport const ContentEntriesModule = () => {\n return (\n <>\n <AdminConfig>\n <AdminConfig.Dialog\n name={TRASH_ENTRY_DIALOG}\n element={<TrashEntryConfirmDialog />}\n />\n <AdminConfig.Dialog\n name={PUBLISH_ENTRY_DIALOG}\n element={<PublishEntryConfirmDialog />}\n />\n <AdminConfig.Dialog\n name={UNPUBLISH_ENTRY_DIALOG}\n element={<UnpublishEntryConfirmDialog />}\n />\n <AdminConfig.Dialog\n name={DELETE_REVISION_DIALOG}\n element={<DeleteRevisionConfirmDialog />}\n />\n </AdminConfig>\n <InternalContentEntryListConfig>\n <AdvancedSearchConfigs />\n <IsModelPublishable>\n <Browser.Filter name={\"status\"} element={<FilterByStatus />} />\n <Browser.BulkAction name={\"publish\"} element={<ActionPublish />} />\n <Browser.BulkAction name={\"unpublish\"} element={<ActionUnpublish />} />\n </IsModelPublishable>\n <Browser.Sidebar.Footer name={\"trashBin\"} element={<CmsTrashBin />} />\n <Browser.BulkAction name={\"move\"} element={<ActionMove />} />\n <Browser.BulkAction name={\"delete\"} element={<ActionDelete />} />\n <Browser.Folder.Action name={\"edit\"} element={<EditFolder />} />\n <Browser.Folder.Action name={\"permissions\"} element={<SetFolderPermissions />} />\n <Browser.Folder.Action name={\"delete\"} element={<DeleteFolder />} />\n <Browser.Entry.Action name={\"edit\"} element={<EditEntry />} />\n <IsModelPublishable>\n <Browser.Entry.Action name={\"status\"} element={<ChangeEntryStatus />} />\n </IsModelPublishable>\n <Browser.Entry.Action name={\"move\"} element={<MoveEntry />} />\n <Browser.Entry.Action name={\"delete\"} element={<DeleteEntry />} after={\"$last\"} />\n <Browser.Table.Column\n name={\"name\"}\n header={\"Name\"}\n cell={<CellName />}\n sortable={true}\n hideable={false}\n size={200}\n />\n <Browser.Table.Column name={\"createdBy\"} header={\"Author\"} cell={<CellAuthor />} />\n <Browser.Table.Column\n name={\"createdOn\"}\n header={\"Created\"}\n cell={<CellCreated />}\n sortable={true}\n />\n <Browser.Table.Column\n name={\"savedOn\"}\n header={\"Modified\"}\n cell={<CellModified />}\n sortable={true}\n />\n <IsModelPublishable>\n <Browser.Table.Column\n name={\"status\"}\n header={\"Status\"}\n cell={<CellStatus />}\n truncate={false}\n />\n <Browser.Table.Column\n name={\"live\"}\n header={\"Live\"}\n truncate={false}\n cell={<CellLive />}\n />\n </IsModelPublishable>\n <Browser.Table.Column\n name={\"actions\"}\n header={\"\"}\n cell={<CellActions />}\n size={56}\n resizable={false}\n hideable={false}\n truncate={false}\n className={\"flex justify-center\"}\n />\n </InternalContentEntryListConfig>\n <InternalContentEntryEditorConfig>\n <IsModelPublishable>\n <Actions.ButtonAction\n name={\"revisionSelector\"}\n element={<RevisionSelector />}\n />\n </IsModelPublishable>\n <Actions.ButtonAction name={\"optionsMenu\"} element={<ContentFormOptionsMenu />} />\n <Actions.ButtonAction name={\"save\"} element={<SaveContentButton />} />\n <IsModelPublishable>\n <Actions.ButtonAction\n name={\"cms/createNewRevision\"}\n element={<CreateNewRevisionButton />}\n />\n <Actions.ButtonAction name={\"publish\"} element={<SaveAndPublishButton />} />\n <Actions.ButtonAction name={\"publishOnly\"} element={<PublishOnlyButton />} />\n </IsModelPublishable>\n <Actions.MenuItemAction\n name={\"delete\"}\n element={<DeleteEntryMenuItem />}\n after={\"$last\"}\n />\n <IsModelPublishable>\n <Actions.MenuItemAction\n name={\"showRevisionsList\"}\n element={<ShowRevisionListMenuItem />}\n />\n </IsModelPublishable>\n </InternalContentEntryEditorConfig>\n </>\n );\n};\n"],"names":["Browser","InternalContentEntryListConfig","Actions","InternalContentEntryEditorConfig","ContentEntriesModule","AdminConfig","TRASH_ENTRY_DIALOG","TrashEntryConfirmDialog","PUBLISH_ENTRY_DIALOG","PublishEntryConfirmDialog","UNPUBLISH_ENTRY_DIALOG","UnpublishEntryConfirmDialog","DELETE_REVISION_DIALOG","DeleteRevisionConfirmDialog","AdvancedSearchConfigs","IsModelPublishable","FilterByStatus","ActionPublish","ActionUnpublish","CmsTrashBin","ActionMove","ActionDelete","EditFolder","SetFolderPermissions","DeleteFolder","EditEntry","ChangeEntryStatus","MoveEntry","DeleteEntry","CellName","CellAuthor","CellCreated","CellModified","CellStatus","CellLive","CellActions","RevisionSelector","ContentFormOptionsMenu","SaveContentButton","CreateNewRevisionButton","SaveAndPublishButton","PublishOnlyButton","DeleteEntryMenuItem","ShowRevisionListMenuItem"],"mappings":"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"}
1
+ {"version":3,"file":"ContentEntriesModule.js","sources":["../src/ContentEntriesModule.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"@webiny/app-admin\";\nimport { AdvancedSearchConfigs } from \"@webiny/app-aco/components/AdvancedSearch/AdvancedSearchConfigs\";\nimport {\n InternalContentEntryEditorConfig,\n InternalContentEntryListConfig\n} from \"~/admin/config/contentEntries/index.js\";\n\nimport {\n ActionDelete,\n ActionMove,\n ActionPublish,\n ActionUnpublish\n} from \"~/admin/components/ContentEntries/BulkActions/index.js\";\n\nimport {\n TRASH_ENTRY_DIALOG,\n PUBLISH_ENTRY_DIALOG,\n UNPUBLISH_ENTRY_DIALOG\n} from \"~/presentation/contentEntries/list/ContentEntriesPresenter.js\";\nimport { DeleteFolder, EditFolder, SetFolderPermissions } from \"@webiny/app-aco\";\nimport {\n ChangeEntryStatus,\n DeleteEntry,\n EditEntry,\n MoveEntry\n} from \"~/admin/components/ContentEntries/Table/Actions/index.js\";\nimport {\n CellActions,\n CellAuthor,\n CellCreated,\n CellLive,\n CellModified,\n CellName,\n CellStatus\n} from \"~/admin/components/ContentEntries/Table/Cells/index.js\";\nimport { IsModelPublishable } from \"~/admin/components/IsModelPublishable.js\";\nimport { FilterByStatus } from \"~/admin/components/ContentEntries/FilterByStatus.js\";\nimport { CmsTrashBin } from \"~/presentation/contentEntries/trashBin/CmsTrashBin.js\";\nimport { TrashEntryConfirmDialog } from \"~/admin/components/Dialogs/TrashEntryConfirmDialog.js\";\nimport { PublishEntryConfirmDialog } from \"~/admin/components/Dialogs/PublishEntryConfirmDialog.js\";\nimport { UnpublishEntryConfirmDialog } from \"~/admin/components/Dialogs/UnpublishEntryConfirmDialog.js\";\nimport { DeleteRevisionConfirmDialog } from \"~/admin/components/Dialogs/DeleteRevisionConfirmDialog.js\";\nimport { EditRevisionNoteDialog } from \"~/admin/components/Dialogs/EditRevisionNoteDialog.js\";\nimport {\n DELETE_REVISION_DIALOG,\n EDIT_REVISION_NOTE_DIALOG\n} from \"~/presentation/contentEntries/revisionsList/RevisionsListPresenter.js\";\nimport { RevisionSelector } from \"~/presentation/contentEntries/views/actions/RevisionSelector.js\";\nimport { ContentFormOptionsMenu } from \"~/presentation/contentEntries/views/actions/ContentFormOptionsMenu.js\";\nimport { SaveContentButton } from \"~/presentation/contentEntries/views/actions/SaveContentButton.js\";\nimport { SaveAndPublishButton } from \"~/presentation/contentEntries/views/actions/SaveAndPublishButton.js\";\nimport { DeleteEntryMenuItem } from \"~/presentation/contentEntries/views/actions/DeleteEntryMenuItem.js\";\nimport { ShowRevisionListMenuItem } from \"~/presentation/contentEntries/views/actions/ShowRevisionListMenuItem.js\";\nimport { CreateNewRevisionButton } from \"~/presentation/contentEntries/views/actions/CreateNewRevisionButton.js\";\nimport { PublishOnlyButton } from \"~/presentation/contentEntries/views/actions/PublishOnlyButton.js\";\n\nconst { Browser } = InternalContentEntryListConfig;\nconst { Actions } = InternalContentEntryEditorConfig;\n\nexport const ContentEntriesModule = () => {\n return (\n <>\n <AdminConfig>\n <AdminConfig.Dialog\n name={TRASH_ENTRY_DIALOG}\n element={<TrashEntryConfirmDialog />}\n />\n <AdminConfig.Dialog\n name={PUBLISH_ENTRY_DIALOG}\n element={<PublishEntryConfirmDialog />}\n />\n <AdminConfig.Dialog\n name={UNPUBLISH_ENTRY_DIALOG}\n element={<UnpublishEntryConfirmDialog />}\n />\n <AdminConfig.Dialog\n name={DELETE_REVISION_DIALOG}\n element={<DeleteRevisionConfirmDialog />}\n />\n <AdminConfig.Dialog\n name={EDIT_REVISION_NOTE_DIALOG}\n element={<EditRevisionNoteDialog />}\n />\n </AdminConfig>\n <InternalContentEntryListConfig>\n <AdvancedSearchConfigs />\n <IsModelPublishable>\n <Browser.Filter name={\"status\"} element={<FilterByStatus />} />\n <Browser.BulkAction name={\"publish\"} element={<ActionPublish />} />\n <Browser.BulkAction name={\"unpublish\"} element={<ActionUnpublish />} />\n </IsModelPublishable>\n <Browser.Sidebar.Footer name={\"trashBin\"} element={<CmsTrashBin />} />\n <Browser.BulkAction name={\"move\"} element={<ActionMove />} />\n <Browser.BulkAction name={\"delete\"} element={<ActionDelete />} />\n <Browser.Folder.Action name={\"edit\"} element={<EditFolder />} />\n <Browser.Folder.Action name={\"permissions\"} element={<SetFolderPermissions />} />\n <Browser.Folder.Action name={\"delete\"} element={<DeleteFolder />} />\n <Browser.Entry.Action name={\"edit\"} element={<EditEntry />} />\n <IsModelPublishable>\n <Browser.Entry.Action name={\"status\"} element={<ChangeEntryStatus />} />\n </IsModelPublishable>\n <Browser.Entry.Action name={\"move\"} element={<MoveEntry />} />\n <Browser.Entry.Action name={\"delete\"} element={<DeleteEntry />} after={\"$last\"} />\n <Browser.Table.Column\n name={\"name\"}\n header={\"Name\"}\n cell={<CellName />}\n sortable={true}\n hideable={false}\n size={200}\n />\n <Browser.Table.Column name={\"createdBy\"} header={\"Author\"} cell={<CellAuthor />} />\n <Browser.Table.Column\n name={\"createdOn\"}\n header={\"Created\"}\n cell={<CellCreated />}\n sortable={true}\n />\n <Browser.Table.Column\n name={\"savedOn\"}\n header={\"Modified\"}\n cell={<CellModified />}\n sortable={true}\n />\n <IsModelPublishable>\n <Browser.Table.Column\n name={\"status\"}\n header={\"Status\"}\n cell={<CellStatus />}\n truncate={false}\n />\n <Browser.Table.Column\n name={\"live\"}\n header={\"Live\"}\n truncate={false}\n sortable={true}\n cell={<CellLive />}\n />\n </IsModelPublishable>\n <Browser.Table.Column\n name={\"actions\"}\n header={\"\"}\n cell={<CellActions />}\n size={56}\n resizable={false}\n hideable={false}\n truncate={false}\n className={\"flex justify-center\"}\n />\n </InternalContentEntryListConfig>\n <InternalContentEntryEditorConfig>\n <IsModelPublishable>\n <Actions.ButtonAction\n name={\"revisionSelector\"}\n element={<RevisionSelector />}\n />\n </IsModelPublishable>\n <Actions.ButtonAction name={\"optionsMenu\"} element={<ContentFormOptionsMenu />} />\n <Actions.ButtonAction name={\"save\"} element={<SaveContentButton />} />\n <IsModelPublishable>\n <Actions.ButtonAction\n name={\"cms/createNewRevision\"}\n element={<CreateNewRevisionButton />}\n />\n <Actions.ButtonAction name={\"publish\"} element={<SaveAndPublishButton />} />\n <Actions.ButtonAction name={\"publishOnly\"} element={<PublishOnlyButton />} />\n </IsModelPublishable>\n <Actions.MenuItemAction\n name={\"delete\"}\n element={<DeleteEntryMenuItem />}\n after={\"$last\"}\n />\n <IsModelPublishable>\n <Actions.MenuItemAction\n name={\"showRevisionsList\"}\n element={<ShowRevisionListMenuItem />}\n />\n </IsModelPublishable>\n </InternalContentEntryEditorConfig>\n </>\n );\n};\n"],"names":["Browser","InternalContentEntryListConfig","Actions","InternalContentEntryEditorConfig","ContentEntriesModule","AdminConfig","TRASH_ENTRY_DIALOG","TrashEntryConfirmDialog","PUBLISH_ENTRY_DIALOG","PublishEntryConfirmDialog","UNPUBLISH_ENTRY_DIALOG","UnpublishEntryConfirmDialog","DELETE_REVISION_DIALOG","DeleteRevisionConfirmDialog","EDIT_REVISION_NOTE_DIALOG","EditRevisionNoteDialog","AdvancedSearchConfigs","IsModelPublishable","FilterByStatus","ActionPublish","ActionUnpublish","CmsTrashBin","ActionMove","ActionDelete","EditFolder","SetFolderPermissions","DeleteFolder","EditEntry","ChangeEntryStatus","MoveEntry","DeleteEntry","CellName","CellAuthor","CellCreated","CellModified","CellStatus","CellLive","CellActions","RevisionSelector","ContentFormOptionsMenu","SaveContentButton","CreateNewRevisionButton","SaveAndPublishButton","PublishOnlyButton","DeleteEntryMenuItem","ShowRevisionListMenuItem"],"mappings":"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"}
@@ -1,17 +1,24 @@
1
1
  import react from "react";
2
2
  import { ContentEntryListConfig } from "../../../../config/contentEntries/index.js";
3
- import { Tag } from "@webiny/admin-ui";
3
+ import { Tag, Tooltip } from "@webiny/admin-ui";
4
+ import { formatUtcOffset, useDateFormatter } from "@webiny/app-admin";
4
5
  const CellLive = ()=>{
5
6
  const { useTableRow, isFolderRow } = ContentEntryListConfig.Browser.Table.Column;
6
7
  const { row } = useTableRow();
8
+ const dateFormatter = useDateFormatter();
7
9
  if (isFolderRow(row)) return /*#__PURE__*/ react.createElement(react.Fragment, null, "-");
8
10
  const entry = row.data;
9
11
  if (!entry.live?.version) return /*#__PURE__*/ react.createElement(react.Fragment, null, "No");
10
- return /*#__PURE__*/ react.createElement(Tag, {
12
+ const tag = /*#__PURE__*/ react.createElement(Tag, {
11
13
  swatchColor: "#5AC84C",
12
14
  variant: "success-light",
13
15
  content: `Live (v${entry.live.version})`
14
16
  });
17
+ if (entry.lastPublishedOn) return /*#__PURE__*/ react.createElement(Tooltip, {
18
+ content: `Published ${dateFormatter.format(entry.lastPublishedOn)} (${formatUtcOffset()})`,
19
+ trigger: tag
20
+ });
21
+ return tag;
15
22
  };
16
23
  export { CellLive };
17
24
 
@@ -1 +1 @@
1
- {"version":3,"file":"admin/components/ContentEntries/Table/Cells/CellLive.js","sources":["../../../../../../src/admin/components/ContentEntries/Table/Cells/CellLive.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryListConfig } from \"~/admin/config/contentEntries/index.js\";\nimport { Tag } from \"@webiny/admin-ui\";\n\nexport const CellLive = () => {\n const { useTableRow, isFolderRow } = ContentEntryListConfig.Browser.Table.Column;\n const { row } = useTableRow();\n\n if (isFolderRow(row)) {\n return <>{\"-\"}</>;\n }\n\n const entry = row.data;\n if (!entry.live?.version) {\n return <>No</>;\n }\n\n return (\n <Tag\n swatchColor={\"#5AC84C\"}\n variant={\"success-light\"}\n content={`Live (v${entry.live.version})`}\n />\n );\n};\n"],"names":["CellLive","useTableRow","isFolderRow","ContentEntryListConfig","row","entry","Tag"],"mappings":";;;AAIO,MAAMA,WAAW;IACpB,MAAM,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;IAChF,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAEhB,IAAIC,YAAYE,MACZ,OAAO,WAAP,GAAO,0CAAG;IAGd,MAAMC,QAAQD,IAAI,IAAI;IACtB,IAAI,CAACC,MAAM,IAAI,EAAE,SACb,OAAO,WAAP,GAAO,0CAAE;IAGb,OAAO,WAAP,GACI,oBAACC,KAAGA;QACA,aAAa;QACb,SAAS;QACT,SAAS,CAAC,OAAO,EAAED,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;;AAGpD"}
1
+ {"version":3,"file":"admin/components/ContentEntries/Table/Cells/CellLive.js","sources":["../../../../../../src/admin/components/ContentEntries/Table/Cells/CellLive.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryListConfig } from \"~/admin/config/contentEntries/index.js\";\nimport { Tag, Tooltip } from \"@webiny/admin-ui\";\nimport { formatUtcOffset, useDateFormatter } from \"@webiny/app-admin\";\n\nexport const CellLive = () => {\n const { useTableRow, isFolderRow } = ContentEntryListConfig.Browser.Table.Column;\n const { row } = useTableRow();\n const dateFormatter = useDateFormatter();\n\n if (isFolderRow(row)) {\n return <>{\"-\"}</>;\n }\n\n const entry = row.data;\n if (!entry.live?.version) {\n return <>No</>;\n }\n\n const tag = (\n <Tag\n swatchColor={\"#5AC84C\"}\n variant={\"success-light\"}\n content={`Live (v${entry.live.version})`}\n />\n );\n\n if (entry.lastPublishedOn) {\n return (\n <Tooltip\n content={`Published ${dateFormatter.format(entry.lastPublishedOn)} (${formatUtcOffset()})`}\n trigger={tag}\n />\n );\n }\n\n return tag;\n};\n"],"names":["CellLive","useTableRow","isFolderRow","ContentEntryListConfig","row","dateFormatter","useDateFormatter","entry","tag","Tag","Tooltip","formatUtcOffset"],"mappings":";;;;AAKO,MAAMA,WAAW;IACpB,MAAM,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;IAChF,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAChB,MAAMI,gBAAgBC;IAEtB,IAAIJ,YAAYE,MACZ,OAAO,WAAP,GAAO,0CAAG;IAGd,MAAMG,QAAQH,IAAI,IAAI;IACtB,IAAI,CAACG,MAAM,IAAI,EAAE,SACb,OAAO,WAAP,GAAO,0CAAE;IAGb,MAAMC,MAAM,WAANA,GACF,oBAACC,KAAGA;QACA,aAAa;QACb,SAAS;QACT,SAAS,CAAC,OAAO,EAAEF,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;;IAIhD,IAAIA,MAAM,eAAe,EACrB,OAAO,WAAP,GACI,oBAACG,SAAOA;QACJ,SAAS,CAAC,UAAU,EAAEL,cAAc,MAAM,CAACE,MAAM,eAAe,EAAE,EAAE,EAAEI,kBAAkB,CAAC,CAAC;QAC1F,SAASH;;IAKrB,OAAOA;AACX"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const EditRevisionNoteDialog: () => React.JSX.Element;
@@ -0,0 +1,33 @@
1
+ import react, { useCallback, useState } from "react";
2
+ import { Textarea } from "@webiny/admin-ui";
3
+ import { ConfirmationDialog } from "@webiny/app-admin/components/ConfirmationDialog/index.js";
4
+ import { useNamedConfirmationDialog } from "@webiny/app-admin";
5
+ const EditRevisionNoteDialog = ()=>{
6
+ const { onConfirm, onCancel, closeDialog, params } = useNamedConfirmationDialog();
7
+ const [description, setDescription] = useState(params.revisionDescription ?? "");
8
+ const handleChange = useCallback((value)=>{
9
+ setDescription(value);
10
+ }, []);
11
+ return /*#__PURE__*/ react.createElement(ConfirmationDialog, {
12
+ title: "Revision note",
13
+ confirmLabel: "Save",
14
+ loadingLabel: "Saving...",
15
+ onConfirm: async ()=>{
16
+ await onConfirm({
17
+ revisionDescription: description
18
+ });
19
+ closeDialog();
20
+ },
21
+ onCancel: ()=>{
22
+ onCancel();
23
+ closeDialog();
24
+ }
25
+ }, /*#__PURE__*/ react.createElement(Textarea, {
26
+ description: "Add or update the note for this revision:",
27
+ onChange: handleChange,
28
+ value: description
29
+ }));
30
+ };
31
+ export { EditRevisionNoteDialog };
32
+
33
+ //# sourceMappingURL=EditRevisionNoteDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/components/Dialogs/EditRevisionNoteDialog.js","sources":["../../../../src/admin/components/Dialogs/EditRevisionNoteDialog.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport { Textarea } from \"@webiny/admin-ui\";\nimport { ConfirmationDialog } from \"@webiny/app-admin/components/ConfirmationDialog/index.js\";\nimport { useNamedConfirmationDialog } from \"@webiny/app-admin\";\n\nexport const EditRevisionNoteDialog = () => {\n const { onConfirm, onCancel, closeDialog, params } = useNamedConfirmationDialog<\n { revisionDescription: string },\n { revisionDescription: string }\n >();\n\n const [description, setDescription] = useState(params.revisionDescription ?? \"\");\n\n const handleChange = useCallback((value: string) => {\n setDescription(value);\n }, []);\n\n return (\n <ConfirmationDialog\n title=\"Revision note\"\n confirmLabel=\"Save\"\n loadingLabel=\"Saving...\"\n onConfirm={async () => {\n await onConfirm({ revisionDescription: description });\n closeDialog();\n }}\n onCancel={() => {\n onCancel();\n closeDialog();\n }}\n >\n <Textarea\n description={\"Add or update the note for this revision:\"}\n onChange={handleChange}\n value={description}\n />\n </ConfirmationDialog>\n );\n};\n"],"names":["EditRevisionNoteDialog","onConfirm","onCancel","closeDialog","params","useNamedConfirmationDialog","description","setDescription","useState","handleChange","useCallback","value","ConfirmationDialog","Textarea"],"mappings":";;;;AAKO,MAAMA,yBAAyB;IAClC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,MAAM,EAAE,GAAGC;IAKrD,MAAM,CAACC,aAAaC,eAAe,GAAGC,SAASJ,OAAO,mBAAmB,IAAI;IAE7E,MAAMK,eAAeC,YAAY,CAACC;QAC9BJ,eAAeI;IACnB,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACC,oBAAkBA;QACf,OAAM;QACN,cAAa;QACb,cAAa;QACb,WAAW;YACP,MAAMX,UAAU;gBAAE,qBAAqBK;YAAY;YACnDH;QACJ;QACA,UAAU;YACND;YACAC;QACJ;qBAEA,oBAACU,UAAQA;QACL,aAAa;QACb,UAAUJ;QACV,OAAOH;;AAIvB"}
@@ -3,18 +3,22 @@ import { StaticToolbar } from "@webiny/lexical-editor";
3
3
  import { LexicalEditor } from "@webiny/app-admin";
4
4
  const placeholderStyles = {
5
5
  position: "absolute",
6
- top: 40,
7
- left: 25
6
+ top: 0,
7
+ left: 0,
8
+ padding: "8px 12px",
9
+ marginTop: 0,
10
+ color: "var(--text-color-neutral-muted)"
8
11
  };
9
12
  const contentEditableStyles = {
10
13
  minHeight: 200,
11
14
  display: "block",
12
- padding: 10
15
+ padding: "8px 12px"
13
16
  };
14
17
  const styles = {
15
- backgroundColor: "#fff",
16
- border: "1px solid #e1e1e1",
17
- padding: "10px 14px",
18
+ backgroundColor: "var(--color-neutral-base)",
19
+ border: "1px solid var(--border-color-neutral-muted)",
20
+ borderTop: "none",
21
+ borderRadius: "0 0 var(--radius-md) var(--radius-md)",
18
22
  minHeight: 200,
19
23
  maxHeight: 350
20
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin/components/LexicalCmsEditor/LexicalEditor.js","sources":["../../../../src/admin/components/LexicalCmsEditor/LexicalEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { StaticToolbar } from \"@webiny/lexical-editor\";\nimport { LexicalEditor as BaseLexicalEditor } from \"@webiny/app-admin\";\n\nconst placeholderStyles: React.CSSProperties = { position: \"absolute\", top: 40, left: 25 };\n\nconst contentEditableStyles: React.CSSProperties = {\n minHeight: 200,\n display: \"block\",\n padding: 10\n};\n\nconst styles: React.CSSProperties = {\n backgroundColor: \"#fff\",\n border: \"1px solid #e1e1e1\",\n padding: \"10px 14px\",\n minHeight: 200,\n maxHeight: 350\n};\n\nconst toolbar = <StaticToolbar />;\n\nexport type LexicalEditorProps = Omit<BaseLexicalEditor.Props, \"theme\">;\n\nexport const LexicalEditor = (props: LexicalEditorProps) => {\n return (\n <BaseLexicalEditor\n {...props}\n focus={true}\n staticToolbar={toolbar}\n tag={\"p\"}\n placeholder={props?.placeholder || \"Enter your text here...\"}\n placeholderStyles={placeholderStyles}\n contentEditableStyles={contentEditableStyles}\n styles={styles}\n />\n );\n};\n"],"names":["placeholderStyles","contentEditableStyles","styles","toolbar","StaticToolbar","LexicalEditor","props","BaseLexicalEditor"],"mappings":";;;AAIA,MAAMA,oBAAyC;IAAE,UAAU;IAAY,KAAK;IAAI,MAAM;AAAG;AAEzF,MAAMC,wBAA6C;IAC/C,WAAW;IACX,SAAS;IACT,SAAS;AACb;AAEA,MAAMC,SAA8B;IAChC,iBAAiB;IACjB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,WAAW;AACf;AAEA,MAAMC,UAAU,WAAHA,GAAG,oBAACC,eAAaA;AAIvB,MAAMC,8BAAgB,CAACC,QACnB,WAAP,GACI,oBAACC,eAAiBA;QACb,GAAGD,KAAK;QACT,OAAO;QACP,eAAeH;QACf,KAAK;QACL,aAAaG,OAAO,eAAe;QACnC,mBAAmBN;QACnB,uBAAuBC;QACvB,QAAQC"}
1
+ {"version":3,"file":"admin/components/LexicalCmsEditor/LexicalEditor.js","sources":["../../../../src/admin/components/LexicalCmsEditor/LexicalEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { StaticToolbar } from \"@webiny/lexical-editor\";\nimport { LexicalEditor as BaseLexicalEditor } from \"@webiny/app-admin\";\n\n// Overlay the contentEditable: same origin + same padding as `contentEditableStyles`, and\n// neutralize the Placeholder component's default -20px margin. This makes the placeholder's\n// first line land exactly on the editor's text start.\nconst placeholderStyles: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n padding: \"8px 12px\",\n marginTop: 0,\n // Font size/family come from the paragraph typography class (applied by RichTextEditor);\n // keep the placeholder muted.\n color: \"var(--text-color-neutral-muted)\"\n};\n\nconst contentEditableStyles: React.CSSProperties = {\n minHeight: 200,\n display: \"block\",\n padding: \"8px 12px\"\n};\n\nconst styles: React.CSSProperties = {\n backgroundColor: \"var(--color-neutral-base)\",\n border: \"1px solid var(--border-color-neutral-muted)\",\n // The static toolbar sits directly above and carries the top border, so the body\n // drops its top border and rounds only the bottom corners — together one seamless\n // rounded container, no internal divider (matches Figma).\n borderTop: \"none\",\n borderRadius: \"0 0 var(--radius-md) var(--radius-md)\",\n // Padding lives on the contentEditable only (avoids doubled inset).\n minHeight: 200,\n maxHeight: 350\n};\n\nconst toolbar = <StaticToolbar />;\n\nexport type LexicalEditorProps = Omit<BaseLexicalEditor.Props, \"theme\">;\n\nexport const LexicalEditor = (props: LexicalEditorProps) => {\n return (\n <BaseLexicalEditor\n {...props}\n focus={true}\n staticToolbar={toolbar}\n tag={\"p\"}\n placeholder={props?.placeholder || \"Enter your text here...\"}\n placeholderStyles={placeholderStyles}\n contentEditableStyles={contentEditableStyles}\n styles={styles}\n />\n );\n};\n"],"names":["placeholderStyles","contentEditableStyles","styles","toolbar","StaticToolbar","LexicalEditor","props","BaseLexicalEditor"],"mappings":";;;AAOA,MAAMA,oBAAyC;IAC3C,UAAU;IACV,KAAK;IACL,MAAM;IACN,SAAS;IACT,WAAW;IAGX,OAAO;AACX;AAEA,MAAMC,wBAA6C;IAC/C,WAAW;IACX,SAAS;IACT,SAAS;AACb;AAEA,MAAMC,SAA8B;IAChC,iBAAiB;IACjB,QAAQ;IAIR,WAAW;IACX,cAAc;IAEd,WAAW;IACX,WAAW;AACf;AAEA,MAAMC,UAAU,WAAHA,GAAG,oBAACC,eAAaA;AAIvB,MAAMC,8BAAgB,CAACC,QACnB,WAAP,GACI,oBAACC,eAAiBA;QACb,GAAGD,KAAK;QACT,OAAO;QACP,eAAeH;QACf,KAAK;QACL,aAAaG,OAAO,eAAe;QACnC,mBAAmBN;QACnB,uBAAuBC;QACvB,QAAQC"}
@@ -41,14 +41,15 @@ const TypographyDropDown = ()=>{
41
41
  element
42
42
  ]);
43
43
  return /*#__PURE__*/ react.createElement(react.Fragment, null, styles?.length ? /*#__PURE__*/ react.createElement(DropDown, {
44
- buttonClassName: "toolbar-item typography-dropdown",
44
+ buttonClassName: "toolbar-item typography-dropdown block-type-dropdown",
45
45
  buttonAriaLabel: "Typography formatting options",
46
46
  buttonLabel: value?.label || "Typography",
47
47
  stopCloseOnClickSelf: true,
48
48
  disabled: false,
49
49
  showScroll: true
50
50
  }, styles?.map((option)=>/*#__PURE__*/ react.createElement(DropDownItem, {
51
- className: `item typography-item ${value?.id === option.id ? "active dropdown-item-active" : ""}`,
51
+ className: "item typography-item",
52
+ selected: value?.id === option.id,
52
53
  onClick: ()=>applyTypography(option),
53
54
  key: option.id
54
55
  }, /*#__PURE__*/ react.createElement("span", {
@@ -1 +1 @@
1
- {"version":3,"file":"admin/components/LexicalCmsEditor/TypographyDropDown.js","sources":["../../../../src/admin/components/LexicalCmsEditor/TypographyDropDown.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { $getNearestNodeOfType } from \"@lexical/utils\";\nimport {\n DropDown,\n DropDownItem,\n useCurrentSelection,\n useCurrentElement,\n useTypographyAction\n} from \"@webiny/lexical-editor\";\nimport {\n $isHeadingNode,\n $isParagraphNode,\n $isQuoteNode,\n $isListNode,\n ListNode\n} from \"@webiny/lexical-nodes\";\nimport { useAdminConfig } from \"@webiny/app-admin\";\n\nexport type TypographyStyle = {\n id: string;\n label: string;\n tag: string;\n className: string;\n};\n\nexport const TypographyDropDown = () => {\n const { value, applyTypography } = useTypographyAction();\n const { lexicalTheme } = useAdminConfig();\n\n const [styles, setStyles] = useState<TypographyStyle[]>([]);\n const { element } = useCurrentElement();\n const { rangeSelection } = useCurrentSelection();\n\n const getAllTextStyles = (): TypographyStyle[] => {\n const headingsStyles = lexicalTheme.typography.headings || [];\n const paragraphStyles = lexicalTheme.typography.paragraphs || [];\n\n return [...headingsStyles, ...paragraphStyles];\n };\n\n const getListStyles = (tag: string): TypographyStyle[] => {\n const listStyles = lexicalTheme.typography.lists?.filter(x => x.tag === tag) || [];\n if (listStyles.length > 0) {\n return listStyles;\n }\n\n const fallbackTag = tag === \"ul\" ? \"ol\" : \"ul\";\n return lexicalTheme.typography.lists?.filter(x => x.tag === fallbackTag) || [];\n };\n\n useEffect(() => {\n if (!element || !rangeSelection) {\n return;\n }\n\n if ($isParagraphNode(element) || $isHeadingNode(element)) {\n setStyles(getAllTextStyles());\n } else if ($isListNode(element)) {\n let type;\n try {\n const anchorNode = rangeSelection.anchor.getNode();\n const parentList = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n if (parentList) {\n type = parentList.getListType();\n }\n } catch {\n type = element.getListType();\n }\n\n if (type === \"bullet\") {\n setStyles(getListStyles(\"ul\"));\n } else {\n setStyles(getListStyles(\"ol\"));\n }\n } else if ($isQuoteNode(element)) {\n setStyles(lexicalTheme.typography.quotes || []);\n } else {\n setStyles([]);\n }\n }, [element]);\n\n return (\n <>\n {!!styles?.length ? (\n <DropDown\n buttonClassName=\"toolbar-item typography-dropdown\"\n buttonAriaLabel={\"Typography formatting options\"}\n buttonLabel={value?.label || \"Typography\"}\n stopCloseOnClickSelf={true}\n disabled={false}\n showScroll={true}\n >\n {styles?.map(option => (\n <DropDownItem\n className={`item typography-item ${\n value?.id === option.id ? \"active dropdown-item-active\" : \"\"\n }`}\n onClick={() => applyTypography(option)}\n key={option.id}\n >\n <span className=\"text\">{option.label}</span>\n </DropDownItem>\n ))}\n </DropDown>\n ) : null}\n </>\n );\n};\n"],"names":["TypographyDropDown","value","applyTypography","useTypographyAction","lexicalTheme","useAdminConfig","styles","setStyles","useState","element","useCurrentElement","rangeSelection","useCurrentSelection","getAllTextStyles","headingsStyles","paragraphStyles","getListStyles","tag","listStyles","x","fallbackTag","useEffect","$isParagraphNode","$isHeadingNode","$isListNode","type","anchorNode","parentList","$getNearestNodeOfType","ListNode","$isQuoteNode","DropDown","option","DropDownItem"],"mappings":";;;;;AAyBO,MAAMA,qBAAqB;IAC9B,MAAM,EAAEC,KAAK,EAAEC,eAAe,EAAE,GAAGC;IACnC,MAAM,EAAEC,YAAY,EAAE,GAAGC;IAEzB,MAAM,CAACC,QAAQC,UAAU,GAAGC,SAA4B,EAAE;IAC1D,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAM,EAAEC,cAAc,EAAE,GAAGC;IAE3B,MAAMC,mBAAmB;QACrB,MAAMC,iBAAiBV,aAAa,UAAU,CAAC,QAAQ,IAAI,EAAE;QAC7D,MAAMW,kBAAkBX,aAAa,UAAU,CAAC,UAAU,IAAI,EAAE;QAEhE,OAAO;eAAIU;eAAmBC;SAAgB;IAClD;IAEA,MAAMC,gBAAgB,CAACC;QACnB,MAAMC,aAAad,aAAa,UAAU,CAAC,KAAK,EAAE,OAAOe,CAAAA,IAAKA,EAAE,GAAG,KAAKF,QAAQ,EAAE;QAClF,IAAIC,WAAW,MAAM,GAAG,GACpB,OAAOA;QAGX,MAAME,cAAcH,AAAQ,SAARA,MAAe,OAAO;QAC1C,OAAOb,aAAa,UAAU,CAAC,KAAK,EAAE,OAAOe,CAAAA,IAAKA,EAAE,GAAG,KAAKC,gBAAgB,EAAE;IAClF;IAEAC,UAAU;QACN,IAAI,CAACZ,WAAW,CAACE,gBACb;QAGJ,IAAIW,iBAAiBb,YAAYc,eAAed,UAC5CF,UAAUM;aACP,IAAIW,YAAYf,UAAU;YAC7B,IAAIgB;YACJ,IAAI;gBACA,MAAMC,aAAaf,eAAe,MAAM,CAAC,OAAO;gBAChD,MAAMgB,aAAaC,sBAAgCF,YAAYG;gBAC/D,IAAIF,YACAF,OAAOE,WAAW,WAAW;YAErC,EAAE,OAAM;gBACJF,OAAOhB,QAAQ,WAAW;YAC9B;YAEa,aAATgB,OACAlB,UAAUS,cAAc,SAExBT,UAAUS,cAAc;QAEhC,OAAWc,aAAarB,WACpBF,UAAUH,aAAa,UAAU,CAAC,MAAM,IAAI,EAAE,IAE9CG,UAAU,EAAE;IAEpB,GAAG;QAACE;KAAQ;IAEZ,OAAO,WAAP,GACI,0CACK,AAAEH,QAAQ,SAAS,WAAT,GACP,oBAACyB,UAAQA;QACL,iBAAgB;QAChB,iBAAiB;QACjB,aAAa9B,OAAO,SAAS;QAC7B,sBAAsB;QACtB,UAAU;QACV,YAAY;OAEXK,QAAQ,IAAI0B,CAAAA,SAAAA,WAAAA,GACT,oBAACC,cAAYA;YACT,WAAW,CAAC,qBAAqB,EAC7BhC,OAAO,OAAO+B,OAAO,EAAE,GAAG,gCAAgC,IAC5D;YACF,SAAS,IAAM9B,gBAAgB8B;YAC/B,KAAKA,OAAO,EAAE;yBAEd,oBAAC;YAAK,WAAU;WAAQA,OAAO,KAAK,OAIhD;AAGhB"}
1
+ {"version":3,"file":"admin/components/LexicalCmsEditor/TypographyDropDown.js","sources":["../../../../src/admin/components/LexicalCmsEditor/TypographyDropDown.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { $getNearestNodeOfType } from \"@lexical/utils\";\nimport {\n DropDown,\n DropDownItem,\n useCurrentSelection,\n useCurrentElement,\n useTypographyAction\n} from \"@webiny/lexical-editor\";\nimport {\n $isHeadingNode,\n $isParagraphNode,\n $isQuoteNode,\n $isListNode,\n ListNode\n} from \"@webiny/lexical-nodes\";\nimport { useAdminConfig } from \"@webiny/app-admin\";\n\nexport type TypographyStyle = {\n id: string;\n label: string;\n tag: string;\n className: string;\n};\n\nexport const TypographyDropDown = () => {\n const { value, applyTypography } = useTypographyAction();\n const { lexicalTheme } = useAdminConfig();\n\n const [styles, setStyles] = useState<TypographyStyle[]>([]);\n const { element } = useCurrentElement();\n const { rangeSelection } = useCurrentSelection();\n\n const getAllTextStyles = (): TypographyStyle[] => {\n const headingsStyles = lexicalTheme.typography.headings || [];\n const paragraphStyles = lexicalTheme.typography.paragraphs || [];\n\n return [...headingsStyles, ...paragraphStyles];\n };\n\n const getListStyles = (tag: string): TypographyStyle[] => {\n const listStyles = lexicalTheme.typography.lists?.filter(x => x.tag === tag) || [];\n if (listStyles.length > 0) {\n return listStyles;\n }\n\n const fallbackTag = tag === \"ul\" ? \"ol\" : \"ul\";\n return lexicalTheme.typography.lists?.filter(x => x.tag === fallbackTag) || [];\n };\n\n useEffect(() => {\n if (!element || !rangeSelection) {\n return;\n }\n\n if ($isParagraphNode(element) || $isHeadingNode(element)) {\n setStyles(getAllTextStyles());\n } else if ($isListNode(element)) {\n let type;\n try {\n const anchorNode = rangeSelection.anchor.getNode();\n const parentList = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n if (parentList) {\n type = parentList.getListType();\n }\n } catch {\n type = element.getListType();\n }\n\n if (type === \"bullet\") {\n setStyles(getListStyles(\"ul\"));\n } else {\n setStyles(getListStyles(\"ol\"));\n }\n } else if ($isQuoteNode(element)) {\n setStyles(lexicalTheme.typography.quotes || []);\n } else {\n setStyles([]);\n }\n }, [element]);\n\n return (\n <>\n {!!styles?.length ? (\n <DropDown\n buttonClassName=\"toolbar-item typography-dropdown block-type-dropdown\"\n buttonAriaLabel={\"Typography formatting options\"}\n buttonLabel={value?.label || \"Typography\"}\n stopCloseOnClickSelf={true}\n disabled={false}\n showScroll={true}\n >\n {styles?.map(option => (\n <DropDownItem\n className=\"item typography-item\"\n selected={value?.id === option.id}\n onClick={() => applyTypography(option)}\n key={option.id}\n >\n <span className=\"text\">{option.label}</span>\n </DropDownItem>\n ))}\n </DropDown>\n ) : null}\n </>\n );\n};\n"],"names":["TypographyDropDown","value","applyTypography","useTypographyAction","lexicalTheme","useAdminConfig","styles","setStyles","useState","element","useCurrentElement","rangeSelection","useCurrentSelection","getAllTextStyles","headingsStyles","paragraphStyles","getListStyles","tag","listStyles","x","fallbackTag","useEffect","$isParagraphNode","$isHeadingNode","$isListNode","type","anchorNode","parentList","$getNearestNodeOfType","ListNode","$isQuoteNode","DropDown","option","DropDownItem"],"mappings":";;;;;AAyBO,MAAMA,qBAAqB;IAC9B,MAAM,EAAEC,KAAK,EAAEC,eAAe,EAAE,GAAGC;IACnC,MAAM,EAAEC,YAAY,EAAE,GAAGC;IAEzB,MAAM,CAACC,QAAQC,UAAU,GAAGC,SAA4B,EAAE;IAC1D,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAM,EAAEC,cAAc,EAAE,GAAGC;IAE3B,MAAMC,mBAAmB;QACrB,MAAMC,iBAAiBV,aAAa,UAAU,CAAC,QAAQ,IAAI,EAAE;QAC7D,MAAMW,kBAAkBX,aAAa,UAAU,CAAC,UAAU,IAAI,EAAE;QAEhE,OAAO;eAAIU;eAAmBC;SAAgB;IAClD;IAEA,MAAMC,gBAAgB,CAACC;QACnB,MAAMC,aAAad,aAAa,UAAU,CAAC,KAAK,EAAE,OAAOe,CAAAA,IAAKA,EAAE,GAAG,KAAKF,QAAQ,EAAE;QAClF,IAAIC,WAAW,MAAM,GAAG,GACpB,OAAOA;QAGX,MAAME,cAAcH,AAAQ,SAARA,MAAe,OAAO;QAC1C,OAAOb,aAAa,UAAU,CAAC,KAAK,EAAE,OAAOe,CAAAA,IAAKA,EAAE,GAAG,KAAKC,gBAAgB,EAAE;IAClF;IAEAC,UAAU;QACN,IAAI,CAACZ,WAAW,CAACE,gBACb;QAGJ,IAAIW,iBAAiBb,YAAYc,eAAed,UAC5CF,UAAUM;aACP,IAAIW,YAAYf,UAAU;YAC7B,IAAIgB;YACJ,IAAI;gBACA,MAAMC,aAAaf,eAAe,MAAM,CAAC,OAAO;gBAChD,MAAMgB,aAAaC,sBAAgCF,YAAYG;gBAC/D,IAAIF,YACAF,OAAOE,WAAW,WAAW;YAErC,EAAE,OAAM;gBACJF,OAAOhB,QAAQ,WAAW;YAC9B;YAEa,aAATgB,OACAlB,UAAUS,cAAc,SAExBT,UAAUS,cAAc;QAEhC,OAAWc,aAAarB,WACpBF,UAAUH,aAAa,UAAU,CAAC,MAAM,IAAI,EAAE,IAE9CG,UAAU,EAAE;IAEpB,GAAG;QAACE;KAAQ;IAEZ,OAAO,WAAP,GACI,0CACK,AAAEH,QAAQ,SAAS,WAAT,GACP,oBAACyB,UAAQA;QACL,iBAAgB;QAChB,iBAAiB;QACjB,aAAa9B,OAAO,SAAS;QAC7B,sBAAsB;QACtB,UAAU;QACV,YAAY;OAEXK,QAAQ,IAAI0B,CAAAA,SAAAA,WAAAA,GACT,oBAACC,cAAYA;YACT,WAAU;YACV,UAAUhC,OAAO,OAAO+B,OAAO,EAAE;YACjC,SAAS,IAAM9B,gBAAgB8B;YAC/B,KAAKA,OAAO,EAAE;yBAEd,oBAAC;YAAK,WAAU;WAAQA,OAAO,KAAK,OAIhD;AAGhB"}
@@ -65,22 +65,6 @@ const GeneralSettings = ({ Bind })=>/*#__PURE__*/ react.createElement(react.Frag
65
65
  }, /*#__PURE__*/ react.createElement(Switch, {
66
66
  label: "Generate with AI",
67
67
  note: "Show an AI-powered wizard that generates content before opening the editor."
68
- }))), /*#__PURE__*/ react.createElement(Grid.Column, {
69
- span: 6
70
- }, /*#__PURE__*/ react.createElement(Bind, {
71
- name: "settings.previewPrefix"
72
- }, /*#__PURE__*/ react.createElement(Input, {
73
- label: "Preview URL Prefix",
74
- placeholder: "http://localhost:3000/articles",
75
- description: "Base URL for live preview."
76
- }))), /*#__PURE__*/ react.createElement(Grid.Column, {
77
- span: 6
78
- }, /*#__PURE__*/ react.createElement(Bind, {
79
- name: "settings.previewSlug"
80
- }, /*#__PURE__*/ react.createElement(Input, {
81
- label: "Preview Slug",
82
- placeholder: "{values.slug}",
83
- description: "Entry field pattern for the URL slug. Use {values.<fieldId>}."
84
68
  })))));
85
69
  const components_GeneralSettings = GeneralSettings;
86
70
  export default components_GeneralSettings;
@@ -1 +1 @@
1
- {"version":3,"file":"admin/plugins/editor/formSettings/components/GeneralSettings.js","sources":["../../../../../../src/admin/plugins/editor/formSettings/components/GeneralSettings.tsx"],"sourcesContent":["import React from \"react\";\nimport { Grid, Input, Switch, Textarea, Tags } from \"@webiny/admin-ui\";\nimport { validation } from \"@webiny/validation\";\nimport type { BindComponent } from \"@webiny/form\";\nimport GroupSelect from \"./GroupSelect.js\";\nimport { IconPicker } from \"~/admin/components/IconPicker.js\";\n\ninterface GeneralSettingsProps {\n Bind: BindComponent;\n}\n\nconst GeneralSettings = ({ Bind }: GeneralSettingsProps) => {\n return (\n <React.Fragment>\n <Grid>\n <Grid.Column span={12}>\n <Bind name={\"name\"}>\n <Input label={\"Content model name\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"modelId\"}>\n <Input disabled={true} label={\"Content model ID\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"singularApiName\"}>\n <Input disabled={true} label={\"Singular API Name\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"pluralApiName\"}>\n <Input disabled={true} label={\"Plural API Name\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"description\"}>\n <Textarea rows={5} label={\"Content model description\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"group\"} validators={validation.create(\"required\")}>\n <GroupSelect />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name=\"icon\">\n <IconPicker\n label={`Icon`}\n description={`Choose an icon to represent the model.`}\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"tags\"}>\n <Tags label={\"Tags\"} protectedValues={[\"type:model\"]} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"settings.aiEntryWizard\"}>\n <Switch\n label={\"Generate with AI\"}\n note={\n \"Show an AI-powered wizard that generates content before opening the editor.\"\n }\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={6}>\n <Bind name={\"settings.previewPrefix\"}>\n <Input\n label={\"Preview URL Prefix\"}\n placeholder={\"http://localhost:3000/articles\"}\n description={\"Base URL for live preview.\"}\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={6}>\n <Bind name={\"settings.previewSlug\"}>\n <Input\n label={\"Preview Slug\"}\n placeholder={\"{values.slug}\"}\n description={\n \"Entry field pattern for the URL slug. Use {values.<fieldId>}.\"\n }\n />\n </Bind>\n </Grid.Column>\n </Grid>\n </React.Fragment>\n );\n};\n\nexport default GeneralSettings;\n"],"names":["GeneralSettings","Bind","React","Grid","Input","Textarea","validation","GroupSelect","IconPicker","Tags","Switch"],"mappings":";;;;;AAWA,MAAMA,kBAAkB,CAAC,EAAEC,IAAI,EAAwB,GAC5C,WAAP,GACI,oBAACC,MAAAA,QAAc,sBACX,oBAACC,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,OAAO;wBAGtB,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,UAAU;QAAM,OAAO;wBAGtC,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,UAAU;QAAM,OAAO;wBAGtC,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,UAAU;QAAM,OAAO;wBAGtC,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACI,UAAQA;QAAC,MAAM;QAAG,OAAO;wBAGlC,oBAACF,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;QAAS,YAAYK,WAAW,MAAM,CAAC;qBAC/C,oBAACC,aAAWA,SAAAA,WAAAA,GAGpB,oBAACJ,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAK;qBACP,oBAACO,YAAUA;QACP,OAAO;QACP,aAAa;wBAIzB,oBAACL,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACQ,MAAIA;QAAC,OAAO;QAAQ,iBAAiB;YAAC;SAAa;wBAG5D,oBAACN,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACS,QAAMA;QACH,OAAO;QACP,MACI;wBAKhB,oBAACP,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QACF,OAAO;QACP,aAAa;QACb,aAAa;wBAIzB,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QACF,OAAO;QACP,aAAa;QACb,aACI;;AAUhC,mCAAeJ"}
1
+ {"version":3,"file":"admin/plugins/editor/formSettings/components/GeneralSettings.js","sources":["../../../../../../src/admin/plugins/editor/formSettings/components/GeneralSettings.tsx"],"sourcesContent":["import React from \"react\";\nimport { Grid, Input, Switch, Textarea, Tags } from \"@webiny/admin-ui\";\nimport { validation } from \"@webiny/validation\";\nimport type { BindComponent } from \"@webiny/form\";\nimport GroupSelect from \"./GroupSelect.js\";\nimport { IconPicker } from \"~/admin/components/IconPicker.js\";\n\ninterface GeneralSettingsProps {\n Bind: BindComponent;\n}\n\nconst GeneralSettings = ({ Bind }: GeneralSettingsProps) => {\n return (\n <React.Fragment>\n <Grid>\n <Grid.Column span={12}>\n <Bind name={\"name\"}>\n <Input label={\"Content model name\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"modelId\"}>\n <Input disabled={true} label={\"Content model ID\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"singularApiName\"}>\n <Input disabled={true} label={\"Singular API Name\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"pluralApiName\"}>\n <Input disabled={true} label={\"Plural API Name\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"description\"}>\n <Textarea rows={5} label={\"Content model description\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"group\"} validators={validation.create(\"required\")}>\n <GroupSelect />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name=\"icon\">\n <IconPicker\n label={`Icon`}\n description={`Choose an icon to represent the model.`}\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"tags\"}>\n <Tags label={\"Tags\"} protectedValues={[\"type:model\"]} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"settings.aiEntryWizard\"}>\n <Switch\n label={\"Generate with AI\"}\n note={\n \"Show an AI-powered wizard that generates content before opening the editor.\"\n }\n />\n </Bind>\n </Grid.Column>\n </Grid>\n </React.Fragment>\n );\n};\n\nexport default GeneralSettings;\n"],"names":["GeneralSettings","Bind","React","Grid","Input","Textarea","validation","GroupSelect","IconPicker","Tags","Switch"],"mappings":";;;;;AAWA,MAAMA,kBAAkB,CAAC,EAAEC,IAAI,EAAwB,GAC5C,WAAP,GACI,oBAACC,MAAAA,QAAc,sBACX,oBAACC,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,OAAO;wBAGtB,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,UAAU;QAAM,OAAO;wBAGtC,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,UAAU;QAAM,OAAO;wBAGtC,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACG,OAAKA;QAAC,UAAU;QAAM,OAAO;wBAGtC,oBAACD,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACI,UAAQA;QAAC,MAAM;QAAG,OAAO;wBAGlC,oBAACF,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;QAAS,YAAYK,WAAW,MAAM,CAAC;qBAC/C,oBAACC,aAAWA,SAAAA,WAAAA,GAGpB,oBAACJ,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAK;qBACP,oBAACO,YAAUA;QACP,OAAO;QACP,aAAa;wBAIzB,oBAACL,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACQ,MAAIA;QAAC,OAAO;QAAQ,iBAAiB;YAAC;SAAa;wBAG5D,oBAACN,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACF,MAAAA;QAAK,MAAM;qBACR,oBAACS,QAAMA;QACH,OAAO;QACP,MACI;;AAUhC,mCAAeV"}
@@ -12,11 +12,16 @@ class DynamicZoneValueTransformerImpl {
12
12
  return value;
13
13
  }
14
14
  convertItem(item, templates) {
15
- const { _templateId, ...values } = item;
15
+ const { _templateId, _id, ...values } = item;
16
16
  const template = templates.find((tpl)=>tpl.id === _templateId);
17
17
  if (!template) return;
18
18
  return {
19
- [template.gqlTypeName]: this.preparer.prepare(values, template.fields || [])
19
+ [template.gqlTypeName]: {
20
+ ...this.preparer.prepare(values, template.fields || []),
21
+ ...void 0 !== _id ? {
22
+ _id
23
+ } : {}
24
+ }
20
25
  };
21
26
  }
22
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/contentEntry/valueTransformers/DynamicZoneValueTransformer.js","sources":["../../../../src/features/contentEntry/valueTransformers/DynamicZoneValueTransformer.ts"],"sourcesContent":["import { CmsEntryValueTransformer, type ICmsEntryValueTransformer } from \"./abstractions.js\";\nimport { EntryDataPreparer, type IEntryDataPreparer } from \"./EntryDataPreparer.js\";\nimport type { CmsModelField, CmsDynamicZoneTemplate } from \"~/types.js\";\n\ninterface TemplateValue {\n _templateId: string;\n [key: string]: unknown;\n}\n\nclass DynamicZoneValueTransformerImpl implements ICmsEntryValueTransformer {\n readonly fieldType = \"dynamicZone\";\n\n constructor(private preparer: IEntryDataPreparer) {}\n\n transform(value: unknown, field: CmsModelField): unknown {\n const templates: CmsDynamicZoneTemplate[] = field.settings?.templates || [];\n\n if (field.list && Array.isArray(value)) {\n return value\n .map(item => this.convertItem(item as TemplateValue, templates))\n .filter(Boolean);\n }\n\n if (value && typeof value === \"object\" && \"_templateId\" in value) {\n return this.convertItem(value as TemplateValue, templates);\n }\n\n return value;\n }\n\n private convertItem(\n item: TemplateValue,\n templates: CmsDynamicZoneTemplate[]\n ): Record<string, unknown> | undefined {\n const { _templateId, ...values } = item;\n const template = templates.find(tpl => tpl.id === _templateId);\n if (!template) {\n return undefined;\n }\n\n return {\n [template.gqlTypeName]: this.preparer.prepare(values, template.fields || [])\n };\n }\n}\n\nexport const DynamicZoneValueTransformer = CmsEntryValueTransformer.createImplementation({\n implementation: DynamicZoneValueTransformerImpl,\n dependencies: [EntryDataPreparer]\n});\n"],"names":["DynamicZoneValueTransformerImpl","preparer","value","field","templates","Array","item","Boolean","_templateId","values","template","tpl","DynamicZoneValueTransformer","CmsEntryValueTransformer","EntryDataPreparer"],"mappings":";;AASA,MAAMA;IAGF,YAAoBC,QAA4B,CAAE;aAA9BA,QAAQ,GAARA;aAFX,SAAS,GAAG;IAE8B;IAEnD,UAAUC,KAAc,EAAEC,KAAoB,EAAW;QACrD,MAAMC,YAAsCD,MAAM,QAAQ,EAAE,aAAa,EAAE;QAE3E,IAAIA,MAAM,IAAI,IAAIE,MAAM,OAAO,CAACH,QAC5B,OAAOA,MACF,GAAG,CAACI,CAAAA,OAAQ,IAAI,CAAC,WAAW,CAACA,MAAuBF,YACpD,MAAM,CAACG;QAGhB,IAAIL,SAAS,AAAiB,YAAjB,OAAOA,SAAsB,iBAAiBA,OACvD,OAAO,IAAI,CAAC,WAAW,CAACA,OAAwBE;QAGpD,OAAOF;IACX;IAEQ,YACJI,IAAmB,EACnBF,SAAmC,EACA;QACnC,MAAM,EAAEI,WAAW,EAAE,GAAGC,QAAQ,GAAGH;QACnC,MAAMI,WAAWN,UAAU,IAAI,CAACO,CAAAA,MAAOA,IAAI,EAAE,KAAKH;QAClD,IAAI,CAACE,UACD;QAGJ,OAAO;YACH,CAACA,SAAS,WAAW,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACD,QAAQC,SAAS,MAAM,IAAI,EAAE;QAC/E;IACJ;AACJ;AAEO,MAAME,8BAA8BC,yBAAyB,oBAAoB,CAAC;IACrF,gBAAgBb;IAChB,cAAc;QAACc;KAAkB;AACrC"}
1
+ {"version":3,"file":"features/contentEntry/valueTransformers/DynamicZoneValueTransformer.js","sources":["../../../../src/features/contentEntry/valueTransformers/DynamicZoneValueTransformer.ts"],"sourcesContent":["import { CmsEntryValueTransformer, type ICmsEntryValueTransformer } from \"./abstractions.js\";\nimport { EntryDataPreparer, type IEntryDataPreparer } from \"./EntryDataPreparer.js\";\nimport type { CmsModelField, CmsDynamicZoneTemplate } from \"~/types.js\";\n\ninterface TemplateValue {\n _templateId: string;\n _id?: string;\n [key: string]: unknown;\n}\n\nclass DynamicZoneValueTransformerImpl implements ICmsEntryValueTransformer {\n readonly fieldType = \"dynamicZone\";\n\n constructor(private preparer: IEntryDataPreparer) {}\n\n transform(value: unknown, field: CmsModelField): unknown {\n const templates: CmsDynamicZoneTemplate[] = field.settings?.templates || [];\n\n if (field.list && Array.isArray(value)) {\n return value\n .map(item => this.convertItem(item as TemplateValue, templates))\n .filter(Boolean);\n }\n\n if (value && typeof value === \"object\" && \"_templateId\" in value) {\n return this.convertItem(value as TemplateValue, templates);\n }\n\n return value;\n }\n\n private convertItem(\n item: TemplateValue,\n templates: CmsDynamicZoneTemplate[]\n ): Record<string, unknown> | undefined {\n const { _templateId, _id, ...values } = item;\n const template = templates.find(tpl => tpl.id === _templateId);\n if (!template) {\n return undefined;\n }\n\n return {\n [template.gqlTypeName]: {\n ...this.preparer.prepare(values, template.fields || []),\n ...(_id !== undefined ? { _id } : {})\n }\n };\n }\n}\n\nexport const DynamicZoneValueTransformer = CmsEntryValueTransformer.createImplementation({\n implementation: DynamicZoneValueTransformerImpl,\n dependencies: [EntryDataPreparer]\n});\n"],"names":["DynamicZoneValueTransformerImpl","preparer","value","field","templates","Array","item","Boolean","_templateId","_id","values","template","tpl","undefined","DynamicZoneValueTransformer","CmsEntryValueTransformer","EntryDataPreparer"],"mappings":";;AAUA,MAAMA;IAGF,YAAoBC,QAA4B,CAAE;aAA9BA,QAAQ,GAARA;aAFX,SAAS,GAAG;IAE8B;IAEnD,UAAUC,KAAc,EAAEC,KAAoB,EAAW;QACrD,MAAMC,YAAsCD,MAAM,QAAQ,EAAE,aAAa,EAAE;QAE3E,IAAIA,MAAM,IAAI,IAAIE,MAAM,OAAO,CAACH,QAC5B,OAAOA,MACF,GAAG,CAACI,CAAAA,OAAQ,IAAI,CAAC,WAAW,CAACA,MAAuBF,YACpD,MAAM,CAACG;QAGhB,IAAIL,SAAS,AAAiB,YAAjB,OAAOA,SAAsB,iBAAiBA,OACvD,OAAO,IAAI,CAAC,WAAW,CAACA,OAAwBE;QAGpD,OAAOF;IACX;IAEQ,YACJI,IAAmB,EACnBF,SAAmC,EACA;QACnC,MAAM,EAAEI,WAAW,EAAEC,GAAG,EAAE,GAAGC,QAAQ,GAAGJ;QACxC,MAAMK,WAAWP,UAAU,IAAI,CAACQ,CAAAA,MAAOA,IAAI,EAAE,KAAKJ;QAClD,IAAI,CAACG,UACD;QAGJ,OAAO;YACH,CAACA,SAAS,WAAW,CAAC,EAAE;gBACpB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACD,QAAQC,SAAS,MAAM,IAAI,EAAE,CAAC;gBACvD,GAAIF,AAAQI,WAARJ,MAAoB;oBAAEA;gBAAI,IAAI,CAAC,CAAC;YACxC;QACJ;IACJ;AACJ;AAEO,MAAMK,8BAA8BC,yBAAyB,oBAAoB,CAAC;IACrF,gBAAgBf;IAChB,cAAc;QAACgB;KAAkB;AACrC"}
@@ -9,10 +9,24 @@ class ObjectValueTransformerImpl {
9
9
  const childFields = field.settings?.fields || [];
10
10
  if (!value || 0 === childFields.length) return value;
11
11
  if (field.list && Array.isArray(value)) return value.map((item)=>{
12
- if (item && "object" == typeof item) return this.preparer.prepare(item, childFields);
12
+ if (item && "object" == typeof item) {
13
+ const { _id, ...rest } = item;
14
+ const prepared = this.preparer.prepare(rest, childFields);
15
+ return void 0 !== _id ? {
16
+ _id,
17
+ ...prepared
18
+ } : prepared;
19
+ }
13
20
  return item;
14
21
  });
15
- if ("object" == typeof value) return this.preparer.prepare(value, childFields);
22
+ if ("object" == typeof value) {
23
+ const { _id, ...rest } = value;
24
+ const prepared = this.preparer.prepare(rest, childFields);
25
+ return void 0 !== _id ? {
26
+ _id,
27
+ ...prepared
28
+ } : prepared;
29
+ }
16
30
  return value;
17
31
  }
18
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/contentEntry/valueTransformers/ObjectValueTransformer.js","sources":["../../../../src/features/contentEntry/valueTransformers/ObjectValueTransformer.ts"],"sourcesContent":["import { CmsEntryValueTransformer, type ICmsEntryValueTransformer } from \"./abstractions.js\";\nimport { EntryDataPreparer, type IEntryDataPreparer } from \"./EntryDataPreparer.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass ObjectValueTransformerImpl implements ICmsEntryValueTransformer {\n readonly fieldType = \"object\";\n\n constructor(private preparer: IEntryDataPreparer) {}\n\n transform(value: unknown, field: CmsModelField): unknown {\n const childFields: CmsModelField[] = field.settings?.fields || [];\n\n if (!value || childFields.length === 0) {\n return value;\n }\n\n if (field.list && Array.isArray(value)) {\n return value.map(item => {\n if (item && typeof item === \"object\") {\n return this.preparer.prepare(item as Record<string, unknown>, childFields);\n }\n return item;\n });\n }\n\n if (typeof value === \"object\") {\n return this.preparer.prepare(value as Record<string, unknown>, childFields);\n }\n\n return value;\n }\n}\n\nexport const ObjectValueTransformer = CmsEntryValueTransformer.createImplementation({\n implementation: ObjectValueTransformerImpl,\n dependencies: [EntryDataPreparer]\n});\n"],"names":["ObjectValueTransformerImpl","preparer","value","field","childFields","Array","item","ObjectValueTransformer","CmsEntryValueTransformer","EntryDataPreparer"],"mappings":";;AAIA,MAAMA;IAGF,YAAoBC,QAA4B,CAAE;aAA9BA,QAAQ,GAARA;aAFX,SAAS,GAAG;IAE8B;IAEnD,UAAUC,KAAc,EAAEC,KAAoB,EAAW;QACrD,MAAMC,cAA+BD,MAAM,QAAQ,EAAE,UAAU,EAAE;QAEjE,IAAI,CAACD,SAASE,AAAuB,MAAvBA,YAAY,MAAM,EAC5B,OAAOF;QAGX,IAAIC,MAAM,IAAI,IAAIE,MAAM,OAAO,CAACH,QAC5B,OAAOA,MAAM,GAAG,CAACI,CAAAA;YACb,IAAIA,QAAQ,AAAgB,YAAhB,OAAOA,MACf,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACA,MAAiCF;YAElE,OAAOE;QACX;QAGJ,IAAI,AAAiB,YAAjB,OAAOJ,OACP,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACA,OAAkCE;QAGnE,OAAOF;IACX;AACJ;AAEO,MAAMK,yBAAyBC,yBAAyB,oBAAoB,CAAC;IAChF,gBAAgBR;IAChB,cAAc;QAACS;KAAkB;AACrC"}
1
+ {"version":3,"file":"features/contentEntry/valueTransformers/ObjectValueTransformer.js","sources":["../../../../src/features/contentEntry/valueTransformers/ObjectValueTransformer.ts"],"sourcesContent":["import { CmsEntryValueTransformer, type ICmsEntryValueTransformer } from \"./abstractions.js\";\nimport { EntryDataPreparer, type IEntryDataPreparer } from \"./EntryDataPreparer.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass ObjectValueTransformerImpl implements ICmsEntryValueTransformer {\n readonly fieldType = \"object\";\n\n constructor(private preparer: IEntryDataPreparer) {}\n\n transform(value: unknown, field: CmsModelField): unknown {\n const childFields: CmsModelField[] = field.settings?.fields || [];\n\n if (!value || childFields.length === 0) {\n return value;\n }\n\n if (field.list && Array.isArray(value)) {\n return value.map(item => {\n if (item && typeof item === \"object\") {\n const { _id, ...rest } = item as Record<string, unknown>;\n const prepared = this.preparer.prepare(rest, childFields);\n return _id !== undefined ? { _id, ...prepared } : prepared;\n }\n return item;\n });\n }\n\n if (typeof value === \"object\") {\n const { _id, ...rest } = value as Record<string, unknown>;\n const prepared = this.preparer.prepare(rest, childFields);\n return _id !== undefined ? { _id, ...prepared } : prepared;\n }\n\n return value;\n }\n}\n\nexport const ObjectValueTransformer = CmsEntryValueTransformer.createImplementation({\n implementation: ObjectValueTransformerImpl,\n dependencies: [EntryDataPreparer]\n});\n"],"names":["ObjectValueTransformerImpl","preparer","value","field","childFields","Array","item","_id","rest","prepared","undefined","ObjectValueTransformer","CmsEntryValueTransformer","EntryDataPreparer"],"mappings":";;AAIA,MAAMA;IAGF,YAAoBC,QAA4B,CAAE;aAA9BA,QAAQ,GAARA;aAFX,SAAS,GAAG;IAE8B;IAEnD,UAAUC,KAAc,EAAEC,KAAoB,EAAW;QACrD,MAAMC,cAA+BD,MAAM,QAAQ,EAAE,UAAU,EAAE;QAEjE,IAAI,CAACD,SAASE,AAAuB,MAAvBA,YAAY,MAAM,EAC5B,OAAOF;QAGX,IAAIC,MAAM,IAAI,IAAIE,MAAM,OAAO,CAACH,QAC5B,OAAOA,MAAM,GAAG,CAACI,CAAAA;YACb,IAAIA,QAAQ,AAAgB,YAAhB,OAAOA,MAAmB;gBAClC,MAAM,EAAEC,GAAG,EAAE,GAAGC,MAAM,GAAGF;gBACzB,MAAMG,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACD,MAAMJ;gBAC7C,OAAOG,AAAQG,WAARH,MAAoB;oBAAEA;oBAAK,GAAGE,QAAQ;gBAAC,IAAIA;YACtD;YACA,OAAOH;QACX;QAGJ,IAAI,AAAiB,YAAjB,OAAOJ,OAAoB;YAC3B,MAAM,EAAEK,GAAG,EAAE,GAAGC,MAAM,GAAGN;YACzB,MAAMO,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACD,MAAMJ;YAC7C,OAAOG,AAAQG,WAARH,MAAoB;gBAAEA;gBAAK,GAAGE,QAAQ;YAAC,IAAIA;QACtD;QAEA,OAAOP;IACX;AACJ;AAEO,MAAMS,yBAAyBC,yBAAyB,oBAAoB,CAAC;IAChF,gBAAgBZ;IAChB,cAAc;QAACa;KAAkB;AACrC"}
@@ -1,4 +1,5 @@
1
1
  import { applyFieldProps } from "./applyFieldProps.js";
2
+ import { generateAlphaNumericLowerCaseId } from "@webiny/utils/generateId";
2
3
  class DynamicZoneFieldMapper {
3
4
  map(field, registry, context) {
4
5
  const builder = registry.object();
@@ -13,9 +14,10 @@ class DynamicZoneFieldMapper {
13
14
  name: icon
14
15
  });
15
16
  }
16
- if (template.fields && template.fields.length > 0) t.fields((childRegistry)=>{
17
+ t.fields((childRegistry)=>{
17
18
  const result = {};
18
- for (const child of template.fields)result[child.fieldId] = context.mapField(child, childRegistry);
19
+ result["_id"] = childRegistry.text().hidden().defaultValue(()=>generateAlphaNumericLowerCaseId(12)).cloneValue(()=>generateAlphaNumericLowerCaseId(12));
20
+ if (template.fields && template.fields.length > 0) for (const child of template.fields)result[child.fieldId] = context.mapField(child, childRegistry);
19
21
  return result;
20
22
  });
21
23
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/mappers/DynamicZoneFieldMapper.js","sources":["../../../../src/features/formModel/mappers/DynamicZoneFieldMapper.ts"],"sourcesContent":["import type { ICmsFieldTypeMapper, ICmsFieldMapperContext } from \"../abstractions.js\";\nimport type {\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldBuilder\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField, CmsDynamicZoneTemplate } from \"~/types.js\";\nimport { applyFieldProps } from \"./applyFieldProps.js\";\nimport type { ITemplateIcon } from \"@webiny/app-admin/features/formModel/index.js\";\n\nexport class DynamicZoneFieldMapper implements ICmsFieldTypeMapper {\n readonly type = \"dynamicZone\";\n\n map(\n field: CmsModelField,\n registry: IFieldBuilderRegistry,\n context: ICmsFieldMapperContext\n ): IFieldBuilder {\n const builder = registry.object() as IObjectFieldBuilder;\n\n const templates = field.settings?.templates as CmsDynamicZoneTemplate[] | undefined;\n if (templates) {\n for (const template of templates) {\n builder.template(template.id, t => {\n t.label(template.name);\n if (template.icon) {\n const icon = template.icon;\n if (typeof icon === \"object\" && \"name\" in icon) {\n t.icon(icon as ITemplateIcon);\n } else if (typeof icon === \"string\") {\n t.icon({ type: \"icon\", name: icon });\n }\n }\n if (template.fields && template.fields.length > 0) {\n t.fields(childRegistry => {\n const result: Record<string, IFieldBuilder> = {};\n for (const child of template.fields) {\n result[child.fieldId] = context.mapField(child, childRegistry);\n }\n return result;\n });\n }\n });\n }\n }\n\n return applyFieldProps(builder, field, context.rendererMap);\n }\n}\n"],"names":["DynamicZoneFieldMapper","field","registry","context","builder","templates","template","t","icon","childRegistry","result","child","applyFieldProps"],"mappings":";AAUO,MAAMA;IAGT,IACIC,KAAoB,EACpBC,QAA+B,EAC/BC,OAA+B,EAClB;QACb,MAAMC,UAAUF,SAAS,MAAM;QAE/B,MAAMG,YAAYJ,MAAM,QAAQ,EAAE;QAClC,IAAII,WACA,KAAK,MAAMC,YAAYD,UACnBD,QAAQ,QAAQ,CAACE,SAAS,EAAE,EAAEC,CAAAA;YAC1BA,EAAE,KAAK,CAACD,SAAS,IAAI;YACrB,IAAIA,SAAS,IAAI,EAAE;gBACf,MAAME,OAAOF,SAAS,IAAI;gBAC1B,IAAI,AAAgB,YAAhB,OAAOE,QAAqB,UAAUA,MACtCD,EAAE,IAAI,CAACC;qBACJ,IAAI,AAAgB,YAAhB,OAAOA,MACdD,EAAE,IAAI,CAAC;oBAAE,MAAM;oBAAQ,MAAMC;gBAAK;YAE1C;YACA,IAAIF,SAAS,MAAM,IAAIA,SAAS,MAAM,CAAC,MAAM,GAAG,GAC5CC,EAAE,MAAM,CAACE,CAAAA;gBACL,MAAMC,SAAwC,CAAC;gBAC/C,KAAK,MAAMC,SAASL,SAAS,MAAM,CAC/BI,MAAM,CAACC,MAAM,OAAO,CAAC,GAAGR,QAAQ,QAAQ,CAACQ,OAAOF;gBAEpD,OAAOC;YACX;QAER;QAIR,OAAOE,gBAAgBR,SAASH,OAAOE,QAAQ,WAAW;IAC9D;;aApCS,IAAI,GAAG;;AAqCpB"}
1
+ {"version":3,"file":"features/formModel/mappers/DynamicZoneFieldMapper.js","sources":["../../../../src/features/formModel/mappers/DynamicZoneFieldMapper.ts"],"sourcesContent":["import type { ICmsFieldTypeMapper, ICmsFieldMapperContext } from \"../abstractions.js\";\nimport type {\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldBuilder\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField, CmsDynamicZoneTemplate } from \"~/types.js\";\nimport { applyFieldProps } from \"./applyFieldProps.js\";\nimport type { ITemplateIcon } from \"@webiny/app-admin/features/formModel/index.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils/generateId\";\n\nexport class DynamicZoneFieldMapper implements ICmsFieldTypeMapper {\n readonly type = \"dynamicZone\";\n\n map(\n field: CmsModelField,\n registry: IFieldBuilderRegistry,\n context: ICmsFieldMapperContext\n ): IFieldBuilder {\n const builder = registry.object() as IObjectFieldBuilder;\n\n const templates = field.settings?.templates as CmsDynamicZoneTemplate[] | undefined;\n if (templates) {\n for (const template of templates) {\n builder.template(template.id, t => {\n t.label(template.name);\n if (template.icon) {\n const icon = template.icon;\n if (typeof icon === \"object\" && \"name\" in icon) {\n t.icon(icon as ITemplateIcon);\n } else if (typeof icon === \"string\") {\n t.icon({ type: \"icon\", name: icon });\n }\n }\n t.fields(childRegistry => {\n const result: Record<string, IFieldBuilder> = {};\n result[\"_id\"] = childRegistry\n .text()\n .hidden()\n .defaultValue(() => generateAlphaNumericLowerCaseId(12))\n .cloneValue(() => generateAlphaNumericLowerCaseId(12));\n if (template.fields && template.fields.length > 0) {\n for (const child of template.fields) {\n result[child.fieldId] = context.mapField(child, childRegistry);\n }\n }\n return result;\n });\n });\n }\n }\n\n return applyFieldProps(builder, field, context.rendererMap);\n }\n}\n"],"names":["DynamicZoneFieldMapper","field","registry","context","builder","templates","template","t","icon","childRegistry","result","generateAlphaNumericLowerCaseId","child","applyFieldProps"],"mappings":";;AAWO,MAAMA;IAGT,IACIC,KAAoB,EACpBC,QAA+B,EAC/BC,OAA+B,EAClB;QACb,MAAMC,UAAUF,SAAS,MAAM;QAE/B,MAAMG,YAAYJ,MAAM,QAAQ,EAAE;QAClC,IAAII,WACA,KAAK,MAAMC,YAAYD,UACnBD,QAAQ,QAAQ,CAACE,SAAS,EAAE,EAAEC,CAAAA;YAC1BA,EAAE,KAAK,CAACD,SAAS,IAAI;YACrB,IAAIA,SAAS,IAAI,EAAE;gBACf,MAAME,OAAOF,SAAS,IAAI;gBAC1B,IAAI,AAAgB,YAAhB,OAAOE,QAAqB,UAAUA,MACtCD,EAAE,IAAI,CAACC;qBACJ,IAAI,AAAgB,YAAhB,OAAOA,MACdD,EAAE,IAAI,CAAC;oBAAE,MAAM;oBAAQ,MAAMC;gBAAK;YAE1C;YACAD,EAAE,MAAM,CAACE,CAAAA;gBACL,MAAMC,SAAwC,CAAC;gBAC/CA,MAAM,CAAC,MAAM,GAAGD,cACX,IAAI,GACJ,MAAM,GACN,YAAY,CAAC,IAAME,gCAAgC,KACnD,UAAU,CAAC,IAAMA,gCAAgC;gBACtD,IAAIL,SAAS,MAAM,IAAIA,SAAS,MAAM,CAAC,MAAM,GAAG,GAC5C,KAAK,MAAMM,SAASN,SAAS,MAAM,CAC/BI,MAAM,CAACE,MAAM,OAAO,CAAC,GAAGT,QAAQ,QAAQ,CAACS,OAAOH;gBAGxD,OAAOC;YACX;QACJ;QAIR,OAAOG,gBAAgBT,SAASH,OAAOE,QAAQ,WAAW;IAC9D;;aAzCS,IAAI,GAAG;;AA0CpB"}
@@ -1,10 +1,12 @@
1
1
  import { applyFieldProps } from "./applyFieldProps.js";
2
+ import { generateAlphaNumericLowerCaseId } from "@webiny/utils/generateId";
2
3
  class ObjectFieldMapper {
3
4
  map(field, registry, context) {
4
5
  const builder = registry.object();
5
6
  const childFields = field.settings?.fields;
6
7
  if (childFields && childFields.length > 0) builder.fields((childRegistry)=>{
7
8
  const result = {};
9
+ result["_id"] = childRegistry.text().hidden().defaultValue(()=>generateAlphaNumericLowerCaseId(12)).cloneValue(()=>generateAlphaNumericLowerCaseId(12));
8
10
  for (const child of childFields)result[child.fieldId] = context.mapField(child, childRegistry);
9
11
  return result;
10
12
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/mappers/ObjectFieldMapper.js","sources":["../../../../src/features/formModel/mappers/ObjectFieldMapper.ts"],"sourcesContent":["import type { ICmsFieldTypeMapper, ICmsFieldMapperContext } from \"../abstractions.js\";\nimport type {\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldBuilder\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { applyFieldProps } from \"./applyFieldProps.js\";\n\nexport class ObjectFieldMapper implements ICmsFieldTypeMapper {\n readonly type = \"object\";\n\n map(\n field: CmsModelField,\n registry: IFieldBuilderRegistry,\n context: ICmsFieldMapperContext\n ): IFieldBuilder {\n const builder = registry.object() as IObjectFieldBuilder;\n\n const childFields = field.settings?.fields;\n if (childFields && childFields.length > 0) {\n builder.fields(childRegistry => {\n const result: Record<string, IFieldBuilder> = {};\n for (const child of childFields) {\n result[child.fieldId] = context.mapField(child, childRegistry);\n }\n return result;\n });\n }\n\n return applyFieldProps(builder, field, context.rendererMap);\n }\n}\n"],"names":["ObjectFieldMapper","field","registry","context","builder","childFields","childRegistry","result","child","applyFieldProps"],"mappings":";AASO,MAAMA;IAGT,IACIC,KAAoB,EACpBC,QAA+B,EAC/BC,OAA+B,EAClB;QACb,MAAMC,UAAUF,SAAS,MAAM;QAE/B,MAAMG,cAAcJ,MAAM,QAAQ,EAAE;QACpC,IAAII,eAAeA,YAAY,MAAM,GAAG,GACpCD,QAAQ,MAAM,CAACE,CAAAA;YACX,MAAMC,SAAwC,CAAC;YAC/C,KAAK,MAAMC,SAASH,YAChBE,MAAM,CAACC,MAAM,OAAO,CAAC,GAAGL,QAAQ,QAAQ,CAACK,OAAOF;YAEpD,OAAOC;QACX;QAGJ,OAAOE,gBAAgBL,SAASH,OAAOE,QAAQ,WAAW;IAC9D;;aArBS,IAAI,GAAG;;AAsBpB"}
1
+ {"version":3,"file":"features/formModel/mappers/ObjectFieldMapper.js","sources":["../../../../src/features/formModel/mappers/ObjectFieldMapper.ts"],"sourcesContent":["import type { ICmsFieldTypeMapper, ICmsFieldMapperContext } from \"../abstractions.js\";\nimport type {\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldBuilder\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { applyFieldProps } from \"./applyFieldProps.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils/generateId\";\n\nexport class ObjectFieldMapper implements ICmsFieldTypeMapper {\n readonly type = \"object\";\n\n map(\n field: CmsModelField,\n registry: IFieldBuilderRegistry,\n context: ICmsFieldMapperContext\n ): IFieldBuilder {\n const builder = registry.object() as IObjectFieldBuilder;\n\n const childFields = field.settings?.fields;\n if (childFields && childFields.length > 0) {\n builder.fields(childRegistry => {\n const result: Record<string, IFieldBuilder> = {};\n result[\"_id\"] = childRegistry\n .text()\n .hidden()\n .defaultValue(() => generateAlphaNumericLowerCaseId(12))\n .cloneValue(() => generateAlphaNumericLowerCaseId(12));\n for (const child of childFields) {\n result[child.fieldId] = context.mapField(child, childRegistry);\n }\n return result;\n });\n }\n\n return applyFieldProps(builder, field, context.rendererMap);\n }\n}\n"],"names":["ObjectFieldMapper","field","registry","context","builder","childFields","childRegistry","result","generateAlphaNumericLowerCaseId","child","applyFieldProps"],"mappings":";;AAUO,MAAMA;IAGT,IACIC,KAAoB,EACpBC,QAA+B,EAC/BC,OAA+B,EAClB;QACb,MAAMC,UAAUF,SAAS,MAAM;QAE/B,MAAMG,cAAcJ,MAAM,QAAQ,EAAE;QACpC,IAAII,eAAeA,YAAY,MAAM,GAAG,GACpCD,QAAQ,MAAM,CAACE,CAAAA;YACX,MAAMC,SAAwC,CAAC;YAC/CA,MAAM,CAAC,MAAM,GAAGD,cACX,IAAI,GACJ,MAAM,GACN,YAAY,CAAC,IAAME,gCAAgC,KACnD,UAAU,CAAC,IAAMA,gCAAgC;YACtD,KAAK,MAAMC,SAASJ,YAChBE,MAAM,CAACE,MAAM,OAAO,CAAC,GAAGN,QAAQ,QAAQ,CAACM,OAAOH;YAEpD,OAAOC;QACX;QAGJ,OAAOG,gBAAgBN,SAASH,OAAOE,QAAQ,WAAW;IAC9D;;aA1BS,IAAI,GAAG;;AA2BpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-headless-cms",
3
- "version": "0.0.0-unstable.9f53ea597d",
3
+ "version": "0.0.0-unstable.a4f3e4ea8b",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -28,24 +28,25 @@
28
28
  "@fortawesome/react-fontawesome": "3.5.0",
29
29
  "@lexical/utils": "0.48.0",
30
30
  "@types/react": "18.3.31",
31
- "@webiny/admin-ui": "0.0.0-unstable.9f53ea597d",
32
- "@webiny/app": "0.0.0-unstable.9f53ea597d",
33
- "@webiny/app-aco": "0.0.0-unstable.9f53ea597d",
34
- "@webiny/app-admin": "0.0.0-unstable.9f53ea597d",
35
- "@webiny/app-graphql-playground": "0.0.0-unstable.9f53ea597d",
36
- "@webiny/app-headless-cms-common": "0.0.0-unstable.9f53ea597d",
37
- "@webiny/cms-sdk": "0.0.0-unstable.9f53ea597d",
31
+ "@webiny/admin-ui": "0.0.0-unstable.a4f3e4ea8b",
32
+ "@webiny/app": "0.0.0-unstable.a4f3e4ea8b",
33
+ "@webiny/app-aco": "0.0.0-unstable.a4f3e4ea8b",
34
+ "@webiny/app-admin": "0.0.0-unstable.a4f3e4ea8b",
35
+ "@webiny/app-graphql-playground": "0.0.0-unstable.a4f3e4ea8b",
36
+ "@webiny/app-headless-cms-common": "0.0.0-unstable.a4f3e4ea8b",
37
+ "@webiny/cms-sdk": "0.0.0-unstable.a4f3e4ea8b",
38
38
  "@webiny/di": "1.0.2",
39
- "@webiny/feature": "0.0.0-unstable.9f53ea597d",
40
- "@webiny/form": "0.0.0-unstable.9f53ea597d",
41
- "@webiny/icons": "0.0.0-unstable.9f53ea597d",
42
- "@webiny/lexical-editor": "0.0.0-unstable.9f53ea597d",
43
- "@webiny/lexical-nodes": "0.0.0-unstable.9f53ea597d",
44
- "@webiny/plugins": "0.0.0-unstable.9f53ea597d",
45
- "@webiny/react-composition": "0.0.0-unstable.9f53ea597d",
46
- "@webiny/react-properties": "0.0.0-unstable.9f53ea597d",
47
- "@webiny/utils": "0.0.0-unstable.9f53ea597d",
48
- "@webiny/validation": "0.0.0-unstable.9f53ea597d",
39
+ "@webiny/feature": "0.0.0-unstable.a4f3e4ea8b",
40
+ "@webiny/form": "0.0.0-unstable.a4f3e4ea8b",
41
+ "@webiny/frontend-settings": "0.0.0-unstable.a4f3e4ea8b",
42
+ "@webiny/icons": "0.0.0-unstable.a4f3e4ea8b",
43
+ "@webiny/lexical-editor": "0.0.0-unstable.a4f3e4ea8b",
44
+ "@webiny/lexical-nodes": "0.0.0-unstable.a4f3e4ea8b",
45
+ "@webiny/plugins": "0.0.0-unstable.a4f3e4ea8b",
46
+ "@webiny/react-composition": "0.0.0-unstable.a4f3e4ea8b",
47
+ "@webiny/react-properties": "0.0.0-unstable.a4f3e4ea8b",
48
+ "@webiny/utils": "0.0.0-unstable.a4f3e4ea8b",
49
+ "@webiny/validation": "0.0.0-unstable.a4f3e4ea8b",
49
50
  "dot-prop-immutable": "2.1.1",
50
51
  "graphql": "16.14.2",
51
52
  "graphql-tag": "2.12.7",
@@ -62,7 +63,7 @@
62
63
  "zod": "4.4.3"
63
64
  },
64
65
  "devDependencies": {
65
- "@webiny/build-tools": "0.0.0-unstable.9f53ea597d",
66
+ "@webiny/build-tools": "0.0.0-unstable.a4f3e4ea8b",
66
67
  "rimraf": "6.1.3",
67
68
  "typescript": "7.0.2",
68
69
  "vitest": "4.1.10"
@@ -1,5 +1,6 @@
1
1
  import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
2
2
  import { Confirmation } from "@webiny/app-admin/features/confirmation/abstractions.js";
3
+ import type { CmsContentEntry } from "../../../types.js";
3
4
  import { GetEntryUseCase } from "../../../features/contentEntry/getEntry/abstractions.js";
4
5
  import { CreateEntryUseCase } from "../../../features/contentEntry/createEntry/abstractions.js";
5
6
  import { UpdateEntryUseCase } from "../../../features/contentEntry/updateEntry/abstractions.js";
@@ -42,6 +43,7 @@ declare class ContentEntryFormPresenterImpl implements Abstraction.Interface {
42
43
  loadRevision(id: string): Promise<void>;
43
44
  setFolderId(folderId: string | null): void;
44
45
  newEntry(initialValues?: Record<string, unknown>): void;
46
+ patchEntryMeta(meta: Partial<CmsContentEntry["meta"]>): void;
45
47
  reset(): void;
46
48
  private buildForm;
47
49
  private buildAndPopulateForm;
@@ -227,6 +227,16 @@ class ContentEntryFormPresenterImpl {
227
227
  dirty: true
228
228
  });
229
229
  }
230
+ patchEntryMeta(meta) {
231
+ if (!this.entry) return;
232
+ this.entry = {
233
+ ...this.entry,
234
+ meta: {
235
+ ...this.entry.meta,
236
+ ...meta
237
+ }
238
+ };
239
+ }
230
240
  reset() {
231
241
  this.form = null;
232
242
  this.entry = null;