@flozy/editor 4.9.5 → 4.9.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 {
@@ -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;
@@ -516,7 +516,7 @@ const SignaturePopup = props => {
516
516
  children: "Delete"
517
517
  }) : null, /*#__PURE__*/_jsx(Button, {
518
518
  onClick: handleSave,
519
- className: `primaryBtn actionBtn ${isEmpty ? "disabled" : ""}`,
519
+ className: `primaryBtn actionBtn ${isEmpty ? "disabled disabledSaveBtn" : ""}`,
520
520
  disabled: isEmpty,
521
521
  children: "Save"
522
522
  })]
@@ -2,6 +2,7 @@ import React from "react";
2
2
  import { Select, MenuItem } from "@mui/material";
3
3
  import { addMarkData, activeMark } from "../../utils/SlateUtilityFunctions.js";
4
4
  import { fontFamilyMap } from "../../utils/font";
5
+ import KeyboardArrowDownRoundedIcon from '@mui/icons-material/KeyboardArrowDownRounded';
5
6
  import { jsx as _jsx } from "react/jsx-runtime";
6
7
  const Dropdown = ({
7
8
  classes,
@@ -29,6 +30,7 @@ const Dropdown = ({
29
30
  }
30
31
  },
31
32
  sx: classes.textFormatSelect,
33
+ IconComponent: KeyboardArrowDownRoundedIcon,
32
34
  children: options.map((item, index) => /*#__PURE__*/_jsx(MenuItem
33
35
  // style={{ fontFamily: item.text }}
34
36
  , {
@@ -3,6 +3,7 @@ import { Autocomplete, TextField } from "@mui/material";
3
3
  import { activeMark, addMarkData } from "../../utils/SlateUtilityFunctions.js";
4
4
  import usePopupStyle from "../PopupTool/PopupToolStyle.js";
5
5
  import { useEditorContext } from "../../hooks/useMouseMove.js";
6
+ import KeyboardArrowDownRoundedIcon from '@mui/icons-material/KeyboardArrowDownRounded';
6
7
  import { jsx as _jsx } from "react/jsx-runtime";
7
8
  const FontFamilyAutocomplete = ({
8
9
  editor,
@@ -57,6 +58,7 @@ const FontFamilyAutocomplete = ({
57
58
  children: option
58
59
  });
59
60
  },
61
+ popupIcon: /*#__PURE__*/_jsx(KeyboardArrowDownRoundedIcon, {}),
60
62
  renderInput: params => /*#__PURE__*/_jsx(TextField, {
61
63
  sx: {
62
64
  "& .MuiInputBase-root.MuiOutlinedInput-root": {
@@ -96,8 +96,29 @@ const usePopupStyle = theme => ({
96
96
  width: "100%",
97
97
  maxHeight: "fit-content"
98
98
  },
99
+ "& .MuiTab-root": {
100
+ textTransform: "capitalize",
101
+ color: "#64748B",
102
+ borderBottom: `1.5px solid ${theme?.palette?.editor?.deviderBgColor}`
103
+ },
104
+ "& .Mui-selected": {
105
+ color: `${theme?.palette?.editor?.textColor} !important`,
106
+ fontWeight: "700 !important"
107
+ },
108
+ "& .MuiTabs-indicator": {
109
+ background: "#2563EB"
110
+ },
111
+ "& .MuiTabScrollButton-horizontal": {
112
+ borderBottom: "unset !important"
113
+ },
99
114
  "@media only screen and (max-width: 599px)": {
100
115
  width: "330px"
116
+ },
117
+ "& .MuiCardContent-root": {
118
+ color: theme?.palette?.editor?.textColor,
119
+ fontFamily: "Inter, sans-serif",
120
+ fontSize: "12px",
121
+ fontWeight: "500"
101
122
  }
102
123
  },
103
124
  "& .headerContainer": {},
@@ -122,6 +143,38 @@ const usePopupStyle = theme => ({
122
143
  fill: theme?.palette?.type === "dark" ? "none" : ""
123
144
  }
124
145
  },
146
+ "& .signatureElementIcon": {
147
+ "& path": {
148
+ fill: `${theme?.palette?.editor?.closeButtonSvgStroke}`
149
+ }
150
+ },
151
+ "& .commonSvgStyle": {
152
+ "& path": {
153
+ stroke: `${theme?.palette?.editor?.closeButtonSvgStroke}`
154
+ }
155
+ },
156
+ "& .commonSvgStyle2": {
157
+ "& path": {
158
+ stroke: `${theme?.palette?.editor?.closeButtonSvgStroke}`
159
+ }
160
+ },
161
+ "& .colorBoxElementIcon": {
162
+ "& path": {
163
+ stroke: `${theme?.palette?.editor?.closeButtonSvgStroke}`,
164
+ fill: "none"
165
+ }
166
+ },
167
+ "& .gridElementIcon": {
168
+ "& path": {
169
+ stroke: `${theme?.palette?.editor?.closeButtonSvgStroke}`,
170
+ fill: `${theme?.palette?.editor?.closeButtonSvgStroke}`
171
+ }
172
+ },
173
+ "& .newLineElementIcon": {
174
+ "& path": {
175
+ fill: `${theme?.palette?.editor?.closeButtonSvgStroke}`
176
+ }
177
+ },
125
178
  "&:hover": {
126
179
  backgroundColor: `${theme?.palette?.editor?.menuOptionSelectedOption} !important`,
127
180
  "& .signatureElementIcon": {
@@ -194,6 +247,11 @@ const usePopupStyle = theme => ({
194
247
  },
195
248
  "@media only screen and (max-width: 599px)": {
196
249
  width: "330px"
250
+ },
251
+ "& .textFormatMUIIcon": {
252
+ "& svg": {
253
+ color: theme?.palette?.editor?.closeButtonSvgStroke
254
+ }
197
255
  }
198
256
  },
199
257
  textFormatLabel: {
@@ -290,9 +348,10 @@ const usePopupStyle = theme => ({
290
348
  autoCompleteaFontFamily: {
291
349
  "& .MuiOutlinedInput-root": {
292
350
  borderRadius: "8px",
293
- backgroundColor: `${theme?.palette?.editor?.inputFieldBgColor} !important`,
351
+ backgroundColor: `${theme?.palette?.editor?.inputFieldBgColor}`,
294
352
  fontSize: "14px",
295
- height: "36px"
353
+ height: "36px",
354
+ paddingLeft: "15px !important"
296
355
  },
297
356
  "& .MuiOutlinedInput-notchedOutline": {
298
357
  border: `1px solid ${theme?.palette?.editor?.inputFieldBorder} !important`
@@ -470,7 +529,8 @@ const usePopupStyle = theme => ({
470
529
  },
471
530
  "& .colorPicker": {
472
531
  background: theme?.palette?.editor?.inputFieldBgColor,
473
- borderRadius: "0px 7px 7px 0px"
532
+ borderRadius: "0px 7px 7px 0px",
533
+ padding: "0px"
474
534
  },
475
535
  "& .vl": {
476
536
  background: theme?.palette?.editor?.borderColor,
@@ -511,7 +571,8 @@ const usePopupStyle = theme => ({
511
571
  },
512
572
  "& .colorPicker": {
513
573
  background: theme?.palette?.editor?.inputFieldBgColor,
514
- borderRadius: "0px 7px 7px 0px"
574
+ borderRadius: "0px 7px 7px 0px",
575
+ padding: "0px"
515
576
  },
516
577
  "& .vl": {
517
578
  background: theme?.palette?.editor?.borderColor,
@@ -696,8 +757,11 @@ const usePopupStyle = theme => ({
696
757
  }
697
758
  },
698
759
  "& .default-color-panel": {
760
+ gridTemplateColumns: "repeat(auto-fill, 24px)",
699
761
  "& .default-color-panel_item": {
700
- borderRadius: "50%"
762
+ borderRadius: "50%",
763
+ width: "16px",
764
+ height: "16px"
701
765
  }
702
766
  }
703
767
  },
@@ -818,17 +882,18 @@ const usePopupStyle = theme => ({
818
882
  "& .MuiPopover-paper": {
819
883
  maxHeight: "140px",
820
884
  // minWidth: "130px",
821
- border: "1px solid #E4E8EB",
822
- background: `${theme?.palette?.editor?.background} !important`,
885
+ // border: "1px solid #E4E8EB",
886
+ background: `${theme?.palette?.editor?.textWeightPopUpBackground} !important`,
823
887
  overflowY: "scroll",
824
- padding: "6px 12px 6px 0px",
888
+ padding: "3px 12px 8px 2px",
889
+ borderRadius: "8px",
825
890
  "@media only screen and (max-width: 600px)": {
826
891
  marginTop: "-40px"
827
892
  }
828
893
  },
829
894
  "& .customSelectOptionLabel": {
830
895
  color: theme?.palette?.editor?.textColor || "black",
831
- margin: "0px 6px 0px 6px",
896
+ margin: "6px 6px 0px 6px",
832
897
  width: "100%",
833
898
  justifyContent: "start",
834
899
  paddingRight: "20px",
@@ -841,8 +906,40 @@ const usePopupStyle = theme => ({
841
906
  background: `${theme?.palette?.action?.selected} !important`
842
907
  },
843
908
  "&.selected": {
844
- color: `#2563EB !important`,
845
- background: `#E9F3FE !important`
909
+ color: `${theme?.palette?.editor?.menuOptionTextColor} !important`,
910
+ background: `${theme?.palette?.editor?.menuOptionSelectedOption} !important`,
911
+ "& .orderedListIcon": {
912
+ "& path": {
913
+ stroke: `${theme?.palette?.editor?.menuOptionsSelectedTextColor}`
914
+ },
915
+ "& text": {
916
+ fill: `${theme?.palette?.editor?.menuOptionsSelectedTextColor}`
917
+ }
918
+ },
919
+ "& .bulletedListTextIcon": {
920
+ "& path": {
921
+ fill: `${theme?.palette?.editor?.menuOptionsSelectedTextColor}`,
922
+ stroke: `${theme?.palette?.editor?.menuOptionsSelectedTextColor}`
923
+ },
924
+ "& circle": {
925
+ fill: `${theme?.palette?.editor?.menuOptionsSelectedTextColor}`
926
+ }
927
+ },
928
+ "& .checkedListTextIcon": {
929
+ "& path": {
930
+ stroke: `${theme?.palette?.editor?.menuOptionsSelectedTextColor}`
931
+ }
932
+ },
933
+ "& .accordianIconSvgTextFormat": {
934
+ "& path": {
935
+ stroke: `${theme?.palette?.editor?.menuOptionsSelectedTextColor} !important`
936
+ }
937
+ },
938
+ "& .textAlignIconSameStyles": {
939
+ "& path": {
940
+ fill: `${theme?.palette?.editor?.menuOptionsSelectedTextColor}`
941
+ }
942
+ }
846
943
  }
847
944
  },
848
945
  "& .menuOptions": {
@@ -125,6 +125,7 @@ const TextFormat = props => {
125
125
  item: true,
126
126
  xs: 12,
127
127
  sx: classes.textFormatField,
128
+ className: "textFormatMUIIcon",
128
129
  children: /*#__PURE__*/_jsx(FontFamilyAutocomplete, {
129
130
  classes: classes,
130
131
  ...fontFamilies,
@@ -147,6 +148,7 @@ const TextFormat = props => {
147
148
  item: true,
148
149
  xs: 12,
149
150
  sx: classes.textFormatField3,
151
+ className: "textFormatMUIIcon",
150
152
  children: /*#__PURE__*/_jsx(Dropdown, {
151
153
  classes: classes,
152
154
  ...fontWeight,
@@ -43,9 +43,10 @@ const ColorPickerButton = props => {
43
43
  background: value,
44
44
  height: "22px",
45
45
  minWidth: "22px",
46
- borderRadius: "26px",
47
- border: "2px solid #E7E7E7"
46
+ borderRadius: "26px"
47
+ // border: "2px solid #E7E7E7",
48
48
  },
49
+
49
50
  onClick: handleColorPicker
50
51
  }), /*#__PURE__*/_jsx(Popover, {
51
52
  open: open,
@@ -123,13 +123,7 @@ const usePopupStyles = theme => ({
123
123
  "& path": {
124
124
  stroke: `${theme?.palette?.editor?.menuOptionsSelectedTextColor} !important`
125
125
  }
126
- },
127
- "& .commonSvgStyle2": {
128
- background: "red !important"
129
126
  }
130
- },
131
- "& .renderComp": {
132
- backgroundColor: "red !important"
133
127
  }
134
128
  },
135
129
  "&:hover": {
@@ -162,7 +156,7 @@ const usePopupStyles = theme => ({
162
156
  marginBottom: "10px",
163
157
  fontSize: "14px",
164
158
  fontWeight: "bold",
165
- borderBottom: "1px solid #DCE4EC"
159
+ borderBottom: `1px solid ${theme?.palette?.editor?.deviderBgColor}`
166
160
  },
167
161
  listItem: {
168
162
  cursor: "pointer",
@@ -14,7 +14,7 @@ import BoundaryLine from "./GuideLines/BoundaryLine";
14
14
  import ContextMenu from "./ContextMenu";
15
15
  import VirtualElement from "./VirtualElement";
16
16
  import { ItemTypes } from "./ElementSettings/settingsConstants";
17
- import { focusSelection, clearSelection } from "../../helper";
17
+ import { clearSelection } from "../../helper";
18
18
  import { selectText } from "../../utils/helper";
19
19
  import { removeSign } from "./ElementSettings/OtherSettings";
20
20
  import useDragging from "../../hooks/useDragging";
@@ -134,8 +134,7 @@ const useCommonStyle = theme => ({
134
134
  }
135
135
  },
136
136
  "& .active ": {
137
- border: `1px solid #2563EB !important`,
138
- background: `${theme?.palette?.editor?.signaturePopUpTabButtonSelectedBg} !important`
137
+ border: `1px solid #2563EB !important`
139
138
  }
140
139
  },
141
140
  "& .MuiTab-root": {
@@ -181,6 +180,11 @@ const useCommonStyle = theme => ({
181
180
  border: `1px solid ${theme?.palette?.editor?.closeButtonBorder} !important`
182
181
  }
183
182
  }
183
+ },
184
+ "& .disabledSaveBtn": {
185
+ background: "#2563EB33 !important",
186
+ color: theme?.palette?.type === "dark" && "#FFFFFF33 !important",
187
+ border: "1px solid #2563EB33 !important"
184
188
  }
185
189
  },
186
190
  popupTitle2: {
@@ -15,6 +15,20 @@ const LIST_FORMAT_TYPE = {
15
15
  unorderedList: "list-item"
16
16
  };
17
17
  const NEWLINESAFTER = ["headingOne", "headingTwo", "headingThree"];
18
+ export const serializeMentions = node => {
19
+ try {
20
+ if (node?.type === 'mention') {
21
+ return [node.character];
22
+ }
23
+ let children = Array.isArray(node) ? node : node?.children;
24
+ children = children && Array.isArray(children) ? children : [];
25
+ let mentions = children.map(child => serializeMentions(child)).flat();
26
+ return mentions.filter(Boolean);
27
+ } catch (err) {
28
+ console.log(err);
29
+ return [];
30
+ }
31
+ };
18
32
  export const toggleBlock = (editor, format, selection = true, attr = {}) => {
19
33
  const isActive = isBlockActive(editor, format);
20
34
  const isList = list_types.includes(format);
@@ -5,7 +5,6 @@ import { insertAccordion } from "./accordion";
5
5
  import { isListItem } from "./helper";
6
6
  import RnDCtrlCmds from "./RnD/RnDCtrlCmds";
7
7
  import EDITORCMDS from "../common/EditorCmds";
8
- import { ReactEditor } from "slate-react";
9
8
  const HOTKEYS = {
10
9
  b: "bold",
11
10
  i: "italic",
@@ -2,6 +2,8 @@ export const serializeToText = node => {
2
2
  try {
3
3
  if (!node?.type && node?.text) {
4
4
  return node?.text;
5
+ } else if (node?.type === 'mention') {
6
+ return '@' + node?.character?.name || '';
5
7
  }
6
8
  let n = Array.isArray(node) ? node : node?.children;
7
9
  n = n && Array.isArray(n) ? n : n ? [n] : [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flozy/editor",
3
- "version": "4.9.5",
3
+ "version": "4.9.6",
4
4
  "description": "An Editor for flozy app brain",
5
5
  "files": [
6
6
  "dist"