roosterjs-content-model-plugins 0.26.3 → 0.27.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.
Files changed (190) hide show
  1. package/lib/autoFormat/AutoFormatPlugin.d.ts +2 -2
  2. package/lib/autoFormat/AutoFormatPlugin.js.map +1 -1
  3. package/lib/autoFormat/keyboardListTrigger.d.ts +2 -2
  4. package/lib/autoFormat/keyboardListTrigger.js.map +1 -1
  5. package/lib/edit/EditPlugin.d.ts +3 -3
  6. package/lib/edit/EditPlugin.js +1 -1
  7. package/lib/edit/EditPlugin.js.map +1 -1
  8. package/lib/edit/deleteSteps/deleteCollapsedSelection.js +20 -1
  9. package/lib/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  10. package/lib/edit/handleKeyboardEventCommon.d.ts +2 -2
  11. package/lib/edit/handleKeyboardEventCommon.js.map +1 -1
  12. package/lib/edit/inputSteps/handleEnterOnList.js +40 -10
  13. package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
  14. package/lib/edit/keyboardDelete.d.ts +3 -3
  15. package/lib/edit/keyboardDelete.js +1 -1
  16. package/lib/edit/keyboardDelete.js.map +1 -1
  17. package/lib/edit/keyboardInput.d.ts +2 -2
  18. package/lib/edit/keyboardInput.js.map +1 -1
  19. package/lib/edit/keyboardTab.d.ts +2 -2
  20. package/lib/edit/keyboardTab.js +19 -11
  21. package/lib/edit/keyboardTab.js.map +1 -1
  22. package/lib/edit/tabUtils/handleTabOnList.d.ts +7 -0
  23. package/lib/edit/tabUtils/handleTabOnList.js +34 -0
  24. package/lib/edit/tabUtils/handleTabOnList.js.map +1 -0
  25. package/lib/edit/tabUtils/handleTabOnParagraph.d.ts +17 -0
  26. package/lib/edit/tabUtils/handleTabOnParagraph.js +81 -0
  27. package/lib/edit/tabUtils/handleTabOnParagraph.js.map +1 -0
  28. package/lib/index.d.ts +4 -0
  29. package/lib/index.js +18 -1
  30. package/lib/index.js.map +1 -1
  31. package/lib/paste/PastePlugin.d.ts +2 -3
  32. package/lib/paste/PastePlugin.js +0 -1
  33. package/lib/paste/PastePlugin.js.map +1 -1
  34. package/lib/shortcut/ShortcutCommand.d.ts +44 -0
  35. package/lib/shortcut/ShortcutCommand.js +3 -0
  36. package/lib/shortcut/ShortcutCommand.js.map +1 -0
  37. package/lib/shortcut/ShortcutPlugin.d.ts +51 -0
  38. package/lib/shortcut/ShortcutPlugin.js +118 -0
  39. package/lib/shortcut/ShortcutPlugin.js.map +1 -0
  40. package/lib/shortcut/shortcuts.d.ts +73 -0
  41. package/lib/shortcut/shortcuts.js +178 -0
  42. package/lib/shortcut/shortcuts.js.map +1 -0
  43. package/lib/tableEdit/TableEditPlugin.d.ts +47 -0
  44. package/lib/tableEdit/TableEditPlugin.js +156 -0
  45. package/lib/tableEdit/TableEditPlugin.js.map +1 -0
  46. package/lib/tableEdit/editors/TableEditor.d.ts +73 -0
  47. package/lib/tableEdit/editors/TableEditor.js +294 -0
  48. package/lib/tableEdit/editors/TableEditor.js.map +1 -0
  49. package/lib/tableEdit/editors/features/CellResizer.d.ts +6 -0
  50. package/lib/tableEdit/editors/features/CellResizer.js +169 -0
  51. package/lib/tableEdit/editors/features/CellResizer.js.map +1 -0
  52. package/lib/tableEdit/editors/features/TableEditorFeature.d.ts +13 -0
  53. package/lib/tableEdit/editors/features/TableEditorFeature.js +17 -0
  54. package/lib/tableEdit/editors/features/TableEditorFeature.js.map +1 -0
  55. package/lib/tableEdit/editors/features/TableInserter.d.ts +6 -0
  56. package/lib/tableEdit/editors/features/TableInserter.js +113 -0
  57. package/lib/tableEdit/editors/features/TableInserter.js.map +1 -0
  58. package/lib/tableEdit/editors/features/TableMover.d.ts +8 -0
  59. package/lib/tableEdit/editors/features/TableMover.js +83 -0
  60. package/lib/tableEdit/editors/features/TableMover.js.map +1 -0
  61. package/lib/tableEdit/editors/features/TableResizer.d.ts +6 -0
  62. package/lib/tableEdit/editors/features/TableResizer.js +163 -0
  63. package/lib/tableEdit/editors/features/TableResizer.js.map +1 -0
  64. package/lib-amd/autoFormat/AutoFormatPlugin.d.ts +2 -2
  65. package/lib-amd/autoFormat/AutoFormatPlugin.js.map +1 -1
  66. package/lib-amd/autoFormat/keyboardListTrigger.d.ts +2 -2
  67. package/lib-amd/autoFormat/keyboardListTrigger.js.map +1 -1
  68. package/lib-amd/edit/EditPlugin.d.ts +3 -3
  69. package/lib-amd/edit/EditPlugin.js +1 -1
  70. package/lib-amd/edit/EditPlugin.js.map +1 -1
  71. package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js +19 -1
  72. package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  73. package/lib-amd/edit/handleKeyboardEventCommon.d.ts +2 -2
  74. package/lib-amd/edit/handleKeyboardEventCommon.js.map +1 -1
  75. package/lib-amd/edit/inputSteps/handleEnterOnList.js +40 -10
  76. package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
  77. package/lib-amd/edit/keyboardDelete.d.ts +3 -3
  78. package/lib-amd/edit/keyboardDelete.js +1 -1
  79. package/lib-amd/edit/keyboardDelete.js.map +1 -1
  80. package/lib-amd/edit/keyboardInput.d.ts +2 -2
  81. package/lib-amd/edit/keyboardInput.js.map +1 -1
  82. package/lib-amd/edit/keyboardTab.d.ts +2 -2
  83. package/lib-amd/edit/keyboardTab.js +18 -12
  84. package/lib-amd/edit/keyboardTab.js.map +1 -1
  85. package/lib-amd/edit/tabUtils/handleTabOnList.d.ts +7 -0
  86. package/lib-amd/edit/tabUtils/handleTabOnList.js +34 -0
  87. package/lib-amd/edit/tabUtils/handleTabOnList.js.map +1 -0
  88. package/lib-amd/edit/tabUtils/handleTabOnParagraph.d.ts +17 -0
  89. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js +81 -0
  90. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js.map +1 -0
  91. package/lib-amd/index.d.ts +4 -0
  92. package/lib-amd/index.js +16 -2
  93. package/lib-amd/index.js.map +1 -1
  94. package/lib-amd/paste/PastePlugin.d.ts +2 -3
  95. package/lib-amd/paste/PastePlugin.js +0 -1
  96. package/lib-amd/paste/PastePlugin.js.map +1 -1
  97. package/lib-amd/shortcut/ShortcutCommand.d.ts +44 -0
  98. package/lib-amd/shortcut/ShortcutCommand.js +5 -0
  99. package/lib-amd/shortcut/ShortcutCommand.js.map +1 -0
  100. package/lib-amd/shortcut/ShortcutPlugin.d.ts +51 -0
  101. package/lib-amd/shortcut/ShortcutPlugin.js +118 -0
  102. package/lib-amd/shortcut/ShortcutPlugin.js.map +1 -0
  103. package/lib-amd/shortcut/shortcuts.d.ts +73 -0
  104. package/lib-amd/shortcut/shortcuts.js +178 -0
  105. package/lib-amd/shortcut/shortcuts.js.map +1 -0
  106. package/lib-amd/tableEdit/TableEditPlugin.d.ts +47 -0
  107. package/lib-amd/tableEdit/TableEditPlugin.js +155 -0
  108. package/lib-amd/tableEdit/TableEditPlugin.js.map +1 -0
  109. package/lib-amd/tableEdit/editors/TableEditor.d.ts +73 -0
  110. package/lib-amd/tableEdit/editors/TableEditor.js +289 -0
  111. package/lib-amd/tableEdit/editors/TableEditor.js.map +1 -0
  112. package/lib-amd/tableEdit/editors/features/CellResizer.d.ts +6 -0
  113. package/lib-amd/tableEdit/editors/features/CellResizer.js +165 -0
  114. package/lib-amd/tableEdit/editors/features/CellResizer.js.map +1 -0
  115. package/lib-amd/tableEdit/editors/features/TableEditorFeature.d.ts +13 -0
  116. package/lib-amd/tableEdit/editors/features/TableEditorFeature.js +19 -0
  117. package/lib-amd/tableEdit/editors/features/TableEditorFeature.js.map +1 -0
  118. package/lib-amd/tableEdit/editors/features/TableInserter.d.ts +6 -0
  119. package/lib-amd/tableEdit/editors/features/TableInserter.js +110 -0
  120. package/lib-amd/tableEdit/editors/features/TableInserter.js.map +1 -0
  121. package/lib-amd/tableEdit/editors/features/TableMover.d.ts +8 -0
  122. package/lib-amd/tableEdit/editors/features/TableMover.js +80 -0
  123. package/lib-amd/tableEdit/editors/features/TableMover.js.map +1 -0
  124. package/lib-amd/tableEdit/editors/features/TableResizer.d.ts +6 -0
  125. package/lib-amd/tableEdit/editors/features/TableResizer.js +160 -0
  126. package/lib-amd/tableEdit/editors/features/TableResizer.js.map +1 -0
  127. package/lib-mjs/autoFormat/AutoFormatPlugin.d.ts +2 -2
  128. package/lib-mjs/autoFormat/AutoFormatPlugin.js.map +1 -1
  129. package/lib-mjs/autoFormat/keyboardListTrigger.d.ts +2 -2
  130. package/lib-mjs/autoFormat/keyboardListTrigger.js.map +1 -1
  131. package/lib-mjs/edit/EditPlugin.d.ts +3 -3
  132. package/lib-mjs/edit/EditPlugin.js +1 -1
  133. package/lib-mjs/edit/EditPlugin.js.map +1 -1
  134. package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js +20 -1
  135. package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  136. package/lib-mjs/edit/handleKeyboardEventCommon.d.ts +2 -2
  137. package/lib-mjs/edit/handleKeyboardEventCommon.js.map +1 -1
  138. package/lib-mjs/edit/inputSteps/handleEnterOnList.js +42 -12
  139. package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
  140. package/lib-mjs/edit/keyboardDelete.d.ts +3 -3
  141. package/lib-mjs/edit/keyboardDelete.js +1 -1
  142. package/lib-mjs/edit/keyboardDelete.js.map +1 -1
  143. package/lib-mjs/edit/keyboardInput.d.ts +2 -2
  144. package/lib-mjs/edit/keyboardInput.js.map +1 -1
  145. package/lib-mjs/edit/keyboardTab.d.ts +2 -2
  146. package/lib-mjs/edit/keyboardTab.js +19 -11
  147. package/lib-mjs/edit/keyboardTab.js.map +1 -1
  148. package/lib-mjs/edit/tabUtils/handleTabOnList.d.ts +7 -0
  149. package/lib-mjs/edit/tabUtils/handleTabOnList.js +30 -0
  150. package/lib-mjs/edit/tabUtils/handleTabOnList.js.map +1 -0
  151. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.d.ts +17 -0
  152. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js +77 -0
  153. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js.map +1 -0
  154. package/lib-mjs/index.d.ts +4 -0
  155. package/lib-mjs/index.js +3 -0
  156. package/lib-mjs/index.js.map +1 -1
  157. package/lib-mjs/paste/PastePlugin.d.ts +2 -3
  158. package/lib-mjs/paste/PastePlugin.js +0 -1
  159. package/lib-mjs/paste/PastePlugin.js.map +1 -1
  160. package/lib-mjs/shortcut/ShortcutCommand.d.ts +44 -0
  161. package/lib-mjs/shortcut/ShortcutCommand.js +2 -0
  162. package/lib-mjs/shortcut/ShortcutCommand.js.map +1 -0
  163. package/lib-mjs/shortcut/ShortcutPlugin.d.ts +51 -0
  164. package/lib-mjs/shortcut/ShortcutPlugin.js +115 -0
  165. package/lib-mjs/shortcut/ShortcutPlugin.js.map +1 -0
  166. package/lib-mjs/shortcut/shortcuts.d.ts +73 -0
  167. package/lib-mjs/shortcut/shortcuts.js +175 -0
  168. package/lib-mjs/shortcut/shortcuts.js.map +1 -0
  169. package/lib-mjs/tableEdit/TableEditPlugin.d.ts +47 -0
  170. package/lib-mjs/tableEdit/TableEditPlugin.js +153 -0
  171. package/lib-mjs/tableEdit/TableEditPlugin.js.map +1 -0
  172. package/lib-mjs/tableEdit/editors/TableEditor.d.ts +73 -0
  173. package/lib-mjs/tableEdit/editors/TableEditor.js +292 -0
  174. package/lib-mjs/tableEdit/editors/TableEditor.js.map +1 -0
  175. package/lib-mjs/tableEdit/editors/features/CellResizer.d.ts +6 -0
  176. package/lib-mjs/tableEdit/editors/features/CellResizer.js +166 -0
  177. package/lib-mjs/tableEdit/editors/features/CellResizer.js.map +1 -0
  178. package/lib-mjs/tableEdit/editors/features/TableEditorFeature.d.ts +13 -0
  179. package/lib-mjs/tableEdit/editors/features/TableEditorFeature.js +13 -0
  180. package/lib-mjs/tableEdit/editors/features/TableEditorFeature.js.map +1 -0
  181. package/lib-mjs/tableEdit/editors/features/TableInserter.d.ts +6 -0
  182. package/lib-mjs/tableEdit/editors/features/TableInserter.js +110 -0
  183. package/lib-mjs/tableEdit/editors/features/TableInserter.js.map +1 -0
  184. package/lib-mjs/tableEdit/editors/features/TableMover.d.ts +8 -0
  185. package/lib-mjs/tableEdit/editors/features/TableMover.js +80 -0
  186. package/lib-mjs/tableEdit/editors/features/TableMover.js.map +1 -0
  187. package/lib-mjs/tableEdit/editors/features/TableResizer.d.ts +6 -0
  188. package/lib-mjs/tableEdit/editors/features/TableResizer.js +160 -0
  189. package/lib-mjs/tableEdit/editors/features/TableResizer.js.map +1 -0
  190. package/package.json +5 -5
