@flozy/editor 10.7.0 → 10.7.2

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 (143) hide show
  1. package/dist/Editor/ChatEditor.js +17 -16
  2. package/dist/Editor/CommonEditor.js +126 -15
  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 +25 -17
  8. package/dist/Editor/Elements/AppHeader/AppHeader.js +3 -3
  9. package/dist/Editor/Elements/Attachments/AttachmentStyles.js +16 -0
  10. package/dist/Editor/Elements/Attachments/Attachments.js +153 -11
  11. package/dist/Editor/Elements/Attachments/AttachmentsButton.js +14 -4
  12. package/dist/Editor/Elements/Button/EditorButton.js +23 -7
  13. package/dist/Editor/Elements/Color Picker/ColorButtons.js +61 -14
  14. package/dist/Editor/Elements/Color Picker/ColorPicker.css +25 -1
  15. package/dist/Editor/Elements/Color Picker/ColorPicker.js +10 -7
  16. package/dist/Editor/Elements/Color Picker/Styles.js +15 -13
  17. package/dist/Editor/Elements/Embed/Embed.js +36 -43
  18. package/dist/Editor/Elements/Embed/Image.js +240 -23
  19. package/dist/Editor/Elements/Embed/Video.js +246 -15
  20. package/dist/Editor/Elements/Form/FormField.js +1 -1
  21. package/dist/Editor/Elements/Form/Workflow/Styles.js +24 -22
  22. package/dist/Editor/Elements/Form/Workflow/constant.js +25 -1
  23. package/dist/Editor/Elements/FreeGrid/FreeGrid.js +39 -33
  24. package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +7 -4
  25. package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +1 -0
  26. package/dist/Editor/Elements/FreeGrid/Options/More.js +7 -7
  27. package/dist/Editor/Elements/FreeGrid/helper.js +115 -0
  28. package/dist/Editor/Elements/FreeGrid/styles.js +9 -0
  29. package/dist/Editor/Elements/Grid/GridItem.js +1 -1
  30. package/dist/Editor/Elements/PageSettings/PageSettingsButton.js +2 -1
  31. package/dist/Editor/Elements/SimpleText/style.js +2 -2
  32. package/dist/Editor/Elements/Table/Table.js +3 -3
  33. package/dist/Editor/Elements/Title/title.js +6 -6
  34. package/dist/Editor/Elements/TopBanner/TopBanner.js +6 -1
  35. package/dist/Editor/Elements/TopBanner/TopBannerButton.js +8 -2
  36. package/dist/Editor/Elements/Variables/VariableButton.js +10 -1
  37. package/dist/Editor/MiniEditor.js +2 -1
  38. package/dist/Editor/Styles/EditorStyles.js +20 -5
  39. package/dist/Editor/Toolbar/FormatTools/Dropdown.js +27 -3
  40. package/dist/Editor/Toolbar/FormatTools/FontFamilyAutocomplete.js +4 -3
  41. package/dist/Editor/Toolbar/FormatTools/MarkButton.js +2 -2
  42. package/dist/Editor/Toolbar/FormatTools/TextSize.js +10 -13
  43. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +2 -1
  44. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/MiniColorPicker.js +4 -2
  45. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectFontSize.js +6 -13
  46. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectList.js +19 -5
  47. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectTypography.js +167 -42
  48. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +16 -7
  49. package/dist/Editor/Toolbar/PopupTool/PopperHeader.js +2 -1
  50. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +69 -9
  51. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +70 -12
  52. package/dist/Editor/Toolbar/PopupTool/ThemeTextFormat.js +439 -0
  53. package/dist/Editor/Toolbar/PopupTool/index.js +5 -2
  54. package/dist/Editor/Toolbar/toolbarGroups.js +56 -10
  55. package/dist/Editor/assets/svg/BackIcon.js +18 -0
  56. package/dist/Editor/assets/svg/ThemeIcons.js +293 -0
  57. package/dist/Editor/common/ColorPickerButton.js +38 -16
  58. package/dist/Editor/common/CustomColorPicker/index.js +130 -0
  59. package/dist/Editor/common/CustomColorPicker/style.js +53 -0
  60. package/dist/Editor/common/CustomDialog2/index.js +94 -0
  61. package/dist/Editor/common/CustomDialog2/style.js +67 -0
  62. package/dist/Editor/common/CustomSelect.js +43 -0
  63. package/dist/Editor/common/DnD/DragHandleButton.js +1 -1
  64. package/dist/Editor/common/FontLoader/FontLoader.js +3 -0
  65. package/dist/Editor/common/Icon.js +28 -0
  66. package/dist/Editor/common/ImageSelector/ImageSelector.js +45 -7
  67. package/dist/Editor/common/ImageSelector/Options/Upload.js +26 -11
  68. package/dist/Editor/common/ImageSelector/Styles.js +3 -9
  69. package/dist/Editor/common/LinkSettings/NavComponents.js +6 -2
  70. package/dist/Editor/common/MentionsPopup/index.js +9 -1
  71. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +2 -1
  72. package/dist/Editor/common/RnD/ElementSettings/Settings/AppHeaderSettings.js +3 -2
  73. package/dist/Editor/common/RnD/ElementSettings/Settings/BoxSettings.js +3 -2
  74. package/dist/Editor/common/RnD/ElementSettings/Settings/ButtonSettings.js +3 -2
  75. package/dist/Editor/common/RnD/ElementSettings/Settings/CodeSettings.js +3 -2
  76. package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +4 -2
  77. package/dist/Editor/common/RnD/ElementSettings/Settings/ImageSettings.js +20 -7
  78. package/dist/Editor/common/RnD/ElementSettings/Settings/TableSettings.js +3 -2
  79. package/dist/Editor/common/RnD/ElementSettings/Settings/TextSettings.js +3 -1
  80. package/dist/Editor/common/RnD/ElementSettings/Settings/VideoSettings.js +20 -7
  81. package/dist/Editor/common/RnD/SwitchViewport/SwitchViewport.js +11 -2
  82. package/dist/Editor/common/RnD/Theme/MainThemeProvider.js +17 -0
  83. package/dist/Editor/common/RnD/Theme/ViewportStimulator.js +6 -3
  84. package/dist/Editor/common/RnD/Utils/gridDropItem.js +28 -18
  85. package/dist/Editor/common/RnD/Utils/index.js +3 -1
  86. package/dist/Editor/common/RnD/VirtualElement/VirtualTextElement.js +45 -58
  87. package/dist/Editor/common/RnD/VirtualElement/helper.js +320 -130
  88. package/dist/Editor/common/RnD/VirtualElement/styles.js +22 -0
  89. package/dist/Editor/common/RnD/index.js +48 -13
  90. package/dist/Editor/common/Shorthands/elements.js +62 -4
  91. package/dist/Editor/common/StyleBuilder/buttonStyle.js +4 -2
  92. package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +4 -0
  93. package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +20 -2
  94. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +12 -2
  95. package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +15 -7
  96. package/dist/Editor/common/StyleBuilder/fieldTypes/card.js +16 -8
  97. package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +36 -10
  98. package/dist/Editor/common/StyleBuilder/fieldTypes/embedUpload.js +115 -0
  99. package/dist/Editor/common/StyleBuilder/fieldTypes/fontSize.js +16 -7
  100. package/dist/Editor/common/StyleBuilder/fieldTypes/index.js +3 -1
  101. package/dist/Editor/common/StyleBuilder/fieldTypes/menusArray.js +2 -0
  102. package/dist/Editor/common/StyleBuilder/fieldTypes/textOptions.js +15 -7
  103. package/dist/Editor/common/StyleBuilder/index.js +8 -4
  104. package/dist/Editor/common/Uploader.js +125 -17
  105. package/dist/Editor/common/UploaderWithProgress.js +183 -0
  106. package/dist/Editor/common/iconslist.js +21 -0
  107. package/dist/Editor/commonStyle.js +107 -64
  108. package/dist/Editor/helper/index.js +10 -2
  109. package/dist/Editor/helper/textIndeces.js +58 -0
  110. package/dist/Editor/helper/theme.js +203 -2
  111. package/dist/Editor/hooks/useEditorTheme.js +153 -0
  112. package/dist/Editor/hooks/useMouseMove.js +9 -3
  113. package/dist/Editor/hooks/useThemeValues.js +63 -0
  114. package/dist/Editor/plugins/withEmbeds.js +1 -1
  115. package/dist/Editor/plugins/withHTML.js +7 -3
  116. package/dist/Editor/plugins/withTable.js +1 -1
  117. package/dist/Editor/service/fileupload.js +53 -0
  118. package/dist/Editor/theme/ThemeList.js +50 -173
  119. package/dist/Editor/theme/index.js +149 -0
  120. package/dist/Editor/themeSettings/ActiveTheme.js +82 -0
  121. package/dist/Editor/themeSettings/buttons/index.js +300 -0
  122. package/dist/Editor/themeSettings/buttons/style.js +23 -0
  123. package/dist/Editor/themeSettings/colorTheme/index.js +310 -0
  124. package/dist/Editor/themeSettings/colorTheme/style.js +81 -0
  125. package/dist/Editor/themeSettings/fonts/PreviewElement.js +121 -0
  126. package/dist/Editor/themeSettings/fonts/index.js +240 -0
  127. package/dist/Editor/themeSettings/fonts/style.js +62 -0
  128. package/dist/Editor/themeSettings/icons.js +60 -0
  129. package/dist/Editor/themeSettings/index.js +380 -0
  130. package/dist/Editor/themeSettings/style.js +299 -0
  131. package/dist/Editor/themeSettingsAI/icons.js +96 -0
  132. package/dist/Editor/themeSettingsAI/index.js +355 -0
  133. package/dist/Editor/themeSettingsAI/saveTheme.js +202 -0
  134. package/dist/Editor/themeSettingsAI/style.js +332 -0
  135. package/dist/Editor/utils/SlateUtilityFunctions.js +182 -21
  136. package/dist/Editor/utils/accordion.js +62 -34
  137. package/dist/Editor/utils/button.js +1 -17
  138. package/dist/Editor/utils/draftToSlate.js +3 -2
  139. package/dist/Editor/utils/font.js +40 -37
  140. package/dist/Editor/utils/helper.js +97 -21
  141. package/dist/Editor/utils/insertAppHeader.js +8 -4
  142. package/package.json +4 -4
  143. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/MultiSelect.js +0 -454
