@flozy/editor 4.9.1 → 4.9.3
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/Editor/Editor.css +17 -4
- package/dist/Editor/Elements/AI/CustomSelect.js +17 -10
- package/dist/Editor/Elements/AI/Styles.js +7 -1
- package/dist/Editor/Elements/Embed/Video.js +3 -2
- package/dist/Editor/Elements/FreeGrid/FreeGrid.js +1 -1
- package/dist/Editor/Elements/Grid/GridItem.js +28 -9
- package/dist/Editor/Elements/Grid/Styles.js +1 -0
- package/dist/Editor/Elements/Search/SearchAttachment.js +27 -18
- package/dist/Editor/Elements/Search/SearchButton.js +66 -9
- package/dist/Editor/Elements/Search/SearchList.js +87 -75
- package/dist/Editor/Elements/Table/AddRowCol.js +76 -0
- package/dist/Editor/Elements/Table/DragButton.js +134 -0
- package/dist/Editor/Elements/Table/DragStyles.js +43 -0
- package/dist/Editor/Elements/Table/Draggable.js +25 -0
- package/dist/Editor/Elements/Table/Droppable.js +53 -0
- package/dist/Editor/Elements/Table/Styles.js +23 -41
- package/dist/Editor/Elements/Table/Table.js +185 -137
- package/dist/Editor/Elements/Table/TableCell.js +339 -101
- package/dist/Editor/Elements/Table/TablePopup.js +9 -3
- package/dist/Editor/Elements/Table/TableRow.js +10 -2
- package/dist/Editor/Elements/Table/TableTool.js +101 -0
- package/dist/Editor/Toolbar/PopupTool/index.js +6 -8
- package/dist/Editor/assets/svg/DocsIcon.js +77 -10
- package/dist/Editor/assets/svg/TableIcons.js +220 -0
- package/dist/Editor/assets/svg/UserIcon.js +2 -2
- package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +27 -38
- package/dist/Editor/common/StyleBuilder/embedVideoStyle.js +1 -1
- package/dist/Editor/common/StyleBuilder/index.js +43 -57
- package/dist/Editor/common/StyleBuilder/tableStyle.js +92 -1
- package/dist/Editor/common/iconListV2.js +52 -0
- package/dist/Editor/hooks/useTable.js +164 -0
- package/dist/Editor/utils/helper.js +1 -1
- package/dist/Editor/utils/table.js +204 -21
- package/package.json +1 -1
package/dist/Editor/Editor.css
CHANGED
@@ -42,7 +42,7 @@ blockquote {
|
|
42
42
|
}
|
43
43
|
|
44
44
|
.editor-wrapper table {
|
45
|
-
border-collapse:
|
45
|
+
border-collapse: collapse;
|
46
46
|
}
|
47
47
|
|
48
48
|
.editor-wrapper .editor-wrapperbutton {
|
@@ -1234,7 +1234,20 @@ blockquote {
|
|
1234
1234
|
|
1235
1235
|
.settingsHeader {
|
1236
1236
|
font-size: 14px !important;
|
1237
|
-
font-weight:
|
1238
|
-
|
1239
|
-
|
1237
|
+
font-weight: 500 !important;
|
1238
|
+
}
|
1239
|
+
.hideScroll {
|
1240
|
+
overflow-anchor: none;
|
1241
|
+
}
|
1242
|
+
|
1243
|
+
.hideScroll::-webkit-scrollbar-track {
|
1244
|
+
background: none !important;
|
1245
|
+
}
|
1246
|
+
|
1247
|
+
.hideScroll::-webkit-scrollbar-thumb {
|
1248
|
+
background: none !important;
|
1249
|
+
}
|
1250
|
+
|
1251
|
+
.hideScroll::-webkit-scrollbar-thumb:hover {
|
1252
|
+
background: none !important;
|
1240
1253
|
}
|
@@ -8,12 +8,14 @@ function CustomSelect({
|
|
8
8
|
classes,
|
9
9
|
options,
|
10
10
|
onSend,
|
11
|
-
show
|
11
|
+
show,
|
12
|
+
btnProps = {}
|
12
13
|
}) {
|
13
14
|
if (show) {
|
14
15
|
return /*#__PURE__*/_jsx(Box, {
|
15
16
|
component: "div",
|
16
17
|
sx: classes.customSelectContainer,
|
18
|
+
className: "customSelectContainer",
|
17
19
|
children: options?.map((groupOption, index) => {
|
18
20
|
const {
|
19
21
|
options,
|
@@ -28,7 +30,8 @@ function CustomSelect({
|
|
28
30
|
return /*#__PURE__*/_jsx(DisplayOption, {
|
29
31
|
option: option,
|
30
32
|
classes: classes,
|
31
|
-
onSend: onSend
|
33
|
+
onSend: onSend,
|
34
|
+
btnProps: btnProps
|
32
35
|
}, i);
|
33
36
|
})]
|
34
37
|
}, index);
|
@@ -42,15 +45,18 @@ export default CustomSelect;
|
|
42
45
|
function DisplayOption({
|
43
46
|
option,
|
44
47
|
classes,
|
45
|
-
onSend
|
48
|
+
onSend,
|
49
|
+
btnProps = {}
|
46
50
|
}) {
|
47
51
|
const {
|
48
|
-
Icon
|
52
|
+
Icon,
|
53
|
+
Component
|
49
54
|
} = option;
|
50
55
|
const [open, setOpen] = useState(false);
|
51
56
|
const optionRef = useRef();
|
57
|
+
const showChild = option.options?.length || Component;
|
52
58
|
const openOptions = e => {
|
53
|
-
if (
|
59
|
+
if (showChild && !open) {
|
54
60
|
setOpen(e.currentTarget);
|
55
61
|
return;
|
56
62
|
}
|
@@ -66,7 +72,7 @@ function DisplayOption({
|
|
66
72
|
e.stopPropagation();
|
67
73
|
|
68
74
|
// is having child options
|
69
|
-
if (
|
75
|
+
if (showChild) {
|
70
76
|
openOptions(e);
|
71
77
|
return;
|
72
78
|
}
|
@@ -75,18 +81,19 @@ function DisplayOption({
|
|
75
81
|
},
|
76
82
|
id: "infinity-select-popover",
|
77
83
|
className: open ? "active" : "",
|
84
|
+
...btnProps,
|
78
85
|
children: [/*#__PURE__*/_jsxs("div", {
|
79
86
|
className: "option-label",
|
80
87
|
id: "infinity-select-popover",
|
81
88
|
children: [Icon && /*#__PURE__*/_jsx(Icon, {}), option.label]
|
82
|
-
}),
|
89
|
+
}), showChild ? /*#__PURE__*/_jsx(IconButton, {
|
83
90
|
children: /*#__PURE__*/_jsx(FaChevronRight, {
|
84
91
|
color: "#94A3B8",
|
85
92
|
size: 12
|
86
93
|
})
|
87
|
-
})]
|
94
|
+
}) : null]
|
88
95
|
}), /*#__PURE__*/_jsx(Popper, {
|
89
|
-
open: open &&
|
96
|
+
open: open && showChild,
|
90
97
|
anchorEl: open,
|
91
98
|
sx: {
|
92
99
|
zIndex: 9001,
|
@@ -96,7 +103,7 @@ function DisplayOption({
|
|
96
103
|
setOpen(null);
|
97
104
|
},
|
98
105
|
placement: "right-start",
|
99
|
-
children: /*#__PURE__*/_jsx(Box, {
|
106
|
+
children: Component ? /*#__PURE__*/_jsx(Component, {}) : /*#__PURE__*/_jsx(Box, {
|
100
107
|
children: /*#__PURE__*/_jsx(CustomSelect, {
|
101
108
|
options: option.options,
|
102
109
|
onSend: onSend,
|
@@ -142,7 +142,13 @@ const Styles = theme => ({
|
|
142
142
|
gap: "8px"
|
143
143
|
},
|
144
144
|
"&:hover": {
|
145
|
-
|
145
|
+
backgroundColor: `${theme?.palette?.editor?.menuOptionSelectedOption} !important`,
|
146
|
+
"& svg path": {
|
147
|
+
stroke: `${theme?.palette?.editor?.menuOptionTextColor} !important`
|
148
|
+
},
|
149
|
+
"& svg": {
|
150
|
+
color: `${theme?.palette?.editor?.menuOptionTextColor} !important`
|
151
|
+
}
|
146
152
|
},
|
147
153
|
"&.active": {
|
148
154
|
background: `${theme?.palette?.containers?.bg3 || "#E9F3FE"}`,
|
@@ -101,6 +101,7 @@ const Video = ({
|
|
101
101
|
horizantal
|
102
102
|
} = alignment || {};
|
103
103
|
const path = ReactEditor.findPath(editor, element);
|
104
|
+
const hasAspect = url && aspectRatio !== "custom" && aspectRatio;
|
104
105
|
const getSize = () => {
|
105
106
|
if (element?.size === undefined) {
|
106
107
|
return {
|
@@ -190,10 +191,10 @@ const Video = ({
|
|
190
191
|
width: {
|
191
192
|
...getBreakPointsValue(getSize(), null, "overrideReSize", true)
|
192
193
|
},
|
193
|
-
height: url && !aspectRatio ? {
|
194
|
+
height: url && (aspectRatio === "custom" || !aspectRatio) ? {
|
194
195
|
...getBreakPointsValue(getSize(), null, "overrideReSizeH", true)
|
195
196
|
} : "auto",
|
196
|
-
aspectRatio:
|
197
|
+
aspectRatio: hasAspect ? aspectRatio : "auto"
|
197
198
|
}, theme)
|
198
199
|
};
|
199
200
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
2
2
|
import React, { useEffect, useState, useRef } from "react";
|
3
|
-
import { useTheme } from "@mui/material";
|
3
|
+
import { Button, Dialog, DialogActions, DialogContent, useTheme } from "@mui/material";
|
4
4
|
import { Node, Path, Transforms } from "slate";
|
5
5
|
import { useSlateStatic, ReactEditor } from "slate-react";
|
6
6
|
import GridItemPopup from "./GridItemPopup";
|
@@ -83,7 +83,7 @@ const GridItem = props => {
|
|
83
83
|
initColumnWidth,
|
84
84
|
updateColumnWidth,
|
85
85
|
updateColNodes
|
86
|
-
} = useGrid();
|
86
|
+
} = useGrid() || {};
|
87
87
|
const columnRef = useRef(null);
|
88
88
|
const theme = useTheme();
|
89
89
|
const classes = GridStyles(theme);
|
@@ -129,6 +129,7 @@ const GridItem = props => {
|
|
129
129
|
const selected = hoverPath === path.join(",");
|
130
130
|
const [showTool] = useEditorSelection(editor);
|
131
131
|
const [parentDOM, setParentDOM] = useState({});
|
132
|
+
const [alert, setAlert] = useState(null);
|
132
133
|
const [size, onMouseDown, resizing, onLoad, isDone] = useTableResize({
|
133
134
|
...parentDOM
|
134
135
|
});
|
@@ -216,16 +217,23 @@ const GridItem = props => {
|
|
216
217
|
try {
|
217
218
|
const gridPath = Path.parent(path);
|
218
219
|
const gridNode = Node.get(editor, gridPath);
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
220
|
+
if (gridNode?.children?.length === 5) {
|
221
|
+
setAlert("Maximum column limit exceeded");
|
222
|
+
} else {
|
223
|
+
onAddGridItem({
|
224
|
+
editor,
|
225
|
+
element: gridNode,
|
226
|
+
children: gridNode?.children || [],
|
227
|
+
isColumn: gridNode?.equalItems
|
228
|
+
});
|
229
|
+
}
|
225
230
|
} catch (err) {
|
226
231
|
console.log(err);
|
227
232
|
}
|
228
233
|
};
|
234
|
+
const handleClose = () => {
|
235
|
+
setAlert(null);
|
236
|
+
};
|
229
237
|
const getBorderColor = () => {
|
230
238
|
return borderColor || "transparent";
|
231
239
|
};
|
@@ -334,7 +342,18 @@ const GridItem = props => {
|
|
334
342
|
className: resizing ? "resizing" : "",
|
335
343
|
onMouseDown: onMouseDown,
|
336
344
|
height: "auto"
|
337
|
-
}) : null
|
345
|
+
}) : null, /*#__PURE__*/_jsxs(Dialog, {
|
346
|
+
open: Boolean(alert),
|
347
|
+
onClose: handleClose,
|
348
|
+
children: [/*#__PURE__*/_jsx(DialogContent, {
|
349
|
+
children: alert
|
350
|
+
}), /*#__PURE__*/_jsx(DialogActions, {
|
351
|
+
children: /*#__PURE__*/_jsx(Button, {
|
352
|
+
onClick: handleClose,
|
353
|
+
children: "Close"
|
354
|
+
})
|
355
|
+
})]
|
356
|
+
})]
|
338
357
|
});
|
339
358
|
};
|
340
359
|
export default GridItem;
|
@@ -21,6 +21,7 @@ const SearchAttachment = props => {
|
|
21
21
|
const {
|
22
22
|
theme
|
23
23
|
} = useEditorContext();
|
24
|
+
const label = Boolean(title?.trim()) ? title : 'Untitled';
|
24
25
|
const handleClick = () => {
|
25
26
|
if (metadata && metadata?.actionHandler) {
|
26
27
|
metadata?.actionHandler(type, element);
|
@@ -37,26 +38,28 @@ const SearchAttachment = props => {
|
|
37
38
|
children: [/*#__PURE__*/_jsxs(Card, {
|
38
39
|
style: {
|
39
40
|
display: "flex",
|
40
|
-
justifyContent: "
|
41
|
-
alignItems: "
|
42
|
-
width: "
|
43
|
-
maxWidth: '
|
44
|
-
padding: "
|
41
|
+
justifyContent: "flex-start",
|
42
|
+
alignItems: "flex-end",
|
43
|
+
width: "fit-content",
|
44
|
+
maxWidth: '194px',
|
45
|
+
padding: "0px 10px",
|
45
46
|
boxShadow: "none",
|
46
|
-
border: `1px solid ${theme?.palette?.primary?.
|
47
|
+
border: `1px solid ${theme?.palette?.primary?.slashBrainBorder}`,
|
47
48
|
borderRadius: "7px",
|
48
|
-
background: theme?.palette?.
|
49
|
-
cursor: 'pointer'
|
49
|
+
background: theme?.palette?.containers?.slashBrainCardBg,
|
50
|
+
cursor: 'pointer',
|
51
|
+
"& *::selection": {
|
52
|
+
background: "#000"
|
53
|
+
}
|
50
54
|
},
|
51
55
|
onClick: handleClick,
|
52
56
|
children: [/*#__PURE__*/_jsx(CardMedia, {
|
53
57
|
sx: {
|
54
58
|
"& svg": {
|
55
59
|
'& path': {
|
56
|
-
stroke:
|
60
|
+
stroke: theme?.palette?.text?.slashBrainText
|
57
61
|
}
|
58
|
-
}
|
59
|
-
marginTop: '3px'
|
62
|
+
}
|
60
63
|
},
|
61
64
|
children: /*#__PURE__*/_jsx(Icon, {
|
62
65
|
icon: "docsIcon"
|
@@ -64,9 +67,8 @@ const SearchAttachment = props => {
|
|
64
67
|
}), /*#__PURE__*/_jsx(CardContent, {
|
65
68
|
sx: {
|
66
69
|
display: "flex",
|
67
|
-
|
68
|
-
|
69
|
-
padding: "3px 5px",
|
70
|
+
alignItems: "center",
|
71
|
+
padding: "3px 0px 3px 5px",
|
70
72
|
textDecoration: "none",
|
71
73
|
flexDirection: "column",
|
72
74
|
color: "#2563EB",
|
@@ -77,16 +79,23 @@ const SearchAttachment = props => {
|
|
77
79
|
children: /*#__PURE__*/_jsx(Typography, {
|
78
80
|
sx: {
|
79
81
|
fontWeight: "500",
|
80
|
-
|
81
|
-
|
82
|
+
background: theme?.palette?.text?.slashBrainText,
|
83
|
+
WebkitBackgroundClip: "text",
|
84
|
+
WebkitTextFillColor: 'transparent',
|
85
|
+
fontSize: "14px",
|
82
86
|
textOverflow: 'ellipsis',
|
83
87
|
whiteSpace: 'nowrap',
|
84
88
|
overflow: 'hidden',
|
85
89
|
wordBreak: "break-word",
|
86
|
-
maxWidth: '150px'
|
90
|
+
maxWidth: '150px',
|
91
|
+
lineHeight: 1.43,
|
92
|
+
"&::selection": {
|
93
|
+
WebkitTextFillColor: "#000"
|
94
|
+
}
|
87
95
|
},
|
88
96
|
component: "div",
|
89
|
-
|
97
|
+
variant: "subtitle1",
|
98
|
+
children: label
|
90
99
|
})
|
91
100
|
})]
|
92
101
|
}), /*#__PURE__*/_jsx("span", {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { forwardRef, useImperativeHandle, useState } from "react";
|
1
|
+
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react";
|
2
2
|
import ToolbarIcon from "../../common/ToolbarIcon";
|
3
3
|
import Icon from "../../common/Icon";
|
4
4
|
import { Paper, Popover } from "@mui/material";
|
@@ -6,6 +6,7 @@ import { ReactEditor, useSlateStatic } from "slate-react";
|
|
6
6
|
import SwipeableDrawerComponent from "../../common/SwipeableDrawer";
|
7
7
|
import SearchAndDocList from "./SearchList";
|
8
8
|
import { insertBrain } from "../../utils/brains";
|
9
|
+
import { useDebounce } from "use-debounce";
|
9
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
10
11
|
import { Fragment as _Fragment } from "react/jsx-runtime";
|
11
12
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
@@ -22,6 +23,22 @@ const SearchButton = /*#__PURE__*/forwardRef((props, ref) => {
|
|
22
23
|
const [target, setTarget] = useState(selectionTarget);
|
23
24
|
const open = Boolean(anchorEl);
|
24
25
|
const isMobile = window.matchMedia("(max-width: 899px)")?.matches || false;
|
26
|
+
const [mapData, setMapData] = useState([]);
|
27
|
+
const [skip, setSkip] = useState(0);
|
28
|
+
const [search, setSearch] = useState("");
|
29
|
+
const [isLoading, setIsLoading] = useState(false);
|
30
|
+
const [debouncedSearch] = useDebounce(search, 300);
|
31
|
+
const limit = 20;
|
32
|
+
const observer = useRef();
|
33
|
+
const lastDocRef = useCallback(node => {
|
34
|
+
if (observer.current) observer.current.disconnect();
|
35
|
+
observer.current = new IntersectionObserver(entries => {
|
36
|
+
if (entries[0].isIntersecting) {
|
37
|
+
setSkip(prevSkip => prevSkip + limit);
|
38
|
+
}
|
39
|
+
});
|
40
|
+
if (node) observer.current.observe(node);
|
41
|
+
}, []);
|
25
42
|
useImperativeHandle(ref, () => ({
|
26
43
|
triggerClick: target => {
|
27
44
|
setTarget(target);
|
@@ -42,6 +59,34 @@ const SearchButton = /*#__PURE__*/forwardRef((props, ref) => {
|
|
42
59
|
console.log(err);
|
43
60
|
}
|
44
61
|
};
|
62
|
+
useEffect(() => {
|
63
|
+
getDocs({
|
64
|
+
debouncedSearch,
|
65
|
+
skip,
|
66
|
+
limit
|
67
|
+
});
|
68
|
+
}, [skip, debouncedSearch]);
|
69
|
+
const getDocs = async () => {
|
70
|
+
setIsLoading(true);
|
71
|
+
try {
|
72
|
+
if (otherProps?.services) {
|
73
|
+
const result = await otherProps?.services("getDocs", {
|
74
|
+
skip,
|
75
|
+
limit,
|
76
|
+
search
|
77
|
+
});
|
78
|
+
setMapData(prev => skip === 0 ? result.data : [...prev, ...result.data]);
|
79
|
+
}
|
80
|
+
} catch (error) {
|
81
|
+
console.error("Error fetching documents:", error);
|
82
|
+
} finally {
|
83
|
+
setIsLoading(false);
|
84
|
+
}
|
85
|
+
};
|
86
|
+
const onSearchChange = value => {
|
87
|
+
setSearch(value);
|
88
|
+
setSkip(0);
|
89
|
+
};
|
45
90
|
const handleClose = () => {
|
46
91
|
setAnchorEl(null);
|
47
92
|
};
|
@@ -52,9 +97,7 @@ const SearchButton = /*#__PURE__*/forwardRef((props, ref) => {
|
|
52
97
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
53
98
|
children: [/*#__PURE__*/_jsx(ToolbarIcon, {
|
54
99
|
title: element?.name,
|
55
|
-
onClick:
|
56
|
-
onClick();
|
57
|
-
},
|
100
|
+
onClick: onClick,
|
58
101
|
icon: /*#__PURE__*/_jsx(Icon, {
|
59
102
|
icon: element?.name?.toLowerCase()
|
60
103
|
}),
|
@@ -71,7 +114,10 @@ const SearchButton = /*#__PURE__*/forwardRef((props, ref) => {
|
|
71
114
|
borderColor: theme?.palette?.type === 'dark' ? theme?.palette?.primary?.border2 : 'transparent'
|
72
115
|
},
|
73
116
|
children: /*#__PURE__*/_jsx(SearchAndDocList, {
|
74
|
-
|
117
|
+
mapData: mapData,
|
118
|
+
isLoading: isLoading,
|
119
|
+
lastDocRef: lastDocRef,
|
120
|
+
onSearchChange: onSearchChange,
|
75
121
|
handleClick: handleClick,
|
76
122
|
theme: theme,
|
77
123
|
handleClose: handleClose
|
@@ -88,17 +134,28 @@ const SearchButton = /*#__PURE__*/forwardRef((props, ref) => {
|
|
88
134
|
horizontal: "left"
|
89
135
|
},
|
90
136
|
onClose: handleClose,
|
137
|
+
sx: {
|
138
|
+
'& .MuiPaper-root': {
|
139
|
+
borderRadius: '12px !important'
|
140
|
+
}
|
141
|
+
},
|
91
142
|
children: /*#__PURE__*/_jsx(Paper, {
|
92
143
|
sx: {
|
93
|
-
padding:
|
94
|
-
|
144
|
+
padding: 0,
|
145
|
+
width: '330px',
|
95
146
|
background: theme?.palette?.background?.paper,
|
96
147
|
border: '1px solid',
|
97
148
|
borderColor: theme?.palette?.type === 'dark' ? theme?.palette?.primary?.border2 : 'transparent',
|
98
|
-
borderRadius: '
|
149
|
+
borderRadius: '12px',
|
150
|
+
'&.MuiPaper-root-MuiPopover-paper': {
|
151
|
+
borderRadius: '12px !important'
|
152
|
+
}
|
99
153
|
},
|
100
154
|
children: /*#__PURE__*/_jsx(SearchAndDocList, {
|
101
|
-
|
155
|
+
mapData: mapData,
|
156
|
+
isLoading: isLoading,
|
157
|
+
lastDocRef: lastDocRef,
|
158
|
+
onSearchChange: onSearchChange,
|
102
159
|
handleClick: handleClick,
|
103
160
|
theme: theme,
|
104
161
|
handleClose: handleClose
|