@flozy/editor 10.8.9 → 10.9.0

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 (152) hide show
  1. package/dist/Editor/ChatEditor.js +17 -16
  2. package/dist/Editor/CommonEditor.js +138 -27
  3. package/dist/Editor/DialogWrapper.js +31 -25
  4. package/dist/Editor/Editor.css +39 -11
  5. package/dist/Editor/Elements/AI/PopoverAIInput.js +11 -3
  6. package/dist/Editor/Elements/AI/Styles.js +1 -0
  7. package/dist/Editor/Elements/Accordion/Accordion.js +28 -22
  8. package/dist/Editor/Elements/Accordion/AccordionButton.js +12 -3
  9. package/dist/Editor/Elements/AppHeader/AppHeader.js +3 -3
  10. package/dist/Editor/Elements/Attachments/AttachmentStyles.js +16 -0
  11. package/dist/Editor/Elements/Attachments/Attachments.js +153 -11
  12. package/dist/Editor/Elements/Attachments/AttachmentsButton.js +8 -3
  13. package/dist/Editor/Elements/Button/EditorButton.js +23 -7
  14. package/dist/Editor/Elements/Color Picker/ColorButtons.js +61 -14
  15. package/dist/Editor/Elements/Color Picker/ColorPicker.css +25 -1
  16. package/dist/Editor/Elements/Color Picker/ColorPicker.js +10 -7
  17. package/dist/Editor/Elements/Color Picker/Styles.js +15 -13
  18. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/Select.js +134 -55
  19. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/SelectV1.js +7 -8
  20. package/dist/Editor/Elements/DataView/Layouts/DataTypes/PersonType.js +8 -3
  21. package/dist/Editor/Elements/DataView/Layouts/Options/EditProperty.js +1 -1
  22. package/dist/Editor/Elements/DataView/Layouts/TableStyles.js +1 -1
  23. package/dist/Editor/Elements/Embed/Embed.js +36 -43
  24. package/dist/Editor/Elements/Embed/Image.js +240 -23
  25. package/dist/Editor/Elements/Embed/Video.js +246 -15
  26. package/dist/Editor/Elements/Form/FormField.js +1 -1
  27. package/dist/Editor/Elements/Form/Workflow/Styles.js +24 -22
  28. package/dist/Editor/Elements/Form/Workflow/constant.js +25 -1
  29. package/dist/Editor/Elements/FreeGrid/FreeGrid.js +39 -33
  30. package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +7 -4
  31. package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +1 -0
  32. package/dist/Editor/Elements/FreeGrid/Options/More.js +7 -7
  33. package/dist/Editor/Elements/FreeGrid/helper.js +115 -0
  34. package/dist/Editor/Elements/FreeGrid/styles.js +9 -0
  35. package/dist/Editor/Elements/Grid/GridItem.js +1 -1
  36. package/dist/Editor/Elements/PageSettings/PageSettingsButton.js +2 -1
  37. package/dist/Editor/Elements/SimpleText/style.js +2 -2
  38. package/dist/Editor/Elements/Table/Table.js +3 -3
  39. package/dist/Editor/Elements/Title/title.js +6 -6
  40. package/dist/Editor/Elements/TopBanner/TopBanner.js +4 -2
  41. package/dist/Editor/Elements/TopBanner/TopBannerButton.js +5 -3
  42. package/dist/Editor/Elements/Variables/VariableButton.js +10 -1
  43. package/dist/Editor/MiniEditor.js +2 -1
  44. package/dist/Editor/Styles/EditorStyles.js +20 -5
  45. package/dist/Editor/Toolbar/FormatTools/Dropdown.js +27 -3
  46. package/dist/Editor/Toolbar/FormatTools/FontFamilyAutocomplete.js +4 -3
  47. package/dist/Editor/Toolbar/FormatTools/MarkButton.js +2 -2
  48. package/dist/Editor/Toolbar/FormatTools/TextSize.js +33 -29
  49. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +2 -1
  50. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/MiniColorPicker.js +4 -2
  51. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectFontSize.js +23 -23
  52. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectList.js +25 -7
  53. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectTypography.js +167 -42
  54. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +24 -8
  55. package/dist/Editor/Toolbar/PopupTool/PopperHeader.js +2 -1
  56. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +70 -10
  57. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +73 -14
  58. package/dist/Editor/Toolbar/PopupTool/ThemeTextFormat.js +439 -0
  59. package/dist/Editor/Toolbar/PopupTool/index.js +5 -2
  60. package/dist/Editor/Toolbar/toolbarGroups.js +56 -10
  61. package/dist/Editor/assets/svg/BackIcon.js +18 -0
  62. package/dist/Editor/assets/svg/ThemeIcons.js +293 -0
  63. package/dist/Editor/common/ColorPickerButton.js +38 -16
  64. package/dist/Editor/common/CustomColorPicker/index.js +130 -0
  65. package/dist/Editor/common/CustomColorPicker/style.js +53 -0
  66. package/dist/Editor/common/CustomDialog2/index.js +94 -0
  67. package/dist/Editor/common/CustomDialog2/style.js +67 -0
  68. package/dist/Editor/common/CustomSelect.js +43 -0
  69. package/dist/Editor/common/DnD/DragHandleButton.js +1 -1
  70. package/dist/Editor/common/FontLoader/FontLoader.js +4 -0
  71. package/dist/Editor/common/Icon.js +28 -0
  72. package/dist/Editor/common/ImageSelector/ImageSelector.js +45 -7
  73. package/dist/Editor/common/ImageSelector/Options/Upload.js +26 -11
  74. package/dist/Editor/common/ImageSelector/Styles.js +3 -9
  75. package/dist/Editor/common/LinkSettings/NavComponents.js +6 -2
  76. package/dist/Editor/common/MentionsPopup/index.js +9 -1
  77. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +2 -1
  78. package/dist/Editor/common/RnD/ElementSettings/Settings/AppHeaderSettings.js +3 -2
  79. package/dist/Editor/common/RnD/ElementSettings/Settings/BoxSettings.js +3 -2
  80. package/dist/Editor/common/RnD/ElementSettings/Settings/ButtonSettings.js +3 -2
  81. package/dist/Editor/common/RnD/ElementSettings/Settings/CodeSettings.js +3 -2
  82. package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +4 -2
  83. package/dist/Editor/common/RnD/ElementSettings/Settings/ImageSettings.js +20 -7
  84. package/dist/Editor/common/RnD/ElementSettings/Settings/TableSettings.js +3 -2
  85. package/dist/Editor/common/RnD/ElementSettings/Settings/TextSettings.js +9 -1
  86. package/dist/Editor/common/RnD/ElementSettings/Settings/VideoSettings.js +20 -7
  87. package/dist/Editor/common/RnD/GuideLines/styles.js +1 -1
  88. package/dist/Editor/common/RnD/SwitchViewport/SwitchViewport.js +11 -2
  89. package/dist/Editor/common/RnD/Theme/MainThemeProvider.js +17 -0
  90. package/dist/Editor/common/RnD/Theme/ViewportStimulator.js +6 -3
  91. package/dist/Editor/common/RnD/Utils/gridDropItem.js +28 -18
  92. package/dist/Editor/common/RnD/Utils/index.js +3 -1
  93. package/dist/Editor/common/RnD/VirtualElement/VirtualTextElement.js +45 -58
  94. package/dist/Editor/common/RnD/VirtualElement/helper.js +320 -130
  95. package/dist/Editor/common/RnD/VirtualElement/styles.js +22 -0
  96. package/dist/Editor/common/RnD/index.js +48 -13
  97. package/dist/Editor/common/Shorthands/elements.js +62 -4
  98. package/dist/Editor/common/StyleBuilder/buttonStyle.js +4 -2
  99. package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +4 -0
  100. package/dist/Editor/common/StyleBuilder/fieldStyle.js +1 -0
  101. package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +15 -2
  102. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +12 -2
  103. package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +15 -7
  104. package/dist/Editor/common/StyleBuilder/fieldTypes/card.js +16 -8
  105. package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +36 -10
  106. package/dist/Editor/common/StyleBuilder/fieldTypes/embedUpload.js +115 -0
  107. package/dist/Editor/common/StyleBuilder/fieldTypes/fontSize.js +16 -7
  108. package/dist/Editor/common/StyleBuilder/fieldTypes/index.js +3 -1
  109. package/dist/Editor/common/StyleBuilder/fieldTypes/menusArray.js +2 -0
  110. package/dist/Editor/common/StyleBuilder/fieldTypes/textOptions.js +15 -7
  111. package/dist/Editor/common/StyleBuilder/index.js +8 -4
  112. package/dist/Editor/common/Uploader.js +125 -17
  113. package/dist/Editor/common/UploaderWithProgress.js +183 -0
  114. package/dist/Editor/common/iconslist.js +21 -0
  115. package/dist/Editor/commonStyle.js +107 -64
  116. package/dist/Editor/helper/index.js +10 -2
  117. package/dist/Editor/helper/textIndeces.js +58 -0
  118. package/dist/Editor/helper/theme.js +203 -2
  119. package/dist/Editor/hooks/useEditorTheme.js +153 -0
  120. package/dist/Editor/hooks/useMouseMove.js +9 -3
  121. package/dist/Editor/hooks/useThemeValues.js +63 -0
  122. package/dist/Editor/plugins/withEmbeds.js +12 -1
  123. package/dist/Editor/plugins/withHTML.js +58 -3
  124. package/dist/Editor/plugins/withTable.js +1 -1
  125. package/dist/Editor/service/fileupload.js +53 -0
  126. package/dist/Editor/theme/ThemeList.js +50 -173
  127. package/dist/Editor/theme/index.js +149 -0
  128. package/dist/Editor/themeSettings/ActiveTheme.js +82 -0
  129. package/dist/Editor/themeSettings/buttons/index.js +300 -0
  130. package/dist/Editor/themeSettings/buttons/style.js +23 -0
  131. package/dist/Editor/themeSettings/colorTheme/index.js +310 -0
  132. package/dist/Editor/themeSettings/colorTheme/style.js +81 -0
  133. package/dist/Editor/themeSettings/fonts/PreviewElement.js +121 -0
  134. package/dist/Editor/themeSettings/fonts/index.js +240 -0
  135. package/dist/Editor/themeSettings/fonts/style.js +62 -0
  136. package/dist/Editor/themeSettings/icons.js +60 -0
  137. package/dist/Editor/themeSettings/index.js +380 -0
  138. package/dist/Editor/themeSettings/style.js +299 -0
  139. package/dist/Editor/themeSettingsAI/icons.js +96 -0
  140. package/dist/Editor/themeSettingsAI/index.js +355 -0
  141. package/dist/Editor/themeSettingsAI/saveTheme.js +202 -0
  142. package/dist/Editor/themeSettingsAI/style.js +332 -0
  143. package/dist/Editor/utils/SlateUtilityFunctions.js +183 -21
  144. package/dist/Editor/utils/accordion.js +68 -40
  145. package/dist/Editor/utils/button.js +1 -17
  146. package/dist/Editor/utils/draftToSlate.js +3 -2
  147. package/dist/Editor/utils/events.js +94 -89
  148. package/dist/Editor/utils/font.js +40 -37
  149. package/dist/Editor/utils/helper.js +97 -21
  150. package/dist/Editor/utils/insertAppHeader.js +8 -4
  151. package/package.json +4 -4
  152. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/MultiSelect.js +0 -454
