@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.
- package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.d.ts +2 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js +18 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js.map +1 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/index.d.ts +1 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/index.js +3 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/index.js.map +1 -0
- package/admin/components/ContentEntries/Header/Header.js +2 -1
- package/admin/components/ContentEntries/Header/Header.js.map +1 -1
- package/admin/components/ContentEntries/SidebarContent/SidebarContent.js +1 -1
- package/admin/components/ContentEntries/SidebarContent/SidebarContent.js.map +1 -1
- package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js +1 -1
- package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js.map +1 -1
- package/admin/components/ContentEntries/Table/Cells/CellLive.d.ts +2 -0
- package/admin/components/ContentEntries/Table/Cells/CellLive.js +26 -0
- package/admin/components/ContentEntries/Table/Cells/CellLive.js.map +1 -0
- package/admin/components/ContentEntries/Table/Cells/index.d.ts +1 -0
- package/admin/components/ContentEntries/Table/Cells/index.js +1 -0
- package/admin/components/ContentEntries/Table/Cells/index.js.map +1 -1
- package/admin/components/ContentModelEditor/ContentModelEditor.js +1 -6
- package/admin/components/ContentModelEditor/ContentModelEditor.js.map +1 -1
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.d.ts +2 -0
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.js +14 -2
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
- package/admin/components/ContentModelEditor/FieldsSidebar.js +51 -2
- package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
- package/admin/components/Droppable.d.ts +1 -1
- package/admin/components/Droppable.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js +3 -3
- package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.d.ts +10 -0
- package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js +69 -0
- package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js +27 -9
- package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.d.ts +2 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js +14 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.d.ts +15 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js +131 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.d.ts +4 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js +74 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.d.ts +13 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js +203 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.d.ts +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js +3 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog.js +13 -56
- package/admin/components/FieldEditor/EditFieldDialog.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialogContainer.d.ts +12 -0
- package/admin/components/FieldEditor/EditFieldDialogContainer.js +40 -0
- package/admin/components/FieldEditor/EditFieldDialogContainer.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDrawerContainer.d.ts +12 -0
- package/admin/components/FieldEditor/EditFieldDrawerContainer.js +40 -0
- package/admin/components/FieldEditor/EditFieldDrawerContainer.js.map +1 -0
- package/admin/components/FieldEditor/FieldEditor.js +148 -88
- package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
- package/admin/components/FieldEditor/FieldEditorContext.d.ts +33 -3
- package/admin/components/FieldEditor/FieldEditorContext.js +225 -6
- package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
- package/admin/components/FieldEditor/LayoutCell.d.ts +9 -0
- package/admin/components/FieldEditor/LayoutCell.js +33 -0
- package/admin/components/FieldEditor/LayoutCell.js.map +1 -0
- package/admin/components/FieldEditor/utils/deleteField.js +12 -4
- package/admin/components/FieldEditor/utils/deleteField.js.map +1 -1
- package/admin/components/FieldEditor/utils/getFieldPosition.js +6 -1
- package/admin/components/FieldEditor/utils/getFieldPosition.js.map +1 -1
- package/admin/graphql/contentModels.d.ts +2 -2
- package/admin/graphql/contentModels.js +7 -0
- package/admin/graphql/contentModels.js.map +1 -1
- package/admin/hooks/useModelFieldGraphqlContext.d.ts +1 -0
- package/admin/plugins/fieldRenderers/DynamicSection.d.ts +2 -1
- package/admin/plugins/fieldRenderers/DynamicSection.js +3 -1
- package/admin/plugins/fieldRenderers/DynamicSection.js.map +1 -1
- package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js +7 -1
- package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js.map +1 -1
- package/admin/plugins/fieldRenderers/checkboxes.js +7 -1
- package/admin/plugins/fieldRenderers/checkboxes.js.map +1 -1
- package/admin/plugins/fieldRenderers/dateTime/Input.js +9 -2
- package/admin/plugins/fieldRenderers/dateTime/Input.js.map +1 -1
- package/admin/plugins/fieldRenderers/dateTime/Select.js +7 -0
- package/admin/plugins/fieldRenderers/dateTime/Select.js.map +1 -1
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.d.ts +1 -0
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js +9 -5
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js.map +1 -1
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.d.ts +2 -1
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js +18 -10
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js.map +1 -1
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js +13 -4
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js +10 -4
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js.map +1 -1
- package/admin/plugins/fieldRenderers/longText/longText.js +7 -1
- package/admin/plugins/fieldRenderers/longText/longText.js.map +1 -1
- package/admin/plugins/fieldRenderers/longText/longTexts.js +12 -3
- package/admin/plugins/fieldRenderers/longText/longTexts.js.map +1 -1
- package/admin/plugins/fieldRenderers/number/numberInput.js +7 -1
- package/admin/plugins/fieldRenderers/number/numberInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/number/numberInputs.js +11 -3
- package/admin/plugins/fieldRenderers/number/numberInputs.js.map +1 -1
- package/admin/plugins/fieldRenderers/object/FieldSettings.d.ts +2 -1
- package/admin/plugins/fieldRenderers/object/MultiValueContainer.js +5 -0
- package/admin/plugins/fieldRenderers/object/MultiValueContainer.js.map +1 -1
- package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.d.ts +1 -0
- package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js +3 -2
- package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js.map +1 -1
- package/admin/plugins/fieldRenderers/radioButtons.js +7 -1
- package/admin/plugins/fieldRenderers/radioButtons.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js +15 -7
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js +14 -7
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.d.ts +3 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js +7 -6
- package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.d.ts +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js +9 -3
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.d.ts +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js +9 -3
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js +7 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js +7 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js.map +1 -1
- package/admin/plugins/fieldRenderers/select.js +7 -1
- package/admin/plugins/fieldRenderers/select.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/tags.js +7 -1
- package/admin/plugins/fieldRenderers/text/tags.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/textInput.js +7 -1
- package/admin/plugins/fieldRenderers/text/textInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/textInputs.js +12 -3
- package/admin/plugins/fieldRenderers/text/textInputs.js.map +1 -1
- package/admin/plugins/fields/ui/TabsLayoutEditor.d.ts +9 -0
- package/admin/plugins/fields/ui/TabsLayoutEditor.js +470 -0
- package/admin/plugins/fields/ui/TabsLayoutEditor.js.map +1 -0
- package/admin/plugins/fields/ui/alert.d.ts +2 -2
- package/admin/plugins/fields/ui/alert.js +144 -17
- package/admin/plugins/fields/ui/alert.js.map +1 -1
- package/admin/plugins/fields/ui/index.d.ts +1 -0
- package/admin/plugins/fields/ui/index.js +1 -0
- package/admin/plugins/fields/ui/index.js.map +1 -1
- package/admin/plugins/fields/ui/separator.d.ts +2 -2
- package/admin/plugins/fields/ui/separator.js +131 -17
- package/admin/plugins/fields/ui/separator.js.map +1 -1
- package/admin/plugins/fields/ui/tabs.d.ts +2 -0
- package/admin/plugins/fields/ui/tabs.js +89 -0
- package/admin/plugins/fields/ui/tabs.js.map +1 -0
- package/admin/plugins/index.d.ts +1 -0
- package/admin/views/contentEntries/ContentEntriesModule.js +6 -1
- package/admin/views/contentEntries/ContentEntriesModule.js.map +1 -1
- package/admin/views/contentEntries/hooks/useContentEntriesList.d.ts +1 -0
- package/admin/views/contentEntries/hooks/useContentEntriesList.js +8 -4
- package/admin/views/contentEntries/hooks/useContentEntriesList.js.map +1 -1
- package/admin/views/contentModels/importing/graphql.d.ts +2 -2
- package/admin/views/contentModels/importing/graphql.js.map +1 -1
- package/allPlugins.d.ts +2 -1
- package/allPlugins.js +2 -3
- package/allPlugins.js.map +1 -1
- package/exports/admin/cms/model.d.ts +1 -0
- package/exports/admin/cms/model.js +3 -0
- package/exports/admin/cms/model.js.map +1 -0
- package/package.json +24 -24
- package/types.d.ts +1 -0
- package/types.js +5 -1
- package/types.js.map +1 -1
- package/admin/plugins/fieldRenderers/ui/alert.d.ts +0 -2
- package/admin/plugins/fieldRenderers/ui/alert.js +0 -32
- package/admin/plugins/fieldRenderers/ui/alert.js.map +0 -1
- package/admin/plugins/fieldRenderers/ui/index.d.ts +0 -2
- package/admin/plugins/fieldRenderers/ui/index.js +0 -4
- package/admin/plugins/fieldRenderers/ui/index.js.map +0 -1
- package/admin/plugins/fieldRenderers/ui/separator.d.ts +0 -2
- package/admin/plugins/fieldRenderers/ui/separator.js +0 -31
- 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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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) =>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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:
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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;
|