@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
@@ -3,46 +3,42 @@ import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
3
  import type { Transaction } from '@atlaskit/editor-prosemirror/state';
4
4
  import type { EditorView } from '@atlaskit/editor-prosemirror/view';
5
5
  import {
6
- akEditorDefaultLayoutWidth,
7
- akEditorWideLayoutWidth,
6
+ akEditorDefaultLayoutWidth,
7
+ akEditorWideLayoutWidth,
8
8
  } from '@atlaskit/editor-shared-styles';
9
9
 
10
10
  import {
11
- calculateColumnWidth,
12
- contentWidth,
13
- getCellsRefsInColumn,
14
- getLayoutSize,
11
+ calculateColumnWidth,
12
+ contentWidth,
13
+ getCellsRefsInColumn,
14
+ getLayoutSize,
15
15
  } from '../pm-plugins/table-resizing/utils';
16
16
  import type { ReportInvalidNodeAttrs } from '../types';
17
17
 
18
18
  const validateTableCellNodeAttrs = (
19
- {
20
- colspan,
21
- rowspan,
22
- tableLocalId,
23
- }: { colspan?: number; rowspan?: number; tableLocalId: string },
24
- reportInvalidTableCellSpanAttrs: ReportInvalidNodeAttrs,
19
+ { colspan, rowspan, tableLocalId }: { colspan?: number; rowspan?: number; tableLocalId: string },
20
+ reportInvalidTableCellSpanAttrs: ReportInvalidNodeAttrs,
25
21
  ): void => {
26
- if (colspan && colspan < 0) {
27
- reportInvalidTableCellSpanAttrs({
28
- nodeType: 'tableCell',
29
- attribute: 'colspan',
30
- reason: 'negative value',
31
- tableLocalId,
32
- spanValue: colspan,
33
- });
34
- }
35
-
36
- if (rowspan && rowspan < 0) {
37
- reportInvalidTableCellSpanAttrs({
38
- nodeType: 'tableCell',
39
- attribute: 'rowspan',
40
- reason: 'negative value',
41
- tableLocalId,
42
- spanValue: rowspan,
43
- });
44
- }
45
- return;
22
+ if (colspan && colspan < 0) {
23
+ reportInvalidTableCellSpanAttrs({
24
+ nodeType: 'tableCell',
25
+ attribute: 'colspan',
26
+ reason: 'negative value',
27
+ tableLocalId,
28
+ spanValue: colspan,
29
+ });
30
+ }
31
+
32
+ if (rowspan && rowspan < 0) {
33
+ reportInvalidTableCellSpanAttrs({
34
+ nodeType: 'tableCell',
35
+ attribute: 'rowspan',
36
+ reason: 'negative value',
37
+ tableLocalId,
38
+ spanValue: rowspan,
39
+ });
40
+ }
41
+ return;
46
42
  };
47
43
 
48
44
  // We attempt to patch the document when we have extra, unneeded, column widths
