@flozy/editor 10.8.9 → 10.9.1

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 +236 -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 +70 -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,11 @@ 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";
27
+ import { buildUpdateData } from "../../service/fileupload";
19
28
  import { jsx as _jsx } from "react/jsx-runtime";
20
29
  import { jsxs as _jsxs } from "react/jsx-runtime";
30
+ import { Fragment as _Fragment } from "react/jsx-runtime";
21
31
  const ToolBar = ({
22
32
  isEmpty,
23
33
  onSettings,
@@ -67,27 +77,105 @@ const ImageContent = props => {
67
77
  objectFit,
68
78
  webAddress,
69
79
  readOnly,
70
- setOpenSettings,
71
80
  handleImageClick,
72
81
  onTouchEnd,
73
82
  path,
74
83
  theme,
75
84
  classes,
76
- translation
85
+ translation,
86
+ setUploadPopupOpen,
87
+ uploadStatus,
88
+ setUploadStatus,
89
+ uniqueId,
90
+ uploadTerminator,
91
+ editor
77
92
  } = props;
78
- return !url ? !readOnly ? /*#__PURE__*/_jsxs(Box, {
93
+ const cancelUpload = e => {
94
+ e.stopPropagation();
95
+ uploadTerminator(uniqueId, setUploadStatus);
96
+ Transforms.setNodes(editor, {
97
+ isUpload: false,
98
+ isUploading: false,
99
+ file: null
100
+ }, {
101
+ at: path
102
+ });
103
+ };
104
+ return !url ? !readOnly ? /*#__PURE__*/_jsx(Box, {
79
105
  component: "button",
80
106
  className: "element-empty-btn",
81
107
  contentEditable: false,
82
108
  onClick: () => {
83
- setOpenSettings(true);
109
+ if (!uploadStatus?.isUploading) setUploadPopupOpen(true);
84
110
  },
85
111
  sx: {
86
112
  ...classes.emptyThumbBtn
87
113
  },
88
- children: [/*#__PURE__*/_jsx(Icon, {
89
- icon: "image"
90
- }), translation("Add Image")]
114
+ children: uploadStatus?.isUploading ? /*#__PURE__*/_jsxs(Grid, {
115
+ container: true,
116
+ direction: "row",
117
+ sx: {
118
+ justifyContent: "space-between",
119
+ alignItems: "center"
120
+ },
121
+ children: [/*#__PURE__*/_jsx(Grid, {
122
+ children: /*#__PURE__*/_jsxs(Grid, {
123
+ container: true,
124
+ direction: "row",
125
+ sx: {
126
+ justifyContent: "space-between",
127
+ alignItems: "center",
128
+ gap: 1
129
+ },
130
+ children: [/*#__PURE__*/_jsx(Grid, {
131
+ children: /*#__PURE__*/_jsx(Icon, {
132
+ icon: "image"
133
+ })
134
+ }), /*#__PURE__*/_jsx(Grid, {
135
+ children: /*#__PURE__*/_jsxs(Box, {
136
+ display: "flex",
137
+ flexDirection: "column",
138
+ alignItems: "flex-start",
139
+ justifyContent: "space-between",
140
+ children: [/*#__PURE__*/_jsx(Box, {
141
+ className: "truncateText",
142
+ children: uploadStatus?.fileName
143
+ }), /*#__PURE__*/_jsxs(Box, {
144
+ display: "flex",
145
+ alignItems: "center",
146
+ gap: 1,
147
+ marginTop: 1,
148
+ children: [/*#__PURE__*/_jsx(Box, {
149
+ children: uploadStatus?.fileSize
150
+ }), /*#__PURE__*/_jsx(CircularProgress, {
151
+ variant: "determinate",
152
+ value: uploadStatus?.uploadPercentage ?? 0,
153
+ className: "circularProgress-cls",
154
+ size: 15,
155
+ thickness: 8
156
+ }), /*#__PURE__*/_jsx(Box, {
157
+ children: `${uploadStatus?.uploadPercentage?.toFixed(0) ?? 0}%`
158
+ })]
159
+ })]
160
+ })
161
+ })]
162
+ })
163
+ }), /*#__PURE__*/_jsx(Grid, {
164
+ children: /*#__PURE__*/_jsx(HighlightOffRoundedIcon, {
165
+ className: "uploadCancel",
166
+ sx: {
167
+ cursor: "pointer"
168
+ },
169
+ onClick: e => {
170
+ cancelUpload(e);
171
+ }
172
+ })
173
+ })]
174
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
175
+ children: [/*#__PURE__*/_jsx(Icon, {
176
+ icon: "image"
177
+ }), translation("Add Image")]
178
+ })
91
179
  }) : /*#__PURE__*/_jsxs(Box, {
92
180
  sx: {
93
181
  color: "#64748B !important",
@@ -143,11 +231,20 @@ const Image = props => {
143
231
  webAddress,
144
232
  isNewTab,
145
233
  linkType,
146
- framePos
234
+ framePos,
235
+ file,
236
+ isUploading,
237
+ uniqueId,
238
+ fromFreeGrid
147
239
  } = element;
148
240
  const {
149
241
  readOnly,
150
- translation
242
+ translation,
243
+ services,
244
+ uploadFile,
245
+ resumeUploadState,
246
+ uploadTerminator,
247
+ isUploadInProgress = () => false
151
248
  } = customProps;
152
249
  const {
153
250
  vertical,
@@ -162,6 +259,12 @@ const Image = props => {
162
259
  const path = ReactEditor.findPath(editor, element);
163
260
  const [openNav, setOpenNav] = useState(false);
164
261
  const isEmpty = !url && !readOnly;
262
+ const [openUploadPopup, setUploadPopupOpen] = useState(false);
263
+ const [uploadStatus, setUploadStatus] = useState({
264
+ isUploading: false,
265
+ uploadPercentage: 0
266
+ });
267
+ const xhrRef = useRef(null);
165
268
  const getSize = () => {
166
269
  if (element?.size === undefined) {
167
270
  return {
@@ -217,32 +320,120 @@ const Image = props => {
217
320
  console.log(err);
218
321
  }
219
322
  };
323
+ const noUploadTracks = () => {
324
+ setUploadStatus({
325
+ isUploading: false,
326
+ uploadPercentage: 0,
327
+ fileName: null,
328
+ fileSize: null
329
+ });
330
+ Transforms.setNodes(editor, {
331
+ isUploading: false
332
+ }, {
333
+ at: path
334
+ });
335
+ };
336
+ useEffect(() => {
337
+ const isUploading = isUploadInProgress(uniqueId);
338
+ if (fromFreeGrid) {
339
+ if (isUploading) {
340
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "image");
341
+ } else {
342
+ if (!isUploading) {
343
+ handleImageUpload({
344
+ file: file
345
+ });
346
+ }
347
+ }
348
+ }
349
+ }, [uniqueId, isUploading, file]);
220
350
  useEffect(() => {
221
351
  if (editor && ele && ele[1] !== undefined) {
222
352
  const dom = ReactEditor.toDOMNode(editor, element);
223
353
  setParentDOM(dom);
224
354
  onLoad(getSize());
225
355
  }
356
+ if (uniqueId && isUploading) {
357
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "image");
358
+ } else if (file && isUploading) {
359
+ handleImageUpload({
360
+ file: file
361
+ });
362
+ }
226
363
  }, []);
227
364
  const onSettings = () => {
228
365
  setOpenSettings(true);
229
366
  };
230
367
  const onSave = data => {
231
368
  try {
232
- const updateData = {
233
- ...data
234
- };
235
- delete updateData.children;
236
- Transforms.setNodes(editor, {
237
- ...updateData
238
- }, {
239
- at: path
240
- });
241
- onClose();
369
+ if (!data?.url?.file) {
370
+ const updateData = buildUpdateData(data, url);
371
+ delete updateData.children;
372
+ Transforms.select(editor, path);
373
+ ReactEditor.focus(editor);
374
+ Transforms.setNodes(editor, {
375
+ ...updateData,
376
+ isUpload: false,
377
+ isUploading: false,
378
+ file: null
379
+ }, {
380
+ at: path
381
+ });
382
+ onClose();
383
+ } else {
384
+ handleImageUpload({
385
+ file: data?.url?.file,
386
+ isUpload: true,
387
+ setUploadStatus,
388
+ services: services
389
+ });
390
+ onClose();
391
+ onSave("");
392
+ }
242
393
  } catch (err) {
243
394
  console.log(err);
244
395
  }
245
396
  };
397
+ const handleImageUpload = async uploadProp => {
398
+ try {
399
+ if (uploadProp?.isUpload === false) {
400
+ onSave(uploadProp?.embedURL);
401
+ } else {
402
+ const isAlreadyUploading = isUploadInProgress(uniqueId);
403
+ let result = {};
404
+ if (uploadProp?.file && !isAlreadyUploading) {
405
+ result = await services("uploadFile", uploadProp?.file);
406
+ }
407
+ const uploadUrl = result?.data?.[0];
408
+ if (uploadUrl) {
409
+ const id = !uniqueId ? crypto?.randomUUID() : uniqueId;
410
+ const fileEntry = {
411
+ ...uploadProp,
412
+ xhrRef,
413
+ presidnedURL: uploadUrl,
414
+ status: "uploading"
415
+ };
416
+ uploadFile(id, fileEntry, setUploadStatus, onSave, "image");
417
+ if (!fromFreeGrid) {
418
+ Transforms.setNodes(editor, {
419
+ uniqueId: id,
420
+ isUploading: true
421
+ }, {
422
+ at: path
423
+ });
424
+ } else {
425
+ Transforms.setNodes(editor, {
426
+ isUploading: true
427
+ }, {
428
+ at: path
429
+ });
430
+ }
431
+ }
432
+ }
433
+ } catch (error) {
434
+ console.log(error);
435
+ }
436
+ };
246
437
  const onClose = () => {
247
438
  setOpenSettings(false);
248
439
  };
@@ -324,7 +515,16 @@ const Image = props => {
324
515
  path: path,
325
516
  theme: theme,
326
517
  classes: classes,
327
- translation: translation
518
+ translation: translation,
519
+ setUploadPopupOpen: setUploadPopupOpen,
520
+ openUploadPopup: openUploadPopup,
521
+ uploadStatus: uploadStatus,
522
+ setUploadStatus: setUploadStatus,
523
+ xhrRef: xhrRef,
524
+ onClose: onClose,
525
+ uniqueId: uniqueId,
526
+ uploadTerminator: uploadTerminator,
527
+ editor: editor
328
528
  }), url && frames[frame] ? /*#__PURE__*/_jsx(Box, {
329
529
  component: "div",
330
530
  className: "image-frame",
@@ -372,7 +572,20 @@ const Image = props => {
372
572
  navValue: webAddress,
373
573
  openInNewTab: isNewTab,
374
574
  customProps: customProps
375
- }) : null]
575
+ }) : null, openUploadPopup && /*#__PURE__*/_jsx(ImageSelector, {
576
+ open: true,
577
+ title: "Image",
578
+ onClose: () => setUploadPopupOpen(false),
579
+ customProps: customProps,
580
+ onSelectImage: img => {
581
+ handleImageUpload(img);
582
+ setUploadPopupOpen(false);
583
+ },
584
+ openUploadPopup: openUploadPopup,
585
+ setUploadPopupOpen: setUploadPopupOpen,
586
+ setUploadStatus: setUploadStatus,
587
+ xhrRef: xhrRef
588
+ })]
376
589
  });
377
590
  };
378
591
  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
  });
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from "react";
2
- import { Transforms, Node } from "slate";
2
+ import { Transforms } from "slate";
3
3
  import { useSlateStatic, ReactEditor } from "slate-react";
4
4
  import { IconButton, Tooltip, Grid, useTheme } from "@mui/material";
5
5
  import FormElements from "./FormElements";