@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.
- 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/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/hooks/useContentEntriesList.d.ts +1 -0
- package/admin/views/contentEntries/hooks/useContentEntriesList.js +4 -2
- 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 +23 -23
- 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
|
@@ -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 {
|
|
2
|
-
export declare const uiAlertField:
|
|
1
|
+
import type { CmsLayoutFieldTypePlugin } from "@webiny/app-headless-cms-common/types/index.js";
|
|
2
|
+
export declare const uiAlertField: CmsLayoutFieldTypePlugin;
|