@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,4 @@
1
+ import { DialogProps } from '@mui/material';
2
+ import React from 'react';
3
+ declare const SaveTemplateDialog: React.FC<DialogProps>;
4
+ export default SaveTemplateDialog;
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _I18nContext = require("../../../contexts/I18nContext");
8
+ var _lab = require("@mui/lab");
9
+ var _Button = _interopRequireDefault(require("@mui/material/Button/Button.js"));
10
+ var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox/Checkbox.js"));
11
+ var _Dialog = _interopRequireDefault(require("@mui/material/Dialog/Dialog.js"));
12
+ var _DialogActions = _interopRequireDefault(require("@mui/material/DialogActions/DialogActions.js"));
13
+ var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent/DialogContent.js"));
14
+ var _DialogTitle = _interopRequireDefault(require("@mui/material/DialogTitle/DialogTitle.js"));
15
+ var _FormControlLabel = _interopRequireDefault(require("@mui/material/FormControlLabel/FormControlLabel.js"));
16
+ var _TextField = _interopRequireDefault(require("@mui/material/TextField/TextField.js"));
17
+ var _Grid = _interopRequireDefault(require("@mui/material/Unstable_Grid2/Grid2"));
18
+ var _react = _interopRequireWildcard(require("react"));
19
+ var _store = require("../../../store");
20
+ var _strings = require("../../../utils/strings");
21
+ var _jsxRuntime = require("react/jsx-runtime");
22
+ 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); }
23
+ 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; }
24
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
+ const initialFormData = {
26
+ name: '',
27
+ id: ''
28
+ };
29
+ const initialFormState = {
30
+ id: {
31
+ open: false,
32
+ dirty: false
33
+ }
34
+ };
35
+ const SaveTemplateDialog = props => {
36
+ const t = (0, _I18nContext.useT)();
37
+ const {
38
+ ...dialogProps
39
+ } = props;
40
+ const data = (0, _store.useEditorStore)(state => state.data);
41
+ const addAlertMessages = (0, _store.useEditorStore)(state => state.addAlertMessages);
42
+ const [formData, setFormData] = (0, _react.useState)(initialFormData);
43
+ const [formState, setFormState] = (0, _react.useState)(initialFormState);
44
+ const configClient = (0, _store.useConfigStorageQueryClient)();
45
+ const configListQuery = configClient.useListQuery();
46
+ const templateList = (configListQuery.data || []).filter(configId => configId.startsWith('template.'));
47
+ const closeDialog = (ev, reason) => {
48
+ if (dialogProps.onClose) {
49
+ dialogProps.onClose(ev, reason);
50
+ }
51
+ setTimeout(() => {
52
+ setFormData(initialFormData);
53
+ setFormState(initialFormState);
54
+ }, 200);
55
+ };
56
+ const {
57
+ mutate: save,
58
+ isLoading
59
+ } = configClient.useSaveMutation({
60
+ onSuccess(config) {
61
+ closeDialog({}, 'escapeKeyDown');
62
+ addAlertMessages([{
63
+ severity: 'success',
64
+ message: `Template "${config.data.name}" saved successfully.`
65
+ }]);
66
+ }
67
+ });
68
+ const newConfig = {
69
+ id: `template.${formData.id}`,
70
+ revisionId: 0,
71
+ data: {
72
+ name: formData.name,
73
+ blocks: data
74
+ }
75
+ };
76
+ const handleFormSubmit = ev => {
77
+ ev.preventDefault();
78
+ save(newConfig);
79
+ };
80
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dialog.default, {
81
+ ...dialogProps,
82
+ onClose: closeDialog,
83
+ PaperProps: {
84
+ sx: {
85
+ maxWidth: 480
86
+ }
87
+ },
88
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("form", {
89
+ autoComplete: "off",
90
+ onSubmit: handleFormSubmit,
91
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_DialogTitle.default, {
92
+ children: t('editor.saveAsTemplate')
93
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_DialogContent.default, {
94
+ dividers: true,
95
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Grid.default, {
96
+ container: true,
97
+ spacing: 2,
98
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
99
+ xs: 12,
100
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
101
+ label: t('editor.templateName'),
102
+ name: "name",
103
+ value: formData.name,
104
+ onChange: ev => {
105
+ setFormData({
106
+ id: formState.id.dirty ? formData.id : (0, _strings.toId)(ev.currentTarget.value),
107
+ name: ev.currentTarget.value
108
+ });
109
+ },
110
+ required: true,
111
+ fullWidth: true
112
+ })
113
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
114
+ xs: 12,
115
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Grid.default, {
116
+ container: true,
117
+ p: 0,
118
+ alignItems: "stretch",
119
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
120
+ flexGrow: 1,
121
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
122
+ size: "small",
123
+ label: t('editor.templateId'),
124
+ name: "Id",
125
+ disabled: !formState.id.open,
126
+ value: formData.id,
127
+ inputProps: {
128
+ maxLength: 128
129
+ },
130
+ InputLabelProps: {
131
+ shrink: formData.id.length > 0
132
+ },
133
+ onChange: ev => {
134
+ setFormData({
135
+ ...formData,
136
+ id: (0, _strings.toId)(ev.target.value)
137
+ });
138
+ setFormState({
139
+ ...formState,
140
+ id: {
141
+ ...formState.id,
142
+ dirty: true
143
+ }
144
+ });
145
+ },
146
+ required: true,
147
+ fullWidth: true
148
+ })
149
+ }), !formState.id.open && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
150
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
151
+ variant: "outlined",
152
+ onClick: () => {
153
+ setFormState({
154
+ ...formState,
155
+ id: {
156
+ ...formState.id,
157
+ open: true
158
+ }
159
+ });
160
+ },
161
+ sx: {
162
+ height: '100%'
163
+ },
164
+ children: t('editor.edit')
165
+ })
166
+ })]
167
+ })
168
+ }), templateList.includes(newConfig.id) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
169
+ xs: 12,
170
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormControlLabel.default, {
171
+ label: `A template with the id "${formData.id}" already exists. Overwrite existing template.`,
172
+ control: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Checkbox.default, {
173
+ required: true
174
+ })
175
+ })
176
+ })]
177
+ })
178
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_DialogActions.default, {
179
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_lab.LoadingButton, {
180
+ variant: "contained",
181
+ type: "submit",
182
+ loading: !configListQuery.data || isLoading,
183
+ disabled: !configListQuery.data,
184
+ sx: {
185
+ fontWeight: 500
186
+ },
187
+ children: t('editor.save')
188
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
189
+ variant: "outlined",
190
+ disabled: isLoading,
191
+ sx: {
192
+ fontWeight: 500
193
+ },
194
+ onClick: ev => {
195
+ closeDialog(ev, 'backdropClick');
196
+ },
197
+ children: t('editor.cancel')
198
+ })]
199
+ })]
200
+ })
201
+ });
202
+ };
203
+ var _default = exports.default = SaveTemplateDialog;
@@ -0,0 +1,13 @@
1
+ import { EDITOR_DATA, EDITOR_READY } from '../constants';
2
+ import { type FC } from 'react';
3
+ type PostMessageParamsKeyType = typeof EDITOR_READY | typeof EDITOR_DATA;
4
+ export type PostMessageParamsType = Partial<Record<PostMessageParamsKeyType, Record<string, any>>>;
5
+ export type MessageEventDataType = {
6
+ onAction?(action: {
7
+ type: string;
8
+ payload: unknown;
9
+ }): void;
10
+ postMessageParams?: PostMessageParamsType;
11
+ };
12
+ declare const MessageBus: FC<MessageEventDataType>;
13
+ export default MessageBus;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _constants = require("../constants");
8
+ var _store = require("../store");
9
+ var _react = require("react");
10
+ const MessageBus = props => {
11
+ const {
12
+ onAction,
13
+ postMessageParams
14
+ } = props;
15
+ const {
16
+ data,
17
+ setData: setEditorData,
18
+ allowedOrigins
19
+ } = (0, _store.useEditorStore)(state => state);
20
+ // Setup iframe communication between parent window, editor and preview iframe
21
+ (0, _react.useEffect)(() => {
22
+ if (!window.parent || allowedOrigins?.length === 0) {
23
+ return undefined;
24
+ }
25
+ const safeAllowedOrigins = [...allowedOrigins].map(origin => new URL(origin).origin);
26
+ window.parent.postMessage({
27
+ type: _constants.EDITOR_READY,
28
+ ...(postMessageParams?.[_constants.EDITOR_READY] || {})
29
+ }, '*');
30
+ const listener = event => {
31
+ if (!safeAllowedOrigins.includes(origin)) {
32
+ console.warn(`Received message from ${event.origin} but only messages from ${safeAllowedOrigins.join(', ')} are allowed.`);
33
+ return;
34
+ }
35
+ if (event.data && event.data.type) {
36
+ const {
37
+ type,
38
+ payload
39
+ } = event.data;
40
+ if (!type.startsWith('editor/')) {
41
+ return;
42
+ }
43
+ switch (type) {
44
+ case _constants.EDITOR_DATA:
45
+ setEditorData(payload);
46
+ break;
47
+ default:
48
+ // preview.dispatch({ type, payload });
49
+ // break;
50
+ }
51
+ onAction?.({
52
+ type,
53
+ payload
54
+ });
55
+ }
56
+ };
57
+ window.addEventListener('message', listener);
58
+ return () => {
59
+ window.removeEventListener('message', listener);
60
+ };
61
+ }, [allowedOrigins, onAction, postMessageParams, setEditorData]);
62
+
63
+ // Forward data change to preview iframe and to top window.
64
+ (0, _react.useEffect)(() => {
65
+ if (window.parent && window.parent !== window) {
66
+ window.parent.postMessage({
67
+ type: _constants.EDITOR_DATA,
68
+ payload: data,
69
+ ...(postMessageParams?.[_constants.EDITOR_DATA] || {})
70
+ }, '*');
71
+ }
72
+ }, [data, postMessageParams]);
73
+ return null;
74
+ };
75
+ MessageBus.displayName = 'MessageBus';
76
+ var _default = exports.default = MessageBus;
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { Block, BlockType } from '../../types';
3
+ export interface AddBlockButtonProps {
4
+ data: Block[];
5
+ blockTypes: BlockType[];
6
+ onAddBlock(blockType: BlockType): void;
7
+ disabled?: boolean;
8
+ displayFormat: 'autocomplete' | 'select' | 'drawer';
9
+ label?: string;
10
+ }
11
+ declare const AddBlockButton: React.FunctionComponent<AddBlockButtonProps>;
12
+ export default AddBlockButton;
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _Add = _interopRequireDefault(require("@mui/icons-material/Add"));
8
+ var _Box = _interopRequireDefault(require("@mui/material/Box/Box.js"));
9
+ var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent/DialogContent.js"));
10
+ var _Divider = _interopRequireDefault(require("@mui/material/Divider/Divider.js"));
11
+ var _Drawer = _interopRequireDefault(require("@mui/material/Drawer/Drawer.js"));
12
+ var _Grid = _interopRequireDefault(require("@mui/material/Grid/Grid.js"));
13
+ var _Icon = _interopRequireDefault(require("@mui/material/Icon/Icon.js"));
14
+ var _Autocomplete = _interopRequireDefault(require("@mui/material/Autocomplete"));
15
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
16
+ var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
17
+ var _Menu = _interopRequireDefault(require("@mui/material/Menu"));
18
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
19
+ var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
20
+ var _react = _interopRequireWildcard(require("react"));
21
+ var _BlocksBar = require("../BlocksBar");
22
+ var _jsxRuntime = require("react/jsx-runtime");
23
+ 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); }
24
+ 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; }
25
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
+ const testBlockTypeIsDisabled = (blockType, data) => {
27
+ const count = {};
28
+ data.forEach(b => {
29
+ if (!count[b.type]) {
30
+ count[b.type] = 1;
31
+ } else {
32
+ count[b.type] += 1;
33
+ }
34
+ });
35
+ const {
36
+ cardinality = -1
37
+ } = blockType;
38
+ const limitReached = cardinality > 0 ? count[blockType.id] >= cardinality : false;
39
+ return blockType.disabled || limitReached;
40
+ };
41
+ const AddBlockButton = props => {
42
+ const {
43
+ label = 'Add block',
44
+ data,
45
+ onAddBlock,
46
+ blockTypes,
47
+ disabled,
48
+ displayFormat
49
+ } = props;
50
+ const [open, setOpen] = (0, _react.useState)(false);
51
+ const [keyword, setKeyword] = (0, _react.useState)('');
52
+ const buttonRef = (0, _react.useRef)(null);
53
+ const autocompleteRef = (0, _react.useRef)(null);
54
+ const closeDialog = () => {
55
+ setOpen(false);
56
+ };
57
+ const toggleDrawer = () => {
58
+ setOpen(!open);
59
+ };
60
+ const openDialog = () => {
61
+ setOpen(true);
62
+ if (buttonRef.current) {
63
+ buttonRef.current.blur();
64
+ }
65
+ setTimeout(() => {
66
+ if (!autocompleteRef.current) {
67
+ return;
68
+ }
69
+ const input = autocompleteRef.current.querySelector('input');
70
+ if (input) {
71
+ input.focus();
72
+ }
73
+ }, 100);
74
+ };
75
+ const openMenu = () => {
76
+ setOpen(true);
77
+ };
78
+ const noBlockTypeAvailable = blockTypes.length === 1 && testBlockTypeIsDisabled(blockTypes[0], data);
79
+ const getBlockTypes = () => {
80
+ if (keyword.length === 0) {
81
+ return blockTypes;
82
+ }
83
+ return blockTypes.filter(bt => bt.label.toLowerCase().includes(keyword.toLowerCase()));
84
+ };
85
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
86
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
87
+ ref: buttonRef,
88
+ type: "button",
89
+ size: "large",
90
+ color: "primary",
91
+ startIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Add.default, {}),
92
+ onClick: () => {
93
+ if (blockTypes.length === 1) {
94
+ onAddBlock(blockTypes[0]);
95
+ return;
96
+ }
97
+ if (displayFormat === 'drawer') {
98
+ toggleDrawer();
99
+ return;
100
+ }
101
+ if (displayFormat === 'autocomplete') {
102
+ openDialog();
103
+ return;
104
+ }
105
+ openMenu();
106
+ },
107
+ disabled: disabled || noBlockTypeAvailable,
108
+ children: label
109
+ }), displayFormat === 'drawer' && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Drawer.default, {
110
+ open: open,
111
+ anchor: "right",
112
+ onClose: toggleDrawer,
113
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
114
+ sx: {
115
+ p: 2
116
+ },
117
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
118
+ type: "search",
119
+ style: {
120
+ width: '100%',
121
+ border: '1px solid #ccc',
122
+ outline: 'none',
123
+ padding: 8,
124
+ borderRadius: 4
125
+ },
126
+ placeholder: "Type to search",
127
+ autoComplete: "off",
128
+ onChange: e => {
129
+ const {
130
+ value
131
+ } = e.target;
132
+ setKeyword(value);
133
+ },
134
+ value: keyword
135
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Divider.default, {
136
+ sx: {
137
+ mt: 2
138
+ }
139
+ })]
140
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
141
+ container: true,
142
+ rowGap: 2,
143
+ sx: {
144
+ p: 2,
145
+ width: 350
146
+ },
147
+ children: getBlockTypes().map((blockType, index) => {
148
+ const offsetLeft = index % 3 * 100;
149
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
150
+ item: true,
151
+ xs: 4,
152
+ onClick: () => {
153
+ onAddBlock(blockType);
154
+ toggleDrawer();
155
+ },
156
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_BlocksBar.HtmlTooltip, {
157
+ placement: "left",
158
+ slotProps: {
159
+ popper: {
160
+ modifiers: [{
161
+ name: 'offset',
162
+ options: {
163
+ offset: [0, offsetLeft]
164
+ }
165
+ }]
166
+ }
167
+ },
168
+ title: /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
169
+ src: blockType.preview ?? `https://placehold.co/400x300?text=${encodeURIComponent(blockType.label)}`,
170
+ alt: blockType.label,
171
+ width: 400,
172
+ height: 300
173
+ }),
174
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
175
+ sx: {
176
+ display: 'flex',
177
+ aspectRatio: '105/90',
178
+ justifyContent: 'space-between',
179
+ flexDirection: 'column',
180
+ alignItems: 'center',
181
+ textAlign: 'center',
182
+ padding: '10px 4px',
183
+ gap: 1,
184
+ cursor: 'pointer',
185
+ '&:hover': {
186
+ backgroundColor: '#f2f2f2'
187
+ }
188
+ },
189
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
190
+ style: {
191
+ fontSize: 32
192
+ },
193
+ children: blockType.icon || 'drag_handle'
194
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
195
+ children: blockType.label
196
+ })]
197
+ })
198
+ })
199
+ }, blockType.id);
200
+ })
201
+ })]
202
+ }), displayFormat === 'autocomplete' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dialog.default, {
203
+ PaperProps: {
204
+ sx: {
205
+ alignSelf: 'self-start',
206
+ marginTop: 15
207
+ }
208
+ },
209
+ open: open,
210
+ onClose: closeDialog,
211
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DialogContent.default, {
212
+ sx: {
213
+ p: 2
214
+ },
215
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Autocomplete.default, {
216
+ ref: autocompleteRef,
217
+ autoHighlight: true,
218
+ openOnFocus: true,
219
+ onChange: (e, blockType) => {
220
+ if (!blockType) {
221
+ return;
222
+ }
223
+ closeDialog();
224
+ onAddBlock(blockType);
225
+ },
226
+ getOptionDisabled: blockType => testBlockTypeIsDisabled(blockType, data),
227
+ renderInput: params => /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
228
+ sx: {
229
+ width: 400
230
+ },
231
+ focused: true,
232
+ placeholder: "Type to search",
233
+ label: label,
234
+ value: keyword,
235
+ ...params
236
+ }),
237
+ options: blockTypes
238
+ })
239
+ })
240
+ }), displayFormat === 'select' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Menu.default, {
241
+ open: open,
242
+ anchorEl: buttonRef.current,
243
+ onClose: () => {
244
+ closeDialog();
245
+ },
246
+ children: blockTypes.map(blockType => {
247
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
248
+ onClick: () => {
249
+ closeDialog();
250
+ onAddBlock(blockType);
251
+ },
252
+ disabled: testBlockTypeIsDisabled(blockType, data),
253
+ style: {
254
+ gap: 10,
255
+ width: 250
256
+ },
257
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
258
+ children: blockType.icon || 'drag_handle'
259
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
260
+ children: blockType.label
261
+ })]
262
+ }, blockType.id);
263
+ })
264
+ })]
265
+ });
266
+ };
267
+ var _default = exports.default = AddBlockButton;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { Block, BlockType } from '../../types';
3
+ interface BlockFormInitialState {
4
+ showEditForm?: boolean;
5
+ showSettingsForm?: boolean;
6
+ showDeleteForm?: boolean;
7
+ moreAnchorEl?: HTMLElement;
8
+ activeTab?: number;
9
+ }
10
+ export interface BlockFormProps {
11
+ block: Block;
12
+ blockType: BlockType;
13
+ initialState?: BlockFormInitialState;
14
+ onChange(block: Block | ((prevBlock: Block) => Block)): void;
15
+ onClone(withData: boolean): void;
16
+ onDelete(): void;
17
+ isNested?: boolean;
18
+ }
19
+ declare const _default: React.NamedExoticComponent<BlockFormProps>;
20
+ export default _default;