@@ -1,10 +1,17 @@
1
- import React, { useEffect, useState } from "react";
1
+ import React, { useEffect, useRef, useState } from "react";
2
2
  import { useSlateStatic, ReactEditor } from "slate-react";
3
3
  import { Node, Transforms, Editor } from "slate";
4
4
  import AspectRatioIcon from "@mui/icons-material/AspectRatio";
5
+ import IconButton from "@mui/material/IconButton";
6
+ import Tooltip from "@mui/material/Tooltip";
7
+ import Box from "@mui/material/Box";
8
+ import useTheme from "@mui/material/styles/useTheme";
9
+ import useMediaQuery from "@mui/material/useMediaQuery";
10
+ import Grid from "@mui/material/Grid";
11
+ import CircularProgress from "@mui/material/CircularProgress";
12
+ import HighlightOffRoundedIcon from "@mui/icons-material/HighlightOffRounded";
5
13
  import useResize from "../../utils/customHooks/useResize";
6
14
  import EmbedPopup from "./EmbedPopup";
7
- import { IconButton, Tooltip, Box, useTheme, useMediaQuery } from "@mui/material";
8
15
  import { LinkIcon } from "../../common/iconslist";
9
16
  import { useEditorContext } from "../../hooks/useMouseMove";
10
17
  import { getTRBLBreakPoints, getBreakPointsValue, groupByBreakpoint } from "../../helper/theme";
