@webiny/app-headless-cms 6.0.0-rc.2 → 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 (169) 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/ContentModelEditor/ContentModelEditor.js +1 -6
  14. package/admin/components/ContentModelEditor/ContentModelEditor.js.map +1 -1
  15. package/admin/components/ContentModelEditor/ContentModelEditorProvider.d.ts +2 -0
  16. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js +14 -2
  17. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
  18. package/admin/components/ContentModelEditor/FieldsSidebar.js +51 -2
  19. package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
  20. package/admin/components/Droppable.d.ts +1 -1
  21. package/admin/components/Droppable.js.map +1 -1
  22. package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js +3 -3
  23. package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js.map +1 -1
  24. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.d.ts +10 -0
  25. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js +69 -0
  26. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js.map +1 -0
  27. package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js +27 -9
  28. package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js.map +1 -1
  29. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.d.ts +2 -0
  30. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js +14 -0
  31. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js.map +1 -0
  32. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.d.ts +15 -0
  33. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js +131 -0
  34. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js.map +1 -0
  35. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.d.ts +4 -0
  36. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js +74 -0
  37. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js.map +1 -0
  38. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.d.ts +13 -0
  39. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js +203 -0
  40. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js.map +1 -0
  41. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.d.ts +1 -0
  42. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js +3 -0
  43. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js.map +1 -0
  44. package/admin/components/FieldEditor/EditFieldDialog.js +13 -56
  45. package/admin/components/FieldEditor/EditFieldDialog.js.map +1 -1
  46. package/admin/components/FieldEditor/EditFieldDialogContainer.d.ts +12 -0
  47. package/admin/components/FieldEditor/EditFieldDialogContainer.js +40 -0
  48. package/admin/components/FieldEditor/EditFieldDialogContainer.js.map +1 -0
  49. package/admin/components/FieldEditor/EditFieldDrawerContainer.d.ts +12 -0
  50. package/admin/components/FieldEditor/EditFieldDrawerContainer.js +40 -0
  51. package/admin/components/FieldEditor/EditFieldDrawerContainer.js.map +1 -0
  52. package/admin/components/FieldEditor/FieldEditor.js +148 -88
  53. package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
  54. package/admin/components/FieldEditor/FieldEditorContext.d.ts +33 -3
  55. package/admin/components/FieldEditor/FieldEditorContext.js +225 -6
  56. package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
  57. package/admin/components/FieldEditor/LayoutCell.d.ts +9 -0
  58. package/admin/components/FieldEditor/LayoutCell.js +33 -0
  59. package/admin/components/FieldEditor/LayoutCell.js.map +1 -0
  60. package/admin/components/FieldEditor/utils/deleteField.js +12 -4
  61. package/admin/components/FieldEditor/utils/deleteField.js.map +1 -1
  62. package/admin/components/FieldEditor/utils/getFieldPosition.js +6 -1
  63. package/admin/components/FieldEditor/utils/getFieldPosition.js.map +1 -1
  64. package/admin/graphql/contentModels.d.ts +2 -2
  65. package/admin/graphql/contentModels.js +7 -0
  66. package/admin/graphql/contentModels.js.map +1 -1
  67. package/admin/hooks/useModelFieldGraphqlContext.d.ts +1 -0
  68. package/admin/plugins/fieldRenderers/DynamicSection.d.ts +2 -1
  69. package/admin/plugins/fieldRenderers/DynamicSection.js +3 -1
  70. package/admin/plugins/fieldRenderers/DynamicSection.js.map +1 -1
  71. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js +7 -1
  72. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js.map +1 -1
  73. package/admin/plugins/fieldRenderers/checkboxes.js +7 -1
  74. package/admin/plugins/fieldRenderers/checkboxes.js.map +1 -1
  75. package/admin/plugins/fieldRenderers/dateTime/Input.js +9 -2
  76. package/admin/plugins/fieldRenderers/dateTime/Input.js.map +1 -1
  77. package/admin/plugins/fieldRenderers/dateTime/Select.js +7 -0
  78. package/admin/plugins/fieldRenderers/dateTime/Select.js.map +1 -1
  79. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.d.ts +1 -0
  80. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js +9 -5
  81. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js.map +1 -1
  82. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.d.ts +2 -1
  83. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js +18 -10
  84. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js.map +1 -1
  85. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js +13 -4
  86. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js.map +1 -1
  87. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js +10 -4
  88. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js.map +1 -1
  89. package/admin/plugins/fieldRenderers/longText/longText.js +7 -1
  90. package/admin/plugins/fieldRenderers/longText/longText.js.map +1 -1
  91. package/admin/plugins/fieldRenderers/longText/longTexts.js +12 -3
  92. package/admin/plugins/fieldRenderers/longText/longTexts.js.map +1 -1
  93. package/admin/plugins/fieldRenderers/number/numberInput.js +7 -1
  94. package/admin/plugins/fieldRenderers/number/numberInput.js.map +1 -1
  95. package/admin/plugins/fieldRenderers/number/numberInputs.js +11 -3
  96. package/admin/plugins/fieldRenderers/number/numberInputs.js.map +1 -1
  97. package/admin/plugins/fieldRenderers/object/FieldSettings.d.ts +2 -1
  98. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js +5 -0
  99. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js.map +1 -1
  100. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.d.ts +1 -0
  101. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js +3 -2
  102. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js.map +1 -1
  103. package/admin/plugins/fieldRenderers/radioButtons.js +7 -1
  104. package/admin/plugins/fieldRenderers/radioButtons.js.map +1 -1
  105. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js +15 -7
  106. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js.map +1 -1
  107. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js +14 -7
  108. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js.map +1 -1
  109. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.d.ts +3 -1
  110. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js +7 -6
  111. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js.map +1 -1
  112. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.d.ts +1 -1
  113. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js +9 -3
  114. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js.map +1 -1
  115. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.d.ts +1 -1
  116. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js +9 -3
  117. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js.map +1 -1
  118. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js +7 -1
  119. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js.map +1 -1
  120. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js +7 -1
  121. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js.map +1 -1
  122. package/admin/plugins/fieldRenderers/select.js +7 -1
  123. package/admin/plugins/fieldRenderers/select.js.map +1 -1
  124. package/admin/plugins/fieldRenderers/text/tags.js +7 -1
  125. package/admin/plugins/fieldRenderers/text/tags.js.map +1 -1
  126. package/admin/plugins/fieldRenderers/text/textInput.js +7 -1
  127. package/admin/plugins/fieldRenderers/text/textInput.js.map +1 -1
  128. package/admin/plugins/fieldRenderers/text/textInputs.js +12 -3
  129. package/admin/plugins/fieldRenderers/text/textInputs.js.map +1 -1
  130. package/admin/plugins/fields/ui/TabsLayoutEditor.d.ts +9 -0
  131. package/admin/plugins/fields/ui/TabsLayoutEditor.js +470 -0
  132. package/admin/plugins/fields/ui/TabsLayoutEditor.js.map +1 -0
  133. package/admin/plugins/fields/ui/alert.d.ts +2 -2
  134. package/admin/plugins/fields/ui/alert.js +144 -17
  135. package/admin/plugins/fields/ui/alert.js.map +1 -1
  136. package/admin/plugins/fields/ui/index.d.ts +1 -0
  137. package/admin/plugins/fields/ui/index.js +1 -0
  138. package/admin/plugins/fields/ui/index.js.map +1 -1
  139. package/admin/plugins/fields/ui/separator.d.ts +2 -2
  140. package/admin/plugins/fields/ui/separator.js +131 -17
  141. package/admin/plugins/fields/ui/separator.js.map +1 -1
  142. package/admin/plugins/fields/ui/tabs.d.ts +2 -0
  143. package/admin/plugins/fields/ui/tabs.js +89 -0
  144. package/admin/plugins/fields/ui/tabs.js.map +1 -0
  145. package/admin/plugins/index.d.ts +1 -0
  146. package/admin/views/contentEntries/hooks/useContentEntriesList.d.ts +1 -0
  147. package/admin/views/contentEntries/hooks/useContentEntriesList.js +4 -2
  148. package/admin/views/contentEntries/hooks/useContentEntriesList.js.map +1 -1
  149. package/admin/views/contentModels/importing/graphql.d.ts +2 -2
  150. package/admin/views/contentModels/importing/graphql.js.map +1 -1
  151. package/allPlugins.d.ts +2 -1
  152. package/allPlugins.js +2 -3
  153. package/allPlugins.js.map +1 -1
  154. package/exports/admin/cms/model.d.ts +1 -0
  155. package/exports/admin/cms/model.js +3 -0
  156. package/exports/admin/cms/model.js.map +1 -0
  157. package/package.json +23 -23
  158. package/types.d.ts +1 -0
  159. package/types.js +5 -1
  160. package/types.js.map +1 -1
  161. package/admin/plugins/fieldRenderers/ui/alert.d.ts +0 -2
  162. package/admin/plugins/fieldRenderers/ui/alert.js +0 -32
  163. package/admin/plugins/fieldRenderers/ui/alert.js.map +0 -1
  164. package/admin/plugins/fieldRenderers/ui/index.d.ts +0 -2
  165. package/admin/plugins/fieldRenderers/ui/index.js +0 -4
  166. package/admin/plugins/fieldRenderers/ui/index.js.map +0 -1
  167. package/admin/plugins/fieldRenderers/ui/separator.d.ts +0 -2
  168. package/admin/plugins/fieldRenderers/ui/separator.js +0 -31
  169. package/admin/plugins/fieldRenderers/ui/separator.js.map +0 -1
