roosterjs-content-model-plugins 9.1.0 → 9.2.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 (235) hide show
  1. package/lib/autoFormat/AutoFormatPlugin.d.ts +15 -5
  2. package/lib/autoFormat/AutoFormatPlugin.js +41 -4
  3. package/lib/autoFormat/AutoFormatPlugin.js.map +1 -1
  4. package/lib/autoFormat/link/createLink.js +2 -0
  5. package/lib/autoFormat/link/createLink.js.map +1 -1
  6. package/lib/autoFormat/list/keyboardListTrigger.js +7 -9
  7. package/lib/autoFormat/list/keyboardListTrigger.js.map +1 -1
  8. package/lib/autoFormat/numbers/transformFraction.d.ts +5 -0
  9. package/lib/autoFormat/numbers/transformFraction.js +27 -0
  10. package/lib/autoFormat/numbers/transformFraction.js.map +1 -0
  11. package/lib/autoFormat/numbers/transformOrdinals.d.ts +5 -0
  12. package/lib/autoFormat/numbers/transformOrdinals.js +32 -0
  13. package/lib/autoFormat/numbers/transformOrdinals.js.map +1 -0
  14. package/lib/customReplace/CustomReplacePlugin.d.ts +61 -0
  15. package/lib/customReplace/CustomReplacePlugin.js +87 -0
  16. package/lib/customReplace/CustomReplacePlugin.js.map +1 -0
  17. package/lib/edit/EditPlugin.js +19 -1
  18. package/lib/edit/EditPlugin.js.map +1 -1
  19. package/lib/edit/inputSteps/handleEnterOnList.js +8 -1
  20. package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
  21. package/lib/edit/keyboardTab.js +5 -5
  22. package/lib/edit/keyboardTab.js.map +1 -1
  23. package/lib/edit/tabUtils/handleTabOnList.d.ts +2 -2
  24. package/lib/edit/tabUtils/handleTabOnList.js +3 -3
  25. package/lib/edit/tabUtils/handleTabOnList.js.map +1 -1
  26. package/lib/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
  27. package/lib/edit/tabUtils/handleTabOnParagraph.js +2 -2
  28. package/lib/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  29. package/lib/index.d.ts +7 -1
  30. package/lib/index.js +8 -1
  31. package/lib/index.js.map +1 -1
  32. package/lib/markdown/utils/setFormat.js +11 -9
  33. package/lib/markdown/utils/setFormat.js.map +1 -1
  34. package/lib/picker/PickerHandler.d.ts +112 -0
  35. package/lib/picker/PickerHandler.js +3 -0
  36. package/lib/picker/PickerHandler.js.map +1 -0
  37. package/lib/picker/PickerHelper.d.ts +22 -0
  38. package/lib/picker/PickerHelper.js +3 -0
  39. package/lib/picker/PickerHelper.js.map +1 -0
  40. package/lib/picker/PickerHelperImpl.d.ts +25 -0
  41. package/lib/picker/PickerHelperImpl.js +54 -0
  42. package/lib/picker/PickerHelperImpl.js.map +1 -0
  43. package/lib/picker/PickerPlugin.d.ts +54 -0
  44. package/lib/picker/PickerPlugin.js +217 -0
  45. package/lib/picker/PickerPlugin.js.map +1 -0
  46. package/lib/picker/getQueryString.d.ts +5 -0
  47. package/lib/picker/getQueryString.js +36 -0
  48. package/lib/picker/getQueryString.js.map +1 -0
  49. package/lib/pluginUtils/Rect/getDOMInsertPointRect.d.ts +7 -0
  50. package/lib/pluginUtils/Rect/getDOMInsertPointRect.js +57 -0
  51. package/lib/pluginUtils/Rect/getDOMInsertPointRect.js.map +1 -0
  52. package/lib/shortcut/ShortcutPlugin.js +1 -0
  53. package/lib/shortcut/ShortcutPlugin.js.map +1 -1
  54. package/lib/shortcut/shortcuts.d.ts +7 -0
  55. package/lib/shortcut/shortcuts.js +15 -1
  56. package/lib/shortcut/shortcuts.js.map +1 -1
  57. package/lib/shortcut/utils/setShortcutIndentationCommand.js +2 -2
  58. package/lib/shortcut/utils/setShortcutIndentationCommand.js.map +1 -1
  59. package/lib/tableEdit/OnTableEditorCreatedCallback.d.ts +4 -0
  60. package/lib/tableEdit/OnTableEditorCreatedCallback.js +3 -0
  61. package/lib/tableEdit/OnTableEditorCreatedCallback.js.map +1 -0
  62. package/lib/tableEdit/TableEditPlugin.d.ts +4 -1
  63. package/lib/tableEdit/TableEditPlugin.js +5 -2
  64. package/lib/tableEdit/TableEditPlugin.js.map +1 -1
  65. package/lib/tableEdit/editors/TableEditor.d.ts +4 -1
  66. package/lib/tableEdit/editors/TableEditor.js +23 -7
  67. package/lib/tableEdit/editors/TableEditor.js.map +1 -1
  68. package/lib/tableEdit/editors/features/TableEditFeature.js +3 -3
  69. package/lib/tableEdit/editors/features/TableEditFeature.js.map +1 -1
  70. package/lib/tableEdit/editors/features/TableInserter.d.ts +2 -1
  71. package/lib/tableEdit/editors/features/TableInserter.js +7 -9
  72. package/lib/tableEdit/editors/features/TableInserter.js.map +1 -1
  73. package/lib/tableEdit/editors/features/TableMover.d.ts +2 -1
  74. package/lib/tableEdit/editors/features/TableMover.js +8 -11
  75. package/lib/tableEdit/editors/features/TableMover.js.map +1 -1
  76. package/lib/tableEdit/editors/features/TableResizer.d.ts +2 -1
  77. package/lib/tableEdit/editors/features/TableResizer.js +19 -3
  78. package/lib/tableEdit/editors/features/TableResizer.js.map +1 -1
  79. package/lib-amd/autoFormat/AutoFormatPlugin.d.ts +15 -5
  80. package/lib-amd/autoFormat/AutoFormatPlugin.js +39 -5
  81. package/lib-amd/autoFormat/AutoFormatPlugin.js.map +1 -1
  82. package/lib-amd/autoFormat/link/createLink.js +2 -0
  83. package/lib-amd/autoFormat/link/createLink.js.map +1 -1
  84. package/lib-amd/autoFormat/list/keyboardListTrigger.js +7 -9
  85. package/lib-amd/autoFormat/list/keyboardListTrigger.js.map +1 -1
  86. package/lib-amd/autoFormat/numbers/transformFraction.d.ts +5 -0
  87. package/lib-amd/autoFormat/numbers/transformFraction.js +28 -0
  88. package/lib-amd/autoFormat/numbers/transformFraction.js.map +1 -0
  89. package/lib-amd/autoFormat/numbers/transformOrdinals.d.ts +5 -0
  90. package/lib-amd/autoFormat/numbers/transformOrdinals.js +33 -0
  91. package/lib-amd/autoFormat/numbers/transformOrdinals.js.map +1 -0
  92. package/lib-amd/customReplace/CustomReplacePlugin.d.ts +61 -0
  93. package/lib-amd/customReplace/CustomReplacePlugin.js +88 -0
  94. package/lib-amd/customReplace/CustomReplacePlugin.js.map +1 -0
  95. package/lib-amd/edit/EditPlugin.js +19 -1
  96. package/lib-amd/edit/EditPlugin.js.map +1 -1
  97. package/lib-amd/edit/inputSteps/handleEnterOnList.js +8 -2
  98. package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
  99. package/lib-amd/edit/keyboardTab.js +5 -5
  100. package/lib-amd/edit/keyboardTab.js.map +1 -1
  101. package/lib-amd/edit/tabUtils/handleTabOnList.d.ts +2 -2
  102. package/lib-amd/edit/tabUtils/handleTabOnList.js +3 -3
  103. package/lib-amd/edit/tabUtils/handleTabOnList.js.map +1 -1
  104. package/lib-amd/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
  105. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js +2 -2
  106. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  107. package/lib-amd/index.d.ts +7 -1
  108. package/lib-amd/index.js +6 -2
  109. package/lib-amd/index.js.map +1 -1
  110. package/lib-amd/markdown/utils/setFormat.js +11 -9
  111. package/lib-amd/markdown/utils/setFormat.js.map +1 -1
  112. package/lib-amd/picker/PickerHandler.d.ts +112 -0
  113. package/lib-amd/picker/PickerHandler.js +5 -0
  114. package/lib-amd/picker/PickerHandler.js.map +1 -0
  115. package/lib-amd/picker/PickerHelper.d.ts +22 -0
  116. package/lib-amd/picker/PickerHelper.js +5 -0
  117. package/lib-amd/picker/PickerHelper.js.map +1 -0
  118. package/lib-amd/picker/PickerHelperImpl.d.ts +25 -0
  119. package/lib-amd/picker/PickerHelperImpl.js +53 -0
  120. package/lib-amd/picker/PickerHelperImpl.js.map +1 -0
  121. package/lib-amd/picker/PickerPlugin.d.ts +54 -0
  122. package/lib-amd/picker/PickerPlugin.js +215 -0
  123. package/lib-amd/picker/PickerPlugin.js.map +1 -0
  124. package/lib-amd/picker/getQueryString.d.ts +5 -0
  125. package/lib-amd/picker/getQueryString.js +37 -0
  126. package/lib-amd/picker/getQueryString.js.map +1 -0
  127. package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.d.ts +7 -0
  128. package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.js +58 -0
  129. package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.js.map +1 -0
  130. package/lib-amd/shortcut/ShortcutPlugin.js +1 -0
  131. package/lib-amd/shortcut/ShortcutPlugin.js.map +1 -1
  132. package/lib-amd/shortcut/shortcuts.d.ts +7 -0
  133. package/lib-amd/shortcut/shortcuts.js +15 -1
  134. package/lib-amd/shortcut/shortcuts.js.map +1 -1
  135. package/lib-amd/shortcut/utils/setShortcutIndentationCommand.js +2 -2
  136. package/lib-amd/shortcut/utils/setShortcutIndentationCommand.js.map +1 -1
  137. package/lib-amd/tableEdit/OnTableEditorCreatedCallback.d.ts +4 -0
  138. package/lib-amd/tableEdit/OnTableEditorCreatedCallback.js +5 -0
  139. package/lib-amd/tableEdit/OnTableEditorCreatedCallback.js.map +1 -0
  140. package/lib-amd/tableEdit/TableEditPlugin.d.ts +4 -1
  141. package/lib-amd/tableEdit/TableEditPlugin.js +5 -2
  142. package/lib-amd/tableEdit/TableEditPlugin.js.map +1 -1
  143. package/lib-amd/tableEdit/editors/TableEditor.d.ts +4 -1
  144. package/lib-amd/tableEdit/editors/TableEditor.js +23 -7
  145. package/lib-amd/tableEdit/editors/TableEditor.js.map +1 -1
  146. package/lib-amd/tableEdit/editors/features/TableEditFeature.js +3 -3
  147. package/lib-amd/tableEdit/editors/features/TableEditFeature.js.map +1 -1
  148. package/lib-amd/tableEdit/editors/features/TableInserter.d.ts +2 -1
  149. package/lib-amd/tableEdit/editors/features/TableInserter.js +7 -9
  150. package/lib-amd/tableEdit/editors/features/TableInserter.js.map +1 -1
  151. package/lib-amd/tableEdit/editors/features/TableMover.d.ts +2 -1
  152. package/lib-amd/tableEdit/editors/features/TableMover.js +8 -11
  153. package/lib-amd/tableEdit/editors/features/TableMover.js.map +1 -1
  154. package/lib-amd/tableEdit/editors/features/TableResizer.d.ts +2 -1
  155. package/lib-amd/tableEdit/editors/features/TableResizer.js +19 -4
  156. package/lib-amd/tableEdit/editors/features/TableResizer.js.map +1 -1
  157. package/lib-mjs/autoFormat/AutoFormatPlugin.d.ts +15 -5
  158. package/lib-mjs/autoFormat/AutoFormatPlugin.js +41 -4
  159. package/lib-mjs/autoFormat/AutoFormatPlugin.js.map +1 -1
  160. package/lib-mjs/autoFormat/link/createLink.js +3 -1
  161. package/lib-mjs/autoFormat/link/createLink.js.map +1 -1
  162. package/lib-mjs/autoFormat/list/keyboardListTrigger.js +7 -9
  163. package/lib-mjs/autoFormat/list/keyboardListTrigger.js.map +1 -1
  164. package/lib-mjs/autoFormat/numbers/transformFraction.d.ts +5 -0
  165. package/lib-mjs/autoFormat/numbers/transformFraction.js +23 -0
  166. package/lib-mjs/autoFormat/numbers/transformFraction.js.map +1 -0
  167. package/lib-mjs/autoFormat/numbers/transformOrdinals.d.ts +5 -0
  168. package/lib-mjs/autoFormat/numbers/transformOrdinals.js +28 -0
  169. package/lib-mjs/autoFormat/numbers/transformOrdinals.js.map +1 -0
  170. package/lib-mjs/customReplace/CustomReplacePlugin.d.ts +61 -0
  171. package/lib-mjs/customReplace/CustomReplacePlugin.js +84 -0
  172. package/lib-mjs/customReplace/CustomReplacePlugin.js.map +1 -0
  173. package/lib-mjs/edit/EditPlugin.js +19 -1
  174. package/lib-mjs/edit/EditPlugin.js.map +1 -1
  175. package/lib-mjs/edit/inputSteps/handleEnterOnList.js +8 -1
  176. package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
  177. package/lib-mjs/edit/keyboardTab.js +5 -5
  178. package/lib-mjs/edit/keyboardTab.js.map +1 -1
  179. package/lib-mjs/edit/tabUtils/handleTabOnList.d.ts +2 -2
  180. package/lib-mjs/edit/tabUtils/handleTabOnList.js +3 -3
  181. package/lib-mjs/edit/tabUtils/handleTabOnList.js.map +1 -1
  182. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
  183. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js +2 -2
  184. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  185. package/lib-mjs/index.d.ts +7 -1
  186. package/lib-mjs/index.js +4 -1
  187. package/lib-mjs/index.js.map +1 -1
  188. package/lib-mjs/markdown/utils/setFormat.js +11 -9
  189. package/lib-mjs/markdown/utils/setFormat.js.map +1 -1
  190. package/lib-mjs/picker/PickerHandler.d.ts +112 -0
  191. package/lib-mjs/picker/PickerHandler.js +2 -0
  192. package/lib-mjs/picker/PickerHandler.js.map +1 -0
  193. package/lib-mjs/picker/PickerHelper.d.ts +22 -0
  194. package/lib-mjs/picker/PickerHelper.js +2 -0
  195. package/lib-mjs/picker/PickerHelper.js.map +1 -0
  196. package/lib-mjs/picker/PickerHelperImpl.d.ts +25 -0
  197. package/lib-mjs/picker/PickerHelperImpl.js +51 -0
  198. package/lib-mjs/picker/PickerHelperImpl.js.map +1 -0
  199. package/lib-mjs/picker/PickerPlugin.d.ts +54 -0
  200. package/lib-mjs/picker/PickerPlugin.js +214 -0
  201. package/lib-mjs/picker/PickerPlugin.js.map +1 -0
  202. package/lib-mjs/picker/getQueryString.d.ts +5 -0
  203. package/lib-mjs/picker/getQueryString.js +32 -0
  204. package/lib-mjs/picker/getQueryString.js.map +1 -0
  205. package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.d.ts +7 -0
  206. package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.js +53 -0
  207. package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.js.map +1 -0
  208. package/lib-mjs/shortcut/ShortcutPlugin.js +2 -1
  209. package/lib-mjs/shortcut/ShortcutPlugin.js.map +1 -1
  210. package/lib-mjs/shortcut/shortcuts.d.ts +7 -0
  211. package/lib-mjs/shortcut/shortcuts.js +14 -0
  212. package/lib-mjs/shortcut/shortcuts.js.map +1 -1
  213. package/lib-mjs/shortcut/utils/setShortcutIndentationCommand.js +2 -2
  214. package/lib-mjs/shortcut/utils/setShortcutIndentationCommand.js.map +1 -1
  215. package/lib-mjs/tableEdit/OnTableEditorCreatedCallback.d.ts +4 -0
  216. package/lib-mjs/tableEdit/OnTableEditorCreatedCallback.js +2 -0
  217. package/lib-mjs/tableEdit/OnTableEditorCreatedCallback.js.map +1 -0
  218. package/lib-mjs/tableEdit/TableEditPlugin.d.ts +4 -1
  219. package/lib-mjs/tableEdit/TableEditPlugin.js +5 -2
  220. package/lib-mjs/tableEdit/TableEditPlugin.js.map +1 -1
  221. package/lib-mjs/tableEdit/editors/TableEditor.d.ts +4 -1
  222. package/lib-mjs/tableEdit/editors/TableEditor.js +24 -8
  223. package/lib-mjs/tableEdit/editors/TableEditor.js.map +1 -1
  224. package/lib-mjs/tableEdit/editors/features/TableEditFeature.js +3 -3
  225. package/lib-mjs/tableEdit/editors/features/TableEditFeature.js.map +1 -1
  226. package/lib-mjs/tableEdit/editors/features/TableInserter.d.ts +2 -1
  227. package/lib-mjs/tableEdit/editors/features/TableInserter.js +7 -9
  228. package/lib-mjs/tableEdit/editors/features/TableInserter.js.map +1 -1
  229. package/lib-mjs/tableEdit/editors/features/TableMover.d.ts +2 -1
  230. package/lib-mjs/tableEdit/editors/features/TableMover.js +8 -11
  231. package/lib-mjs/tableEdit/editors/features/TableMover.js.map +1 -1
  232. package/lib-mjs/tableEdit/editors/features/TableResizer.d.ts +2 -1
  233. package/lib-mjs/tableEdit/editors/features/TableResizer.js +19 -3
  234. package/lib-mjs/tableEdit/editors/features/TableResizer.js.map +1 -1
  235. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"TableEditor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/TableEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCellResizer } from './features/CellResizer';\nimport { createTableInserter } from './features/TableInserter';\nimport { createTableMover } from './features/TableMover';\nimport { createTableResizer } from './features/TableResizer';\nimport { disposeTableEditFeature } from './features/TableEditFeature';\nimport { isNodeOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { TableEditFeature } from './features/TableEditFeature';\nimport type { IEditor, TableSelection } from 'roosterjs-content-model-types';\n\nconst INSERTER_HOVER_OFFSET = 6;\nconst enum TOP_OR_SIDE {\n top = 0,\n side = 1,\n}\n/**\n * @internal\n *\n * A table has 6 hot areas to be resized/edited (take LTR example):\n *\n * [6] [ ]\n * +[ 1 ]+--------------------+\n * |[ ]| |\n * [ ] [ ] |\n * [ ] [ ] |\n * [2] [3] |\n * [ ] [ ] |\n * [ ][ 4 ]| |\n * +------------------+--------------------+\n * | | |\n * | | |\n * | | |\n * +------------------+--------------------+\n * [5]\n *\n * 1 - Hover area to show insert column button\n * 2 - Hover area to show insert row button\n * 3 - Hover area to show vertical resizing bar\n * 4 - Hover area to show horizontal resizing bar\n * 5 - Hover area to show whole table resize handle\n * 6 - Hover area to show whole table mover handle\n *\n * When set a different current table or change current TD, we need to update these areas\n */\nexport class TableEditor {\n // 1, 2 - Insert a column or a row\n private horizontalInserter: TableEditFeature | null = null;\n private verticalInserter: TableEditFeature | null = null;\n\n // 3, 4 - Resize a column or a row from a cell\n private horizontalResizer: TableEditFeature | null = null;\n private verticalResizer: TableEditFeature | null = null;\n\n // 5 - Resize whole table\n private tableResizer: TableEditFeature | null = null;\n\n // 6 - Move as well as select whole table\n private tableMover: TableEditFeature | null = null;\n\n private isRTL: boolean;\n private range: Range | null = null;\n private isCurrentlyEditing: boolean;\n\n constructor(\n private editor: IEditor,\n public readonly table: HTMLTableElement,\n private onChanged: () => void,\n private anchorContainer?: HTMLElement,\n private contentDiv?: EventTarget | null\n ) {\n this.isRTL = editor.getDocument().defaultView?.getComputedStyle(table).direction == 'rtl';\n this.setEditorFeatures();\n this.isCurrentlyEditing = false;\n }\n\n dispose() {\n this.disposeTableResizer();\n this.disposeCellResizers();\n this.disposeTableInserter();\n this.disposeTableMover();\n }\n\n isEditing(): boolean {\n return this.isCurrentlyEditing;\n }\n\n isOwnedElement(node: Node) {\n return [\n this.tableResizer,\n this.tableMover,\n this.horizontalInserter,\n this.verticalInserter,\n this.horizontalResizer,\n this.verticalResizer,\n ]\n .filter(feature => !!feature?.div)\n .some(feature => feature?.div == node);\n }\n\n onMouseMove(x: number, y: number) {\n // Get whole table rect\n const tableRect = normalizeRect(this.table.getBoundingClientRect());\n\n //console.log('>>>tableRect', tableRect);\n if (!tableRect) {\n return;\n }\n\n // Determine if cursor is on top or side\n const topOrSide =\n y <= tableRect.top + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.top\n : this.isRTL\n ? x >= tableRect.right - INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined\n : x <= tableRect.left + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined;\n const topOrSideBinary = topOrSide ? 1 : 0;\n\n // i is row index, j is column index\n for (let i = 0; i < this.table.rows.length; i++) {\n const tr = this.table.rows[i];\n let j = 0;\n for (; j < tr.cells.length; j++) {\n const td = tr.cells[j];\n const tdRect = normalizeRect(td.getBoundingClientRect());\n\n if (!tdRect || !tableRect) {\n continue;\n }\n\n // Determine the cell the cursor is in range of\n // Offset is only used for first row and column\n const lessThanBottom = y <= tdRect.bottom;\n const lessThanRight = this.isRTL\n ? x <= tdRect.right + INSERTER_HOVER_OFFSET * topOrSideBinary\n : x <= tdRect.right;\n const moreThanLeft = this.isRTL\n ? x >= tdRect.left\n : x >= tdRect.left - INSERTER_HOVER_OFFSET * topOrSideBinary;\n\n if (lessThanBottom && lessThanRight && moreThanLeft) {\n if (i === 0 && topOrSide == TOP_OR_SIDE.top) {\n const center = (tdRect.left + tdRect.right) / 2;\n const isOnRightHalf = this.isRTL ? x < center : x > center;\n this.setInserterTd(\n isOnRightHalf ? td : tr.cells[j - 1],\n false /*isHorizontal*/\n );\n } else if (j === 0 && topOrSide == TOP_OR_SIDE.side) {\n const tdAbove = this.table.rows[i - 1]?.cells[0];\n const tdAboveRect = tdAbove\n ? normalizeRect(tdAbove.getBoundingClientRect())\n : null;\n\n const isTdNotAboveMerged = !tdAboveRect\n ? null\n : this.isRTL\n ? tdAboveRect.right === tdRect.right\n : tdAboveRect.left === tdRect.left;\n\n this.setInserterTd(\n y < (tdRect.top + tdRect.bottom) / 2 && isTdNotAboveMerged\n ? tdAbove\n : td,\n true /*isHorizontal*/\n );\n } else {\n this.setInserterTd(null);\n }\n\n this.setResizingTd(td);\n\n //Cell found\n break;\n }\n }\n\n if (j < tr.cells.length) {\n break;\n }\n }\n\n // Create Mover and Resizer\n this.setEditorFeatures();\n }\n\n private setEditorFeatures() {\n if (!this.tableMover) {\n this.tableMover = createTableMover(\n this.table,\n this.editor,\n this.isRTL,\n this.onSelect,\n this.getOnMouseOut,\n this.contentDiv,\n this.anchorContainer\n );\n }\n\n if (!this.tableResizer) {\n this.tableResizer = createTableResizer(\n this.table,\n this.editor,\n this.isRTL,\n this.onStartTableResize,\n this.onFinishEditing,\n this.contentDiv,\n this.anchorContainer\n );\n }\n }\n\n private setResizingTd(td: HTMLTableCellElement) {\n if (this.horizontalResizer && this.horizontalResizer.node != td) {\n this.disposeCellResizers();\n }\n\n if (!this.horizontalResizer && td) {\n this.horizontalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n true /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n this.verticalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n false /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n }\n }\n\n /**\n * create or remove TableInserter\n * @param td td to attach to, set this to null to remove inserters (both horizontal and vertical)\n */\n private setInserterTd(td: HTMLTableCellElement | null, isHorizontal?: boolean) {\n const inserter = isHorizontal ? this.horizontalInserter : this.verticalInserter;\n if (td === null || (inserter && inserter.node != td)) {\n this.disposeTableInserter();\n }\n\n if (!this.horizontalInserter && !this.verticalInserter && td) {\n const newInserter = createTableInserter(\n this.editor,\n td,\n this.table,\n this.isRTL,\n !!isHorizontal,\n this.onInserted,\n this.getOnMouseOut,\n this.anchorContainer\n );\n if (isHorizontal) {\n this.horizontalInserter = newInserter;\n } else {\n this.verticalInserter = newInserter;\n }\n }\n }\n\n private disposeTableResizer() {\n if (this.tableResizer) {\n disposeTableEditFeature(this.tableResizer);\n this.tableResizer = null;\n }\n }\n\n private disposeTableInserter() {\n if (this.horizontalInserter) {\n disposeTableEditFeature(this.horizontalInserter);\n this.horizontalInserter = null;\n }\n if (this.verticalInserter) {\n disposeTableEditFeature(this.verticalInserter);\n this.verticalInserter = null;\n }\n }\n\n private disposeCellResizers() {\n if (this.horizontalResizer) {\n disposeTableEditFeature(this.horizontalResizer);\n this.horizontalResizer = null;\n }\n if (this.verticalResizer) {\n disposeTableEditFeature(this.verticalResizer);\n this.verticalResizer = null;\n }\n }\n\n private disposeTableMover() {\n if (this.tableMover) {\n disposeTableEditFeature(this.tableMover);\n this.tableMover = null;\n }\n }\n\n private onFinishEditing = (): false => {\n this.editor.focus();\n\n if (this.range) {\n this.editor.setDOMSelection({ type: 'range', range: this.range, isReverted: false });\n }\n\n this.editor.takeSnapshot(); // Pass in an empty callback to make sure ContentChangedEvent is triggered\n this.onChanged();\n this.isCurrentlyEditing = false;\n\n return false;\n };\n\n private onStartTableResize = () => {\n this.isCurrentlyEditing = true;\n this.onStartResize();\n };\n\n private onStartCellResize = () => {\n this.isCurrentlyEditing = true;\n this.disposeTableResizer();\n this.onStartResize();\n };\n\n private onStartResize() {\n this.isCurrentlyEditing = true;\n const range = this.editor.getDOMSelection();\n\n if (range && range.type == 'range') {\n this.range = range.range;\n }\n\n this.editor.takeSnapshot();\n }\n\n private onInserted = () => {\n this.disposeTableResizer();\n this.onFinishEditing();\n };\n\n /**\n * Public only for testing purposes\n * @param table the table to select\n */\n public onSelect = (table: HTMLTableElement) => {\n this.editor.focus();\n\n if (table) {\n const selection: TableSelection = {\n table: table,\n firstRow: 0,\n firstColumn: 0,\n lastRow: table.rows.length - 1,\n lastColumn: table.rows[table.rows.length - 1].cells.length - 1,\n type: 'table',\n };\n\n this.editor.setDOMSelection(selection);\n }\n };\n\n private getOnMouseOut = (feature: HTMLElement) => {\n return (ev: MouseEvent) => {\n if (\n feature &&\n ev.relatedTarget != feature &&\n isNodeOfType(this.contentDiv as Node, 'ELEMENT_NODE') &&\n isNodeOfType(ev.relatedTarget as Node, 'ELEMENT_NODE') &&\n !(this.contentDiv == ev.relatedTarget)\n ) {\n this.dispose();\n }\n };\n };\n}\n"]}