@@ -53,65 +49,65 @@ const validateTableCellNodeAttrs = (
53
49
  // This row only spans two columns, yet it contains widths for 3.
54
50
  // We remove the third width here, assumed duplicate content.
55
51
  export const removeExtraneousColumnWidths = (
56
- node: PMNode,
57
- basePos: number,
58
- tr: Transaction,
59
- reportInvalidTableCellSpanAttrs?: ReportInvalidNodeAttrs,
52
+ node: PMNode,
53
+ basePos: number,
54
+ tr: Transaction,
55
+ reportInvalidTableCellSpanAttrs?: ReportInvalidNodeAttrs,
60
56
  ): boolean => {
61
- let hasProblems = false;
62
-
63
- tr = replaceCells(tr, node, basePos, (cell) => {
64
- const { colwidth, colspan, rowspan } = cell.attrs;
65
-
66
- if (reportInvalidTableCellSpanAttrs) {
67
- validateTableCellNodeAttrs(
68
- { colspan, rowspan, tableLocalId: node.attrs.localId },
69
- reportInvalidTableCellSpanAttrs,
70
- );
71
- }
72
-
73
- if (colwidth && colwidth.length > colspan) {
74
- hasProblems = true;
75
- return cell.type.createChecked(
76
- {
77
- ...cell.attrs,
78
- colwidth: colwidth.slice(0, colspan),
79
- },
80
- cell.content,
81
- cell.marks,
82
- );
83
- }
84
-
85
- return cell;
86
- });
87
-
88
- if (hasProblems) {
89
- return true;
90
- }
91
-
92
- return false;
57
+ let hasProblems = false;
58
+
59
+ tr = replaceCells(tr, node, basePos, (cell) => {
60
+ const { colwidth, colspan, rowspan } = cell.attrs;
61
+
62
+ if (reportInvalidTableCellSpanAttrs) {
63
+ validateTableCellNodeAttrs(
64
+ { colspan, rowspan, tableLocalId: node.attrs.localId },
65
+ reportInvalidTableCellSpanAttrs,
66
+ );
67
+ }
68
+
69
+ if (colwidth && colwidth.length > colspan) {
70
+ hasProblems = true;
71
+ return cell.type.createChecked(
72
+ {
73
+ ...cell.attrs,
74
+ colwidth: colwidth.slice(0, colspan),
75
+ },
76
+ cell.content,
77
+ cell.marks,
78
+ );
79
+ }
80
+
81
+ return cell;
82
+ });
83
+
84
+ if (hasProblems) {
85
+ return true;
86
+ }
87
+
88
+ return false;
93
89
  };
94
90
 
95
91
  export const fixTables = (
96
- tr: Transaction,
97
- reportInvalidTableCellSpanAttrs?: ReportInvalidNodeAttrs,
92
+ tr: Transaction,
93
+ reportInvalidTableCellSpanAttrs?: ReportInvalidNodeAttrs,
98
94
  ): Transaction | undefined => {
99
- let hasProblems = false;
100
- tr.doc.descendants((node, pos) => {
101
- if (node.type.name === 'table') {
102
- // in the unlikely event of having to fix multiple tables at the same time
103
- hasProblems = removeExtraneousColumnWidths(
104
- node,
105
- tr.mapping.map(pos),
106
- tr,
107
- reportInvalidTableCellSpanAttrs,
108
- );
109
- }
110
- });
111
-
112
- if (hasProblems) {
113
- return tr;
114
- }
95
+ let hasProblems = false;
96
+ tr.doc.descendants((node, pos) => {
97
+ if (node.type.name === 'table') {
98
+ // in the unlikely event of having to fix multiple tables at the same time
99
+ hasProblems = removeExtraneousColumnWidths(
100
+ node,
101
+ tr.mapping.map(pos),
102
+ tr,
103
+ reportInvalidTableCellSpanAttrs,
104
+ );
105
+ }
106
+ });
107
+
108
+ if (hasProblems) {
109
+ return tr;
110
+ }
115
111
  };
116
112
 
117
113
  // When we get a table with an 'auto' attribute, we want to:
@@ -126,151 +122,130 @@ export const fixTables = (
126
122
  // We use this when migrating TinyMCE tables for Confluence, for example:
127
123
  // https://pug.jira-dev.com/wiki/spaces/AEC/pages/3362882215/How+do+we+map+TinyMCE+tables+to+Fabric+tables
128
124
  export const fixAutoSizedTable = (
129
- view: EditorView,
130
- tableNode: PMNode,
131
- tableRef: HTMLTableElement,
132
- tablePos: number,
133
- opts: { containerWidth: number },
125
+ view: EditorView,
126
+ tableNode: PMNode,
127
+ tableRef: HTMLTableElement,
128
+ tablePos: number,
129
+ opts: { containerWidth: number },
134
130
  ): Transaction => {
135
- let { tr } = view.state;
136
- const domAtPos = view.domAtPos.bind(view);
137
- const tableStart = tablePos + 1;
138
- const colWidths = parseDOMColumnWidths(
139
- domAtPos,
140
- tableNode,
141
- tableStart,
142
- tableRef,
143
- );
144
- const totalContentWidth = colWidths.reduce(
145
- (acc, current) => acc + current,
146
- 0,
147
- );
148
- const tableLayout = getLayoutBasedOnWidth(totalContentWidth);
149
- const maxLayoutSize = getLayoutSize(tableLayout, opts.containerWidth, {});
150
-
151
- // Content width will generally not meet the constraints of the layout
152
- // whether it be below or above, so we scale our columns widths
153
- // to meet these requirements
154
- let scale = 1;
155
- if (totalContentWidth !== maxLayoutSize) {
156
- scale = maxLayoutSize / totalContentWidth;
157
- }
158
-
159
- const scaledColumnWidths = colWidths.map((width) =>
160
- Math.floor(width * scale),
161
- );
162
-
163
- tr = replaceCells(tr, tableNode, tablePos, (cell, _rowIndex, colIndex) => {
164
- const newColWidths = scaledColumnWidths.slice(
165
- colIndex,
166
- colIndex + cell.attrs.colspan,
167
- );
168
- return cell.type.createChecked(
169
- {
170
- ...cell.attrs,
171
- colwidth: newColWidths.length ? newColWidths : null,
172
- },
173
- cell.content,
174
- cell.marks,
175
- );
176
- });
177
-
178
- // clear autosizing on the table node
179
- return tr
180
- .setNodeMarkup(tablePos, undefined, {
181
- ...tableNode.attrs,
182
- layout: tableLayout,
183
- __autoSize: false,
184
- })
185
- .setMeta('addToHistory', false);
131
+ let { tr } = view.state;
132
+ const domAtPos = view.domAtPos.bind(view);
133
+ const tableStart = tablePos + 1;
134
+ const colWidths = parseDOMColumnWidths(domAtPos, tableNode, tableStart, tableRef);
135
+ const totalContentWidth = colWidths.reduce((acc, current) => acc + current, 0);
136
+ const tableLayout = getLayoutBasedOnWidth(totalContentWidth);
137
+ const maxLayoutSize = getLayoutSize(tableLayout, opts.containerWidth, {});
138
+
139
+ // Content width will generally not meet the constraints of the layout
140
+ // whether it be below or above, so we scale our columns widths
141
+ // to meet these requirements
142
+ let scale = 1;
143
+ if (totalContentWidth !== maxLayoutSize) {
144
+ scale = maxLayoutSize / totalContentWidth;
145
+ }
146
+
147
+ const scaledColumnWidths = colWidths.map((width) => Math.floor(width * scale));
148
+
149
+ tr = replaceCells(tr, tableNode, tablePos, (cell, _rowIndex, colIndex) => {
150
+ const newColWidths = scaledColumnWidths.slice(colIndex, colIndex + cell.attrs.colspan);
151
+ return cell.type.createChecked(
152
+ {
153
+ ...cell.attrs,
154
+ colwidth: newColWidths.length ? newColWidths : null,
155
+ },
156
+ cell.content,
157
+ cell.marks,
158
+ );
159
+ });
160
+
161
+ // clear autosizing on the table node
162
+ return tr
163
+ .setNodeMarkup(tablePos, undefined, {
164
+ ...tableNode.attrs,
165
+ layout: tableLayout,
166
+ __autoSize: false,
167
+ })
168
+ .setMeta('addToHistory', false);
186
169
  };
187
170
 
188
171
  const getLayoutBasedOnWidth = (totalWidth: number) => {
189
- if (totalWidth > akEditorWideLayoutWidth) {
190
- return 'full-width';
191
- } else if (
192
- totalWidth > akEditorDefaultLayoutWidth &&
193
- totalWidth < akEditorWideLayoutWidth
194
- ) {
195
- return 'wide';
196
- } else {
197
- return 'default';
198
- }
172
+ if (totalWidth > akEditorWideLayoutWidth) {
173
+ return 'full-width';
174
+ } else if (totalWidth > akEditorDefaultLayoutWidth && totalWidth < akEditorWideLayoutWidth) {
175
+ return 'wide';
176
+ } else {
177
+ return 'default';
178
+ }
199
179
  };
200
180
 
201
181
  function parseDOMColumnWidths(
202
- domAtPos: (pos: number) => { node: Node; offset: number },
203
- tableNode: PMNode,
204
- tableStart: number,
205
- tableRef: HTMLTableElement,
182
+ domAtPos: (pos: number) => { node: Node; offset: number },
183
+ tableNode: PMNode,
184
+ tableStart: number,
185
+ tableRef: HTMLTableElement,
206
186
  ): Array<number> {
207
- const row = tableRef.querySelector('tr');
187
+ const row = tableRef.querySelector('tr');
208
188
 
209
- if (!row) {
210
- return [];
211
- }
189
+ if (!row) {
190
+ return [];
191
+ }
212
192
 
213
- let cols: Array<number> = [];
193
+ let cols: Array<number> = [];
214
194
 
215
- for (let col = 0; col < row.childElementCount; col++) {
216
- const currentCol = row.children[col];
217
- const colspan = Number(currentCol.getAttribute('colspan') || 1);
218
- for (let span = 0; span < colspan; span++) {
219
- const colIdx = col + span;
220
- const cells = getCellsRefsInColumn(
221
- colIdx,
222
- tableNode,
223
- tableStart,
224
- domAtPos,
225
- );
226
- const colWidth = calculateColumnWidth(cells, (_, col) => {
227
- return contentWidth(col as HTMLElement, tableRef).width;
228
- });
195
+ for (let col = 0; col < row.childElementCount; col++) {
196
+ const currentCol = row.children[col];
197
+ const colspan = Number(currentCol.getAttribute('colspan') || 1);
198
+ for (let span = 0; span < colspan; span++) {
199
+ const colIdx = col + span;
200
+ const cells = getCellsRefsInColumn(colIdx, tableNode, tableStart, domAtPos);
201
+ const colWidth = calculateColumnWidth(cells, (_, col) => {
202
+ return contentWidth(col as HTMLElement, tableRef).width;
203
+ });
229
204
 
230
- cols[colIdx] = Math.max(colWidth, tableCellMinWidth);
231
- }
232
- }
205
+ cols[colIdx] = Math.max(colWidth, tableCellMinWidth);
206
+ }
207
+ }
233
208
 
234
- return cols;
209
+ return cols;
235
210
  }
236
211
 
237
212
  // TODO: move to prosemirror-utils
238
213
  const replaceCells = (
239
- tr: Transaction,
240
- table: PMNode,
241
- tablePos: number,
242
- modifyCell: (cell: PMNode, rowIndex: number, colIndex: number) => PMNode,
214
+ tr: Transaction,
215
+ table: PMNode,
216
+ tablePos: number,
217
+ modifyCell: (cell: PMNode, rowIndex: number, colIndex: number) => PMNode,
243
218
  ): Transaction => {
244
- const rows: PMNode[] = [];
245
- let modifiedCells = 0;
246
- for (let rowIndex = 0; rowIndex < table.childCount; rowIndex++) {
247
- const row = table.child(rowIndex);
248
- const cells: PMNode[] = [];
249
-
250
- for (let colIndex = 0; colIndex < row.childCount; colIndex++) {
251
- const cell = row.child(colIndex);
252
-
253
- // FIXME
254
- // The rowIndex and colIndex are not accurate in a merged cell scenario
255
- // e.g. table with 5 columns might have only one cell in a row, colIndex will be 1, where it should be 4
256
- const node = modifyCell(cell, rowIndex, colIndex);
257
- if (node.sameMarkup(cell) === false) {
258
- modifiedCells++;
259
- }
260
- cells.push(node);
261
- }
262
-
263
- if (cells.length) {
264
- rows.push(row.type.createChecked(row.attrs, cells, row.marks));
265
- }
266
- }
267
-
268
- // Check if the table has changed before replacing.
269
- // If no cells are modified our counter will be zero.
270
- if (rows.length && modifiedCells !== 0) {
271
- const newTable = table.type.createChecked(table.attrs, rows, table.marks);
272
- return tr.replaceWith(tablePos, tablePos + table.nodeSize, newTable);
273
- }
274
-
275
- return tr;
219
+ const rows: PMNode[] = [];
220
+ let modifiedCells = 0;
221
+ for (let rowIndex = 0; rowIndex < table.childCount; rowIndex++) {
222
+ const row = table.child(rowIndex);
223
+ const cells: PMNode[] = [];
224
+
225
+ for (let colIndex = 0; colIndex < row.childCount; colIndex++) {
226
+ const cell = row.child(colIndex);
227
+
228
+ // FIXME
229
+ // The rowIndex and colIndex are not accurate in a merged cell scenario
230
+ // e.g. table with 5 columns might have only one cell in a row, colIndex will be 1, where it should be 4
231
+ const node = modifyCell(cell, rowIndex, colIndex);
232
+ if (node.sameMarkup(cell) === false) {
233
+ modifiedCells++;
234
+ }
235
+ cells.push(node);
236
+ }
237
+
238
+ if (cells.length) {
239
+ rows.push(row.type.createChecked(row.attrs, cells, row.marks));
240
+ }
241
+ }
242
+
243
+ // Check if the table has changed before replacing.
244
+ // If no cells are modified our counter will be zero.
245
+ if (rows.length && modifiedCells !== 0) {
246
+ const newTable = table.type.createChecked(table.attrs, rows, table.marks);
247
+ return tr.replaceWith(tablePos, tablePos + table.nodeSize, newTable);
248
+ }
249
+
250
+ return tr;
276
251
  };