@flozy/editor 1.7.9 → 1.8.0

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.
@@ -346,11 +346,11 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
346
346
  onChange: handleEditorChange,
347
347
  children: [/*#__PURE__*/_jsx(DragAndDrop, {
348
348
  children: /*#__PURE__*/_jsx(Overlay, {
349
- children: /*#__PURE__*/_jsxs(Box, {
349
+ children: /*#__PURE__*/_jsx(Box, {
350
350
  className: `${hasTopBanner() ? "has-topbanner" : ""}`,
351
351
  sx: classes.slateWrapper,
352
352
  id: "slate-wrapper-scroll-container",
353
- children: [/*#__PURE__*/_jsxs(Box, {
353
+ children: /*#__PURE__*/_jsxs(Box, {
354
354
  component: "div",
355
355
  className: "max-content",
356
356
  children: [renderTopBanner(), /*#__PURE__*/_jsx("div", {
@@ -397,15 +397,16 @@ const CommonEditor = /*#__PURE__*/forwardRef((props, ref) => {
397
397
  }), !readOnly ? /*#__PURE__*/_jsx(MiniToolbar, {
398
398
  customProps: customProps,
399
399
  toolbarOptions: toolbarOptions
400
- }) : null]
401
- }), readOnly && /*#__PURE__*/_jsx(Typography, {
402
- sx: {
403
- color: "rgb(100, 116, 139)",
404
- fontSize: "13px"
405
- },
406
- align: "center",
407
- children: footer
408
- })]
400
+ }) : null, footer && /*#__PURE__*/_jsx(Typography, {
401
+ sx: {
402
+ color: "rgb(100, 116, 139)",
403
+ fontSize: "13px",
404
+ paddingBottom: "12px"
405
+ },
406
+ align: "center",
407
+ children: footer
408
+ })]
409
+ })
409
410
  })
410
411
  })
411
412
  }), htmlAction.showInput && /*#__PURE__*/_jsx(CodeToText, {
@@ -17,7 +17,7 @@ const Attachments = props => {
17
17
  date
18
18
  } = element;
19
19
  const getLastName = url?.split("/").pop();
20
- const fileName = `${getLastName}`;
20
+ const fileName = `${decodeURI(getLastName)}`;
21
21
  return /*#__PURE__*/_jsxs(Box, {
22
22
  component: "div",
23
23
  className: "attachment-wrpr-ev2",
@@ -57,7 +57,7 @@ const CarouselItem = props => {
57
57
  className: "carousel-item-inner",
58
58
  style: {
59
59
  minHeight: "50px",
60
- display: "flex",
60
+ display: "block",
61
61
  justifyContent: "center",
62
62
  alignItems: "center"
63
63
  },
@@ -3,6 +3,7 @@ import { useSlateStatic, useSelected, ReactEditor } from "slate-react";
3
3
  import { Box } from "@mui/material";
4
4
  import { getPageSettings } from "../utils/pageSettings";
5
5
  import { invertColor } from "../helper";
6
+ import { isTextSelected } from "../utils/helper";
6
7
  import { jsx as _jsx } from "react/jsx-runtime";
7
8
  import { jsxs as _jsxs } from "react/jsx-runtime";
8
9
  const SimpleTextStyle = ({
@@ -68,8 +69,9 @@ const SimpleText = props => {
68
69
  });
69
70
  const selected = useSelected();
70
71
  const path = ReactEditor.findPath(editor, element);
71
- const showPlaceHolder = !readOnly && path.length === 1 && isEmpty && selected;
72
+ const showPlaceHolder = !readOnly && path.length === 1 && isEmpty;
72
73
  const isEmptyEditor = !readOnly && isEmpty && editor.children.length === 1 && !selected;
74
+ const opacity = !isTextSelected(editor?.selection);
73
75
  return /*#__PURE__*/_jsxs(Box, {
74
76
  ...element.attr,
75
77
  ...attributes,
@@ -77,7 +79,7 @@ const SimpleText = props => {
77
79
  sx: classes.root,
78
80
  children: [children, /*#__PURE__*/_jsx("span", {
79
81
  className: "placeholder-simple-text",
80
- children: isEmptyEditor ? editorPlaceholder || "Write Something..." : showPlaceHolder ? "Type / to browse elements" : ""
82
+ children: isEmptyEditor ? editorPlaceholder || "Write Something..." : showPlaceHolder ? opacity && selected ? "Type / to browse elements" : "" : ""
81
83
  })]
82
84
  });
83
85
  };
@@ -109,7 +109,6 @@ const TableCell = props => {
109
109
  width: size?.width || tableSize?.cellWidth
110
110
  } : {};
111
111
  const cellBorderColor = borderColor || rowProps?.borderColor || parentProps?.borderColor || entireBorderColor;
112
- console.log(borderColor, entireBorderColor);
113
112
  return /*#__PURE__*/_jsxs("td", {
114
113
  ...element.attr,
115
114
  ...attributes,
@@ -1,12 +1,15 @@
1
1
  import React, { useCallback, useRef, useState } from "react";
2
2
  import { createEditor } from "slate";
3
- import { Slate, Editable, withReact } from "slate-react";
3
+ import { Slate, Editable } from "slate-react";
4
4
  import { getBlock, getMarked } from "./utils/SlateUtilityFunctions";
5
5
  import { commands, mentionsEvent } from "./utils/events";
6
6
  import useMentions from "./hooks/useMentions";
7
7
  import Shorthands from "./common/Shorthands";
8
- // import withCommon from "./hooks/withCommon";
8
+ import BasicToolbar from "./Toolbar/Basic";
9
+ import withCommon from "./hooks/withCommon";
10
+ import "./Editor.css";
9
11
  import { jsx as _jsx } from "react/jsx-runtime";
12
+ import { jsxs as _jsxs } from "react/jsx-runtime";
10
13
  const initialValue = [{
11
14
  type: "paragraph",
12
15
  children: [{
@@ -21,6 +24,7 @@ const MiniEditor = props => {
21
24
  // editor: collaborativeEditor,
22
25
  readOnly,
23
26
  miniEditorPlaceholder,
27
+ toolbars,
24
28
  otherProps
25
29
  } = props;
26
30
  const {
@@ -28,13 +32,9 @@ const MiniEditor = props => {
28
32
  // needLayout = true,
29
33
  } = otherProps || {};
30
34
  const mentionsRef = useRef();
31
- const [editor] = useState(() => withReact(createEditor()));
32
-
33
- // const editor = useMemo(() => {
34
- // if (collaborativeEditor) return collaborativeEditor;
35
- // return withCommon(createEditor(), { needLayout });
36
- // }, [collaborativeEditor]);
37
-
35
+ const [editor] = useState(() => withCommon(createEditor(), {
36
+ needLayout: false
37
+ }));
38
38
  const isReadOnly = readOnly === "readonly";
39
39
  const customProps = {
40
40
  ...(otherProps || {}),
@@ -102,14 +102,16 @@ const MiniEditor = props => {
102
102
  customProps: customProps
103
103
  });
104
104
  }, []);
105
- return /*#__PURE__*/_jsx(Slate, {
105
+ return /*#__PURE__*/_jsxs(Slate, {
106
106
  editor: editor,
107
107
  initialValue: initialValue,
108
- children: /*#__PURE__*/_jsx(Editable, {
108
+ children: [/*#__PURE__*/_jsx(BasicToolbar, {
109
+ toolbars: toolbars || []
110
+ }), /*#__PURE__*/_jsx(Editable, {
109
111
  renderElement: renderElement,
110
112
  renderLeaf: renderLeaf,
111
113
  onKeyDown: onKeyDown
112
- })
114
+ })]
113
115
  });
114
116
  };
115
117
  MiniEditor.displayName = "MiniEditor";
@@ -0,0 +1,53 @@
1
+ import React, { useState } from "react";
2
+ import { useSlateStatic } from "slate-react";
3
+ import { Box, Tooltip } from "@mui/material";
4
+ import { toolbarGroups } from "../toolbarGroups";
5
+ import { MarkButton } from "../FormatTools";
6
+ import LinkButton from "../../Elements/Link/LinkButton";
7
+ import { addMarkData, isBlockActive } from "../../utils/SlateUtilityFunctions";
8
+ import ColorPickerButton from "../../common/ColorPickerButton";
9
+ import { colors } from "../../Elements/Color Picker/defaultColors";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { jsxs as _jsxs } from "react/jsx-runtime";
12
+ const allTools = toolbarGroups.flat();
13
+ const BasicToolbar = ({
14
+ toolbars
15
+ }) => {
16
+ const editor = useSlateStatic();
17
+
18
+ // state
19
+ const [activeColor, setActiveColor] = useState("#000000");
20
+ const fontStyle = allTools.filter(f => f.basic);
21
+ const link = allTools.find(f => f.format?.indexOf("link") >= 0);
22
+ const handleTextColor = color => {
23
+ setActiveColor(color);
24
+ addMarkData(editor, {
25
+ format: 'color',
26
+ value: color
27
+ });
28
+ };
29
+ return /*#__PURE__*/_jsxs(Box, {
30
+ component: 'div',
31
+ className: "basic-toolbar",
32
+ children: [fontStyle?.map((m, i) => {
33
+ return /*#__PURE__*/_jsx(MarkButton, {
34
+ editor: editor,
35
+ ...m
36
+ }, `pptool_mark_${i}_${m.id}`);
37
+ }), /*#__PURE__*/_jsx(LinkButton, {
38
+ active: isBlockActive(editor, link.format),
39
+ editor: editor
40
+ }, link.id), /*#__PURE__*/_jsx(Tooltip, {
41
+ arrow: true,
42
+ title: "Current Color",
43
+ children: /*#__PURE__*/_jsx(ColorPickerButton, {
44
+ value: activeColor || "#0000",
45
+ onSave: color => {
46
+ handleTextColor(color);
47
+ },
48
+ defaultColors: colors
49
+ })
50
+ })]
51
+ });
52
+ };
53
+ export default BasicToolbar;
@@ -45,12 +45,14 @@ export const toolbarGroups = [[{
45
45
  id: 3,
46
46
  format: "bold",
47
47
  type: "mark",
48
- title: "Bold"
48
+ title: "Bold",
49
+ basic: true
49
50
  }, {
50
51
  id: 4,
51
52
  format: "italic",
52
53
  type: "mark",
53
- title: "Italic"
54
+ title: "Italic",
55
+ basic: true
54
56
  }, {
55
57
  id: 5,
56
58
  format: "underline",
@@ -1,14 +1,15 @@
1
1
  import React, { useState } from "react";
2
2
  import { Grid, Button, Popover } from "@mui/material";
3
- // import ColorPicker from "react-best-gradient-color-picker";
4
3
  import ColorPickerTool from "react-gcolor-picker";
4
+ import { colors } from "../Elements/Color Picker/defaultColors";
5
5
  import { jsx as _jsx } from "react/jsx-runtime";
6
6
  import { jsxs as _jsxs } from "react/jsx-runtime";
7
7
  import { Fragment as _Fragment } from "react/jsx-runtime";
8
8
  const ColorPickerButton = props => {
9
9
  const {
10
10
  value,
11
- onSave
11
+ onSave,
12
+ defaultColors = []
12
13
  } = props;
13
14
  const [anchorEl, setAnchorEl] = useState(null);
14
15
  const [color, setColor] = useState(value);
@@ -60,7 +61,8 @@ const ColorPickerButton = props => {
60
61
  children: /*#__PURE__*/_jsx(ColorPickerTool, {
61
62
  gradient: true,
62
63
  value: color,
63
- onChange: setColor
64
+ onChange: setColor,
65
+ defaultColors: defaultColors || []
64
66
  })
65
67
  }), /*#__PURE__*/_jsxs("div", {
66
68
  style: {
@@ -83,4 +85,7 @@ const ColorPickerButton = props => {
83
85
  })]
84
86
  });
85
87
  };
88
+ ColorPickerButton.defaultProps = {
89
+ defaultColors: [...colors]
90
+ };
86
91
  export default ColorPickerButton;
@@ -76,8 +76,11 @@ export function getEmbedURL(element) {
76
76
  }
77
77
  export const isEmptyTextNode = element => {
78
78
  try {
79
- const showPlaceholder = element?.children?.filter(f => HIDE_PLACHOLDERS.indexOf(f.type) > -1).length === 0;
80
- return Node.string(element)?.length === 0 && showPlaceholder;
79
+ if (element) {
80
+ const showPlaceholder = element?.children?.filter(f => HIDE_PLACHOLDERS.indexOf(f.type) > -1).length === 0;
81
+ return Node.string(element)?.length === 0 && showPlaceholder;
82
+ }
83
+ return false;
81
84
  } catch (err) {
82
85
  console.log(err);
83
86
  return false;
@@ -25,7 +25,6 @@ export const insertAttachments = (editor, data) => {
25
25
  ...data,
26
26
  type: url?.split(".").pop() === "pdf" ? "pdf" : "docs"
27
27
  });
28
- console.log(attachmentsNode);
29
28
  Transforms.insertNodes(editor, [attachmentsNode]);
30
29
  insertNewLine(editor);
31
30
  }
@@ -52,4 +52,23 @@ export const absoluteLink = url => {
52
52
  console.log(err);
53
53
  return url;
54
54
  }
55
+ };
56
+ export const isTextSelected = selection => {
57
+ try {
58
+ const {
59
+ anchor,
60
+ focus
61
+ } = selection || {};
62
+ if (anchor && focus) {
63
+ if (JSON.stringify(anchor?.path) !== JSON.stringify(focus?.path)) {
64
+ return true;
65
+ }
66
+ return false;
67
+ } else {
68
+ return false;
69
+ }
70
+ } catch (err) {
71
+ console.log(err);
72
+ return false;
73
+ }
55
74
  };
@@ -1,5 +1,22 @@
1
- import { Node } from "slate";
1
+ import { renderToString } from "react-dom/server";
2
+ import { getBlock } from "./SlateUtilityFunctions";
2
3
  const serializeToHTML = nodes => {
3
- return nodes.map(n => Node.string(n)).join("\n");
4
+ try {
5
+ const htmlString = nodes.map(n => {
6
+ if (n) {
7
+ const props = {
8
+ element: n,
9
+ children: n?.children
10
+ };
11
+ const reactString = renderToString(getBlock(props));
12
+ return reactString;
13
+ } else {
14
+ return "";
15
+ }
16
+ });
17
+ console.log(htmlString);
18
+ } catch (err) {
19
+ console.log(err);
20
+ }
4
21
  };
5
22
  export default serializeToHTML;
@@ -219,24 +219,21 @@ export class TableUtil {
219
219
  });
220
220
 
221
221
  // cell bg entire
222
- if (cellProps?.entireBgColor || tableProps?.borderColor) {
222
+ if (cellProps?.entireBgColor || tableProps?.borderColor || rowProps?.borderColor) {
223
223
  const {
224
- rows,
225
- columns
224
+ rows
226
225
  } = tableProps;
227
226
  for (let r = 0; r < rows; r++) {
228
- for (let c = 0; c < columns; c++) {
229
- Transforms.setNodes(this.editor, {
230
- entireBgColor: cellProps?.entireBgColor
231
- }, {
232
- at: [currentCellPath[0], r, currentCellPath[2]]
233
- });
234
- }
227
+ Transforms.setNodes(this.editor, {
228
+ entireBgColor: cellProps?.entireBgColor
229
+ }, {
230
+ at: [currentCellPath[0], r, currentCellPath[2]]
231
+ });
235
232
  }
236
233
  }
237
234
 
238
235
  // cell border all
239
- if (tableProps?.borderColor) {
236
+ if (tableProps?.borderColor || rowProps?.borderColor) {
240
237
  const {
241
238
  rows,
242
239
  columns
@@ -244,7 +241,8 @@ export class TableUtil {
244
241
  for (let r = 0; r < rows; r++) {
245
242
  for (let c = 0; c < columns; c++) {
246
243
  Transforms.setNodes(this.editor, {
247
- entireBorderColor: tableProps?.borderColor
244
+ entireBorderColor: tableProps?.borderColor,
245
+ rowBorder: rowProps?.borderColor
248
246
  }, {
249
247
  at: [currentCellPath[0], r, c]
250
248
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flozy/editor",
3
- "version": "1.7.9",
3
+ "version": "1.8.0",
4
4
  "description": "An Editor for flozy app brain",
5
5
  "files": [
6
6
  "dist"