@atlaskit/editor-plugin-table 7.16.11 → 7.16.13

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 (254) hide show
  1. package/.eslintrc.js +3 -3
  2. package/CHANGELOG.md +16 -0
  3. package/dist/cjs/commands/misc.js +3 -3
  4. package/dist/cjs/nodeviews/TableCell.js +10 -10
  5. package/dist/cjs/nodeviews/TableContainer.js +83 -27
  6. package/dist/cjs/nodeviews/TableResizer.js +40 -19
  7. package/dist/cjs/nodeviews/TableRow.js +23 -23
  8. package/dist/cjs/pm-plugins/table-resizing/plugin.js +3 -3
  9. package/dist/cjs/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  10. package/dist/cjs/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  11. package/dist/cjs/ui/FloatingContextualMenu/styles.js +1 -1
  12. package/dist/cjs/ui/FloatingDragMenu/styles.js +1 -1
  13. package/dist/cjs/ui/common-styles.js +13 -13
  14. package/dist/cjs/ui/ui-styles.js +25 -25
  15. package/dist/cjs/utils/guidelines.js +7 -4
  16. package/dist/cjs/utils/merged-cells.js +3 -3
  17. package/dist/cjs/utils/snapping.js +7 -8
  18. package/dist/es2019/commands/misc.js +3 -3
  19. package/dist/es2019/nodeviews/TableContainer.js +70 -9
  20. package/dist/es2019/nodeviews/TableResizer.js +42 -21
  21. package/dist/es2019/nodeviews/TableRow.js +21 -21
  22. package/dist/es2019/pm-plugins/table-resizing/plugin.js +3 -3
  23. package/dist/es2019/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  24. package/dist/es2019/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  25. package/dist/es2019/ui/FloatingContextualMenu/styles.js +47 -47
  26. package/dist/es2019/ui/FloatingDragMenu/styles.js +30 -30
  27. package/dist/es2019/ui/common-styles.js +802 -816
  28. package/dist/es2019/ui/ui-styles.js +665 -678
  29. package/dist/es2019/utils/guidelines.js +5 -2
  30. package/dist/es2019/utils/merged-cells.js +3 -3
  31. package/dist/es2019/utils/snapping.js +5 -6
  32. package/dist/esm/commands/misc.js +3 -3
  33. package/dist/esm/nodeviews/TableCell.js +10 -10
  34. package/dist/esm/nodeviews/TableContainer.js +85 -29
  35. package/dist/esm/nodeviews/TableResizer.js +42 -21
  36. package/dist/esm/nodeviews/TableRow.js +23 -23
  37. package/dist/esm/pm-plugins/table-resizing/plugin.js +3 -3
  38. package/dist/esm/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  39. package/dist/esm/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  40. package/dist/esm/ui/FloatingContextualMenu/styles.js +1 -1
  41. package/dist/esm/ui/FloatingDragMenu/styles.js +1 -1
  42. package/dist/esm/ui/common-styles.js +13 -13
  43. package/dist/esm/ui/ui-styles.js +25 -25
  44. package/dist/esm/utils/guidelines.js +6 -3
  45. package/dist/esm/utils/merged-cells.js +3 -3
  46. package/dist/esm/utils/snapping.js +6 -7
  47. package/dist/types/nodeviews/TableResizer.d.ts +2 -1
  48. package/dist/types/pm-plugins/decorations/utils/index.d.ts +1 -1
  49. package/dist/types/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  50. package/dist/types/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  51. package/dist/types/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  52. package/dist/types/ui/ColumnResizeWidget/index.d.ts +1 -1
  53. package/dist/types/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  54. package/dist/types/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  55. package/dist/types/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  56. package/dist/types/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  57. package/dist/types/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  58. package/dist/types/utils/guidelines.d.ts +2 -1
  59. package/dist/types/utils/snapping.d.ts +3 -2
  60. package/dist/types-ts4.5/nodeviews/TableResizer.d.ts +2 -1
  61. package/dist/types-ts4.5/pm-plugins/decorations/utils/index.d.ts +1 -1
  62. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  63. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  64. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  65. package/dist/types-ts4.5/ui/ColumnResizeWidget/index.d.ts +1 -1
  66. package/dist/types-ts4.5/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  67. package/dist/types-ts4.5/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  68. package/dist/types-ts4.5/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  69. package/dist/types-ts4.5/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  70. package/dist/types-ts4.5/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  71. package/dist/types-ts4.5/utils/guidelines.d.ts +2 -1
  72. package/dist/types-ts4.5/utils/snapping.d.ts +3 -2
  73. package/docs/0-intro.tsx +9 -7
  74. package/package.json +3 -3
  75. package/report.api.md +67 -66
  76. package/src/commands/clear.ts +36 -44
  77. package/src/commands/collapse.ts +8 -8
  78. package/src/commands/column-resize.ts +412 -452
  79. package/src/commands/delete.ts +14 -14
  80. package/src/commands/display-mode.ts +10 -11
  81. package/src/commands/go-to-next-cell.ts +48 -54
  82. package/src/commands/hover.ts +210 -227
  83. package/src/commands/index.ts +35 -35
  84. package/src/commands/insert.ts +208 -235
  85. package/src/commands/misc.ts +655 -748
  86. package/src/commands/referentiality.ts +9 -9
  87. package/src/commands/selection.ts +433 -563
  88. package/src/commands/sort.ts +68 -86
  89. package/src/commands/split-cell.ts +14 -14
  90. package/src/commands/toggle.ts +69 -67
  91. package/src/commands-with-analytics.ts +570 -639
  92. package/src/create-plugin-config.ts +13 -13
  93. package/src/event-handlers.ts +513 -612
  94. package/src/handlers.ts +120 -133
  95. package/src/nodeviews/ExternalDropTargets.tsx +68 -73
  96. package/src/nodeviews/OverflowShadowsObserver.ts +148 -157
  97. package/src/nodeviews/TableCell.ts +47 -54
  98. package/src/nodeviews/TableComponent.tsx +1018 -1112
  99. package/src/nodeviews/TableComponentWithSharedState.tsx +91 -94
  100. package/src/nodeviews/TableContainer.tsx +384 -340
  101. package/src/nodeviews/TableNodeViewBase.ts +19 -24
  102. package/src/nodeviews/TableResizer.tsx +642 -653
  103. package/src/nodeviews/TableRow.ts +580 -629
  104. package/src/nodeviews/TableStickyScrollbar.ts +173 -190
  105. package/src/nodeviews/__mocks__/OverflowShadowsObserver.ts +8 -8
  106. package/src/nodeviews/__mocks__/OverridableMock.ts +14 -15
  107. package/src/nodeviews/table.tsx +345 -375
  108. package/src/nodeviews/types.ts +21 -24
  109. package/src/nodeviews/update-overflow-shadows.ts +8 -14
  110. package/src/plugin.tsx +578 -603
  111. package/src/pm-plugins/analytics/actions.ts +10 -12
  112. package/src/pm-plugins/analytics/commands.ts +31 -37
  113. package/src/pm-plugins/analytics/plugin-factory.ts +4 -2
  114. package/src/pm-plugins/analytics/plugin-key.ts +1 -3
  115. package/src/pm-plugins/analytics/plugin.ts +60 -70
  116. package/src/pm-plugins/analytics/reducer.ts +19 -19
  117. package/src/pm-plugins/analytics/types.ts +10 -10
  118. package/src/pm-plugins/analytics/utils/moved-event.ts +38 -38
  119. package/src/pm-plugins/decorations/plugin.ts +58 -77
  120. package/src/pm-plugins/decorations/utils/column-controls.ts +59 -71
  121. package/src/pm-plugins/decorations/utils/column-resizing.ts +50 -57
  122. package/src/pm-plugins/decorations/utils/compose-decorations.ts +6 -6
  123. package/src/pm-plugins/decorations/utils/index.ts +3 -6
  124. package/src/pm-plugins/decorations/utils/types.ts +7 -12
  125. package/src/pm-plugins/default-table-selection.ts +3 -3
  126. package/src/pm-plugins/drag-and-drop/actions.ts +25 -25
  127. package/src/pm-plugins/drag-and-drop/commands-with-analytics.ts +158 -190
  128. package/src/pm-plugins/drag-and-drop/commands.ts +154 -170
  129. package/src/pm-plugins/drag-and-drop/consts.ts +4 -5
  130. package/src/pm-plugins/drag-and-drop/plugin-factory.ts +23 -20
  131. package/src/pm-plugins/drag-and-drop/plugin-key.ts +1 -3
  132. package/src/pm-plugins/drag-and-drop/plugin.ts +329 -383
  133. package/src/pm-plugins/drag-and-drop/reducer.ts +30 -30
  134. package/src/pm-plugins/drag-and-drop/types.ts +8 -8
  135. package/src/pm-plugins/drag-and-drop/utils/autoscrollers.ts +38 -41
  136. package/src/pm-plugins/drag-and-drop/utils/getDragBehaviour.ts +3 -6
  137. package/src/pm-plugins/drag-and-drop/utils/monitor.ts +57 -70
  138. package/src/pm-plugins/keymap.ts +208 -220
  139. package/src/pm-plugins/main.ts +348 -400
  140. package/src/pm-plugins/plugin-factory.ts +32 -34
  141. package/src/pm-plugins/safari-delete-composition-text-issue-workaround.ts +83 -97
  142. package/src/pm-plugins/sticky-headers/commands.ts +2 -6
  143. package/src/pm-plugins/sticky-headers/plugin-key.ts +1 -3
  144. package/src/pm-plugins/sticky-headers/plugin-state.ts +41 -44
  145. package/src/pm-plugins/sticky-headers/plugin.ts +4 -4
  146. package/src/pm-plugins/sticky-headers/types.ts +8 -8
  147. package/src/pm-plugins/sticky-headers/util.ts +10 -10
  148. package/src/pm-plugins/table-analytics.ts +70 -72
  149. package/src/pm-plugins/table-local-id.ts +180 -184
  150. package/src/pm-plugins/table-resizing/commands.ts +72 -85
  151. package/src/pm-plugins/table-resizing/event-handlers.ts +298 -317
  152. package/src/pm-plugins/table-resizing/plugin-factory.ts +10 -10
  153. package/src/pm-plugins/table-resizing/plugin-key.ts +1 -3
  154. package/src/pm-plugins/table-resizing/plugin.ts +61 -68
  155. package/src/pm-plugins/table-resizing/reducer.ts +30 -33
  156. package/src/pm-plugins/table-resizing/utils/colgroup.ts +84 -84
  157. package/src/pm-plugins/table-resizing/utils/column-state.ts +78 -81
  158. package/src/pm-plugins/table-resizing/utils/content-width.ts +94 -114
  159. package/src/pm-plugins/table-resizing/utils/dom.ts +93 -110
  160. package/src/pm-plugins/table-resizing/utils/index.ts +29 -34
  161. package/src/pm-plugins/table-resizing/utils/misc.ts +94 -119
  162. package/src/pm-plugins/table-resizing/utils/resize-column.ts +93 -106
  163. package/src/pm-plugins/table-resizing/utils/resize-logic.ts +240 -257
  164. package/src/pm-plugins/table-resizing/utils/resize-state.ts +343 -372
  165. package/src/pm-plugins/table-resizing/utils/scale-table.ts +202 -207
  166. package/src/pm-plugins/table-resizing/utils/types.ts +17 -17
  167. package/src/pm-plugins/table-resizing/utils/unit-to-number.ts +1 -2
  168. package/src/pm-plugins/table-selection-keymap.ts +25 -51
  169. package/src/pm-plugins/table-width.ts +191 -204
  170. package/src/pm-plugins/view-mode-sort/index.ts +223 -227
  171. package/src/pm-plugins/view-mode-sort/plugin-key.ts +3 -2
  172. package/src/pm-plugins/view-mode-sort/types.ts +12 -12
  173. package/src/pm-plugins/view-mode-sort/utils.ts +108 -117
  174. package/src/reducer.ts +139 -155
  175. package/src/toolbar.tsx +815 -905
  176. package/src/transforms/column-width.ts +186 -213
  177. package/src/transforms/delete-columns.ts +208 -222
  178. package/src/transforms/delete-rows.ts +117 -121
  179. package/src/transforms/fix-tables.ts +190 -215
  180. package/src/transforms/merge.ts +263 -269
  181. package/src/transforms/replace-table.ts +27 -43
  182. package/src/transforms/split.ts +65 -75
  183. package/src/types.ts +421 -427
  184. package/src/ui/ColumnResizeWidget/index.tsx +40 -47
  185. package/src/ui/DragHandle/HandleIconComponent.tsx +9 -13
  186. package/src/ui/DragHandle/index.tsx +221 -250
  187. package/src/ui/DragPreview/index.tsx +35 -35
  188. package/src/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.tsx +33 -41
  189. package/src/ui/FloatingContextualButton/FixedButton.tsx +154 -157
  190. package/src/ui/FloatingContextualButton/index.tsx +109 -115
  191. package/src/ui/FloatingContextualButton/styles.ts +43 -46
  192. package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +634 -694
  193. package/src/ui/FloatingContextualMenu/index.tsx +83 -101
  194. package/src/ui/FloatingContextualMenu/styles.ts +57 -65
  195. package/src/ui/FloatingDeleteButton/DeleteButton.tsx +37 -37
  196. package/src/ui/FloatingDeleteButton/getPopUpOptions.ts +47 -57
  197. package/src/ui/FloatingDeleteButton/index.tsx +319 -350
  198. package/src/ui/FloatingDragMenu/DragMenu.tsx +555 -596
  199. package/src/ui/FloatingDragMenu/DropdownMenu.tsx +152 -162
  200. package/src/ui/FloatingDragMenu/index.tsx +88 -102
  201. package/src/ui/FloatingDragMenu/styles.ts +51 -54
  202. package/src/ui/FloatingInsertButton/InsertButton.tsx +204 -217
  203. package/src/ui/FloatingInsertButton/getPopupOptions.ts +100 -115
  204. package/src/ui/FloatingInsertButton/index.tsx +248 -292
  205. package/src/ui/FloatingToolbarLabel/FloatingToolbarLabel.tsx +24 -29
  206. package/src/ui/TableFloatingColumnControls/ColumnControls/index.tsx +308 -329
  207. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.tsx +85 -94
  208. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/index.tsx +46 -46
  209. package/src/ui/TableFloatingColumnControls/index.tsx +116 -136
  210. package/src/ui/TableFloatingControls/CornerControls/ClassicCornerControls.tsx +79 -91
  211. package/src/ui/TableFloatingControls/CornerControls/DragCornerControls.tsx +95 -102
  212. package/src/ui/TableFloatingControls/CornerControls/index.tsx +1 -4
  213. package/src/ui/TableFloatingControls/CornerControls/types.ts +8 -8
  214. package/src/ui/TableFloatingControls/FloatingControlsWithSelection.tsx +50 -50
  215. package/src/ui/TableFloatingControls/NumberColumn/index.tsx +111 -124
  216. package/src/ui/TableFloatingControls/RowControls/ClassicControls.tsx +86 -105
  217. package/src/ui/TableFloatingControls/RowControls/DragControls.tsx +305 -341
  218. package/src/ui/TableFloatingControls/RowDropTarget/index.tsx +72 -75
  219. package/src/ui/TableFloatingControls/index.tsx +191 -193
  220. package/src/ui/TableFullWidthLabel/index.tsx +20 -20
  221. package/src/ui/common-styles.ts +880 -912
  222. package/src/ui/consts.ts +29 -74
  223. package/src/ui/icons/AddColLeftIcon.tsx +33 -39
  224. package/src/ui/icons/AddColRightIcon.tsx +33 -39
  225. package/src/ui/icons/AddRowAboveIcon.tsx +16 -22
  226. package/src/ui/icons/AddRowBelowIcon.tsx +33 -39
  227. package/src/ui/icons/DisplayModeIcon.tsx +31 -31
  228. package/src/ui/icons/DragHandleDisabledIcon.tsx +19 -21
  229. package/src/ui/icons/DragHandleIcon.tsx +12 -12
  230. package/src/ui/icons/DragInMotionIcon.tsx +45 -52
  231. package/src/ui/icons/MergeCellsIcon.tsx +22 -28
  232. package/src/ui/icons/MinimisedHandle.tsx +9 -9
  233. package/src/ui/icons/SplitCellIcon.tsx +30 -36
  234. package/src/ui/ui-styles.ts +769 -798
  235. package/src/utils/alignment.ts +1 -1
  236. package/src/utils/analytics.ts +192 -208
  237. package/src/utils/collapse.ts +55 -64
  238. package/src/utils/column-controls.ts +237 -254
  239. package/src/utils/create.ts +30 -30
  240. package/src/utils/decoration.ts +482 -502
  241. package/src/utils/dom.ts +127 -134
  242. package/src/utils/drag-menu.ts +322 -373
  243. package/src/utils/get-allow-add-column-custom-step.ts +4 -5
  244. package/src/utils/guidelines.ts +16 -21
  245. package/src/utils/index.ts +68 -68
  246. package/src/utils/merged-cells.ts +245 -254
  247. package/src/utils/nodes.ts +91 -106
  248. package/src/utils/paste.ts +119 -135
  249. package/src/utils/row-controls.ts +199 -213
  250. package/src/utils/selection.ts +77 -87
  251. package/src/utils/snapping.ts +87 -100
  252. package/src/utils/table.ts +44 -44
  253. package/src/utils/transforms.ts +5 -5
  254. package/src/utils/update-plugin-state-decorations.ts +5 -9
