@flozy/editor 11.2.2 → 11.2.4

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 (145) hide show
  1. package/dist/Editor/ChatEditor.js +7 -7
  2. package/dist/Editor/CommonEditor.js +86 -24
  3. package/dist/Editor/DialogWrapper.js +31 -25
  4. package/dist/Editor/Editor.css +37 -4
  5. package/dist/Editor/Elements/AI/PopoverAIInput.js +11 -3
  6. package/dist/Editor/Elements/AppHeader/AppHeader.js +3 -3
  7. package/dist/Editor/Elements/Attachments/AttachmentStyles.js +16 -0
  8. package/dist/Editor/Elements/Attachments/Attachments.js +239 -11
  9. package/dist/Editor/Elements/Attachments/AttachmentsButton.js +11 -4
  10. package/dist/Editor/Elements/Button/EditorButton.js +22 -7
  11. package/dist/Editor/Elements/Color Picker/ColorButtons.js +61 -14
  12. package/dist/Editor/Elements/Color Picker/ColorPicker.css +25 -1
  13. package/dist/Editor/Elements/Color Picker/ColorPicker.js +10 -7
  14. package/dist/Editor/Elements/Color Picker/Styles.js +15 -13
  15. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/Select.js +134 -55
  16. package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/SelectV1.js +7 -8
  17. package/dist/Editor/Elements/DataView/Layouts/DataTypes/PersonType.js +8 -3
  18. package/dist/Editor/Elements/DataView/Layouts/Options/EditProperty.js +1 -1
  19. package/dist/Editor/Elements/DataView/Layouts/TableStyles.js +1 -1
  20. package/dist/Editor/Elements/Embed/Embed.js +37 -43
  21. package/dist/Editor/Elements/Embed/Image.js +307 -26
  22. package/dist/Editor/Elements/Embed/Video.js +355 -35
  23. package/dist/Editor/Elements/EmbedScript/EmbedScriptPopup.js +9 -6
  24. package/dist/Editor/Elements/EmbedScript/styles.js +17 -1
  25. package/dist/Editor/Elements/Form/FormField.js +1 -1
  26. package/dist/Editor/Elements/Form/Workflow/Styles.js +25 -22
  27. package/dist/Editor/Elements/Form/Workflow/constant.js +25 -1
  28. package/dist/Editor/Elements/FreeGrid/FreeGrid.js +37 -76
  29. package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +9 -5
  30. package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +3 -1
  31. package/dist/Editor/Elements/FreeGrid/helper.js +194 -0
  32. package/dist/Editor/Elements/FreeGrid/styles.js +15 -0
  33. package/dist/Editor/Elements/Grid/GridItem.js +1 -1
  34. package/dist/Editor/Elements/PageSettings/PageSettingsButton.js +2 -1
  35. package/dist/Editor/Elements/Table/Table.js +2 -1
  36. package/dist/Editor/Elements/Table/TableCell.js +10 -3
  37. package/dist/Editor/Elements/Title/title.js +4 -5
  38. package/dist/Editor/Elements/TopBanner/TopBanner.js +4 -2
  39. package/dist/Editor/Elements/TopBanner/TopBannerButton.js +5 -3
  40. package/dist/Editor/Styles/EditorStyles.js +19 -5
  41. package/dist/Editor/Toolbar/FormatTools/Dropdown.js +27 -3
  42. package/dist/Editor/Toolbar/FormatTools/FontFamilyAutocomplete.js +4 -3
  43. package/dist/Editor/Toolbar/FormatTools/MarkButton.js +2 -2
  44. package/dist/Editor/Toolbar/FormatTools/TextSize.js +33 -29
  45. package/dist/Editor/Toolbar/Mini/MiniToolbar.js +2 -1
  46. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/MiniColorPicker.js +3 -1
  47. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectFontSize.js +25 -23
  48. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectTypography.js +167 -42
  49. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +15 -5
  50. package/dist/Editor/Toolbar/PopupTool/PopperHeader.js +2 -1
  51. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +65 -7
  52. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +66 -12
  53. package/dist/Editor/Toolbar/PopupTool/ThemeTextFormat.js +439 -0
  54. package/dist/Editor/Toolbar/PopupTool/index.js +6 -4
  55. package/dist/Editor/Toolbar/toolbarGroups.js +48 -6
  56. package/dist/Editor/assets/svg/BackIcon.js +18 -0
  57. package/dist/Editor/assets/svg/ThemeIcons.js +293 -0
  58. package/dist/Editor/common/ColorPickerButton.js +38 -19
  59. package/dist/Editor/common/CustomColorPicker/index.js +130 -0
  60. package/dist/Editor/common/CustomColorPicker/style.js +53 -0
  61. package/dist/Editor/common/CustomDialog2/index.js +94 -0
  62. package/dist/Editor/common/CustomDialog2/style.js +67 -0
  63. package/dist/Editor/common/CustomSelect.js +43 -0
  64. package/dist/Editor/common/DnD/DragHandleButton.js +1 -1
  65. package/dist/Editor/common/FontLoader/FontLoader.js +1 -0
  66. package/dist/Editor/common/Icon.js +28 -0
  67. package/dist/Editor/common/ImageSelector/ImageSelector.js +66 -13
  68. package/dist/Editor/common/ImageSelector/Options/ChooseAssets.js +1 -1
  69. package/dist/Editor/common/ImageSelector/Options/RecentUploads.js +483 -0
  70. package/dist/Editor/common/ImageSelector/Options/Upload.js +26 -11
  71. package/dist/Editor/common/ImageSelector/Styles.js +3 -9
  72. package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +2 -1
  73. package/dist/Editor/common/RnD/ElementSettings/Settings/AppHeaderSettings.js +3 -2
  74. package/dist/Editor/common/RnD/ElementSettings/Settings/BoxSettings.js +3 -2
  75. package/dist/Editor/common/RnD/ElementSettings/Settings/ButtonSettings.js +3 -2
  76. package/dist/Editor/common/RnD/ElementSettings/Settings/CodeSettings.js +3 -2
  77. package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +3 -2
  78. package/dist/Editor/common/RnD/ElementSettings/Settings/ImageSettings.js +20 -7
  79. package/dist/Editor/common/RnD/ElementSettings/Settings/TableSettings.js +3 -2
  80. package/dist/Editor/common/RnD/ElementSettings/Settings/TextSettings.js +2 -0
  81. package/dist/Editor/common/RnD/ElementSettings/Settings/VideoSettings.js +20 -7
  82. package/dist/Editor/common/RnD/GuideLines/styles.js +1 -1
  83. package/dist/Editor/common/RnD/Theme/MainThemeProvider.js +17 -0
  84. package/dist/Editor/common/RnD/Theme/ViewportStimulator.js +6 -3
  85. package/dist/Editor/common/RnD/Utils/gridDropItem.js +28 -11
  86. package/dist/Editor/common/RnD/Utils/index.js +3 -1
  87. package/dist/Editor/common/RnD/VirtualElement/VirtualTextElement.js +52 -63
  88. package/dist/Editor/common/RnD/VirtualElement/helper.js +248 -68
  89. package/dist/Editor/common/RnD/VirtualElement/styles.js +22 -0
  90. package/dist/Editor/common/RnD/index.js +61 -14
  91. package/dist/Editor/common/Shorthands/elements.js +55 -3
  92. package/dist/Editor/common/StyleBuilder/buttonStyle.js +4 -2
  93. package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +4 -0
  94. package/dist/Editor/common/StyleBuilder/fieldStyle.js +1 -0
  95. package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +13 -3
  96. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +12 -2
  97. package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +15 -7
  98. package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +36 -10
  99. package/dist/Editor/common/StyleBuilder/fieldTypes/fontSize.js +13 -4
  100. package/dist/Editor/common/StyleBuilder/fieldTypes/menusArray.js +2 -0
  101. package/dist/Editor/common/StyleBuilder/fieldTypes/text.js +16 -4
  102. package/dist/Editor/common/StyleBuilder/fieldTypes/textOptions.js +15 -7
  103. package/dist/Editor/common/StyleBuilder/formStyle.js +19 -13
  104. package/dist/Editor/common/StyleBuilder/index.js +8 -4
  105. package/dist/Editor/common/Uploader.js +118 -17
  106. package/dist/Editor/common/UploaderWithProgress.js +183 -0
  107. package/dist/Editor/common/iconslist.js +21 -0
  108. package/dist/Editor/commonStyle.js +111 -53
  109. package/dist/Editor/helper/index.js +4 -1
  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 +12 -3
  113. package/dist/Editor/hooks/useTable.js +62 -1
  114. package/dist/Editor/hooks/useThemeValues.js +63 -0
  115. package/dist/Editor/plugins/withEmbeds.js +1 -1
  116. package/dist/Editor/plugins/withHTML.js +56 -3
  117. package/dist/Editor/plugins/withTable.js +1 -1
  118. package/dist/Editor/service/fileTracking.js +22 -0
  119. package/dist/Editor/service/fileupload.js +77 -0
  120. package/dist/Editor/theme/ThemeList.js +50 -173
  121. package/dist/Editor/theme/index.js +149 -0
  122. package/dist/Editor/themeSettings/ActiveTheme.js +82 -0
  123. package/dist/Editor/themeSettings/buttons/index.js +300 -0
  124. package/dist/Editor/themeSettings/buttons/style.js +23 -0
  125. package/dist/Editor/themeSettings/colorTheme/index.js +310 -0
  126. package/dist/Editor/themeSettings/colorTheme/style.js +81 -0
  127. package/dist/Editor/themeSettings/fonts/PreviewElement.js +121 -0
  128. package/dist/Editor/themeSettings/fonts/index.js +240 -0
  129. package/dist/Editor/themeSettings/fonts/style.js +62 -0
  130. package/dist/Editor/themeSettings/icons.js +60 -0
  131. package/dist/Editor/themeSettings/index.js +380 -0
  132. package/dist/Editor/themeSettings/style.js +299 -0
  133. package/dist/Editor/themeSettingsAI/icons.js +96 -0
  134. package/dist/Editor/themeSettingsAI/index.js +355 -0
  135. package/dist/Editor/themeSettingsAI/saveTheme.js +202 -0
  136. package/dist/Editor/themeSettingsAI/style.js +332 -0
  137. package/dist/Editor/utils/SlateUtilityFunctions.js +165 -40
  138. package/dist/Editor/utils/accordion.js +1 -1
  139. package/dist/Editor/utils/attachments.js +138 -2
  140. package/dist/Editor/utils/button.js +1 -17
  141. package/dist/Editor/utils/font.js +40 -37
  142. package/dist/Editor/utils/formfield.js +2 -2
  143. package/dist/Editor/utils/helper.js +101 -3
  144. package/dist/Editor/utils/insertAppHeader.js +8 -4
  145. package/package.json +1 -1
