@it-consultis/page-builder 1.1.34

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 (124) hide show
  1. package/Editor.d.ts +77 -0
  2. package/Editor.js +312 -0
  3. package/LICENSE.txt +674 -0
  4. package/README.md +248 -0
  5. package/assets/svg/mp.d.ts +2 -0
  6. package/assets/svg/mp.js +37 -0
  7. package/assets/svg/status-bar.d.ts +2 -0
  8. package/assets/svg/status-bar.js +38 -0
  9. package/constants/index.d.ts +11 -0
  10. package/constants/index.js +17 -0
  11. package/contexts/I18nContext.d.ts +15 -0
  12. package/contexts/I18nContext.js +56 -0
  13. package/controls/AlignmentControl/AlignmentControl.d.ts +5 -0
  14. package/controls/AlignmentControl/AlignmentControl.js +58 -0
  15. package/controls/AlignmentControl/index.d.ts +3 -0
  16. package/controls/AlignmentControl/index.js +9 -0
  17. package/controls/DeviceSwitcher/DeviceSwitcher.d.ts +10 -0
  18. package/controls/DeviceSwitcher/DeviceSwitcher.js +64 -0
  19. package/controls/DeviceSwitcher/index.d.ts +2 -0
  20. package/controls/DeviceSwitcher/index.js +9 -0
  21. package/controls/GradientColorPicker/GradientColorPicker.d.ts +8 -0
  22. package/controls/GradientColorPicker/GradientColorPicker.js +81 -0
  23. package/controls/GradientColorPicker/index.d.ts +2 -0
  24. package/controls/GradientColorPicker/index.js +9 -0
  25. package/controls/HeadingControl/HeadingControl.d.ts +14 -0
  26. package/controls/HeadingControl/HeadingControl.js +251 -0
  27. package/controls/HeadingControl/HeadingView.d.ts +21 -0
  28. package/controls/HeadingControl/HeadingView.js +43 -0
  29. package/controls/HeadingControl/index.d.ts +4 -0
  30. package/controls/HeadingControl/index.js +16 -0
  31. package/controls/MediaLibraryControl/FileBrowserDialog.d.ts +14 -0
  32. package/controls/MediaLibraryControl/FileBrowserDialog.js +138 -0
  33. package/controls/MediaLibraryControl/MediaLibraryControl.d.ts +38 -0
  34. package/controls/MediaLibraryControl/MediaLibraryControl.js +537 -0
  35. package/controls/MediaLibraryControl/index.d.ts +3 -0
  36. package/controls/MediaLibraryControl/index.js +9 -0
  37. package/controls/PaddingMarginControl/PaddingMarginControl.d.ts +30 -0
  38. package/controls/PaddingMarginControl/PaddingMarginControl.js +88 -0
  39. package/controls/PaddingMarginControl/PaddingMarginForm.d.ts +8 -0
  40. package/controls/PaddingMarginControl/PaddingMarginForm.js +109 -0
  41. package/controls/PaddingMarginControl/index.d.ts +4 -0
  42. package/controls/PaddingMarginControl/index.js +16 -0
  43. package/controls/PaddingMarginControl/utils.d.ts +3 -0
  44. package/controls/PaddingMarginControl/utils.js +21 -0
  45. package/controls/SelectableControl/SelectableControl.d.ts +5 -0
  46. package/controls/SelectableControl/SelectableControl.js +35 -0
  47. package/controls/SelectableControl/index.d.ts +3 -0
  48. package/controls/SelectableControl/index.js +9 -0
  49. package/hooks/ui-optimizations/useDebounce.d.ts +3 -0
  50. package/hooks/ui-optimizations/useDebounce.js +23 -0
  51. package/hooks/ui-optimizations/useThrottle.d.ts +3 -0
  52. package/hooks/ui-optimizations/useThrottle.js +22 -0
  53. package/hooks/useMediaImageQuery.d.ts +10 -0
  54. package/hooks/useMediaImageQuery.js +51 -0
  55. package/hooks/useSortable.d.ts +20 -0
  56. package/hooks/useSortable.js +70 -0
  57. package/index.d.ts +7 -0
  58. package/index.js +54 -0
  59. package/layouts/BlocksBar/LayerPanel.d.ts +8 -0
  60. package/layouts/BlocksBar/LayerPanel.js +299 -0
  61. package/layouts/BlocksBar/index.d.ts +7 -0
  62. package/layouts/BlocksBar/index.js +575 -0
  63. package/layouts/EditorPreview/BlockView.d.ts +16 -0
  64. package/layouts/EditorPreview/BlockView.js +435 -0
  65. package/layouts/EditorPreview/index.d.ts +9 -0
  66. package/layouts/EditorPreview/index.js +463 -0
  67. package/layouts/Header/index.d.ts +18 -0
  68. package/layouts/Header/index.js +202 -0
  69. package/layouts/Header/menus/ExportDataDialog.d.ts +4 -0
  70. package/layouts/Header/menus/ExportDataDialog.js +95 -0
  71. package/layouts/Header/menus/ImportDataDialog.d.ts +4 -0
  72. package/layouts/Header/menus/ImportDataDialog.js +100 -0
  73. package/layouts/Header/menus/LeftMenu.d.ts +9 -0
  74. package/layouts/Header/menus/LeftMenu.js +369 -0
  75. package/layouts/Header/menus/RightMenu.d.ts +14 -0
  76. package/layouts/Header/menus/RightMenu.js +91 -0
  77. package/layouts/Header/menus/SaveTemplateDialog.d.ts +4 -0
  78. package/layouts/Header/menus/SaveTemplateDialog.js +203 -0
  79. package/layouts/MessageBus.d.ts +13 -0
  80. package/layouts/MessageBus.js +76 -0
  81. package/layouts/Sidebar/AddBlockButton.d.ts +12 -0
  82. package/layouts/Sidebar/AddBlockButton.js +267 -0
  83. package/layouts/Sidebar/BlockForm.d.ts +20 -0
  84. package/layouts/Sidebar/BlockForm.js +517 -0
  85. package/layouts/Sidebar/BlocksControl.d.ts +21 -0
  86. package/layouts/Sidebar/BlocksControl.js +190 -0
  87. package/layouts/Sidebar/index.d.ts +10 -0
  88. package/layouts/Sidebar/index.js +451 -0
  89. package/layouts/Snackbar.d.ts +3 -0
  90. package/layouts/Snackbar.js +43 -0
  91. package/package.json +133 -0
  92. package/store/Provider.d.ts +15 -0
  93. package/store/Provider.js +71 -0
  94. package/store/editor-store-core.d.ts +4 -0
  95. package/store/editor-store-core.js +271 -0
  96. package/store/index.d.ts +112 -0
  97. package/store/index.js +178 -0
  98. package/theme.d.ts +10 -0
  99. package/theme.js +9 -0
  100. package/translation/cn.json +29 -0
  101. package/translation/en.json +29 -0
  102. package/translation/fr.json +31 -0
  103. package/translation/index.d.ts +6 -0
  104. package/translation/index.js +23 -0
  105. package/translation/types.d.ts +13 -0
  106. package/translation/types.js +5 -0
  107. package/types/Block.d.ts +22 -0
  108. package/types/Block.js +5 -0
  109. package/types/BlockType.d.ts +50 -0
  110. package/types/BlockType.js +5 -0
  111. package/types/ConfigStorageAdapter.d.ts +11 -0
  112. package/types/ConfigStorageAdapter.js +5 -0
  113. package/types/ObjectStorageAdapter.d.ts +68 -0
  114. package/types/ObjectStorageAdapter.js +5 -0
  115. package/types/index.d.ts +5 -0
  116. package/types/index.js +100 -0
  117. package/types/throttle-and-debounce.d.ts +2 -0
  118. package/types/throttle-and-debounce.js +5 -0
  119. package/utils/block.d.ts +16 -0
  120. package/utils/block.js +41 -0
  121. package/utils/helpers.d.ts +5 -0
  122. package/utils/helpers.js +22 -0
  123. package/utils/strings.d.ts +1 -0
  124. package/utils/strings.js +11 -0
