@flozy/editor 11.2.3 → 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.
- package/dist/Editor/ChatEditor.js +7 -7
- package/dist/Editor/CommonEditor.js +86 -24
- package/dist/Editor/DialogWrapper.js +31 -25
- package/dist/Editor/Editor.css +37 -4
- package/dist/Editor/Elements/AI/PopoverAIInput.js +11 -3
- package/dist/Editor/Elements/AppHeader/AppHeader.js +3 -3
- package/dist/Editor/Elements/Attachments/AttachmentStyles.js +16 -0
- package/dist/Editor/Elements/Attachments/Attachments.js +239 -11
- package/dist/Editor/Elements/Attachments/AttachmentsButton.js +11 -4
- package/dist/Editor/Elements/Button/EditorButton.js +32 -44
- package/dist/Editor/Elements/Color Picker/ColorButtons.js +61 -14
- package/dist/Editor/Elements/Color Picker/ColorPicker.css +25 -1
- package/dist/Editor/Elements/Color Picker/ColorPicker.js +10 -7
- package/dist/Editor/Elements/Color Picker/Styles.js +15 -13
- package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/Select.js +134 -55
- package/dist/Editor/Elements/DataView/Layouts/DataTypes/Components/SelectV1.js +7 -8
- package/dist/Editor/Elements/DataView/Layouts/DataTypes/PersonType.js +8 -3
- package/dist/Editor/Elements/DataView/Layouts/Options/EditProperty.js +1 -1
- package/dist/Editor/Elements/DataView/Layouts/TableStyles.js +1 -1
- package/dist/Editor/Elements/Embed/Embed.js +37 -43
- package/dist/Editor/Elements/Embed/Image.js +307 -26
- package/dist/Editor/Elements/Embed/Video.js +355 -35
- package/dist/Editor/Elements/EmbedScript/EmbedScriptPopup.js +9 -6
- package/dist/Editor/Elements/EmbedScript/styles.js +17 -1
- package/dist/Editor/Elements/Form/FormField.js +1 -1
- package/dist/Editor/Elements/Form/Workflow/Styles.js +25 -22
- package/dist/Editor/Elements/Form/Workflow/constant.js +25 -1
- package/dist/Editor/Elements/FreeGrid/FreeGrid.js +37 -76
- package/dist/Editor/Elements/FreeGrid/FreeGridBox.js +9 -5
- package/dist/Editor/Elements/FreeGrid/FreeGridItem.js +3 -1
- package/dist/Editor/Elements/FreeGrid/helper.js +194 -0
- package/dist/Editor/Elements/FreeGrid/styles.js +15 -0
- package/dist/Editor/Elements/Grid/GridItem.js +1 -1
- package/dist/Editor/Elements/PageSettings/PageSettingsButton.js +2 -1
- package/dist/Editor/Elements/Table/Table.js +2 -1
- package/dist/Editor/Elements/Table/TableCell.js +10 -3
- package/dist/Editor/Elements/Title/title.js +4 -5
- package/dist/Editor/Elements/TopBanner/TopBanner.js +4 -2
- package/dist/Editor/Elements/TopBanner/TopBannerButton.js +5 -3
- package/dist/Editor/Styles/EditorStyles.js +19 -5
- package/dist/Editor/Toolbar/FormatTools/Dropdown.js +27 -3
- package/dist/Editor/Toolbar/FormatTools/FontFamilyAutocomplete.js +4 -3
- package/dist/Editor/Toolbar/FormatTools/MarkButton.js +2 -2
- package/dist/Editor/Toolbar/FormatTools/TextSize.js +33 -29
- package/dist/Editor/Toolbar/Mini/MiniToolbar.js +2 -1
- package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/MiniColorPicker.js +3 -1
- package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectFontSize.js +25 -23
- package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/SelectTypography.js +167 -42
- package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +15 -5
- package/dist/Editor/Toolbar/PopupTool/PopperHeader.js +2 -1
- package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +65 -7
- package/dist/Editor/Toolbar/PopupTool/TextFormat.js +66 -12
- package/dist/Editor/Toolbar/PopupTool/ThemeTextFormat.js +439 -0
- package/dist/Editor/Toolbar/PopupTool/index.js +6 -4
- package/dist/Editor/Toolbar/toolbarGroups.js +48 -6
- package/dist/Editor/assets/svg/BackIcon.js +18 -0
- package/dist/Editor/assets/svg/ThemeIcons.js +293 -0
- package/dist/Editor/common/ColorPickerButton.js +38 -19
- package/dist/Editor/common/CustomColorPicker/index.js +130 -0
- package/dist/Editor/common/CustomColorPicker/style.js +53 -0
- package/dist/Editor/common/CustomDialog2/index.js +94 -0
- package/dist/Editor/common/CustomDialog2/style.js +67 -0
- package/dist/Editor/common/CustomSelect.js +43 -0
- package/dist/Editor/common/DnD/DragHandleButton.js +1 -1
- package/dist/Editor/common/FontLoader/FontLoader.js +1 -0
- package/dist/Editor/common/Icon.js +28 -0
- package/dist/Editor/common/ImageSelector/ImageSelector.js +66 -13
- package/dist/Editor/common/ImageSelector/Options/ChooseAssets.js +1 -1
- package/dist/Editor/common/ImageSelector/Options/RecentUploads.js +483 -0
- package/dist/Editor/common/ImageSelector/Options/Upload.js +26 -11
- package/dist/Editor/common/ImageSelector/Styles.js +3 -9
- package/dist/Editor/common/RnD/ElementSettings/OtherSettings/Settings.js +2 -1
- package/dist/Editor/common/RnD/ElementSettings/Settings/AppHeaderSettings.js +3 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/BoxSettings.js +3 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/ButtonSettings.js +3 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/CodeSettings.js +3 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +3 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/ImageSettings.js +20 -7
- package/dist/Editor/common/RnD/ElementSettings/Settings/TableSettings.js +3 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/TextSettings.js +2 -0
- package/dist/Editor/common/RnD/ElementSettings/Settings/VideoSettings.js +20 -7
- package/dist/Editor/common/RnD/GuideLines/styles.js +1 -1
- package/dist/Editor/common/RnD/Theme/MainThemeProvider.js +17 -0
- package/dist/Editor/common/RnD/Theme/ViewportStimulator.js +6 -3
- package/dist/Editor/common/RnD/Utils/gridDropItem.js +28 -11
- package/dist/Editor/common/RnD/Utils/index.js +3 -1
- package/dist/Editor/common/RnD/VirtualElement/VirtualTextElement.js +52 -63
- package/dist/Editor/common/RnD/VirtualElement/helper.js +248 -68
- package/dist/Editor/common/RnD/VirtualElement/styles.js +22 -0
- package/dist/Editor/common/RnD/index.js +61 -14
- package/dist/Editor/common/Shorthands/elements.js +55 -3
- package/dist/Editor/common/StyleBuilder/buttonStyle.js +5 -15
- package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +4 -0
- package/dist/Editor/common/StyleBuilder/fieldStyle.js +1 -0
- package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +13 -3
- package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +12 -2
- package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +15 -7
- package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +36 -10
- package/dist/Editor/common/StyleBuilder/fieldTypes/fontSize.js +13 -4
- package/dist/Editor/common/StyleBuilder/fieldTypes/menusArray.js +2 -0
- package/dist/Editor/common/StyleBuilder/fieldTypes/text.js +16 -4
- package/dist/Editor/common/StyleBuilder/fieldTypes/textOptions.js +15 -7
- package/dist/Editor/common/StyleBuilder/formStyle.js +19 -13
- package/dist/Editor/common/StyleBuilder/index.js +10 -19
- package/dist/Editor/common/Uploader.js +118 -17
- package/dist/Editor/common/UploaderWithProgress.js +183 -0
- package/dist/Editor/common/iconslist.js +21 -0
- package/dist/Editor/commonStyle.js +111 -53
- package/dist/Editor/helper/index.js +4 -1
- package/dist/Editor/helper/theme.js +203 -2
- package/dist/Editor/hooks/useEditorTheme.js +153 -0
- package/dist/Editor/hooks/useMouseMove.js +12 -3
- package/dist/Editor/hooks/useTable.js +62 -1
- package/dist/Editor/hooks/useThemeValues.js +63 -0
- package/dist/Editor/plugins/withEmbeds.js +1 -1
- package/dist/Editor/plugins/withHTML.js +56 -3
- package/dist/Editor/plugins/withTable.js +1 -1
- package/dist/Editor/service/fileTracking.js +22 -0
- package/dist/Editor/service/fileupload.js +77 -0
- package/dist/Editor/theme/ThemeList.js +50 -173
- package/dist/Editor/theme/index.js +149 -0
- package/dist/Editor/themeSettings/ActiveTheme.js +82 -0
- package/dist/Editor/themeSettings/buttons/index.js +300 -0
- package/dist/Editor/themeSettings/buttons/style.js +23 -0
- package/dist/Editor/themeSettings/colorTheme/index.js +310 -0
- package/dist/Editor/themeSettings/colorTheme/style.js +81 -0
- package/dist/Editor/themeSettings/fonts/PreviewElement.js +121 -0
- package/dist/Editor/themeSettings/fonts/index.js +240 -0
- package/dist/Editor/themeSettings/fonts/style.js +62 -0
- package/dist/Editor/themeSettings/icons.js +60 -0
- package/dist/Editor/themeSettings/index.js +380 -0
- package/dist/Editor/themeSettings/style.js +299 -0
- package/dist/Editor/themeSettingsAI/icons.js +96 -0
- package/dist/Editor/themeSettingsAI/index.js +355 -0
- package/dist/Editor/themeSettingsAI/saveTheme.js +202 -0
- package/dist/Editor/themeSettingsAI/style.js +332 -0
- package/dist/Editor/utils/SlateUtilityFunctions.js +165 -40
- package/dist/Editor/utils/accordion.js +1 -1
- package/dist/Editor/utils/attachments.js +138 -2
- package/dist/Editor/utils/button.js +1 -17
- package/dist/Editor/utils/font.js +40 -37
- package/dist/Editor/utils/formfield.js +2 -2
- package/dist/Editor/utils/helper.js +101 -3
- package/dist/Editor/utils/insertAppHeader.js +8 -4
- 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
|
-
|
|
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
|
-
|
|
110
|
+
if (!uploadStatus?.isUploading) setUploadPopupOpen(true);
|
|
84
111
|
},
|
|
85
112
|
sx: {
|
|
86
113
|
...classes.emptyThumbBtn
|
|
87
114
|
},
|
|
88
|
-
children:
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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;
|