@@ -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,112 @@ const ImageContent = props => {
67
77
  objectFit,
68
78
  webAddress,
69
79
  readOnly,
70
- setOpenSettings,
80
+ // setOpenSettings, // Unused - component uses internal state
71
81
  handleImageClick,
72
82
  onTouchEnd,
73
83
  path,
74
84
  theme,
75
85
  classes,
76
- translation
86
+ translation,
87
+ setUploadPopupOpen,
88
+ uploadStatus,
89
+ setUploadStatus,
90
+ uniqueId,
91
+ uploadTerminator,
92
+ editor
77
93
  } = props;
78
- return !url ? !readOnly ? /*#__PURE__*/_jsxs(Box, {
94
+ const cancelUpload = e => {
95
+ e.stopPropagation();
96
+ uploadTerminator(uniqueId, setUploadStatus);
97
+ Transforms.setNodes(editor, {
98
+ isUpload: false,
99
+ isUploading: false,
100
+ file: null
101
+ }, {
102
+ at: path
103
+ });
104
+ };
105
+ return !url ? !readOnly ? /*#__PURE__*/_jsx(Box, {
79
106
  component: "button",
80
107
  className: "element-empty-btn",
81
108
  contentEditable: false,
82
109
  onClick: () => {
83
- setOpenSettings(true);
110
+ if (!uploadStatus?.isUploading) setUploadPopupOpen(true);
84
111
  },
85
112
  sx: {
86
113
  ...classes.emptyThumbBtn
87
114
  },
88
- children: [/*#__PURE__*/_jsx(Icon, {
89
- icon: "image"
90
- }), translation("Add Image")]
115
+ children: uploadStatus?.isUploading ? /*#__PURE__*/_jsxs(Grid, {
116
+ container: true,
117
+ direction: "row",
118
+ style: {
119
+ display: "flex",
120
+ justifyContent: "space-between"
121
+ },
122
+ children: [/*#__PURE__*/_jsx(Grid, {
123
+ style: {
124
+ width: "80%"
125
+ },
126
+ children: /*#__PURE__*/_jsxs(Grid, {
127
+ container: true,
128
+ direction: "row",
129
+ sx: {
130
+ justifyContent: "flex-start",
131
+ alignItems: "center"
132
+ // gap: 1,
133
+ },
134
+ children: [/*#__PURE__*/_jsx(Grid, {
135
+ children: /*#__PURE__*/_jsx(Icon, {
136
+ icon: "image"
137
+ })
138
+ }), /*#__PURE__*/_jsx(Grid, {
139
+ style: {
140
+ width: "80%"
141
+ },
142
+ children: /*#__PURE__*/_jsxs(Box, {
143
+ display: "flex",
144
+ flexDirection: "column",
145
+ alignItems: "flex-start",
146
+ justifyContent: "flex-start",
147
+ children: [/*#__PURE__*/_jsx(Box, {
148
+ className: "truncateText",
149
+ children: uploadStatus?.fileName
150
+ }), /*#__PURE__*/_jsxs(Box, {
151
+ display: "flex",
152
+ alignItems: "center",
153
+ gap: 1,
154
+ marginTop: 1,
155
+ children: [/*#__PURE__*/_jsx(Box, {
156
+ children: uploadStatus?.fileSize
157
+ }), /*#__PURE__*/_jsx(CircularProgress, {
158
+ variant: "determinate",
159
+ value: uploadStatus?.uploadPercentage ?? 0,
160
+ className: "circularProgress-cls",
161
+ size: 15,
162
+ thickness: 8
163
+ }), /*#__PURE__*/_jsx(Box, {
164
+ children: `${uploadStatus?.uploadPercentage?.toFixed(0) ?? 0}%`
165
+ })]
166
+ })]
167
+ })
168
+ })]
169
+ })
170
+ }), /*#__PURE__*/_jsx(Grid, {
171
+ children: /*#__PURE__*/_jsx(HighlightOffRoundedIcon, {
172
+ className: "uploadCancel",
173
+ sx: {
174
+ cursor: "pointer"
175
+ },
176
+ onClick: e => {
177
+ cancelUpload(e);
178
+ }
179
+ })
180
+ })]
181
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
182
+ children: [/*#__PURE__*/_jsx(Icon, {
183
+ icon: "image"
184
+ }), translation("Add Image")]
185
+ })
91
186
  }) : /*#__PURE__*/_jsxs(Box, {
92
187
  sx: {
93
188
  color: "#64748B !important",
@@ -143,11 +238,20 @@ const Image = props => {
143
238
  webAddress,
144
239
  isNewTab,
145
240
  linkType,
146
- framePos
241
+ framePos,
242
+ file,
243
+ isUploading,
244
+ uniqueId,
245
+ fromFreeGrid
147
246
  } = element;
148
247
  const {
149
248
  readOnly,
150
- translation
249
+ translation,
250
+ services,
251
+ uploadFile,
252
+ resumeUploadState,
253
+ uploadTerminator,
254
+ isUploadInProgress = () => false
151
255
  } = customProps;
152
256
  const {
153
257
  vertical,
@@ -162,6 +266,13 @@ const Image = props => {
162
266
  const path = ReactEditor.findPath(editor, element);
163
267
  const [openNav, setOpenNav] = useState(false);
164
268
  const isEmpty = !url && !readOnly;
269
+ const [openUploadPopup, setUploadPopupOpen] = useState(false);
270
+ const [uploadStatus, setUploadStatus] = useState({
271
+ isUploading: false,
272
+ uploadPercentage: 0
273
+ });
274
+ const xhrRef = useRef(null);
275
+ const trackingProcessedRef = useRef(false);
165
276
  const getSize = () => {
166
277
  if (element?.size === undefined) {
167
278
  return {
@@ -217,32 +328,178 @@ const Image = props => {
217
328
  console.log(err);
218
329
  }
219
330
  };
331
+ const noUploadTracks = () => {
332
+ setUploadStatus({
333
+ isUploading: false,
334
+ uploadPercentage: 0,
335
+ fileName: null,
336
+ fileSize: null
337
+ });
338
+ Transforms.setNodes(editor, {
339
+ isUploading: false
340
+ }, {
341
+ at: path
342
+ });
343
+ };
344
+ useEffect(() => {
345
+ const isUploading = isUploadInProgress(uniqueId);
346
+ if (fromFreeGrid) {
347
+ if (isUploading) {
348
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "image");
349
+ } else {
350
+ if (!isUploading) {
351
+ handleImageUpload({
352
+ file: file
353
+ });
354
+ }
355
+ }
356
+ }
357
+ }, [uniqueId, isUploading, file]);
220
358
  useEffect(() => {
221
359
  if (editor && ele && ele[1] !== undefined) {
222
360
  const dom = ReactEditor.toDOMNode(editor, element);
223
361
  setParentDOM(dom);
224
362
  onLoad(getSize());
225
363
  }
364
+ if (uniqueId && isUploading) {
365
+ resumeUploadState(uniqueId, setUploadStatus, onSave, noUploadTracks, "image");
366
+ } else if (file && isUploading) {
367
+ handleImageUpload({
368
+ file: file
369
+ });
370
+ }
226
371
  }, []);
227
372
  const onSettings = () => {
228
373
  setOpenSettings(true);
229
374
  };
230
- const onSave = data => {
375
+ const onSave = async (data, isUploadCompletion = false) => {
376
+ // Determine if this is from recent uploads or choose assets - check both object and string data
377
+ const isFromRecentUploads = typeof data === 'object' && data?.source === "recent" || typeof data === 'string' && data.includes('recent');
378
+
379
+ // Only track if this is NOT an upload completion AND we haven't processed tracking yet
380
+ // Upload completions will be tracked by the uploadFile function in main app
381
+ // Also skip tracking if the source is "recent" (selected from recent uploads or choose assets)
382
+ if (data && !isUploadCompletion && !trackingProcessedRef.current && !isFromRecentUploads) {
383
+ // Mark tracking as processed
384
+ trackingProcessedRef.current = true;
385
+ try {
386
+ // Import utility functions
387
+ const {
388
+ getImageMimeTypeFromExtension,
389
+ extractFileInfoFromUrl
390
+ } = await import("../../utils/attachments");
391
+
392
+ // Extract URL from data (could be string or object)
393
+ const urlToTrack = typeof data === 'string' ? data : data?.embedURL || data?.url;
394
+ if (urlToTrack) {
395
+ // Extract filename and extension from URL
396
+ const {
397
+ filename,
398
+ extension
399
+ } = extractFileInfoFromUrl(urlToTrack);
400
+ const mimeType = getImageMimeTypeFromExtension(extension);
401
+ const trackingData = {
402
+ file_url: urlToTrack,
403
+ name: filename || 'Untitled Image',
404
+ mime_type: mimeType,
405
+ resource_type: "flozy_editor",
406
+ resource_id: customProps?.page_id,
407
+ status: 1,
408
+ created_on: new Date().toISOString()
409
+ };
410
+
411
+ // Try main app service first, fallback to direct implementation
412
+ if (customProps.services && typeof customProps.services === 'function') {
413
+ try {
414
+ // const result = await customProps.services('trackEditorUploads', {
415
+ await customProps.services('trackEditorUploads', {
416
+ fileData: trackingData,
417
+ category: 'image'
418
+ });
419
+ } catch (error) {
420
+ console.warn('Main app service failed, falling back to direct tracking:', error);
421
+ }
422
+ }
423
+ }
424
+ } catch (error) {
425
+ console.error("Failed to track image URL:", error);
426
+ }
427
+ } else {}
231
428
  try {
232
- const updateData = {
233
- ...data
234
- };
235
- delete updateData.children;
236
- Transforms.setNodes(editor, {
237
- ...updateData
238
- }, {
239
- at: path
240
- });
241
- onClose();
429
+ if (!data?.url?.file) {
430
+ const updateData = buildUpdateData(data, url);
431
+ delete updateData.children;
432
+ Transforms.select(editor, path);
433
+ ReactEditor.focus(editor);
434
+ const finalUpdateData = {
435
+ ...updateData,
436
+ isUpload: false,
437
+ isUploading: false,
438
+ file: null,
439
+ source: data?.source
440
+ };
441
+ Transforms.setNodes(editor, finalUpdateData, {
442
+ at: path
443
+ });
444
+ onClose();
445
+ } else {
446
+ handleImageUpload({
447
+ file: data?.url?.file,
448
+ isUpload: true,
449
+ setUploadStatus,
450
+ services: services
451
+ });
452
+ onClose();
453
+ onSave("", true); // Mark as upload completion
454
+ }
242
455
  } catch (err) {
243
456
  console.log(err);
244
457
  }
245
458
  };
459
+ const handleImageUpload = async uploadProp => {
460
+ try {
461
+ // Check if this is a recent upload (has source "recent") or manual URL entry (isUpload === false)
462
+ if (uploadProp?.isUpload === false || uploadProp?.source === "recent") {
463
+ // Pass the full uploadProp object to preserve source information
464
+ onSave(uploadProp, false); // Manual URL entry or recent upload, not upload completion
465
+ } else {
466
+ // Reset tracking flag for new upload
467
+ trackingProcessedRef.current = false;
468
+ const isAlreadyUploading = isUploadInProgress(uniqueId);
469
+ let result = {};
470
+ if (uploadProp?.file && !isAlreadyUploading) {
471
+ result = await services("uploadFile", uploadProp?.file);
472
+ }
473
+ const uploadUrl = result?.data?.[0];
474
+ if (uploadUrl) {
475
+ const id = !uniqueId ? crypto?.randomUUID() : uniqueId;
476
+ const fileEntry = {
477
+ ...uploadProp,
478
+ xhrRef,
479
+ presidnedURL: uploadUrl,
480
+ status: "uploading"
481
+ };
482
+ uploadFile(id, fileEntry, setUploadStatus, onSave, "image");
483
+ if (!fromFreeGrid) {
484
+ Transforms.setNodes(editor, {
485
+ uniqueId: id,
486
+ isUploading: true
487
+ }, {
488
+ at: path
489
+ });
490
+ } else {
491
+ Transforms.setNodes(editor, {
492
+ isUploading: true
493
+ }, {
494
+ at: path
495
+ });
496
+ }
497
+ }
498
+ }
499
+ } catch (error) {
500
+ console.log(error);
501
+ }
502
+ };
246
503
  const onClose = () => {
247
504
  setOpenSettings(false);
248
505
  };
@@ -252,8 +509,9 @@ const Image = props => {
252
509
  });
253
510
  };
254
511
  const onPosChange = data => {
255
- onSave(data);
512
+ onSave(data, false); // Manual position change, not upload completion
256
513
  };
514
+
257
515
  const getWidth = () => {
258
516
  if (resizing) {
259
517
  return {
@@ -324,7 +582,16 @@ const Image = props => {
324
582
  path: path,
325
583
  theme: theme,
326
584
  classes: classes,
327
- translation: translation
585
+ translation: translation,
586
+ setUploadPopupOpen: setUploadPopupOpen,
587
+ openUploadPopup: openUploadPopup,
588
+ uploadStatus: uploadStatus,
589
+ setUploadStatus: setUploadStatus,
590
+ xhrRef: xhrRef,
591
+ onClose: onClose,
592
+ uniqueId: uniqueId,
593
+ uploadTerminator: uploadTerminator,
594
+ editor: editor
328
595
  }), url && frames[frame] ? /*#__PURE__*/_jsx(Box, {
329
596
  component: "div",
330
597
  className: "image-frame",
@@ -365,14 +632,28 @@ const Image = props => {
365
632
  linkType,
366
633
  webAddress: navValue,
367
634
  isNewTab: openInNewTab
368
- });
635
+ }, false); // Manual link setting, not upload completion
636
+
369
637
  setOpenNav(false);
370
638
  },
371
639
  navType: linkType,
372
640
  navValue: webAddress,
373
641
  openInNewTab: isNewTab,
374
642
  customProps: customProps
375
- }) : null]
643
+ }) : null, openUploadPopup && /*#__PURE__*/_jsx(ImageSelector, {
644
+ open: true,
645
+ title: "Image",
646
+ onClose: () => setUploadPopupOpen(false),
647
+ customProps: customProps,
648
+ onSelectImage: img => {
649
+ handleImageUpload(img);
650
+ setUploadPopupOpen(false);
651
+ },
652
+ openUploadPopup: openUploadPopup,
653
+ setUploadPopupOpen: setUploadPopupOpen,
654
+ setUploadStatus: setUploadStatus,
655
+ xhrRef: xhrRef
656
+ })]
376
657
  });
377
658
  };
378
659
  export default Image;