@atlaskit/editor-plugin-table 7.16.10 → 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 (244) hide show
  1. package/.eslintrc.js +3 -3
  2. package/CHANGELOG.md +1836 -1831
  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 +19 -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 +808 -814
  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 +19 -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 +5 -4
  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 +881 -903
  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
  243. package/tsconfig.app.json +107 -107
  244. package/tsconfig.dev.json +47 -47
@@ -5,295 +5,278 @@ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
5
5
  import { CellSelection } from '@atlaskit/editor-tables/cell-selection';
6
6
  import { TableMap } from '@atlaskit/editor-tables/table-map';
7
7
  import {
8
- findTable,
9
- getSelectionRect,
10
- isColumnSelected,
11
- isTableSelected,
8
+ findTable,
9
+ getSelectionRect,
10
+ isColumnSelected,
11
+ isTableSelected,
12
12
  } from '@atlaskit/editor-tables/utils';
13
13
 
14
14
  import { TableCssClassName as ClassName } from '../types';
15
15
  import { tableDeleteButtonSize } from '../ui/consts';
16
16
 
17
17
  interface CellWidthInfo {
18
- width: number;
19
- colspan: number;
20
- colwidth: string | undefined;
18
+ width: number;
19
+ colspan: number;
20
+ colwidth: string | undefined;
21
21
  }
22
22
 