@@ -16,8 +23,10 @@ import { handleLinkType } from "../../utils/helper";
16
23
  import { wrapThemeBreakpoints } from "../FreeGrid/breakpointConstants";
17
24
  import useCommonStyle from "../../commonStyle";
18
25
  import SettingsIcon from "../../assets/svg/SettingsIcon";
26
+ import ImageSelector from "../../common/ImageSelector/ImageSelector";
19
27
  import { jsx as _jsx } from "react/jsx-runtime";
20
28
  import { jsxs as _jsxs } from "react/jsx-runtime";
29
+ import { Fragment as _Fragment } from "react/jsx-runtime";
21
30
  const ToolBar = ({
22
31
  isEmpty,
23
32
  onSettings,
@@ -67,27 +76,105 @@ const ImageContent = props => {
67
76
  objectFit,
68
77
  webAddress,
69
78
  readOnly,
70
- setOpenSettings,
71
79
  handleImageClick,
72
80
  onTouchEnd,
73
81
  path,
74
82
  theme,
75
83
  classes,
76
- translation
84
+ translation,
85
+ setUploadPopupOpen,
86
+ uploadStatus,
87
+ setUploadStatus,
88
+ uniqueId,
89
+ uploadTerminator,
90
+ editor
77
91
  } = props;
78
- return !url ? !readOnly ? /*#__PURE__*/_jsxs(Box, {
92
+ const cancelUpload = e => {
93
+ e.stopPropagation();
94
+ uploadTerminator(uniqueId, setUploadStatus);
95
+ Transforms.setNodes(editor, {
96
+ isUpload: false,
97
+ isUploading: false,
98
+ file: null
99
+ }, {
100
+ at: path
101
+ });
102
+ };
103
+ return !url ? !readOnly ? /*#__PURE__*/_jsx(Box, {
79
104
  component: "button",
80
105
  className: "element-empty-btn",
81
106
  contentEditable: false,
82
107
  onClick: () => {
83
- setOpenSettings(true);
108
+ if (!uploadStatus?.isUploading) setUploadPopupOpen(true);
84
109
  },
85
110
  sx: {
86
111
  ...classes.emptyThumbBtn
87
112
  },
88
- children: [/*#__PURE__*/_jsx(Icon, {
89
- icon: "image"
90
- }), translation("Add Image")]
113
+ children: uploadStatus?.isUploading ? /*#__PURE__*/_jsxs(Grid, {
114
+ container: true,
115
+ direction: "row",
116
+ sx: {
117
+ justifyContent: "space-between",
118
+ alignItems: "center"
119
+ },
120
+ children: [/*#__PURE__*/_jsx(Grid, {
121
+ children: /*#__PURE__*/_jsxs(Grid, {
122
+ container: true,
123
+ direction: "row",
124
+ sx: {
125
+ justifyContent: "space-between",
126
+ alignItems: "center",
127
+ gap: 1
128
+ },
129
+ children: [/*#__PURE__*/_jsx(Grid, {
130
+ children: /*#__PURE__*/_jsx(Icon, {
131
+ icon: "image"
132
+ })
133
+ }), /*#__PURE__*/_jsx(Grid, {
134
+ children: /*#__PURE__*/_jsxs(Box, {
135
+ display: "flex",
136
+ flexDirection: "column",
137
+ alignItems: "flex-start",
138
+ justifyContent: "space-between",
139
+ children: [/*#__PURE__*/_jsx(Box, {
140
+ className: "truncateText",
141
+ children: uploadStatus?.fileName
142
+ }), /*#__PURE__*/_jsxs(Box, {
143
+ display: "flex",
144
+ alignItems: "center",
145
+ gap: 1,
146
+ marginTop: 1,
147
+ children: [/*#__PURE__*/_jsx(Box, {
148
+ children: uploadStatus?.fileSize
149
+ }), /*#__PURE__*/_jsx(CircularProgress, {
150
+ variant: "determinate",
151
+ value: uploadStatus?.uploadPercentage ?? 0,
152
+ className: "circularProgress-cls",
153
+ size: 15,
154
+ thickness: 8
155
+ }), /*#__PURE__*/_jsx(Box, {
156
+ children: `${uploadStatus?.uploadPercentage?.toFixed(0) ?? 0}%`
157
+ })]
158
+ })]
159
+ })
160
+ })]
161
+ })
162
+ }), /*#__PURE__*/_jsx(Grid, {
163
+ children: /*#__PURE__*/_jsx(HighlightOffRoundedIcon, {
164
+ className: "uploadCancel",
165
+ sx: {
166
+ cursor: "pointer"
167
+ },
168
+ onClick: e => {
169
+ cancelUpload(e);
170
+ }
171
+ })
172
+ })]
173
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
174
+ children: [/*#__PURE__*/_jsx(Icon, {
175
+ icon: "image"
176
+ }), translation("Add Image")]
177
+ })
91
178
  }) : /*#__PURE__*/_jsxs(Box, {
92
179
  sx: {
93
180
  color: "#64748B !important",
@@ -143,11 +230,20 @@ const Image = props => {
143
230
  webAddress,
144
231
  isNewTab,
145
232
  linkType,
146
- framePos
233
+ framePos,
234
+ file,
235
+ isUploading,
236
+ uniqueId,
237
+ fromFreeGrid
147
238
  } = element;
148
239
  const {
149
240
  readOnly,
150
- translation
241
+ translation,
242
+ services,
243
+ uploadFile,
244
+ resumeUploadState,
245
+ uploadTerminator,
246
+ isUploadInProgress = () => false
151
247
  } = customProps;
152
248
  const {
153
249
  vertical,
@@ -162,6 +258,12 @@ const Image = props => {
162
258
  const path = ReactEditor.findPath(editor, element);
163
259
  const [openNav, setOpenNav] = useState(false);
164
260
  const isEmpty = !url && !readOnly;
261
+ const [openUploadPopup, setUploadPopupOpen] = useState(false);
262
+ const [uploadStatus, setUploadStatus] = useState({
263
+ isUploading: false,
264
+ uploadPercentage: 0
265
+ });
266
+ const xhrRef = useRef(null);
165
267
  const getSize = () => {
166
268
  if (element?.size === undefined) {
167
269
  return {
@@ -217,32 +319,125 @@ const Image = props => {
217
319
  console.log(err);
218
320
  }
219
321
  };
322
+ const noUploadTracks = () => {
323
+ setUploadStatus({
324
+ isUploading: false,
325
+ uploadPercentage: 0,
326
+ fileName: null,
327
+ fileSize: null
328
+ });
329
+ Transforms.setNodes(editor, {
330
+ isUploading: false
331
+ }, {
332
+ at: path
333
+ });
334
+ };
335
+ useEffect(() => {
336
+ const isUploading = isUploadInProgress(uniqueId);
337
+ if (fromFreeGrid) {
338
+ if (isUploading) {
339
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "image");
340
+ } else {
341
+ if (!isUploading) {
342
+ handleImageUpload({
343
+ file: file
344
+ });
345
+ }
346
+ }
347
+ }
348
+ }, [uniqueId, isUploading, file]);
220
349
  useEffect(() => {
221
350
  if (editor && ele && ele[1] !== undefined) {
222
351
  const dom = ReactEditor.toDOMNode(editor, element);
223
352
  setParentDOM(dom);
224
353
  onLoad(getSize());
225
354
  }
355
+ if (uniqueId && isUploading) {
356
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "image");
357
+ } else if (file && isUploading) {
358
+ handleImageUpload({
359
+ file: file
360
+ });
361
+ }
226
362
  }, []);
227
363
  const onSettings = () => {
228
364
  setOpenSettings(true);
229
365
  };
230
366
  const onSave = data => {
231
367
  try {
232
- const updateData = {
233
- ...data
234
- };
235
- delete updateData.children;
236
- Transforms.setNodes(editor, {
237
- ...updateData
238
- }, {
239
- at: path
240
- });
241
- onClose();
368
+ if (!data?.url?.file) {
369
+ const updateData = typeof data?.url?.embedURL === "string" || typeof data === "string" ? {
370
+ url: typeof data?.url?.embedURL === "string" ? data?.url?.embedURL : typeof data === "string" ? data : null
371
+ } : {
372
+ ...data,
373
+ url: data?.url && data?.url !== "none" ? data?.url : ""
374
+ };
375
+ delete updateData.children;
376
+ Transforms.select(editor, path);
377
+ ReactEditor.focus(editor);
378
+ Transforms.setNodes(editor, {
379
+ ...updateData,
380
+ isUpload: false,
381
+ isUploading: false,
382
+ file: null
383
+ }, {
384
+ at: path
385
+ });
386
+ onClose();
387
+ } else {
388
+ handleImageUpload({
389
+ file: data?.url?.file,
390
+ isUpload: true,
391
+ setUploadStatus,
392
+ services: services
393
+ });
394
+ onClose();
395
+ onSave("");
396
+ }
242
397
  } catch (err) {
243
398
  console.log(err);
244
399
  }
245
400
  };
401
+ const handleImageUpload = async uploadProp => {
402
+ try {
403
+ if (uploadProp?.isUpload === false) {
404
+ onSave(uploadProp?.embedURL);
405
+ } else {
406
+ const isAlreadyUploading = isUploadInProgress(uniqueId);
407
+ let result = {};
408
+ if (uploadProp?.file && !isAlreadyUploading) {
409
+ result = await services("uploadFile", uploadProp?.file);
410
+ }
411
+ const uploadUrl = result?.data?.[0];
412
+ if (uploadUrl) {
413
+ const id = !uniqueId ? crypto?.randomUUID() : uniqueId;
414
+ const fileEntry = {
415
+ ...uploadProp,
416
+ xhrRef,
417
+ presidnedURL: uploadUrl,
418
+ status: "uploading"
419
+ };
420
+ uploadFile(id, fileEntry, setUploadStatus, onSave, "image");
421
+ if (!fromFreeGrid) {
422
+ Transforms.setNodes(editor, {
423
+ uniqueId: id,
424
+ isUploading: true
425
+ }, {
426
+ at: path
427
+ });
428
+ } else {
429
+ Transforms.setNodes(editor, {
430
+ isUploading: true
431
+ }, {
432
+ at: path
433
+ });
434
+ }
435
+ }
436
+ }
437
+ } catch (error) {
438
+ console.log(error);
439
+ }
440
+ };
246
441
  const onClose = () => {
247
442
  setOpenSettings(false);
248
443
  };
@@ -324,7 +519,16 @@ const Image = props => {
324
519
  path: path,
325
520
  theme: theme,
326
521
  classes: classes,
327
- translation: translation
522
+ translation: translation,
523
+ setUploadPopupOpen: setUploadPopupOpen,
524
+ openUploadPopup: openUploadPopup,
525
+ uploadStatus: uploadStatus,
526
+ setUploadStatus: setUploadStatus,
527
+ xhrRef: xhrRef,
528
+ onClose: onClose,
529
+ uniqueId: uniqueId,
530
+ uploadTerminator: uploadTerminator,
531
+ editor: editor
328
532
  }), url && frames[frame] ? /*#__PURE__*/_jsx(Box, {
329
533
  component: "div",
330
534
  className: "image-frame",
@@ -372,7 +576,20 @@ const Image = props => {
372
576
  navValue: webAddress,
373
577
  openInNewTab: isNewTab,
374
578
  customProps: customProps
375
- }) : null]
579
+ }) : null, openUploadPopup && /*#__PURE__*/_jsx(ImageSelector, {
580
+ open: true,
581
+ title: "Image",
582
+ onClose: () => setUploadPopupOpen(false),
583
+ customProps: customProps,
584
+ onSelectImage: img => {
585
+ handleImageUpload(img);
586
+ setUploadPopupOpen(false);
587
+ },
588
+ openUploadPopup: openUploadPopup,
589
+ setUploadPopupOpen: setUploadPopupOpen,
590
+ setUploadStatus: setUploadStatus,
591
+ xhrRef: xhrRef
592
+ })]
376
593
  });
377
594
  };
378
595
  export default Image;
@@ -1,9 +1,15 @@
1
1
  import React, { useState, useEffect, useRef } from "react";
2
2
  import { useSlateStatic, ReactEditor } from "slate-react";
3
3
  import { Node, Transforms } from "slate";
4
- import { IconButton, Tooltip, Box, useTheme } from "@mui/material";
4
+ import IconButton from '@mui/material/IconButton';
5
+ import Tooltip from '@mui/material/Tooltip';
6
+ import Box from '@mui/material/Box';
7
+ import useTheme from '@mui/material/styles/useTheme';
8
+ import Grid from '@mui/material/Grid';
9
+ import CircularProgress from '@mui/material/CircularProgress';
5
10
  import DeleteIcon from "@mui/icons-material/Delete";
6
11
  import AspectRatioIcon from "@mui/icons-material/AspectRatio";
12
+ import HighlightOffRoundedIcon from "@mui/icons-material/HighlightOffRounded";
7
13
  import Icon from "../../common/Icon";
8
14
  import useResize from "../../utils/customHooks/useResize";
9
15
  import EmbedPopup from "./EmbedPopup";
@@ -13,8 +19,10 @@ import { getEmbedURL } from "../../helper";
13
19
  import { getBreakPointsValue, getTRBLBreakPoints, groupByBreakpoint } from "../../helper/theme";
14
20
  import { useEditorContext } from "../../hooks/useMouseMove";
15
21
  import useCommonStyle from "../../commonStyle";
22
+ import ImageSelector from "../../common/ImageSelector/ImageSelector";
16
23
  import { jsx as _jsx } from "react/jsx-runtime";
17
24
  import { jsxs as _jsxs } from "react/jsx-runtime";
25
+ import { Fragment as _Fragment } from "react/jsx-runtime";
18
26
  const TYPE_LABELS = {
19
27
  calendly: "Embed Calendly or Other",
20
28
  video: "Embed Video or Other",
@@ -78,18 +86,97 @@ const VideoPlaceholder = props => {
78
86
  onSettings,
79
87
  classes,
80
88
  type,
81
- translation
89
+ translation,
90
+ uploadStatus,
91
+ setUploadStatus,
92
+ uploadTerminator,
93
+ uniqueId,
94
+ editor,
95
+ path
82
96
  } = props;
83
- return !url ? !readOnly ? /*#__PURE__*/_jsxs(Box, {
97
+ const cancelUpload = e => {
98
+ e.stopPropagation();
99
+ uploadTerminator(uniqueId, setUploadStatus);
100
+ Transforms.setNodes(editor, {
101
+ isUpload: false,
102
+ isUploading: false,
103
+ file: null
104
+ }, {
105
+ at: path
106
+ });
107
+ };
108
+ return !url ? !readOnly ? /*#__PURE__*/_jsx(Box, {
84
109
  component: "button",
85
110
  className: "element-empty-btn",
86
- onClick: onSettings,
111
+ onClick: !uploadStatus?.isUploading ? onSettings : () => {},
87
112
  sx: {
88
113
  ...classes.emptyThumbBtn
89
114
  },
90
- children: [/*#__PURE__*/_jsx(Icon, {
91
- icon: "video"
92
- }), TYPE_LABELS[type] || translation("Embed Video or Other")]
115
+ children: uploadStatus?.isUploading ? /*#__PURE__*/_jsxs(Grid, {
116
+ container: true,
117
+ direction: "row",
118
+ sx: {
119
+ justifyContent: "space-between",
120
+ alignItems: "center"
121
+ },
122
+ children: [/*#__PURE__*/_jsx(Grid, {
123
+ children: /*#__PURE__*/_jsxs(Grid, {
124
+ container: true,
125
+ direction: "row",
126
+ sx: {
127
+ justifyContent: "space-between",
128
+ alignItems: "center",
129
+ gap: 1
130
+ },
131
+ children: [/*#__PURE__*/_jsx(Grid, {
132
+ children: /*#__PURE__*/_jsx(Icon, {
133
+ icon: "image"
134
+ })
135
+ }), /*#__PURE__*/_jsx(Grid, {
136
+ children: /*#__PURE__*/_jsxs(Box, {
137
+ display: "flex",
138
+ flexDirection: "column",
139
+ alignItems: "flex-start",
140
+ justifyContent: "space-between",
141
+ children: [/*#__PURE__*/_jsx(Box, {
142
+ className: "truncateText",
143
+ children: uploadStatus?.fileName
144
+ }), /*#__PURE__*/_jsxs(Box, {
145
+ display: "flex",
146
+ alignItems: "center",
147
+ gap: 1,
148
+ marginTop: 1,
149
+ children: [/*#__PURE__*/_jsx(Box, {
150
+ children: uploadStatus?.fileSize
151
+ }), /*#__PURE__*/_jsx(CircularProgress, {
152
+ variant: "determinate",
153
+ value: uploadStatus?.uploadPercentage ?? 0,
154
+ className: "circularProgress-cls",
155
+ size: 15,
156
+ thickness: 8
157
+ }), /*#__PURE__*/_jsx(Box, {
158
+ children: `${uploadStatus?.uploadPercentage?.toFixed(0) ?? 0}%`
159
+ })]
160
+ })]
161
+ })
162
+ })]
163
+ })
164
+ }), /*#__PURE__*/_jsx(Grid, {
165
+ children: /*#__PURE__*/_jsx(HighlightOffRoundedIcon, {
166
+ className: "uploadCancel",
167
+ sx: {
168
+ cursor: "pointer"
169
+ },
170
+ onClick: e => {
171
+ cancelUpload(e);
172
+ }
173
+ })
174
+ })]
175
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
176
+ children: [/*#__PURE__*/_jsx(Icon, {
177
+ icon: "video"
178
+ }), TYPE_LABELS[type] || translation("Embed Video or Other")]
179
+ })
93
180
  }) : /*#__PURE__*/_jsxs(Box, {
94
181
  sx: {
95
182
  color: "#64748B !important",
@@ -120,14 +207,23 @@ const Video = ({
120
207
  xsHidden,
121
208
  width: oldWidth,
122
209
  bannerSpacing,
123
- aspectRatio
210
+ aspectRatio,
211
+ file,
212
+ isUploading,
213
+ uniqueId,
214
+ fromFreeGrid
124
215
  } = element;
125
216
  const editor = useSlateStatic();
126
217
  const [openSetttings, setOpenSettings] = useState(false);
127
218
  const [parentDOM, setParentDOM] = useState(null);
128
219
  const {
129
220
  readOnly,
130
- translation
221
+ translation,
222
+ services,
223
+ uploadFile,
224
+ resumeUploadState,
225
+ uploadTerminator,
226
+ isUploadInProgress = () => false
131
227
  } = customProps;
132
228
  const {
133
229
  vertical,
@@ -148,6 +244,63 @@ const Video = ({
148
244
  return element?.size || {};
149
245
  }
150
246
  };
247
+ const xhrRef = useRef(null);
248
+ const [openUploadPopup, setUploadPopupOpen] = useState(false);
249
+ const [uploadStatus, setUploadStatus] = useState({
250
+ isUploading: false,
251
+ uploadPercentage: 0
252
+ });
253
+ const onClickUpload = () => {
254
+ setUploadPopupOpen(true);
255
+ };
256
+ const onSelectVideo = async video => {
257
+ handleClose();
258
+ let finalURL = null;
259
+ try {
260
+ if (video?.isUpload === false) {
261
+ finalURL = video?.embedURL;
262
+ } else {
263
+ const id = !uniqueId ? crypto?.randomUUID() : uniqueId;
264
+ const result = await services("uploadFile", video?.file);
265
+ const uploadUrl = result?.data?.[0];
266
+ const fileEntry = {
267
+ ...video,
268
+ xhrRef,
269
+ presidnedURL: uploadUrl,
270
+ status: "uploading"
271
+ };
272
+ uploadFile(id, fileEntry, setUploadStatus, onSave, "video");
273
+ if (!fromFreeGrid) {
274
+ Transforms.setNodes(editor, {
275
+ uniqueId: id,
276
+ isUploading: true
277
+ }, {
278
+ at: path
279
+ });
280
+ } else {
281
+ Transforms.setNodes(editor, {
282
+ isUploading: true
283
+ }, {
284
+ at: path
285
+ });
286
+ }
287
+ }
288
+ if (finalURL) {
289
+ const updateObject = {
290
+ ...element,
291
+ url: finalURL
292
+ };
293
+ onSave(updateObject);
294
+ } else {
295
+ return;
296
+ }
297
+ } catch (error) {
298
+ console.log(error);
299
+ }
300
+ };
301
+ const handleClose = () => {
302
+ setUploadPopupOpen(false);
303
+ };
151
304
  const [size, onMouseDown, resizing, onLoad] = useResize({
152
305
  parentDOM,
153
306
  size: getSize(),
@@ -161,12 +314,49 @@ const Video = ({
161
314
  });
162
315
  const arr = Array.from(Node.elements(editor));
163
316
  const ele = arr.find(([elem]) => element === elem);
317
+ const noUploadTracks = () => {
318
+ setUploadStatus({
319
+ isUploading: false,
320
+ uploadPercentage: 0,
321
+ fileName: null,
322
+ fileSize: null
323
+ });
324
+ };
325
+ useEffect(() => {
326
+ const isUploading = isUploadInProgress(uniqueId);
327
+ if (fromFreeGrid) {
328
+ if (isUploading) {
329
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "image");
330
+ } else {
331
+ if (!isUploading && file) {
332
+ onSelectVideo({
333
+ file: file
334
+ });
335
+ }
336
+ }
337
+ }
338
+ return () => {
339
+ // Transforms.setNodes(editor, { isUploading: false }, { at: path });
340
+ };
341
+ }, [uniqueId, isUploading, file]);
164
342
  useEffect(() => {
165
343
  if (editor && ele && ele[1] !== undefined) {
166
344
  const dom = ReactEditor.toDOMNode(editor, Node.get(editor, ele[1]));
167
345
  setParentDOM(dom);
168
346
  onLoad(element?.size || {});
169
347
  }
348
+ if (!fromFreeGrid) {
349
+ if (uniqueId && isUploading) {
350
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "video");
351
+ } else if (file && isUploading) {
352
+ onSelectVideo({
353
+ file: file
354
+ });
355
+ }
356
+ }
357
+ return () => {
358
+ // xhrRef?.current?.abort();
359
+ };
170
360
  }, []);
171
361
  const ToolBar = () => {
172
362
  return /*#__PURE__*/_jsxs("div", {
@@ -194,12 +384,35 @@ const Video = ({
194
384
  };
195
385
  const onSave = data => {
196
386
  try {
197
- const updateData = {
198
- ...data
199
- };
387
+ let updateData = {};
388
+ if (typeof data === "string") {
389
+ updateData = {
390
+ url: data,
391
+ uniqueId: undefined,
392
+ isUploading: false
393
+ };
394
+ } else if (typeof data?.url !== "string") {
395
+ updateData = {
396
+ ...data,
397
+ url: ""
398
+ };
399
+ onSelectVideo({
400
+ file: data?.url?.file,
401
+ isUpload: true,
402
+ setUploadStatus,
403
+ services: customProps?.services
404
+ });
405
+ } else {
406
+ updateData = data;
407
+ }
200
408
  delete updateData.children;
409
+ Transforms.select(editor, path);
410
+ ReactEditor.focus(editor);
201
411
  Transforms.setNodes(editor, {
202
- ...updateData
412
+ ...updateData,
413
+ isUpload: false,
414
+ isUploading: false,
415
+ file: null
203
416
  }, {
204
417
  at: path
205
418
  });
@@ -281,13 +494,19 @@ const Video = ({
281
494
  children: [!readOnly && url && /*#__PURE__*/_jsx(ToolBar, {}), /*#__PURE__*/_jsx(VideoPlaceholder, {
282
495
  ...element,
283
496
  embedURL: embedURL,
284
- onSettings: onSettings,
497
+ onSettings: onClickUpload,
285
498
  videoSX: videoSX,
286
499
  url: url,
287
500
  readOnly: readOnly,
288
501
  resizing: resizing,
289
502
  classes: classes,
290
- translation: translation
503
+ translation: translation,
504
+ uploadStatus: uploadStatus,
505
+ setUploadStatus: setUploadStatus,
506
+ uploadTerminator: uploadTerminator,
507
+ uniqueId: uniqueId,
508
+ editor: editor,
509
+ path: path
291
510
  }), !readOnly && url ? /*#__PURE__*/_jsx(IconButton, {
292
511
  onPointerDown: onMouseDown,
293
512
  style: {
@@ -295,6 +514,18 @@ const Video = ({
295
514
  },
296
515
  className: "resize-br visible-on-hover",
297
516
  children: /*#__PURE__*/_jsx(AspectRatioIcon, {})
517
+ }) : null, openUploadPopup ? /*#__PURE__*/_jsx(ImageSelector, {
518
+ open: true,
519
+ Add: true,
520
+ commentMore: true,
521
+ actions: true,
522
+ title: "Video",
523
+ onClose: handleClose,
524
+ customProps: customProps,
525
+ onSelectImage: onSelectVideo,
526
+ setUploadPopupOpen: setUploadPopupOpen,
527
+ setUploadStatus: setUploadStatus,
528
+ xhrRef: xhrRef
298
529
  }) : null]
299
530
  }), children]
300
531
  });