@flozy/editor 1.1.2 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. package/dist/Editor/CollaborativeEditor.js +7 -2
  2. package/dist/Editor/CommonEditor.js +53 -34
  3. package/dist/Editor/Editor.css +93 -17
  4. package/dist/Editor/Elements/Accordion/Accordion.js +67 -2
  5. package/dist/Editor/Elements/Accordion/AccordionBtnPopup.js +20 -0
  6. package/dist/Editor/Elements/Accordion/AccordionButton.js +2 -1
  7. package/dist/Editor/Elements/Accordion/AccordionSummary.js +59 -4
  8. package/dist/Editor/Elements/Accordion/AccordionTitlePopup.js +20 -0
  9. package/dist/Editor/Elements/Button/ButtonPopup.js +20 -0
  10. package/dist/Editor/Elements/Button/ButtonToolIcon.js +19 -0
  11. package/dist/Editor/Elements/Button/EditorButton.js +124 -0
  12. package/dist/Editor/Elements/Carousel/Arrows.js +39 -0
  13. package/dist/Editor/Elements/Carousel/Carousel.js +82 -0
  14. package/dist/Editor/Elements/Carousel/CarouselButton.js +19 -0
  15. package/dist/Editor/Elements/Carousel/CarouselItem.js +13 -0
  16. package/dist/Editor/Elements/Carousel/slick-theme.min.css +143 -0
  17. package/dist/Editor/Elements/Carousel/slick.min.css +83 -0
  18. package/dist/Editor/Elements/Color Picker/ColorPicker.js +1 -1
  19. package/dist/Editor/Elements/Embed/Embed.css +22 -2
  20. package/dist/Editor/Elements/Embed/Embed.js +89 -74
  21. package/dist/Editor/Elements/Embed/EmbedPopup.js +23 -0
  22. package/dist/Editor/Elements/Embed/Image.js +92 -10
  23. package/dist/Editor/Elements/Embed/Video.js +1 -0
  24. package/dist/Editor/Elements/Equation/EquationButton.js +12 -12
  25. package/dist/Editor/Elements/Grid/Grid.js +64 -8
  26. package/dist/Editor/Elements/Grid/GridButton.js +2 -4
  27. package/dist/Editor/Elements/Grid/GridItem.js +59 -5
  28. package/dist/Editor/Elements/Grid/GridItemPopup.js +20 -0
  29. package/dist/Editor/Elements/Grid/GridPopup.js +22 -0
  30. package/dist/Editor/Elements/ID/Id.js +1 -1
  31. package/dist/Editor/Elements/ImageText/ImageText.js +14 -0
  32. package/dist/Editor/Elements/ImageText/ImageTextWrapper.js +14 -0
  33. package/dist/Editor/Elements/Link/LinkButton.js +1 -1
  34. package/dist/Editor/Elements/NewLine/NewLineButton.js +2 -1
  35. package/dist/Editor/Elements/PageSettings/PageSettingsButton.js +88 -0
  36. package/dist/Editor/Elements/PageSettings/PageSettingsPopup.js +22 -0
  37. package/dist/Editor/Elements/Signature/Signature.js +4 -2
  38. package/dist/Editor/Elements/Signature/SignatureButton.js +2 -1
  39. package/dist/Editor/Elements/Signature/SignatureOptions/DrawSignature.js +7 -2
  40. package/dist/Editor/Elements/Signature/SignatureOptions/TypeSignature.js +2 -1
  41. package/dist/Editor/Elements/Signature/SignatureOptions/UploadSignature.js +50 -0
  42. package/dist/Editor/Elements/Signature/SignatureOptions/index.js +2 -1
  43. package/dist/Editor/Elements/Signature/SignaturePopup.js +79 -10
  44. package/dist/Editor/Elements/Table/DeleteCellIcon.js +24 -0
  45. package/dist/Editor/Elements/Table/DeleteRowIcon.js +24 -0
  46. package/dist/Editor/Elements/Table/Table.js +9 -1
  47. package/dist/Editor/Elements/Table/TableCell.js +181 -0
  48. package/dist/Editor/Elements/Table/TablePopup.js +22 -0
  49. package/dist/Editor/Elements/Table/TableRow.js +31 -0
  50. package/dist/Editor/Elements/Table/TableSelector.js +62 -68
  51. package/dist/Editor/Toolbar/Toolbar.js +22 -7
  52. package/dist/Editor/Toolbar/styles.css +20 -11
  53. package/dist/Editor/Toolbar/toolbarGroups.js +9 -9
  54. package/dist/Editor/common/Button.js +4 -8
  55. package/dist/Editor/common/StyleBuilder/accordionTitleBtnStyle.js +23 -0
  56. package/dist/Editor/common/StyleBuilder/accordionTitleStyle.js +35 -0
  57. package/dist/Editor/common/StyleBuilder/buttonStyle.js +47 -0
  58. package/dist/Editor/common/StyleBuilder/embedImageStyle.js +63 -0
  59. package/dist/Editor/common/StyleBuilder/fieldTypes/alignment.js +88 -0
  60. package/dist/Editor/common/StyleBuilder/fieldTypes/backgroundImage.js +87 -0
  61. package/dist/Editor/common/StyleBuilder/fieldTypes/bannerSpacing.js +136 -0
  62. package/dist/Editor/common/StyleBuilder/fieldTypes/borderRadius.js +126 -0
  63. package/dist/Editor/common/StyleBuilder/fieldTypes/color.js +89 -0
  64. package/dist/Editor/common/StyleBuilder/fieldTypes/elementSize.js +110 -0
  65. package/dist/Editor/common/StyleBuilder/fieldTypes/gridSize.js +42 -0
  66. package/dist/Editor/common/StyleBuilder/fieldTypes/imageTexts.js +75 -0
  67. package/dist/Editor/common/StyleBuilder/fieldTypes/index.js +21 -0
  68. package/dist/Editor/common/StyleBuilder/fieldTypes/text.js +46 -0
  69. package/dist/Editor/common/StyleBuilder/gridItemStyle.js +51 -0
  70. package/dist/Editor/common/StyleBuilder/gridStyle.js +51 -0
  71. package/dist/Editor/common/StyleBuilder/index.js +114 -0
  72. package/dist/Editor/common/StyleBuilder/pageSettingsStyle.js +10 -0
  73. package/dist/Editor/common/StyleBuilder/tableStyle.js +38 -0
  74. package/dist/Editor/common/Uploader.js +87 -0
  75. package/dist/Editor/plugins/withEmbeds.js +12 -5
  76. package/dist/Editor/plugins/withTable.js +5 -4
  77. package/dist/Editor/service/fileupload.js +17 -0
  78. package/dist/Editor/utils/SlateUtilityFunctions.js +46 -12
  79. package/dist/Editor/utils/button.js +11 -0
  80. package/dist/Editor/utils/carousel.js +13 -0
  81. package/dist/Editor/utils/carouselItem.js +19 -0
  82. package/dist/Editor/utils/customHooks/useContextMenu.js +8 -8
  83. package/dist/Editor/utils/customHooks/useResize.js +1 -1
  84. package/dist/Editor/utils/font.js +4 -4
  85. package/dist/Editor/utils/helper.js +16 -0
  86. package/dist/Editor/utils/imageText.js +19 -0
  87. package/dist/Editor/utils/table.js +172 -0
  88. package/package.json +2 -1
