@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,537 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _DeleteOutline = _interopRequireDefault(require("@mui/icons-material/DeleteOutline"));
8
+ var _SettingsOutlined = _interopRequireDefault(require("@mui/icons-material/SettingsOutlined"));
9
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
10
+ var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
11
+ var _Container = _interopRequireDefault(require("@mui/material/Container"));
12
+ var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
13
+ var _Grid = _interopRequireDefault(require("@mui/material/Grid"));
14
+ var _InputLabel = _interopRequireDefault(require("@mui/material/InputLabel"));
15
+ var _Menu = _interopRequireDefault(require("@mui/material/Menu"));
16
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
17
+ var _OutlinedInput = _interopRequireDefault(require("@mui/material/OutlinedInput"));
18
+ var _Select = _interopRequireDefault(require("@mui/material/Select"));
19
+ var _styles = require("@mui/material/styles");
20
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
21
+ var _reactQuery = require("@tanstack/react-query");
22
+ var _clsx = _interopRequireDefault(require("clsx"));
23
+ var _itcFileBrowser = require("itc-file-browser");
24
+ var _react = _interopRequireWildcard(require("react"));
25
+ var _store = require("../../store");
26
+ var _useSortable = _interopRequireDefault(require("../../hooks/useSortable"));
27
+ var _FileBrowserDialog = _interopRequireDefault(require("./FileBrowserDialog"));
28
+ var _jsxRuntime = require("react/jsx-runtime");
29
+ 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); }
30
+ 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; }
31
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
+ const normalizeClassName = className => {
33
+ if (!className) return [];
34
+ return Array.isArray(className) ? className : [className];
35
+ };
36
+ const PREFIX = 'MediaControl';
37
+ const classes = {
38
+ root: `${PREFIX}-root`,
39
+ header: `${PREFIX}-header`,
40
+ media: `${PREFIX}-media`,
41
+ mediaThumbnail: `${PREFIX}-mediaThumbnail`,
42
+ mediaImg: `${PREFIX}-mediaImg`,
43
+ mediaName: `${PREFIX}-mediaName`,
44
+ mediaActions: `${PREFIX}-mediaActions`,
45
+ mediaActionBtn: `${PREFIX}-mediaActionBtn`,
46
+ mediaActionIcon: `${PREFIX}-mediaActionIcon`,
47
+ help: `${PREFIX}-help`,
48
+ required: `${PREFIX}-required`,
49
+ loader: `${PREFIX}-loader`
50
+ };
51
+ const Root = (0, _styles.styled)(_Container.default)(({
52
+ theme
53
+ }) => ({
54
+ '*': {
55
+ boxSizing: 'border-box'
56
+ },
57
+ [`&.${classes.root}`]: {
58
+ border: '1px solid #eee',
59
+ marginTop: theme.spacing(1),
60
+ marginBottom: theme.spacing(1),
61
+ width: '100%',
62
+ marginLeft: 0,
63
+ padding: theme.spacing(2),
64
+ fontSize: theme.typography.fontSize,
65
+ position: 'relative'
66
+ },
67
+ [`& .${classes.media}`]: {
68
+ border: '1px solid #eee',
69
+ position: 'relative',
70
+ cursor: 'move'
71
+ },
72
+ [`& .${classes.mediaThumbnail}`]: {
73
+ width: '100%',
74
+ height: 100,
75
+ padding: theme.spacing(1),
76
+ background: '#eee',
77
+ position: 'relative',
78
+ textAlign: 'center'
79
+ },
80
+ [`& .${classes.mediaImg}`]: {
81
+ width: '100%',
82
+ height: '100%',
83
+ objectFit: 'contain'
84
+ },
85
+ [`& .${classes.mediaName}`]: {
86
+ borderTop: '1px solid #eee',
87
+ paddingLeft: theme.spacing(1),
88
+ paddingRight: theme.spacing(1),
89
+ lineHeight: theme.spacing(3),
90
+ whiteSpace: 'nowrap',
91
+ overflow: 'hidden',
92
+ textOverflow: 'ellipsis'
93
+ },
94
+ [`& .${classes.mediaActions}`]: {
95
+ position: 'absolute',
96
+ display: 'flex',
97
+ justifyContent: 'flex-end',
98
+ left: 0,
99
+ top: 0,
100
+ width: '100%',
101
+ padding: 4,
102
+ gap: 4
103
+ },
104
+ [`& .${classes.mediaActionBtn}`]: {
105
+ padding: 3,
106
+ minWidth: 0,
107
+ borderRadius: '100%'
108
+ },
109
+ [`& .${classes.mediaActionIcon}`]: {
110
+ width: 16,
111
+ height: 16
112
+ },
113
+ [`& .${classes.help}`]: {
114
+ marginTop: theme.spacing(1)
115
+ },
116
+ [`& .${classes.required}`]: {
117
+ color: theme.palette.error.main
118
+ },
119
+ [`& .${classes.loader}`]: {
120
+ top: 0,
121
+ left: 0,
122
+ position: 'absolute',
123
+ width: '100%',
124
+ height: '100%',
125
+ display: 'flex',
126
+ alignItems: 'center',
127
+ justifyContent: 'center',
128
+ zIndex: 10,
129
+ background: 'rgba(255, 255, 255, 0.5)'
130
+ }
131
+ }));
132
+ const extensionsByType = {
133
+ image: ['.jpg', '.jpeg', '.png', '.svg', '.webp'],
134
+ video: ['.mp4', '.webm'],
135
+ document: ['.pdf', '.docx', '.doc', '.txt']
136
+ };
137
+ const FiltersMenu = props => {
138
+ const {
139
+ media,
140
+ onChange
141
+ } = props;
142
+ const [open, setOpen] = (0, _react.useState)(false);
143
+ const settingsButtonRef = (0, _react.useRef)(null);
144
+ const settings = media.settings || {
145
+ version: 0,
146
+ filter: {
147
+ name: '',
148
+ value: 100
149
+ }
150
+ };
151
+ const values = {
152
+ '': [100],
153
+ brightness: [0, 50, 75, 90, 95, 100, 105, 110, 125, 150],
154
+ contrast: [0, 50, 75, 100, 125, 150],
155
+ saturate: [0, 50, 100, 150, 200],
156
+ grayscale: [0, 100],
157
+ sepia: [0, 100]
158
+ };
159
+ const handleChange = partialSettings => {
160
+ const newSettings = {
161
+ ...settings,
162
+ version: settings.version + 1,
163
+ ...partialSettings
164
+ };
165
+ onChange({
166
+ ...media,
167
+ settings: newSettings
168
+ });
169
+ };
170
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
171
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
172
+ className: classes.mediaActionBtn,
173
+ "aria-label": "Settings",
174
+ color: "primary",
175
+ variant: "contained",
176
+ size: "small",
177
+ ref: settingsButtonRef,
178
+ onClick: () => {
179
+ setOpen(true);
180
+ },
181
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingsOutlined.default, {
182
+ className: classes.mediaActionIcon
183
+ })
184
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Menu.default, {
185
+ sx: {},
186
+ anchorEl: settingsButtonRef.current,
187
+ open: open,
188
+ onClose: () => {
189
+ setOpen(false);
190
+ },
191
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
192
+ disableRipple: true,
193
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Grid.default, {
194
+ width: 260,
195
+ spacing: 1,
196
+ container: true,
197
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
198
+ item: true,
199
+ xs: 8,
200
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_FormControl.default, {
201
+ size: "small",
202
+ variant: "outlined",
203
+ fullWidth: true,
204
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_InputLabel.default, {
205
+ shrink: true,
206
+ children: "Filter"
207
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Select.default, {
208
+ input: /*#__PURE__*/(0, _jsxRuntime.jsx)(_OutlinedInput.default, {
209
+ notched: true,
210
+ label: "Filter"
211
+ }),
212
+ value: settings.filter.name,
213
+ onChange: ev => {
214
+ const filterName = ev.target.value;
215
+ const filterValues = values[filterName];
216
+ const value = filterValues.includes(settings.filter.value) ? settings.filter.value : filterValues[filterValues.length - 1];
217
+ handleChange({
218
+ filter: {
219
+ ...settings.filter,
220
+ name: filterName,
221
+ value
222
+ }
223
+ });
224
+ },
225
+ displayEmpty: true,
226
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
227
+ disableRipple: true,
228
+ value: "",
229
+ children: "None"
230
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
231
+ disableRipple: true,
232
+ value: "brightness",
233
+ children: "Brightness"
234
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
235
+ disableRipple: true,
236
+ value: "contrast",
237
+ children: "Contrast"
238
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
239
+ disableRipple: true,
240
+ value: "saturate",
241
+ children: "Saturate"
242
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
243
+ disableRipple: true,
244
+ value: "grayscale",
245
+ children: "Grayscale"
246
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
247
+ disableRipple: true,
248
+ value: "sepia",
249
+ children: "Sepia"
250
+ })]
251
+ })]
252
+ })
253
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
254
+ item: true,
255
+ xs: 4,
256
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormControl.default, {
257
+ size: "small",
258
+ disabled: settings.filter.name === '',
259
+ fullWidth: true,
260
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Select.default, {
261
+ value: settings.filter.value,
262
+ onChange: ev => {
263
+ handleChange({
264
+ filter: {
265
+ ...settings.filter,
266
+ value: ev.target.value
267
+ }
268
+ });
269
+ },
270
+ children: values[settings.filter.name].map(v => /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
271
+ value: v,
272
+ children: v
273
+ }, v))
274
+ })
275
+ })
276
+ })]
277
+ })
278
+ })
279
+ })]
280
+ });
281
+ };
282
+ const MediaControlItem = props => {
283
+ const {
284
+ media,
285
+ type,
286
+ size,
287
+ onRemove,
288
+ onChange,
289
+ disableFilters
290
+ } = props;
291
+ const storage = (0, _store.useObjectStorage)();
292
+ const mediaUrlQuery = (0, _reactQuery.useQuery)({
293
+ queryKey: ['mediaUrl', media.id],
294
+ queryFn() {
295
+ if (!storage) {
296
+ throw new Error('ObjectStorage is not defined');
297
+ }
298
+ if (type === 'image') {
299
+ return storage.imagePreviewUrl({
300
+ key: media.key,
301
+ width: 144
302
+ });
303
+ }
304
+ return storage.objectUrl({
305
+ key: media.key
306
+ });
307
+ }
308
+ });
309
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
310
+ "data-id": media.id,
311
+ ...size,
312
+ item: true,
313
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
314
+ className: (0, _clsx.default)(classes.media, 'sortable-item'),
315
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
316
+ className: classes.mediaThumbnail,
317
+ children: [type === 'image' && mediaUrlQuery.data && /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
318
+ src: mediaUrlQuery.data,
319
+ className: classes.mediaImg,
320
+ alt: ""
321
+ }), type === 'image' && media.key && !mediaUrlQuery.data && !mediaUrlQuery.isError && /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {
322
+ size: 24
323
+ })]
324
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
325
+ className: classes.mediaName,
326
+ children: media.name
327
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
328
+ className: classes.mediaActions,
329
+ children: [!disableFilters && /*#__PURE__*/(0, _jsxRuntime.jsx)(FiltersMenu, {
330
+ media: media,
331
+ onChange: onChange
332
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
333
+ className: classes.mediaActionBtn,
334
+ "aria-label": "Delete",
335
+ color: "primary",
336
+ variant: "contained",
337
+ size: "small",
338
+ onClick: () => onRemove(media.id),
339
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DeleteOutline.default, {
340
+ className: classes.mediaActionIcon
341
+ })
342
+ })]
343
+ })]
344
+ })
345
+ }, media.id);
346
+ };
347
+ const MediaControlComponent = props => {
348
+ const {
349
+ type,
350
+ cardinality = 1,
351
+ onChange,
352
+ initialData,
353
+ label,
354
+ required,
355
+ permissions: propsPermissions,
356
+ mediaGridItemSize = {
357
+ xs: 6
358
+ },
359
+ itemActions,
360
+ disableFilters,
361
+ className
362
+ } = props;
363
+ const allowedExtensions = (0, _react.useMemo)(() => {
364
+ if (type) {
365
+ return extensionsByType[type];
366
+ }
367
+ return [];
368
+ }, [type]);
369
+ const permissions = (0, _react.useMemo)(() => {
370
+ if (propsPermissions) {
371
+ return propsPermissions;
372
+ }
373
+ return {
374
+ ..._itcFileBrowser.denyAllPermissions,
375
+ canUpload: true,
376
+ canMkdir: true
377
+ };
378
+ }, [propsPermissions]);
379
+ const initialDataArray = (0, _react.useMemo)(() => {
380
+ if (!initialData) {
381
+ return [];
382
+ }
383
+ return Array.isArray(initialData) ? initialData : [initialData];
384
+ }, [initialData]);
385
+ const [open, setOpen] = (0, _react.useState)(false);
386
+ const [data, setData] = (0, _react.useState)(initialDataArray);
387
+ const dataRef = (0, _react.useRef)(data);
388
+ const isExternalUpdateRef = (0, _react.useRef)(false);
389
+ const isInitializedRef = (0, _react.useRef)(false);
390
+ dataRef.current = data;
391
+ const [loading, setLoading] = (0, _react.useState)(false);
392
+ const remaining = cardinality - data.length;
393
+ const addMedias = async medias => {
394
+ isInitializedRef.current = false;
395
+ isExternalUpdateRef.current = false;
396
+ setData([...data, ...medias.filter(newMedia => !data.find(m => m.id === newMedia.id))]);
397
+ };
398
+ const sortable = (0, _useSortable.default)({
399
+ disabled: data.length <= 1,
400
+ onUpdate(_, instance) {
401
+ const ids = instance.toArray();
402
+ if (!ids) {
403
+ return;
404
+ }
405
+ isInitializedRef.current = false;
406
+ isExternalUpdateRef.current = false;
407
+ setData(ids.map(id => {
408
+ return dataRef.current.find(datum => datum.id === id);
409
+ }));
410
+ }
411
+ });
412
+ const removeMedia = (0, _react.useCallback)(mediaId => {
413
+ isInitializedRef.current = false;
414
+ isExternalUpdateRef.current = false;
415
+ setData(data.filter(m => {
416
+ if (m.id === mediaId) {
417
+ return false;
418
+ }
419
+ return true;
420
+ }));
421
+ }, [data]);
422
+ const onMediaChange = newMedia => {
423
+ isInitializedRef.current = false;
424
+ isExternalUpdateRef.current = false;
425
+ setData(data.map(m => {
426
+ if (m.id === newMedia.id) {
427
+ return newMedia;
428
+ }
429
+ return m;
430
+ }));
431
+ };
432
+ (0, _react.useEffect)(() => {
433
+ const initialIds = initialDataArray.map(m => `${m.id}:${m.settings?.version || 0}`).join(',');
434
+ const ids = data.map(m => `${m.id}:${m.settings?.version || 0}`).join(',');
435
+ if (initialIds === ids) {
436
+ return;
437
+ }
438
+ if (isExternalUpdateRef.current) {
439
+ isExternalUpdateRef.current = false;
440
+ return;
441
+ }
442
+ const isExternalDataChange = isInitializedRef.current && initialIds !== ids && (initialDataArray.length > 0 && data.length === 0 || initialDataArray.length === 0 && data.length > 0);
443
+ if (isExternalDataChange) {
444
+ isExternalUpdateRef.current = true;
445
+ setData(initialDataArray);
446
+ return;
447
+ }
448
+ const isUserOperation = isInitializedRef.current && (initialDataArray.length === 0 && data.length > 0 || initialDataArray.length > 0 && data.length > 0 && initialIds !== ids);
449
+ if (isUserOperation) {
450
+ isInitializedRef.current = false;
451
+ }
452
+ if (!isInitializedRef.current) {
453
+ isInitializedRef.current = true;
454
+ }
455
+ if (cardinality > 1 || cardinality < 0) {
456
+ onChange(data);
457
+ } else if (data.length >= 1) {
458
+ onChange(data[0]);
459
+ } else {
460
+ onChange(null);
461
+ }
462
+ }, [cardinality, data, initialDataArray, onChange]);
463
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Root, {
464
+ className: (0, _clsx.default)(classes.root, ...normalizeClassName(className)),
465
+ disableGutters: true,
466
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Grid.default, {
467
+ container: true,
468
+ spacing: 2,
469
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_FileBrowserDialog.default, {
470
+ allowedExtensions: allowedExtensions,
471
+ cardinality: remaining,
472
+ open: open,
473
+ onClose: () => {
474
+ setOpen(false);
475
+ },
476
+ onSelect: addMedias,
477
+ permissions: permissions
478
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Grid.default, {
479
+ item: true,
480
+ xs: 12,
481
+ className: classes.header,
482
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
483
+ variant: "body1",
484
+ component: "span",
485
+ children: label
486
+ }), required && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
487
+ variant: "body1",
488
+ component: "span",
489
+ className: classes.required,
490
+ children: "*"
491
+ })]
492
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
493
+ item: true,
494
+ xs: 12,
495
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Grid.default, {
496
+ container: true,
497
+ spacing: 2,
498
+ ref: sortable.containerRef,
499
+ children: [loading && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
500
+ className: classes.loader,
501
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {
502
+ size: 24
503
+ })
504
+ }), data.map(media => {
505
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(MediaControlItem, {
506
+ onChange: onMediaChange,
507
+ media: media,
508
+ onRemove: removeMedia,
509
+ size: mediaGridItemSize,
510
+ type: type,
511
+ disableFilters: disableFilters,
512
+ Actions: itemActions
513
+ }, media.id);
514
+ })]
515
+ })
516
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Grid.default, {
517
+ item: true,
518
+ xs: 12,
519
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
520
+ onClick: () => setOpen(true),
521
+ disabled: remaining === 0 || loading,
522
+ color: "primary",
523
+ variant: "outlined",
524
+ size: "small",
525
+ children: "Select media"
526
+ }), cardinality >= 1 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography.default, {
527
+ className: classes.help,
528
+ variant: "caption",
529
+ component: "p",
530
+ children: [remaining <= 0 && 'The maximum number of media items have been selected.', remaining === 1 && 'One media item remaining.', remaining > 1 && `${remaining} media items remaining.`]
531
+ })]
532
+ })]
533
+ })
534
+ });
535
+ };
536
+ const MediaControl = /*#__PURE__*/(0, _react.memo)(MediaControlComponent);
537
+ var _default = exports.default = MediaControl;
@@ -0,0 +1,3 @@
1
+ import MediaLibraryControl from './MediaLibraryControl';
2
+ export type { MediaItem } from './MediaLibraryControl';
3
+ export default MediaLibraryControl;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _MediaLibraryControl = _interopRequireDefault(require("./MediaLibraryControl"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ var _default = exports.default = _MediaLibraryControl.default;
@@ -0,0 +1,30 @@
1
+ declare const padding: {
2
+ paddingTop: string;
3
+ paddingRight: string;
4
+ paddingBottom: string;
5
+ paddingLeft: string;
6
+ };
7
+ declare const margin: {
8
+ marginTop: string;
9
+ marginRight: string;
10
+ marginBottom: string;
11
+ marginLeft: string;
12
+ };
13
+ export type Margin = typeof margin;
14
+ export type Padding = typeof padding;
15
+ export type PaddingKey = keyof Padding;
16
+ export type MarginKey = keyof Margin;
17
+ export declare const paddingKeys: ("paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft")[];
18
+ export declare const marginKeys: ("marginTop" | "marginRight" | "marginBottom" | "marginLeft")[];
19
+ export declare const paddingMarginKeys: ("marginTop" | "marginRight" | "marginBottom" | "marginLeft" | "paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft")[];
20
+ export type MarginPaddingState = {
21
+ default: Margin & Padding;
22
+ desktop: Margin & Padding;
23
+ };
24
+ export declare const defaultPaddingMargin: MarginPaddingState;
25
+ type PaddingMarginControlProps = {
26
+ current: MarginPaddingState;
27
+ handleUpdate: (key: keyof MarginPaddingState, value: Margin & Padding) => void;
28
+ };
29
+ declare function PaddingMarginControl({ current, handleUpdate }: PaddingMarginControlProps): import("react/jsx-runtime").JSX.Element;
30
+ export default PaddingMarginControl;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.paddingMarginKeys = exports.paddingKeys = exports.marginKeys = exports.defaultPaddingMargin = exports.default = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _store = require("../../store");
10
+ var _DeviceSwitcher = _interopRequireDefault(require("../DeviceSwitcher"));
11
+ var _PaddingMarginForm = _interopRequireDefault(require("./PaddingMarginForm"));
12
+ var _jsxRuntime = require("react/jsx-runtime");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ const padding = {
15
+ paddingTop: '0px',
16
+ paddingRight: '0px',
17
+ paddingBottom: '0px',
18
+ paddingLeft: '0px'
19
+ };
20
+ const margin = {
21
+ marginTop: '0px',
22
+ marginRight: '0px',
23
+ marginBottom: '0px',
24
+ marginLeft: '0px'
25
+ };
26
+ const paddingKeys = exports.paddingKeys = Object.keys(padding);
27
+ const marginKeys = exports.marginKeys = Object.keys(margin);
28
+ const paddingMarginKeys = exports.paddingMarginKeys = [...paddingKeys, ...marginKeys];
29
+ const defaultPaddingMargin = exports.defaultPaddingMargin = {
30
+ default: {
31
+ ...padding,
32
+ ...margin
33
+ },
34
+ desktop: {
35
+ ...padding,
36
+ ...margin
37
+ }
38
+ };
39
+ function PaddingMarginControl({
40
+ current,
41
+ handleUpdate
42
+ }) {
43
+ const {
44
+ device,
45
+ setDevice
46
+ } = (0, _store.useEditorStore)(state => state);
47
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
48
+ className: "margin-container container ",
49
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DeviceSwitcher.default, {
50
+ value: device,
51
+ onChange: setDevice,
52
+ title: "Margin & Padding (px/rem/%)",
53
+ children: currentDevice => /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
54
+ style: {
55
+ display: 'flex',
56
+ flexDirection: 'column',
57
+ gap: 16
58
+ },
59
+ children: [currentDevice === 'desktop' && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
60
+ "data-key": "desktop",
61
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_PaddingMarginForm.default, {
62
+ label: "Desktop Margin",
63
+ current: current.desktop,
64
+ onChange: (key, value) => {
65
+ handleUpdate('desktop', {
66
+ ...current.desktop,
67
+ [key]: value
68
+ });
69
+ }
70
+ })
71
+ }), currentDevice === 'mobile' && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
72
+ "data-key": "mobile",
73
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_PaddingMarginForm.default, {
74
+ label: "Mobile Margin",
75
+ current: current.default,
76
+ onChange: (key, value) => {
77
+ handleUpdate('default', {
78
+ ...current.default,
79
+ [key]: value
80
+ });
81
+ }
82
+ })
83
+ })]
84
+ })
85
+ })
86
+ });
87
+ }
88
+ var _default = exports.default = PaddingMarginControl;
@@ -0,0 +1,8 @@
1
+ import { Margin, MarginKey, Padding, PaddingKey } from './PaddingMarginControl';
2
+ type MarginPaddingFormProps = {
3
+ label?: string;
4
+ current: Margin & Padding;
5
+ onChange: (key: MarginKey | PaddingKey, value: string) => void;
6
+ };
7
+ declare function PaddingMarginForm({ label, current, onChange }: MarginPaddingFormProps): import("react/jsx-runtime").JSX.Element;
8
+ export default PaddingMarginForm;