@@ -1,13 +1,14 @@
1
1
  import React, { useState } from "react";
2
2
  import { ReactEditor } from "slate-react";
3
- import ColorPickerTool from "react-gcolor-picker";
4
- import { IconButton, Tooltip, Box, Popover } from "@mui/material";
3
+ import { IconButton, Tooltip, Box, Popover, useTheme } from "@mui/material";
5
4
  import { addMarkData, activeMark } from "../../utils/SlateUtilityFunctions";
6
5
  import ColorButtons from "./ColorButtons";
7
6
  import ColorPickerStyles from "./Styles";
8
7
  import colorWheel from "./colorWheel.png";
9
8
  import "./ColorPicker.css";
10
9
  import { useEditorContext } from "../../hooks/useMouseMove";
10
+ import CustomColorPicker from "../../common/CustomColorPicker";
11
+ import { getSelectedElementColor } from "../../utils/helper";
11
12
  import { jsx as _jsx } from "react/jsx-runtime";
12
13
  import { Fragment as _Fragment } from "react/jsx-runtime";
13
14
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -25,7 +26,8 @@ const ColorPicker = props => {
25
26
  classes,
26
27
  forMiniTool,
27
28
  openColorTool,
28
- closeColorTool
29
+ closeColorTool,
30
+ type
29
31
  } = props;
