@flozy/editor 4.9.4 → 4.9.6

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 (37) hide show
  1. package/dist/Editor/ChatEditor.js +25 -34
  2. package/dist/Editor/Editor.css +25 -7
  3. package/dist/Editor/Elements/AI/AIInput.js +0 -1
  4. package/dist/Editor/Elements/AI/Styles.js +7 -7
  5. package/dist/Editor/Elements/Link/LinkButton.js +1 -1
  6. package/dist/Editor/Elements/Search/SearchButton.js +4 -4
  7. package/dist/Editor/Elements/Search/SearchList.js +7 -5
  8. package/dist/Editor/Elements/Signature/SignaturePopup.js +3 -2
  9. package/dist/Editor/Elements/Table/AddRowCol.js +3 -2
  10. package/dist/Editor/Elements/Table/DragButton.js +6 -2
  11. package/dist/Editor/Elements/Table/DragStyles.js +62 -36
  12. package/dist/Editor/Elements/Table/Styles.js +1 -1
  13. package/dist/Editor/Elements/Table/Table.js +8 -3
  14. package/dist/Editor/Elements/Table/TableCell.js +24 -10
  15. package/dist/Editor/Elements/Table/tableHelper.js +83 -0
  16. package/dist/Editor/Toolbar/FormatTools/Dropdown.js +2 -0
  17. package/dist/Editor/Toolbar/FormatTools/FontFamilyAutocomplete.js +2 -0
  18. package/dist/Editor/Toolbar/PopupTool/MiniTextFormat/index.js +3 -3
  19. package/dist/Editor/Toolbar/PopupTool/PopupToolStyle.js +133 -31
  20. package/dist/Editor/Toolbar/PopupTool/TextFormat.js +2 -0
  21. package/dist/Editor/common/ColorPickerButton.js +3 -2
  22. package/dist/Editor/common/MentionsPopup/Styles.js +1 -7
  23. package/dist/Editor/common/RnD/ElementSettings/Settings/FormSettings.js +1 -0
  24. package/dist/Editor/common/RnD/index.js +1 -1
  25. package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +5 -0
  26. package/dist/Editor/common/StyleBuilder/fieldTypes/card.js +10 -2
  27. package/dist/Editor/common/Uploader.js +8 -0
  28. package/dist/Editor/common/iconListV2.js +2 -0
  29. package/dist/Editor/common/iconslist.js +1 -0
  30. package/dist/Editor/commonStyle.js +6 -2
  31. package/dist/Editor/helper/deserialize/index.js +5 -11
  32. package/dist/Editor/hooks/useTable.js +37 -30
  33. package/dist/Editor/utils/chatEditor/SlateUtilityFunctions.js +14 -0
  34. package/dist/Editor/utils/events.js +0 -1
  35. package/dist/Editor/utils/helper.js +11 -0
  36. package/dist/Editor/utils/serializeToText.js +2 -0
  37. package/package.json +1 -1
@@ -1,9 +1,8 @@
1
1
  import React, { useCallback, useMemo, useRef, useState, useEffect, useImperativeHandle, forwardRef } from "react";
2
2
  import { Editable, Slate, ReactEditor } from 'slate-react';
3
3
  import { createEditor, Transforms, Editor } from 'slate';
4
- import { useDebounce } from "use-debounce";
5
4
  import withCommon from "./hooks/withCommon";
6
- import { getBlock, getMarked } from "./utils/chatEditor/SlateUtilityFunctions";
5
+ import { getBlock, getMarked, serializeMentions } from "./utils/chatEditor/SlateUtilityFunctions";
7
6
  import MiniTextFormat from "./Toolbar/PopupTool/MiniTextFormat";
8
7
  import { commands, mentionsEvent } from "./utils/events";
9
8
  import { insertEmoji } from "./utils/emoji";
@@ -15,6 +14,7 @@ import Shorthands from "./common/Shorthands";
15
14
  import usePopupStyle from "./Toolbar/PopupTool/PopupToolStyle";
16
15
  import { EditorProvider } from "./hooks/useMouseMove";
17
16
  import decorators from "./utils/Decorators";
17
+ import { useDebouncedCallback } from "use-debounce";
18
18
  import { jsx as _jsx } from "react/jsx-runtime";
19
19
  import { jsxs as _jsxs } from "react/jsx-runtime";
20
20
  const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
@@ -42,8 +42,18 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
42
42
  });