@@ -0,0 +1,6 @@
1
+ import type TableEditFeature from './TableEditorFeature';
2
+ import type { IEditor } from 'roosterjs-content-model-types';
3
+ /**
4
+ * @internal
5
+ */
6
+ export default function createTableInserter(editor: IEditor, td: HTMLTableCellElement, table: HTMLTableElement, isRTL: boolean, isHorizontal: boolean, onInsert: () => void, getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void, anchorContainer?: HTMLElement): TableEditFeature | null;
@@ -0,0 +1,110 @@
1
+ import createElement from '../../../pluginUtils/CreateElement/createElement';
2
+ import getIntersectedRect from '../../../pluginUtils/Rect/getIntersectedRect';
3
+ import normalizeRect from '../../../pluginUtils/Rect/normalizeRect';
4
+ import { isElementOfType } from 'roosterjs-content-model-dom';
5
+ import { formatTableWithContentModel, insertTableColumn, insertTableRow, } from 'roosterjs-content-model-api';
6
+ var INSERTER_COLOR = '#4A4A4A';
7
+ var INSERTER_COLOR_DARK_MODE = 'white';
8
+ var INSERTER_SIDE_LENGTH = 12;
9
+ var INSERTER_BORDER_SIZE = 1;
10
+ /**
11
+ * @internal
12
+ */
13
+ export default function createTableInserter(editor, td, table, isRTL, isHorizontal, onInsert, getOnMouseOut, anchorContainer) {
14
+ var tdRect = normalizeRect(td.getBoundingClientRect());
15
+ var viewPort = editor.getVisibleViewport();
16
+ var tableRect = table && viewPort ? getIntersectedRect([table], [viewPort]) : null;
17
+ // set inserter position
18
+ if (tdRect && tableRect) {
19
+ var document_1 = td.ownerDocument;
20
+ var createElementData = getInsertElementData(isHorizontal, editor.isDarkMode(), isRTL, editor.getDOMHelper().getDomStyle('backgroundColor') || 'white');
21
+ var div = createElement(createElementData, document_1);
22
+ if (isHorizontal) {
23
+ // tableRect.left/right is used because the Inserter is always intended to be on the side
24
+ div.id = 'horizontalInserter';
25
+ div.style.left = (isRTL
26
+ ? tableRect.right
27
+ : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)) + "px";
28
+ div.style.top = tdRect.bottom - 8 + "px";
29
+ div.firstChild.style.width = tableRect.right - tableRect.left + "px";
30
+ }
31
+ else {
32
+ div.id = 'verticalInserter';
33
+ div.style.left = (isRTL ? tdRect.left - 8 : tdRect.right - 8) + "px";
34
+ // tableRect.top is used because the Inserter is always intended to be on top
35
+ div.style.top = tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE) + "px";
36
+ div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
37
+ }
38
+ (anchorContainer || document_1.body).appendChild(div);
39
+ var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, getOnMouseOut);
40
+ return { div: div, featureHandler: handler, node: td };
41
+ }
42
+ return null;
43
+ }
44
+ var TableInsertHandler = /** @class */ (function () {
45
+ function TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, getOnMouseOut) {
46
+ var _this = this;
47
+ this.div = div;
48
+ this.td = td;
49
+ this.table = table;
50
+ this.isHorizontal = isHorizontal;
51
+ this.editor = editor;
52
+ this.onInsert = onInsert;
53
+ this.insertTd = function () {
54
+ // Get cell coordinates
55
+ var columnIndex = _this.td.cellIndex;
56
+ var row = _this.td.parentElement && isElementOfType(_this.td.parentElement, 'tr')
57
+ ? _this.td.parentElement
58
+ : undefined;
59
+ var rowIndex = row && row.rowIndex;
60
+ if ((row === null || row === void 0 ? void 0 : row.cells) == undefined || rowIndex == undefined) {
61
+ return;
62
+ }
63
+ // Insert row or column
64
+ formatTableWithContentModel(_this.editor, 'editTablePlugin', function (tableModel) {
65
+ _this.isHorizontal
66
+ ? insertTableRow(tableModel, 'insertBelow')
67
+ : insertTableColumn(tableModel, 'insertRight');
68
+ }, // Select cell to make insertion
69
+ {
70
+ type: 'table',
71
+ firstColumn: columnIndex,
72
+ firstRow: rowIndex,
73
+ lastColumn: columnIndex,
74
+ lastRow: rowIndex,
75
+ table: _this.table,
76
+ });
77
+ _this.onInsert();
78
+ };
79
+ this.div.addEventListener('click', this.insertTd);
80
+ this.onMouseOutEvent = getOnMouseOut(div);
81
+ this.div.addEventListener('mouseout', this.onMouseOutEvent);
82
+ }
83
+ TableInsertHandler.prototype.dispose = function () {
84
+ this.div.removeEventListener('click', this.insertTd);
85
+ if (this.onMouseOutEvent) {
86
+ this.div.removeEventListener('mouseout', this.onMouseOutEvent);
87
+ }
88
+ this.onMouseOutEvent = null;
89
+ };
90
+ return TableInsertHandler;
91
+ }());
92
+ function getInsertElementData(isHorizontal, isDark, isRTL, backgroundColor) {
93
+ var inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;
94
+ var outerDivStyle = "position: fixed; width: " + INSERTER_SIDE_LENGTH + "px; height: " + INSERTER_SIDE_LENGTH + "px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid " + INSERTER_BORDER_SIZE + "px " + inserterColor + "; border-radius: 50%; background-color: " + backgroundColor;
95
+ var leftOrRight = isRTL ? 'right' : 'left';
96
+ var childBaseStyles = "position: absolute; box-sizing: border-box; background-color: " + backgroundColor + ";";
97
+ var childInfo = {
98
+ tag: 'div',
99
+ style: childBaseStyles +
100
+ (isHorizontal
101
+ ? leftOrRight + ": 12px; top: 5px; height: 3px; border-top: 1px solid " + inserterColor + "; border-bottom: 1px solid " + inserterColor + "; border-right: 1px solid " + inserterColor + "; border-left: 0px;"
102
+ : "left: 5px; top: 12px; width: 3px; border-left: 1px solid " + inserterColor + "; border-right: 1px solid " + inserterColor + "; border-bottom: 1px solid " + inserterColor + "; border-top: 0px;"),
103
+ };
104
+ return {
105
+ tag: 'div',
106
+ style: outerDivStyle,
107
+ children: [childInfo, '+'],
108
+ };
109
+ }
110
+ //# sourceMappingURL=TableInserter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages-content-model/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts"],"names":[],"mappings":"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","sourcesContent":["import createElement from '../../../pluginUtils/CreateElement/createElement';\nimport getIntersectedRect from '../../../pluginUtils/Rect/getIntersectedRect';\nimport normalizeRect from '../../../pluginUtils/Rect/normalizeRect';\nimport { isElementOfType } from 'roosterjs-content-model-dom';\nimport {\n formatTableWithContentModel,\n insertTableColumn,\n insertTableRow,\n} from 'roosterjs-content-model-api';\nimport type CreateElementData from '../../../pluginUtils/CreateElement/CreateElementData';\nimport type Disposable from '../../../pluginUtils/Disposable';\nimport type TableEditFeature from './TableEditorFeature';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\nconst INSERTER_COLOR = '#4A4A4A';\nconst INSERTER_COLOR_DARK_MODE = 'white';\nconst INSERTER_SIDE_LENGTH = 12;\nconst INSERTER_BORDER_SIZE = 1;\n\n/**\n * @internal\n */\nexport default function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onInsert: () => void,\n getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void,\n anchorContainer?: HTMLElement\n): TableEditFeature | null {\n const tdRect = normalizeRect(td.getBoundingClientRect());\n const viewPort = editor.getVisibleViewport();\n const tableRect = table && viewPort ? getIntersectedRect([table], [viewPort]) : null;\n\n // set inserter position\n if (tdRect && tableRect) {\n const document = td.ownerDocument;\n const createElementData = getInsertElementData(\n isHorizontal,\n editor.isDarkMode(),\n isRTL,\n editor.getDOMHelper().getDomStyle('backgroundColor') || 'white'\n );\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n if (isHorizontal) {\n // tableRect.left/right is used because the Inserter is always intended to be on the side\n div.id = 'horizontalInserter';\n div.style.left = `${\n isRTL\n ? tableRect.right\n : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n div.style.top = `${tdRect.bottom - 8}px`;\n (div.firstChild as HTMLElement).style.width = `${tableRect.right - tableRect.left}px`;\n } else {\n div.id = 'verticalInserter';\n div.style.left = `${isRTL ? tdRect.left - 8 : tdRect.right - 8}px`;\n // tableRect.top is used because the Inserter is always intended to be on top\n div.style.top = `${\n tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n (div.firstChild as HTMLElement).style.height = `${tableRect.bottom - tableRect.top}px`;\n }\n\n (anchorContainer || document.body).appendChild(div);\n\n const handler = new TableInsertHandler(\n div,\n td,\n table,\n isHorizontal,\n editor,\n onInsert,\n getOnMouseOut\n );\n\n return { div, featureHandler: handler, node: td };\n }\n\n return null;\n}\n\nclass TableInsertHandler implements Disposable {\n private onMouseOutEvent: null | ((ev: MouseEvent) => void);\n constructor(\n private div: HTMLDivElement,\n private td: HTMLTableCellElement,\n private table: HTMLTableElement,\n private isHorizontal: boolean,\n private editor: IEditor,\n private onInsert: () => void,\n getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.onMouseOutEvent = getOnMouseOut(div);\n this.div.addEventListener('mouseout', this.onMouseOutEvent);\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n\n if (this.onMouseOutEvent) {\n this.div.removeEventListener('mouseout', this.onMouseOutEvent);\n }\n\n this.onMouseOutEvent = null;\n }\n\n private insertTd = () => {\n // Get cell coordinates\n const columnIndex = this.td.cellIndex;\n const row =\n this.td.parentElement && isElementOfType(this.td.parentElement, 'tr')\n ? this.td.parentElement\n : undefined;\n const rowIndex = row && row.rowIndex;\n\n if (row?.cells == undefined || rowIndex == undefined) {\n return;\n }\n\n // Insert row or column\n formatTableWithContentModel(\n this.editor,\n 'editTablePlugin',\n tableModel => {\n this.isHorizontal\n ? insertTableRow(tableModel, 'insertBelow')\n : insertTableColumn(tableModel, 'insertRight');\n }, // Select cell to make insertion\n {\n type: 'table',\n firstColumn: columnIndex,\n firstRow: rowIndex,\n lastColumn: columnIndex,\n lastRow: rowIndex,\n table: this.table,\n }\n );\n\n this.onInsert();\n };\n}\n\nfunction getInsertElementData(\n isHorizontal: boolean,\n isDark: boolean,\n isRTL: boolean,\n backgroundColor: string\n): CreateElementData {\n const inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;\n const outerDivStyle = `position: fixed; width: ${INSERTER_SIDE_LENGTH}px; height: ${INSERTER_SIDE_LENGTH}px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid ${INSERTER_BORDER_SIZE}px ${inserterColor}; border-radius: 50%; background-color: ${backgroundColor}`;\n const leftOrRight = isRTL ? 'right' : 'left';\n const childBaseStyles = `position: absolute; box-sizing: border-box; background-color: ${backgroundColor};`;\n const childInfo: CreateElementData = {\n tag: 'div',\n style:\n childBaseStyles +\n (isHorizontal\n ? `${leftOrRight}: 12px; top: 5px; height: 3px; border-top: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-left: 0px;`\n : `left: 5px; top: 12px; width: 3px; border-left: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-top: 0px;`),\n };\n\n return {\n tag: 'div',\n style: outerDivStyle,\n children: [childInfo, '+'],\n };\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { IEditor } from 'roosterjs-content-model-types';
2
+ import type TableEditorFeature from './TableEditorFeature';
3
+ /**
4
+ * @internal
5
+ * Contains the function to select whole table
6
+ * Moving behavior not implemented yet
7
+ */
8
+ export default function createTableMover(table: HTMLTableElement, editor: IEditor, isRTL: boolean, onFinishDragging: (table: HTMLTableElement) => void, getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void, contentDiv?: EventTarget | null, anchorContainer?: HTMLElement): TableEditorFeature | null;
@@ -0,0 +1,80 @@
1
+ import { __extends } from "tslib";
2
+ import createElement from '../../../pluginUtils/CreateElement/createElement';
3
+ import DragAndDropHelper from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';
4
+ import normalizeRect from '../../../pluginUtils/Rect/normalizeRect';
5
+ import { isNodeOfType } from 'roosterjs-content-model-dom';
6
+ var TABLE_MOVER_LENGTH = 12;
7
+ var TABLE_MOVER_ID = '_Table_Mover';
8
+ /**
9
+ * @internal
10
+ * Contains the function to select whole table
11
+ * Moving behavior not implemented yet
12
+ */
13
+ export default function createTableMover(table, editor, isRTL, onFinishDragging, getOnMouseOut, contentDiv, anchorContainer) {
14
+ var rect = normalizeRect(table.getBoundingClientRect());
15
+ if (!isTableTopVisible(editor, rect, contentDiv)) {
16
+ return null;
17
+ }
18
+ var zoomScale = editor.getDOMHelper().calculateZoomScale();
19
+ var document = table.ownerDocument;
20
+ var createElementData = {
21
+ tag: 'div',
22
+ style: 'position: fixed; cursor: all-scroll; user-select: none; border: 1px solid #808080',
23
+ };
24
+ var div = createElement(createElementData, document);
25
+ div.id = TABLE_MOVER_ID;
26
+ div.style.width = TABLE_MOVER_LENGTH + "px";
27
+ div.style.height = TABLE_MOVER_LENGTH + "px";
28
+ (anchorContainer || document.body).appendChild(div);
29
+ var context = {
30
+ table: table,
31
+ zoomScale: zoomScale,
32
+ rect: rect,
33
+ isRTL: isRTL,
34
+ };
35
+ setDivPosition(context, div);
36
+ var onDragEnd = function (context, event) {
37
+ if (event.target == div) {
38
+ onFinishDragging(context.table);
39
+ }
40
+ return false;
41
+ };
42
+ var featureHandler = new TableMoverFeature(div, context, setDivPosition, {
43
+ onDragEnd: onDragEnd,
44
+ }, context.zoomScale, getOnMouseOut);
45
+ return { div: div, featureHandler: featureHandler, node: table };
46
+ }
47
+ var TableMoverFeature = /** @class */ (function (_super) {
48
+ __extends(TableMoverFeature, _super);
49
+ function TableMoverFeature(div, context, onSubmit, handler, zoomScale, getOnMouseOut, forceMobile, container) {
50
+ var _this = _super.call(this, div, context, onSubmit, handler, zoomScale, forceMobile) || this;
51
+ _this.div = div;
52
+ _this.onMouseOut = getOnMouseOut(div);
53
+ div.addEventListener('mouseout', _this.onMouseOut);
54
+ return _this;
55
+ }
56
+ TableMoverFeature.prototype.dispose = function () {
57
+ _super.prototype.dispose.call(this);
58
+ if (this.onMouseOut) {
59
+ this.div.removeEventListener('mouseout', this.onMouseOut);
60
+ }
61
+ this.onMouseOut = null;
62
+ };
63
+ return TableMoverFeature;
64
+ }(DragAndDropHelper));
65
+ function setDivPosition(context, trigger) {
66
+ var rect = context.rect;
67
+ if (rect) {
68
+ trigger.style.top = rect.top - TABLE_MOVER_LENGTH + "px";
69
+ trigger.style.left = rect.left - TABLE_MOVER_LENGTH - 2 + "px";
70
+ }
71
+ }
72
+ function isTableTopVisible(editor, rect, contentDiv) {
73
+ var visibleViewport = editor.getVisibleViewport();
74
+ if (isNodeOfType(contentDiv, 'ELEMENT_NODE') && visibleViewport && rect) {
75
+ var containerRect = normalizeRect(contentDiv.getBoundingClientRect());
76
+ return !!containerRect && containerRect.top <= rect.top && visibleViewport.top <= rect.top;
77
+ }
78
+ return true;
79
+ }
80
+ //# sourceMappingURL=TableMover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableMover.js","sourceRoot":"","sources":["../../../../../../packages-content-model/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableMover.ts"],"names":[],"mappings":"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","sourcesContent":["import createElement from '../../../pluginUtils/CreateElement/createElement';\nimport DragAndDropHelper from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport normalizeRect from '../../../pluginUtils/Rect/normalizeRect';\nimport { isNodeOfType } from 'roosterjs-content-model-dom';\nimport type DragAndDropHandler from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport type { IEditor, Rect } from 'roosterjs-content-model-types';\nimport type TableEditorFeature from './TableEditorFeature';\n\nconst TABLE_MOVER_LENGTH = 12;\nconst TABLE_MOVER_ID = '_Table_Mover';\n\n/**\n * @internal\n * Contains the function to select whole table\n * Moving behavior not implemented yet\n */\nexport default function createTableMover(\n table: HTMLTableElement,\n editor: IEditor,\n isRTL: boolean,\n onFinishDragging: (table: HTMLTableElement) => void,\n getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void,\n contentDiv?: EventTarget | null,\n anchorContainer?: HTMLElement\n): TableEditorFeature | null {\n const rect = normalizeRect(table.getBoundingClientRect());\n\n if (!isTableTopVisible(editor, rect, contentDiv as Node)) {\n return null;\n }\n\n const zoomScale = editor.getDOMHelper().calculateZoomScale();\n const document = table.ownerDocument;\n const createElementData = {\n tag: 'div',\n style: 'position: fixed; cursor: all-scroll; user-select: none; border: 1px solid #808080',\n };\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n div.id = TABLE_MOVER_ID;\n div.style.width = `${TABLE_MOVER_LENGTH}px`;\n div.style.height = `${TABLE_MOVER_LENGTH}px`;\n\n (anchorContainer || document.body).appendChild(div);\n\n const context: TableMoverContext = {\n table,\n zoomScale,\n rect,\n isRTL,\n };\n\n setDivPosition(context, div);\n\n const onDragEnd = (context: TableMoverContext, event: MouseEvent): false => {\n if (event.target == div) {\n onFinishDragging(context.table);\n }\n return false;\n };\n\n const featureHandler = new TableMoverFeature(\n div,\n context,\n setDivPosition,\n {\n onDragEnd,\n },\n context.zoomScale,\n getOnMouseOut\n );\n\n return { div, featureHandler, node: table };\n}\n\ninterface TableMoverContext {\n table: HTMLTableElement;\n zoomScale: number;\n rect: Rect | null;\n isRTL: boolean;\n}\n\ninterface TableMoverInitValue {\n event: MouseEvent;\n}\n\nclass TableMoverFeature extends DragAndDropHelper<TableMoverContext, TableMoverInitValue> {\n private onMouseOut: ((ev: MouseEvent) => void) | null;\n\n constructor(\n private div: HTMLElement,\n context: TableMoverContext,\n onSubmit: (\n context: TableMoverContext,\n trigger: HTMLElement,\n container?: HTMLElement\n ) => void,\n handler: DragAndDropHandler<TableMoverContext, TableMoverInitValue>,\n zoomScale: number,\n getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void,\n forceMobile?: boolean | undefined,\n container?: HTMLElement\n ) {\n super(div, context, onSubmit, handler, zoomScale, forceMobile);\n this.onMouseOut = getOnMouseOut(div);\n div.addEventListener('mouseout', this.onMouseOut);\n }\n\n dispose(): void {\n super.dispose();\n if (this.onMouseOut) {\n this.div.removeEventListener('mouseout', this.onMouseOut);\n }\n this.onMouseOut = null;\n }\n}\n\nfunction setDivPosition(context: TableMoverContext, trigger: HTMLElement) {\n const { rect } = context;\n if (rect) {\n trigger.style.top = `${rect.top - TABLE_MOVER_LENGTH}px`;\n trigger.style.left = `${rect.left - TABLE_MOVER_LENGTH - 2}px`;\n }\n}\n\nfunction isTableTopVisible(editor: IEditor, rect: Rect | null, contentDiv?: Node | null): boolean {\n const visibleViewport = editor.getVisibleViewport();\n if (isNodeOfType(contentDiv, 'ELEMENT_NODE') && visibleViewport && rect) {\n const containerRect = normalizeRect(contentDiv.getBoundingClientRect());\n\n return !!containerRect && containerRect.top <= rect.top && visibleViewport.top <= rect.top;\n }\n\n return true;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { IEditor } from 'roosterjs-content-model-types';
2
+ import type TableEditFeature from './TableEditorFeature';
3
+ /**
4
+ * @internal
5
+ */
6
+ export default function createTableResizer(table: HTMLTableElement, editor: IEditor, isRTL: boolean, onStart: () => void, onEnd: () => false, contentDiv?: EventTarget | null, anchorContainer?: HTMLElement): TableEditFeature | null;
@@ -0,0 +1,160 @@
1
+ import createElement from '../../../pluginUtils/CreateElement/createElement';
2
+ import DragAndDropHelper from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';
3
+ import normalizeRect from '../../../pluginUtils/Rect/normalizeRect';
4
+ import { getFirstSelectedTable, normalizeTable } from 'roosterjs-content-model-core';
5
+ import { isNodeOfType } from 'roosterjs-content-model-dom';
6
+ var TABLE_RESIZER_LENGTH = 12;
7
+ var TABLE_RESIZER_ID = '_Table_Resizer';
8
+ /**
9
+ * @internal
10
+ */
11
+ export default function createTableResizer(table, editor, isRTL, onStart, onEnd, contentDiv, anchorContainer) {
12
+ var rect = normalizeRect(table.getBoundingClientRect());
13
+ if (!isTableBottomVisible(editor, rect, contentDiv)) {
14
+ return null;
15
+ }
16
+ var document = table.ownerDocument;
17
+ var zoomScale = editor.getDOMHelper().calculateZoomScale();
18
+ var createElementData = {
19
+ tag: 'div',
20
+ style: "position: fixed; cursor: " + (isRTL ? 'ne' : 'nw') + "-resize; user-select: none; border: 1px solid #808080",
21
+ };
22
+ var div = createElement(createElementData, document);
23
+ div.id = TABLE_RESIZER_ID;
24
+ div.style.width = TABLE_RESIZER_LENGTH + "px";
25
+ div.style.height = TABLE_RESIZER_LENGTH + "px";
26
+ (anchorContainer || document.body).appendChild(div);
27
+ var context = {
28
+ isRTL: isRTL,
29
+ table: table,
30
+ zoomScale: zoomScale,
31
+ onStart: onStart,
32
+ onEnd: onEnd,
33
+ div: div,
34
+ editor: editor,
35
+ contentDiv: contentDiv,
36
+ };
37
+ setDivPosition(context, div);
38
+ var featureHandler = new DragAndDropHelper(div, context, hideResizer, // Resizer is hidden while dragging only
39
+ {
40
+ onDragStart: onDragStart,
41
+ onDragging: onDragging,
42
+ onDragEnd: onDragEnd,
43
+ }, zoomScale, editor.getEnvironment().isMobileOrTablet);
44
+ return { node: table, div: div, featureHandler: featureHandler };
45
+ }
46
+ function onDragStart(context, event) {
47
+ context.onStart();
48
+ var editor = context.editor, table = context.table;
49
+ // Get current selection
50
+ var selection = editor.getDOMSelection();
51
+ // Select first cell of the table
52
+ editor.setDOMSelection({
53
+ type: 'table',
54
+ firstColumn: 0,
55
+ firstRow: 0,
56
+ lastColumn: 0,
57
+ lastRow: 0,
58
+ table: table,
59
+ });
60
+ // Get the table content model
61
+ var cmTable = getFirstSelectedTable(editor.getContentModelCopy('disconnected'))[0];
62
+ // Restore selection
63
+ editor.setDOMSelection(selection);
64
+ // Save original widths and heights
65
+ var heights = [];
66
+ cmTable === null || cmTable === void 0 ? void 0 : cmTable.rows.forEach(function (row) {
67
+ heights.push(row.height);
68
+ });
69
+ var widths = [];
70
+ cmTable === null || cmTable === void 0 ? void 0 : cmTable.widths.forEach(function (width) {
71
+ widths.push(width);
72
+ });
73
+ return {
74
+ originalRect: table.getBoundingClientRect(),
75
+ cmTable: cmTable,
76
+ originalHeights: heights !== null && heights !== void 0 ? heights : [],
77
+ originalWidths: widths !== null && widths !== void 0 ? widths : [],
78
+ };
79
+ }
80
+ function onDragging(context, event, initValue, deltaX, deltaY) {
81
+ var _a, _b;
82
+ var isRTL = context.isRTL, zoomScale = context.zoomScale, table = context.table;
83
+ var originalRect = initValue.originalRect, originalHeights = initValue.originalHeights, originalWidths = initValue.originalWidths, cmTable = initValue.cmTable;
84
+ var ratioX = 1.0 + (deltaX / originalRect.width) * zoomScale * (isRTL ? -1 : 1);
85
+ var ratioY = 1.0 + (deltaY / originalRect.height) * zoomScale;
86
+ var shouldResizeX = Math.abs(ratioX - 1.0) > 1e-3;
87
+ var shouldResizeY = Math.abs(ratioY - 1.0) > 1e-3;
88
+ // If the width of some external table is fixed, we need to make it resizable
89
+ table.style.setProperty('width', null);
90
+ // If the height of some external table is fixed, we need to make it resizable
91
+ table.style.setProperty('height', null);
92
+ // Assign new widths and heights to the CM table
93
+ if (cmTable && cmTable.rows && (shouldResizeX || shouldResizeY)) {
94
+ // Modify the CM Table size
95
+ for (var i = 0; i < cmTable.rows.length; i++) {
96
+ for (var j = 0; j < cmTable.rows[i].cells.length; j++) {
97
+ var cell = cmTable.rows[i].cells[j];
98
+ if (cell) {
99
+ if (shouldResizeX && i == 0) {
100
+ cmTable.widths[j] = ((_a = originalWidths[j]) !== null && _a !== void 0 ? _a : 0) * ratioX;
101
+ }
102
+ if (shouldResizeY && j == 0) {
103
+ cmTable.rows[i].height = ((_b = originalHeights[i]) !== null && _b !== void 0 ? _b : 0) * ratioY;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ // Normalize the table
109
+ normalizeTable(cmTable);
110
+ // Writeback CM Table size changes to DOM Table
111
+ for (var row = 0; row < table.rows.length; row++) {
112
+ var tableRow = table.rows[row];
113
+ if (tableRow.cells.length == 0) {
114
+ // Skip empty row
115
+ continue;
116
+ }
117
+ for (var col = 0; col < tableRow.cells.length; col++) {
118
+ var td = tableRow.cells[col];
119
+ td.style.width = cmTable.widths[col] + 'px';
120
+ td.style.height = cmTable.rows[row].height + 'px';
121
+ }
122
+ }
123
+ return true;
124
+ }
125
+ else {
126
+ return false;
127
+ }
128
+ }
129
+ function onDragEnd(context, event, initValue) {
130
+ if (isTableBottomVisible(context.editor, normalizeRect(context.table.getBoundingClientRect()), context.contentDiv)) {
131
+ context.div.style.visibility = 'visible';
132
+ setDivPosition(context, context.div);
133
+ }
134
+ context.onEnd();
135
+ return false;
136
+ }
137
+ function setDivPosition(context, trigger) {
138
+ var table = context.table, isRTL = context.isRTL;
139
+ var rect = normalizeRect(table.getBoundingClientRect());
140
+ if (rect) {
141
+ trigger.style.top = rect.bottom + "px";
142
+ trigger.style.left = isRTL
143
+ ? rect.left - TABLE_RESIZER_LENGTH - 2 + "px"
144
+ : rect.right + "px";
145
+ }
146
+ }
147
+ function hideResizer(context, trigger) {
148
+ trigger.style.visibility = 'hidden';
149
+ }
150
+ function isTableBottomVisible(editor, rect, contentDiv) {
151
+ var visibleViewport = editor.getVisibleViewport();
152
+ if (isNodeOfType(contentDiv, 'ELEMENT_NODE') && visibleViewport && rect) {
153
+ var containerRect = normalizeRect(contentDiv.getBoundingClientRect());
154
+ return (!!containerRect &&
155
+ containerRect.bottom >= rect.bottom &&
156
+ visibleViewport.bottom >= rect.bottom);
157
+ }
158
+ return true;
159
+ }
160
+ //# sourceMappingURL=TableResizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableResizer.js","sourceRoot":"","sources":["../../../../../../packages-content-model/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableResizer.ts"],"names":[],"mappings":"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","sourcesContent":["import createElement from '../../../pluginUtils/CreateElement/createElement';\nimport DragAndDropHelper from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport normalizeRect from '../../../pluginUtils/Rect/normalizeRect';\nimport { getFirstSelectedTable, normalizeTable } from 'roosterjs-content-model-core';\nimport { isNodeOfType } from 'roosterjs-content-model-dom';\nimport type { ContentModelTable, IEditor, Rect } from 'roosterjs-content-model-types';\nimport type TableEditFeature from './TableEditorFeature';\n\nconst TABLE_RESIZER_LENGTH = 12;\nconst TABLE_RESIZER_ID = '_Table_Resizer';\n\n/**\n * @internal\n */\nexport default function createTableResizer(\n table: HTMLTableElement,\n editor: IEditor,\n isRTL: boolean,\n onStart: () => void,\n onEnd: () => false,\n contentDiv?: EventTarget | null,\n anchorContainer?: HTMLElement\n): TableEditFeature | null {\n const rect = normalizeRect(table.getBoundingClientRect());\n\n if (!isTableBottomVisible(editor, rect, contentDiv as Node)) {\n return null;\n }\n\n const document = table.ownerDocument;\n const zoomScale = editor.getDOMHelper().calculateZoomScale();\n const createElementData = {\n tag: 'div',\n style: `position: fixed; cursor: ${\n isRTL ? 'ne' : 'nw'\n }-resize; user-select: none; border: 1px solid #808080`,\n };\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n div.id = TABLE_RESIZER_ID;\n div.style.width = `${TABLE_RESIZER_LENGTH}px`;\n div.style.height = `${TABLE_RESIZER_LENGTH}px`;\n\n (anchorContainer || document.body).appendChild(div);\n\n const context: DragAndDropContext = {\n isRTL,\n table,\n zoomScale,\n onStart,\n onEnd,\n div,\n editor,\n contentDiv,\n };\n\n setDivPosition(context, div);\n\n const featureHandler = new DragAndDropHelper<DragAndDropContext, DragAndDropInitValue>(\n div,\n context,\n hideResizer, // Resizer is hidden while dragging only\n {\n onDragStart,\n onDragging,\n onDragEnd,\n },\n zoomScale,\n editor.getEnvironment().isMobileOrTablet\n );\n\n return { node: table, div, featureHandler };\n}\n\ninterface DragAndDropContext {\n table: HTMLTableElement;\n isRTL: boolean;\n zoomScale: number;\n onStart: () => void;\n onEnd: () => false;\n div: HTMLDivElement;\n editor: IEditor;\n contentDiv?: EventTarget | null;\n}\n\ninterface DragAndDropInitValue {\n originalRect: DOMRect;\n originalHeights: number[];\n originalWidths: number[];\n cmTable: ContentModelTable | undefined;\n}\n\nfunction onDragStart(context: DragAndDropContext, event: MouseEvent) {\n context.onStart();\n\n const { editor, table } = context;\n\n // Get current selection\n const selection = editor.getDOMSelection();\n\n // Select first cell of the table\n editor.setDOMSelection({\n type: 'table',\n firstColumn: 0,\n firstRow: 0,\n lastColumn: 0,\n lastRow: 0,\n table: table,\n });\n\n // Get the table content model\n const cmTable = getFirstSelectedTable(editor.getContentModelCopy('disconnected'))[0];\n\n // Restore selection\n editor.setDOMSelection(selection);\n\n // Save original widths and heights\n const heights: number[] = [];\n cmTable?.rows.forEach(row => {\n heights.push(row.height);\n });\n const widths: number[] = [];\n cmTable?.widths.forEach(width => {\n widths.push(width);\n });\n\n return {\n originalRect: table.getBoundingClientRect(),\n cmTable,\n originalHeights: heights ?? [],\n originalWidths: widths ?? [],\n };\n}\n\nfunction onDragging(\n context: DragAndDropContext,\n event: MouseEvent,\n initValue: DragAndDropInitValue,\n deltaX: number,\n deltaY: number\n) {\n const { isRTL, zoomScale, table } = context;\n const { originalRect, originalHeights, originalWidths, cmTable } = initValue;\n\n const ratioX = 1.0 + (deltaX / originalRect.width) * zoomScale * (isRTL ? -1 : 1);\n const ratioY = 1.0 + (deltaY / originalRect.height) * zoomScale;\n const shouldResizeX = Math.abs(ratioX - 1.0) > 1e-3;\n const shouldResizeY = Math.abs(ratioY - 1.0) > 1e-3;\n\n // If the width of some external table is fixed, we need to make it resizable\n table.style.setProperty('width', null);\n // If the height of some external table is fixed, we need to make it resizable\n table.style.setProperty('height', null);\n\n // Assign new widths and heights to the CM table\n if (cmTable && cmTable.rows && (shouldResizeX || shouldResizeY)) {\n // Modify the CM Table size\n for (let i = 0; i < cmTable.rows.length; i++) {\n for (let j = 0; j < cmTable.rows[i].cells.length; j++) {\n const cell = cmTable.rows[i].cells[j];\n if (cell) {\n if (shouldResizeX && i == 0) {\n cmTable.widths[j] = (originalWidths[j] ?? 0) * ratioX;\n }\n if (shouldResizeY && j == 0) {\n cmTable.rows[i].height = (originalHeights[i] ?? 0) * ratioY;\n }\n }\n }\n }\n\n // Normalize the table\n normalizeTable(cmTable);\n\n // Writeback CM Table size changes to DOM Table\n for (let row = 0; row < table.rows.length; row++) {\n const tableRow = table.rows[row];\n\n if (tableRow.cells.length == 0) {\n // Skip empty row\n continue;\n }\n\n for (let col = 0; col < tableRow.cells.length; col++) {\n const td = tableRow.cells[col];\n td.style.width = cmTable.widths[col] + 'px';\n td.style.height = cmTable.rows[row].height + 'px';\n }\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction onDragEnd(\n context: DragAndDropContext,\n event: MouseEvent,\n initValue: DragAndDropInitValue | undefined\n) {\n if (\n isTableBottomVisible(\n context.editor,\n normalizeRect(context.table.getBoundingClientRect()),\n context.contentDiv as Node\n )\n ) {\n context.div.style.visibility = 'visible';\n setDivPosition(context, context.div);\n }\n context.onEnd();\n return false;\n}\n\nfunction setDivPosition(context: DragAndDropContext, trigger: HTMLElement) {\n const { table, isRTL } = context;\n const rect = normalizeRect(table.getBoundingClientRect());\n\n if (rect) {\n trigger.style.top = `${rect.bottom}px`;\n trigger.style.left = isRTL\n ? `${rect.left - TABLE_RESIZER_LENGTH - 2}px`\n : `${rect.right}px`;\n }\n}\n\nfunction hideResizer(context: DragAndDropContext, trigger: HTMLElement) {\n trigger.style.visibility = 'hidden';\n}\n\nfunction isTableBottomVisible(\n editor: IEditor,\n rect: Rect | null,\n contentDiv?: Node | null\n): boolean {\n const visibleViewport = editor.getVisibleViewport();\n if (isNodeOfType(contentDiv, 'ELEMENT_NODE') && visibleViewport && rect) {\n const containerRect = normalizeRect(contentDiv.getBoundingClientRect());\n\n return (\n !!containerRect &&\n containerRect.bottom >= rect.bottom &&\n visibleViewport.bottom >= rect.bottom\n );\n }\n\n return true;\n}\n"]}
package/package.json CHANGED
@@ -3,12 +3,12 @@
3
3
  "description": "Content Model for roosterjs (Under development)",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.1",
6
- "roosterjs-content-model-core": "^0.26.3",
7
- "roosterjs-content-model-dom": "^0.26.3",
8
- "roosterjs-content-model-types": "^0.26.3",
9
- "roosterjs-content-model-api": "^0.26.3"
6
+ "roosterjs-content-model-core": "^0.27.0",
7
+ "roosterjs-content-model-dom": "^0.27.0",
8
+ "roosterjs-content-model-types": "^0.27.0",
9
+ "roosterjs-content-model-api": "^0.27.0"
10
10
  },
11
- "version": "0.26.3",
11
+ "version": "0.27.0",
12
12
  "main": "./lib/index.js",
13
13
  "typings": "./lib/index.d.ts",
14
14
  "module": "./lib-mjs/index.js",