23
- export const getColumnsWidths = (
24
- view: EditorView,
25
- ): Array<number | undefined> => {
26
- const { selection } = view.state;
27
- let widths: Array<number | undefined> = [];
28
- const table = findTable(selection);
29
- if (table) {
30
- const map = TableMap.get(table.node);
31
- const domAtPos = view.domAtPos.bind(view);
32
-
33
- // When there is no cell we need to fill it with undefined
34
- widths = Array.from({ length: map.width });
35
- for (let i = 0; i < map.width; i++) {
36
- if (!map.isCellMergedTopLeft(0, i)) {
37
- const node = table.node.nodeAt(map.map[i])!;
38
- const pos = map.map[i] + table.start;
39
- const cellRef = findDomRefAtPos(pos, domAtPos) as HTMLElement;
40
- const rect = cellRef.getBoundingClientRect();
41
- widths[i] = (rect ? rect.width : cellRef.offsetWidth) + 1;
42
- i += node.attrs.colspan - 1;
43
- }
44
- }
45
- }
46
- return widths;
23
+ export const getColumnsWidths = (view: EditorView): Array<number | undefined> => {
24
+ const { selection } = view.state;
25
+ let widths: Array<number | undefined> = [];
26
+ const table = findTable(selection);
27
+ if (table) {
28
+ const map = TableMap.get(table.node);
29
+ const domAtPos = view.domAtPos.bind(view);
30
+
31
+ // When there is no cell we need to fill it with undefined
32
+ widths = Array.from({ length: map.width });
33
+ for (let i = 0; i < map.width; i++) {
34
+ if (!map.isCellMergedTopLeft(0, i)) {
35
+ const node = table.node.nodeAt(map.map[i])!;
36
+ const pos = map.map[i] + table.start;
37
+ const cellRef = findDomRefAtPos(pos, domAtPos) as HTMLElement;
38
+ const rect = cellRef.getBoundingClientRect();
39
+ widths[i] = (rect ? rect.width : cellRef.offsetWidth) + 1;
40
+ i += node.attrs.colspan - 1;
41
+ }
42
+ }
43
+ }
44
+ return widths;
47
45
  };
48
46
 
49
47
  export const isColumnDeleteButtonVisible = (selection: Selection): boolean => {
50
- if (
51
- !isTableSelected(selection) &&
52
- selection instanceof CellSelection &&
53
- selection.isColSelection()
54
- ) {
55
- return true;
56
- }
57
-
58
- return false;
48
+ if (
49
+ !isTableSelected(selection) &&
50
+ selection instanceof CellSelection &&
51
+ selection.isColSelection()
52
+ ) {
53
+ return true;
54
+ }
55
+
56
+ return false;
59
57
  };
60
58
 
61
59
  export const getColumnDeleteButtonParams = (
62
- columnsWidths: Array<number | undefined>,
63
- selection: Selection,
60
+ columnsWidths: Array<number | undefined>,
61
+ selection: Selection,
64
62
  ): { left: number; indexes: number[] } | null => {
65
- const rect = getSelectionRect(selection);
66
- if (!rect) {
67
- return null;
68
- }
69
- let width = 0;
70
- let offset = 0;
71
- // find the columns before the selection
72
- for (let i = 0; i < rect.left; i++) {
73
- const colWidth = columnsWidths[i];
74
- if (colWidth) {
75
- offset += colWidth - 1;
76
- }
77
- }
78
- // these are the selected columns widths
79
- const indexes: number[] = [];
80
- for (let i = rect.left; i < rect.right; i++) {
81
- const colWidth = columnsWidths[i];
82
- if (colWidth) {
83
- width += colWidth;
84
- indexes.push(i);
85
- }
86
- }
87
-
88
- const left = offset + width / 2 - tableDeleteButtonSize / 2;
89
- return { left, indexes };
63
+ const rect = getSelectionRect(selection);
64
+ if (!rect) {
65
+ return null;
66
+ }
67
+ let width = 0;
68
+ let offset = 0;
69
+ // find the columns before the selection
70
+ for (let i = 0; i < rect.left; i++) {
71
+ const colWidth = columnsWidths[i];
72
+ if (colWidth) {
73
+ offset += colWidth - 1;
74
+ }
75
+ }
76
+ // these are the selected columns widths
77
+ const indexes: number[] = [];
78
+ for (let i = rect.left; i < rect.right; i++) {
79
+ const colWidth = columnsWidths[i];
80
+ if (colWidth) {
81
+ width += colWidth;
82
+ indexes.push(i);
83
+ }
84
+ }
85
+
86
+ const left = offset + width / 2 - tableDeleteButtonSize / 2;
87
+ return { left, indexes };
90
88
  };
91
89
 
92
90
  export const getColumnClassNames = (
93
- index: number,
94
- selection: Selection,
95
- hoveredColumns: number[] = [],
96
- isInDanger?: boolean,
97
- isResizing?: boolean,
91
+ index: number,
92
+ selection: Selection,
93
+ hoveredColumns: number[] = [],
94
+ isInDanger?: boolean,
95
+ isResizing?: boolean,
98
96
  ): string => {
99
- const classNames: string[] = [];
100
- if (
101
- isColumnSelected(index)(selection) ||
102
- (hoveredColumns.indexOf(index) > -1 && !isResizing)
103
- ) {
104
- classNames.push(ClassName.HOVERED_CELL_ACTIVE);
105
- if (isInDanger) {
106
- classNames.push(ClassName.HOVERED_CELL_IN_DANGER);
107
- }
108
- }
109
- return classNames.join(' ');
97
+ const classNames: string[] = [];
98
+ if (isColumnSelected(index)(selection) || (hoveredColumns.indexOf(index) > -1 && !isResizing)) {
99
+ classNames.push(ClassName.HOVERED_CELL_ACTIVE);
100
+ if (isInDanger) {
101
+ classNames.push(ClassName.HOVERED_CELL_IN_DANGER);
102
+ }
103
+ }
104
+ return classNames.join(' ');
110
105
  };
111
106
 
112
107
  // give a row colspan and a colwidths
113
108
  // and map to a row's colwidths
114
- const mapTableColwidthsToRow = (
115
- rowColSpans: number[],
116
- tableColWidths: number[],
117
- ) => {
118
- let curColIdx = 0;
119
- const colWidths: number[] = [];
120
-
121
- rowColSpans.forEach((cellColSpan) => {
122
- const colWidth = tableColWidths
123
- .slice(curColIdx, curColIdx + cellColSpan)
124
- .reduce((acc, val) => acc + val, 0);
125
-
126
- curColIdx += cellColSpan;
127
- colWidths.push(colWidth);
128
- });
129
-
130
- return colWidths;
109
+ const mapTableColwidthsToRow = (rowColSpans: number[], tableColWidths: number[]) => {
110
+ let curColIdx = 0;
111
+ const colWidths: number[] = [];
112
+
113
+ rowColSpans.forEach((cellColSpan) => {
114
+ const colWidth = tableColWidths
115
+ .slice(curColIdx, curColIdx + cellColSpan)
116
+ .reduce((acc, val) => acc + val, 0);
117
+
118
+ curColIdx += cellColSpan;
119
+ colWidths.push(colWidth);
120
+ });
121
+
122
+ return colWidths;
131
123
  };
132
124
 
133
- const getRelativeDomCellWidths = ({
134
- width,
135
- colspan,
136
- colwidth,
137
- }: CellWidthInfo) => {
138
- // For cells with colSpan 1
139
- // or
140
- // for cells in a table with unchanged column widths,
141
- // these are identified by the lack of colwidth data attribute,
142
- // return equally partitioned total cell width in DOM for each cell.
143
- if (colspan === 1 || !colwidth) {
144
- return new Array(colspan).fill(width / colspan);
145
- }
146
-
147
- // For cells that have colSpan > 1 and
148
- // are part of a table with resized columns
149
- // return the current total DOM width of the cell multiplied
150
- // by the percentage of the each individual cell's size.
151
- // The cell size percentage is calculated using individual colwidth of the cell,
152
- // from data-colwidth attribute on the cell,
153
- // divided by the total width of the cells from colwidths for merged cells.
154
-
155
- // Ex:
156
- // colwidth = 201,102
157
- // Total colWidth = 303
158
- // returned cellWidths = [303 * (201/303), 303 * (102/303)]
159
-
160
- // For merged cells we get back colwidth as `201,102`
161
- const cellColWidths = colwidth.split(',').map((colwidth) => Number(colwidth));
162
- const totalCalculatedCellWidth = cellColWidths.reduce(
163
- (acc, cellColWidth) => acc + cellColWidth,
164
- 0,
165
- );
166
-
167
- return cellColWidths.map(
168
- (cellColWidth) => width * (cellColWidth / totalCalculatedCellWidth),
169
- );
125
+ const getRelativeDomCellWidths = ({ width, colspan, colwidth }: CellWidthInfo) => {
126
+ // For cells with colSpan 1
127
+ // or
128
+ // for cells in a table with unchanged column widths,
129
+ // these are identified by the lack of colwidth data attribute,
130
+ // return equally partitioned total cell width in DOM for each cell.
131
+ if (colspan === 1 || !colwidth) {
132
+ return new Array(colspan).fill(width / colspan);
133
+ }
134
+
135
+ // For cells that have colSpan > 1 and
136
+ // are part of a table with resized columns
137
+ // return the current total DOM width of the cell multiplied
138
+ // by the percentage of the each individual cell's size.
139
+ // The cell size percentage is calculated using individual colwidth of the cell,
140
+ // from data-colwidth attribute on the cell,
141
+ // divided by the total width of the cells from colwidths for merged cells.
142
+
143
+ // Ex:
144
+ // colwidth = ‘201,102’
145
+ // Total colWidth = 303
146
+ // returned cellWidths = [303 * (201/303), 303 * (102/303)]
147
+
148
+ // For merged cells we get back colwidth as `201,102`
149
+ const cellColWidths = colwidth.split(',').map((colwidth) => Number(colwidth));
150
+ const totalCalculatedCellWidth = cellColWidths.reduce(
151
+ (acc, cellColWidth) => acc + cellColWidth,
152
+ 0,
153
+ );
154
+
155
+ return cellColWidths.map((cellColWidth) => width * (cellColWidth / totalCalculatedCellWidth));
170
156
  };
171
157
 
172
158
  export const colWidthsForRow = (tr: HTMLTableRowElement) => {
173
- // get the colspans
174
- const rowColSpans = maphElem(tr, (cell) =>
175
- Number(cell.getAttribute('colspan') || 1 /* default to span of 1 */),
176
- );
177
-
178
- // Chrome has trouble aligning borders with auto tables
179
- // and the rest of the page grid. tables with defined
180
- // column widths align fine.
181
- //
182
- // eg a 4x25% table might end up as 189px 190px 190px 190px
183
- //
184
- // prefer copying the widths via the DOM
185
- // or inferring from the next row if one exists
186
- const copyTarget =
187
- (tr.nextElementSibling as HTMLTableRowElement | null) || tr;
188
-
189
- if (copyTarget) {
190
- // either from the first row while it's still in the table
191
- const cellInfos = maphElem(copyTarget, (cell) => ({
192
- width: cell.getBoundingClientRect().width,
193
- colspan: Number(cell.getAttribute('colspan') || 1),
194
- colwidth: cell.dataset.colwidth,
195
- }));
196
-
197
- // reverse engineer cell widths from table widths
198
- let domBasedCellWidths: number[] = [];
199
- cellInfos.map((cell) => {
200
- domBasedCellWidths.push(...getRelativeDomCellWidths(cell));
201
- });
202
-
203
- if (cellInfos.reduce((acc, cell) => acc + cell.width, 0) !== 0) {
204
- const newWidths = mapTableColwidthsToRow(rowColSpans, domBasedCellWidths);
205
- return newWidths.map((px) => `${px}px`).join(' ');
206
- }
207
- }
208
-
209
- // as a fallback, just calculate a %, and hope that
210
- // it aligns perfectly in the user's browser
211
- const visualColCount = rowColSpans.reduce((acc, val) => acc + val, 0);
212
-
213
- const pctWidths = rowColSpans.map(
214
- (cellColSpan) => (cellColSpan / visualColCount) * 100,
215
- );
216
-
217
- return pctWidths.map((pct) => `${pct}%`).join(' ');
159
+ // get the colspans
160
+ const rowColSpans = maphElem(tr, (cell) =>
161
+ Number(cell.getAttribute('colspan') || 1 /* default to span of 1 */),
162
+ );
163
+
164
+ // Chrome has trouble aligning borders with auto tables
165
+ // and the rest of the page grid. tables with defined
166
+ // column widths align fine.
167
+ //
168
+ // eg a 4x25% table might end up as 189px 190px 190px 190px
169
+ //
170
+ // prefer copying the widths via the DOM
171
+ // or inferring from the next row if one exists
172
+ const copyTarget = (tr.nextElementSibling as HTMLTableRowElement | null) || tr;
173
+
174
+ if (copyTarget) {
175
+ // either from the first row while it's still in the table
176
+ const cellInfos = maphElem(copyTarget, (cell) => ({
177
+ width: cell.getBoundingClientRect().width,
178
+ colspan: Number(cell.getAttribute('colspan') || 1),
179
+ colwidth: cell.dataset.colwidth,
180
+ }));
181
+
182
+ // reverse engineer cell widths from table widths
183
+ let domBasedCellWidths: number[] = [];
184
+ cellInfos.map((cell) => {
185
+ domBasedCellWidths.push(...getRelativeDomCellWidths(cell));
186
+ });
187
+
188
+ if (cellInfos.reduce((acc, cell) => acc + cell.width, 0) !== 0) {
189
+ const newWidths = mapTableColwidthsToRow(rowColSpans, domBasedCellWidths);
190
+ return newWidths.map((px) => `${px}px`).join(' ');
191
+ }
192
+ }
193
+
194
+ // as a fallback, just calculate a %, and hope that
195
+ // it aligns perfectly in the user's browser
196
+ const visualColCount = rowColSpans.reduce((acc, val) => acc + val, 0);
197
+
198
+ const pctWidths = rowColSpans.map((cellColSpan) => (cellColSpan / visualColCount) * 100);
199
+
200
+ return pctWidths.map((pct) => `${pct}%`).join(' ');
218
201
  };
219
202
 
220
203
  export const convertHTMLCellIndexToColumnIndex = (
221
- htmlColIndex: number,
222
- htmlRowIndex: number,
223
- tableMap: TableMap,
204
+ htmlColIndex: number,
205
+ htmlRowIndex: number,
206
+ tableMap: TableMap,
224
207
  ): number => {
225
- // Same numbers (positions) in tableMap.map array mean that there are merged cells.
226
- // Cells can be merged across columns. So we need to check if the cell on the left and current cell have the same value.
227
- // Cells can be merged acroll rows. So we need to check if the cell above has the same value as current cell.
228
- // When cell has the same value as the cell above it or the cell to the left of it, html cellIndex won't count it a separete column.
229
- const width = tableMap.width;
230
- const map = tableMap.map;
231
- let htmlColCount = 0;
232
-
233
- if (htmlRowIndex === 0) {
234
- for (let colIndex = 0; colIndex < width; colIndex++) {
235
- if (colIndex === 0 || map[colIndex] !== map[colIndex - 1]) {
236
- htmlColCount++;
237
- }
238
-
239
- if (htmlColCount - 1 === htmlColIndex) {
240
- return colIndex;
241
- }
242
- }
243
- } else {
244
- for (let colIndex = 0; colIndex < width; colIndex++) {
245
- const currentCellMapIndex = htmlRowIndex * width + colIndex;
246
- const cellAboveMapIndex = (htmlRowIndex - 1) * width + colIndex;
247
- if (colIndex > 0) {
248
- if (
249
- map[currentCellMapIndex] !== map[currentCellMapIndex - 1] &&
250
- map[currentCellMapIndex] !== map[cellAboveMapIndex]
251
- ) {
252
- htmlColCount++;
253
- }
254
- } else {
255
- if (map[currentCellMapIndex] !== map[cellAboveMapIndex]) {
256
- htmlColCount++;
257
- }
258
- }
259
-
260
- if (htmlColCount - 1 === htmlColIndex) {
261
- return colIndex;
262
- }
263
- }
264
- }
265
-
266
- return 0;
208
+ // Same numbers (positions) in tableMap.map array mean that there are merged cells.
209
+ // Cells can be merged across columns. So we need to check if the cell on the left and current cell have the same value.
210
+ // Cells can be merged acroll rows. So we need to check if the cell above has the same value as current cell.
211
+ // When cell has the same value as the cell above it or the cell to the left of it, html cellIndex won't count it a separete column.
212
+ const width = tableMap.width;
213
+ const map = tableMap.map;
214
+ let htmlColCount = 0;
215
+
216
+ if (htmlRowIndex === 0) {
217
+ for (let colIndex = 0; colIndex < width; colIndex++) {
218
+ if (colIndex === 0 || map[colIndex] !== map[colIndex - 1]) {
219
+ htmlColCount++;
220
+ }
221
+
222
+ if (htmlColCount - 1 === htmlColIndex) {
223
+ return colIndex;
224
+ }
225
+ }
226
+ } else {
227
+ for (let colIndex = 0; colIndex < width; colIndex++) {
228
+ const currentCellMapIndex = htmlRowIndex * width + colIndex;
229
+ const cellAboveMapIndex = (htmlRowIndex - 1) * width + colIndex;
230
+ if (colIndex > 0) {
231
+ if (
232
+ map[currentCellMapIndex] !== map[currentCellMapIndex - 1] &&
233
+ map[currentCellMapIndex] !== map[cellAboveMapIndex]
234
+ ) {
235
+ htmlColCount++;
236
+ }
237
+ } else {
238
+ if (map[currentCellMapIndex] !== map[cellAboveMapIndex]) {
239
+ htmlColCount++;
240
+ }
241
+ }
242
+
243
+ if (htmlColCount - 1 === htmlColIndex) {
244
+ return colIndex;
245
+ }
246
+ }
247
+ }
248
+
249
+ return 0;
267
250
  };
268
251
 
269
252
  // When first row has merged cells, our converted column index needs to be mapped.
270
253
  export const getColumnIndexMappedToColumnIndexInFirstRow = (
271
- convertedColIndex: number,
272
- htmlRowIndex: number,
273
- tableMap: TableMap,
254
+ convertedColIndex: number,
255
+ htmlRowIndex: number,
256
+ tableMap: TableMap,
274
257
  ): number => {
275
- const width = tableMap.width;
276
- const map = tableMap.map;
277
- const mapColIndexToFistRowColIndex = [];
278
- let htmlColCounFirstRow = 0;
279
- let colSpan = 0;
280
-
281
- if (htmlRowIndex === 0) {
282
- return convertedColIndex;
283
- }
284
-
285
- for (let colIndex = 0; colIndex < width; colIndex++) {
286
- if (colIndex === 0 || map[colIndex] !== map[colIndex - 1]) {
287
- if (colSpan > 0) {
288
- htmlColCounFirstRow += colSpan;
289
- colSpan = 0;
290
- }
291
- htmlColCounFirstRow++;
292
- } else if (map[colIndex] === map[colIndex - 1]) {
293
- colSpan++;
294
- }
295
- mapColIndexToFistRowColIndex[colIndex] = htmlColCounFirstRow - 1;
296
- }
297
-
298
- return mapColIndexToFistRowColIndex[convertedColIndex];
258
+ const width = tableMap.width;
259
+ const map = tableMap.map;
260
+ const mapColIndexToFistRowColIndex = [];
261
+ let htmlColCounFirstRow = 0;
262
+ let colSpan = 0;
263
+
264
+ if (htmlRowIndex === 0) {
265
+ return convertedColIndex;
266
+ }
267
+
268
+ for (let colIndex = 0; colIndex < width; colIndex++) {
269
+ if (colIndex === 0 || map[colIndex] !== map[colIndex - 1]) {
270
+ if (colSpan > 0) {
271
+ htmlColCounFirstRow += colSpan;
272
+ colSpan = 0;
273
+ }
274
+ htmlColCounFirstRow++;
275
+ } else if (map[colIndex] === map[colIndex - 1]) {
276
+ colSpan++;
277
+ }
278
+ mapColIndexToFistRowColIndex[colIndex] = htmlColCounFirstRow - 1;
279
+ }
280
+
281
+ return mapColIndexToFistRowColIndex[convertedColIndex];
299
282
  };
@@ -5,37 +5,37 @@ import { createTable } from '@atlaskit/editor-tables/utils';
5
5
  import { TABLE_MAX_WIDTH } from '../pm-plugins/table-resizing/utils';
6
6
 
7
7
  type CreateTableOverrides = {
8
- tableWidth?: TableAttributes['width'];
9
- layout?: TableAttributes['layout'];
8
+ tableWidth?: TableAttributes['width'];
9
+ layout?: TableAttributes['layout'];
10
10
  };
11
11
 
12
12
  export const createTableWithWidth =
13
- ({
14
- isTableScalingEnabled,
15
- isTableAlignmentEnabled,
16
- isFullWidthModeEnabled,
17
- createTableProps,
18
- }: {
19
- isTableScalingEnabled?: boolean;
20
- isTableAlignmentEnabled?: boolean;
21
- isFullWidthModeEnabled?: boolean;
22
- createTableProps?: {
23
- rowsCount?: number;
24
- colsCount?: number;
25
- };
26
- }) =>
27
- (schema: Schema) => {
28
- const attrsOverrides: CreateTableOverrides = {};
29
- if (isTableScalingEnabled && isFullWidthModeEnabled) {
30
- attrsOverrides.tableWidth = TABLE_MAX_WIDTH;
31
- }
32
- if (isTableAlignmentEnabled && isFullWidthModeEnabled) {
33
- attrsOverrides.layout = 'align-start';
34
- }
13
+ ({
14
+ isTableScalingEnabled,
15
+ isTableAlignmentEnabled,
16
+ isFullWidthModeEnabled,
17
+ createTableProps,
18
+ }: {
19
+ isTableScalingEnabled?: boolean;
20
+ isTableAlignmentEnabled?: boolean;
21
+ isFullWidthModeEnabled?: boolean;
22
+ createTableProps?: {
23
+ rowsCount?: number;
24
+ colsCount?: number;
25
+ };
26
+ }) =>
27
+ (schema: Schema) => {
28
+ const attrsOverrides: CreateTableOverrides = {};
29
+ if (isTableScalingEnabled && isFullWidthModeEnabled) {
30
+ attrsOverrides.tableWidth = TABLE_MAX_WIDTH;
31
+ }
32
+ if (isTableAlignmentEnabled && isFullWidthModeEnabled) {
33
+ attrsOverrides.layout = 'align-start';
34
+ }
35
35
 
36
- return createTable({
37
- schema,
38
- ...createTableProps,
39
- ...attrsOverrides,
40
- });
41
- };
36
+ return createTable({
37
+ schema,
38
+ ...createTableProps,
39
+ ...attrsOverrides,
40
+ });
41
+ };