1
+ {"version":3,"file":"TableEditor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/TableEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCellResizer } from './features/CellResizer';\nimport { createTableInserter } from './features/TableInserter';\nimport { createTableMover } from './features/TableMover';\nimport { createTableResizer } from './features/TableResizer';\nimport { disposeTableEditFeature } from './features/TableEditFeature';\nimport { isNodeOfType, normalizeRect, parseTableCells } from 'roosterjs-content-model-dom';\nimport type { OnTableEditorCreatedCallback } from '../OnTableEditorCreatedCallback';\nimport type { TableEditFeature } from './features/TableEditFeature';\nimport type { IEditor, TableSelection } from 'roosterjs-content-model-types';\n\nconst INSERTER_HOVER_OFFSET = 6;\nconst enum TOP_OR_SIDE {\n top = 0,\n side = 1,\n}\n/**\n * @internal\n *\n * A table has 6 hot areas to be resized/edited (take LTR example):\n *\n * [6] [ ]\n * +[ 1 ]+--------------------+\n * |[ ]| |\n * [ ] [ ] |\n * [ ] [ ] |\n * [2] [3] |\n * [ ] [ ] |\n * [ ][ 4 ]| |\n * +------------------+--------------------+\n * | | |\n * | | |\n * | | |\n * +------------------+--------------------+\n * [5]\n *\n * 1 - Hover area to show insert column button\n * 2 - Hover area to show insert row button\n * 3 - Hover area to show vertical resizing bar\n * 4 - Hover area to show horizontal resizing bar\n * 5 - Hover area to show whole table resize handle\n * 6 - Hover area to show whole table mover handle\n *\n * When set a different current table or change current TD, we need to update these areas\n */\nexport class TableEditor {\n // 1, 2 - Insert a column or a row\n private horizontalInserter: TableEditFeature | null = null;\n private verticalInserter: TableEditFeature | null = null;\n\n // 3, 4 - Resize a column or a row from a cell\n private horizontalResizer: TableEditFeature | null = null;\n private verticalResizer: TableEditFeature | null = null;\n\n // 5 - Resize whole table\n private tableResizer: TableEditFeature | null = null;\n\n // 6 - Move as well as select whole table\n private tableMover: TableEditFeature | null = null;\n\n private isRTL: boolean;\n private range: Range | null = null;\n private isCurrentlyEditing: boolean;\n\n constructor(\n private editor: IEditor,\n public readonly table: HTMLTableElement,\n private onChanged: () => void,\n private anchorContainer?: HTMLElement,\n private contentDiv?: EventTarget | null,\n private onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.isRTL = editor.getDocument().defaultView?.getComputedStyle(table).direction == 'rtl';\n this.setEditorFeatures();\n this.isCurrentlyEditing = false;\n }\n\n dispose() {\n this.disposeTableResizer();\n this.disposeCellResizers();\n this.disposeTableInserter();\n this.disposeTableMover();\n }\n\n isEditing(): boolean {\n return this.isCurrentlyEditing;\n }\n\n isOwnedElement(node: Node) {\n return [\n this.tableResizer,\n this.tableMover,\n this.horizontalInserter,\n this.verticalInserter,\n this.horizontalResizer,\n this.verticalResizer,\n ]\n .filter(feature => !!feature?.div)\n .some(feature => feature?.div == node);\n }\n\n onMouseMove(x: number, y: number) {\n // Get whole table rect\n const tableRect = normalizeRect(this.table.getBoundingClientRect());\n\n if (!tableRect) {\n return;\n }\n\n // Determine if cursor is on top or side\n const topOrSide =\n y <= tableRect.top + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.top\n : this.isRTL\n ? x >= tableRect.right - INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined\n : x <= tableRect.left + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined;\n const topOrSideBinary = topOrSide ? 1 : 0;\n\n // i is row index, j is column index\n for (let i = 0; i < this.table.rows.length; i++) {\n const tr = this.table.rows[i];\n let j = 0;\n for (; j < tr.cells.length; j++) {\n const td = tr.cells[j];\n const tdRect = normalizeRect(td.getBoundingClientRect());\n\n if (!tdRect || !tableRect) {\n continue;\n }\n\n // Determine the cell the cursor is in range of\n // Offset is only used for first row and column\n const lessThanBottom = y <= tdRect.bottom;\n const lessThanRight = this.isRTL\n ? x <= tdRect.right + INSERTER_HOVER_OFFSET * topOrSideBinary\n : x <= tdRect.right;\n const moreThanLeft = this.isRTL\n ? x >= tdRect.left\n : x >= tdRect.left - INSERTER_HOVER_OFFSET * topOrSideBinary;\n\n if (lessThanBottom && lessThanRight && moreThanLeft) {\n if (i === 0 && topOrSide == TOP_OR_SIDE.top) {\n const center = (tdRect.left + tdRect.right) / 2;\n const isOnRightHalf = this.isRTL ? x < center : x > center;\n this.setInserterTd(\n isOnRightHalf ? td : tr.cells[j - 1],\n false /*isHorizontal*/\n );\n } else if (j === 0 && topOrSide == TOP_OR_SIDE.side) {\n const tdAbove = this.table.rows[i - 1]?.cells[0];\n const tdAboveRect = tdAbove\n ? normalizeRect(tdAbove.getBoundingClientRect())\n : null;\n\n const isTdNotAboveMerged = !tdAboveRect\n ? null\n : this.isRTL\n ? tdAboveRect.right === tdRect.right\n : tdAboveRect.left === tdRect.left;\n\n this.setInserterTd(\n y < (tdRect.top + tdRect.bottom) / 2 && isTdNotAboveMerged\n ? tdAbove\n : td,\n true /*isHorizontal*/\n );\n } else {\n this.setInserterTd(null);\n }\n\n this.setResizingTd(td);\n\n //Cell found\n break;\n }\n }\n\n if (j < tr.cells.length) {\n break;\n }\n }\n\n // Create Mover and Resizer\n this.setEditorFeatures();\n }\n\n private setEditorFeatures() {\n if (!this.tableMover) {\n this.tableMover = createTableMover(\n this.table,\n this.editor,\n this.isRTL,\n this.onSelect,\n this.contentDiv,\n this.anchorContainer,\n this.onEditorCreated\n );\n }\n\n if (!this.tableResizer) {\n this.tableResizer = createTableResizer(\n this.table,\n this.editor,\n this.isRTL,\n this.onStartTableResize,\n this.onFinishEditing,\n this.contentDiv,\n this.anchorContainer,\n this.onTableEditorCreated\n );\n }\n }\n\n private onEditorCreated = (\n editorType:\n | 'HorizontalTableInserter'\n | 'VerticalTableInserter'\n | 'TableMover'\n | 'TableResizer',\n element: HTMLElement\n ) => {\n const disposer = this.onTableEditorCreated?.(editorType, element);\n const onMouseOut = element && this.getOnMouseOut(element);\n if (onMouseOut) {\n element.addEventListener('mouseout', onMouseOut);\n }\n\n return () => {\n disposer?.();\n if (onMouseOut) {\n element.removeEventListener('mouseout', onMouseOut);\n }\n };\n };\n\n private setResizingTd(td: HTMLTableCellElement) {\n if (this.horizontalResizer && this.horizontalResizer.node != td) {\n this.disposeCellResizers();\n }\n\n if (!this.horizontalResizer && td) {\n this.horizontalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n true /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n this.verticalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n false /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n }\n }\n\n /**\n * create or remove TableInserter\n * @param td td to attach to, set this to null to remove inserters (both horizontal and vertical)\n */\n private setInserterTd(td: HTMLTableCellElement | null, isHorizontal?: boolean) {\n const inserter = isHorizontal ? this.horizontalInserter : this.verticalInserter;\n if (td === null || (inserter && inserter.node != td)) {\n this.disposeTableInserter();\n }\n\n if (!this.horizontalInserter && !this.verticalInserter && td) {\n const newInserter = createTableInserter(\n this.editor,\n td,\n this.table,\n this.isRTL,\n !!isHorizontal,\n this.onInserted,\n this.anchorContainer,\n this.onEditorCreated\n );\n if (isHorizontal) {\n this.horizontalInserter = newInserter;\n } else {\n this.verticalInserter = newInserter;\n }\n }\n }\n\n private disposeTableResizer() {\n if (this.tableResizer) {\n disposeTableEditFeature(this.tableResizer);\n this.tableResizer = null;\n }\n }\n\n private disposeTableInserter() {\n if (this.horizontalInserter) {\n disposeTableEditFeature(this.horizontalInserter);\n this.horizontalInserter = null;\n }\n if (this.verticalInserter) {\n disposeTableEditFeature(this.verticalInserter);\n this.verticalInserter = null;\n }\n }\n\n private disposeCellResizers() {\n if (this.horizontalResizer) {\n disposeTableEditFeature(this.horizontalResizer);\n this.horizontalResizer = null;\n }\n if (this.verticalResizer) {\n disposeTableEditFeature(this.verticalResizer);\n this.verticalResizer = null;\n }\n }\n\n private disposeTableMover() {\n if (this.tableMover) {\n disposeTableEditFeature(this.tableMover);\n this.tableMover = null;\n }\n }\n\n private onFinishEditing = (): false => {\n this.editor.focus();\n\n if (this.range) {\n this.editor.setDOMSelection({ type: 'range', range: this.range, isReverted: false });\n }\n\n this.editor.takeSnapshot(); // Pass in an empty callback to make sure ContentChangedEvent is triggered\n this.onChanged();\n this.isCurrentlyEditing = false;\n\n return false;\n };\n\n private onStartTableResize = () => {\n this.isCurrentlyEditing = true;\n this.onStartResize();\n };\n\n private onStartCellResize = () => {\n this.isCurrentlyEditing = true;\n this.disposeTableResizer();\n this.onStartResize();\n };\n\n private onStartResize() {\n this.isCurrentlyEditing = true;\n const range = this.editor.getDOMSelection();\n\n if (range && range.type == 'range') {\n this.range = range.range;\n }\n\n this.editor.takeSnapshot();\n }\n\n private onInserted = () => {\n this.disposeTableResizer();\n this.onFinishEditing();\n };\n\n /**\n * Public only for testing purposes\n * @param table the table to select\n */\n public onSelect = (table: HTMLTableElement) => {\n this.editor.focus();\n\n if (table) {\n const parsedTable = parseTableCells(table);\n const selection: TableSelection = {\n table: table,\n firstRow: 0,\n firstColumn: 0,\n lastRow: parsedTable.length - 1,\n lastColumn: (parsedTable[0]?.length ?? 0) - 1,\n type: 'table',\n };\n\n this.editor.setDOMSelection(selection);\n }\n };\n\n private getOnMouseOut = (feature: HTMLElement) => {\n return (ev: MouseEvent) => {\n if (\n feature &&\n ev.relatedTarget != feature &&\n isNodeOfType(this.contentDiv as Node, 'ELEMENT_NODE') &&\n isNodeOfType(ev.relatedTarget as Node, 'ELEMENT_NODE') &&\n !(this.contentDiv == ev.relatedTarget)\n ) {\n this.dispose();\n }\n };\n };\n}\n"]}
@@ -8,10 +8,10 @@ define(["require", "exports"], function (require, exports) {
8
8
  function disposeTableEditFeature(resizer) {
9
9
  var _a, _b, _c;
10
10
  if (resizer) {
11
- (_b = (_a = resizer.div) === null || _a === void 0 ? void 0 : _a.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(resizer.div);
12
- resizer.div = null;
13
- (_c = resizer.featureHandler) === null || _c === void 0 ? void 0 : _c.dispose();
11
+ (_a = resizer.featureHandler) === null || _a === void 0 ? void 0 : _a.dispose();
14
12
  resizer.featureHandler = null;
13
+ (_c = (_b = resizer.div) === null || _b === void 0 ? void 0 : _b.parentNode) === null || _c === void 0 ? void 0 : _c.removeChild(resizer.div);
14
+ resizer.div = null;
15
15
  }
16
16
  }
17
17
  exports.disposeTableEditFeature = disposeTableEditFeature;
@@ -1 +1 @@
1
- {"version":3,"file":"TableEditFeature.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableEditFeature.ts"],"names":[],"mappings":";;;;IAWA;;OAEG;IACH,SAAgB,uBAAuB,CAAC,OAAgC;;QACpE,IAAI,OAAO,EAAE;YACT,MAAA,MAAA,OAAO,CAAC,GAAG,0CAAE,UAAU,0CAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;YACnB,MAAA,OAAO,CAAC,cAAc,0CAAE,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;SACjC;IACL,CAAC;IAPD,0DAOC","sourcesContent":["import type { Disposable } from '../../../pluginUtils/Disposable';\n\n/**\n * @internal\n */\nexport interface TableEditFeature {\n node: Node;\n div: HTMLDivElement | null;\n featureHandler: Disposable | null;\n}\n\n/**\n * @internal\n */\nexport function disposeTableEditFeature(resizer: TableEditFeature | null) {\n if (resizer) {\n resizer.div?.parentNode?.removeChild(resizer.div);\n resizer.div = null;\n resizer.featureHandler?.dispose();\n resizer.featureHandler = null;\n }\n}\n"]}
1
+ {"version":3,"file":"TableEditFeature.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableEditFeature.ts"],"names":[],"mappings":";;;;IAWA;;OAEG;IACH,SAAgB,uBAAuB,CAAC,OAAgC;;QACpE,IAAI,OAAO,EAAE;YACT,MAAA,OAAO,CAAC,cAAc,0CAAE,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAC9B,MAAA,MAAA,OAAO,CAAC,GAAG,0CAAE,UAAU,0CAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;SACtB;IACL,CAAC;IAPD,0DAOC","sourcesContent":["import type { Disposable } from '../../../pluginUtils/Disposable';\n\n/**\n * @internal\n */\nexport interface TableEditFeature {\n node: Node;\n div: HTMLDivElement | null;\n featureHandler: Disposable | null;\n}\n\n/**\n * @internal\n */\nexport function disposeTableEditFeature(resizer: TableEditFeature | null) {\n if (resizer) {\n resizer.featureHandler?.dispose();\n resizer.featureHandler = null;\n resizer.div?.parentNode?.removeChild(resizer.div);\n resizer.div = null;\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
+ import type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';
1
2
  import type { TableEditFeature } from './TableEditFeature';
2
3
  import type { IEditor } from 'roosterjs-content-model-types';
3
4
  /**
4
5
  * @internal
5
6
  */
6
- export declare function createTableInserter(editor: IEditor, td: HTMLTableCellElement, table: HTMLTableElement, isRTL: boolean, isHorizontal: boolean, onInsert: () => void, getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void, anchorContainer?: HTMLElement): TableEditFeature | null;
7
+ export declare function createTableInserter(editor: IEditor, td: HTMLTableCellElement, table: HTMLTableElement, isRTL: boolean, isHorizontal: boolean, onInsert: () => void, anchorContainer?: HTMLElement, onTableEditorCreated?: OnTableEditorCreatedCallback): TableEditFeature | null;
@@ -9,7 +9,7 @@ define(["require", "exports", "../../../pluginUtils/CreateElement/createElement"
9
9
  /**
10
10
  * @internal
11
11
  */
12
- function createTableInserter(editor, td, table, isRTL, isHorizontal, onInsert, getOnMouseOut, anchorContainer) {
12
+ function createTableInserter(editor, td, table, isRTL, isHorizontal, onInsert, anchorContainer, onTableEditorCreated) {
13
13
  var tdRect = (0, roosterjs_content_model_dom_1.normalizeRect)(td.getBoundingClientRect());
14
14
  var viewPort = editor.getVisibleViewport();
15
15
  var tableRect = table && viewPort ? (0, getIntersectedRect_1.getIntersectedRect)([table], [viewPort]) : null;
@@ -35,14 +35,14 @@ define(["require", "exports", "../../../pluginUtils/CreateElement/createElement"
35
35
  div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
36
36
  }
37
37
  (anchorContainer || document_1.body).appendChild(div);
38
- var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, getOnMouseOut);
38
+ var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, onTableEditorCreated);
39
39
  return { div: div, featureHandler: handler, node: td };
40
40
  }
41
41
  return null;
42
42
  }
43
43
  exports.createTableInserter = createTableInserter;
44
44
  var TableInsertHandler = /** @class */ (function () {
45
- function TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, getOnMouseOut) {
45
+ function TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, onTableEditorCreated) {
46
46
  var _this = this;
47
47
  this.div = div;
48
48
  this.td = td;
@@ -77,15 +77,13 @@ define(["require", "exports", "../../../pluginUtils/CreateElement/createElement"
77
77
  _this.onInsert();
78
78
  };
79
79
  this.div.addEventListener('click', this.insertTd);
80
- this.onMouseOutEvent = getOnMouseOut(div);
81
- this.div.addEventListener('mouseout', this.onMouseOutEvent);
80
+ this.disposer = onTableEditorCreated === null || onTableEditorCreated === void 0 ? void 0 : onTableEditorCreated(isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter', div);
82
81
  }
83
82
  TableInsertHandler.prototype.dispose = function () {
83
+ var _a;
84
84
  this.div.removeEventListener('click', this.insertTd);
85
- if (this.onMouseOutEvent) {
86
- this.div.removeEventListener('mouseout', this.onMouseOutEvent);
87
- }
88
- this.onMouseOutEvent = null;
85
+ (_a = this.disposer) === null || _a === void 0 ? void 0 : _a.call(this);
86
+ this.disposer = undefined;
89
87
  };
90
88
  return TableInsertHandler;
91
89
  }());
@@ -1 +1 @@
1
- {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/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 { isElementOfType, normalizeRect } 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 './TableEditFeature';\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 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"]}
1
+ {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/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 { isElementOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\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 './TableEditFeature';\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 function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onInsert: () => void,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\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 onTableEditorCreated\n );\n\n return { div, featureHandler: handler, node: td };\n }\n\n return null;\n}\n\nclass TableInsertHandler implements Disposable {\n private disposer: undefined | (() => 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 onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.disposer = onTableEditorCreated?.(\n isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter',\n div\n );\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n this.disposer?.();\n this.disposer = undefined;\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"]}
@@ -1,3 +1,4 @@
1
+ import type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';
1
2
  import type { IEditor } from 'roosterjs-content-model-types';
2
3
  import type { TableEditFeature } from './TableEditFeature';
3
4
  /**
@@ -5,4 +6,4 @@ import type { TableEditFeature } from './TableEditFeature';
5
6
  * Contains the function to select whole table
6
7
  * Moving behavior not implemented yet
7
8
  */
8
- export declare function createTableMover(table: HTMLTableElement, editor: IEditor, isRTL: boolean, onFinishDragging: (table: HTMLTableElement) => void, getOnMouseOut: (feature: HTMLElement) => (ev: MouseEvent) => void, contentDiv?: EventTarget | null, anchorContainer?: HTMLElement): TableEditFeature | null;
9
+ export declare function createTableMover(table: HTMLTableElement, editor: IEditor, isRTL: boolean, onFinishDragging: (table: HTMLTableElement) => void, contentDiv?: EventTarget | null, anchorContainer?: HTMLElement, onTableEditorCreated?: OnTableEditorCreatedCallback): TableEditFeature | null;
@@ -9,7 +9,7 @@ define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/creat
9
9
  * Contains the function to select whole table
10
10
  * Moving behavior not implemented yet
11
11
  */
12
- function createTableMover(table, editor, isRTL, onFinishDragging, getOnMouseOut, contentDiv, anchorContainer) {
12
+ function createTableMover(table, editor, isRTL, onFinishDragging, contentDiv, anchorContainer, onTableEditorCreated) {
13
13
  var rect = (0, roosterjs_content_model_dom_1.normalizeRect)(table.getBoundingClientRect());
14
14
  if (!isTableTopVisible(editor, rect, contentDiv)) {
15
15
  return null;
@@ -40,25 +40,22 @@ define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/creat
40
40
  };
41
41
  var featureHandler = new TableMoverFeature(div, context, setDivPosition, {
42
42
  onDragEnd: onDragEnd,
43
- }, context.zoomScale, getOnMouseOut);
43
+ }, context.zoomScale, onTableEditorCreated);
44
44
  return { div: div, featureHandler: featureHandler, node: table };
45
45
  }
46
46
  exports.createTableMover = createTableMover;
47
47
  var TableMoverFeature = /** @class */ (function (_super) {
48
48
  (0, tslib_1.__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);
49
+ function TableMoverFeature(div, context, onSubmit, handler, zoomScale, onTableEditorCreated) {
50
+ var _this = _super.call(this, div, context, onSubmit, handler, zoomScale) || this;
51
+ _this.disposer = onTableEditorCreated === null || onTableEditorCreated === void 0 ? void 0 : onTableEditorCreated('TableMover', div);
54
52
  return _this;
55
53
  }
56
54
  TableMoverFeature.prototype.dispose = function () {
55
+ var _a;
56
+ (_a = this.disposer) === null || _a === void 0 ? void 0 : _a.call(this);
57
+ this.disposer = undefined;
57
58
  _super.prototype.dispose.call(this);
58
- if (this.onMouseOut) {
59
- this.div.removeEventListener('mouseout', this.onMouseOut);
60
- }
61
- this.onMouseOut = null;
62
59
  };
63
60
  return TableMoverFeature;
64
61
  }(DragAndDropHelper_1.DragAndDropHelper));
@@ -1 +1 @@
1
- {"version":3,"file":"TableMover.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableMover.ts"],"names":[],"mappings":";;;;IAOA,IAAM,kBAAkB,GAAG,EAAE,CAAC;IAC9B,IAAM,cAAc,GAAG,cAAc,CAAC;IAEtC;;;;OAIG;IACH,SAAgB,gBAAgB,CAC5B,KAAuB,EACvB,MAAe,EACf,KAAc,EACd,gBAAmD,EACnD,aAAiE,EACjE,UAA+B,EAC/B,eAA6B;QAE7B,IAAM,IAAI,GAAG,IAAA,2CAAa,EAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAkB,CAAC,EAAE;YACtD,OAAO,IAAI,CAAC;SACf;QAED,IAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAC7D,IAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC;QACrC,IAAM,iBAAiB,GAAG;YACtB,GAAG,EAAE,KAAK;YACV,KAAK,EAAE,mFAAmF;SAC7F,CAAC;QAEF,IAAM,GAAG,GAAG,IAAA,6BAAa,EAAC,iBAAiB,EAAE,QAAQ,CAAmB,CAAC;QAEzE,GAAG,CAAC,EAAE,GAAG,cAAc,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAM,kBAAkB,OAAI,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,MAAM,GAAM,kBAAkB,OAAI,CAAC;QAE7C,CAAC,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAM,OAAO,GAAsB;YAC/B,KAAK,OAAA;YACL,SAAS,WAAA;YACT,IAAI,MAAA;YACJ,KAAK,OAAA;SACR,CAAC;QAEF,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE7B,IAAM,SAAS,GAAG,UAAC,OAA0B,EAAE,KAAiB;YAC5D,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE;gBACrB,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aACnC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;QAEF,IAAM,cAAc,GAAG,IAAI,iBAAiB,CACxC,GAAG,EACH,OAAO,EACP,cAAc,EACd;YACI,SAAS,WAAA;SACZ,EACD,OAAO,CAAC,SAAS,EACjB,aAAa,CAChB,CAAC;QAEF,OAAO,EAAE,GAAG,KAAA,EAAE,cAAc,gBAAA,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IA1DD,4CA0DC;IAaD;QAAgC,kDAAyD;QAGrF,2BACY,GAAgB,EACxB,OAA0B,EAC1B,QAIS,EACT,OAAmE,EACnE,SAAiB,EACjB,aAAiE,EACjE,WAAiC,EACjC,SAAuB;YAZ3B,YAcI,kBAAM,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,SAGjE;YAhBW,SAAG,GAAH,GAAG,CAAa;YAcxB,KAAI,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACrC,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAI,CAAC,UAAU,CAAC,CAAC;;QACtD,CAAC;QAED,mCAAO,GAAP;YACI,iBAAM,OAAO,WAAE,CAAC;YAChB,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;aAC7D;YACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3B,CAAC;QACL,wBAAC;IAAD,CAAC,AA7BD,CAAgC,qCAAiB,GA6BhD;IAED,SAAS,cAAc,CAAC,OAA0B,EAAE,OAAoB;QAC5D,IAAA,IAAI,GAAK,OAAO,KAAZ,CAAa;QACzB,IAAI,IAAI,EAAE;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,GAAM,IAAI,CAAC,GAAG,GAAG,kBAAkB,OAAI,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,IAAI,GAAM,IAAI,CAAC,IAAI,GAAG,kBAAkB,GAAG,CAAC,OAAI,CAAC;SAClE;IACL,CAAC;IAED,SAAS,iBAAiB,CAAC,MAAe,EAAE,IAAiB,EAAE,UAAwB;QACnF,IAAM,eAAe,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACpD,IAAI,IAAA,0CAAY,EAAC,UAAU,EAAE,cAAc,CAAC,IAAI,eAAe,IAAI,IAAI,EAAE;YACrE,IAAM,aAAa,GAAG,IAAA,2CAAa,EAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAExE,OAAO,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,eAAe,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;SAC9F;QAED,OAAO,IAAI,CAAC;IAChB,CAAC","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { DragAndDropHelper } from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport { isNodeOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { DragAndDropHandler } from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport type { IEditor, Rect } from 'roosterjs-content-model-types';\nimport type { TableEditFeature } from './TableEditFeature';\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 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): TableEditFeature | 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"]}
1
+ {"version":3,"file":"TableMover.js","sourceRoot":"","sources":["../../../../../../packages/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 { isNodeOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport type { DragAndDropHandler } from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport type { IEditor, Rect } from 'roosterjs-content-model-types';\nimport type { TableEditFeature } from './TableEditFeature';\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 function createTableMover(\n table: HTMLTableElement,\n editor: IEditor,\n isRTL: boolean,\n onFinishDragging: (table: HTMLTableElement) => void,\n contentDiv?: EventTarget | null,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n): TableEditFeature | 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 onTableEditorCreated\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 disposer: undefined | (() => void);\n\n constructor(\n 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 onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n super(div, context, onSubmit, handler, zoomScale);\n this.disposer = onTableEditorCreated?.('TableMover', div);\n }\n\n dispose(): void {\n this.disposer?.();\n this.disposer = undefined;\n super.dispose();\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"]}
@@ -1,6 +1,7 @@
1
+ import type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';
1
2
  import type { IEditor } from 'roosterjs-content-model-types';
2
3
  import type { TableEditFeature } from './TableEditFeature';
3
4
  /**
4
5
  * @internal
5
6
  */
6
- export declare function createTableResizer(table: HTMLTableElement, editor: IEditor, isRTL: boolean, onStart: () => void, onEnd: () => false, contentDiv?: EventTarget | null, anchorContainer?: HTMLElement): TableEditFeature | null;
7
+ export declare function createTableResizer(table: HTMLTableElement, editor: IEditor, isRTL: boolean, onStart: () => void, onEnd: () => false, contentDiv?: EventTarget | null, anchorContainer?: HTMLElement, onTableEditorCreated?: OnTableEditorCreatedCallback): TableEditFeature | null;
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "../../../pluginUtils/CreateElement/createElement", "../../../pluginUtils/DragAndDrop/DragAndDropHelper", "roosterjs-content-model-dom"], function (require, exports, createElement_1, DragAndDropHelper_1, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/createElement", "../../../pluginUtils/DragAndDrop/DragAndDropHelper", "roosterjs-content-model-dom"], function (require, exports, tslib_1, createElement_1, DragAndDropHelper_1, roosterjs_content_model_dom_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.createTableResizer = void 0;
@@ -7,7 +7,7 @@ define(["require", "exports", "../../../pluginUtils/CreateElement/createElement"
7
7
  /**
8
8
  * @internal
9
9
  */
10
- function createTableResizer(table, editor, isRTL, onStart, onEnd, contentDiv, anchorContainer) {
10
+ function createTableResizer(table, editor, isRTL, onStart, onEnd, contentDiv, anchorContainer, onTableEditorCreated) {
11
11
  var rect = (0, roosterjs_content_model_dom_1.normalizeRect)(table.getBoundingClientRect());
12
12
  if (!isTableBottomVisible(editor, rect, contentDiv)) {
13
13
  return null;
@@ -34,15 +34,30 @@ define(["require", "exports", "../../../pluginUtils/CreateElement/createElement"
34
34
  contentDiv: contentDiv,
35
35
  };
36
36
  setDivPosition(context, div);
37
- var featureHandler = new DragAndDropHelper_1.DragAndDropHelper(div, context, hideResizer, // Resizer is hidden while dragging only
37
+ var featureHandler = new TableResizer(div, context, hideResizer, // Resizer is hidden while dragging only
38
38
  {
39
39
  onDragStart: onDragStart,
40
40
  onDragging: onDragging,
41
41
  onDragEnd: onDragEnd,
42
- }, zoomScale, editor.getEnvironment().isMobileOrTablet);
42
+ }, zoomScale, editor.getEnvironment().isMobileOrTablet, onTableEditorCreated);
43
43
  return { node: table, div: div, featureHandler: featureHandler };
44
44
  }
45
45
  exports.createTableResizer = createTableResizer;
46
+ var TableResizer = /** @class */ (function (_super) {
47
+ (0, tslib_1.__extends)(TableResizer, _super);
48
+ function TableResizer(trigger, context, onSubmit, handler, zoomScale, forceMobile, onTableEditorCreated) {
49
+ var _this = _super.call(this, trigger, context, onSubmit, handler, zoomScale, forceMobile) || this;
50
+ _this.disposer = onTableEditorCreated === null || onTableEditorCreated === void 0 ? void 0 : onTableEditorCreated('TableResizer', trigger);
51
+ return _this;
52
+ }
53
+ TableResizer.prototype.dispose = function () {
54
+ var _a;
55
+ (_a = this.disposer) === null || _a === void 0 ? void 0 : _a.call(this);
56
+ this.disposer = undefined;
57
+ _super.prototype.dispose.call(this);
58
+ };
59
+ return TableResizer;
60
+ }(DragAndDropHelper_1.DragAndDropHelper));
46
61
  function onDragStart(context, event) {
47
62
  context.onStart();
48
63
  var editor = context.editor, table = context.table;
@@ -1 +1 @@
1
- {"version":3,"file":"TableResizer.js","sourceRoot":"","sources":["../../../../../../packages/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 {\n getFirstSelectedTable,\n isNodeOfType,\n normalizeRect,\n normalizeTable,\n} from 'roosterjs-content-model-dom';\nimport type { ContentModelTable, IEditor, Rect } from 'roosterjs-content-model-types';\nimport type { TableEditFeature } from './TableEditFeature';\n\nconst TABLE_RESIZER_LENGTH = 12;\nconst TABLE_RESIZER_ID = '_Table_Resizer';\n\n/**\n * @internal\n */\nexport 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 (context.editor.isDisposed()) {\n return false;\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"]}
1
+ {"version":3,"file":"TableResizer.js","sourceRoot":"","sources":["../../../../../../packages/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';\n\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport {\n getFirstSelectedTable,\n isNodeOfType,\n normalizeRect,\n normalizeTable,\n} from 'roosterjs-content-model-dom';\nimport type { ContentModelTable, IEditor, Rect } from 'roosterjs-content-model-types';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { DragAndDropHandler } from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\n\nconst TABLE_RESIZER_LENGTH = 12;\nconst TABLE_RESIZER_ID = '_Table_Resizer';\n\n/**\n * @internal\n */\nexport 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 onTableEditorCreated?: OnTableEditorCreatedCallback\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 TableResizer(\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 onTableEditorCreated\n );\n\n return { node: table, div, featureHandler };\n}\n\nclass TableResizer extends DragAndDropHelper<DragAndDropContext, DragAndDropInitValue> {\n private disposer: undefined | (() => void);\n\n constructor(\n trigger: HTMLElement,\n context: DragAndDropContext,\n onSubmit: (context: DragAndDropContext, trigger: HTMLElement) => void,\n handler: DragAndDropHandler<DragAndDropContext, DragAndDropInitValue>,\n zoomScale: number,\n forceMobile?: boolean,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n super(trigger, context, onSubmit, handler, zoomScale, forceMobile);\n this.disposer = onTableEditorCreated?.('TableResizer', trigger);\n }\n\n dispose(): void {\n this.disposer?.();\n this.disposer = undefined;\n super.dispose();\n }\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 (context.editor.isDisposed()) {\n return false;\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"]}
@@ -6,23 +6,31 @@ export declare type AutoFormatOptions = {
6
6
  /**
7
7
  * When true, after type *, ->, -, --, => , —, > and space key a type of bullet list will be triggered. @default true
8
8
  */
9
- autoBullet: boolean;
9
+ autoBullet?: boolean;
10
10
  /**
11
11
  * When true, after type 1, A, a, i, I followed by ., ), - or between () and space key a type of numbering list will be triggered. @default true
12
12
  */
13
- autoNumbering: boolean;
13
+ autoNumbering?: boolean;
14
14
  /**
15
15
  * When press backspace before a link, remove the hyperlink
16
16
  */
17
- autoUnlink: boolean;
17
+ autoUnlink?: boolean;
18
18
  /**
19
19
  * When paste content, create hyperlink for the pasted link
20
20
  */
21
- autoLink: boolean;
21
+ autoLink?: boolean;
22
22
  /**
23
23
  * Transform -- into hyphen, if typed between two words
24
24
  */
25
- autoHyphen: boolean;
25
+ autoHyphen?: boolean;
26
+ /**
27
+ * Transform 1/2, 1/4, 3/4 into fraction character
28
+ */
29
+ autoFraction?: boolean;
30
+ /**
31
+ * Transform ordinal numbers into superscript
32
+ */
33
+ autoOrdinals?: boolean;
26
34
  };
27
35
  /**
28
36
  * Auto Format plugin handles auto formatting, such as transforming * characters into a bullet list.
@@ -38,6 +46,8 @@ export declare class AutoFormatPlugin implements EditorPlugin {
38
46
  * - autoLink: A boolean that enables or disables automatic hyperlink creation when pasting or typing content. Defaults to false.
39
47
  * - autoUnlink: A boolean that enables or disables automatic hyperlink removal when pressing backspace. Defaults to false.
40
48
  * - autoHyphen: A boolean that enables or disables automatic hyphen transformation. Defaults to false.
49
+ * - autoFraction: A boolean that enables or disables automatic fraction transformation. Defaults to false.
50
+ * - autoOrdinals: A boolean that enables or disables automatic ordinal number transformation. Defaults to false.
41
51
  */
42
52
  constructor(options?: AutoFormatOptions);
43
53
  /**
@@ -1,8 +1,11 @@
1
+ import { ChangeSource } from 'roosterjs-content-model-dom';
1
2
  import { createLink } from './link/createLink';
2
3
  import { createLinkAfterSpace } from './link/createLinkAfterSpace';
3
4
  import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';
4
5
  import { keyboardListTrigger } from './list/keyboardListTrigger';
6
+ import { transformFraction } from './numbers/transformFraction';
5
7
  import { transformHyphen } from './hyphen/transformHyphen';
8
+ import { transformOrdinals } from './numbers/transformOrdinals';
6
9
  import { unlink } from './link/unlink';
7
10
  /**
8
11
  * @internal
@@ -13,6 +16,8 @@ var DefaultOptions = {
13
16
  autoUnlink: false,
14
17
  autoLink: false,
15
18
  autoHyphen: false,
19
+ autoFraction: false,
20
+ autoOrdinals: false,
16
21
  };
17
22
  /**
18
23
  * Auto Format plugin handles auto formatting, such as transforming * characters into a bullet list.
@@ -26,6 +31,8 @@ var AutoFormatPlugin = /** @class */ (function () {
26
31
  * - autoLink: A boolean that enables or disables automatic hyperlink creation when pasting or typing content. Defaults to false.
27
32
  * - autoUnlink: A boolean that enables or disables automatic hyperlink removal when pressing backspace. Defaults to false.
28
33
  * - autoHyphen: A boolean that enables or disables automatic hyphen transformation. Defaults to false.
34
+ * - autoFraction: A boolean that enables or disables automatic fraction transformation. Defaults to false.
35
+ * - autoOrdinals: A boolean that enables or disables automatic ordinal number transformation. Defaults to false.
29
36
  */
30
37
  function AutoFormatPlugin(options) {
31
38
  if (options === void 0) { options = DefaultOptions; }
@@ -86,20 +93,40 @@ var AutoFormatPlugin = /** @class */ (function () {
86
93
  selection.range.collapsed) {
87
94
  switch (rawEvent.data) {
88
95
  case ' ':
96
+ var formatOptions_1 = {
97
+ changeSource: '',
98
+ apiName: '',
99
+ };
89
100
  formatTextSegmentBeforeSelectionMarker(editor, function (model, previousSegment, paragraph, _markerFormat, context) {
90
- var _a = _this.options, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering, autoLink = _a.autoLink, autoHyphen = _a.autoHyphen;
101
+ var _a = _this.options, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering, autoLink = _a.autoLink, autoHyphen = _a.autoHyphen, autoFraction = _a.autoFraction, autoOrdinals = _a.autoOrdinals;
91
102
  var shouldHyphen = false;
92
103
  var shouldLink = false;
104
+ var shouldList = false;
105
+ var shouldFraction = false;
106
+ var shouldOrdinals = false;
107
+ if (autoBullet || autoNumbering) {
108
+ shouldList = keyboardListTrigger(model, paragraph, context, autoBullet, autoNumbering);
109
+ }
93
110
  if (autoLink) {
94
111
  shouldLink = createLinkAfterSpace(previousSegment, paragraph, context);
95
112
  }
96
113
  if (autoHyphen) {
97
114
  shouldHyphen = transformHyphen(previousSegment, paragraph, context);
98
115
  }
99
- return (keyboardListTrigger(model, paragraph, context, autoBullet, autoNumbering) ||
116
+ if (autoFraction) {
117
+ shouldFraction = transformFraction(previousSegment, paragraph, context);
118
+ }
119
+ if (autoOrdinals) {
120
+ shouldOrdinals = transformOrdinals(previousSegment, paragraph, context);
121
+ }
122
+ formatOptions_1.apiName = getApiName(shouldList, shouldHyphen);
123
+ formatOptions_1.changeSource = getChangeSource(shouldList, shouldHyphen, shouldLink);
124
+ return (shouldList ||
100
125
  shouldHyphen ||
101
- shouldLink);
102
- });
126
+ shouldLink ||
127
+ shouldFraction ||
128
+ shouldOrdinals);
129
+ }, formatOptions_1);
103
130
  break;
104
131
  }
105
132
  }
@@ -125,4 +152,14 @@ var AutoFormatPlugin = /** @class */ (function () {
125
152
  return AutoFormatPlugin;
126
153
  }());
127
154
  export { AutoFormatPlugin };
155
+ var getApiName = function (shouldList, shouldHyphen) {
156
+ return shouldList ? 'autoToggleList' : shouldHyphen ? 'autoHyphen' : '';
157
+ };
158
+ var getChangeSource = function (shouldList, shouldHyphen, shouldLink) {
159
+ return shouldList || shouldHyphen
160
+ ? ChangeSource.AutoFormat
161
+ : shouldLink
162
+ ? ChangeSource.AutoLink
163
+ : '';
164
+ };
128
165
  //# sourceMappingURL=AutoFormatPlugin.js.map