@@ -0,0 +1,517 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _Delete = _interopRequireDefault(require("@mui/icons-material/Delete"));
8
+ var _Edit = _interopRequireDefault(require("@mui/icons-material/Edit"));
9
+ var _EditOutlined = _interopRequireDefault(require("@mui/icons-material/EditOutlined"));
10
+ var _FileCopy = _interopRequireDefault(require("@mui/icons-material/FileCopy"));
11
+ var _MoreVert = _interopRequireDefault(require("@mui/icons-material/MoreVert"));
12
+ var _Remove = _interopRequireDefault(require("@mui/icons-material/Remove"));
13
+ var _Settings = _interopRequireDefault(require("@mui/icons-material/Settings"));
14
+ var _Style = _interopRequireDefault(require("@mui/icons-material/Style"));
15
+ var _Box = _interopRequireDefault(require("@mui/material/Box"));
16
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
17
+ var _Icon = _interopRequireDefault(require("@mui/material/Icon"));
18
+ var _ListItemText = _interopRequireDefault(require("@mui/material/ListItemText"));
19
+ var _Menu = _interopRequireDefault(require("@mui/material/Menu"));
20
+ var _styles = require("@mui/material/styles");
21
+ var _Tab = _interopRequireDefault(require("@mui/material/Tab"));
22
+ var _Tabs = _interopRequireDefault(require("@mui/material/Tabs"));
23
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
24
+ var _clsx = _interopRequireDefault(require("clsx"));
25
+ var _react = _interopRequireWildcard(require("react"));
26
+ var _I18nContext = require("../../contexts/I18nContext");
27
+ var _useDebounce = _interopRequireDefault(require("../../hooks/ui-optimizations/useDebounce"));
28
+ var _useThrottle = _interopRequireDefault(require("../../hooks/ui-optimizations/useThrottle"));
29
+ var _store = require("../../store");
30
+ var _ListItemIcon = _interopRequireDefault(require("@mui/material/ListItemIcon/ListItemIcon.js"));
31
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
32
+ var _jsxRuntime = require("react/jsx-runtime");
33
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
34
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
35
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
36
+ const PREFIX = 'BlockForm';
37
+ const classes = {
38
+ root: `${PREFIX}-root`,
39
+ headerActions: `${PREFIX}-headerActions`,
40
+ labelDragIcon: `${PREFIX}-labelDragIcon`,
41
+ label: `${PREFIX}-label`,
42
+ form: `${PREFIX}-form`,
43
+ actions: `${PREFIX}-actions`,
44
+ listItemIcon: `${PREFIX}-listItemIcon`,
45
+ deleteActions: `${PREFIX}-deleteActions`,
46
+ cancelBtn: `${PREFIX}-cancelBtn`,
47
+ iconBtn: `${PREFIX}-iconBtn`,
48
+ tabs: `${PREFIX}-tabs`,
49
+ tabPanel: `${PREFIX}-tabPanel`
50
+ };
51
+ const Root = (0, _styles.styled)('div')(({
52
+ theme
53
+ }) => ({
54
+ borderBottom: `1px solid ${theme.palette.grey[100]}`,
55
+ padding: theme.spacing(1.5),
56
+ [`& .${classes.headerActions}`]: {
57
+ display: 'flex',
58
+ backgroundColor: '#e5e5e5',
59
+ borderRadius: '4px',
60
+ padding: theme.spacing(1)
61
+ },
62
+ [`& .${classes.labelDragIcon}`]: {
63
+ marginRight: theme.spacing(0.25),
64
+ marginLeft: theme.spacing(-0.5)
65
+ },
66
+ [`& .${classes.label}`]: {
67
+ justifyContent: 'flex-start',
68
+ width: '100%',
69
+ padding: 0,
70
+ '& .MuiButton-label': {
71
+ padding: 0,
72
+ display: 'block'
73
+ }
74
+ },
75
+ [`& .${classes.actions}`]: {
76
+ marginLeft: 'auto',
77
+ lineHeight: 1,
78
+ fontSize: theme.typography.fontSize,
79
+ minWidth: 108,
80
+ display: 'flex',
81
+ justifyContent: 'end'
82
+ },
83
+ // [`& .${classes.form}`]: {
84
+ // marginTop: theme.spacing(4)
85
+ // },
86
+ [`& .${classes.iconBtn}`]: {
87
+ minWidth: 0
88
+ },
89
+ [`& .${classes.listItemIcon}`]: {
90
+ width: 32,
91
+ minWidth: 32
92
+ },
93
+ [`& .${classes.deleteActions}`]: {
94
+ display: 'flex'
95
+ },
96
+ [`& .${classes.cancelBtn}`]: {
97
+ marginRight: theme.spacing(1)
98
+ },
99
+ [`& .${classes.tabs}`]: {
100
+ borderBottom: `1px solid ${theme.palette.divider}`
101
+ },
102
+ [`& .${classes.tabPanel}`]: {
103
+ padding: theme.spacing(2, 0)
104
+ }
105
+ }));
106
+ const BlockForm = props => {
107
+ const {
108
+ block,
109
+ blockType,
110
+ onChange,
111
+ onDelete,
112
+ onClone,
113
+ initialState = {},
114
+ isNested = true
115
+ } = props;
116
+ const {
117
+ data,
118
+ settings,
119
+ meta,
120
+ id,
121
+ type,
122
+ collapse
123
+ } = block;
124
+ const {
125
+ selectedBlockId,
126
+ editingBlockId,
127
+ setEditingBlockId,
128
+ setSelectedBlockId,
129
+ data: allBlocks,
130
+ setData
131
+ } = (0, _store.useEditorStore)(state => state);
132
+ const theme = (0, _styles.useTheme)();
133
+ const t = (0, _I18nContext.useT)();
134
+ const [state, setState] = (0, _react.useState)({
135
+ showEditForm: collapse || true,
136
+ showSettingsForm: false,
137
+ showDeleteForm: false,
138
+ moreAnchorEl: null,
139
+ activeTab: 0,
140
+ ...initialState
141
+ });
142
+ const rootRef = (0, _react.useRef)(null);
143
+ (0, _react.useEffect)(() => {
144
+ if (collapse !== undefined) {
145
+ setState(prevState => ({
146
+ ...prevState,
147
+ showEditForm: Boolean(collapse),
148
+ showDeleteForm: collapse ? false : prevState.showDeleteForm,
149
+ showSettingsForm: collapse ? false : prevState.showSettingsForm
150
+ }));
151
+ }
152
+ }, [collapse]);
153
+ (0, _react.useEffect)(() => {
154
+ const isNewBlock = meta.created === meta.changed;
155
+ if (isNewBlock) {
156
+ setEditingBlockId(id);
157
+ }
158
+ }, [id, meta.created, meta.changed, setEditingBlockId]);
159
+ const handleTabChange = (event, newValue) => {
160
+ setState({
161
+ ...state,
162
+ activeTab: newValue
163
+ });
164
+ };
165
+ const toggleShowEditForm = () => {
166
+ const newShowEditForm = !state.showEditForm;
167
+ setState({
168
+ ...state,
169
+ showEditForm: newShowEditForm,
170
+ showDeleteForm: false,
171
+ showSettingsForm: false
172
+ });
173
+ if (onChange) {
174
+ onChange(prevBlock => ({
175
+ ...prevBlock,
176
+ collapse: newShowEditForm,
177
+ meta: {
178
+ ...prevBlock.meta,
179
+ changed: Date.now()
180
+ }
181
+ }));
182
+ }
183
+ };
184
+ const toggleShowSettingsForm = () => {
185
+ setState({
186
+ ...state,
187
+ showEditForm: false,
188
+ showDeleteForm: false,
189
+ showSettingsForm: !state.showSettingsForm
190
+ });
191
+ };
192
+ const handleClickMoreBtn = e => {
193
+ setState({
194
+ ...state,
195
+ showEditForm: false,
196
+ showSettingsForm: false,
197
+ showDeleteForm: false,
198
+ moreAnchorEl: e.currentTarget
199
+ });
200
+ };
201
+ const handleCloseMoreMenu = () => {
202
+ setState({
203
+ ...state,
204
+ moreAnchorEl: null
205
+ });
206
+ };
207
+ const handleCloneBlock = (withData = true) => () => {
208
+ handleCloseMoreMenu();
209
+ onClone(withData);
210
+ };
211
+ const handleDeleteBlock = () => {
212
+ setState({
213
+ ...state,
214
+ showEditForm: false,
215
+ showSettingsForm: false,
216
+ showDeleteForm: true,
217
+ moreAnchorEl: null
218
+ });
219
+ };
220
+ const handleDeleteCancel = () => {
221
+ setState({
222
+ ...state,
223
+ showDeleteForm: false
224
+ });
225
+ };
226
+ const handleDataChange = (0, _react.useCallback)(newDataOrFn => {
227
+ setEditingBlockId(id);
228
+ onChange(prevBlock => ({
229
+ ...prevBlock,
230
+ data: typeof newDataOrFn === 'function' ? newDataOrFn(prevBlock.data) : newDataOrFn,
231
+ meta: {
232
+ ...prevBlock.meta,
233
+ changed: Date.now()
234
+ }
235
+ }));
236
+ }, [setEditingBlockId, id, onChange]);
237
+ const handleDebouncedDataChange = (0, _useDebounce.default)(handleDataChange);
238
+ const handleThrottledDataChange = (0, _useThrottle.default)(handleDataChange);
239
+ const handleSettingsChange = (0, _react.useCallback)(newSettingsOrFn => {
240
+ onChange(prevBlock => ({
241
+ ...prevBlock,
242
+ settings: typeof newSettingsOrFn === 'function' ? newSettingsOrFn(prevBlock.settings) : newSettingsOrFn,
243
+ meta: {
244
+ ...prevBlock.meta,
245
+ changed: Date.now()
246
+ }
247
+ }));
248
+ }, [onChange]);
249
+ const handleDebouncedSettingsChange = (0, _useDebounce.default)(handleSettingsChange);
250
+ const handleThrottledSettingsChange = (0, _useThrottle.default)(handleSettingsChange);
251
+ (0, _react.useEffect)(() => {
252
+ if (state.showEditForm || state.showSettingsForm) {
253
+ setTimeout(() => {
254
+ if (!rootRef.current) {
255
+ return;
256
+ }
257
+ const firstInput = rootRef.current.querySelector('input, textarea');
258
+ if (!firstInput) {
259
+ return;
260
+ }
261
+ firstInput.focus();
262
+ }, 50);
263
+ }
264
+ }, [state.showEditForm, state.showSettingsForm]);
265
+ const isChildOfSelected = _react.default.useMemo(() => {
266
+ if (!selectedBlockId || !allBlocks) return false;
267
+ const selectedBlock = allBlocks.find(b => b.id === selectedBlockId);
268
+ if (!selectedBlock) return false;
269
+ return JSON.stringify(selectedBlock.data).includes(id);
270
+ }, [selectedBlockId, allBlocks, id]);
271
+ const renderHeader = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
272
+ className: classes.headerActions,
273
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
274
+ display: "flex",
275
+ alignItems: "center",
276
+ gap: 1,
277
+ className: "sortable-handle",
278
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
279
+ className: (0, _clsx.default)(['sortable-handle', classes.labelDragIcon]),
280
+ children: blockType.icon || 'drag_handle'
281
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
282
+ className: classes.label,
283
+ variant: "button",
284
+ component: "div",
285
+ children: blockType.blockLabel(data)
286
+ })]
287
+ }), !blockType.disabled && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
288
+ className: classes.actions,
289
+ children: [state.showEditForm && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
290
+ onClick: toggleShowEditForm,
291
+ className: classes.iconBtn,
292
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Remove.default, {
293
+ fontSize: "small"
294
+ })
295
+ }), !state.showEditForm && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
296
+ onClick: toggleShowEditForm,
297
+ className: classes.iconBtn,
298
+ disabled: !blockType.editForm,
299
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Edit.default, {
300
+ fontSize: "small"
301
+ })
302
+ }), state.showSettingsForm && blockType.settingsForm && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
303
+ onClick: toggleShowSettingsForm,
304
+ className: classes.iconBtn,
305
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Remove.default, {
306
+ fontSize: "small"
307
+ })
308
+ }), !state.showSettingsForm && blockType.settingsForm && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
309
+ onClick: toggleShowSettingsForm,
310
+ className: classes.iconBtn,
311
+ disabled: !blockType.settingsForm,
312
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Settings.default, {
313
+ fontSize: "small"
314
+ })
315
+ })]
316
+ }), isNested && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
317
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
318
+ className: `${classes.iconBtn} ${PREFIX}-moreBtn`,
319
+ onClick: handleClickMoreBtn,
320
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MoreVert.default, {
321
+ fontSize: "small"
322
+ })
323
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Menu.default, {
324
+ open: Boolean(state.moreAnchorEl),
325
+ anchorEl: state.moreAnchorEl,
326
+ transformOrigin: {
327
+ vertical: 0,
328
+ horizontal: 'left'
329
+ },
330
+ onClose: handleCloseMoreMenu,
331
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
332
+ onClick: handleCloneBlock(),
333
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemIcon.default, {
334
+ className: classes.listItemIcon,
335
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FileCopy.default, {
336
+ fontSize: "small"
337
+ })
338
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemText.default, {
339
+ children: "Clone"
340
+ })]
341
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
342
+ onClick: handleDeleteBlock,
343
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemIcon.default, {
344
+ className: classes.listItemIcon,
345
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Delete.default, {
346
+ fontSize: "small"
347
+ })
348
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemText.default, {
349
+ children: "Delete"
350
+ })]
351
+ })]
352
+ })]
353
+ })]
354
+ });
355
+ const renderContent = () => {
356
+ if (isNested) {
357
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
358
+ children: [state.showEditForm && blockType.editForm && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
359
+ className: classes.form,
360
+ style: {
361
+ marginTop: theme.spacing(4)
362
+ },
363
+ children: /*#__PURE__*/_react.default.createElement(blockType.editForm, {
364
+ id,
365
+ type,
366
+ data,
367
+ meta,
368
+ settings,
369
+ onChange: handleDataChange,
370
+ onDebouncedChange: handleDebouncedDataChange,
371
+ onThrottledChange: handleThrottledDataChange,
372
+ onClose: toggleShowEditForm
373
+ })
374
+ }), blockType.settingsForm && state.showSettingsForm && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
375
+ className: classes.form,
376
+ children: /*#__PURE__*/_react.default.createElement(blockType.settingsForm, {
377
+ id,
378
+ type,
379
+ data,
380
+ meta,
381
+ settings,
382
+ onChange: handleSettingsChange,
383
+ onDebouncedChange: handleDebouncedSettingsChange,
384
+ onThrottledChange: handleThrottledSettingsChange
385
+ })
386
+ }), state.showDeleteForm && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
387
+ className: (0, _clsx.default)([classes.form]),
388
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
389
+ mb: 2,
390
+ children: "Are you sure you want to delete this block?"
391
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
392
+ className: classes.deleteActions,
393
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
394
+ variant: "outlined",
395
+ onClick: handleDeleteCancel,
396
+ className: classes.cancelBtn,
397
+ children: t('editor.cancel')
398
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
399
+ variant: "contained",
400
+ color: "primary",
401
+ onClick: onDelete,
402
+ startIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Delete.default, {}),
403
+ children: t('editor.delete')
404
+ })]
405
+ })]
406
+ })]
407
+ });
408
+ }
409
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
410
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Tabs.default, {
411
+ value: state.activeTab,
412
+ onChange: handleTabChange,
413
+ className: classes.tabs,
414
+ variant: "fullWidth",
415
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Tab.default, {
416
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_EditOutlined.default, {
417
+ fontSize: "small"
418
+ }),
419
+ label: t('editor.content'),
420
+ sx: {
421
+ textTransform: 'none',
422
+ '& .MuiTab-iconWrapper': {
423
+ marginBottom: '4px'
424
+ }
425
+ }
426
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tab.default, {
427
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Style.default, {
428
+ fontSize: "small"
429
+ }),
430
+ label: t('editor.advanced'),
431
+ sx: {
432
+ textTransform: 'none',
433
+ '& .MuiTab-iconWrapper': {
434
+ marginBottom: '4px'
435
+ }
436
+ }
437
+ })]
438
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
439
+ className: classes.tabPanel,
440
+ children: [state.activeTab === 0 && blockType.editForm && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
441
+ className: classes.form,
442
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
443
+ sx: {
444
+ textAlign: 'center',
445
+ pb: 2,
446
+ fontWeight: 'bold',
447
+ fontSize: '1rem'
448
+ },
449
+ children: blockType.blockLabel(data)
450
+ }), /*#__PURE__*/_react.default.createElement(blockType.editForm, {
451
+ id,
452
+ type,
453
+ data,
454
+ meta,
455
+ settings,
456
+ onChange: handleDataChange,
457
+ onDebouncedChange: handleDebouncedDataChange,
458
+ onThrottledChange: handleThrottledDataChange,
459
+ onClose: toggleShowEditForm
460
+ })]
461
+ }), state.activeTab === 1 && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
462
+ className: classes.form,
463
+ children: blockType.settingsForm ? /*#__PURE__*/_react.default.createElement(blockType.settingsForm, {
464
+ id,
465
+ type,
466
+ data,
467
+ meta,
468
+ settings,
469
+ onChange: handleSettingsChange,
470
+ onDebouncedChange: handleDebouncedSettingsChange,
471
+ onThrottledChange: handleThrottledSettingsChange
472
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
473
+ variant: "body2",
474
+ color: "text.secondary",
475
+ sx: {
476
+ textAlign: 'center',
477
+ py: 4
478
+ },
479
+ children: t('editor.noAdvanced')
480
+ })
481
+ }), state.activeTab === 2 && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
482
+ className: classes.form,
483
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
484
+ variant: "body1",
485
+ children: "Advanced settings coming soon..."
486
+ })
487
+ })]
488
+ })]
489
+ });
490
+ };
491
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Root, {
492
+ ref: rootRef,
493
+ "data-id": id,
494
+ className: (0, _clsx.default)(['sortable-item']),
495
+ onClick: () => {
496
+ setEditingBlockId(id);
497
+ },
498
+ children: [isNested && renderHeader(), renderContent()]
499
+ }, id);
500
+ };
501
+ var _default = exports.default = /*#__PURE__*/(0, _react.memo)(BlockForm, (prevProps, props) => {
502
+ const {
503
+ block: prevBlock,
504
+ initialState: prevState
505
+ } = prevProps;
506
+ const {
507
+ block,
508
+ initialState: state
509
+ } = props;
510
+ if (block.meta.changed !== prevBlock.meta.changed) {
511
+ return false;
512
+ }
513
+ if (prevState?.showEditForm !== state?.showEditForm) {
514
+ return false;
515
+ }
516
+ return true;
517
+ });
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { BlockType } from '../../index';
3
+ import { AddBlockButtonProps } from '../../layouts/Sidebar/AddBlockButton';
4
+ import { Block } from '../../types/Block';
5
+ type BlocksControlProps = {
6
+ label?: string;
7
+ data: Block[];
8
+ onChange(newData: Block[]): void;
9
+ blockTypes: BlockType[];
10
+ cardinality?: number;
11
+ classes?: {
12
+ root?: string;
13
+ body?: string;
14
+ footer?: string;
15
+ };
16
+ addBlockLabel?: string;
17
+ addBlockProps?: Partial<AddBlockButtonProps>;
18
+ isNested?: boolean;
19
+ };
20
+ declare const BlocksControl: React.FC<BlocksControlProps>;
21
+ export default BlocksControl;