@webiny/app-headless-cms 6.0.0-rc.1 → 6.0.0-rc.3

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 (177) hide show
  1. package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.d.ts +2 -0
  2. package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js +18 -0
  3. package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js.map +1 -0
  4. package/admin/components/ContentEntries/Header/ButtonRefresh/index.d.ts +1 -0
  5. package/admin/components/ContentEntries/Header/ButtonRefresh/index.js +3 -0
  6. package/admin/components/ContentEntries/Header/ButtonRefresh/index.js.map +1 -0
  7. package/admin/components/ContentEntries/Header/Header.js +2 -1
  8. package/admin/components/ContentEntries/Header/Header.js.map +1 -1
  9. package/admin/components/ContentEntries/SidebarContent/SidebarContent.js +1 -1
  10. package/admin/components/ContentEntries/SidebarContent/SidebarContent.js.map +1 -1
  11. package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js +1 -1
  12. package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js.map +1 -1
  13. package/admin/components/ContentEntries/Table/Cells/CellLive.d.ts +2 -0
  14. package/admin/components/ContentEntries/Table/Cells/CellLive.js +26 -0
  15. package/admin/components/ContentEntries/Table/Cells/CellLive.js.map +1 -0
  16. package/admin/components/ContentEntries/Table/Cells/index.d.ts +1 -0
  17. package/admin/components/ContentEntries/Table/Cells/index.js +1 -0
  18. package/admin/components/ContentEntries/Table/Cells/index.js.map +1 -1
  19. package/admin/components/ContentModelEditor/ContentModelEditor.js +1 -6
  20. package/admin/components/ContentModelEditor/ContentModelEditor.js.map +1 -1
  21. package/admin/components/ContentModelEditor/ContentModelEditorProvider.d.ts +2 -0
  22. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js +14 -2
  23. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
  24. package/admin/components/ContentModelEditor/FieldsSidebar.js +51 -2
  25. package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
  26. package/admin/components/Droppable.d.ts +1 -1
  27. package/admin/components/Droppable.js.map +1 -1
  28. package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js +3 -3
  29. package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js.map +1 -1
  30. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.d.ts +10 -0
  31. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js +69 -0
  32. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js.map +1 -0
  33. package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js +27 -9
  34. package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js.map +1 -1
  35. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.d.ts +2 -0
  36. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js +14 -0
  37. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js.map +1 -0
  38. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.d.ts +15 -0
  39. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js +131 -0
  40. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js.map +1 -0
  41. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.d.ts +4 -0
  42. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js +74 -0
  43. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js.map +1 -0
  44. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.d.ts +13 -0
  45. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js +203 -0
  46. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js.map +1 -0
  47. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.d.ts +1 -0
  48. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js +3 -0
  49. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js.map +1 -0
  50. package/admin/components/FieldEditor/EditFieldDialog.js +13 -56
  51. package/admin/components/FieldEditor/EditFieldDialog.js.map +1 -1
  52. package/admin/components/FieldEditor/EditFieldDialogContainer.d.ts +12 -0
  53. package/admin/components/FieldEditor/EditFieldDialogContainer.js +40 -0
  54. package/admin/components/FieldEditor/EditFieldDialogContainer.js.map +1 -0
  55. package/admin/components/FieldEditor/EditFieldDrawerContainer.d.ts +12 -0
  56. package/admin/components/FieldEditor/EditFieldDrawerContainer.js +40 -0
  57. package/admin/components/FieldEditor/EditFieldDrawerContainer.js.map +1 -0
  58. package/admin/components/FieldEditor/FieldEditor.js +148 -88
  59. package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
  60. package/admin/components/FieldEditor/FieldEditorContext.d.ts +33 -3
  61. package/admin/components/FieldEditor/FieldEditorContext.js +225 -6
  62. package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
  63. package/admin/components/FieldEditor/LayoutCell.d.ts +9 -0
  64. package/admin/components/FieldEditor/LayoutCell.js +33 -0
  65. package/admin/components/FieldEditor/LayoutCell.js.map +1 -0
  66. package/admin/components/FieldEditor/utils/deleteField.js +12 -4
  67. package/admin/components/FieldEditor/utils/deleteField.js.map +1 -1
  68. package/admin/components/FieldEditor/utils/getFieldPosition.js +6 -1
  69. package/admin/components/FieldEditor/utils/getFieldPosition.js.map +1 -1
  70. package/admin/graphql/contentModels.d.ts +2 -2
  71. package/admin/graphql/contentModels.js +7 -0
  72. package/admin/graphql/contentModels.js.map +1 -1
  73. package/admin/hooks/useModelFieldGraphqlContext.d.ts +1 -0
  74. package/admin/plugins/fieldRenderers/DynamicSection.d.ts +2 -1
  75. package/admin/plugins/fieldRenderers/DynamicSection.js +3 -1
  76. package/admin/plugins/fieldRenderers/DynamicSection.js.map +1 -1
  77. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js +7 -1
  78. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js.map +1 -1
  79. package/admin/plugins/fieldRenderers/checkboxes.js +7 -1
  80. package/admin/plugins/fieldRenderers/checkboxes.js.map +1 -1
  81. package/admin/plugins/fieldRenderers/dateTime/Input.js +9 -2
  82. package/admin/plugins/fieldRenderers/dateTime/Input.js.map +1 -1
  83. package/admin/plugins/fieldRenderers/dateTime/Select.js +7 -0
  84. package/admin/plugins/fieldRenderers/dateTime/Select.js.map +1 -1
  85. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.d.ts +1 -0
  86. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js +9 -5
  87. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js.map +1 -1
  88. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.d.ts +2 -1
  89. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js +18 -10
  90. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js.map +1 -1
  91. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js +13 -4
  92. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js.map +1 -1
  93. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js +10 -4
  94. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js.map +1 -1
  95. package/admin/plugins/fieldRenderers/longText/longText.js +7 -1
  96. package/admin/plugins/fieldRenderers/longText/longText.js.map +1 -1
  97. package/admin/plugins/fieldRenderers/longText/longTexts.js +12 -3
  98. package/admin/plugins/fieldRenderers/longText/longTexts.js.map +1 -1
  99. package/admin/plugins/fieldRenderers/number/numberInput.js +7 -1
  100. package/admin/plugins/fieldRenderers/number/numberInput.js.map +1 -1
  101. package/admin/plugins/fieldRenderers/number/numberInputs.js +11 -3
  102. package/admin/plugins/fieldRenderers/number/numberInputs.js.map +1 -1
  103. package/admin/plugins/fieldRenderers/object/FieldSettings.d.ts +2 -1
  104. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js +5 -0
  105. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js.map +1 -1
  106. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.d.ts +1 -0
  107. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js +3 -2
  108. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js.map +1 -1
  109. package/admin/plugins/fieldRenderers/radioButtons.js +7 -1
  110. package/admin/plugins/fieldRenderers/radioButtons.js.map +1 -1
  111. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js +15 -7
  112. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js.map +1 -1
  113. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js +14 -7
  114. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js.map +1 -1
  115. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.d.ts +3 -1
  116. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js +7 -6
  117. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js.map +1 -1
  118. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.d.ts +1 -1
  119. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js +9 -3
  120. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js.map +1 -1
  121. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.d.ts +1 -1
  122. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js +9 -3
  123. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js.map +1 -1
  124. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js +7 -1
  125. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js.map +1 -1
  126. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js +7 -1
  127. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js.map +1 -1
  128. package/admin/plugins/fieldRenderers/select.js +7 -1
  129. package/admin/plugins/fieldRenderers/select.js.map +1 -1
  130. package/admin/plugins/fieldRenderers/text/tags.js +7 -1
  131. package/admin/plugins/fieldRenderers/text/tags.js.map +1 -1
  132. package/admin/plugins/fieldRenderers/text/textInput.js +7 -1
  133. package/admin/plugins/fieldRenderers/text/textInput.js.map +1 -1
  134. package/admin/plugins/fieldRenderers/text/textInputs.js +12 -3
  135. package/admin/plugins/fieldRenderers/text/textInputs.js.map +1 -1
  136. package/admin/plugins/fields/ui/TabsLayoutEditor.d.ts +9 -0
  137. package/admin/plugins/fields/ui/TabsLayoutEditor.js +470 -0
  138. package/admin/plugins/fields/ui/TabsLayoutEditor.js.map +1 -0
  139. package/admin/plugins/fields/ui/alert.d.ts +2 -2
  140. package/admin/plugins/fields/ui/alert.js +144 -17
  141. package/admin/plugins/fields/ui/alert.js.map +1 -1
  142. package/admin/plugins/fields/ui/index.d.ts +1 -0
  143. package/admin/plugins/fields/ui/index.js +1 -0
  144. package/admin/plugins/fields/ui/index.js.map +1 -1
  145. package/admin/plugins/fields/ui/separator.d.ts +2 -2
  146. package/admin/plugins/fields/ui/separator.js +131 -17
  147. package/admin/plugins/fields/ui/separator.js.map +1 -1
  148. package/admin/plugins/fields/ui/tabs.d.ts +2 -0
  149. package/admin/plugins/fields/ui/tabs.js +89 -0
  150. package/admin/plugins/fields/ui/tabs.js.map +1 -0
  151. package/admin/plugins/index.d.ts +1 -0
  152. package/admin/views/contentEntries/ContentEntriesModule.js +6 -1
  153. package/admin/views/contentEntries/ContentEntriesModule.js.map +1 -1
  154. package/admin/views/contentEntries/hooks/useContentEntriesList.d.ts +1 -0
  155. package/admin/views/contentEntries/hooks/useContentEntriesList.js +8 -4
  156. package/admin/views/contentEntries/hooks/useContentEntriesList.js.map +1 -1
  157. package/admin/views/contentModels/importing/graphql.d.ts +2 -2
  158. package/admin/views/contentModels/importing/graphql.js.map +1 -1
  159. package/allPlugins.d.ts +2 -1
  160. package/allPlugins.js +2 -3
  161. package/allPlugins.js.map +1 -1
  162. package/exports/admin/cms/model.d.ts +1 -0
  163. package/exports/admin/cms/model.js +3 -0
  164. package/exports/admin/cms/model.js.map +1 -0
  165. package/package.json +24 -24
  166. package/types.d.ts +1 -0
  167. package/types.js +5 -1
  168. package/types.js.map +1 -1
  169. package/admin/plugins/fieldRenderers/ui/alert.d.ts +0 -2
  170. package/admin/plugins/fieldRenderers/ui/alert.js +0 -32
  171. package/admin/plugins/fieldRenderers/ui/alert.js.map +0 -1
  172. package/admin/plugins/fieldRenderers/ui/index.d.ts +0 -2
  173. package/admin/plugins/fieldRenderers/ui/index.js +0 -4
  174. package/admin/plugins/fieldRenderers/ui/index.js.map +0 -1
  175. package/admin/plugins/fieldRenderers/ui/separator.d.ts +0 -2
  176. package/admin/plugins/fieldRenderers/ui/separator.js +0 -31
  177. package/admin/plugins/fieldRenderers/ui/separator.js.map +0 -1