@@ -6,6 +6,8 @@ import Video from "../Elements/Embed/Video";
6
6
  import Equation from "../Elements/Equation/Equation";
7
7
  import HtmlCode from "../Elements/CodeToText/HtmlCode";
8
8
  import Table from "../Elements/Table/Table";
9
+ import TableRow from "../Elements/Table/TableRow";
10
+ import TableCell from "../Elements/Table/TableCell";
9
11
  import Mentions from "../Elements/Mentions/Mentions";
10
12
  import Grid from "../Elements/Grid/Grid";
11
13
  import GridItem from "../Elements/Grid/GridItem";
@@ -14,6 +16,11 @@ import AccordionSummary from "../Elements/Accordion/AccordionSummary";
14
16
  import AccordionDetails from "../Elements/Accordion/AccordionDetails";
15
17
  import Signature from "../Elements/Signature/Signature";
16
18
  import Signed from "../Elements/Signature/Signed";
19
+ import EditorButton from "../Elements/Button/EditorButton";
20
+ import Carousel from "../Elements/Carousel/Carousel";
21
+ import CarouselItem from "../Elements/Carousel/CarouselItem";
22
+ import ImageTextWrapper from "../Elements/ImageText/ImageTextWrapper";
23
+ import ImageText from "../Elements/ImageText/ImageText";
17
24
  import { jsx as _jsx } from "react/jsx-runtime";
