@seafile/sea-email-editor 0.0.1

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 (266) hide show
  1. package/README.md +1 -0
  2. package/dist/assets/icons/align-center.svg +1 -0
  3. package/dist/assets/icons/align-left.svg +1 -0
  4. package/dist/assets/icons/align-right.svg +1 -0
  5. package/dist/assets/icons/arrow-down.svg +1 -0
  6. package/dist/assets/icons/arrow-right.svg +1 -0
  7. package/dist/assets/icons/arrow-up.svg +1 -0
  8. package/dist/assets/icons/bold.svg +1 -0
  9. package/dist/assets/icons/callout-color.svg +1 -0
  10. package/dist/assets/icons/check-mark-option.svg +3 -0
  11. package/dist/assets/icons/check-square.svg +1 -0
  12. package/dist/assets/icons/clear-format.svg +1 -0
  13. package/dist/assets/icons/close.svg +3 -0
  14. package/dist/assets/icons/code-block.svg +1 -0
  15. package/dist/assets/icons/image.svg +1 -0
  16. package/dist/assets/icons/inline-code.svg +1 -0
  17. package/dist/assets/icons/insert.svg +1 -0
  18. package/dist/assets/icons/italic.svg +1 -0
  19. package/dist/assets/icons/link.svg +1 -0
  20. package/dist/assets/icons/more.svg +1 -0
  21. package/dist/assets/icons/ol.svg +1 -0
  22. package/dist/assets/icons/quote.svg +1 -0
  23. package/dist/assets/icons/rename.svg +4 -0
  24. package/dist/assets/icons/strikethrough.svg +1 -0
  25. package/dist/assets/icons/table.svg +1 -0
  26. package/dist/assets/icons/ul.svg +1 -0
  27. package/dist/assets/icons/underline.svg +1 -0
  28. package/dist/assets/icons/unlink.svg +1 -0
  29. package/dist/components/browser-tip/index.css +18 -0
  30. package/dist/components/browser-tip/index.js +28 -0
  31. package/dist/components/centered-loading.js +23 -0
  32. package/dist/components/icon/index.css +7 -0
  33. package/dist/components/icon/index.js +30 -0
  34. package/dist/components/icon-button/index.css +33 -0
  35. package/dist/components/icon-button/index.js +71 -0
  36. package/dist/components/index.js +92 -0
  37. package/dist/components/loading/index.css +54 -0
  38. package/dist/components/loading/index.js +15 -0
  39. package/dist/components/modal/index.css +0 -0
  40. package/dist/components/modal/index.js +27 -0
  41. package/dist/components/modal-header/index.css +22 -0
  42. package/dist/components/modal-header/index.js +36 -0
  43. package/dist/components/option/index.css +20 -0
  44. package/dist/components/option/index.js +39 -0
  45. package/dist/components/options-editor/container/index.css +49 -0
  46. package/dist/components/options-editor/container/index.js +122 -0
  47. package/dist/components/options-editor/index.css +26 -0
  48. package/dist/components/options-editor/index.js +70 -0
  49. package/dist/components/options-editor/options/index.css +5 -0
  50. package/dist/components/options-editor/options/index.js +138 -0
  51. package/dist/components/options-editor/options/option/index.css +54 -0
  52. package/dist/components/options-editor/options/option/index.js +138 -0
  53. package/dist/components/popover/index.js +85 -0
  54. package/dist/components/popover/utils.js +76 -0
  55. package/dist/components/search-input/index.css +52 -0
  56. package/dist/components/search-input/index.js +148 -0
  57. package/dist/components/selector-display/index.css +86 -0
  58. package/dist/components/selector-display/index.js +66 -0
  59. package/dist/components/toolbar/index.js +20 -0
  60. package/dist/components/toolbar/toolbar-group/index.css +13 -0
  61. package/dist/components/toolbar/toolbar-group/index.js +22 -0
  62. package/dist/components/toolbar/toolbar-item/index.css +3 -0
  63. package/dist/components/toolbar/toolbar-item/index.js +53 -0
  64. package/dist/components/tooltip/index.css +68 -0
  65. package/dist/components/tooltip/index.js +46 -0
  66. package/dist/components/tooltip/shortcut-key/index.css +7 -0
  67. package/dist/components/tooltip/shortcut-key/index.js +20 -0
  68. package/dist/constants/event-types.js +25 -0
  69. package/dist/constants/index.js +40 -0
  70. package/dist/constants/key-codes.js +104 -0
  71. package/dist/editor/index.css +44 -0
  72. package/dist/editor/index.js +50 -0
  73. package/dist/editor/main/index.css +19 -0
  74. package/dist/editor/main/index.js +166 -0
  75. package/dist/editor/with-props-editor.js +20 -0
  76. package/dist/extension/commons/dropdown-menu-item/index.css +52 -0
  77. package/dist/extension/commons/dropdown-menu-item/index.js +62 -0
  78. package/dist/extension/commons/index.js +5 -0
  79. package/dist/extension/commons/insert-element-dialog/index.js +91 -0
  80. package/dist/extension/commons/menu/index.js +3 -0
  81. package/dist/extension/commons/menu/menu-drop-down.js +98 -0
  82. package/dist/extension/commons/menu-shortcut-indicator/index.js +24 -0
  83. package/dist/extension/commons/menu-shortcut-indicator/style.css +18 -0
  84. package/dist/extension/constants/element-default-style.js +78 -0
  85. package/dist/extension/constants/element-types.js +33 -0
  86. package/dist/extension/constants/index.js +63 -0
  87. package/dist/extension/constants/keyboard.js +33 -0
  88. package/dist/extension/constants/menus-config.js +142 -0
  89. package/dist/extension/core/index.js +38 -0
  90. package/dist/extension/core/queries/index.js +507 -0
  91. package/dist/extension/core/transforms/focus-editor.js +18 -0
  92. package/dist/extension/core/transforms/index.js +49 -0
  93. package/dist/extension/core/transforms/move-children.js +35 -0
  94. package/dist/extension/core/transforms/remove-node-children.js +19 -0
  95. package/dist/extension/core/transforms/replace-node-children.js +24 -0
  96. package/dist/extension/core/utils/index.js +120 -0
  97. package/dist/extension/event-transfer/get-event-transfer.js +38 -0
  98. package/dist/extension/event-transfer/set-event-transfer.js +36 -0
  99. package/dist/extension/highlight/index.js +20 -0
  100. package/dist/extension/highlight/normalize-tokens.js +94 -0
  101. package/dist/extension/highlight/prismjs.js +27 -0
  102. package/dist/extension/highlight/set-node-decorations.js +81 -0
  103. package/dist/extension/highlight/use-highlight.js +20 -0
  104. package/dist/extension/index.js +67 -0
  105. package/dist/extension/plugins/blockquote/helpers.js +68 -0
  106. package/dist/extension/plugins/blockquote/index.js +18 -0
  107. package/dist/extension/plugins/blockquote/menu/index.js +35 -0
  108. package/dist/extension/plugins/blockquote/plugin.js +154 -0
  109. package/dist/extension/plugins/blockquote/render-elem.js +29 -0
  110. package/dist/extension/plugins/check-list/helper.js +34 -0
  111. package/dist/extension/plugins/check-list/index.js +19 -0
  112. package/dist/extension/plugins/check-list/menu/index.js +39 -0
  113. package/dist/extension/plugins/check-list/plugin.js +92 -0
  114. package/dist/extension/plugins/check-list/render-elem.js +61 -0
  115. package/dist/extension/plugins/clear-format/helpers.js +51 -0
  116. package/dist/extension/plugins/clear-format/menu/index.js +35 -0
  117. package/dist/extension/plugins/code-block/helpers.js +140 -0
  118. package/dist/extension/plugins/code-block/index.js +20 -0
  119. package/dist/extension/plugins/code-block/menu/index.js +59 -0
  120. package/dist/extension/plugins/code-block/plugin.js +288 -0
  121. package/dist/extension/plugins/code-block/render-elem/constant.js +22 -0
  122. package/dist/extension/plugins/code-block/render-elem/index.js +89 -0
  123. package/dist/extension/plugins/code-block/render-elem/language-selector/index.css +18 -0
  124. package/dist/extension/plugins/code-block/render-elem/language-selector/index.js +38 -0
  125. package/dist/extension/plugins/formula/formula.css +22 -0
  126. package/dist/extension/plugins/formula/helper.js +80 -0
  127. package/dist/extension/plugins/formula/index.js +19 -0
  128. package/dist/extension/plugins/formula/menu/formula-modal.js +98 -0
  129. package/dist/extension/plugins/formula/menu/index.js +35 -0
  130. package/dist/extension/plugins/formula/plugin.js +22 -0
  131. package/dist/extension/plugins/formula/render-elem.js +64 -0
  132. package/dist/extension/plugins/header/helper.js +55 -0
  133. package/dist/extension/plugins/header/index.js +19 -0
  134. package/dist/extension/plugins/header/menu/index.js +72 -0
  135. package/dist/extension/plugins/header/plugin.js +155 -0
  136. package/dist/extension/plugins/header/render-elem.js +39 -0
  137. package/dist/extension/plugins/html/index.js +13 -0
  138. package/dist/extension/plugins/html/plugin.js +69 -0
  139. package/dist/extension/plugins/image/helper.js +131 -0
  140. package/dist/extension/plugins/image/index.js +19 -0
  141. package/dist/extension/plugins/image/menu/image-menu-dialog.js +92 -0
  142. package/dist/extension/plugins/image/menu/index.css +3 -0
  143. package/dist/extension/plugins/image/menu/index.js +103 -0
  144. package/dist/extension/plugins/image/plugin.js +56 -0
  145. package/dist/extension/plugins/image/render-element/image-previewer.js +89 -0
  146. package/dist/extension/plugins/image/render-element/index.js +141 -0
  147. package/dist/extension/plugins/image/render-element/style.css +68 -0
  148. package/dist/extension/plugins/index.js +116 -0
  149. package/dist/extension/plugins/link/helper.js +258 -0
  150. package/dist/extension/plugins/link/index.js +19 -0
  151. package/dist/extension/plugins/link/menu/index.js +92 -0
  152. package/dist/extension/plugins/link/menu/link-modal.js +169 -0
  153. package/dist/extension/plugins/link/plugin.js +172 -0
  154. package/dist/extension/plugins/link/render-elem/index.css +12 -0
  155. package/dist/extension/plugins/link/render-elem/index.js +103 -0
  156. package/dist/extension/plugins/link/render-elem/link-op-menu/index.css +33 -0
  157. package/dist/extension/plugins/link/render-elem/link-op-menu/index.js +89 -0
  158. package/dist/extension/plugins/list/constant.js +8 -0
  159. package/dist/extension/plugins/list/helpers.js +102 -0
  160. package/dist/extension/plugins/list/index.js +19 -0
  161. package/dist/extension/plugins/list/menu/index.js +41 -0
  162. package/dist/extension/plugins/list/plugin/index.js +80 -0
  163. package/dist/extension/plugins/list/plugin/insert-break-list.js +29 -0
  164. package/dist/extension/plugins/list/plugin/insert-fragment-list.js +179 -0
  165. package/dist/extension/plugins/list/plugin/normalize-list.js +79 -0
  166. package/dist/extension/plugins/list/plugin/on-tab-handle.js +63 -0
  167. package/dist/extension/plugins/list/plugin/shortcut.js +69 -0
  168. package/dist/extension/plugins/list/queries/index.js +52 -0
  169. package/dist/extension/plugins/list/render-elem/index.js +68 -0
  170. package/dist/extension/plugins/list/transforms/index.js +75 -0
  171. package/dist/extension/plugins/list/transforms/insert-list-item.js +98 -0
  172. package/dist/extension/plugins/list/transforms/move-list-item-down.js +50 -0
  173. package/dist/extension/plugins/list/transforms/move-list-item-up.js +124 -0
  174. package/dist/extension/plugins/list/transforms/move-list-items-to-list.js +63 -0
  175. package/dist/extension/plugins/list/transforms/move-list-items.js +73 -0
  176. package/dist/extension/plugins/list/transforms/normalize-list-item.js +110 -0
  177. package/dist/extension/plugins/list/transforms/normalize-nested-list.js +38 -0
  178. package/dist/extension/plugins/list/transforms/remove-first-list-item.js +24 -0
  179. package/dist/extension/plugins/list/transforms/transforms-to-list.js +131 -0
  180. package/dist/extension/plugins/list/transforms/unwrap-list.js +48 -0
  181. package/dist/extension/plugins/markdown/index.js +12 -0
  182. package/dist/extension/plugins/markdown/plugin.js +257 -0
  183. package/dist/extension/plugins/node-id/constants.js +24 -0
  184. package/dist/extension/plugins/node-id/helpers.js +78 -0
  185. package/dist/extension/plugins/node-id/index.js +12 -0
  186. package/dist/extension/plugins/node-id/with-node-id.js +37 -0
  187. package/dist/extension/plugins/p/helper.js +17 -0
  188. package/dist/extension/plugins/p/index.js +17 -0
  189. package/dist/extension/plugins/p/plugin.js +141 -0
  190. package/dist/extension/plugins/p/render-elem.js +29 -0
  191. package/dist/extension/plugins/paragraph/helper.js +17 -0
  192. package/dist/extension/plugins/paragraph/index.js +17 -0
  193. package/dist/extension/plugins/paragraph/plugin.js +141 -0
  194. package/dist/extension/plugins/paragraph/render-elem.js +29 -0
  195. package/dist/extension/plugins/table/constant.js +24 -0
  196. package/dist/extension/plugins/table/context-menu/horizontal-align-popover/index.css +3 -0
  197. package/dist/extension/plugins/table/context-menu/horizontal-align-popover/index.js +64 -0
  198. package/dist/extension/plugins/table/context-menu/index.css +13 -0
  199. package/dist/extension/plugins/table/context-menu/index.js +152 -0
  200. package/dist/extension/plugins/table/context-menu/insert-table-element/index.css +27 -0
  201. package/dist/extension/plugins/table/context-menu/insert-table-element/index.js +113 -0
  202. package/dist/extension/plugins/table/helper.js +333 -0
  203. package/dist/extension/plugins/table/index.js +21 -0
  204. package/dist/extension/plugins/table/menu/index.js +61 -0
  205. package/dist/extension/plugins/table/menu/table-operator.js +97 -0
  206. package/dist/extension/plugins/table/menu/table-size-selector/index.css +27 -0
  207. package/dist/extension/plugins/table/menu/table-size-selector/index.js +98 -0
  208. package/dist/extension/plugins/table/model.js +102 -0
  209. package/dist/extension/plugins/table/plugin.js +351 -0
  210. package/dist/extension/plugins/table/render-elem/index.css +64 -0
  211. package/dist/extension/plugins/table/render-elem/index.js +252 -0
  212. package/dist/extension/plugins/table/table-operations.js +323 -0
  213. package/dist/extension/plugins/text-style/helpers.js +57 -0
  214. package/dist/extension/plugins/text-style/index.js +17 -0
  215. package/dist/extension/plugins/text-style/menu/index.js +37 -0
  216. package/dist/extension/plugins/text-style/plugin.js +38 -0
  217. package/dist/extension/plugins/text-style/render-elem.js +63 -0
  218. package/dist/extension/render/render-element.js +115 -0
  219. package/dist/extension/render/render-leaf.js +22 -0
  220. package/dist/extension/toolbar/index.css +16 -0
  221. package/dist/extension/toolbar/index.js +89 -0
  222. package/dist/extension/toolbar/insert-toolbar.js +78 -0
  223. package/dist/hooks/use-attachments.js +38 -0
  224. package/dist/hooks/use-container-style.js +50 -0
  225. package/dist/hooks/use-mathjax.js +46 -0
  226. package/dist/hooks/use-scroll-context.js +20 -0
  227. package/dist/hooks/use-selection-update.js +20 -0
  228. package/dist/hooks/user-link-click.js +52 -0
  229. package/dist/index.js +9 -0
  230. package/dist/intl/ReactIntlUniversal.js +310 -0
  231. package/dist/intl/constants.js +21 -0
  232. package/dist/intl/index.js +33 -0
  233. package/dist/locale/index.js +11 -0
  234. package/dist/locale/lang/en.json +83 -0
  235. package/dist/slate-convert/html-to-slate/constants.js +146 -0
  236. package/dist/slate-convert/html-to-slate/helper.js +106 -0
  237. package/dist/slate-convert/html-to-slate/index.js +138 -0
  238. package/dist/slate-convert/html-to-slate/rules/blockquote.js +26 -0
  239. package/dist/slate-convert/html-to-slate/rules/br.js +29 -0
  240. package/dist/slate-convert/html-to-slate/rules/check-list.js +29 -0
  241. package/dist/slate-convert/html-to-slate/rules/code-block.js +95 -0
  242. package/dist/slate-convert/html-to-slate/rules/header.js +26 -0
  243. package/dist/slate-convert/html-to-slate/rules/image.js +31 -0
  244. package/dist/slate-convert/html-to-slate/rules/index.js +20 -0
  245. package/dist/slate-convert/html-to-slate/rules/link.js +31 -0
  246. package/dist/slate-convert/html-to-slate/rules/list.js +74 -0
  247. package/dist/slate-convert/html-to-slate/rules/p.js +37 -0
  248. package/dist/slate-convert/html-to-slate/rules/paragraph.js +37 -0
  249. package/dist/slate-convert/html-to-slate/rules/table.js +64 -0
  250. package/dist/slate-convert/html-to-slate/rules/text.js +71 -0
  251. package/dist/slate-convert/index.js +20 -0
  252. package/dist/slate-convert/slate-to-html/index.js +143 -0
  253. package/dist/utils/common.js +46 -0
  254. package/dist/utils/deserialize-html.js +219 -0
  255. package/dist/utils/dom-utils.js +57 -0
  256. package/dist/utils/dom.js +133 -0
  257. package/dist/utils/event-bus.js +40 -0
  258. package/dist/utils/event-handler.js +44 -0
  259. package/dist/utils/get-browser-Info.js +35 -0
  260. package/dist/utils/hotkey.js +45 -0
  261. package/dist/utils/is-punctuation-mark.js +50 -0
  262. package/dist/utils/object-utils.js +56 -0
  263. package/dist/utils/search.js +20 -0
  264. package/dist/utils/translate.js +18 -0
  265. package/dist/utils/type-detection.js +42 -0
  266. package/package.json +177 -0
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _classnames = _interopRequireDefault(require("classnames"));
11
+ var _reactstrap = require("reactstrap");
12
+ var _helper = require("../../helper");
13
+ require("./index.css");
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ const TableSizeSelector = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
16
+ let {
17
+ target,
18
+ editor,
19
+ onHideSelector
20
+ } = _ref;
21
+ const [selectedGridInfo, setSelectedGridInfo] = (0, _react.useState)({
22
+ row: 0,
23
+ column: 0
24
+ });
25
+ const [showingGridInfo, setShowingGridInfo] = (0, _react.useState)({
26
+ row: 4,
27
+ column: 4
28
+ });
29
+ const preRenderTableGrid = (0, _react.useCallback)((rowIndex, columnIndex) => {
30
+ const selectedRowNums = rowIndex + 1;
31
+ const selectedColumnNums = columnIndex + 1;
32
+ let preRenderRowNum = selectedRowNums + 1;
33
+ let preRenderColumnNum = selectedColumnNums + 1;
34
+ if (preRenderRowNum < 4) {
35
+ preRenderRowNum = 4;
36
+ } else if (preRenderRowNum > 10) {
37
+ preRenderRowNum = 10;
38
+ }
39
+ if (preRenderColumnNum < 4) {
40
+ preRenderColumnNum = 4;
41
+ } else if (preRenderColumnNum > 10) {
42
+ preRenderColumnNum = 10;
43
+ }
44
+ setSelectedGridInfo({
45
+ row: selectedRowNums,
46
+ column: selectedColumnNums
47
+ });
48
+ setShowingGridInfo({
49
+ row: preRenderRowNum,
50
+ column: preRenderColumnNum
51
+ });
52
+ }, []);
53
+ const handleClickTableCell = (0, _react.useCallback)(() => {
54
+ (0, _helper.insertTable)(editor, selectedGridInfo.row, selectedGridInfo.column);
55
+ onHideSelector();
56
+ }, [editor, onHideSelector, selectedGridInfo.column, selectedGridInfo.row]);
57
+ const generateTableGrid = (0, _react.useCallback)((rowNum, columnNum) => {
58
+ const {
59
+ row: selectedRowIndex,
60
+ column: selectedColumnIndex
61
+ } = selectedGridInfo;
62
+ const rowElements = [];
63
+ for (let rowIndex = 0; rowIndex < rowNum; rowIndex++) {
64
+ const columnElements = [];
65
+ for (let columnIndex = 0; columnIndex < columnNum; columnIndex++) {
66
+ const isCellSelected = selectedRowIndex > rowIndex && selectedColumnIndex > columnIndex;
67
+ columnElements.push(/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
68
+ onMouseDown: handleClickTableCell,
69
+ onMouseEnter: () => preRenderTableGrid(rowIndex, columnIndex),
70
+ className: (0, _classnames.default)('sea-email-table-cell', {
71
+ selected: isCellSelected
72
+ })
73
+ }, `${rowIndex}-${columnIndex}`));
74
+ }
75
+ rowElements.push(/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
76
+ className: "sea-email-table-row",
77
+ children: columnElements
78
+ }, rowIndex));
79
+ }
80
+ return rowElements;
81
+ }, [handleClickTableCell, preRenderTableGrid, selectedGridInfo]);
82
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactstrap.UncontrolledPopover, {
83
+ target: target,
84
+ trigger: "hover",
85
+ className: "sea-email-option-editor-popover sea-email-table-size-selector-popover",
86
+ placement: "right-start",
87
+ hideArrow: true,
88
+ fade: false,
89
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
90
+ className: "sea-email-table-size-selector-card",
91
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
92
+ className: "sea-email-table-grid-info",
93
+ children: `${selectedGridInfo.row} x ${selectedGridInfo.column}`
94
+ }), generateTableGrid(showingGridInfo.row, showingGridInfo.column)]
95
+ })
96
+ });
97
+ });
98
+ var _default = exports.default = TableSizeSelector;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.generateTableRow = exports.generateTableCell = exports.generateTable = void 0;
7
+ var _core = require("../../core");
8
+ var _elementTypes = require("../../constants/element-types");
9
+ /**
10
+ * @param {Object} options
11
+ * @param {Node[] | String} [options.childrenOrText = ''] If provide a string,that will generate a text node as children automatically
12
+ */
13
+ const generateTableCell = function () {
14
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
15
+ const {
16
+ childrenOrText = ''
17
+ } = options;
18
+ return (0, _core.generateElement)(_elementTypes.TABLE_CELL, {
19
+ childrenOrText,
20
+ props: {}
21
+ });
22
+ };
23
+
24
+ /**
25
+ * @param {Object} options
26
+ * @param {Node[] | String} [options.childrenOrText = ''] If provide a string,that will generate a text node as children automatically
27
+ * @param {number | undefined} columnNum If provide a number,that will generate a table row with the number of cells,or will fill the childrenOrText as cells,or will generate a empty cell(if not provide childrenOrText)
28
+ */
29
+ exports.generateTableCell = generateTableCell;
30
+ const generateTableRow = options => {
31
+ const {
32
+ columnNum
33
+ } = options;
34
+ let {
35
+ childrenOrText = ''
36
+ } = options;
37
+ let cells = [];
38
+ if (columnNum) {
39
+ cells = Array.from({
40
+ length: columnNum
41
+ }, () => generateTableCell());
42
+ } else {
43
+ // If not type of string,we'll consider it as a cell array,or throw an error
44
+ if (typeof childrenOrText === 'string') {
45
+ childrenOrText = [generateTableCell({
46
+ childrenOrText
47
+ })];
48
+ }
49
+ if (!Array.isArray(childrenOrText)) {
50
+ throw Error('childrenOrText must be a string or a Node array!');
51
+ }
52
+ }
53
+ return (0, _core.generateElement)(_elementTypes.TABLE_ROW, {
54
+ childrenOrText: columnNum ? cells : childrenOrText
55
+ });
56
+ };
57
+
58
+ /**
59
+ * @param {Object} options
60
+ * @param {Node[] | String} [options.childrenOrText = ''] If provide a string,that will generate a text node as children automatically
61
+ * @param {number | undefined} rowNum If provide a number,that will generate a table with the number of rows,or will fill the childrenOrText as rows,or will generate a empty row(if not provide childrenOrText)
62
+ * @param {number | undefined} columnNum If provide a number,that will generate a table row with the number of cells,or will fill the childrenOrText as cells,or will generate a empty cell(if not provide childrenOrText)
63
+ */
64
+ exports.generateTableRow = generateTableRow;
65
+ const generateTable = options => {
66
+ const {
67
+ rowNum,
68
+ columnNum
69
+ } = options;
70
+ let {
71
+ childrenOrText = ''
72
+ } = options;
73
+ let rows = [];
74
+ let align = [];
75
+ if (rowNum) {
76
+ align = new Array(columnNum).fill(null);
77
+ rows = Array.from({
78
+ length: rowNum
79
+ }, () => generateTableRow({
80
+ columnNum
81
+ }));
82
+ } else {
83
+ // If not type of string,we'll consider it as a row array,or throw an error
84
+ if (typeof childrenOrText === 'string') {
85
+ childrenOrText = [generateTableRow({
86
+ childrenOrText
87
+ })];
88
+ }
89
+ if (!Array.isArray(childrenOrText)) {
90
+ throw Error('childrenOrText must be a string or a Node array!');
91
+ }
92
+ const columns = childrenOrText[0].children.length;
93
+ align = new Array(columns).fill(null);
94
+ }
95
+ return (0, _core.generateElement)(_elementTypes.TABLE, {
96
+ childrenOrText: rowNum ? rows : childrenOrText,
97
+ props: {
98
+ align
99
+ }
100
+ });
101
+ };
102
+ exports.generateTable = generateTable;
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _slate = require("slate");
9
+ var _isHotkey = _interopRequireDefault(require("is-hotkey"));
10
+ var _helper = require("./helper");
11
+ var _constants = require("../../constants");
12
+ var _setEventTransfer = _interopRequireDefault(require("../../event-transfer/set-event-transfer"));
13
+ var _elementTypes = require("../../constants/element-types");
14
+ var _tableOperations = require("./table-operations");
15
+ var _getEventTransfer = _interopRequireDefault(require("../../event-transfer/get-event-transfer"));
16
+ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
17
+ var _eventTypes = require("../../../constants/event-types");
18
+ var _core = require("../../core");
19
+ /**
20
+ * @param {Editor} editor
21
+ */
22
+ const withTable = editor => {
23
+ const {
24
+ insertBreak,
25
+ deleteBackward,
26
+ onHotKeyDown,
27
+ insertText,
28
+ deleteForward,
29
+ onCopy,
30
+ insertData,
31
+ insertFragment,
32
+ normalizeNode
33
+ } = editor;
34
+ const newEditor = editor;
35
+ newEditor.insertBreak = () => {
36
+ const isTableActive = (0, _helper.isInTable)(newEditor);
37
+ if (!editor.selection || !isTableActive) return insertBreak && insertBreak();
38
+ (0, _tableOperations.insertRow)(newEditor);
39
+ const [nodeEntry] = _slate.Editor.nodes(newEditor, {
40
+ match: n => _slate.Element.isElement(n) && n.type === _elementTypes.TABLE_ROW
41
+ });
42
+ const path = _slate.Path.next(nodeEntry[1]);
43
+ const firstCellPath = path.concat(0);
44
+ _slate.Transforms.select(newEditor, firstCellPath);
45
+ return;
46
+ };
47
+ newEditor.insertText = text => {
48
+ const isTableActive = (0, _helper.isInTable)(newEditor);
49
+ if (!isTableActive) return insertText && insertText(text);
50
+ const {
51
+ selection
52
+ } = newEditor;
53
+ // set element by markdown shortcut;
54
+ if (text === ' ' && selection && _slate.Range.isCollapsed(selection)) {
55
+ insertText(text);
56
+ return;
57
+ }
58
+ return insertText(text);
59
+ };
60
+ newEditor.insertData = data => {
61
+ const isTableActive = (0, _helper.isInTable)(newEditor);
62
+ if (!isTableActive) return insertData && insertData(data);
63
+ const {
64
+ type
65
+ } = (0, _getEventTransfer.default)(data);
66
+ if (type === 'file') {
67
+ return insertData(data);
68
+ }
69
+ return (0, _helper.pasteContentIntoTable)(newEditor, data);
70
+ };
71
+ newEditor.insertFragment = fragment => {
72
+ const isTableActive = (0, _helper.isInTable)(newEditor);
73
+ if (!isTableActive) return insertFragment && insertFragment(fragment);
74
+ if (!Array.isArray(fragment)) return;
75
+ const firstChild = fragment[0];
76
+ if (fragment.length === 1 && firstChild.type === _elementTypes.TABLE) {
77
+ const {
78
+ tableEntry,
79
+ rowEntry
80
+ } = (0, _helper.getTableFocusingInfos)(editor);
81
+ let selectedInfo = (0, _helper.getSelectGrid)(editor);
82
+ if (!selectedInfo) {
83
+ const tableCellEntry = (0, _core.getSelectedNodeEntryByType)(editor, _elementTypes.TABLE_CELL);
84
+ if (!tableCellEntry) return;
85
+ const [, path] = tableCellEntry;
86
+ const startColIndex = path.pop();
87
+ const startRowIndex = path.pop();
88
+ selectedInfo = {
89
+ startRowIndex,
90
+ startColIndex
91
+ };
92
+ }
93
+ const {
94
+ startRowIndex,
95
+ startColIndex
96
+ } = selectedInfo;
97
+ const [tableNode, tablePath] = tableEntry;
98
+ const [rowNode] = rowEntry;
99
+ const tableWidth = rowNode.children.length;
100
+ const tableHeight = tableNode.children.length;
101
+ firstChild.children.forEach((clipRow, clipRowIndex) => {
102
+ // Out of table
103
+ if (startRowIndex + clipRowIndex >= tableHeight) return true;
104
+
105
+ // rowPath = [...tablePath, rowIndex + clipRowIndex];
106
+ const currentRowPath = [...tablePath, startRowIndex + clipRowIndex];
107
+ clipRow.children.forEach((clipCol, clipColIndex) => {
108
+ // Out of table
109
+ if (startColIndex + clipColIndex >= tableWidth) return true;
110
+
111
+ // cellPath = [...rowPath, columnIndex + clipColIndex];
112
+ const currentCellPath = [...currentRowPath, startColIndex + clipColIndex];
113
+ const currentCellChildPath = currentCellPath.concat(0);
114
+ _slate.Transforms.removeNodes(editor, {
115
+ at: currentCellChildPath
116
+ });
117
+ const otherBlockTypes = [..._constants.HEADERS, _elementTypes.CHECK_LIST_ITEM, _elementTypes.PARAGRAPH];
118
+ const newChildren = clipCol.children.map(item => {
119
+ if (otherBlockTypes.includes(item.type)) return item.children;
120
+ return item;
121
+ }).flat();
122
+ _slate.Transforms.insertNodes(editor, newChildren, {
123
+ at: currentCellChildPath
124
+ });
125
+ return false;
126
+ });
127
+ return false;
128
+ });
129
+ return;
130
+ }
131
+ const notSupportTypes = [_elementTypes.TABLE, _elementTypes.BLOCKQUOTE, _elementTypes.UNORDERED_LIST, _elementTypes.ORDERED_LIST, _elementTypes.CODE_BLOCK];
132
+ const isDataValid = fragment.some(item => notSupportTypes.includes(item.type));
133
+ if (isDataValid) {
134
+ const strContent = fragment.reduce((ret, item) => {
135
+ return ret + _slate.Node.string(item);
136
+ }, '');
137
+ _slate.Editor.insertText(newEditor, strContent);
138
+ return;
139
+ }
140
+ const otherBlockTypes = [..._constants.HEADERS, _elementTypes.CHECK_LIST_ITEM, _elementTypes.PARAGRAPH];
141
+ const newChildren = fragment.map(item => {
142
+ if (otherBlockTypes.includes(item.type)) return item.children;
143
+ return item;
144
+ }).flat();
145
+ insertFragment(newChildren);
146
+ };
147
+ newEditor.deleteBackward = unit => {
148
+ const isTableActive = (0, _helper.isInTable)(newEditor);
149
+ if (!isTableActive) return deleteBackward(unit);
150
+ const {
151
+ selection
152
+ } = newEditor;
153
+ // If select range,prevent to delete
154
+ if (!_slate.Range.isRange(selection)) return;
155
+ const [tableCellEntry] = _slate.Editor.nodes(editor, {
156
+ match: node => node.type === _elementTypes.TABLE_CELL,
157
+ mode: 'lowest'
158
+ });
159
+ // If delete empty cell,prevent to delete
160
+ const isStartOfCellText = _slate.Editor.isStart(newEditor, selection.anchor, tableCellEntry[1]);
161
+ if (isStartOfCellText) return;
162
+ return deleteBackward && deleteBackward(unit);
163
+ };
164
+ newEditor.deleteForward = unit => {
165
+ const isTableActive = (0, _helper.isInTable)(newEditor);
166
+ if (!isTableActive) return deleteForward(unit);
167
+ const {
168
+ selection
169
+ } = newEditor;
170
+ // If select range,prevent to delete
171
+ if (!_slate.Range.isRange(selection)) return;
172
+ const [tableCellEntry] = _slate.Editor.nodes(editor, {
173
+ match: node => node.type === _elementTypes.TABLE_CELL,
174
+ mode: 'lowest'
175
+ });
176
+ // If delete empty cell,prevent to delete
177
+ const isEndOfCellText = _slate.Editor.isEnd(newEditor, selection.anchor, tableCellEntry[1]);
178
+ if (isEndOfCellText) return;
179
+ return deleteForward(unit);
180
+ };
181
+ newEditor.onHotKeyDown = event => {
182
+ if (!(0, _helper.isInTable)(newEditor)) return onHotKeyDown && onHotKeyDown(event);
183
+ if ((0, _isHotkey.default)('tab', event)) {
184
+ if (newEditor.hasMovedSelection) event.stopPropagation();
185
+ event.preventDefault();
186
+ const {
187
+ tableEntry: [tableNode],
188
+ rowEntry: [rowNode],
189
+ columnIndex,
190
+ rowIndex
191
+ } = (0, _helper.getTableFocusingInfos)(newEditor);
192
+ let nextColumnIndex;
193
+ let nextRowIndex;
194
+ // If focus not at end of columns
195
+ if (columnIndex < rowNode.children.length - 1) {
196
+ nextColumnIndex = columnIndex + 1;
197
+ nextRowIndex = rowIndex;
198
+ } else {
199
+ // If focus not at end of rows,add new row
200
+ const shouldAddNewRow = rowIndex === tableNode.children.length - 1;
201
+ nextColumnIndex = 0;
202
+ nextRowIndex = rowIndex + 1;
203
+ shouldAddNewRow && (0, _tableOperations.insertRow)(newEditor, _constants.INSERT_POSITION.AFTER);
204
+ }
205
+ (0, _helper.selectCellByGrid)(newEditor, nextRowIndex, nextColumnIndex);
206
+ return true;
207
+ }
208
+ if ((0, _isHotkey.default)('shift+tab', event)) {
209
+ if (newEditor.hasMovedSelection) event.stopPropagation();
210
+ event.preventDefault();
211
+ const {
212
+ rowEntry: [rowNode],
213
+ columnIndex,
214
+ rowIndex
215
+ } = (0, _helper.getTableFocusingInfos)(newEditor);
216
+ let previousColumnIndex;
217
+ let previousRowIndex;
218
+ // If focus not at start of columns
219
+ if (columnIndex > 0) {
220
+ previousRowIndex = rowIndex;
221
+ previousColumnIndex = columnIndex - 1;
222
+ } else {
223
+ // If focus not at start of rows
224
+ if (rowIndex > 0) {
225
+ previousRowIndex = rowIndex - 1;
226
+ previousColumnIndex = rowNode.children.length - 1;
227
+ } else {
228
+ previousRowIndex = 0;
229
+ previousColumnIndex = 0;
230
+ }
231
+ }
232
+ (0, _helper.selectCellByGrid)(newEditor, previousRowIndex, previousColumnIndex);
233
+ return true;
234
+ }
235
+ if ((0, _isHotkey.default)('mod+enter', event) || (0, _isHotkey.default)('shift+enter', event)) {
236
+ event.preventDefault();
237
+ (0, _helper.jumpOutTableInEditor)(newEditor);
238
+ return true;
239
+ }
240
+ if ((0, _isHotkey.default)('mod+a', event)) {
241
+ event.preventDefault();
242
+ const {
243
+ tableEntry: [tableNode],
244
+ rowEntry: [rowNode]
245
+ } = (0, _helper.getTableFocusingInfos)(newEditor);
246
+ const rowCount = tableNode.children.length;
247
+ const colCount = rowNode.children.length;
248
+ (0, _helper.selectCellByGrid)(newEditor, rowCount - 1, colCount - 1);
249
+ const eventBus = _eventBus.default.getInstance();
250
+ eventBus.dispatch(_eventTypes.INTERNAL_EVENTS.ON_SELECT_ALL_CELL, tableNode.id);
251
+ return true;
252
+ }
253
+ if ((0, _isHotkey.default)('delete', event) || (0, _isHotkey.default)('backspace', event)) {
254
+ const selectedInfo = (0, _helper.getSelectGrid)(newEditor);
255
+ if (!selectedInfo) return onHotKeyDown && onHotKeyDown(event);
256
+ const {
257
+ startRowIndex,
258
+ endRowIndex,
259
+ startColIndex,
260
+ endColIndex
261
+ } = selectedInfo;
262
+ if (startRowIndex === -1 || endRowIndex === -1 || startColIndex === -1 || endColIndex === -1) return;
263
+ const [tableEntry] = (0, _helper.getTableEntry)(newEditor);
264
+ const [, tablePath] = tableEntry;
265
+ for (let rowIndex = startRowIndex; rowIndex <= endRowIndex; rowIndex++) {
266
+ for (let colIndex = startColIndex; colIndex <= endColIndex; colIndex++) {
267
+ _slate.Transforms.insertText(newEditor, '', {
268
+ at: tablePath.concat(rowIndex, colIndex)
269
+ });
270
+ }
271
+ }
272
+ return true;
273
+ }
274
+ return onHotKeyDown && onHotKeyDown(event);
275
+ };
276
+ newEditor.onCopy = event => {
277
+ if (!(0, _helper.isInTable)(newEditor)) {
278
+ return onCopy && onCopy(event);
279
+ }
280
+ event.preventDefault();
281
+ event.stopPropagation();
282
+ // selected multiple cells
283
+ const tableNode = (0, _helper.getSelectedTableCells)(newEditor);
284
+ if (tableNode) {
285
+ (0, _setEventTransfer.default)(event, 'fragment', tableNode);
286
+ return true;
287
+ }
288
+ // selected only one cell
289
+ const tableCell = (0, _core.getSelectedNodeByType)(newEditor, _elementTypes.TABLE_CELL);
290
+ if (tableCell) {
291
+ const selection = window.getSelection();
292
+ const selectedText = selection.toString();
293
+ const range = selection.getRangeAt(0);
294
+ const selectedContent = range.cloneContents();
295
+ const div = document.createElement('div');
296
+ // Unwrap image wrapper
297
+ selectedContent.childNodes.forEach(node => {
298
+ if (node.classList && node.classList.contains('sea-email-image-wrapper')) {
299
+ const img = node.querySelector('img');
300
+ div.appendChild(img.cloneNode(true));
301
+ return;
302
+ }
303
+ div.appendChild(node.cloneNode(true));
304
+ });
305
+ (0, _setEventTransfer.default)(event, 'text', selectedText);
306
+ (0, _setEventTransfer.default)(event, 'html', div.innerHTML.toString());
307
+ return true;
308
+ }
309
+ return false;
310
+ };
311
+ newEditor.normalizeNode = _ref => {
312
+ let [node, path] = _ref;
313
+ if (node.type === _elementTypes.TABLE) {
314
+ const isLast = (0, _core.isLastNode)(newEditor, node);
315
+ if (isLast) {
316
+ const paragraph = (0, _core.generateEmptyElement)(_elementTypes.PARAGRAPH);
317
+ _slate.Transforms.insertNodes(newEditor, paragraph, {
318
+ at: [path[0] + 1]
319
+ });
320
+ }
321
+ const isFirst = (0, _core.isFirstNode)(newEditor, node);
322
+ if (isFirst) {
323
+ const paragraph = (0, _core.generateEmptyElement)(_elementTypes.PARAGRAPH);
324
+ _slate.Transforms.insertNodes(newEditor, paragraph, {
325
+ at: [path[0]]
326
+ });
327
+ }
328
+ }
329
+ if (node.type === _elementTypes.TABLE_ROW) {
330
+ const parentEntry = _slate.Editor.parent(editor, path);
331
+ if ((parentEntry === null || parentEntry === void 0 ? void 0 : parentEntry[0].type) !== _elementTypes.TABLE) {
332
+ (0, _slate.unwrapNodes)(editor, {
333
+ at: path
334
+ });
335
+ return;
336
+ }
337
+ }
338
+ if (node.type === _elementTypes.TABLE_CELL) {
339
+ const parentEntry = _slate.Editor.parent(editor, path);
340
+ if ((parentEntry === null || parentEntry === void 0 ? void 0 : parentEntry[0].type) !== _elementTypes.TABLE_ROW) {
341
+ (0, _slate.unwrapNodes)(editor, {
342
+ at: path
343
+ });
344
+ return;
345
+ }
346
+ }
347
+ return normalizeNode([node, path]);
348
+ };
349
+ return newEditor;
350
+ };
351
+ var _default = exports.default = withTable;
@@ -0,0 +1,64 @@
1
+ .sea-email-table-container td {
2
+ position: relative;
3
+ }
4
+
5
+ .sea-email-table-container tr:nth-child(odd) {
6
+ background-color: #f8f8f8;
7
+ }
8
+
9
+ .sea-email-table-container tr:first-child {
10
+ font-weight: 500;
11
+ }
12
+
13
+ .sea-email-table-container .selected-cell {
14
+ caret-color: transparent;
15
+ background-color: #fff4e6;
16
+ }
17
+
18
+ .sea-email-table-container .selected-cell-top:before {
19
+ content: "";
20
+ position: absolute;
21
+ top: 0;
22
+ left: 0;
23
+ bottom: 0;
24
+ right: 0;
25
+ margin: -1px;
26
+ border-top: 1px double #ffa94d;
27
+ z-index: 2;
28
+ }
29
+
30
+ .sea-email-table-container .selected-cell-bottom:before {
31
+ content: "";
32
+ position: absolute;
33
+ left: 0;
34
+ right: 0;
35
+ top: 0;
36
+ bottom: 0;
37
+ margin: -1px;
38
+ border-bottom: 1px double #ffa94d;
39
+ z-index: 2;
40
+ }
41
+
42
+ .sea-email-table-container .selected-cell-left:before {
43
+ content: "";
44
+ position: absolute;
45
+ top: 0;
46
+ left: 0;
47
+ bottom: 0;
48
+ right: 0;
49
+ margin: -1px;
50
+ border-left: 1px double #ffa94d;
51
+ z-index: 2;
52
+ }
53
+
54
+ .sea-email-table-container .selected-cell-right:before {
55
+ content: "";
56
+ position: absolute;
57
+ top: 0;
58
+ right: 0;
59
+ left: 0;
60
+ bottom: 0;
61
+ margin: -1px;
62
+ border-right: 1px double #ffa94d;
63
+ z-index: 2;
64
+ }