43
43
  const [isInteracted, setIsInteracted] = useState(false);
44
44
  const [value, setValue] = useState(convertedContent);
45
- const [loadedValue] = useState(value);
46
- const [deboundedValue] = useDebounce(value, 500);
45
+ const debouncedValue = useRef(value);
46
+ const debounced = useDebouncedCallback(
47
+ // function
48
+ value => {
49
+ const {
50
+ value: strVal,
51
+ ...restVal
52
+ } = getOnSaveData(value);
53
+ onSave(strVal, restVal);
54
+ },
55
+ // delay in ms
56
+ 500);
47
57
  const editor = useMemo(() => {
48
58
  return withCommon(createEditor(), {
49
59
  needLayout,
@@ -63,7 +73,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
63
73
  const {
64
74
  value: strVal,
65
75
  ...restVal
66
- } = getOnSaveData(value);
76
+ } = getOnSaveData(debouncedValue?.current);
67
77
  onsubmit(false, {
68
78
  strVal,
69
79
  restVal
@@ -99,7 +109,8 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
99
109
  const newValue = draftToSlate({
100
110
  data: content
101
111
  });
102
- setValue(newValue);
112
+ debounced(newValue);
113
+
103
114
  // setTimeout(() => {
104
115
  if (editor.children.length === 0) {
105
116
  Transforms.insertNodes(editor, newValue);
@@ -112,27 +123,14 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
112
123
  }
113
124
  }
114
125
  }));
115
-
116
- // useEffect(() => {
117
- // setIsExternalUpdate(true);
118
- // setValue(draftToSlate({ data: content }));
119
- // }, [content]);
120
-
121
- useEffect(() => {
122
- if (JSON.stringify(loadedValue) !== JSON.stringify(deboundedValue) && isInteracted && onSave) {
123
- const {
124
- value: strVal,
125
- ...restVal
126
- } = getOnSaveData(deboundedValue);
127
- onSave(strVal, restVal);
128
- }
129
- }, [deboundedValue]);
130
126
  const getOnSaveData = val => {
131
127
  const text = serializeToText(val);
128
+ const mentions = serializeMentions(val);
132
129
  const title = val?.find(f => f.type === "title");
133
130
  return {
134
131
  value: JSON.stringify(val),
135
132
  text: text,
133
+ mentions: mentions,
136
134
  title: serializeToText(title?.children) || "Untitled"
137
135
  };
138
136
  };
@@ -180,15 +178,8 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
180
178
  });
181
179
  };
182
180
  const handleEditorChange = newValue => {
183
- const value_txt = serializeToText(value);
184
- if (!value_txt) {
185
- const {
186
- value: strVal,
187
- ...restVal
188
- } = getOnSaveData(newValue);
189
- onSave(strVal, restVal);
190
- }
191
- setValue(newValue);
181
+ debounced(newValue);
182
+ debouncedValue.current = newValue;
192
183
  if (!isInteracted) {
193
184
  setIsInteracted(true);
194
185
  }
@@ -228,7 +219,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
228
219
  editor
229
220
  });
