@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
@@ -10,9 +10,9 @@ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
10
10
 
11
11
  import type { ResizeState } from '../pm-plugins/table-resizing/utils';
12
12
  import {
13
- getTableContainerElementWidth,
14
- getTableElementWidth,
15
- hasTableBeenResized,
13
+ getTableContainerElementWidth,
14
+ getTableElementWidth,
15
+ hasTableBeenResized,
16
16
  } from '../pm-plugins/table-resizing/utils';
17
17
  import { isMinCellWidthTable } from '../pm-plugins/table-resizing/utils/colgroup';
18
18
  import { getResizeState } from '../pm-plugins/table-resizing/utils/resize-state';
@@ -26,79 +26,72 @@ import { scaleTableTo } from '../pm-plugins/table-resizing/utils/scale-table';
26
26
  * @returns
27
27
  */
28
28
  export const updateColumnWidths =
29
- (resizeState: ResizeState, table: PMNode, start: number) =>
30
- (tr: Transaction): Transaction => {
31
- const map = TableMap.get(table);
32
- const updatedCellsAttrs: { [key: number]: CellAttributes } = {};
33
-
34
- // calculating new attributes for each cell
35
- for (let columnIndex = 0; columnIndex < map.width; columnIndex++) {
36
- for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {
37
- let { width } = resizeState.cols[columnIndex];
38
- if (resizeState.isScaled) {
39
- // Ensure that the width is an integer if the table has been scaled
40
- width = Math.floor(width);
41
- }
42
- const mapIndex = rowIndex * map.width + columnIndex;
43
- const cellPos = map.map[mapIndex];
44
- const attrs = updatedCellsAttrs[cellPos] || {
45
- ...table.nodeAt(cellPos)!.attrs,
46
- };
47
- const colspan = attrs.colspan || 1;
48
-
49
- if (attrs.colwidth && attrs.colwidth.length > colspan) {
50
- attrs.colwidth = attrs.colwidth.slice(0, colspan);
51
- }
52
-
53
- // Rowspanning cell that has already been handled
54
- if (rowIndex && map.map[mapIndex] === map.map[mapIndex - map.width]) {
55
- continue;
56
- }
57
- const colspanIndex =
58
- colspan === 1 ? 0 : columnIndex - map.colCount(cellPos);
59
- if (attrs.colwidth && attrs.colwidth[colspanIndex] === width) {
60
- continue;
61
- }
62
-
63
- let colwidths = attrs.colwidth
64
- ? attrs.colwidth.slice()
65
- : Array.from({ length: colspan }, (_) => 0);
66
-
67
- colwidths[colspanIndex] = width;
68
- if (colwidths.length > colspan) {
69
- colwidths = colwidths.slice(0, colspan);
70
- }
71
- updatedCellsAttrs[cellPos] = {
72
- ...attrs,
73
- colwidth: colwidths.includes(0) ? undefined : colwidths,
74
- };
75
- }
76
- }
77
-
78
- // updating all cells with new attributes
79
- const seen: { [key: number]: boolean } = {};
80
- for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {
81
- for (let columnIndex = 0; columnIndex < map.width; columnIndex++) {
82
- const mapIndex = rowIndex * map.width + columnIndex;
83
- const pos = map.map[mapIndex];
84
- const cell = table.nodeAt(pos);
85
- if (!seen[pos] && cell) {
86
- if (updatedCellsAttrs[pos]) {
87
- tr.step(
88
- new AttrStep(
89
- pos + start,
90
- 'colwidth',
91
- updatedCellsAttrs[pos].colwidth,
92
- ),
93
- );
94
- }
95
- seen[pos] = true;
96
- }
97
- }
98
- }
99
-
100
- return tr;
101
- };
29
+ (resizeState: ResizeState, table: PMNode, start: number) =>
30
+ (tr: Transaction): Transaction => {
31
+ const map = TableMap.get(table);
32
+ const updatedCellsAttrs: { [key: number]: CellAttributes } = {};
33
+
34
+ // calculating new attributes for each cell
35
+ for (let columnIndex = 0; columnIndex < map.width; columnIndex++) {
36
+ for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {
37
+ let { width } = resizeState.cols[columnIndex];
38
+ if (resizeState.isScaled) {
39
+ // Ensure that the width is an integer if the table has been scaled
40
+ width = Math.floor(width);
41
+ }
42
+ const mapIndex = rowIndex * map.width + columnIndex;
43
+ const cellPos = map.map[mapIndex];
44
+ const attrs = updatedCellsAttrs[cellPos] || {
45
+ ...table.nodeAt(cellPos)!.attrs,
46
+ };
47
+ const colspan = attrs.colspan || 1;
48
+
49
+ if (attrs.colwidth && attrs.colwidth.length > colspan) {
50
+ attrs.colwidth = attrs.colwidth.slice(0, colspan);
51
+ }
52
+
53
+ // Rowspanning cell that has already been handled
54
+ if (rowIndex && map.map[mapIndex] === map.map[mapIndex - map.width]) {
55
+ continue;
56
+ }
57
+ const colspanIndex = colspan === 1 ? 0 : columnIndex - map.colCount(cellPos);
58
+ if (attrs.colwidth && attrs.colwidth[colspanIndex] === width) {
59
+ continue;
60
+ }
61
+
62
+ let colwidths = attrs.colwidth
63
+ ? attrs.colwidth.slice()
64
+ : Array.from({ length: colspan }, (_) => 0);
65
+
66
+ colwidths[colspanIndex] = width;
67
+ if (colwidths.length > colspan) {
68
+ colwidths = colwidths.slice(0, colspan);
69
+ }
70
+ updatedCellsAttrs[cellPos] = {
71
+ ...attrs,
72
+ colwidth: colwidths.includes(0) ? undefined : colwidths,
73
+ };
74
+ }
75
+ }
76
+
77
+ // updating all cells with new attributes
78
+ const seen: { [key: number]: boolean } = {};
79
+ for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {
80
+ for (let columnIndex = 0; columnIndex < map.width; columnIndex++) {
81
+ const mapIndex = rowIndex * map.width + columnIndex;
82
+ const pos = map.map[mapIndex];
83
+ const cell = table.nodeAt(pos);
84
+ if (!seen[pos] && cell) {
85
+ if (updatedCellsAttrs[pos]) {
86
+ tr.step(new AttrStep(pos + start, 'colwidth', updatedCellsAttrs[pos].colwidth));
87
+ }
88
+ seen[pos] = true;
89
+ }
90
+ }
91
+ }
92
+
93
+ return tr;
94
+ };
102
95
 
