@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
@@ -2,61 +2,54 @@
2
2
  import { jsx } from '@emotion/react';
3
3
  import { useIntl } from 'react-intl-next';
4
4
 
5
- import {
6
- startColumnResizing,
7
- ToolTipContent,
8
- } from '@atlaskit/editor-common/keymaps';
5
+ import { startColumnResizing, ToolTipContent } from '@atlaskit/editor-common/keymaps';
9
6
  import { tableMessages as messages } from '@atlaskit/editor-common/messages';
10
7
  import Tooltip from '@atlaskit/tooltip';
11
8
 
12
9
  import { TableCssClassName } from '../../types';
13
10
 
14
11
  type Props = {
15
- startIndex: number;
16
- endIndex: number;
17
- includeTooltip?: boolean;
12
+ startIndex: number;
13
+ endIndex: number;
14
+ includeTooltip?: boolean;
18
15
  };
19
16
 
20
- export const ColumnResizeWidget = ({
21
- startIndex,
22
- endIndex,
23
- includeTooltip,
24
- }: Props) => {
25
- const { formatMessage } = useIntl();
17
+ export const ColumnResizeWidget = ({ startIndex, endIndex, includeTooltip }: Props) => {
18
+ const { formatMessage } = useIntl();
26
19
 
27
- if (!includeTooltip) {
28
- return (
29
- <div
30
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
31
- className={TableCssClassName.RESIZE_HANDLE_DECORATION}
32
- data-start-index={startIndex}
33
- data-end-index={endIndex}
34
- />
35
- );
36
- }
20
+ if (!includeTooltip) {
21
+ return (
22
+ <div
23
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
24
+ className={TableCssClassName.RESIZE_HANDLE_DECORATION}
25
+ data-start-index={startIndex}
26
+ data-end-index={endIndex}
27
+ />
28
+ );
29
+ }
37
30
 
38
- return (
39
- <Tooltip
40
- content={
41
- <ToolTipContent
42
- description={formatMessage(messages.adjustColumns)}
43
- keymap={startColumnResizing}
44
- />
45
- }
46
- hideTooltipOnClick
47
- hideTooltipOnMouseDown
48
- position="mouse"
49
- mousePosition="auto-start"
50
- >
51
- {(tooltipProps) => (
52
- <div
53
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
54
- className={TableCssClassName.RESIZE_HANDLE_DECORATION}
55
- data-start-index={startIndex}
56
- data-end-index={endIndex}
57
- {...tooltipProps}
58
- />
59
- )}
60
- </Tooltip>
61
- );
31
+ return (
32
+ <Tooltip
33
+ content={
34
+ <ToolTipContent
35
+ description={formatMessage(messages.adjustColumns)}
36
+ keymap={startColumnResizing}
37
+ />
38
+ }
39
+ hideTooltipOnClick
40
+ hideTooltipOnMouseDown
41
+ position="mouse"
42
+ mousePosition="auto-start"
43
+ >
44
+ {(tooltipProps) => (
45
+ <div
46
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
47
+ className={TableCssClassName.RESIZE_HANDLE_DECORATION}
48
+ data-start-index={startIndex}
49
+ data-end-index={endIndex}
50
+ {...tooltipProps}
51
+ />
52
+ )}
53
+ </Tooltip>
54
+ );
62
55
  };
@@ -1,23 +1,19 @@
1
1
  import React from 'react';
2
2
 
3
- import {
4
- DragHandleDisabledIcon,
5
- DragHandleIcon,
6
- MinimisedHandleIcon,
7
- } from '../icons';
3
+ import { DragHandleDisabledIcon, DragHandleIcon, MinimisedHandleIcon } from '../icons';
8
4
 
9
5
  type HandleIconProps = {
10
- forceDefaultHandle: boolean;
11
- isHandleHovered: boolean;
12
- hasMergedCells: boolean;
6
+ forceDefaultHandle: boolean;
7
+ isHandleHovered: boolean;
8
+ hasMergedCells: boolean;
13
9
  };
14
10
 
15
11
  export const HandleIconComponent = (props: HandleIconProps) => {
16
- const { forceDefaultHandle, isHandleHovered, hasMergedCells } = props;
12
+ const { forceDefaultHandle, isHandleHovered, hasMergedCells } = props;
17
13
 
18
- if (isHandleHovered || forceDefaultHandle) {
19
- return hasMergedCells ? <DragHandleDisabledIcon /> : <DragHandleIcon />;
20
- }
14
+ if (isHandleHovered || forceDefaultHandle) {
15
+ return hasMergedCells ? <DragHandleDisabledIcon /> : <DragHandleIcon />;
16
+ }
21
17
 
22
- return <MinimisedHandleIcon />;
18
+ return <MinimisedHandleIcon />;
23
19
  };
@@ -26,281 +26,252 @@ import { DragPreview } from '../DragPreview';
26
26
 
27
27
  import { HandleIconComponent } from './HandleIconComponent';
28
28
 
29
- export type DragHandleAppearance =
30
- | 'default'
31
- | 'selected'
32
- | 'disabled'
33
- | 'danger'
34
- | 'placeholder';
29
+ export type DragHandleAppearance = 'default' | 'selected' | 'disabled' | 'danger' | 'placeholder';
35
30
 
36
31
  type DragHandleProps = {
37
- tableLocalId: string;
38
- indexes: number[];
39
- forceDefaultHandle?: boolean;
40
- previewWidth?: number;
41
- previewHeight?: number;
42
- hoveredCell?: CellHoverMeta;
43
- direction?: TableDirection;
44
- appearance?: DragHandleAppearance;
45
- onClick?: MouseEventHandler;
46
- onMouseOver?: MouseEventHandler;
47
- onMouseOut?: MouseEventHandler;
48
- toggleDragMenu?: (
49
- trigger: TriggerType,
50
- event?: React.MouseEvent<HTMLButtonElement, MouseEvent>,
51
- ) => void;
52
- editorView: EditorView;
53
- isDragMenuTarget: boolean; // this is identify which current handle component is
32
+ tableLocalId: string;
33
+ indexes: number[];
34
+ forceDefaultHandle?: boolean;
35
+ previewWidth?: number;
36
+ previewHeight?: number;
37
+ hoveredCell?: CellHoverMeta;
38
+ direction?: TableDirection;
39
+ appearance?: DragHandleAppearance;
40
+ onClick?: MouseEventHandler;
41
+ onMouseOver?: MouseEventHandler;
42
+ onMouseOut?: MouseEventHandler;
43
+ toggleDragMenu?: (
44
+ trigger: TriggerType,
45
+ event?: React.MouseEvent<HTMLButtonElement, MouseEvent>,
46
+ ) => void;
47
+ editorView: EditorView;
48
+ isDragMenuTarget: boolean; // this is identify which current handle component is
54
49
  };
55
50
 
56
51
  const DragHandleComponent = ({
57
- isDragMenuTarget,
58
- tableLocalId,
59
- direction = 'row',
60
- appearance = 'default',
61
- indexes,
62
- forceDefaultHandle = false,
63
- previewWidth,
64
- previewHeight,
65
- onMouseOver,
66
- onMouseOut,
67
- toggleDragMenu,
68
- hoveredCell,
69
- onClick,
70
- editorView,
71
- intl: { formatMessage },
52
+ isDragMenuTarget,
53
+ tableLocalId,
54
+ direction = 'row',
55
+ appearance = 'default',
56
+ indexes,
57
+ forceDefaultHandle = false,
58
+ previewWidth,
59
+ previewHeight,
60
+ onMouseOver,
61
+ onMouseOut,
62
+ toggleDragMenu,
63
+ hoveredCell,
64
+ onClick,
65
+ editorView,
66
+ intl: { formatMessage },
72
67
  }: DragHandleProps & WrappedComponentProps) => {
73
- const dragHandleDivRef = useRef<HTMLButtonElement>(null);
74
- const [previewContainer, setPreviewContainer] = useState<HTMLElement | null>(
75
- null,
76
- );
77
- const {
78
- state,
79
- state: { selection },
80
- } = editorView;
81
- const { hoveredColumns, hoveredRows } = getPluginState(state);
82
- const { isDragMenuOpen } = getDnDPluginState(state);
68
+ const dragHandleDivRef = useRef<HTMLButtonElement>(null);
69
+ const [previewContainer, setPreviewContainer] = useState<HTMLElement | null>(null);
70
+ const {
71
+ state,
72
+ state: { selection },
73
+ } = editorView;
74
+ const { hoveredColumns, hoveredRows } = getPluginState(state);
75
+ const { isDragMenuOpen } = getDnDPluginState(state);
83
76
 
84
- const isRow = direction === 'row';
85
- const isColumn = direction === 'column';
77
+ const isRow = direction === 'row';
78
+ const isColumn = direction === 'column';
86
79
 
87
- const isRowHandleHovered = isRow && hoveredRows.length > 0;
88
- const isColumnHandleHovered = isColumn && hoveredColumns.length > 0;
80
+ const isRowHandleHovered = isRow && hoveredRows.length > 0;
81
+ const isColumnHandleHovered = isColumn && hoveredColumns.length > 0;
89
82
 
90
- const hasMergedCells = useMemo(() => {
91
- const table = findTable(selection);
92
- if (!table) {
93
- return false;
94
- }
83
+ const hasMergedCells = useMemo(() => {
84
+ const table = findTable(selection);
85
+ if (!table) {
86
+ return false;
87
+ }
95
88
 
96
- const map = TableMap.get(table?.node);
89
+ const map = TableMap.get(table?.node);
97
90
 
98
- if (!map.hasMergedCells() || indexes.length < 1) {
99
- return false;
100
- }
91
+ if (!map.hasMergedCells() || indexes.length < 1) {
92
+ return false;
93
+ }
101
94
 
102
- const { mapByColumn, mapByRow } = map;
95
+ const { mapByColumn, mapByRow } = map;
103
96
 
104
- // this handle when hover to first column or row which has merged cells.
105
- if (
106
- hoveredCell &&
107
- hoveredCell.rowIndex !== undefined &&
108
- hoveredCell.colIndex !== undefined &&
109
- selection instanceof TextSelection
110
- ) {
111
- const { rowIndex, colIndex } = hoveredCell;
97
+ // this handle when hover to first column or row which has merged cells.
98
+ if (
99
+ hoveredCell &&
100
+ hoveredCell.rowIndex !== undefined &&
101
+ hoveredCell.colIndex !== undefined &&
102
+ selection instanceof TextSelection
103
+ ) {
104
+ const { rowIndex, colIndex } = hoveredCell;
112
105
 
113
- const mergedPositionInRow = findDuplicatePosition(mapByRow[rowIndex]);
114
- const mergedPositionInCol = findDuplicatePosition(mapByColumn[colIndex]);
106
+ const mergedPositionInRow = findDuplicatePosition(mapByRow[rowIndex]);
107
+ const mergedPositionInCol = findDuplicatePosition(mapByColumn[colIndex]);
115
108
 
116
- const hasMergedCellsInFirstRowOrColumn =
117
- direction === 'column'
118
- ? mergedPositionInRow.includes(mapByRow[0][colIndex])
119
- : mergedPositionInCol.includes(mapByColumn[0][rowIndex]);
109
+ const hasMergedCellsInFirstRowOrColumn =
110
+ direction === 'column'
111
+ ? mergedPositionInRow.includes(mapByRow[0][colIndex])
112
+ : mergedPositionInCol.includes(mapByColumn[0][rowIndex]);
120
113
 
121
- const isHoveredOnFirstRowOrColumn =
122
- direction === 'column'
123
- ? hoveredCell.rowIndex === 0 && hasMergedCellsInFirstRowOrColumn
124
- : hoveredCell.colIndex === 0 && hasMergedCellsInFirstRowOrColumn;
114
+ const isHoveredOnFirstRowOrColumn =
115
+ direction === 'column'
116
+ ? hoveredCell.rowIndex === 0 && hasMergedCellsInFirstRowOrColumn
117
+ : hoveredCell.colIndex === 0 && hasMergedCellsInFirstRowOrColumn;
125
118
 
126
- if (isHoveredOnFirstRowOrColumn) {
127
- const mergedSizes =
128
- direction === 'column'
129
- ? mapByRow[0].filter((el: number) => el === mapByRow[0][colIndex])
130
- .length
131
- : mapByColumn[0].filter(
132
- (el: number) => el === mapByColumn[0][rowIndex],
133
- ).length;
119
+ if (isHoveredOnFirstRowOrColumn) {
120
+ const mergedSizes =
121
+ direction === 'column'
122
+ ? mapByRow[0].filter((el: number) => el === mapByRow[0][colIndex]).length
123
+ : mapByColumn[0].filter((el: number) => el === mapByColumn[0][rowIndex]).length;
134
124
 
135
- const mergedSelection = hasMergedCellsInSelection(
136
- direction === 'column'
137
- ? [colIndex, colIndex + mergedSizes - 1]
138
- : [rowIndex, rowIndex + mergedSizes - 1],
139
- direction,
140
- )(selection);
125
+ const mergedSelection = hasMergedCellsInSelection(
126
+ direction === 'column'
127
+ ? [colIndex, colIndex + mergedSizes - 1]
128
+ : [rowIndex, rowIndex + mergedSizes - 1],
129
+ direction,
130
+ )(selection);
141
131
 
142
- return mergedSelection;
143
- }
144
- }
132
+ return mergedSelection;
133
+ }
134
+ }
145
135
 
146
- return hasMergedCellsInSelection(indexes, direction)(selection);
147
- }, [indexes, selection, direction, hoveredCell]);
136
+ return hasMergedCellsInSelection(indexes, direction)(selection);
137
+ }, [indexes, selection, direction, hoveredCell]);
148
138
 
149
- const handleIconProps = {
150
- forceDefaultHandle,
151
- isHandleHovered: isColumnHandleHovered || isRowHandleHovered,
152
- hasMergedCells,
153
- };
139
+ const handleIconProps = {
140
+ forceDefaultHandle,
141
+ isHandleHovered: isColumnHandleHovered || isRowHandleHovered,
142
+ hasMergedCells,
143
+ };
154
144
 
155
- useEffect(() => {
156
- const dragHandleDivRefCurrent = dragHandleDivRef.current;
145
+ useEffect(() => {
146
+ const dragHandleDivRefCurrent = dragHandleDivRef.current;
157
147
 
158
- if (dragHandleDivRefCurrent) {
159
- return draggable({
160
- element: dragHandleDivRefCurrent,
161
- canDrag: () => {
162
- return !hasMergedCells;
163
- },
164
- getInitialData() {
165
- return {
166
- localId: tableLocalId,
167
- type: `table-${direction}`,
168
- indexes,
169
- };
170
- },
171
- onGenerateDragPreview: ({ nativeSetDragImage }) => {
172
- setCustomNativeDragPreview({
173
- getOffset: ({ container }) => {
174
- const rect = container.getBoundingClientRect();
175
- if (browser.safari) {
176
- // See: https://product-fabric.atlassian.net/browse/ED-21442
177
- // We need to ensure that the preview is not overlaying screen content when the snapshot is taken, otherwise
178
- // safari will composite the screen text elements into the bitmap snapshot. The container is a wrapper which is already
179
- // positioned fixed at top/left 0.
180
- // IMPORTANT: we must not exceed more then the width of the container off-screen otherwise not preview will
181
- // be generated.
182
- container.style.left = `-${rect.width - 0.0001}px`;
183
- }
184
- if (isRow) {
185
- return { x: 12, y: rect.height / 2 };
186
- } else {
187
- return { x: rect.width / 2 + 4, y: 12 };
188
- }
189
- },
190
- render: function render({ container }) {
191
- setPreviewContainer(container);
192
- return () => setPreviewContainer(null);
193
- },
194
- nativeSetDragImage,
195
- });
196
- },
197
- });
198
- }
199
- }, [
200
- tableLocalId,
201
- direction,
202
- indexes,
203
- isRow,
204
- editorView.state.selection,
205
- hasMergedCells,
206
- ]);
148
+ if (dragHandleDivRefCurrent) {
149
+ return draggable({
150
+ element: dragHandleDivRefCurrent,
151
+ canDrag: () => {
152
+ return !hasMergedCells;
153
+ },
154
+ getInitialData() {
155
+ return {
156
+ localId: tableLocalId,
157
+ type: `table-${direction}`,
158
+ indexes,
159
+ };
160
+ },
161
+ onGenerateDragPreview: ({ nativeSetDragImage }) => {
162
+ setCustomNativeDragPreview({
163
+ getOffset: ({ container }) => {
164
+ const rect = container.getBoundingClientRect();
165
+ if (browser.safari) {
166
+ // See: https://product-fabric.atlassian.net/browse/ED-21442
167
+ // We need to ensure that the preview is not overlaying screen content when the snapshot is taken, otherwise
168
+ // safari will composite the screen text elements into the bitmap snapshot. The container is a wrapper which is already
169
+ // positioned fixed at top/left 0.
170
+ // IMPORTANT: we must not exceed more then the width of the container off-screen otherwise not preview will
171
+ // be generated.
172
+ container.style.left = `-${rect.width - 0.0001}px`;
173
+ }
174
+ if (isRow) {
175
+ return { x: 12, y: rect.height / 2 };
176
+ } else {
177
+ return { x: rect.width / 2 + 4, y: 12 };
178
+ }
179
+ },
180
+ render: function render({ container }) {
181
+ setPreviewContainer(container);
182
+ return () => setPreviewContainer(null);
183
+ },
184
+ nativeSetDragImage,
185
+ });
186
+ },
187
+ });
188
+ }
189
+ }, [tableLocalId, direction, indexes, isRow, editorView.state.selection, hasMergedCells]);
207
190
 
208
- const showDragMenuAnchorId = isRow
209
- ? 'drag-handle-button-row'
210
- : 'drag-handle-button-column';
191
+ const showDragMenuAnchorId = isRow ? 'drag-handle-button-row' : 'drag-handle-button-column';
211
192
 
212
- return (
213
- <>
214
- <button
215
- type="button"
216
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
217
- className={ClassName.DRAG_HANDLE_BUTTON_CLICKABLE_ZONE}
218
- data-testid="table-drag-handle-clickable-zone-button"
219
- style={{
220
- height: isRow
221
- ? `calc(100% - ${dragTableInsertColumnButtonSize}px)`
222
- : `${token('space.200', '16px')}`, // 16px here because it's the size of drag handle button's large side
223
- width: isRow
224
- ? `${token('space.200', '16px')}` // 16px here because it's the size of drag handle button's large side
225
- : `calc(100% - ${dragTableInsertColumnButtonSize}px)`,
226
- left: isRow ? `${token('space.050', '4px')}` : undefined,
227
- bottom: isColumn ? `${token('space.0', '0px')}` : undefined,
228
- alignSelf: isColumn ? 'none' : 'center',
229
- zIndex: isColumn ? '-1' : 'auto',
230
- }}
231
- onMouseUp={(e) => {
232
- // should toggle menu if current drag menu open.
233
- // return focus to editor so copying table selections whilst still works, i cannot call e.preventDefault in a mousemove event as this stops dragstart events from firing
234
- // -> this is bad for a11y but is the current standard new copy/paste keyboard shortcuts should be introduced instead
235
- editorView.focus();
236
- if (isDragMenuOpen) {
237
- toggleDragMenu && toggleDragMenu('mouse', e);
238
- }
239
- }}
240
- onClick={onClick}
241
- />
242
- <button
243
- type="button"
244
- id={isDragMenuTarget ? showDragMenuAnchorId : undefined}
245
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
246
- className={classnames(
247
- ClassName.DRAG_HANDLE_BUTTON_CONTAINER,
248
- appearance,
249
- {
250
- [ClassName.DRAG_HANDLE_DISABLED]: hasMergedCells,
251
- },
252
- )}
253
- ref={dragHandleDivRef}
254
- style={{
255
- transform: isColumn ? 'none' : 'rotate(90deg)',
256
- alignSelf: isColumn ? 'none' : 'center',
257
- }}
258
- data-testid="table-drag-handle-button"
259
- aria-label={formatMessage(
260
- isRow ? messages.rowDragHandle : messages.columnDragHandle,
261
- )}
262
- aria-expanded={isDragMenuOpen && isDragMenuTarget ? 'true' : 'false'}
263
- aria-haspopup="menu"
264
- onMouseOver={onMouseOver}
265
- onMouseOut={onMouseOut}
266
- onMouseUp={(e) => {
267
- // return focus to editor so copying table selections whilst still works, i cannot call e.preventDefault in a mousemove event as this stops dragstart events from firing
268
- // -> this is bad for a11y but is the current standard new copy/paste keyboard shortcuts should be introduced instead
269
- editorView.focus();
270
- toggleDragMenu && toggleDragMenu('mouse', e);
271
- }}
272
- onClick={onClick}
273
- onKeyDown={(e) => {
274
- if (e.key === 'Enter' || e.key === ' ') {
275
- toggleDragMenu && toggleDragMenu('keyboard');
276
- }
277
- }}
278
- >
279
- {appearance !== 'placeholder' ? (
280
- // cannot block pointer events in Firefox as it breaks Dragging functionality
281
- browser.gecko ? (
282
- <HandleIconComponent {...handleIconProps} />
283
- ) : (
284
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
285
- <span style={{ pointerEvents: 'none' }}>
286
- <HandleIconComponent {...handleIconProps} />
287
- </span>
288
- )
289
- ) : null}
290
- </button>
291
- {previewContainer &&
292
- previewWidth !== undefined &&
293
- previewHeight !== undefined &&
294
- ReactDOM.createPortal(
295
- <DragPreview
296
- direction={direction}
297
- width={previewWidth}
298
- height={previewHeight}
299
- />,
300
- previewContainer,
301
- )}
302
- </>
303
- );
193
+ return (
194
+ <>
195
+ <button
196
+ type="button"
197
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
198
+ className={ClassName.DRAG_HANDLE_BUTTON_CLICKABLE_ZONE}
199
+ data-testid="table-drag-handle-clickable-zone-button"
200
+ style={{
201
+ height: isRow
202
+ ? `calc(100% - ${dragTableInsertColumnButtonSize}px)`
203
+ : `${token('space.200', '16px')}`, // 16px here because it's the size of drag handle button's large side
204
+ width: isRow
205
+ ? `${token('space.200', '16px')}` // 16px here because it's the size of drag handle button's large side
206
+ : `calc(100% - ${dragTableInsertColumnButtonSize}px)`,
207
+ left: isRow ? `${token('space.050', '4px')}` : undefined,
208
+ bottom: isColumn ? `${token('space.0', '0px')}` : undefined,
209
+ alignSelf: isColumn ? 'none' : 'center',
210
+ zIndex: isColumn ? '-1' : 'auto',
211
+ }}
212
+ onMouseUp={(e) => {
213
+ // should toggle menu if current drag menu open.
214
+ // return focus to editor so copying table selections whilst still works, i cannot call e.preventDefault in a mousemove event as this stops dragstart events from firing
215
+ // -> this is bad for a11y but is the current standard new copy/paste keyboard shortcuts should be introduced instead
216
+ editorView.focus();
217
+ if (isDragMenuOpen) {
218
+ toggleDragMenu && toggleDragMenu('mouse', e);
219
+ }
220
+ }}
221
+ onClick={onClick}
222
+ />
223
+ <button
224
+ type="button"
225
+ id={isDragMenuTarget ? showDragMenuAnchorId : undefined}
226
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
227
+ className={classnames(ClassName.DRAG_HANDLE_BUTTON_CONTAINER, appearance, {
228
+ [ClassName.DRAG_HANDLE_DISABLED]: hasMergedCells,
229
+ })}
230
+ ref={dragHandleDivRef}
231
+ style={{
232
+ transform: isColumn ? 'none' : 'rotate(90deg)',
233
+ alignSelf: isColumn ? 'none' : 'center',
234
+ }}
235
+ data-testid="table-drag-handle-button"
236
+ aria-label={formatMessage(isRow ? messages.rowDragHandle : messages.columnDragHandle)}
237
+ aria-expanded={isDragMenuOpen && isDragMenuTarget ? 'true' : 'false'}
238
+ aria-haspopup="menu"
239
+ onMouseOver={onMouseOver}
240
+ onMouseOut={onMouseOut}
241
+ onMouseUp={(e) => {
242
+ // return focus to editor so copying table selections whilst still works, i cannot call e.preventDefault in a mousemove event as this stops dragstart events from firing
243
+ // -> this is bad for a11y but is the current standard new copy/paste keyboard shortcuts should be introduced instead
244
+ editorView.focus();
245
+ toggleDragMenu && toggleDragMenu('mouse', e);
246
+ }}
247
+ onClick={onClick}
248
+ onKeyDown={(e) => {
249
+ if (e.key === 'Enter' || e.key === ' ') {
250
+ toggleDragMenu && toggleDragMenu('keyboard');
251
+ }
252
+ }}
253
+ >
254
+ {appearance !== 'placeholder' ? (
255
+ // cannot block pointer events in Firefox as it breaks Dragging functionality
256
+ browser.gecko ? (
257
+ <HandleIconComponent {...handleIconProps} />
258
+ ) : (
259
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
260
+ <span style={{ pointerEvents: 'none' }}>
261
+ <HandleIconComponent {...handleIconProps} />
262
+ </span>
263
+ )
264
+ ) : null}
265
+ </button>
266
+ {previewContainer &&
267
+ previewWidth !== undefined &&
268
+ previewHeight !== undefined &&
269
+ ReactDOM.createPortal(
270
+ <DragPreview direction={direction} width={previewWidth} height={previewHeight} />,
271
+ previewContainer,
272
+ )}
273
+ </>
274
+ );
304
275
  };
305
276
 
306
277
  export const DragHandle = injectIntl(DragHandleComponent);