18
25
  const alignment = ["alignLeft", "alignRight", "alignCenter"];
19
26
  const list_types = ["orderedList", "unorderedList"];
@@ -66,8 +73,13 @@ export const toggleMark = (editor, format) => {
66
73
  }
67
74
  };
68
75
  export const isMarkActive = (editor, format) => {
69
- const marks = Editor.marks(editor);
70
- return marks ? marks[format] === true : false;
76
+ try {
77
+ const marks = Editor.marks(editor);
78
+ return marks ? marks[format] === true : false;
79
+ } catch (err) {
80
+ console.log(err);
81
+ return null;
82
+ }
71
83
  };
72
84
  export const isBlockActive = (editor, format) => {
73
85
  const [match] = Editor.nodes(editor, {
@@ -82,9 +94,14 @@ export const activeMark = (editor, format) => {
82
94
  fontSize: "normal",
83
95
  fontFamily: "sans"
84
96
  };
85
- const marks = Editor.marks(editor);
86
- const defaultValue = defaultMarkData[format];
87
- return marks?.[format] ?? defaultValue;
97
+ try {
98
+ const marks = Editor.marks(editor);
99
+ const defaultValue = defaultMarkData[format];
100
+ return marks?.[format] ?? defaultValue;
101
+ } catch (err) {
102
+ console.log(err);
103
+ return null;
104
+ }
88
105
  };
89
106
  export const getMarked = (leaf, children) => {
90
107
  if (leaf.bold) {
@@ -251,20 +268,25 @@ export const getBlock = props => {
251
268
  ...props
252
269
  });
253
270
  case "table-row":
254
- return /*#__PURE__*/_jsx("tr", {
255
- ...attributes,
256
- children: children
271
+ return /*#__PURE__*/_jsx(TableRow, {
272
+ ...props
257
273
  });
258
274
  case "table-cell":
259
- return /*#__PURE__*/_jsx("td", {
260
- ...element.attr,
261
- ...attributes,
262
- children: children
275
+ return /*#__PURE__*/_jsx(TableCell, {
276
+ ...props
263
277
  });
264
278
  case "image":
265
279
  return /*#__PURE__*/_jsx(Image, {
266
280
  ...props
267
281
  });
282
+ case "image-text-wrapper":
283
+ return /*#__PURE__*/_jsx(ImageTextWrapper, {
284
+ ...props
285
+ });
286
+ case "image-text":
287
+ return /*#__PURE__*/_jsx(ImageText, {
288
+ ...props
289
+ });
268
290
  case "video":
269
291
  return /*#__PURE__*/_jsx(Video, {
270
292
  ...props
@@ -309,6 +331,18 @@ export const getBlock = props => {
309
331
  return /*#__PURE__*/_jsx(Signed, {
310
332
  ...props
311
333
  });
334
+ case "button":
335
+ return /*#__PURE__*/_jsx(EditorButton, {
336
+ ...props
337
+ });
338
+ case "carousel":
339
+ return /*#__PURE__*/_jsx(Carousel, {
340
+ ...props
341
+ });
342
+ case "carousel-item":
343
+ return /*#__PURE__*/_jsx(CarouselItem, {
344
+ ...props
345
+ });
312
346
  default:
313
347
  return /*#__PURE__*/_jsx("div", {
314
348
  ...element.attr,
@@ -0,0 +1,11 @@
1
+ import { Transforms } from "slate";
2
+ export const insertButton = editor => {
3
+ const button = {
4
+ type: "button",
5
+ children: [{
6
+ text: ""
7
+ }]
8
+ };
9
+ Transforms.insertNodes(editor, button);
10
+ Transforms.move(editor);
11
+ };
@@ -0,0 +1,13 @@
1
+ import { Transforms } from "slate";
2
+ import { carouselItem } from "./carouselItem";
3
+ export const insertCarousel = editor => {
4
+ const grid = {
5
+ type: "carousel",
6
+ grid: "container",
7
+ children: [{
8
+ ...carouselItem()
9
+ }]
10
+ };
11
+ Transforms.insertNodes(editor, grid);
12
+ Transforms.move(editor);
13
+ };
@@ -0,0 +1,19 @@
1
+ import { Transforms } from "slate";
2
+ export const carouselItem = () => {
3
+ return {
4
+ type: "carousel-item",
5
+ image: null,
6
+ children: [{
7
+ type: "paragraph",
8
+ children: [{
9
+ text: `Carousel Item Text - ${new Date().getTime()}`
10
+ }]
11
+ }]
12
+ };
13
+ };
14
+ export const insertCarouselItem = editor => {
15
+ Transforms.insertNodes(editor, {
16
+ ...carouselItem()
17
+ });
18
+ Transforms.move(editor);
19
+ };
@@ -1,13 +1,13 @@
1
- import { useState, useEffect } from 'react';
2
- import useFormat from './useFormat.js';
1
+ import { useState, useEffect } from "react";
2
+ import useFormat from "./useFormat.js";
3
3
 
4
4
  //This hook returns should we show the custom context menu and where to show it.
5
5
  const useContextMenu = (editor, format, setSelection) => {
6
6
  const isFormat = useFormat(editor, format);
7
7
  const [showMenu, setShowMenu] = useState(false);
8
8
  const [menuLocation, setMenuLocation] = useState({
9
- top: '0px',
10
- left: '0px'
9
+ top: "0px",
10
+ left: "0px"
11
11
  });
12
12
  const handleClick = () => {
13
13
  setShowMenu(false);
@@ -25,11 +25,11 @@ const useContextMenu = (editor, format, setSelection) => {
25
25
  });
26
26
  };
27
27
  useEffect(() => {
28
- document.addEventListener('click', handleClick);
29
- document.addEventListener('contextmenu', handleContextMenu);
28
+ document.addEventListener("click", handleClick);
29
+ document.addEventListener("contextmenu", handleContextMenu);
30
30
  return () => {
31
- document.removeEventListener('click', handleClick);
32
- document.removeEventListener('contextmenu', handleContextMenu);
31
+ document.removeEventListener("click", handleClick);
32
+ document.removeEventListener("contextmenu", handleContextMenu);
33
33
  };
34
34
  }, [isFormat]);
35
35
  return [showMenu, menuLocation];
@@ -14,7 +14,7 @@ const useResize = ({
14
14
  ...defaultSize
15
15
  });
16
16
  const [resizing, setResizing] = useState(false);
17
- const onLoad = dom => {
17
+ const onLoad = defaultSize => {
18
18
  setSize({
19
19
  widthInPercent: 100,
20
20
  height: 300,
@@ -1,8 +1,8 @@
1
1
  export const sizeMap = {
2
- small: "12",
3
- normal: "16",
4
- medium: "28",
5
- huge: "40"
2
+ small: "12px",
3
+ normal: "16px",
4
+ medium: "28px",
5
+ huge: "40px"
6
6
  };
7
7
  export const fontFamilyMap = {
8
8
  sans: "Helvetica,Arial, sans serif",
@@ -13,4 +13,20 @@ export const formatDate = (date, format = "MM/DD/YYYY") => {
13
13
  default:
14
14
  return [year, month, day].join("-");
15
15
  }
16
+ };
17
+ export const convertBase64 = file => {
18
+ return new Promise((resolve, reject) => {
19
+ if (file) {
20
+ const fileReader = new FileReader();
21
+ fileReader.readAsDataURL(file);
22
+ fileReader.onload = () => {
23
+ resolve(fileReader.result);
24
+ };
25
+ fileReader.onerror = error => {
26
+ reject(error);
27
+ };
28
+ } else {
29
+ resolve("");
30
+ }
31
+ });
16
32
  };
@@ -0,0 +1,19 @@
1
+ import { Transforms } from "slate";
2
+ export const insertImageText = (editor, path) => {
3
+ const imageText = {
4
+ type: "image-text",
5
+ grid: "container",
6
+ children: [{
7
+ type: "paragraph",
8
+ children: [{
9
+ text: "sample text"
10
+ }]
11
+ }]
12
+ };
13
+ if (path) {
14
+ Transforms.insertNodes(editor, imageText, {
15
+ at: path
16
+ });
17
+ }
18
+ return imageText;
19
+ };
@@ -1,4 +1,19 @@
1
1
  import { Transforms, Editor, Range, Element, Path } from "slate";
2
+ const prefixKey = (obj, pk = "") => {
3
+ return Object.keys(obj).reduce((a, b) => {
4
+ a[`${pk}${b}`] = obj[b];
5
+ return a;
6
+ }, {});
7
+ };
8
+ const parseByPrefixKey = (obj, pk = "") => {
9
+ return Object.keys(obj).reduce((a, b) => {
10
+ if (b.indexOf(pk) !== -1 && pk) {
11
+ const key = b.split(pk)[1];
12
+ a[key] = obj[b];
13
+ }
14
+ return a;
15
+ }, {});
16
+ };
2
17
  export class TableUtil {
3
18
  constructor(editor) {
4
19
  this.editor = editor;
@@ -64,6 +79,31 @@ export class TableUtil {
64
79
  }
65
80
  }
66
81
  };
82
+ deleteRow = () => {
83
+ const {
84
+ selection
85
+ } = this.editor;
86
+ if (!!selection && Range.isCollapsed(selection)) {
87
+ const [tableNode] = Editor.nodes(this.editor, {
88
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table-row"
89
+ });
90
+ if (tableNode) {
91
+ const [[table, tablePath]] = Editor.nodes(this.editor, {
92
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table"
93
+ });
94
+ const [, currentRow] = tableNode;
95
+ const path = currentRow;
96
+ Transforms.removeNodes(this.editor, {
97
+ at: path
98
+ });
99
+ Transforms.setNodes(this.editor, {
100
+ rows: table.rows - 1
101
+ }, {
102
+ at: tablePath
103
+ });
104
+ }
105
+ }
106
+ };
67
107
  insertColumn = action => {
68
108
  const {
69
109
  selection
@@ -95,6 +135,138 @@ export class TableUtil {
95
135
  }
96
136
  }
97
137
  };
138
+ deleteColumn = () => {
139
+ const {
140
+ selection
141
+ } = this.editor;
142
+ if (!!selection && Range.isCollapsed(selection)) {
143
+ const [tableNode] = Editor.nodes(this.editor, {
144
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table-cell"
145
+ });
146
+ if (tableNode) {
147
+ const [[table, tablePath]] = Editor.nodes(this.editor, {
148
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table"
149
+ });
150
+ const [, currentCell] = tableNode;
151
+ const startPath = currentCell;
152
+
153
+ // The last two indices of the path represents the row and column. We need to add one cell to each row starting from the first row
154
+ startPath[startPath.length - 2] = 0;
155
+ for (let row = 0; row < table.rows; row++) {
156
+ Transforms.removeNodes(this.editor, {
157
+ at: startPath
158
+ });
159
+ startPath[startPath.length - 2]++;
160
+ }
161
+ Transforms.setNodes(this.editor, {
162
+ columns: table.columns - 1
163
+ }, {
164
+ at: tablePath
165
+ });
166
+ }
167
+ }
168
+ };
169
+ updateTableStyle = (styleProps, paths) => {
170
+ try {
171
+ const {
172
+ selection
173
+ } = this.editor;
174
+ if (!!selection && Range.isCollapsed(selection)) {
175
+ console.log("styleProps", styleProps);
176
+ const tableProps = parseByPrefixKey(styleProps, "table.");
177
+ const rowProps = parseByPrefixKey(styleProps, "row.");
178
+ const cellProps = parseByPrefixKey(styleProps, "col.");
179
+ const {
180
+ currentCellPath,
181
+ currentRowPath,
182
+ currentTablePath
183
+ } = paths;
184
+ console.log(tableProps, rowProps, cellProps);
185
+ Transforms.setNodes(this.editor, {
186
+ ...tableProps
187
+ }, {
188
+ at: currentTablePath
189
+ });
190
+ Transforms.setNodes(this.editor, {
191
+ ...rowProps,
192
+ tableBorder: tableProps?.borderColor
193
+ }, {
194
+ at: currentRowPath
195
+ });
196
+ Transforms.setNodes(this.editor, {
197
+ ...cellProps,
198
+ rowBorder: rowProps?.borderColor,
199
+ tableBorder: tableProps?.borderColor
200
+ }, {
201
+ at: currentCellPath
202
+ });
203
+ }
204
+ } catch (err) {
205
+ console.log(err);
206
+ }
207
+ };
208
+ getTableProps = () => {
209
+ const {
210
+ selection
211
+ } = this.editor;
212
+ if (!!selection && Range.isCollapsed(selection)) {
213
+ const [tableNode] = Editor.nodes(this.editor, {
214
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table"
215
+ });
216
+ const [tableCellNode] = Editor.nodes(this.editor, {
217
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table-cell"
218
+ });
219
+ const [tableRowNode] = Editor.nodes(this.editor, {
220
+ match: n => !Editor.isEditor(n) && Element.isElement(n) && n.type === "table-row"
221
+ });
222
+ if (tableNode && tableCellNode && tableRowNode) {
223
+ const [currentTable, currentTablePath] = tableNode;
224
+ const [currentCell, currentCellPath] = tableCellNode;
225
+ const [currentRow, currentRowPath] = tableRowNode;
226
+ const startPath = currentCell;
227
+ Transforms.setNodes(this.editor, {
228
+ cellBgColor: "#FFFFFF"
229
+ }, {
230
+ at: startPath
231
+ });
232
+ if (currentTable && currentCell && currentRow) {
233
+ const currentTableProps = {
234
+ ...currentTable
235
+ };
236
+ delete currentTableProps.children;
237
+ delete currentTableProps.type;
238
+ const currentCellProps = {
239
+ ...currentCell
240
+ };
241
+ delete currentCellProps.children;
242
+ delete currentCellProps.type;
243
+ const currentRowProps = {
244
+ ...currentRow
245
+ };
246
+ delete currentRowProps.children;
247
+ delete currentRowProps.type;
248
+ return {
249
+ styleProps: {
250
+ ...prefixKey({
251
+ ...currentTableProps
252
+ }, "table."),
253
+ ...prefixKey({
254
+ ...currentRowProps
255
+ }, "row."),
256
+ ...prefixKey({
257
+ ...currentCellProps
258
+ }, "col.")
259
+ },
260
+ currentCellPath,
261
+ currentRowPath,
262
+ currentTablePath
263
+ };
264
+ }
265
+ return null;
266
+ }
267
+ return null;
268
+ }
269
+ };
98
270
  }
99
271
  const createRow = cellText => {
100
272
  const newRow = Array.from(cellText, value => createTableCell(value));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flozy/editor",
3
- "version": "1.1.2",
3
+ "version": "1.1.5",
4
4
  "description": "An Editor for flozy app brain",
5
5
  "files": [
6
6
  "dist"
@@ -27,6 +27,7 @@
27
27
  "react-katex": "^3.0.1",
28
28
  "react-scripts": "5.0.1",
29
29
  "react-signature-canvas": "^1.0.6",
30
+ "react-slick": "^0.29.0",
30
31
  "slate": "^0.94.1",
31
32
  "slate-history": "^0.93.0",
32
33
  "slate-react": "^0.98.3",