@@ -8,21 +8,15 @@ import { type PortalProviderAPI } from '@atlaskit/editor-common/portal';
8
8
  import type { LegacyPortalProviderAPI } from '@atlaskit/editor-common/portal-provider';
9
9
  import ReactNodeView from '@atlaskit/editor-common/react-node-view';
10
10
  import type {
11
- GetEditorContainerWidth,
12
- GetEditorFeatureFlags,
13
- getPosHandler,
14
- getPosHandlerNode,
11
+ GetEditorContainerWidth,
12
+ GetEditorFeatureFlags,
13
+ getPosHandler,
14
+ getPosHandlerNode,
15
15
  } from '@atlaskit/editor-common/types';
16
16
  import { WithPluginState } from '@atlaskit/editor-common/with-plugin-state';
17
- import type {
18
- DOMOutputSpec,
19
- Node as PmNode,
20
- } from '@atlaskit/editor-prosemirror/model';
17
+ import type { DOMOutputSpec, Node as PmNode } from '@atlaskit/editor-prosemirror/model';
21
18
  import { DOMSerializer } from '@atlaskit/editor-prosemirror/model';
22
- import type {
23
- EditorState,
24
- PluginKey,
25
- } from '@atlaskit/editor-prosemirror/state';
19
+ import type { EditorState, PluginKey } from '@atlaskit/editor-prosemirror/state';
26
20
  import type { EditorView, NodeView } from '@atlaskit/editor-prosemirror/view';