230
221
  } else if (event.key === "Enter" && !isMobile) {
231
- const isEmpty = value.length === 1 && value[0].type === 'paragraph' && value[0].children.length === 1 && value[0].children[0].text === '';
222
+ const isEmpty = debouncedValue?.current.length === 1 && debouncedValue?.current[0].type === 'paragraph' && debouncedValue?.current[0].children.length === 1 && debouncedValue?.current[0].children[0].text === '';
232
223
  if (isEmpty) {
233
224
  event.preventDefault();
234
225
  return;
@@ -237,7 +228,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
237
228
  const {
238
229
  value: strVal,
239
230
  ...restVal
240
- } = getOnSaveData(value);
231
+ } = getOnSaveData(debouncedValue?.current);
241
232
  onsubmit(false, {
242
233
  strVal,
243
234
  restVal
@@ -251,7 +242,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
251
242
  const {
252
243
  value: strVal,
253
244
  ...restVal
254
- } = getOnSaveData(value);
245
+ } = getOnSaveData(debouncedValue?.current);
255
246
  onBlur({
256
247
  strVal,
257
248
  restVal
@@ -272,7 +263,7 @@ const ChatEditor = /*#__PURE__*/forwardRef((props, ref) => {
272
263
  editor: editor,
273
264
  children: /*#__PURE__*/_jsxs(Slate, {
274
265
  editor: editor,
275
- initialValue: value,
266
+ initialValue: debouncedValue?.current,
276
267
  onChange: handleEditorChange,
277
268
  children: [toolBar && /*#__PURE__*/_jsx(MiniTextFormat, {
278
269
  classes: classes,
@@ -399,7 +399,7 @@ blockquote {
399
399
  align-items: center;
400
400
  border-width: 0px, 0px, 0px, 0px;
401
401
  border-style: solid;
402
- border-color: #2563EB;
402
+ border-color: #2563EB66;
403
403
  justify-content: center;
404
404
  flex-direction: column;
405
405
  width: 100%;
@@ -492,9 +492,9 @@ blockquote {
492
492
 
493
493
  .MuiButton-root.primaryBtn.disabled,
494
494
  .MuiButton-root.secondaryBtn.disabled {
495
- background: #eee !important;
496
- color: #ccc !important;
497
- border: 1px solid #ccc !important;
495
+ background: #eee;
496
+ color: #ccc;
497
+ border: 1px solid #ccc;
498
498
  }
499
499
 
500
500
  .MuiButton-root.secondaryBtn {
@@ -622,7 +622,21 @@ blockquote {
622
622
  }
623
623
 
624
624
  .MuiIconButton-root.btnActive {
625
- background-color: #ccc;
625
+ svg path {
626
+ stroke: #2563EB;
627
+ }
628
+
629
+ svg text,
630
+ svg circle,
631
+ .fill-svg,
632
+ .fill-path,
633
+ .fill-path path {
634
+ fill: #2563EB;
635
+ }
636
+
637
+ path.fill-path {
638
+ stroke: none;
639
+ }
626
640
  }
627
641
 
628
642
  .embed .element-toolbar {
@@ -1221,7 +1235,10 @@ blockquote {
1221
1235
  @media (max-width: 899px) {
1222
1236
  .MuiPopover-root {
1223
1237
  z-index: 1302 !important;
1224
- }
1238
+ }
1239
+ canvas {
1240
+ max-width: 100% !important;
1241
+ }
1225
1242
  }
1226
1243
 
1227
1244
  .settingsHeader {
@@ -1242,4 +1259,5 @@ blockquote {
1242
1259
 
1243
1260
  .hideScroll::-webkit-scrollbar-thumb:hover {
1244
1261
  background: none !important;
1245
- }
1262
+ }
1263
+
@@ -71,7 +71,6 @@ function AIInput({
71
71
  }, [openAI]);
72
72
  const isSendBtnDisabled = !inputValue || loading;
73
73
  const props = getProps(openAI, generatedText) || {};
74
- const fromToolBar = openAI === "fromToolBar";
75
74
  const handleSendBtnClick = () => {
76
75
  if (isSendBtnDisabled) {
77
76
  return;
@@ -142,13 +142,13 @@ const Styles = theme => ({
142
142
  gap: "8px"
143
143
  },
144
144
  "&:hover": {
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
- }
145
+ backgroundColor: `${theme?.palette?.editor?.menuOptionSelectedOption} !important`
146
+ },
147
+ "& svg path": {
148
+ stroke: `${theme?.palette?.editor?.menuOptionTextColor} !important`
149
+ },
150
+ "& svg": {
151
+ color: `${theme?.palette?.editor?.menuOptionTextColor} !important`
152
152
  },
153
153
  "&.active": {
154
154
  background: `${theme?.palette?.containers?.bg3 || "#E9F3FE"}`,
@@ -64,7 +64,7 @@ const LinkButton = props => {
64
64
  title: "Link",
65
65
  arrow: true,
66
66
  children: /*#__PURE__*/_jsx(IconButton, {
67
- className: `${showInput ? "clicked" : ""} ${isActive ? "btnActive" : ""}`,
67
+ className: `${showInput ? "clicked btnActive" : ""} ${isActive ? "btnActive" : ""}`,
68
68
  format: "link",
69
69
  onClick: toggleLink,
70
70
  children: /*#__PURE__*/_jsx(Icon, {
@@ -110,8 +110,8 @@ const SearchButton = /*#__PURE__*/forwardRef((props, ref) => {
110
110
  children: /*#__PURE__*/_jsx(Paper, {
111
111
  sx: {
112
112
  width: '100%',
113
- background: theme?.palette?.background?.paper,
114
- borderColor: theme?.palette?.type === 'dark' ? theme?.palette?.primary?.border2 : 'transparent'
113
+ background: theme?.palette?.editor?.miniToolBarBackground,
114
+ borderColor: theme?.palette?.type === 'dark' ? theme?.palette?.editor?.popUpBorderColor : 'transparent'
115
115
  },
116
116
  children: /*#__PURE__*/_jsx(SearchAndDocList, {
117
117
  mapData: mapData,
@@ -143,9 +143,9 @@ const SearchButton = /*#__PURE__*/forwardRef((props, ref) => {
143
143
  sx: {
144
144
  padding: 0,
145
145
  width: '330px',
146
- background: theme?.palette?.background?.paper,
146
+ background: theme?.palette?.editor?.miniToolBarBackground,
147
147
  border: '1px solid',
148
- borderColor: theme?.palette?.type === 'dark' ? theme?.palette?.primary?.border2 : 'transparent',
148
+ borderColor: theme?.palette?.type === 'dark' ? theme?.palette?.editor?.popUpBorderColor : 'transparent',
149
149
  borderRadius: '12px',
150
150
  '&.MuiPaper-root-MuiPopover-paper': {
151
151
  borderRadius: '12px !important'
@@ -36,7 +36,7 @@ const SearchAndDocList = ({
36
36
  sx: {
37
37
  borderRadius: "6px",
38
38
  backgroundColor: theme?.palette?.containers?.bg7,
39
- border: theme?.palette?.type === 'dark' ? `1px solid ${theme?.palette?.primary?.border2}` : '',
39
+ border: theme?.palette?.type === 'dark' ? `1px solid ${theme?.palette?.editor?.popUpBorderColor}` : '',
40
40
  padding: "5px",
41
41
  "&:hover": {
42
42
  backgroundColor: theme?.palette?.containers?.bg8,
@@ -111,24 +111,27 @@ const SearchAndDocList = ({
111
111
  maxHeight: '400px',
112
112
  minWidth: "275px",
113
113
  overflowY: 'auto',
114
+ overflowX: 'hidden',
114
115
  padding: '0px 16px 8px',
115
116
  marginBottom: '20px',
116
117
  scrollbarWidth: "thin",
117
118
  scrollbarColor: `${theme?.palette?.primary?.slashBrainBorder} transparent`,
118
119
  "&::-webkit-scrollbar": {
119
120
  width: "3px",
120
- height: "3px !important"
121
+ height: "3px !important",
122
+ borderRadius: "10px"
121
123
  },
122
124
  "&::-webkit-scrollbar-thumb": {
123
125
  backgroundColor: theme?.palette?.primary?.slashBrainBorder,
124
- borderRadius: "4px",
126
+ borderRadius: "10px",
125
127
  width: "3px !important"
126
128
  },
127
129
  "&::-webkit-scrollbar-thumb:hover": {
128
130
  backgroundColor: theme?.palette?.primary?.slashBrainBorder
129
131
  },
130
132
  "&::-webkit-scrollbar-track": {
131
- background: "transparent"
133
+ background: "transparent",
134
+ borderRadius: "10px"
132
135
  }
133
136
  },
134
137
  children: [mapData?.map((doc, index) => {
@@ -206,7 +209,6 @@ const SearchAndDocList = ({
206
209
  justifyContent: "center",
207
210
  alignItems: 'center',
208
211
  sx: {
209
- minWidth: "330px",
210
212
  minHeight: '400px',
211
213
  padding: '0px 16px 8px',
212
214
  position: 'absolute'
@@ -471,7 +471,8 @@ const SignaturePopup = props => {
471
471
  classes: classes,
472
472
  value: brush.color,
473
473
  onSave: onBrushColor,
474
- recentColors: []
474
+ recentColors: [],
475
+ hideGradient: true
475
476
  }), /*#__PURE__*/_jsx("span", {
476
477
  style: {
477
478
  marginLeft: "10px",
@@ -515,7 +516,7 @@ const SignaturePopup = props => {
515
516
  children: "Delete"
516
517
  }) : null, /*#__PURE__*/_jsx(Button, {
517
518
  onClick: handleSave,
518
- className: `primaryBtn actionBtn ${isEmpty ? "disabled" : ""}`,
519
+ className: `primaryBtn actionBtn ${isEmpty ? "disabled disabledSaveBtn" : ""}`,
519
520
  disabled: isEmpty,
520
521
  children: "Save"
521
522
  })]
@@ -59,11 +59,12 @@ function AddRowCol(props) {
59
59
  children: /*#__PURE__*/_jsx(Button, {
60
60
  sx: {
61
61
  fontSize: "14px",
62
- border: "1px dotted #8DA8E3",
63
- color: "#2563EB",
62
+ border: "1px dashed #8DA8E3",
63
+ color: "#2563EB !important",
64
64
  padding: "0px 4px",
65
65
  minWidth: "unset",
66
66
  lineHeight: "18px",
67
+ fontWeight: "lighter !important",
67
68
  ...buttonStyle,
68
69
  opacity: showBtn ? 1 : 0
69
70
  },
@@ -73,7 +73,7 @@ function DragButton({
73
73
  modifiers: [{
74
74
  name: "offset",
75
75
  options: {
76
- offset: [0, -14] // align the drag icon by -8
76
+ offset: [0, -12]
77
77
  }
78
78
  }, {
79
79
  name: "flip",
@@ -81,7 +81,7 @@ function DragButton({
81
81
  }],
82
82
 
83
83
  disablePortal: dragType !== "row",
84
- className: className,
84
+ className: `${className}`,
85
85
  children: ({
86
86
  TransitionProps
87
87
  }) => /*#__PURE__*/_jsx(Fade, {
@@ -94,6 +94,10 @@ function DragButton({
94
94
  sx: dragType === "row" ? {
95
95
  transform: "rotate(90deg)"
96
96
  } : {},
97
+ className: `${showTool ? "active" : ""}`,
98
+ style: {
99
+ lineHeight: 0
100
+ },
97
101
  children: /*#__PURE__*/_jsx(IconButton, {
98
102
  onClick: () => {
99
103
  onDragClick();
@@ -1,43 +1,69 @@
1
- const DragStyles = theme => ({
2
- popper: {
3
- zIndex: 1000,
4
- "& .MuiPaper-root": {
5
- borderRadius: "4px !important",
6
- "&:hover": {
7
- border: `1px solid ${theme?.palatte?.editor?.activeColor || "#2563EB"}`
1
+ const DragStyles = theme => {
2
+ const {
3
+ containers,
4
+ editor
5
+ } = theme?.palette || {};
6
+ const {
7
+ buttonBorder,
8
+ background,
9
+ activeColor,
10
+ signaturePopUpTabButtonSelectedBg,
11
+ signaturePopUpTabButtonSelectedSvg
12
+ } = editor || {};
13
+ const onDragActive = {
14
+ outline: `1.5px solid ${activeColor || "#2563EB"}`,
15
+ background: `${signaturePopUpTabButtonSelectedBg} !important`,
16
+ "& svg ellipse": {
17
+ fill: `${signaturePopUpTabButtonSelectedSvg}`
18
+ }
19
+ };
20
+ return {
21
+ popper: {
22
+ zIndex: 1000,
23
+ "& .MuiPaper-root": {
24
+ borderRadius: "3px !important",
25
+ outline: `1.5px solid ${buttonBorder}`,
26
+ backgroundColor: `${background}`,
27
+ "&:hover": onDragActive,
28
+ "&.active": onDragActive
29
+ },
30
+ "& .MuiIconButton-root": {
31
+ padding: "4px 6px",
32
+ borderRadius: "none",
33
+ "& .dragIcon": {
34
+ width: "14px",
35
+ height: "10px"
36
+ },
37
+ "&:hover": {
38
+ background: "none"
39
+ }
8
40
  }
9
41
  },
10
- "& .MuiIconButton-root": {
11
- padding: "4px 8px",
12
- "&:hover": {
13
- background: "none"
42
+ toolPopper: {
43
+ zIndex: 4001,
44
+ "& .MuiPaper-root": {
45
+ borderRadius: "8px"
14
46
  }
15
- }
16
- },
17
- toolPopper: {
18
- zIndex: 4001,
19
- "& .MuiPaper-root": {
20
- borderRadius: "8px"
21
- }
22
- },
23
- mobileToolDrawer: {
24
- "& .customSelectContainer": {
25
- border: "none !important",
26
- padding: "0px !important"
27
- }
28
- },
29
- drawerContainer: {
30
- "&.MuiDrawer-root": {
31
- zIndex: 1301
32
47
  },
33
- "& .MuiDrawer-paper": {
34
- borderTopLeftRadius: 8,
35
- borderTopRightRadius: 8,
36
- backgroundColor: theme.palette.containers.card
48
+ mobileToolDrawer: {
49
+ "& .customSelectContainer": {
50
+ border: "none !important",
51
+ padding: "0px !important"
52
+ }
37
53
  },
38
- "& .customSelectContainer": {
39
- border: "none"
54
+ drawerContainer: {
55
+ "&.MuiDrawer-root": {
56
+ zIndex: 1301
57
+ },
58
+ "& .MuiDrawer-paper": {
59
+ borderTopLeftRadius: 8,
60
+ borderTopRightRadius: 8,
61
+ backgroundColor: containers?.card
62
+ },
63
+ "& .customSelectContainer": {
64
+ border: "none"
65
+ }
40
66
  }
41
- }
42
- });
67
+ };
68
+ };
43
69
  export default DragStyles;
@@ -59,7 +59,7 @@ const TableStyles = theme => ({
59
59
  right: "-2px",
60
60
  top: 0,
61
61
  background: "transparent",
62
- width: "4px",
62
+ width: "3px",
63
63
  borderRadius: "0px",
64
64
  zIndex: 1,
65
65
  "&:hover": {
@@ -8,7 +8,7 @@ import { useEditorContext, useEditorSelection } from "../../hooks/useMouseMove";
8
8
  import TableStyles from "./Styles";
9
9
  import "./table.css";
10
10
  import { groupByBreakpoint } from "../../helper/theme";
11
- import { TableProvider } from "../../hooks/useTable";
11
+ import useTable, { TableProvider } from "../../hooks/useTable";
12
12
  import AddRowCol from "./AddRowCol";
13
13
  import TableTool from "./TableTool";
14
14
  import { useDebouncedCallback } from "use-debounce";
@@ -30,7 +30,11 @@ const ToolBar = props => {
30
30
  handleAction,
31
31
  exandTools
32
32
  } = props;
33
- return selected && !showTool ? /*#__PURE__*/_jsxs(Box, {
33
+ const {
34
+ getSelectedCells
35
+ } = useTable();
36
+ const viewTool = selected && !showTool && getSelectedCells()?.length <= 1;
37
+ return viewTool ? /*#__PURE__*/_jsxs(Box, {
34
38
  component: "div",
35
39
  contentEditable: false,
36
40
  className: `tableToolBar ${exandTools ? "active" : ""}`,
@@ -185,7 +189,8 @@ const Table = props => {
185
189
  return /*#__PURE__*/_jsxs(TableProvider, {
186
190
  editor: editor,
187
191
  otherProps: {
188
- dragRowBtnCls
192
+ dragRowBtnCls,
193
+ tablePath: path
189
194
  },
190
195
  children: [/*#__PURE__*/_jsxs("div", {
191
196
  style: {
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect } from "react";
1
+ import React, { useState, useEffect, useMemo } from "react";
2
2
  import { Editor, Element, Path, Transforms } from "slate";
3
3
  import { Box } from "@mui/material";
4
4
  import { useSlateStatic, ReactEditor } from "slate-react";
@@ -190,11 +190,19 @@ const TableCell = props => {
190
190
  if (!contentEditable) {
191
191
  e.preventDefault();
192
192
  }
193
- updateTableSelection({
194
- startCellPath: path,
195
- endCellPath: [],
196
- isDragging: true
197
- });
193
+ if (
194
+ // for shift selection
195
+ e.shiftKey && startCellPath?.length && startCellPath.toString() !== path.toString()) {
196
+ updateTableSelection({
197
+ endCellPath: path
198
+ });
199
+ } else {
200
+ updateTableSelection({
201
+ startCellPath: path,
202
+ endCellPath: [],
203
+ isDragging: true
204
+ });
205
+ }
198
206
  };
199
207
  const onMouseUp = e => {
200
208
  if (startCellPath?.length) {
@@ -211,6 +219,7 @@ const TableCell = props => {
211
219
  const isCellSelected = selectionPath?.length && Path.equals(selectionPath, path);
212
220
  if (!isCellSelected) {
213
221
  // focus the clicked cell
222
+ ReactEditor.focus(editor);
214
223
  Transforms.select(editor, {
215
224
  anchor: Editor.end(editor, path),
216
225
  focus: Editor.end(editor, path)
@@ -225,10 +234,15 @@ const TableCell = props => {
225
234
  const cellId = path.toString() + "table-cell";
226
235
  const cellRef = document.getElementById(cellId);
227
236
  const contentEditable = !readOnly && isCellEditable(startCellPath, path);
228
- const commonTdProps = {
229
- id: cellId,
230
- contentEditable
231
- };
237
+ const commonTdProps = useMemo(() => {
238
+ const props = {
239
+ id: cellId
240
+ };
241
+ if (!contentEditable) {
242
+ props.contentEditable = false;
243
+ }
244
+ return props;
245
+ }, [contentEditable, cellId]);
232
246
  const handleTouchMove = e => {
233
247
  const touch = e.touches[0]; // Get the current touch point
234
248
  const element = document.elementFromPoint(touch.clientX, touch.clientY);
@@ -0,0 +1,83 @@
1
+ import { getNode } from "../../utils/helper";
2
+ import { serializeToText } from "../../utils/serializeToText";
3
+ export const getRectangleBounds = tableSelection => {
4
+ const {
5
+ startCellPath,
6
+ endCellPath
7
+ } = tableSelection;
8
+ if (!startCellPath?.length) return [];
9
+ const startPath = startCellPath.slice(0, -2);
10
+ const startCell = startCellPath.slice(-2);
11
+ const endCell = endCellPath.slice(-2);
12
+ const [startRow, startCol] = startCell;
13
+ const [endRow, endCol] = endCell?.length ? endCell : startCell;
14
+ const minRow = Math.min(startRow, endRow);
15
+ const maxRow = Math.max(startRow, endRow);
16
+ const minCol = Math.min(startCol, endCol);
17
+ const maxCol = Math.max(startCol, endCol);
18
+ const selectedPaths = [];
19
+ for (let row = minRow; row <= maxRow; row++) {
20
+ for (let col = minCol; col <= maxCol; col++) {
21
+ selectedPaths.push([...startPath, row, col]);
22
+ }
23
+ }
24
+ return selectedPaths;
25
+ };
26
+ export const createCopiedTableStructure = (editor, tableSelection, currentTableNode, tablePath, selectedText) => {
27
+ const selectedCells = getRectangleBounds(tableSelection);
28
+ const formattedCells = selectedCells.map(cell => cell.slice(-2));
29
+ const tableChild = [];
30
+ const rowIndexes = [...new Set(formattedCells.map(cell => cell[0]))];
31
+ rowIndexes.forEach((rowIndex, row_i) => {
32
+ const row = {
33
+ type: "table-row",
34
+ children: []
35
+ };
36
+
37
+ // Filter cells that belong to the current row
38
+ const cellsInRow = formattedCells.filter(cell => cell[0] === rowIndex);
39
+
40
+ // Iterate over the columns of the row to create table cells
41
+ const columnIndexes = [...new Set(cellsInRow.map(cell => cell[1]))];
42
+ columnIndexes.forEach((columnIndex, col_i) => {
43
+ const cellPath = [...tablePath, rowIndex, columnIndex];
44
+ const columnNode = getNode(editor, cellPath);
45
+ const cellNode = selectedText // we can select text in only one column
46
+ ? {
47
+ ...columnNode,
48
+ type: "table-cell",
49
+ children: [{
50
+ type: "paragraph",
51
+ children: [{
52
+ text: selectedText
53
+ }],
54
+ cellBgColor: "#FFFFFF"
55
+ }]
56
+ } : columnNode;
57
+ row.children.push(cellNode);
58
+ });
59
+ tableChild.push(row);
60
+ });
61
+ const table = {
62
+ ...currentTableNode,
63
+ children: tableChild,
64
+ rows: rowIndexes?.length,
65
+ columns: tableChild[0]?.children?.length // first row's children length
66
+ };
67
+
68
+ return table;
69
+ };
70
+ export const tableNodeToDom = (tableNode, selectedText) => {
71
+ const tableEle = document.createElement("table");
72
+ tableNode.children?.forEach(row => {
73
+ const rowEle = document.createElement("tr");
74
+ row?.children?.forEach(cell => {
75
+ const cellEle = document.createElement("td");
76
+ const cellText = selectedText || serializeToText(cell);
77
+ cellEle.innerHTML = cellText;
78
+ rowEle.appendChild(cellEle);
79
+ });
80
+ tableEle.appendChild(rowEle);
81
+ });
82
+ return tableEle;
83
+ };