103
96
  /**
104
97
  * This function is called when user inserts/deletes a column in a table to;
@@ -111,140 +104,120 @@ export const updateColumnWidths =
111
104
  * @returns Updated transaction with rescaled columns for a given table
112
105
  */
113
106
  export const rescaleColumns =
114
- (isTableScalingEnabled = false) =>
115
- (table: ContentNodeWithPos, view: EditorView | undefined) =>
116
- (tr: Transaction): Transaction => {
117
- if (!view) {
118
- return tr;
119
- }
120
-
121
- const newTable = tr.doc.nodeAt(table.pos);
122
- const domAtPos = view.domAtPos.bind(view);
123
- const maybeTable = domAtPos(table.start).node;
124
- const maybeTableElement = getBooleanFF(
125
- 'platform.editor.explicit-html-element-check',
126
- )
127
- ? maybeTable instanceof HTMLElement
128
- ? maybeTable
129
- : null
130
- : (maybeTable as HTMLElement | null);
131
- const tableRef = maybeTableElement?.closest('table');
132
-
133
- if (!tableRef || !newTable) {
134
- return tr;
135
- }
136
-
137
- const isResized = hasTableBeenResized(table.node);
138
-
139
- let previousTableInfo = {
140
- width: 0,
141
- possibleMaxWidth: 0,
142
- isResized,
143
- };
144
-
145
- const tableDepth = view.state.doc.resolve(table.pos).depth;
146
- let shouldScale = isTableScalingEnabled && tableDepth === 0;
147
- if (
148
- shouldScale &&
149
- getBooleanFF('platform.editor.table.preserve-widths-with-lock-button')
150
- ) {
151
- shouldScale = newTable.attrs.displayMode !== 'fixed';
152
- }
153
-
154
- if (shouldScale) {
155
- previousTableInfo = {
156
- width: getTableElementWidth(table.node),
157
- possibleMaxWidth: getTableContainerElementWidth(table.node),
158
- isResized,
159
- };
160
- } else {
161
- previousTableInfo = {
162
- // when table is resized the tableRef client width will be 1px larger than colGroup, which is used in calculations
163
- width: isResized ? tableRef.clientWidth - 1 : tableRef.clientWidth,
164
- /** the is the width the table can reach before overflowing */
165
- possibleMaxWidth: tableRef?.parentElement?.clientWidth || 0,
166
- isResized,
167
- };
168
- }
169
-
170
- // determine the new table, based on new width
171
- const newTableInfo = {
172
- noOfColumns: TableMap.get(newTable).width,
173
- };
174
-
175
- if (!newTableInfo.noOfColumns || newTableInfo.noOfColumns <= 0) {
176
- return tr;
177
- }
178
-
179
- const averageColumnWidth =
180
- previousTableInfo.width / newTableInfo.noOfColumns;
181
-
182
- // If the table has not been resized (i.e. all columns will have the same width) and every column width is bigger than the minimum column width
183
- // we skip updating the size of columns here.
184
- if (
185
- !previousTableInfo.isResized &&
186
- averageColumnWidth > tableCellMinWidth
187
- ) {
188
- return tr;
189
- }
190
-
191
- const wasTableInOverflow =
192
- previousTableInfo.width > previousTableInfo.possibleMaxWidth;
193
-
194
- // If the table has not been resized, and each column width is smaller than the minimum column width
195
- // Or if the table has been resized, but each column width is either 48px or null
196
- // we update the table to have 48px for each column
197
- if (
198
- (!previousTableInfo.isResized &&
199
- averageColumnWidth <= tableCellMinWidth) ||
200
- (previousTableInfo.isResized && isMinCellWidthTable(table.node))
201
- ) {
202
- const widths = new Array(newTableInfo.noOfColumns).fill(
203
- tableCellMinWidth,
204
- );
205
- const cols = widths.map((_, index) => ({
206
- width: tableCellMinWidth,
207
- minWidth: tableCellMinWidth,
208
- index,
209
- }));
210
-
211
- const minWidthResizeState = {
212
- cols,
213
- widths,
214
- maxSize: previousTableInfo.possibleMaxWidth,
215
- tableWidth: previousTableInfo.width,
216
- overflow: wasTableInOverflow,
217
- };
218
- return updateColumnWidths(
219
- minWidthResizeState,
220
- table.node,
221
- table.start,
222
- )(tr);
223
- }
224
-
225
- let resizeState = getResizeState({
226
- minWidth: tableCellMinWidth,
227
- table: table.node,
228
- start: table.start,
229
- tableRef,
230
- domAtPos,
231
- maxSize: previousTableInfo.possibleMaxWidth,
232
- isTableScalingEnabled: shouldScale,
233
- });
234
-
235
- // Two scenarios that require scaling:
236
- // 1. If the new table width will result in the table going into overflow
237
- // we resize the cells to avoid it (e.g. adding a column)
238
- // 2. If the new table width will be shorter than the parent width, scale columns to fit parent
239
- if (
240
- (!wasTableInOverflow && resizeState.overflow) ||
241
- resizeState.tableWidth < resizeState.maxSize
242
- ) {
243
- resizeState = scaleTableTo(
244
- resizeState,
245
- previousTableInfo.possibleMaxWidth,
246
- );
247
- }
248
-
249
- return updateColumnWidths(resizeState, table.node, table.start)(tr);
250
- };
107
+ (isTableScalingEnabled = false) =>
108
+ (table: ContentNodeWithPos, view: EditorView | undefined) =>
109
+ (tr: Transaction): Transaction => {
110
+ if (!view) {
111
+ return tr;
112
+ }
113
+
114
+ const newTable = tr.doc.nodeAt(table.pos);
115
+ const domAtPos = view.domAtPos.bind(view);
116
+ const maybeTable = domAtPos(table.start).node;
117
+ const maybeTableElement = getBooleanFF('platform.editor.explicit-html-element-check')
118
+ ? maybeTable instanceof HTMLElement
119
+ ? maybeTable
120
+ : null
121
+ : (maybeTable as HTMLElement | null);
122
+ const tableRef = maybeTableElement?.closest('table');
123
+
124
+ if (!tableRef || !newTable) {
125
+ return tr;
126
+ }
127
+
128
+ const isResized = hasTableBeenResized(table.node);
129
+
130
+ let previousTableInfo = {
131
+ width: 0,
132
+ possibleMaxWidth: 0,
133
+ isResized,
134
+ };
135
+
136
+ const tableDepth = view.state.doc.resolve(table.pos).depth;
137
+ let shouldScale = isTableScalingEnabled && tableDepth === 0;
138
+ if (shouldScale && getBooleanFF('platform.editor.table.preserve-widths-with-lock-button')) {
139
+ shouldScale = newTable.attrs.displayMode !== 'fixed';
140
+ }
141
+
142
+ if (shouldScale) {
143
+ previousTableInfo = {
144
+ width: getTableElementWidth(table.node),
145
+ possibleMaxWidth: getTableContainerElementWidth(table.node),
146
+ isResized,
147
+ };
148
+ } else {
149
+ previousTableInfo = {
150
+ // when table is resized the tableRef client width will be 1px larger than colGroup, which is used in calculations
151
+ width: isResized ? tableRef.clientWidth - 1 : tableRef.clientWidth,
152
+ /** the is the width the table can reach before overflowing */
153
+ possibleMaxWidth: tableRef?.parentElement?.clientWidth || 0,
154
+ isResized,
155
+ };
156
+ }
157
+
158
+ // determine the new table, based on new width
159
+ const newTableInfo = {
160
+ noOfColumns: TableMap.get(newTable).width,
161
+ };
162
+
163
+ if (!newTableInfo.noOfColumns || newTableInfo.noOfColumns <= 0) {
164
+ return tr;
165
+ }
166
+
167
+ const averageColumnWidth = previousTableInfo.width / newTableInfo.noOfColumns;
168
+
169
+ // If the table has not been resized (i.e. all columns will have the same width) and every column width is bigger than the minimum column width
170
+ // we skip updating the size of columns here.
171
+ if (!previousTableInfo.isResized && averageColumnWidth > tableCellMinWidth) {
172
+ return tr;
173
+ }
174
+
175
+ const wasTableInOverflow = previousTableInfo.width > previousTableInfo.possibleMaxWidth;
176
+
177
+ // If the table has not been resized, and each column width is smaller than the minimum column width
178
+ // Or if the table has been resized, but each column width is either 48px or null
179
+ // we update the table to have 48px for each column
180
+ if (
181
+ (!previousTableInfo.isResized && averageColumnWidth <= tableCellMinWidth) ||
182
+ (previousTableInfo.isResized && isMinCellWidthTable(table.node))
183
+ ) {
184
+ const widths = new Array(newTableInfo.noOfColumns).fill(tableCellMinWidth);
185
+ const cols = widths.map((_, index) => ({
186
+ width: tableCellMinWidth,
187
+ minWidth: tableCellMinWidth,
188
+ index,
189
+ }));
190
+
191
+ const minWidthResizeState = {
192
+ cols,
193
+ widths,
194
+ maxSize: previousTableInfo.possibleMaxWidth,
195
+ tableWidth: previousTableInfo.width,
196
+ overflow: wasTableInOverflow,
197
+ };
198
+ return updateColumnWidths(minWidthResizeState, table.node, table.start)(tr);
199
+ }
200
+
201
+ let resizeState = getResizeState({
202
+ minWidth: tableCellMinWidth,
203
+ table: table.node,
204
+ start: table.start,
205
+ tableRef,
206
+ domAtPos,
207
+ maxSize: previousTableInfo.possibleMaxWidth,
208
+ isTableScalingEnabled: shouldScale,
209
+ });
210
+
211
+ // Two scenarios that require scaling:
212
+ // 1. If the new table width will result in the table going into overflow
213
+ // we resize the cells to avoid it (e.g. adding a column)
214
+ // 2. If the new table width will be shorter than the parent width, scale columns to fit parent
215
+ if (
216
+ (!wasTableInOverflow && resizeState.overflow) ||
217
+ resizeState.tableWidth < resizeState.maxSize
218
+ ) {
219
+ resizeState = scaleTableTo(resizeState, previousTableInfo.possibleMaxWidth);
220
+ }
221
+
222
+ return updateColumnWidths(resizeState, table.node, table.start)(tr);
223
+ };