27
21
  import { akEditorTableNumberColumnWidth } from '@atlaskit/editor-shared-styles';
28
22
  import { TableMap } from '@atlaskit/editor-tables/table-map';
@@ -45,386 +39,362 @@ import type { Props } from './types';
45
39
  type ForwardRef = (node: HTMLElement | null) => void;
46
40
 
47
41
  const tableAttributes = (node: PmNode) => {
48
- return {
49
- 'data-number-column': node.attrs.isNumberColumnEnabled,
50
- 'data-layout': node.attrs.layout,
51
- 'data-autosize': node.attrs.__autoSize,
52
- 'data-table-local-id': node.attrs.localId || '',
53
- 'data-table-width': node.attrs.width,
54
- 'data-table-display-mode': node.attrs.displayMode,
55
- };
42
+ return {
43
+ 'data-number-column': node.attrs.isNumberColumnEnabled,
44
+ 'data-layout': node.attrs.layout,
45
+ 'data-autosize': node.attrs.__autoSize,
46
+ 'data-table-local-id': node.attrs.localId || '',
47
+ 'data-table-width': node.attrs.width,
48
+ 'data-table-display-mode': node.attrs.displayMode,
49
+ };
56
50
  };
57
51
 
58
52
  const getInlineWidth = (
59
- node: PmNode,
60
- options: Props['options'],
61
- state: EditorState,
62
- pos: number | undefined,
53
+ node: PmNode,
54
+ options: Props['options'],
55
+ state: EditorState,
56
+ pos: number | undefined,
63
57
  ): number | undefined => {
64
- // provide a width for tables when custom table width is supported
65
- // this is to ensure 'responsive' tables (colgroup widths are undefined) become fixed to
66
- // support screen size adjustments
67
- const shouldHaveInlineWidth =
68
- options?.isTableResizingEnabled && !isTableNested(state, pos);
58
+ // provide a width for tables when custom table width is supported
59
+ // this is to ensure 'responsive' tables (colgroup widths are undefined) become fixed to
60
+ // support screen size adjustments
61
+ const shouldHaveInlineWidth = options?.isTableResizingEnabled && !isTableNested(state, pos);
69
62
 
70
- let widthValue = getTableContainerWidth(node);
63
+ let widthValue = getTableContainerWidth(node);
71
64
 
72
- if (node.attrs.isNumberColumnEnabled) {
73
- widthValue -= akEditorTableNumberColumnWidth;
74
- }
65
+ if (node.attrs.isNumberColumnEnabled) {
66
+ widthValue -= akEditorTableNumberColumnWidth;
67
+ }
75
68
 
76
- return shouldHaveInlineWidth ? widthValue : undefined;
69
+ return shouldHaveInlineWidth ? widthValue : undefined;
77
70
  };