@@ -6,8 +6,10 @@ import { Center, Horizontal, Vertical } from "../DropZone/index.js";
6
6
  import Draggable from "../Draggable.js";
7
7
  import EditFieldDialog from "./EditFieldDialog.js";
8
8
  import Field from "./Field.js";
9
+ import { LayoutCell } from "./LayoutCell.js";
9
10
  import { useModelFieldEditor } from "./useModelFieldEditor.js";
10
11
  import { FieldEditorProvider } from "./FieldEditorContext.js";
12
+ import { isLayoutDescriptor } from "@webiny/app-headless-cms-common/types/model.js";
11
13
  import { ModelFieldProvider } from "../ModelFieldProvider/index.js";
12
14
  import { cn, Icon } from "@webiny/admin-ui";
13
15
  const t = i18n.namespace("app-headless-cms/admin/components/editor");
@@ -26,10 +28,32 @@ const Editor = () => {
26
28
  onEndDrag,
27
29
  field,
28
30
  dropTarget,
29
- getFieldPlugin
31
+ getFieldPlugin,
32
+ getLayoutFieldPlugin,
33
+ getField
30
34
  } = useModelFieldEditor();
35
+
36
+ /**
37
+ * Collect all data fields referenced inside a layout descriptor (e.g. fields inside tabs).
38
+ * Delegates to the layout field plugin's `collectFields` method if available.
39
+ */
40
+ const collectDescriptorFields = descriptor => {
41
+ const plugin = getLayoutFieldPlugin(descriptor.type);
42
+ if (!plugin?.field.collectFields) {
43
+ return [];
44
+ }
45
+ return plugin.field.collectFields({
46
+ descriptor,
47
+ getField: id => getField({
48
+ id
49
+ })
50
+ });
51
+ };
31
52
  const canDropIntoField = (field, draggable) => {
32
53
  const fieldPlugin = getFieldPlugin(field.type);
54
+ if (!fieldPlugin) {
55
+ return true;
56
+ }
33
57
  const canAccept = fieldPlugin.field.canAccept;
34
58
  if (typeof canAccept === "function" && !canAccept(field, draggable)) {
35
59
  return false;
@@ -38,13 +62,19 @@ const Editor = () => {
38
62
  };
39
63
  const isVerticalDropzoneVisible = cb => {
40
64
  return item => {
65
+ // Layout fields always occupy full row — no side-by-side layout
66
+ if (item.type === "newLayoutField" || item.type === "layoutField") {
67
+ return false;
68
+ }
41
69
  if (!parent) {
42
70
  return cb(item);
43
71
  }
44
72
  const fieldPlugin = getFieldPlugin(parent.type);
45
- const allowLayout = fieldPlugin.field.allowLayout ?? true;
46
- if (!allowLayout) {
47
- return false;
73
+ if (fieldPlugin) {
74
+ const allowLayout = fieldPlugin.field.allowLayout ?? true;
75
+ if (!allowLayout) {
76
+ return false;
77
+ }
48
78
  }
49
79
  if (!canDropIntoField(parent, item)) {
50
80
  return false;
@@ -69,92 +99,122 @@ const Editor = () => {
69
99
  row: 0,
70
100
  index: 0
71
101
  })
72
- }, t`Drop your first field here`), fields.map((row, index) => /*#__PURE__*/React.createElement(Draggable, {
73
- beginDrag: {
74
- parent: parent ? parent.fieldId : null,
75
- type: "row",
76
- fields: row,
77
- pos: {
78
- row: index
79
- }
80
- },
81
- endDrag: onEndDrag,
82
- key: row.map(f => f.fieldId).join(".")
83
- }, ({
84
- drag,
85
- isDragging
86
- } /* RowContainer start - includes drag handle, drop zones and the Row itself. */) => /*#__PURE__*/React.createElement("div", {
87
- className: cn(["flex flex-column", "relative", "mb-md last-of-type:mb-none", "bg-neutral-dimmed", isDragging ? "opacity-30" : "opacity-100"])
88
- }, /*#__PURE__*/React.createElement("div", {
89
- className: cn(["cursor-grab", "absolute left-sm-plus top-sm-plus z-10"]),
90
- ref: drag
91
- }, /*#__PURE__*/React.createElement(Icon, {
92
- icon: /*#__PURE__*/React.createElement(DragIcon, null),
93
- label: "Drag to move this row",
94
- color: "neutral-light",
95
- size: "sm"
96
- })), /*#__PURE__*/React.createElement(Horizontal, {
97
- isVisible: isHorizontalDropzoneVisible(noConflict()),
98
- "data-testid": `cms-editor-row-droppable-top-${index}`,
99
- onDrop: item => onFieldDrop(item, {
100
- row: index,
101
- index: null
102
- })
103
- }), /*#__PURE__*/React.createElement("div", {
104
- className: cn(["w-full flex justify-between", "pl-xl pr-sm py-sm"]),
105
- "data-testid": "cms.editor.field-row"
106
- }, row.map((field, fieldIndex) => /*#__PURE__*/React.createElement(ModelFieldProvider, {
107
- field: field,
108
- key: field.fieldId
109
- }, /*#__PURE__*/React.createElement(Draggable, {
110
- beginDrag: {
111
- parent: parent ? parent.fieldId : null,
112
- type: "field",
113
- field,
114
- pos: {
102
+ }, t`Drop your first field here`), fields.map((row, index) => {
103
+ // Build a stable key for the row
104
+ const rowKey = row.map(cell => isLayoutDescriptor(cell) ? cell.id : cell.fieldId).join(".");
105
+ return /*#__PURE__*/React.createElement(Draggable, {
106
+ beginDrag: {
107
+ parent: parent ? parent.fieldId : null,
108
+ type: "row",
109
+ fields: row.filter(cell => !isLayoutDescriptor(cell)),
110
+ pos: {
111
+ row: index
112
+ }
113
+ },
114
+ endDrag: onEndDrag,
115
+ key: rowKey
116
+ }, ({
117
+ drag,
118
+ isDragging
119
+ } /* RowContainer start - includes drag handle, drop zones and the Row itself. */) => /*#__PURE__*/React.createElement("div", {
120
+ className: cn(["flex flex-column", "relative", "mb-md last-of-type:mb-none", "bg-neutral-dimmed", isDragging ? "opacity-30" : "opacity-100"])
121
+ }, /*#__PURE__*/React.createElement("div", {
122
+ className: cn(["cursor-grab", "absolute left-sm-plus top-sm-plus z-10"]),
123
+ ref: drag
124
+ }, /*#__PURE__*/React.createElement(Icon, {
125
+ icon: /*#__PURE__*/React.createElement(DragIcon, null),
126
+ label: "Drag to move this row",
127
+ color: "neutral-light",
128
+ size: "sm"
129
+ })), /*#__PURE__*/React.createElement(Horizontal, {
130
+ isVisible: isHorizontalDropzoneVisible(noConflict()),
131
+ "data-testid": `cms-editor-row-droppable-top-${index}`,
132
+ onDrop: item => onFieldDrop(item, {
115
133
  row: index,
116
- index: fieldIndex
134
+ index: null
135
+ })
136
+ }), /*#__PURE__*/React.createElement("div", {
137
+ className: cn(["w-full flex justify-between", "pl-xl pr-sm py-sm"]),
138
+ "data-testid": "cms.editor.field-row"
139
+ }, row.map((cell, fieldIndex) => {
140
+ if (isLayoutDescriptor(cell)) {
141
+ return /*#__PURE__*/React.createElement(Draggable, {
142
+ key: cell.id,
143
+ beginDrag: {
144
+ parent: parent ? parent.fieldId : null,
145
+ type: "layoutField",
146
+ descriptor: cell,
147
+ fields: collectDescriptorFields(cell)
148
+ },
149
+ endDrag: onEndDrag
150
+ }, ({
151
+ drag
152
+ }) => /*#__PURE__*/React.createElement("div", {
153
+ ref: drag,
154
+ className: cn(["relative", "flex-1 basis-full", "mx-sm"])
155
+ }, /*#__PURE__*/React.createElement("div", {
156
+ className: "cursor-grab bg-neutral-base p-md shadow-sm rounded-xs"
157
+ }, /*#__PURE__*/React.createElement(LayoutCell, {
158
+ descriptor: cell,
159
+ rowIndex: index,
160
+ cellIndex: fieldIndex
161
+ }))));
117
162
  }
118
- },
119
- endDrag: onEndDrag
120
- }, ({
121
- drag
122
- }) => /*#__PURE__*/React.createElement("div", {
123
- className: cn(["relative", "flex-1 basis-full", "mx-sm"]),
124
- ref: drag
125
- }, /*#__PURE__*/React.createElement(Vertical, {
126
- depth: depth,
127
- onDrop: item => onFieldDrop(item, {
128
- row: index,
129
- index: fieldIndex
130
- }),
131
- isVisible: isVerticalDropzoneVisible(noConflict(item => fieldTypes.includes(item.type) && (row.length < 4 || get(item, "pos.row") === index)))
132
- }), /*#__PURE__*/React.createElement("div", {
133
- className: "cursor-grab bg-neutral-base p-md shadow-sm rounded-xs"
134
- }, /*#__PURE__*/React.createElement(Field, {
135
- parent: parent,
136
- field: field,
137
- onEdit: editField,
138
- onDelete: deleteField
139
- })), fieldIndex === row.length - 1 && /*#__PURE__*/React.createElement(Vertical, {
140
- last: true,
141
- depth: depth,
142
- isVisible: isVerticalDropzoneVisible(noConflict(item => {
143
- return fieldTypes.includes(item.type) && (row.length < 4 || get(item, "pos.row") === index);
144
- })),
145
- onDrop: item => onFieldDrop(item, {
146
- row: index,
147
- index: fieldIndex + 1
148
- })
149
- })))))), index === fields.length - 1 ? /*#__PURE__*/React.createElement(Horizontal, {
150
- "data-testid": `cms-editor-row-droppable-bottom-${index}`,
151
- last: true,
152
- isVisible: isHorizontalDropzoneVisible(noConflict()),
153
- onDrop: item => onFieldDrop(item, {
154
- row: index + 1,
155
- index: null
156
- })
157
- }) : null))), field ? /*#__PURE__*/React.createElement(ModelFieldProvider, {
163
+ const field = cell;
164
+ return /*#__PURE__*/React.createElement(ModelFieldProvider, {
165
+ field: field,
166
+ key: field.fieldId
167
+ }, /*#__PURE__*/React.createElement(Draggable, {
168
+ beginDrag: {
169
+ parent: parent ? parent.fieldId : null,
170
+ type: "field",
171
+ field,
172
+ pos: {
173
+ row: index,
174
+ index: fieldIndex
175
+ }
176
+ },
177
+ endDrag: onEndDrag
178
+ }, ({
179
+ drag
180
+ }) => /*#__PURE__*/React.createElement("div", {
181
+ className: cn(["relative", "flex-1 basis-full", "mx-sm"]),
182
+ ref: drag
183
+ }, /*#__PURE__*/React.createElement(Vertical, {
184
+ depth: depth,
185
+ onDrop: item => onFieldDrop(item, {
186
+ row: index,
187
+ index: fieldIndex
188
+ }),
189
+ isVisible: isVerticalDropzoneVisible(noConflict(item => fieldTypes.includes(item.type) && (row.length < 4 || get(item, "pos.row") === index)))
190
+ }), /*#__PURE__*/React.createElement("div", {
191
+ className: "cursor-grab bg-neutral-base p-md shadow-sm rounded-xs"
192
+ }, /*#__PURE__*/React.createElement(Field, {
193
+ parent: parent,
194
+ field: field,
195
+ onEdit: editField,
196
+ onDelete: deleteField
197
+ })), fieldIndex === row.length - 1 && /*#__PURE__*/React.createElement(Vertical, {
198
+ last: true,
199
+ depth: depth,
200
+ isVisible: isVerticalDropzoneVisible(noConflict(item => {
201
+ return fieldTypes.includes(item.type) && (row.length < 4 || get(item, "pos.row") === index);
202
+ })),
203
+ onDrop: item => onFieldDrop(item, {
204
+ row: index,
205
+ index: fieldIndex + 1
206
+ })
207
+ }))));
208
+ })), index === fields.length - 1 ? /*#__PURE__*/React.createElement(Horizontal, {
209
+ "data-testid": `cms-editor-row-droppable-bottom-${index}`,
210
+ last: true,
211
+ isVisible: isHorizontalDropzoneVisible(noConflict()),
212
+ onDrop: item => onFieldDrop(item, {
213
+ row: index + 1,
214
+ index: null
215
+ })
216
+ }) : null));
217
+ }), field ? /*#__PURE__*/React.createElement(ModelFieldProvider, {
158
218
  field: field
159
219
  }, /*#__PURE__*/React.createElement(EditFieldDialog, {
160
220
  onClose: () => editField(null),
@@ -1 +1 @@
1
- {"version":3,"names":["React","Fragment","get","i18n","ReactComponent","DragIcon","Center","Horizontal","Vertical","Draggable","EditFieldDialog","Field","useModelFieldEditor","FieldEditorProvider","ModelFieldProvider","cn","Icon","t","namespace","fieldTypes","Editor","parent","depth","insertField","updateField","deleteField","fields","noConflict","editField","onFieldDrop","onEndDrag","field","dropTarget","getFieldPlugin","canDropIntoField","draggable","fieldPlugin","type","canAccept","isVerticalDropzoneVisible","cb","item","allowLayout","isHorizontalDropzoneVisible","createElement","length","isDroppable","onDrop","row","index","map","beginDrag","fieldId","pos","endDrag","key","f","join","drag","isDragging","className","ref","icon","label","color","size","isVisible","fieldIndex","includes","onEdit","onDelete","last","onClose","onSubmit","id","position","FieldEditor","props"],"sources":["FieldEditor.tsx"],"sourcesContent":["import React, { Fragment } from \"react\";\nimport get from \"lodash/get.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { ReactComponent as DragIcon } from \"@webiny/icons/drag_indicator.svg\";\nimport { Center, Horizontal, Vertical } from \"../DropZone/index.js\";\nimport Draggable from \"../Draggable.js\";\nimport EditFieldDialog from \"./EditFieldDialog.js\";\nimport Field from \"./Field.js\";\nimport { useModelFieldEditor } from \"./useModelFieldEditor.js\";\nimport type { IsVisibleCallable } from \"./FieldEditorContext.js\";\nimport { FieldEditorProvider } from \"./FieldEditorContext.js\";\nimport type {\n CmsEditorFieldsLayout,\n CmsModelField,\n CmsModelFieldTypePlugin,\n DragSource\n} from \"~/types.js\";\nimport { ModelFieldProvider } from \"~/admin/components/ModelFieldProvider/index.js\";\nimport { cn, Icon } from \"@webiny/admin-ui\";\n\nconst t = i18n.namespace(\"app-headless-cms/admin/components/editor\");\n\nconst fieldTypes: string[] = [\"field\", \"newField\"];\n\nconst Editor = () => {\n const {\n parent,\n depth,\n insertField,\n updateField,\n deleteField,\n fields,\n noConflict,\n editField,\n onFieldDrop,\n onEndDrag,\n field,\n dropTarget,\n getFieldPlugin\n } = useModelFieldEditor();\n\n const canDropIntoField = (field: CmsModelField, draggable: DragSource) => {\n const fieldPlugin = getFieldPlugin(field.type) as CmsModelFieldTypePlugin;\n const canAccept = fieldPlugin.field.canAccept;\n if (typeof canAccept === \"function\" && !canAccept(field, draggable)) {\n return false;\n }\n\n return true;\n };\n\n const isVerticalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n if (!parent) {\n return cb(item);\n }\n\n const fieldPlugin = getFieldPlugin(parent.type) as CmsModelFieldTypePlugin;\n const allowLayout = fieldPlugin.field.allowLayout ?? true;\n if (!allowLayout) {\n return false;\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n const isHorizontalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n if (!parent) {\n return cb(item);\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n return (\n <Fragment>\n {fields.length === 0 && (\n <Center\n isDroppable={isHorizontalDropzoneVisible(() => true)}\n onDrop={item =>\n onFieldDrop(item, {\n row: 0,\n index: 0\n })\n }\n >\n {t`Drop your first field here`}\n </Center>\n )}\n\n {fields.map((row, index) => (\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"row\",\n fields: row,\n pos: { row: index }\n }}\n endDrag={onEndDrag}\n key={row.map(f => f.fieldId).join(\".\")}\n >\n {(\n {\n drag,\n isDragging\n } /* RowContainer start - includes drag handle, drop zones and the Row itself. */\n ) => (\n <div\n className={cn([\n \"flex flex-column\",\n \"relative\",\n \"mb-md last-of-type:mb-none\",\n \"bg-neutral-dimmed\",\n isDragging ? \"opacity-30\" : \"opacity-100\"\n ])}\n >\n <div\n className={cn([\n \"cursor-grab\",\n \"absolute left-sm-plus top-sm-plus z-10\"\n ])}\n ref={drag}\n >\n <Icon\n icon={<DragIcon />}\n label={\"Drag to move this row\"}\n color={\"neutral-light\"}\n size={\"sm\"}\n />\n </div>\n <Horizontal\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n data-testid={`cms-editor-row-droppable-top-${index}`}\n onDrop={item => onFieldDrop(item, { row: index, index: null })}\n />\n {/* Row start - includes field drop zones and fields */}\n <div\n className={cn([\"w-full flex justify-between\", \"pl-xl pr-sm py-sm\"])}\n data-testid={\"cms.editor.field-row\"}\n >\n {row.map((field, fieldIndex) => (\n <ModelFieldProvider field={field} key={field.fieldId}>\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"field\",\n field,\n pos: {\n row: index,\n index: fieldIndex\n }\n }}\n endDrag={onEndDrag}\n >\n {({ drag }) => (\n <div\n className={cn([\n \"relative\",\n \"flex-1 basis-full\",\n \"mx-sm\"\n ])}\n ref={drag}\n >\n <Vertical\n depth={depth}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex\n })\n }\n isVisible={isVerticalDropzoneVisible(\n noConflict(\n item =>\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(item, \"pos.row\") ===\n index)\n )\n )}\n />\n\n <div\n className={\n \"cursor-grab bg-neutral-base p-md shadow-sm rounded-xs\"\n }\n >\n <Field\n parent={parent}\n field={field}\n onEdit={editField}\n onDelete={deleteField}\n />\n </div>\n\n {/* Field end */}\n {fieldIndex === row.length - 1 && (\n <Vertical\n last\n depth={depth}\n isVisible={isVerticalDropzoneVisible(\n noConflict(item => {\n return (\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(item, \"pos.row\") ===\n index)\n );\n })\n )}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex + 1\n })\n }\n />\n )}\n </div>\n )}\n </Draggable>\n </ModelFieldProvider>\n ))}\n </div>\n {/* Row end */}\n {index === fields.length - 1 ? (\n <Horizontal\n data-testid={`cms-editor-row-droppable-bottom-${index}`}\n last\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n onDrop={item =>\n onFieldDrop(item, {\n row: index + 1,\n index: null\n })\n }\n />\n ) : null}\n </div>\n )}\n </Draggable>\n ))}\n\n {field ? (\n <ModelFieldProvider field={field}>\n <EditFieldDialog\n onClose={() => editField(null)}\n onSubmit={field => {\n if (field.id) {\n updateField(field);\n editField(null);\n return;\n }\n insertField({ field, position: dropTarget });\n\n editField(null);\n }}\n />\n </ModelFieldProvider>\n ) : null}\n </Fragment>\n );\n};\n\nexport interface FieldEditorProps {\n parent?: CmsModelField;\n layout: CmsEditorFieldsLayout;\n fields: CmsModelField[];\n onChange: (params: { fields: CmsModelField[]; layout: CmsEditorFieldsLayout }) => void;\n}\n\nexport const FieldEditor = (props: FieldEditorProps) => {\n return (\n <FieldEditorProvider {...props}>\n <Editor />\n </FieldEditorProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Fragment","get","i18n","ReactComponent","DragIcon","Center","Horizontal","Vertical","Draggable","EditFieldDialog","Field","LayoutCell","useModelFieldEditor","FieldEditorProvider","isLayoutDescriptor","ModelFieldProvider","cn","Icon","t","namespace","fieldTypes","Editor","parent","depth","insertField","updateField","deleteField","fields","noConflict","editField","onFieldDrop","onEndDrag","field","dropTarget","getFieldPlugin","getLayoutFieldPlugin","getField","collectDescriptorFields","descriptor","plugin","type","collectFields","id","canDropIntoField","draggable","fieldPlugin","canAccept","isVerticalDropzoneVisible","cb","item","allowLayout","isHorizontalDropzoneVisible","createElement","length","isDroppable","onDrop","row","index","map","rowKey","cell","fieldId","join","beginDrag","filter","pos","endDrag","key","drag","isDragging","className","ref","icon","label","color","size","isVisible","fieldIndex","rowIndex","cellIndex","includes","onEdit","onDelete","last","onClose","onSubmit","position","FieldEditor","props"],"sources":["FieldEditor.tsx"],"sourcesContent":["import React, { Fragment } from \"react\";\nimport get from \"lodash/get.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { ReactComponent as DragIcon } from \"@webiny/icons/drag_indicator.svg\";\nimport { Center, Horizontal, Vertical } from \"../DropZone/index.js\";\nimport Draggable from \"../Draggable.js\";\nimport EditFieldDialog from \"./EditFieldDialog.js\";\nimport Field from \"./Field.js\";\nimport { LayoutCell } from \"./LayoutCell.js\";\nimport { useModelFieldEditor } from \"./useModelFieldEditor.js\";\nimport type { IsVisibleCallable } from \"./FieldEditorContext.js\";\nimport { FieldEditorProvider } from \"./FieldEditorContext.js\";\nimport type { CmsEditorFieldsLayout, CmsModelField, DragSource } from \"~/types.js\";\nimport type { CmsLayoutDescriptor } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { isLayoutDescriptor } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { ModelFieldProvider } from \"~/admin/components/ModelFieldProvider/index.js\";\nimport { cn, Icon } from \"@webiny/admin-ui\";\n\nconst t = i18n.namespace(\"app-headless-cms/admin/components/editor\");\n\nconst fieldTypes: string[] = [\"field\", \"newField\"];\n\nconst Editor = () => {\n const {\n parent,\n depth,\n insertField,\n updateField,\n deleteField,\n fields,\n noConflict,\n editField,\n onFieldDrop,\n onEndDrag,\n field,\n dropTarget,\n getFieldPlugin,\n getLayoutFieldPlugin,\n getField\n } = useModelFieldEditor();\n\n /**\n * Collect all data fields referenced inside a layout descriptor (e.g. fields inside tabs).\n * Delegates to the layout field plugin's `collectFields` method if available.\n */\n const collectDescriptorFields = (descriptor: CmsLayoutDescriptor): CmsModelField[] => {\n const plugin = getLayoutFieldPlugin(descriptor.type);\n if (!plugin?.field.collectFields) {\n return [];\n }\n return plugin.field.collectFields({\n descriptor,\n getField: (id: string) => getField({ id })\n });\n };\n\n const canDropIntoField = (field: CmsModelField, draggable: DragSource) => {\n const fieldPlugin = getFieldPlugin(field.type);\n if (!fieldPlugin) {\n return true;\n }\n const canAccept = fieldPlugin.field.canAccept;\n if (typeof canAccept === \"function\" && !canAccept(field, draggable)) {\n return false;\n }\n\n return true;\n };\n\n const isVerticalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n // Layout fields always occupy full row — no side-by-side layout\n if (item.type === \"newLayoutField\" || item.type === \"layoutField\") {\n return false;\n }\n\n if (!parent) {\n return cb(item);\n }\n\n const fieldPlugin = getFieldPlugin(parent.type);\n if (fieldPlugin) {\n const allowLayout = fieldPlugin.field.allowLayout ?? true;\n if (!allowLayout) {\n return false;\n }\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n const isHorizontalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n if (!parent) {\n return cb(item);\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n return (\n <Fragment>\n {fields.length === 0 && (\n <Center\n isDroppable={isHorizontalDropzoneVisible(() => true)}\n onDrop={item =>\n onFieldDrop(item, {\n row: 0,\n index: 0\n })\n }\n >\n {t`Drop your first field here`}\n </Center>\n )}\n\n {fields.map((row, index) => {\n // Build a stable key for the row\n const rowKey = row\n .map(cell =>\n isLayoutDescriptor(cell) ? cell.id : (cell as CmsModelField).fieldId\n )\n .join(\".\");\n\n return (\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"row\",\n fields: row.filter(\n cell => !isLayoutDescriptor(cell)\n ) as CmsModelField[],\n pos: { row: index }\n }}\n endDrag={onEndDrag}\n key={rowKey}\n >\n {(\n {\n drag,\n isDragging\n } /* RowContainer start - includes drag handle, drop zones and the Row itself. */\n ) => (\n <div\n className={cn([\n \"flex flex-column\",\n \"relative\",\n \"mb-md last-of-type:mb-none\",\n \"bg-neutral-dimmed\",\n isDragging ? \"opacity-30\" : \"opacity-100\"\n ])}\n >\n <div\n className={cn([\n \"cursor-grab\",\n \"absolute left-sm-plus top-sm-plus z-10\"\n ])}\n ref={drag}\n >\n <Icon\n icon={<DragIcon />}\n label={\"Drag to move this row\"}\n color={\"neutral-light\"}\n size={\"sm\"}\n />\n </div>\n <Horizontal\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n data-testid={`cms-editor-row-droppable-top-${index}`}\n onDrop={item => onFieldDrop(item, { row: index, index: null })}\n />\n {/* Row start - includes field drop zones and fields */}\n <div\n className={cn([\n \"w-full flex justify-between\",\n \"pl-xl pr-sm py-sm\"\n ])}\n data-testid={\"cms.editor.field-row\"}\n >\n {row.map((cell, fieldIndex) => {\n if (isLayoutDescriptor(cell)) {\n return (\n <Draggable\n key={cell.id}\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"layoutField\",\n descriptor: cell,\n fields: collectDescriptorFields(cell)\n }}\n endDrag={onEndDrag}\n >\n {({ drag }) => (\n <div\n ref={drag}\n className={cn([\n \"relative\",\n \"flex-1 basis-full\",\n \"mx-sm\"\n ])}\n >\n <div\n className={\n \"cursor-grab bg-neutral-base p-md shadow-sm rounded-xs\"\n }\n >\n <LayoutCell\n descriptor={cell}\n rowIndex={index}\n cellIndex={fieldIndex}\n />\n </div>\n </div>\n )}\n </Draggable>\n );\n }\n\n const field = cell as CmsModelField;\n return (\n <ModelFieldProvider field={field} key={field.fieldId}>\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"field\",\n field,\n pos: {\n row: index,\n index: fieldIndex\n }\n }}\n endDrag={onEndDrag}\n >\n {({ drag }) => (\n <div\n className={cn([\n \"relative\",\n \"flex-1 basis-full\",\n \"mx-sm\"\n ])}\n ref={drag}\n >\n <Vertical\n depth={depth}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex\n })\n }\n isVisible={isVerticalDropzoneVisible(\n noConflict(\n item =>\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(\n item,\n \"pos.row\"\n ) === index)\n )\n )}\n />\n\n <div\n className={\n \"cursor-grab bg-neutral-base p-md shadow-sm rounded-xs\"\n }\n >\n <Field\n parent={parent}\n field={field}\n onEdit={editField}\n onDelete={deleteField}\n />\n </div>\n\n {/* Field end */}\n {fieldIndex === row.length - 1 && (\n <Vertical\n last\n depth={depth}\n isVisible={isVerticalDropzoneVisible(\n noConflict(item => {\n return (\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(\n item,\n \"pos.row\"\n ) === index)\n );\n })\n )}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex + 1\n })\n }\n />\n )}\n </div>\n )}\n </Draggable>\n </ModelFieldProvider>\n );\n })}\n </div>\n {/* Row end */}\n {index === fields.length - 1 ? (\n <Horizontal\n data-testid={`cms-editor-row-droppable-bottom-${index}`}\n last\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n onDrop={item =>\n onFieldDrop(item, {\n row: index + 1,\n index: null\n })\n }\n />\n ) : null}\n </div>\n )}\n </Draggable>\n );\n })}\n\n {field ? (\n <ModelFieldProvider field={field}>\n <EditFieldDialog\n onClose={() => editField(null)}\n onSubmit={field => {\n if (field.id) {\n updateField(field);\n editField(null);\n return;\n }\n insertField({ field, position: dropTarget });\n\n editField(null);\n }}\n />\n </ModelFieldProvider>\n ) : null}\n </Fragment>\n );\n};\n\nexport interface FieldEditorProps {\n parent?: CmsModelField;\n layout: CmsEditorFieldsLayout;\n fields: CmsModelField[];\n onChange: (params: { fields: CmsModelField[]; layout: CmsEditorFieldsLayout }) => void;\n}\n\nexport const FieldEditor = (props: FieldEditorProps) => {\n return (\n <FieldEditorProvider {...props}>\n <Editor />\n </FieldEditorProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
- import type { CmsEditorFieldId, CmsEditorFieldRendererPlugin, CmsEditorFieldsLayout, CmsEditorFieldTypePlugin, CmsModelField, DragSource, FieldLayoutPosition } from "../../../types.js";
2
+ import type { CmsEditorFieldId, CmsEditorFieldRendererPlugin, CmsEditorFieldsLayout, CmsEditorFieldTypePlugin, CmsLayoutFieldTypePlugin, CmsModelField, DragSource, FieldLayoutPosition } from "../../../types.js";
3
+ import type { CmsLayoutDescriptor } from "@webiny/app-headless-cms-common/types/model.js";
3
4
  import type { FieldEditorProps } from "./FieldEditor.js";
4
5
  import type { DragSourceMonitor } from "react-dnd";
5
6
  interface DropTarget {
@@ -17,12 +18,33 @@ interface InsertFieldParams {
17
18
  field: CmsModelField;
18
19
  position: FieldLayoutPosition;
19
20
  }
21
+ interface AddFieldCallable {
22
+ (field: CmsModelField): void;
23
+ }
24
+ interface RemoveFieldCallable {
25
+ (fieldId: string): void;
26
+ }
20
27
  interface MoveFieldParams {
21
28
  field: CmsEditorFieldId | CmsModelField;
22
29
  position: FieldLayoutPosition;
23
30
  }
24
31
  interface GetFieldsInLayoutCallable {
25
- (): CmsModelField[][];
32
+ (): (CmsModelField | CmsLayoutDescriptor)[][];
33
+ }
34
+ interface InsertLayoutCellCallable {
35
+ (descriptor: Omit<CmsLayoutDescriptor, "id"> | CmsLayoutDescriptor, position: FieldLayoutPosition): void;
36
+ }
37
+ interface UpdateLayoutCellCallable {
38
+ (descriptorId: string, descriptor: CmsLayoutDescriptor): void;
39
+ }
40
+ interface DeleteLayoutCellCallable {
41
+ (descriptorId: string): void;
42
+ }
43
+ interface MoveLayoutCellCallable {
44
+ (descriptorId: string, position: FieldLayoutPosition): void;
45
+ }
46
+ interface GetLayoutFieldPluginCallable {
47
+ (type: string): CmsLayoutFieldTypePlugin | undefined;
26
48
  }
27
49
  interface GetFieldPluginCallable {
28
50
  (type: string): CmsEditorFieldTypePlugin | undefined;
@@ -61,7 +83,7 @@ interface NoConflictCallable {
61
83
  (cb?: IsVisibleCallable): (item: DragSource) => boolean;
62
84
  }
63
85
  export interface FieldEditorContext {
64
- fields: CmsModelField[][];
86
+ fields: (CmsModelField | CmsLayoutDescriptor)[][];
65
87
  noConflict: NoConflictCallable;
66
88
  layout: CmsEditorFieldsLayout;
67
89
  onChange?: (data: any) => void;
@@ -72,6 +94,7 @@ export interface FieldEditorContext {
72
94
  editField: (field: CmsModelField | null) => void;
73
95
  field: CmsModelField | null;
74
96
  parent?: CmsModelField;
97
+ parentEditorContext?: FieldEditorContext;
75
98
  depth: number;
76
99
  dropTarget: DropTarget;
77
100
  onFieldDrop: OnFieldDropCallable;
@@ -81,6 +104,13 @@ export interface FieldEditorContext {
81
104
  moveRow: MoveRowCallable;
82
105
  updateField: UpdateFieldCallable;
83
106
  deleteField: DeleteFieldCallable;
107
+ insertLayoutCell: InsertLayoutCellCallable;
108
+ updateLayoutCell: UpdateLayoutCellCallable;
109
+ deleteLayoutCell: DeleteLayoutCellCallable;
110
+ moveLayoutCell: MoveLayoutCellCallable;
111
+ getLayoutFieldPlugin: GetLayoutFieldPluginCallable;
112
+ addField: AddFieldCallable;
113
+ removeField: RemoveFieldCallable;
84
114
  }
85
115
  interface FieldEditorProviderProps extends FieldEditorProps {
86
116
  children: React.ReactElement;