@@ -0,0 +1,470 @@
1
+ import React, { useCallback, useRef, useEffect } from "react";
2
+ import { Accordion, Tabs } from "@webiny/admin-ui";
3
+ import { ReactComponent as EditIcon } from "@webiny/icons/edit.svg";
4
+ import { ReactComponent as DeleteIcon } from "@webiny/icons/delete.svg";
5
+ import { ReactComponent as ArrowUpIcon } from "@webiny/icons/expand_less.svg";
6
+ import { ReactComponent as ArrowDownIcon } from "@webiny/icons/expand_more.svg";
7
+ import { ReactComponent as AddIcon } from "@webiny/icons/add.svg";
8
+ import { generateAlphaNumericLowerCaseId } from "@webiny/utils";
9
+ import { useConfirmationDialog, useDialogs } from "@webiny/app-admin";
10
+ import { Grid } from "@webiny/admin-ui";
11
+ import { IconButton } from "@webiny/admin-ui";
12
+ import { Button } from "@webiny/admin-ui";
13
+ import { Input } from "@webiny/admin-ui";
14
+ import { Textarea } from "@webiny/admin-ui";
15
+ import { Heading } from "@webiny/admin-ui";
16
+ import { Text } from "@webiny/admin-ui";
17
+ import { Bind } from "@webiny/form";
18
+ import { FieldEditor } from "../../../components/FieldEditor/index.js";
19
+ import { IconPicker } from "../../../components/IconPicker.js";
20
+ import { useModelFieldEditor } from "../../../hooks/index.js";
21
+ import { PermissionsTab } from "../../../components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js";
22
+ import { RulesTab } from "../../../components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js";
23
+ import { useModelEditor } from "../../../components/ContentModelEditor/useModelEditor.js";
24
+ const TabsSettings = () => {
25
+ return /*#__PURE__*/React.createElement(Grid, {
26
+ className: "mt-md"
27
+ }, /*#__PURE__*/React.createElement(Grid.Column, {
28
+ span: 12
29
+ }, /*#__PURE__*/React.createElement(Bind, {
30
+ name: "label"
31
+ }, /*#__PURE__*/React.createElement(Input, {
32
+ label: "Label"
33
+ }))), /*#__PURE__*/React.createElement(Grid.Column, {
34
+ span: 12
35
+ }, /*#__PURE__*/React.createElement(Bind, {
36
+ name: "description"
37
+ }, /*#__PURE__*/React.createElement(Input, {
38
+ label: "Description"
39
+ }))), /*#__PURE__*/React.createElement(Grid.Column, {
40
+ span: 12
41
+ }, /*#__PURE__*/React.createElement(Bind, {
42
+ name: "help"
43
+ }, /*#__PURE__*/React.createElement(Textarea, {
44
+ label: "Help"
45
+ }))));
46
+ };
47
+ const TabsDialogContent = ({
48
+ fieldOptions
49
+ }) => {
50
+ return /*#__PURE__*/React.createElement(Tabs, {
51
+ size: "md",
52
+ separator: true,
53
+ tabs: [/*#__PURE__*/React.createElement(Tabs.Tab, {
54
+ key: "tabs",
55
+ trigger: "Tabs",
56
+ value: "tabs",
57
+ content: /*#__PURE__*/React.createElement(TabsSettings, null)
58
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
59
+ key: "permissions",
60
+ trigger: "Permissions",
61
+ value: "permissions",
62
+ content: /*#__PURE__*/React.createElement(PermissionsTab, {
63
+ gridClassName: "mt-md"
64
+ })
65
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
66
+ key: "rules",
67
+ trigger: "Rules",
68
+ value: "rules",
69
+ content: /*#__PURE__*/React.createElement(RulesTab, {
70
+ gridClassName: "mt-md",
71
+ fieldOptions: fieldOptions
72
+ })
73
+ })]
74
+ });
75
+ };
76
+ const TabSettingsFields = () => {
77
+ return /*#__PURE__*/React.createElement(Grid, {
78
+ className: "mt-md"
79
+ }, /*#__PURE__*/React.createElement(Grid.Column, {
80
+ span: 12
81
+ }, /*#__PURE__*/React.createElement(Bind, {
82
+ name: "label"
83
+ }, /*#__PURE__*/React.createElement(Input, {
84
+ label: "Label"
85
+ }))), /*#__PURE__*/React.createElement(Grid.Column, {
86
+ span: 12
87
+ }, /*#__PURE__*/React.createElement(Bind, {
88
+ name: "icon"
89
+ }, /*#__PURE__*/React.createElement(IconPicker, {
90
+ label: "Icon"
91
+ }))));
92
+ };
93
+ const TabDialogContent = ({
94
+ fieldOptions
95
+ }) => {
96
+ return /*#__PURE__*/React.createElement(Tabs, {
97
+ size: "md",
98
+ separator: true,
99
+ tabs: [/*#__PURE__*/React.createElement(Tabs.Tab, {
100
+ key: "tab",
101
+ trigger: "Tab",
102
+ value: "tab",
103
+ content: /*#__PURE__*/React.createElement(TabSettingsFields, null)
104
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
105
+ key: "permissions",
106
+ trigger: "Permissions",
107
+ value: "permissions",
108
+ content: /*#__PURE__*/React.createElement(PermissionsTab, {
109
+ gridClassName: "mt-md"
110
+ })
111
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
112
+ key: "rules",
113
+ trigger: "Rules",
114
+ value: "rules",
115
+ content: /*#__PURE__*/React.createElement(RulesTab, {
116
+ gridClassName: "mt-md",
117
+ fieldOptions: fieldOptions
118
+ })
119
+ })]
120
+ });
121
+ };
122
+
123
+ /**
124
+ * Create a synthetic parent field for a tab so that each tab's FieldEditor
125
+ * has a unique identity for cross-parent drag & drop detection.
126
+ */
127
+ function createTabParent(tab) {
128
+ return {
129
+ id: tab.id,
130
+ fieldId: `tab:${tab.id}`,
131
+ type: "tab",
132
+ label: tab.label,
133
+ renderer: {
134
+ name: ""
135
+ }
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Resolve fields for a tab by looking up field IDs in the parent's fields array.
141
+ */
142
+ function resolveTabFields(tab, parentFields) {
143
+ const fieldIds = new Set();
144
+ for (const row of tab.layout) {
145
+ for (const cell of row) {
146
+ if (typeof cell === "string") {
147
+ fieldIds.add(cell);
148
+ }
149
+ }
150
+ }
151
+ return parentFields.filter(f => fieldIds.has(f.id));
152
+ }
153
+ const TabItem = ({
154
+ tab,
155
+ index,
156
+ totalTabs,
157
+ descriptor,
158
+ parentFields,
159
+ onUpdate,
160
+ onInsertField,
161
+ onRemoveField,
162
+ onUpdateField
163
+ }) => {
164
+ const {
165
+ fieldOptions
166
+ } = useModelEditor();
167
+ const dialogs = useDialogs();
168
+ const {
169
+ showConfirmation
170
+ } = useConfirmationDialog({
171
+ title: "Delete tab",
172
+ message: `Are you sure you want to delete the tab "${tab.label}"? Fields inside this tab will be removed.`,
173
+ acceptLabel: "Yes, delete tab"
174
+ });
175
+ const isFirst = index === 0;
176
+ const isLast = index === totalTabs - 1;
177
+ const tabFields = resolveTabFields(tab, parentFields);
178
+ const handleFieldsChange = useCallback(({
179
+ fields: newFields,
180
+ layout: newLayout
181
+ }) => {
182
+ const oldFieldIds = new Set(tabFields.map(f => f.id));
183
+ const newFieldIds = new Set(newFields.map(f => f.id));
184
+
185
+ // Find added fields (in new but not in old) -> hoist to parent
186
+ for (const f of newFields) {
187
+ if (!oldFieldIds.has(f.id)) {
188
+ onInsertField(f);
189
+ }
190
+ }
191
+
192
+ // Find removed fields (in old but not in new) -> un-hoist from parent
193
+ for (const id of oldFieldIds) {
194
+ if (!newFieldIds.has(id)) {
195
+ onRemoveField(id);
196
+ }
197
+ }
198
+
199
+ // Propagate field updates (e.g. permissions changes) to the parent
200
+ const oldFieldMap = new Map(tabFields.map(f => [f.id, f]));
201
+ for (const f of newFields) {
202
+ if (oldFieldMap.has(f.id) && oldFieldMap.get(f.id) !== f) {
203
+ onUpdateField(f);
204
+ }
205
+ }
206
+
207
+ // Update the tab's layout in the descriptor
208
+ const updatedTabs = [...descriptor.tabs];
209
+ updatedTabs[index] = {
210
+ ...tab,
211
+ layout: newLayout
212
+ };
213
+ onUpdate({
214
+ ...descriptor,
215
+ tabs: updatedTabs
216
+ });
217
+ }, [tab, index, descriptor, tabFields, onUpdate, onInsertField, onRemoveField, onUpdateField]);
218
+ const moveTabUp = useCallback(() => {
219
+ if (isFirst) {
220
+ return;
221
+ }
222
+ const tabs = [...descriptor.tabs];
223
+ [tabs[index - 1], tabs[index]] = [tabs[index], tabs[index - 1]];
224
+ onUpdate({
225
+ ...descriptor,
226
+ tabs
227
+ });
228
+ }, [descriptor, index, isFirst, onUpdate]);
229
+ const moveTabDown = useCallback(() => {
230
+ if (isLast) {
231
+ return;
232
+ }
233
+ const tabs = [...descriptor.tabs];
234
+ [tabs[index + 1], tabs[index]] = [tabs[index], tabs[index + 1]];
235
+ onUpdate({
236
+ ...descriptor,
237
+ tabs
238
+ });
239
+ }, [descriptor, index, isLast, onUpdate]);
240
+ const deleteTab = useCallback(() => {
241
+ showConfirmation(() => {
242
+ // Collect field IDs to un-hoist
243
+ for (const row of tab.layout) {
244
+ for (const cell of row) {
245
+ if (typeof cell === "string") {
246
+ onRemoveField(cell);
247
+ }
248
+ }
249
+ }
250
+ const tabs = descriptor.tabs.filter((_, i) => i !== index);
251
+ onUpdate({
252
+ ...descriptor,
253
+ tabs
254
+ });
255
+ });
256
+ }, [descriptor, index, tab, onUpdate, onRemoveField, showConfirmation]);
257
+ const editTab = useCallback(() => {
258
+ dialogs.showDialog({
259
+ title: "Tab Settings",
260
+ description: "Configure the tab and access permissions",
261
+ acceptLabel: "Save",
262
+ cancelLabel: "Cancel",
263
+ formData: {
264
+ label: tab.label,
265
+ icon: tab.icon ?? "",
266
+ rules: tab.rules ?? []
267
+ },
268
+ content: /*#__PURE__*/React.createElement(TabDialogContent, {
269
+ fieldOptions: fieldOptions
270
+ }),
271
+ onAccept: data => {
272
+ const updatedTabs = [...descriptor.tabs];
273
+ updatedTabs[index] = {
274
+ ...tab,
275
+ label: data.label ?? tab.label,
276
+ icon: data.icon || undefined,
277
+ rules: data.rules ?? []
278
+ };
279
+ onUpdate({
280
+ ...descriptor,
281
+ tabs: updatedTabs
282
+ });
283
+ }
284
+ });
285
+ }, [dialogs, descriptor, index, tab, onUpdate]);
286
+ return /*#__PURE__*/React.createElement(Accordion.Item, {
287
+ title: tab.label
288
+ /* This ensures drop zones are not affected by `overflow-hidden` on the accordion content. */,
289
+ className: "[&>[data-state='open']]:!overflow-visible",
290
+ description: `${tabFields.length} field${tabFields.length !== 1 ? "s" : ""}`,
291
+ actions: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Accordion.Item.Action, {
292
+ icon: /*#__PURE__*/React.createElement(ArrowUpIcon, null),
293
+ onClick: moveTabUp,
294
+ disabled: isFirst
295
+ }), /*#__PURE__*/React.createElement(Accordion.Item.Action, {
296
+ icon: /*#__PURE__*/React.createElement(ArrowDownIcon, null),
297
+ onClick: moveTabDown,
298
+ disabled: isLast
299
+ }), /*#__PURE__*/React.createElement(Accordion.Item.Action.Separator, null), /*#__PURE__*/React.createElement(Accordion.Item.Action, {
300
+ icon: /*#__PURE__*/React.createElement(EditIcon, null),
301
+ onClick: editTab
302
+ }), /*#__PURE__*/React.createElement(Accordion.Item.Action, {
303
+ icon: /*#__PURE__*/React.createElement(DeleteIcon, null),
304
+ onClick: deleteTab,
305
+ disabled: totalTabs <= 1
306
+ }))
307
+ }, /*#__PURE__*/React.createElement(FieldEditor, {
308
+ parent: createTabParent(tab),
309
+ fields: tabFields,
310
+ layout: tab.layout,
311
+ onChange: handleFieldsChange
312
+ }));
313
+ };
314
+ export const TabsLayoutEditor = ({
315
+ descriptor,
316
+ onUpdate,
317
+ onDelete
318
+ }) => {
319
+ const parentEditor = useModelFieldEditor();
320
+ const {
321
+ fieldOptions
322
+ } = useModelEditor();
323
+ const {
324
+ showDialog
325
+ } = useDialogs();
326
+ const newTabId = useRef(undefined);
327
+ const {
328
+ showConfirmation: showDeleteConfirmation
329
+ } = useConfirmationDialog({
330
+ title: "Delete tabs",
331
+ message: "Are you sure you want to delete this tabs element? All fields inside the tabs will be removed.",
332
+ acceptLabel: "Yes, delete"
333
+ });
334
+ useEffect(() => {
335
+ newTabId.current = undefined;
336
+ }, []);
337
+
338
+ // Resolve all fields that exist in any tab of this descriptor from the parent's fields
339
+ const getAllParentFields = useCallback(() => {
340
+ // Collect all field IDs that exist in any tab of this descriptor
341
+ const allFieldIds = new Set();
342
+ for (const tab of descriptor.tabs) {
343
+ for (const row of tab.layout) {
344
+ for (const cell of row) {
345
+ if (typeof cell === "string") {
346
+ allFieldIds.add(cell);
347
+ }
348
+ }
349
+ }
350
+ }
351
+
352
+ // Resolve them from the parent editor
353
+ const resolved = [];
354
+ for (const id of allFieldIds) {
355
+ const field = parentEditor.getField({
356
+ id
357
+ });
358
+ if (field) {
359
+ resolved.push(field);
360
+ }
361
+ }
362
+ return resolved;
363
+ }, [descriptor, parentEditor]);
364
+ const handleInsertField = useCallback(field => {
365
+ // Hoist the field to the parent context's fields (without placing in parent's layout)
366
+ const existingField = parentEditor.getField({
367
+ id: field.id
368
+ });
369
+ if (!existingField) {
370
+ parentEditor.addField(field);
371
+ }
372
+ }, [parentEditor]);
373
+ const handleRemoveField = useCallback(fieldId => {
374
+ // Un-hoist the field from the parent context's fields
375
+ parentEditor.removeField(fieldId);
376
+ }, [parentEditor]);
377
+ const handleUpdateField = useCallback(field => {
378
+ parentEditor.updateField(field);
379
+ }, [parentEditor]);
380
+ const addTab = useCallback(() => {
381
+ const id = generateAlphaNumericLowerCaseId(8);
382
+ newTabId.current = id;
383
+ const newTab = {
384
+ id,
385
+ label: `Tab ${descriptor.tabs.length + 1}`,
386
+ layout: []
387
+ };
388
+ onUpdate({
389
+ ...descriptor,
390
+ tabs: [...descriptor.tabs, newTab]
391
+ });
392
+ }, [descriptor, onUpdate]);
393
+ const handleDeleteTabs = useCallback(() => {
394
+ showDeleteConfirmation(() => {
395
+ onDelete();
396
+ });
397
+ }, [onDelete, showDeleteConfirmation]);
398
+ const editTabsSettings = useCallback(() => {
399
+ showDialog({
400
+ title: "Tabs Settings",
401
+ description: "Configure the tabs and access permissions",
402
+ acceptLabel: "Save",
403
+ cancelLabel: "Cancel",
404
+ formData: {
405
+ label: descriptor.label ?? "",
406
+ description: descriptor.description ?? "",
407
+ help: descriptor.help ?? "",
408
+ rules: descriptor.rules ?? []
409
+ },
410
+ content: /*#__PURE__*/React.createElement(TabsDialogContent, {
411
+ fieldOptions: fieldOptions
412
+ }),
413
+ onAccept: data => {
414
+ onUpdate({
415
+ ...descriptor,
416
+ label: data.label ?? "",
417
+ description: data.description || null,
418
+ help: data.help || null,
419
+ rules: data.rules ?? []
420
+ });
421
+ }
422
+ });
423
+ }, [descriptor, onUpdate]);
424
+ const resolvedParentFields = getAllParentFields();
425
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
426
+ className: "flex justify-between"
427
+ }, /*#__PURE__*/React.createElement("div", {
428
+ className: "flex flex-col"
429
+ }, /*#__PURE__*/React.createElement("div", {
430
+ className: "flex flex-row items-center"
431
+ }, /*#__PURE__*/React.createElement(Heading, {
432
+ level: 6,
433
+ className: "text-nowrap"
434
+ }, descriptor.label || "No label")), /*#__PURE__*/React.createElement(Text, {
435
+ size: "sm",
436
+ className: "flex w-full text-neutral-strong"
437
+ }, "Tabs")), /*#__PURE__*/React.createElement("div", {
438
+ className: "flex items-center gap-xs"
439
+ }, /*#__PURE__*/React.createElement(IconButton, {
440
+ icon: /*#__PURE__*/React.createElement(EditIcon, null),
441
+ onClick: editTabsSettings,
442
+ variant: "ghost",
443
+ size: "sm"
444
+ }), /*#__PURE__*/React.createElement(IconButton, {
445
+ icon: /*#__PURE__*/React.createElement(DeleteIcon, null),
446
+ onClick: handleDeleteTabs,
447
+ variant: "ghost",
448
+ size: "sm"
449
+ }))), descriptor.tabs.length > 0 && /*#__PURE__*/React.createElement(Accordion, null, descriptor.tabs.map((tab, index) => /*#__PURE__*/React.createElement(TabItem, {
450
+ key: tab.id,
451
+ tab: tab,
452
+ index: index,
453
+ totalTabs: descriptor.tabs.length,
454
+ descriptor: descriptor,
455
+ parentFields: resolvedParentFields,
456
+ onUpdate: onUpdate,
457
+ onInsertField: handleInsertField,
458
+ onRemoveField: handleRemoveField,
459
+ onUpdateField: handleUpdateField
460
+ }))), /*#__PURE__*/React.createElement("div", {
461
+ className: "mt-sm flex justify-center"
462
+ }, /*#__PURE__*/React.createElement(Button, {
463
+ onClick: addTab,
464
+ text: "Add Tab",
465
+ icon: /*#__PURE__*/React.createElement(AddIcon, null),
466
+ size: "sm"
467
+ })));
468
+ };
469
+
470
+ //# sourceMappingURL=TabsLayoutEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useRef","useEffect","Accordion","Tabs","ReactComponent","EditIcon","DeleteIcon","ArrowUpIcon","ArrowDownIcon","AddIcon","generateAlphaNumericLowerCaseId","useConfirmationDialog","useDialogs","Grid","IconButton","Button","Input","Textarea","Heading","Text","Bind","FieldEditor","IconPicker","useModelFieldEditor","PermissionsTab","RulesTab","useModelEditor","TabsSettings","createElement","className","Column","span","name","label","TabsDialogContent","fieldOptions","size","separator","tabs","Tab","key","trigger","value","content","gridClassName","TabSettingsFields","TabDialogContent","createTabParent","tab","id","fieldId","type","renderer","resolveTabFields","parentFields","fieldIds","Set","row","layout","cell","add","filter","f","has","TabItem","index","totalTabs","descriptor","onUpdate","onInsertField","onRemoveField","onUpdateField","dialogs","showConfirmation","title","message","acceptLabel","isFirst","isLast","tabFields","handleFieldsChange","fields","newFields","newLayout","oldFieldIds","map","newFieldIds","oldFieldMap","Map","get","updatedTabs","moveTabUp","moveTabDown","deleteTab","_","i","editTab","showDialog","description","cancelLabel","formData","icon","rules","onAccept","data","undefined","Item","length","actions","Fragment","Action","onClick","disabled","Separator","parent","onChange","TabsLayoutEditor","onDelete","parentEditor","newTabId","showDeleteConfirmation","current","getAllParentFields","allFieldIds","resolved","field","getField","push","handleInsertField","existingField","addField","handleRemoveField","removeField","handleUpdateField","updateField","addTab","newTab","handleDeleteTabs","editTabsSettings","help","resolvedParentFields","level","variant","text"],"sources":["TabsLayoutEditor.tsx"],"sourcesContent":["import React, { useCallback, useRef, useEffect } from \"react\";\nimport { Accordion, Tabs } from \"@webiny/admin-ui\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as ArrowUpIcon } from \"@webiny/icons/expand_less.svg\";\nimport { ReactComponent as ArrowDownIcon } from \"@webiny/icons/expand_more.svg\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils\";\nimport type {\n CmsTabLayoutDescriptor,\n CmsTabLayoutTab,\n CmsLayoutDescriptor,\n CmsEditorFieldsLayout\n} from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { useConfirmationDialog, useDialogs } from \"@webiny/app-admin\";\nimport { Grid } from \"@webiny/admin-ui\";\nimport { IconButton } from \"@webiny/admin-ui\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { Input } from \"@webiny/admin-ui\";\nimport { Textarea } from \"@webiny/admin-ui\";\nimport { Heading } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { Bind } from \"@webiny/form\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { FieldEditor } from \"~/admin/components/FieldEditor/index.js\";\nimport { IconPicker } from \"~/admin/components/IconPicker.js\";\nimport { useModelFieldEditor } from \"~/admin/hooks/index.js\";\nimport { PermissionsTab } from \"~/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js\";\nimport { RulesTab } from \"~/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js\";\nimport { useModelEditor } from \"~/admin/components/ContentModelEditor/useModelEditor.js\";\nimport type { FieldOption } from \"@webiny/app-headless-cms-common/Fields/fieldOptions.js\";\n\ninterface TabsLayoutEditorProps {\n descriptor: CmsTabLayoutDescriptor;\n onUpdate: (d: CmsLayoutDescriptor) => void;\n onDelete: () => void;\n}\n\ninterface TabItemProps {\n tab: CmsTabLayoutTab;\n index: number;\n totalTabs: number;\n descriptor: CmsTabLayoutDescriptor;\n parentFields: CmsModelField[];\n onUpdate: (d: CmsLayoutDescriptor) => void;\n onInsertField: (field: CmsModelField) => void;\n onRemoveField: (fieldId: string) => void;\n onUpdateField: (field: CmsModelField) => void;\n}\n\nconst TabsSettings = () => {\n return (\n <Grid className={\"mt-md\"}>\n <Grid.Column span={12}>\n <Bind name={\"label\"}>\n <Input label={\"Label\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"description\"}>\n <Input label={\"Description\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"help\"}>\n <Textarea label={\"Help\"} />\n </Bind>\n </Grid.Column>\n </Grid>\n );\n};\n\nconst TabsDialogContent = ({ fieldOptions }: { fieldOptions: FieldOption[] }) => {\n return (\n <Tabs\n size={\"md\"}\n separator\n tabs={[\n <Tabs.Tab\n key={\"tabs\"}\n trigger={\"Tabs\"}\n value={\"tabs\"}\n content={<TabsSettings />}\n />,\n <Tabs.Tab\n key={\"permissions\"}\n trigger={\"Permissions\"}\n value={\"permissions\"}\n content={<PermissionsTab gridClassName={\"mt-md\"} />}\n />,\n <Tabs.Tab\n key={\"rules\"}\n trigger={\"Rules\"}\n value={\"rules\"}\n content={<RulesTab gridClassName={\"mt-md\"} fieldOptions={fieldOptions} />}\n />\n ]}\n />\n );\n};\n\nconst TabSettingsFields = () => {\n return (\n <Grid className={\"mt-md\"}>\n <Grid.Column span={12}>\n <Bind name={\"label\"}>\n <Input label={\"Label\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"icon\"}>\n <IconPicker label={\"Icon\"} />\n </Bind>\n </Grid.Column>\n </Grid>\n );\n};\n\nconst TabDialogContent = ({ fieldOptions }: { fieldOptions: FieldOption[] }) => {\n return (\n <Tabs\n size={\"md\"}\n separator\n tabs={[\n <Tabs.Tab\n key={\"tab\"}\n trigger={\"Tab\"}\n value={\"tab\"}\n content={<TabSettingsFields />}\n />,\n <Tabs.Tab\n key={\"permissions\"}\n trigger={\"Permissions\"}\n value={\"permissions\"}\n content={<PermissionsTab gridClassName={\"mt-md\"} />}\n />,\n <Tabs.Tab\n key={\"rules\"}\n trigger={\"Rules\"}\n value={\"rules\"}\n content={<RulesTab gridClassName={\"mt-md\"} fieldOptions={fieldOptions} />}\n />\n ]}\n />\n );\n};\n\n/**\n * Create a synthetic parent field for a tab so that each tab's FieldEditor\n * has a unique identity for cross-parent drag & drop detection.\n */\nfunction createTabParent(tab: CmsTabLayoutTab): CmsModelField {\n return {\n id: tab.id,\n fieldId: `tab:${tab.id}`,\n type: \"tab\",\n label: tab.label,\n renderer: { name: \"\" }\n } as CmsModelField;\n}\n\n/**\n * Resolve fields for a tab by looking up field IDs in the parent's fields array.\n */\nfunction resolveTabFields(tab: CmsTabLayoutTab, parentFields: CmsModelField[]): CmsModelField[] {\n const fieldIds = new Set<string>();\n for (const row of tab.layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n fieldIds.add(cell);\n }\n }\n }\n return parentFields.filter(f => fieldIds.has(f.id));\n}\n\nconst TabItem = ({\n tab,\n index,\n totalTabs,\n descriptor,\n parentFields,\n onUpdate,\n onInsertField,\n onRemoveField,\n onUpdateField\n}: TabItemProps) => {\n const { fieldOptions } = useModelEditor();\n const dialogs = useDialogs();\n\n const { showConfirmation } = useConfirmationDialog({\n title: \"Delete tab\",\n message: `Are you sure you want to delete the tab \"${tab.label}\"? Fields inside this tab will be removed.`,\n acceptLabel: \"Yes, delete tab\"\n });\n\n const isFirst = index === 0;\n const isLast = index === totalTabs - 1;\n\n const tabFields = resolveTabFields(tab, parentFields);\n\n const handleFieldsChange = useCallback(\n ({\n fields: newFields,\n layout: newLayout\n }: {\n fields: CmsModelField[];\n layout: CmsEditorFieldsLayout;\n }) => {\n const oldFieldIds = new Set(tabFields.map(f => f.id));\n const newFieldIds = new Set(newFields.map(f => f.id));\n\n // Find added fields (in new but not in old) -> hoist to parent\n for (const f of newFields) {\n if (!oldFieldIds.has(f.id)) {\n onInsertField(f);\n }\n }\n\n // Find removed fields (in old but not in new) -> un-hoist from parent\n for (const id of oldFieldIds) {\n if (!newFieldIds.has(id)) {\n onRemoveField(id);\n }\n }\n\n // Propagate field updates (e.g. permissions changes) to the parent\n const oldFieldMap = new Map(tabFields.map(f => [f.id, f]));\n for (const f of newFields) {\n if (oldFieldMap.has(f.id) && oldFieldMap.get(f.id) !== f) {\n onUpdateField(f);\n }\n }\n\n // Update the tab's layout in the descriptor\n const updatedTabs = [...descriptor.tabs];\n updatedTabs[index] = { ...tab, layout: newLayout };\n onUpdate({ ...descriptor, tabs: updatedTabs });\n },\n [tab, index, descriptor, tabFields, onUpdate, onInsertField, onRemoveField, onUpdateField]\n );\n\n const moveTabUp = useCallback(() => {\n if (isFirst) {\n return;\n }\n const tabs = [...descriptor.tabs];\n [tabs[index - 1], tabs[index]] = [tabs[index], tabs[index - 1]];\n onUpdate({ ...descriptor, tabs });\n }, [descriptor, index, isFirst, onUpdate]);\n\n const moveTabDown = useCallback(() => {\n if (isLast) {\n return;\n }\n const tabs = [...descriptor.tabs];\n [tabs[index + 1], tabs[index]] = [tabs[index], tabs[index + 1]];\n onUpdate({ ...descriptor, tabs });\n }, [descriptor, index, isLast, onUpdate]);\n\n const deleteTab = useCallback(() => {\n showConfirmation(() => {\n // Collect field IDs to un-hoist\n for (const row of tab.layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n onRemoveField(cell);\n }\n }\n }\n\n const tabs = descriptor.tabs.filter((_, i) => i !== index);\n onUpdate({ ...descriptor, tabs });\n });\n }, [descriptor, index, tab, onUpdate, onRemoveField, showConfirmation]);\n\n const editTab = useCallback(() => {\n dialogs.showDialog({\n title: \"Tab Settings\",\n description: \"Configure the tab and access permissions\",\n acceptLabel: \"Save\",\n cancelLabel: \"Cancel\",\n formData: {\n label: tab.label,\n icon: tab.icon ?? \"\",\n rules: tab.rules ?? []\n },\n content: <TabDialogContent fieldOptions={fieldOptions} />,\n onAccept: data => {\n const updatedTabs = [...descriptor.tabs];\n updatedTabs[index] = {\n ...tab,\n label: data.label ?? tab.label,\n icon: data.icon || undefined,\n rules: data.rules ?? []\n };\n onUpdate({ ...descriptor, tabs: updatedTabs });\n }\n });\n }, [dialogs, descriptor, index, tab, onUpdate]);\n\n return (\n <Accordion.Item\n title={tab.label}\n /* This ensures drop zones are not affected by `overflow-hidden` on the accordion content. */\n className={\"[&>[data-state='open']]:!overflow-visible\"}\n description={`${tabFields.length} field${tabFields.length !== 1 ? \"s\" : \"\"}`}\n actions={\n <>\n <Accordion.Item.Action\n icon={<ArrowUpIcon />}\n onClick={moveTabUp}\n disabled={isFirst}\n />\n <Accordion.Item.Action\n icon={<ArrowDownIcon />}\n onClick={moveTabDown}\n disabled={isLast}\n />\n <Accordion.Item.Action.Separator />\n <Accordion.Item.Action icon={<EditIcon />} onClick={editTab} />\n <Accordion.Item.Action\n icon={<DeleteIcon />}\n onClick={deleteTab}\n disabled={totalTabs <= 1}\n />\n </>\n }\n >\n <FieldEditor\n parent={createTabParent(tab)}\n fields={tabFields}\n layout={tab.layout}\n onChange={handleFieldsChange}\n />\n </Accordion.Item>\n );\n};\n\nexport const TabsLayoutEditor = ({ descriptor, onUpdate, onDelete }: TabsLayoutEditorProps) => {\n const parentEditor = useModelFieldEditor();\n const { fieldOptions } = useModelEditor();\n const { showDialog } = useDialogs();\n const newTabId = useRef<string | undefined>(undefined);\n\n const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({\n title: \"Delete tabs\",\n message:\n \"Are you sure you want to delete this tabs element? All fields inside the tabs will be removed.\",\n acceptLabel: \"Yes, delete\"\n });\n\n useEffect(() => {\n newTabId.current = undefined;\n }, []);\n\n // Resolve all fields that exist in any tab of this descriptor from the parent's fields\n const getAllParentFields = useCallback((): CmsModelField[] => {\n // Collect all field IDs that exist in any tab of this descriptor\n const allFieldIds = new Set<string>();\n for (const tab of descriptor.tabs) {\n for (const row of tab.layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n allFieldIds.add(cell);\n }\n }\n }\n }\n\n // Resolve them from the parent editor\n const resolved: CmsModelField[] = [];\n for (const id of allFieldIds) {\n const field = parentEditor.getField({ id });\n if (field) {\n resolved.push(field);\n }\n }\n return resolved;\n }, [descriptor, parentEditor]);\n\n const handleInsertField = useCallback(\n (field: CmsModelField) => {\n // Hoist the field to the parent context's fields (without placing in parent's layout)\n const existingField = parentEditor.getField({ id: field.id });\n if (!existingField) {\n parentEditor.addField(field);\n }\n },\n [parentEditor]\n );\n\n const handleRemoveField = useCallback(\n (fieldId: string) => {\n // Un-hoist the field from the parent context's fields\n parentEditor.removeField(fieldId);\n },\n [parentEditor]\n );\n\n const handleUpdateField = useCallback(\n (field: CmsModelField) => {\n parentEditor.updateField(field);\n },\n [parentEditor]\n );\n\n const addTab = useCallback(() => {\n const id = generateAlphaNumericLowerCaseId(8);\n newTabId.current = id;\n const newTab: CmsTabLayoutTab = {\n id,\n label: `Tab ${descriptor.tabs.length + 1}`,\n layout: []\n };\n onUpdate({ ...descriptor, tabs: [...descriptor.tabs, newTab] });\n }, [descriptor, onUpdate]);\n\n const handleDeleteTabs = useCallback(() => {\n showDeleteConfirmation(() => {\n onDelete();\n });\n }, [onDelete, showDeleteConfirmation]);\n\n const editTabsSettings = useCallback(() => {\n showDialog({\n title: \"Tabs Settings\",\n description: \"Configure the tabs and access permissions\",\n acceptLabel: \"Save\",\n cancelLabel: \"Cancel\",\n formData: {\n label: descriptor.label ?? \"\",\n description: descriptor.description ?? \"\",\n help: descriptor.help ?? \"\",\n rules: descriptor.rules ?? []\n },\n content: <TabsDialogContent fieldOptions={fieldOptions} />,\n onAccept: data => {\n onUpdate({\n ...descriptor,\n label: data.label ?? \"\",\n description: data.description || null,\n help: data.help || null,\n rules: data.rules ?? []\n });\n }\n });\n }, [descriptor, onUpdate]);\n\n const resolvedParentFields = getAllParentFields();\n\n return (\n <div>\n <div className={\"flex justify-between\"}>\n <div className={\"flex flex-col\"}>\n <div className={\"flex flex-row items-center\"}>\n <Heading level={6} className={\"text-nowrap\"}>\n {descriptor.label || \"No label\"}\n </Heading>\n </div>\n <Text size=\"sm\" className={\"flex w-full text-neutral-strong\"}>\n Tabs\n </Text>\n </div>\n <div className={\"flex items-center gap-xs\"}>\n <IconButton\n icon={<EditIcon />}\n onClick={editTabsSettings}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n <IconButton\n icon={<DeleteIcon />}\n onClick={handleDeleteTabs}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n </div>\n </div>\n {descriptor.tabs.length > 0 && (\n <Accordion>\n {descriptor.tabs.map((tab, index) => (\n <TabItem\n key={tab.id}\n tab={tab}\n index={index}\n totalTabs={descriptor.tabs.length}\n descriptor={descriptor}\n parentFields={resolvedParentFields}\n onUpdate={onUpdate}\n onInsertField={handleInsertField}\n onRemoveField={handleRemoveField}\n onUpdateField={handleUpdateField}\n />\n ))}\n </Accordion>\n )}\n <div className={\"mt-sm flex justify-center\"}>\n <Button onClick={addTab} text={\"Add Tab\"} icon={<AddIcon />} size={\"sm\"} />\n </div>\n </div>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import type { CmsModelFieldTypePlugin } from "@webiny/app-headless-cms-common/types/index.js";
2
- export declare const uiAlertField: CmsModelFieldTypePlugin;
1
+ import type { CmsLayoutFieldTypePlugin } from "@webiny/app-headless-cms-common/types/index.js";
2
+ export declare const uiAlertField: CmsLayoutFieldTypePlugin;