30
32
  const {
31
33
  theme
@@ -34,6 +36,7 @@ const ColorPicker = props => {
34
36
  const [anchorEl, setAnchorEl] = useState(null);
35
37
  const open = Boolean(anchorEl);
36
38
  const pickerStyles = ColorPickerStyles(theme);
39
+ const muiTheme = useTheme();
37
40
  const onOpen = e => {
38
41
  e.preventDefault();
39
42
  setAnchorEl(e.currentTarget);
@@ -58,7 +61,7 @@ const ColorPicker = props => {
58
61
  setAnchorEl(null);
59
62
  setSelection(null);
60
63
  };
61
- const activeColor = activeMark(editor, format) || DEFAULT_COLOR[format];
64
+ const activeColor = type === "textColor" ? getSelectedElementColor(editor, format, muiTheme) : activeMark(editor, format) || DEFAULT_COLOR[format];
62
65
  return /*#__PURE__*/_jsxs(_Fragment, {
63
66
  children: [forMiniTool ? null : /*#__PURE__*/_jsx(Tooltip, {
64
67
  title: title,
@@ -96,10 +99,10 @@ const ColorPicker = props => {
96
99
  horizontal: "top"
97
100
  },
98
101
  sx: classes.colorPickerPopup,
99
- children: /*#__PURE__*/_jsx(ColorPickerTool, {
102
+ children: /*#__PURE__*/_jsx(CustomColorPicker, {
100
103
  gradient: true,
101
- value: activeColor,
102
- onChange: handleFormSubmit
104
+ onChange: handleFormSubmit,
105
+ color: activeColor
103
106
  })
104
107
  })]
105
108
  });
@@ -20,24 +20,26 @@ const ColorPickerStyles = theme => ({
20
20
  background: `${theme?.palette?.editor?.miniToolBarBackground}`,
21
21
  border: `1px solid ${theme?.palette?.editor?.miniToolBarBorder} !important`,
22
22
  borderRadius: "7px !important",
23
- padding: "0px 5px",
24
- '@media only screen and (max-width: 600px)': {
23
+ padding: "0px 10px",
24
+ "@media only screen and (max-width: 600px)": {
25
25
  marginTop: "-40px"
26
26
  }
27
27
  }
28
28
  },
29
29
  colorButtonSingle: {
30
+ border: "1.5px solid #DCE4EC !important",
30
31
  "&.active": {
31
- "&:before": {
32
- content: '" "',
33
- position: "absolute",
34
- top: "-4px",
35
- left: "-4px",
36
- width: "calc(100% + 8px)",
37
- height: "calc(100% + 8px)",
38
- border: "2px solid #2563EB",
39
- borderRadius: "50%"
40
- }
32
+ // "&:before": {
33
+ // content: '" "',
34
+ // position: "absolute",
35
+ // top: "-4px",
36
+ // left: "-4px",
37
+ // width: "calc(100% + 8px)",
38
+ // height: "calc(100% + 8px)",
39
+ // border: "2px solid #2563EB",
40
+ // borderRadius: "50%",
41
+ // },
42
+ outline: "2px solid #2563EB"
41
43
  }
42
44
  },
43
45
  colorButtonsInner: {
@@ -59,7 +61,7 @@ const ColorPickerStyles = theme => ({
59
61
  width: "24px",
60
62
  height: "24px",
61
63
  margin: "0px 4px",
62
- border: "unset"
64
+ border: "1.5px solid #DCE4EC"
63
65
  }
64
66
  },
65
67
  colorPickerIcon: {
@@ -1,5 +1,4 @@
1
- import React, { useState } from "react";
2
- import { Transforms } from "slate";
1
+ import React, { useRef, useState } from "react";
3
2
  import { ReactEditor } from "slate-react";
4
3
  import Icon from "../../common/Icon";
5
4
  import { isBlockActive } from "../../utils/SlateUtilityFunctions";
@@ -22,55 +21,45 @@ const Embed = ({
22
21
  customProps,
23
22
  icoBtnType
24
23
  }) => {
25
- const [open, setOpen] = useState(false);
26
- const [formData, setFormData] = useState({
27
- url: "",
28
- alt: "",
29
- images: []
30
- });
24
+ const [openSetttings, setUploadPopupOpen] = useState(false);
31
25
  const [selection, setSelection] = useState();
32
26
  const {
33
27
  translation
34
28
  } = customProps;
35
- const handleFormSubmit = fd => {
36
- if (fd?.url || fd?.images.length > 0) {
37
- selection && Transforms.select(editor, selection);
38
- selection && ReactEditor.focus(editor);
39
- insertEmbed(editor, {
40
- ...fd
41
- }, format);
42
- setFormData({
43
- url: "",
44
- alt: ""
45
- });
46
- }
47
- handleClose();
48
- };
29
+ const [uploadStatus, setUploadStatus] = useState({
30
+ isUploading: false,
31
+ uploadPercentage: 0,
32
+ fileName: null,
33
+ fileSize: null
34
+ });
35
+ const xhrRef = useRef(null);
49
36
  const onToggle = e => {
50
37
  e.preventDefault();
51
38
  setSelection(editor.selection);
52
39
  selection && ReactEditor.focus(editor);
53
- setOpen(true);
40
+ setUploadPopupOpen(true);
54
41
  };
55
42
  const handleClose = () => {
56
- setOpen(false);
43
+ setUploadPopupOpen(false);
57
44
  };
58
- const onSelectImage = img => {
59
- const fd = {
60
- ...formData,
61
- url: img
62
- };
63
- setFormData(fd);
64
- let extProps = {};
65
- if (format === "video") {
66
- extProps = {
67
- aspectRatio: "16 / 9"
68
- };
45
+ const onSelectImage = async img => {
46
+ if (img?.isUpload === false) {
47
+ insertEmbed(editor, {
48
+ url: img.embedURL,
49
+ isUploading: false,
50
+ isUpload: false
51
+ }, format);
52
+ } else {
53
+ insertEmbed(editor, {
54
+ url: "",
55
+ file: img.file,
56
+ isUploading: true,
57
+ isUpload: true,
58
+ fileName: img.file?.name,
59
+ fileSize: img.file?.size,
60
+ mimeType: img.file?.type
61
+ }, format);
69
62
  }
70
- handleFormSubmit({
71
- ...fd,
72
- ...extProps
73
- });
74
63
  };
75
64
  return /*#__PURE__*/_jsxs(_Fragment, {
76
65
  children: [/*#__PURE__*/_jsx(ToolbarIcon, {
@@ -82,13 +71,17 @@ const Embed = ({
82
71
  }),
83
72
  icoBtnType: icoBtnType
84
73
  }), /*#__PURE__*/_jsx(ImageSelector, {
85
- open: open,
74
+ open: openSetttings,
86
75
  onClose: handleClose,
87
76
  customProps: customProps,
88
77
  onSelectImage: onSelectImage,
89
- title: EMBED_LABEL[lbT || format]
78
+ title: EMBED_LABEL[lbT || format],
79
+ setUploadStatus: setUploadStatus,
80
+ uploadStatus: uploadStatus,
81
+ xhrRef: xhrRef,
82
+ setUploadPopupOpen: setUploadPopupOpen,
83
+ fromEmbed: true
90
84
  })]
91
85
  });
92
86
  };
93
- export default Embed;
94
- // export default styled(commonStyle)(Embed);
87
+ export default Embed;
@@ -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;