78
71
 
79
- const handleInlineTableWidth = (
80
- table: HTMLElement,
81
- width: number | undefined,
82
- ) => {
83
- if (!table || !width) {
84
- return;
85
- }
86
- table.style.setProperty('width', `${width}px`);
72
+ const handleInlineTableWidth = (table: HTMLElement, width: number | undefined) => {
73
+ if (!table || !width) {
74
+ return;
75
+ }
76
+ table.style.setProperty('width', `${width}px`);
87
77
  };
88
78
 
89
79
  const toDOM = (node: PmNode, props: Props) => {
90
- let colgroup: DOMOutputSpec = '';
91
-
92
- if (props.allowColumnResizing) {
93
- colgroup = ['colgroup', {}, ...generateColgroup(node)];
94
- }
95
-
96
- return [
97
- 'table',
98
- tableAttributes(node),
99
- colgroup,
100
- ['tbody', 0],
101
- ] as DOMOutputSpec;
80
+ let colgroup: DOMOutputSpec = '';
81
+
82
+ if (props.allowColumnResizing) {
83
+ colgroup = ['colgroup', {}, ...generateColgroup(node)];
84
+ }
85
+
86
+ return ['table', tableAttributes(node), colgroup, ['tbody', 0]] as DOMOutputSpec;
102
87
  };
103
88
 
104
89
  export default class TableView extends ReactNodeView<Props> {
105
- private table: HTMLElement | undefined;
106
- private resizeObserver?: ResizeObserver;
107
- eventDispatcher?: EventDispatcher;
108
- getPos: getPosHandlerNode;
109
- options;
110
-
111
- constructor(props: Props) {
112
- super(
113
- props.node,
114
- props.view,
115
- props.getPos,
116
- props.portalProviderAPI,
117
- props.eventDispatcher,
118
- props,
119
- undefined,
120
- undefined,
121
- undefined,
122
- props.hasIntlContext,
123
- );
124
- this.getPos = props.getPos;
125
- this.eventDispatcher = props.eventDispatcher;
126
- this.options = props.options;
127
- }
128
-
129
- getContentDOM() {
130
- const rendered = DOMSerializer.renderSpec(
131
- document,
132
- toDOM(this.node, this.reactComponentProps as Props),
133
- ) as {
134
- dom: HTMLElement;
135
- contentDOM?: HTMLElement;
136
- };
137
-
138
- if (rendered.dom) {
139
- this.table = rendered.dom;
140
-
141
- if (
142
- !this.options?.isTableScalingEnabled ||
143
- (this.options?.isTableScalingEnabled &&
144
- getBooleanFF(
145
- 'platform.editor.table.preserve-widths-with-lock-button',
146
- ) &&
147
- this.node.attrs.displayMode === 'fixed')
148
- ) {
149
- const tableInlineWidth = getInlineWidth(
150
- this.node,
151
- this.reactComponentProps.options,
152
- this.reactComponentProps.view.state,
153
- this.reactComponentProps.getPos(),
154
- );
155
- if (tableInlineWidth) {
156
- handleInlineTableWidth(this.table, tableInlineWidth);
157
- }
158
- }
159
- }
160
-
161
- return rendered;
162
- }
163
-
164
- setDomAttrs(node: PmNode) {
165
- if (!this.table) {
166
- return;
167
- }
168
- const attrs = tableAttributes(node);
169
- (Object.keys(attrs) as Array<keyof typeof attrs>).forEach((attr) => {
170
- this.table!.setAttribute(attr, attrs[attr]);
171
- });
172
-
173
- // Preserve Table Width cannot have inline width set on the table
174
- if (
175
- !this.options?.isTableScalingEnabled ||
176
- (this.options?.isTableScalingEnabled &&
177
- getBooleanFF(
178
- 'platform.editor.table.preserve-widths-with-lock-button',
179
- ) &&
180
- node.attrs.displayMode === 'fixed')
181
- ) {
182
- // handle inline style when table been resized
183
- const tableInlineWidth = getInlineWidth(
184
- node,
185
- (this.reactComponentProps as Props).options,
186
- this.view.state,
187
- this.getPos(),
188
- );
189
-
190
- const isTableResizing = tableWidthPluginKey.getState(
191
- this.view.state,
192
- )?.resizing;
193
-
194
- if (!isTableResizing && tableInlineWidth) {
195
- handleInlineTableWidth(this.table, tableInlineWidth);
196
- }
197
- }
198
- }
199
-
200
- getNode = () => {
201
- return this.node;
202
- };
203
-
204
- render(props: Props, forwardRef: ForwardRef) {
205
- if (getBooleanFF('platform.editor.table.use-shared-state-hook')) {
206
- return (
207
- <TableComponentWithSharedState
208
- forwardRef={forwardRef}
209
- getNode={this.getNode}
210
- view={props.view}
211
- options={props.options}
212
- eventDispatcher={props.eventDispatcher}
213
- api={props.pluginInjectionApi}
214
- allowColumnResizing={props.allowColumnResizing}
215
- allowControls={props.allowControls}
216
- getPos={props.getPos}
217
- getEditorFeatureFlags={props.getEditorFeatureFlags}
218
- dispatchAnalyticsEvent={props.dispatchAnalyticsEvent}
219
- />
220
- );
221
- }
222
-
223
- // TODO: ED-15663
224
- // Please, do not copy or use this kind of code below
225
- // @ts-ignore
226
- const fakePluginKey = {
227
- key: 'widthPlugin$',
228
- getState: (state: EditorState) => {
229
- return (state as any)['widthPlugin$'];
230
- },
231
- } as PluginKey;
232
-
233
- // TODO: ED-15663
234
- // Please, do not copy or use this kind of code below
235
- // @ts-ignore
236
- const fakeMediaPluginKey = {
237
- key: 'mediaPlugin$',
238
- getState: (state: EditorState) => {
239
- return (state as any)['mediaPlugin$'];
240
- },
241
- } as PluginKey;
242
-
243
- return (
244
- <WithPluginState
245
- plugins={{
246
- pluginState: pluginKey,
247
- tableResizingPluginState: tableResizingPluginKey,
248
- tableWidthPluginState: tableWidthPluginKey,
249
- widthPlugin: fakePluginKey,
250
- mediaState: fakeMediaPluginKey,
251
- tableDragAndDropState: tableDragAndDropPluginKey,
252
- }}
253
- editorView={props.view}
254
- render={(pluginStates) => {
255
- const {
256
- tableResizingPluginState,
257
- tableWidthPluginState,
258
- pluginState,
259
- mediaState,
260
- } = pluginStates;
261
- const containerWidth = props.getEditorContainerWidth();
262
-
263
- const isTableResizing = tableWidthPluginState?.resizing;
264
- const isResizing = Boolean(
265
- tableResizingPluginState?.dragging || isTableResizing,
266
- );
267
-
268
- /**
269
- * ED-19810
270
- * There is a getPos issue coming from this code. We need to apply this workaround for now and apply a patch
271
- * directly to confluence since this bug is now in production.
272
- */
273
- let tablePos: number | undefined;
274
- try {
275
- tablePos = props.getPos ? props.getPos() : undefined;
276
- } catch (e) {
277
- tablePos = undefined;
278
- }
279
-
280
- const tableActive =
281
- tablePos === pluginState!.tablePos && !isTableResizing;
282
-
283
- return (
284
- <TableComponent
285
- view={props.view}
286
- allowColumnResizing={props.allowColumnResizing}
287
- eventDispatcher={props.eventDispatcher}
288
- getPos={props.getPos}
289
- isMediaFullscreen={mediaState?.isFullscreen}
290
- options={props.options}
291
- allowControls={pluginState!.pluginConfig.allowControls!}
292
- isHeaderRowEnabled={pluginState!.isHeaderRowEnabled}
293
- isHeaderColumnEnabled={pluginState!.isHeaderColumnEnabled}
294
- isDragAndDropEnabled={pluginState!.isDragAndDropEnabled}
295
- isTableScalingEnabled={props.options?.isTableScalingEnabled} // this.options?.isTableScalingEnabled same as TableOptions.isTableScalingEnabled same as pluginState.isTableScalingEnabled
296
- isTableAlignmentEnabled={props.options?.isTableAlignmentEnabled}
297
- tableActive={tableActive}
298
- ordering={pluginState!.ordering as TableColumnOrdering}
299
- isResizing={isResizing}
300
- getNode={this.getNode}
301
- containerWidth={containerWidth!}
302
- contentDOM={forwardRef}
303
- getEditorFeatureFlags={props.getEditorFeatureFlags}
304
- dispatchAnalyticsEvent={props.dispatchAnalyticsEvent}
305
- pluginInjectionApi={props.pluginInjectionApi}
306
- />
307
- );
308
- }}
309
- />
310
- );
311
- }
312
-
313
- private hasHoveredRows = false;
314
- viewShouldUpdate(nextNode: PmNode) {
315
- const { hoveredRows } = getPluginState(this.view.state);
316
- const hoveredRowsChanged = !!hoveredRows?.length !== this.hasHoveredRows;
317
- if (nextNode.attrs.isNumberColumnEnabled && hoveredRowsChanged) {
318
- this.hasHoveredRows = !!hoveredRows?.length;
319
- return true;
320
- }
321
-
322
- const node = this.getNode();
323
- if (typeof node.attrs !== typeof nextNode.attrs) {
324
- return true;
325
- }
326
- const attrKeys = Object.keys(node.attrs);
327
- const nextAttrKeys = Object.keys(nextNode.attrs);
328
- if (attrKeys.length !== nextAttrKeys.length) {
329
- return true;
330
- }
331
-
332
- const tableMap = TableMap.get(node);
333
- const nextTableMap = TableMap.get(nextNode);
334
-
335
- if (tableMap.width !== nextTableMap.width) {
336
- return true;
337
- }
338
-
339
- return attrKeys.some((key) => {
340
- return node.attrs[key] !== nextNode.attrs[key];
341
- });
342
- }
343
-
344
- ignoreMutation(
345
- mutation: MutationRecord | { type: 'selection'; target: Element },
346
- ) {
347
- const {
348
- type,
349
- target: { nodeName, firstChild },
350
- } = mutation;
351
-
352
- if (
353
- type === 'selection' &&
354
- nodeName?.toUpperCase() === 'DIV' &&
355
- firstChild?.nodeName.toUpperCase() === 'TABLE'
356
- ) {
357
- return false;
358
- }
359
-
360
- // ED-16668
361
- // Do not remove this fixes an issue with windows firefox that relates to
362
- // the addition of the shadow sentinels
363
- if (
364
- type === 'selection' &&
365
- nodeName?.toUpperCase() === 'TABLE' &&
366
- (firstChild?.nodeName.toUpperCase() === 'COLGROUP' ||
367
- firstChild?.nodeName.toUpperCase() === 'SPAN')
368
- ) {
369
- return false;
370
- }
371
-
372
- return true;
373
- }
374
-
375
- destroy() {
376
- if (this.resizeObserver) {
377
- this.resizeObserver.disconnect();
378
- }
379
-
380
- this.eventDispatcher?.emit('TABLE_DELETED', this.node);
381
- super.destroy();
382
- }
90
+ private table: HTMLElement | undefined;
91
+ private resizeObserver?: ResizeObserver;
92
+ eventDispatcher?: EventDispatcher;
93
+ getPos: getPosHandlerNode;
94
+ options;
95
+
96
+ constructor(props: Props) {
97
+ super(
98
+ props.node,
99
+ props.view,
100
+ props.getPos,
101
+ props.portalProviderAPI,
102
+ props.eventDispatcher,
103
+ props,
104
+ undefined,
105
+ undefined,
106
+ undefined,
107
+ props.hasIntlContext,
108
+ );
109
+ this.getPos = props.getPos;
110
+ this.eventDispatcher = props.eventDispatcher;
111
+ this.options = props.options;
112
+ }
113
+
114
+ getContentDOM() {
115
+ const rendered = DOMSerializer.renderSpec(
116
+ document,
117
+ toDOM(this.node, this.reactComponentProps as Props),
118
+ ) as {
119
+ dom: HTMLElement;
120
+ contentDOM?: HTMLElement;
121
+ };
122
+
123
+ if (rendered.dom) {
124
+ this.table = rendered.dom;
125
+
126
+ if (
127
+ !this.options?.isTableScalingEnabled ||
128
+ (this.options?.isTableScalingEnabled &&
129
+ getBooleanFF('platform.editor.table.preserve-widths-with-lock-button') &&
130
+ this.node.attrs.displayMode === 'fixed')
131
+ ) {
132
+ const tableInlineWidth = getInlineWidth(
133
+ this.node,
134
+ this.reactComponentProps.options,
135
+ this.reactComponentProps.view.state,
136
+ this.reactComponentProps.getPos(),
137
+ );
138
+ if (tableInlineWidth) {
139
+ handleInlineTableWidth(this.table, tableInlineWidth);
140
+ }
141
+ }
142
+ }
143
+
144
+ return rendered;
145
+ }
146
+
147
+ setDomAttrs(node: PmNode) {
148
+ if (!this.table) {
149
+ return;
150
+ }
151
+ const attrs = tableAttributes(node);
152
+ (Object.keys(attrs) as Array<keyof typeof attrs>).forEach((attr) => {
153
+ this.table!.setAttribute(attr, attrs[attr]);
154
+ });
155
+
156
+ // Preserve Table Width cannot have inline width set on the table
157
+ if (
158
+ !this.options?.isTableScalingEnabled ||
159
+ (this.options?.isTableScalingEnabled &&
160
+ getBooleanFF('platform.editor.table.preserve-widths-with-lock-button') &&
161
+ node.attrs.displayMode === 'fixed')
162
+ ) {
163
+ // handle inline style when table been resized
164
+ const tableInlineWidth = getInlineWidth(
165
+ node,
166
+ (this.reactComponentProps as Props).options,
167
+ this.view.state,
168
+ this.getPos(),
169
+ );
170
+
171
+ const isTableResizing = tableWidthPluginKey.getState(this.view.state)?.resizing;
172
+
173
+ if (!isTableResizing && tableInlineWidth) {
174
+ handleInlineTableWidth(this.table, tableInlineWidth);
175
+ }
176
+ }
177
+ }
178
+
179
+ getNode = () => {
180
+ return this.node;
181
+ };
182
+
183
+ render(props: Props, forwardRef: ForwardRef) {
184
+ if (getBooleanFF('platform.editor.table.use-shared-state-hook')) {
185
+ return (
186
+ <TableComponentWithSharedState
187
+ forwardRef={forwardRef}
188
+ getNode={this.getNode}
189
+ view={props.view}
190
+ options={props.options}
191
+ eventDispatcher={props.eventDispatcher}
192
+ api={props.pluginInjectionApi}
193
+ allowColumnResizing={props.allowColumnResizing}
194
+ allowControls={props.allowControls}
195
+ getPos={props.getPos}
196
+ getEditorFeatureFlags={props.getEditorFeatureFlags}
197
+ dispatchAnalyticsEvent={props.dispatchAnalyticsEvent}
198
+ />
199
+ );
200
+ }
201
+
202
+ // TODO: ED-15663
203
+ // Please, do not copy or use this kind of code below
204
+ // @ts-ignore
205
+ const fakePluginKey = {
206
+ key: 'widthPlugin$',
207
+ getState: (state: EditorState) => {
208
+ return (state as any)['widthPlugin$'];
209
+ },
210
+ } as PluginKey;
211
+
212
+ // TODO: ED-15663
213
+ // Please, do not copy or use this kind of code below
214
+ // @ts-ignore
215
+ const fakeMediaPluginKey = {
216
+ key: 'mediaPlugin$',
217
+ getState: (state: EditorState) => {
218
+ return (state as any)['mediaPlugin$'];
219
+ },
220
+ } as PluginKey;
221
+
222
+ return (
223
+ <WithPluginState
224
+ plugins={{
225
+ pluginState: pluginKey,
226
+ tableResizingPluginState: tableResizingPluginKey,
227
+ tableWidthPluginState: tableWidthPluginKey,
228
+ widthPlugin: fakePluginKey,
229
+ mediaState: fakeMediaPluginKey,
230
+ tableDragAndDropState: tableDragAndDropPluginKey,
231
+ }}
232
+ editorView={props.view}
233
+ render={(pluginStates) => {
234
+ const { tableResizingPluginState, tableWidthPluginState, pluginState, mediaState } =
235
+ pluginStates;
236
+ const containerWidth = props.getEditorContainerWidth();
237
+
238
+ const isTableResizing = tableWidthPluginState?.resizing;
239
+ const isResizing = Boolean(tableResizingPluginState?.dragging || isTableResizing);
240
+
241
+ /**
242
+ * ED-19810
243
+ * There is a getPos issue coming from this code. We need to apply this workaround for now and apply a patch
244
+ * directly to confluence since this bug is now in production.
245
+ */
246
+ let tablePos: number | undefined;
247
+ try {
248
+ tablePos = props.getPos ? props.getPos() : undefined;
249
+ } catch (e) {
250
+ tablePos = undefined;
251
+ }
252
+
253
+ const tableActive = tablePos === pluginState!.tablePos && !isTableResizing;
254
+
255
+ return (
256
+ <TableComponent
257
+ view={props.view}
258
+ allowColumnResizing={props.allowColumnResizing}
259
+ eventDispatcher={props.eventDispatcher}
260
+ getPos={props.getPos}
261
+ isMediaFullscreen={mediaState?.isFullscreen}
262
+ options={props.options}
263
+ allowControls={pluginState!.pluginConfig.allowControls!}
264
+ isHeaderRowEnabled={pluginState!.isHeaderRowEnabled}
265
+ isHeaderColumnEnabled={pluginState!.isHeaderColumnEnabled}
266
+ isDragAndDropEnabled={pluginState!.isDragAndDropEnabled}
267
+ isTableScalingEnabled={props.options?.isTableScalingEnabled} // this.options?.isTableScalingEnabled same as TableOptions.isTableScalingEnabled same as pluginState.isTableScalingEnabled
268
+ isTableAlignmentEnabled={props.options?.isTableAlignmentEnabled}
269
+ tableActive={tableActive}
270
+ ordering={pluginState!.ordering as TableColumnOrdering}
271
+ isResizing={isResizing}
272
+ getNode={this.getNode}
273
+ containerWidth={containerWidth!}
274
+ contentDOM={forwardRef}
275
+ getEditorFeatureFlags={props.getEditorFeatureFlags}
276
+ dispatchAnalyticsEvent={props.dispatchAnalyticsEvent}
277
+ pluginInjectionApi={props.pluginInjectionApi}
278
+ />
279
+ );
280
+ }}
281
+ />
282
+ );
283
+ }
284
+
285
+ private hasHoveredRows = false;
286
+ viewShouldUpdate(nextNode: PmNode) {
287
+ const { hoveredRows } = getPluginState(this.view.state);
288
+ const hoveredRowsChanged = !!hoveredRows?.length !== this.hasHoveredRows;
289
+ if (nextNode.attrs.isNumberColumnEnabled && hoveredRowsChanged) {
290
+ this.hasHoveredRows = !!hoveredRows?.length;
291
+ return true;
292
+ }
293
+
294
+ const node = this.getNode();
295
+ if (typeof node.attrs !== typeof nextNode.attrs) {
296
+ return true;
297
+ }
298
+ const attrKeys = Object.keys(node.attrs);
299
+ const nextAttrKeys = Object.keys(nextNode.attrs);
300
+ if (attrKeys.length !== nextAttrKeys.length) {
301
+ return true;
302
+ }
303
+
304
+ const tableMap = TableMap.get(node);
305
+ const nextTableMap = TableMap.get(nextNode);
306
+
307
+ if (tableMap.width !== nextTableMap.width) {
308
+ return true;
309
+ }
310
+
311
+ return attrKeys.some((key) => {
312
+ return node.attrs[key] !== nextNode.attrs[key];
313
+ });
314
+ }
315
+
316
+ ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {
317
+ const {
318
+ type,
319
+ target: { nodeName, firstChild },
320
+ } = mutation;
321
+
322
+ if (
323
+ type === 'selection' &&
324
+ nodeName?.toUpperCase() === 'DIV' &&
325
+ firstChild?.nodeName.toUpperCase() === 'TABLE'
326
+ ) {
327
+ return false;
328
+ }
329
+
330
+ // ED-16668
331
+ // Do not remove this fixes an issue with windows firefox that relates to
332
+ // the addition of the shadow sentinels
333
+ if (
334
+ type === 'selection' &&
335
+ nodeName?.toUpperCase() === 'TABLE' &&
336
+ (firstChild?.nodeName.toUpperCase() === 'COLGROUP' ||
337
+ firstChild?.nodeName.toUpperCase() === 'SPAN')
338
+ ) {
339
+ return false;
340
+ }
341
+
342
+ return true;
343
+ }
344
+
345
+ destroy() {
346
+ if (this.resizeObserver) {
347
+ this.resizeObserver.disconnect();
348
+ }
349
+
350
+ this.eventDispatcher?.emit('TABLE_DELETED', this.node);
351
+ super.destroy();
352
+ }
383
353
  }
384
354
 
385
355
  export const createTableView = (
386
- node: PmNode,
387
- view: EditorView,
388
- getPos: getPosHandler,
389
- portalProviderAPI: LegacyPortalProviderAPI | PortalProviderAPI,
390
- eventDispatcher: EventDispatcher,
391
- getEditorContainerWidth: GetEditorContainerWidth,
392
- getEditorFeatureFlags: GetEditorFeatureFlags,
393
- dispatchAnalyticsEvent: DispatchAnalyticsEvent,
394
- pluginInjectionApi?: PluginInjectionAPI,
395
- isTableAlignmentEnabled?: boolean,
356
+ node: PmNode,
357
+ view: EditorView,
358
+ getPos: getPosHandler,
359
+ portalProviderAPI: LegacyPortalProviderAPI | PortalProviderAPI,
360
+ eventDispatcher: EventDispatcher,
361
+ getEditorContainerWidth: GetEditorContainerWidth,
362
+ getEditorFeatureFlags: GetEditorFeatureFlags,
363
+ dispatchAnalyticsEvent: DispatchAnalyticsEvent,
364
+ pluginInjectionApi?: PluginInjectionAPI,
365
+ isTableAlignmentEnabled?: boolean,
396
366
  ): NodeView => {
397
- const {
398
- pluginConfig,
399
- isFullWidthModeEnabled,
400
- wasFullWidthModeEnabled,
401
- isTableResizingEnabled,
402
- isDragAndDropEnabled,
403
- isTableScalingEnabled, // same as options.isTableScalingEnabled
404
- } = getPluginState(view.state);
405
- const { allowColumnResizing, allowControls } = getPluginConfig(pluginConfig);
406
- const hasIntlContext = true;
407
-
408
- return new TableView({
409
- node,
410
- view,
411
- allowColumnResizing,
412
- allowControls,
413
- portalProviderAPI,
414
- eventDispatcher,
415
- getPos: getPos as getPosHandlerNode,
416
- options: {
417
- isFullWidthModeEnabled,
418
- wasFullWidthModeEnabled,
419
- isTableResizingEnabled,
420
- isDragAndDropEnabled,
421
- isTableScalingEnabled, // same as options.isTableScalingEnabled
422
- isTableAlignmentEnabled
423
- },
424
- getEditorContainerWidth,
425
- getEditorFeatureFlags,
426
- dispatchAnalyticsEvent,
427
- hasIntlContext,
428
- pluginInjectionApi,
429
- }).init();
367
+ const {
368
+ pluginConfig,
369
+ isFullWidthModeEnabled,
370
+ wasFullWidthModeEnabled,
371
+ isTableResizingEnabled,
372
+ isDragAndDropEnabled,
373
+ isTableScalingEnabled, // same as options.isTableScalingEnabled
374
+ } = getPluginState(view.state);
375
+ const { allowColumnResizing, allowControls } = getPluginConfig(pluginConfig);
376
+ const hasIntlContext = true;
377
+
378
+ return new TableView({
379
+ node,
380
+ view,
381
+ allowColumnResizing,
382
+ allowControls,
383
+ portalProviderAPI,
384
+ eventDispatcher,
385
+ getPos: getPos as getPosHandlerNode,
386
+ options: {
387
+ isFullWidthModeEnabled,
388
+ wasFullWidthModeEnabled,
389
+ isTableResizingEnabled,
390
+ isDragAndDropEnabled,
391
+ isTableScalingEnabled, // same as options.isTableScalingEnabled
392
+ isTableAlignmentEnabled,
393
+ },
394
+ getEditorContainerWidth,
395
+ getEditorFeatureFlags,
396
+ dispatchAnalyticsEvent,
397
+ hasIntlContext,
398
+ pluginInjectionApi,
399
+ }).init();
430
400
  };