@atlaskit/editor-plugin-table 7.16.11 → 7.16.12

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 (242) hide show
  1. package/.eslintrc.js +3 -3
  2. package/CHANGELOG.md +8 -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 +41 -6
  6. package/dist/cjs/nodeviews/TableResizer.js +7 -7
  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/merged-cells.js +3 -3
  16. package/dist/es2019/commands/misc.js +3 -3
  17. package/dist/es2019/nodeviews/TableContainer.js +43 -5
  18. package/dist/es2019/nodeviews/TableResizer.js +7 -7
  19. package/dist/es2019/nodeviews/TableRow.js +21 -21
  20. package/dist/es2019/pm-plugins/table-resizing/plugin.js +3 -3
  21. package/dist/es2019/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  22. package/dist/es2019/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  23. package/dist/es2019/ui/FloatingContextualMenu/styles.js +47 -47
  24. package/dist/es2019/ui/FloatingDragMenu/styles.js +30 -30
  25. package/dist/es2019/ui/common-styles.js +802 -816
  26. package/dist/es2019/ui/ui-styles.js +665 -678
  27. package/dist/es2019/utils/merged-cells.js +3 -3
  28. package/dist/esm/commands/misc.js +3 -3
  29. package/dist/esm/nodeviews/TableCell.js +10 -10
  30. package/dist/esm/nodeviews/TableContainer.js +42 -7
  31. package/dist/esm/nodeviews/TableResizer.js +7 -7
  32. package/dist/esm/nodeviews/TableRow.js +23 -23
  33. package/dist/esm/pm-plugins/table-resizing/plugin.js +3 -3
  34. package/dist/esm/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  35. package/dist/esm/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  36. package/dist/esm/ui/FloatingContextualMenu/styles.js +1 -1
  37. package/dist/esm/ui/FloatingDragMenu/styles.js +1 -1
  38. package/dist/esm/ui/common-styles.js +13 -13
  39. package/dist/esm/ui/ui-styles.js +25 -25
  40. package/dist/esm/utils/merged-cells.js +3 -3
  41. package/dist/types/pm-plugins/decorations/utils/index.d.ts +1 -1
  42. package/dist/types/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  43. package/dist/types/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  44. package/dist/types/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  45. package/dist/types/ui/ColumnResizeWidget/index.d.ts +1 -1
  46. package/dist/types/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  47. package/dist/types/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  48. package/dist/types/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  49. package/dist/types/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  50. package/dist/types/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  51. package/dist/types-ts4.5/pm-plugins/decorations/utils/index.d.ts +1 -1
  52. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  53. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  54. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  55. package/dist/types-ts4.5/ui/ColumnResizeWidget/index.d.ts +1 -1
  56. package/dist/types-ts4.5/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  57. package/dist/types-ts4.5/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  58. package/dist/types-ts4.5/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  59. package/dist/types-ts4.5/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  60. package/dist/types-ts4.5/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  61. package/docs/0-intro.tsx +9 -7
  62. package/package.json +2 -2
  63. package/report.api.md +67 -66
  64. package/src/commands/clear.ts +36 -44
  65. package/src/commands/collapse.ts +8 -8
  66. package/src/commands/column-resize.ts +412 -452
  67. package/src/commands/delete.ts +14 -14
  68. package/src/commands/display-mode.ts +10 -11
  69. package/src/commands/go-to-next-cell.ts +48 -54
  70. package/src/commands/hover.ts +210 -227
  71. package/src/commands/index.ts +35 -35
  72. package/src/commands/insert.ts +208 -235
  73. package/src/commands/misc.ts +655 -748
  74. package/src/commands/referentiality.ts +9 -9
  75. package/src/commands/selection.ts +433 -563
  76. package/src/commands/sort.ts +68 -86
  77. package/src/commands/split-cell.ts +14 -14
  78. package/src/commands/toggle.ts +69 -67
  79. package/src/commands-with-analytics.ts +570 -639
  80. package/src/create-plugin-config.ts +13 -13
  81. package/src/event-handlers.ts +513 -612
  82. package/src/handlers.ts +120 -133
  83. package/src/nodeviews/ExternalDropTargets.tsx +68 -73
  84. package/src/nodeviews/OverflowShadowsObserver.ts +148 -157
  85. package/src/nodeviews/TableCell.ts +47 -54
  86. package/src/nodeviews/TableComponent.tsx +1018 -1112
  87. package/src/nodeviews/TableComponentWithSharedState.tsx +91 -94
  88. package/src/nodeviews/TableContainer.tsx +363 -339
  89. package/src/nodeviews/TableNodeViewBase.ts +19 -24
  90. package/src/nodeviews/TableResizer.tsx +565 -657
  91. package/src/nodeviews/TableRow.ts +580 -629
  92. package/src/nodeviews/TableStickyScrollbar.ts +173 -190
  93. package/src/nodeviews/__mocks__/OverflowShadowsObserver.ts +8 -8
  94. package/src/nodeviews/__mocks__/OverridableMock.ts +14 -15
  95. package/src/nodeviews/table.tsx +345 -375
  96. package/src/nodeviews/types.ts +21 -24
  97. package/src/nodeviews/update-overflow-shadows.ts +8 -14
  98. package/src/plugin.tsx +578 -603
  99. package/src/pm-plugins/analytics/actions.ts +10 -12
  100. package/src/pm-plugins/analytics/commands.ts +31 -37
  101. package/src/pm-plugins/analytics/plugin-factory.ts +4 -2
  102. package/src/pm-plugins/analytics/plugin-key.ts +1 -3
  103. package/src/pm-plugins/analytics/plugin.ts +60 -70
  104. package/src/pm-plugins/analytics/reducer.ts +19 -19
  105. package/src/pm-plugins/analytics/types.ts +10 -10
  106. package/src/pm-plugins/analytics/utils/moved-event.ts +38 -38
  107. package/src/pm-plugins/decorations/plugin.ts +58 -77
  108. package/src/pm-plugins/decorations/utils/column-controls.ts +59 -71
  109. package/src/pm-plugins/decorations/utils/column-resizing.ts +50 -57
  110. package/src/pm-plugins/decorations/utils/compose-decorations.ts +6 -6
  111. package/src/pm-plugins/decorations/utils/index.ts +3 -6
  112. package/src/pm-plugins/decorations/utils/types.ts +7 -12
  113. package/src/pm-plugins/default-table-selection.ts +3 -3
  114. package/src/pm-plugins/drag-and-drop/actions.ts +25 -25
  115. package/src/pm-plugins/drag-and-drop/commands-with-analytics.ts +158 -190
  116. package/src/pm-plugins/drag-and-drop/commands.ts +154 -170
  117. package/src/pm-plugins/drag-and-drop/consts.ts +4 -5
  118. package/src/pm-plugins/drag-and-drop/plugin-factory.ts +23 -20
  119. package/src/pm-plugins/drag-and-drop/plugin-key.ts +1 -3
  120. package/src/pm-plugins/drag-and-drop/plugin.ts +329 -383
  121. package/src/pm-plugins/drag-and-drop/reducer.ts +30 -30
  122. package/src/pm-plugins/drag-and-drop/types.ts +8 -8
  123. package/src/pm-plugins/drag-and-drop/utils/autoscrollers.ts +38 -41
  124. package/src/pm-plugins/drag-and-drop/utils/getDragBehaviour.ts +3 -6
  125. package/src/pm-plugins/drag-and-drop/utils/monitor.ts +57 -70
  126. package/src/pm-plugins/keymap.ts +208 -220
  127. package/src/pm-plugins/main.ts +348 -400
  128. package/src/pm-plugins/plugin-factory.ts +32 -34
  129. package/src/pm-plugins/safari-delete-composition-text-issue-workaround.ts +83 -97
  130. package/src/pm-plugins/sticky-headers/commands.ts +2 -6
  131. package/src/pm-plugins/sticky-headers/plugin-key.ts +1 -3
  132. package/src/pm-plugins/sticky-headers/plugin-state.ts +41 -44
  133. package/src/pm-plugins/sticky-headers/plugin.ts +4 -4
  134. package/src/pm-plugins/sticky-headers/types.ts +8 -8
  135. package/src/pm-plugins/sticky-headers/util.ts +10 -10
  136. package/src/pm-plugins/table-analytics.ts +70 -72
  137. package/src/pm-plugins/table-local-id.ts +180 -184
  138. package/src/pm-plugins/table-resizing/commands.ts +72 -85
  139. package/src/pm-plugins/table-resizing/event-handlers.ts +298 -317
  140. package/src/pm-plugins/table-resizing/plugin-factory.ts +10 -10
  141. package/src/pm-plugins/table-resizing/plugin-key.ts +1 -3
  142. package/src/pm-plugins/table-resizing/plugin.ts +61 -68
  143. package/src/pm-plugins/table-resizing/reducer.ts +30 -33
  144. package/src/pm-plugins/table-resizing/utils/colgroup.ts +84 -84
  145. package/src/pm-plugins/table-resizing/utils/column-state.ts +78 -81
  146. package/src/pm-plugins/table-resizing/utils/content-width.ts +94 -114
  147. package/src/pm-plugins/table-resizing/utils/dom.ts +93 -110
  148. package/src/pm-plugins/table-resizing/utils/index.ts +29 -34
  149. package/src/pm-plugins/table-resizing/utils/misc.ts +94 -119
  150. package/src/pm-plugins/table-resizing/utils/resize-column.ts +93 -106
  151. package/src/pm-plugins/table-resizing/utils/resize-logic.ts +240 -257
  152. package/src/pm-plugins/table-resizing/utils/resize-state.ts +343 -372
  153. package/src/pm-plugins/table-resizing/utils/scale-table.ts +202 -207
  154. package/src/pm-plugins/table-resizing/utils/types.ts +17 -17
  155. package/src/pm-plugins/table-resizing/utils/unit-to-number.ts +1 -2
  156. package/src/pm-plugins/table-selection-keymap.ts +25 -51
  157. package/src/pm-plugins/table-width.ts +191 -204
  158. package/src/pm-plugins/view-mode-sort/index.ts +223 -227
  159. package/src/pm-plugins/view-mode-sort/plugin-key.ts +3 -2
  160. package/src/pm-plugins/view-mode-sort/types.ts +12 -12
  161. package/src/pm-plugins/view-mode-sort/utils.ts +108 -117
  162. package/src/reducer.ts +139 -155
  163. package/src/toolbar.tsx +815 -905
  164. package/src/transforms/column-width.ts +186 -213
  165. package/src/transforms/delete-columns.ts +208 -222
  166. package/src/transforms/delete-rows.ts +117 -121
  167. package/src/transforms/fix-tables.ts +190 -215
  168. package/src/transforms/merge.ts +263 -269
  169. package/src/transforms/replace-table.ts +27 -43
  170. package/src/transforms/split.ts +65 -75
  171. package/src/types.ts +421 -427
  172. package/src/ui/ColumnResizeWidget/index.tsx +40 -47
  173. package/src/ui/DragHandle/HandleIconComponent.tsx +9 -13
  174. package/src/ui/DragHandle/index.tsx +221 -250
  175. package/src/ui/DragPreview/index.tsx +35 -35
  176. package/src/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.tsx +33 -41
  177. package/src/ui/FloatingContextualButton/FixedButton.tsx +154 -157
  178. package/src/ui/FloatingContextualButton/index.tsx +109 -115
  179. package/src/ui/FloatingContextualButton/styles.ts +43 -46
  180. package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +634 -694
  181. package/src/ui/FloatingContextualMenu/index.tsx +83 -101
  182. package/src/ui/FloatingContextualMenu/styles.ts +57 -65
  183. package/src/ui/FloatingDeleteButton/DeleteButton.tsx +37 -37
  184. package/src/ui/FloatingDeleteButton/getPopUpOptions.ts +47 -57
  185. package/src/ui/FloatingDeleteButton/index.tsx +319 -350
  186. package/src/ui/FloatingDragMenu/DragMenu.tsx +555 -596
  187. package/src/ui/FloatingDragMenu/DropdownMenu.tsx +152 -162
  188. package/src/ui/FloatingDragMenu/index.tsx +88 -102
  189. package/src/ui/FloatingDragMenu/styles.ts +51 -54
  190. package/src/ui/FloatingInsertButton/InsertButton.tsx +204 -217
  191. package/src/ui/FloatingInsertButton/getPopupOptions.ts +100 -115
  192. package/src/ui/FloatingInsertButton/index.tsx +248 -292
  193. package/src/ui/FloatingToolbarLabel/FloatingToolbarLabel.tsx +24 -29
  194. package/src/ui/TableFloatingColumnControls/ColumnControls/index.tsx +308 -329
  195. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.tsx +85 -94
  196. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/index.tsx +46 -46
  197. package/src/ui/TableFloatingColumnControls/index.tsx +116 -136
  198. package/src/ui/TableFloatingControls/CornerControls/ClassicCornerControls.tsx +79 -91
  199. package/src/ui/TableFloatingControls/CornerControls/DragCornerControls.tsx +95 -102
  200. package/src/ui/TableFloatingControls/CornerControls/index.tsx +1 -4
  201. package/src/ui/TableFloatingControls/CornerControls/types.ts +8 -8
  202. package/src/ui/TableFloatingControls/FloatingControlsWithSelection.tsx +50 -50
  203. package/src/ui/TableFloatingControls/NumberColumn/index.tsx +111 -124
  204. package/src/ui/TableFloatingControls/RowControls/ClassicControls.tsx +86 -105
  205. package/src/ui/TableFloatingControls/RowControls/DragControls.tsx +305 -341
  206. package/src/ui/TableFloatingControls/RowDropTarget/index.tsx +72 -75
  207. package/src/ui/TableFloatingControls/index.tsx +191 -193
  208. package/src/ui/TableFullWidthLabel/index.tsx +20 -20
  209. package/src/ui/common-styles.ts +880 -912
  210. package/src/ui/consts.ts +29 -74
  211. package/src/ui/icons/AddColLeftIcon.tsx +33 -39
  212. package/src/ui/icons/AddColRightIcon.tsx +33 -39
  213. package/src/ui/icons/AddRowAboveIcon.tsx +16 -22
  214. package/src/ui/icons/AddRowBelowIcon.tsx +33 -39
  215. package/src/ui/icons/DisplayModeIcon.tsx +31 -31
  216. package/src/ui/icons/DragHandleDisabledIcon.tsx +19 -21
  217. package/src/ui/icons/DragHandleIcon.tsx +12 -12
  218. package/src/ui/icons/DragInMotionIcon.tsx +45 -52
  219. package/src/ui/icons/MergeCellsIcon.tsx +22 -28
  220. package/src/ui/icons/MinimisedHandle.tsx +9 -9
  221. package/src/ui/icons/SplitCellIcon.tsx +30 -36
  222. package/src/ui/ui-styles.ts +769 -798
  223. package/src/utils/alignment.ts +1 -1
  224. package/src/utils/analytics.ts +192 -208
  225. package/src/utils/collapse.ts +55 -64
  226. package/src/utils/column-controls.ts +237 -254
  227. package/src/utils/create.ts +30 -30
  228. package/src/utils/decoration.ts +482 -502
  229. package/src/utils/dom.ts +127 -134
  230. package/src/utils/drag-menu.ts +322 -373
  231. package/src/utils/get-allow-add-column-custom-step.ts +4 -5
  232. package/src/utils/guidelines.ts +10 -21
  233. package/src/utils/index.ts +68 -68
  234. package/src/utils/merged-cells.ts +245 -254
  235. package/src/utils/nodes.ts +91 -106
  236. package/src/utils/paste.ts +119 -135
  237. package/src/utils/row-controls.ts +199 -213
  238. package/src/utils/selection.ts +77 -87
  239. package/src/utils/snapping.ts +84 -97
  240. package/src/utils/table.ts +44 -44
  241. package/src/utils/transforms.ts +5 -5
  242. 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
  };