@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
@@ -6,44 +6,44 @@ import type { TableDirection } from '../../types';
6
6
  import { DragInMotionIcon } from '../icons/DragInMotionIcon';
7
7
 
8
8
  const boxStyles = xcss({
9
- borderColor: 'color.border.focused',
10
- borderStyle: 'solid',
11
- borderRadius: 'border.radius.100',
12
- borderWidth: 'border.width.outline',
13
- backgroundColor: 'color.blanket.selected',
9
+ borderColor: 'color.border.focused',
10
+ borderStyle: 'solid',
11
+ borderRadius: 'border.radius.100',
12
+ borderWidth: 'border.width.outline',
13
+ backgroundColor: 'color.blanket.selected',
14
14
  });
15
15
 
16
16
  export const DragPreview = ({
17
- direction,
18
- width,
19
- height,
17
+ direction,
18
+ width,
19
+ height,
20
20
  }: {
21
- direction: TableDirection;
22
- width: number;
23
- height: number;
21
+ direction: TableDirection;
22
+ width: number;
23
+ height: number;
24
24
  }) => {
25
- let marginLeft = direction === 'row' ? -14 : width / 2 - 14;
26
- let marginTop = direction === 'row' ? height / 2 - 14 : -10;
27
- let transform = direction === 'row' ? 'rotate(90deg)' : 'none';
28
- return (
29
- <Box
30
- xcss={boxStyles}
31
- style={{
32
- width: `${width}px`,
33
- height: `${height}px`,
34
- }}
35
- >
36
- <DragInMotionIcon
37
- style={{
38
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
39
- position: 'absolute',
40
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
41
- marginLeft: `${marginLeft}px`,
42
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
43
- marginTop: `${marginTop}px`,
44
- transform: transform,
45
- }}
46
- />
47
- </Box>
48
- );
25
+ let marginLeft = direction === 'row' ? -14 : width / 2 - 14;
26
+ let marginTop = direction === 'row' ? height / 2 - 14 : -10;
27
+ let transform = direction === 'row' ? 'rotate(90deg)' : 'none';
28
+ return (
29
+ <Box
30
+ xcss={boxStyles}
31
+ style={{
32
+ width: `${width}px`,
33
+ height: `${height}px`,
34
+ }}
35
+ >
36
+ <DragInMotionIcon
37
+ style={{
38
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
39
+ position: 'absolute',
40
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
41
+ marginLeft: `${marginLeft}px`,
42
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
43
+ marginTop: `${marginTop}px`,
44
+ transform: transform,
45
+ }}
46
+ />
47
+ </Box>
48
+ );
49
49
  };
@@ -2,55 +2,47 @@
2
2
  import { jsx } from '@emotion/react';
3
3
 
4
4
  import { ButtonGroup } from '@atlaskit/button';
5
- import type {
6
- Command,
7
- FloatingToolbarItem,
8
- } from '@atlaskit/editor-common/types';
5
+ import type { Command, FloatingToolbarItem } from '@atlaskit/editor-common/types';
9
6
  import {
10
- FloatingToolbarButton as Button,
11
- FloatingToolbarSeparator,
7
+ FloatingToolbarButton as Button,
8
+ FloatingToolbarSeparator,
12
9
  } from '@atlaskit/editor-common/ui';
13
10
  import { Box, xcss } from '@atlaskit/primitives';
14
11
 
15
12
  const containerStyles = xcss({
16
- marginLeft: 'space.100',
13
+ marginLeft: 'space.100',
17
14
  });
18
15
 
19
16
  type Props = {
20
- alignmentButtons: FloatingToolbarItem<Command>[];
21
- dispatchCommand: (command: Command) => void;
17
+ alignmentButtons: FloatingToolbarItem<Command>[];
18
+ dispatchCommand: (command: Command) => void;
22
19
  };
23
20
 
24
- export const FloatingAlignmentButtons = ({
25
- alignmentButtons,
26
- dispatchCommand,
27
- }: Props) => {
28
- return (
29
- <Box xcss={containerStyles}>
30
- <ButtonGroup>
31
- {alignmentButtons.map((item, idx) => {
32
- switch (item.type) {
33
- case 'separator':
34
- return <FloatingToolbarSeparator key={idx} />;
35
- case 'button':
36
- const ButtonIcon = item.icon as React.ComponentClass<any>;
37
- return (
38
- <Button
39
- key={idx}
40
- icon={
41
- item.icon ? <ButtonIcon label={item.title} /> : undefined
42
- }
43
- title={item.title}
44
- selected={item.selected}
45
- disabled={item.disabled}
46
- onClick={() => {
47
- dispatchCommand(item.onClick);
48
- }}
49
- />
50
- );
51
- }
52
- })}
53
- </ButtonGroup>
54
- </Box>
55
- );
21
+ export const FloatingAlignmentButtons = ({ alignmentButtons, dispatchCommand }: Props) => {
22
+ return (
23
+ <Box xcss={containerStyles}>
24
+ <ButtonGroup>
25
+ {alignmentButtons.map((item, idx) => {
26
+ switch (item.type) {
27
+ case 'separator':
28
+ return <FloatingToolbarSeparator key={idx} />;
29
+ case 'button':
30
+ const ButtonIcon = item.icon as React.ComponentClass<any>;
31
+ return (
32
+ <Button
33
+ key={idx}
34
+ icon={item.icon ? <ButtonIcon label={item.title} /> : undefined}
35
+ title={item.title}
36
+ selected={item.selected}
37
+ disabled={item.disabled}
38
+ onClick={() => {
39
+ dispatchCommand(item.onClick);
40
+ }}
41
+ />
42
+ );
43
+ }
44
+ })}
45
+ </ButtonGroup>
46
+ </Box>
47
+ );
56
48
  };
@@ -13,178 +13,175 @@ import { insertColumnButtonOffset } from '../common-styles';
13
13
  export const BUTTON_WIDTH = 20;
14
14
 
15
15
  export interface Props {
16
- children: React.ReactNode;
17
- mountTo: HTMLElement;
18
- offset: number;
19
- stickyHeader: RowStickyState;
20
- targetCellPosition: number;
21
- targetCellRef: HTMLElement;
22
- tableWrapper: HTMLElement;
23
- isContextualMenuOpen: boolean | undefined;
16
+ children: React.ReactNode;
17
+ mountTo: HTMLElement;
18
+ offset: number;
19
+ stickyHeader: RowStickyState;
20
+ targetCellPosition: number;
21
+ targetCellRef: HTMLElement;
22
+ tableWrapper: HTMLElement;
23
+ isContextualMenuOpen: boolean | undefined;
24
24
  }
25
25
 
26
26
  interface CalcLeftPosData {
27
- buttonWidth: number;
28
- cellRectLeft: number;
29
- cellRefWidth: number;
30
- offset: number;
27
+ buttonWidth: number;
28
+ cellRectLeft: number;
29
+ cellRefWidth: number;
30
+ offset: number;
31
31
  }
32
32
 
33
33
  export const calcLeftPos = ({
34
- buttonWidth,
35
- cellRectLeft,
36
- cellRefWidth,
37
- offset,
34
+ buttonWidth,
35
+ cellRectLeft,
36
+ cellRefWidth,
37
+ offset,
38
38
  }: CalcLeftPosData) => {
39
- return cellRectLeft + cellRefWidth - buttonWidth - offset;
39
+ return cellRectLeft + cellRefWidth - buttonWidth - offset;
40
40
  };
41
41
 
42
42
  export const calcObserverTargetMargin = (
43
- tableWrapper: HTMLElement,
44
- fixedButtonRefCurrent: HTMLElement,
43
+ tableWrapper: HTMLElement,
44
+ fixedButtonRefCurrent: HTMLElement,
45
45
  ) => {
46
- const tableWrapperRect = tableWrapper.getBoundingClientRect();
47
- const fixedButtonRect = fixedButtonRefCurrent.getBoundingClientRect();
48
- const scrollLeft = tableWrapper.scrollLeft;
49
- return fixedButtonRect.left - tableWrapperRect.left + scrollLeft;
46
+ const tableWrapperRect = tableWrapper.getBoundingClientRect();
47
+ const fixedButtonRect = fixedButtonRefCurrent.getBoundingClientRect();
48
+ const scrollLeft = tableWrapper.scrollLeft;
49
+ return fixedButtonRect.left - tableWrapperRect.left + scrollLeft;
50
50
  };
51
51
 
52
52
  export const FixedButton = ({
53
- children,
54
- isContextualMenuOpen,
55
- mountTo,
56
- offset,
57
- stickyHeader,
58
- tableWrapper,
59
- targetCellPosition,
60
- targetCellRef,
53
+ children,
54
+ isContextualMenuOpen,
55
+ mountTo,
56
+ offset,
57
+ stickyHeader,
58
+ tableWrapper,
59
+ targetCellPosition,
60
+ targetCellRef,
61
61
  }: Props) => {
62
- const fixedButtonRef = useRef<HTMLDivElement | null>(null);
63
- const observerTargetRef = useRef<HTMLDivElement | null>(null);
64
-
65
- // Using refs here rather than state to prevent heaps of renders on scroll
66
- const scrollDataRef = useRef(0);
67
- const leftPosDataRef = useRef(0);
68
-
69
- useEffect(() => {
70
- const observerTargetRefCurrent = observerTargetRef.current;
71
- const fixedButtonRefCurrent = fixedButtonRef.current;
72
-
73
- if (fixedButtonRefCurrent && observerTargetRefCurrent) {
74
- scrollDataRef.current = tableWrapper.scrollLeft;
75
- leftPosDataRef.current = 0;
76
- // Hide the button initially in case there's a flash of the button being
77
- // outside the table before the Intersection Observer fires
78
- fixedButtonRefCurrent.style.visibility = 'hidden';
79
-
80
- const margin = calcObserverTargetMargin(
81
- tableWrapper,
82
- fixedButtonRefCurrent,
83
- );
84
-
85
- // Much more simple and predictable to add this margin to the observer target
86
- // rather than using it to calculate the rootMargin values
87
- observerTargetRefCurrent.style.marginLeft = `${margin}px`;
88
-
89
- const observer = new IntersectionObserver(
90
- (entries) => {
91
- entries.forEach((entry) => {
92
- if (entry.isIntersecting) {
93
- fixedButtonRefCurrent.style.visibility = 'visible';
94
- } else {
95
- fixedButtonRefCurrent.style.visibility = 'hidden';
96
- }
97
- });
98
- },
99
- {
100
- root: tableWrapper,
101
- rootMargin: `0px ${insertColumnButtonOffset}px 0px 0px`,
102
- threshold: 1,
103
- },
104
- );
105
-
106
- const handleScroll = rafSchedule((event) => {
107
- if (fixedButtonRef.current) {
108
- const delta = event.target.scrollLeft - scrollDataRef.current;
109
- const style = `translateX(${leftPosDataRef.current - delta}px)`;
110
- fixedButtonRef.current.style.transform = style;
111
-
112
- scrollDataRef.current = event.target.scrollLeft;
113
- leftPosDataRef.current = leftPosDataRef.current - delta;
114
- }
115
- });
116
-
117
- observer.observe(observerTargetRefCurrent);
118
- tableWrapper.addEventListener('scroll', handleScroll);
119
-
120
- return () => {
121
- tableWrapper.removeEventListener('scroll', handleScroll);
122
- fixedButtonRefCurrent.style.transform = '';
123
- observer.unobserve(observerTargetRefCurrent);
124
- };
125
- }
126
- }, [
127
- fixedButtonRef,
128
- observerTargetRef,
129
- tableWrapper,
130
- targetCellPosition,
131
- targetCellRef,
132
- isContextualMenuOpen,
133
- ]);
134
-
135
- const targetCellRect = targetCellRef.getBoundingClientRect();
136
-
137
- // Using a portal here to ensure wrapperRef has the tableWrapper as an
138
- // ancestor. This is required to make the Intersection Observer work.
139
- return createPortal(
140
- // Using observerTargetRef here for our Intersection Observer. There is issues
141
- // getting the observer to work just using the fixedButtonRef, possible due
142
- // to using position fixed on this Element, or possibly due to its position
143
- // being changed on scroll.
144
- <div
145
- ref={observerTargetRef}
146
- style={{
147
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
148
- position: 'absolute',
149
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
150
- top: token('space.0', '0px'),
151
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
152
- left: token('space.0', '0px'),
153
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
154
- width: token('space.250', '20px'), // BUTTON_WIDTH
155
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
156
- height: token('space.250', '20px'), // BUTTON_WIDTH
157
- }}
158
- >
159
- <div
160
- ref={fixedButtonRef}
161
- style={{
162
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
163
- position: 'fixed',
164
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
165
- top: stickyHeader.top + stickyHeader.padding + offset * 2,
166
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
167
- zIndex: akEditorTableCellOnStickyHeaderZIndex,
168
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
169
- left: calcLeftPos({
170
- buttonWidth: BUTTON_WIDTH,
171
- cellRectLeft: targetCellRect.left,
172
- cellRefWidth: targetCellRef.clientWidth,
173
- offset,
174
- }),
175
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
176
- width: token('space.250', '20px'), // BUTTON_WIDTH
177
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
178
- height: token('space.250', '20px'), // BUTTON_WIDTH
179
- }}
180
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
181
- className={ClassName.CONTEXTUAL_MENU_BUTTON_FIXED}
182
- >
183
- {children}
184
- </div>
185
- </div>,
186
- mountTo,
187
- );
62
+ const fixedButtonRef = useRef<HTMLDivElement | null>(null);
63
+ const observerTargetRef = useRef<HTMLDivElement | null>(null);
64
+
65
+ // Using refs here rather than state to prevent heaps of renders on scroll
66
+ const scrollDataRef = useRef(0);
67
+ const leftPosDataRef = useRef(0);
68
+
69
+ useEffect(() => {
70
+ const observerTargetRefCurrent = observerTargetRef.current;
71
+ const fixedButtonRefCurrent = fixedButtonRef.current;
72
+
73
+ if (fixedButtonRefCurrent && observerTargetRefCurrent) {
74
+ scrollDataRef.current = tableWrapper.scrollLeft;
75
+ leftPosDataRef.current = 0;
76
+ // Hide the button initially in case there's a flash of the button being
77
+ // outside the table before the Intersection Observer fires
78
+ fixedButtonRefCurrent.style.visibility = 'hidden';
79
+
80
+ const margin = calcObserverTargetMargin(tableWrapper, fixedButtonRefCurrent);
81
+
82
+ // Much more simple and predictable to add this margin to the observer target
83
+ // rather than using it to calculate the rootMargin values
84
+ observerTargetRefCurrent.style.marginLeft = `${margin}px`;
85
+
86
+ const observer = new IntersectionObserver(
87
+ (entries) => {
88
+ entries.forEach((entry) => {
89
+ if (entry.isIntersecting) {
90
+ fixedButtonRefCurrent.style.visibility = 'visible';
91
+ } else {
92
+ fixedButtonRefCurrent.style.visibility = 'hidden';
93
+ }
94
+ });
95
+ },
96
+ {
97
+ root: tableWrapper,
98
+ rootMargin: `0px ${insertColumnButtonOffset}px 0px 0px`,
99
+ threshold: 1,
100
+ },
101
+ );
102
+
103
+ const handleScroll = rafSchedule((event) => {
104
+ if (fixedButtonRef.current) {
105
+ const delta = event.target.scrollLeft - scrollDataRef.current;
106
+ const style = `translateX(${leftPosDataRef.current - delta}px)`;
107
+ fixedButtonRef.current.style.transform = style;
108
+
109
+ scrollDataRef.current = event.target.scrollLeft;
110
+ leftPosDataRef.current = leftPosDataRef.current - delta;
111
+ }
112
+ });
113
+
114
+ observer.observe(observerTargetRefCurrent);
115
+ tableWrapper.addEventListener('scroll', handleScroll);
116
+
117
+ return () => {
118
+ tableWrapper.removeEventListener('scroll', handleScroll);
119
+ fixedButtonRefCurrent.style.transform = '';
120
+ observer.unobserve(observerTargetRefCurrent);
121
+ };
122
+ }
123
+ }, [
124
+ fixedButtonRef,
125
+ observerTargetRef,
126
+ tableWrapper,
127
+ targetCellPosition,
128
+ targetCellRef,
129
+ isContextualMenuOpen,
130
+ ]);
131
+
132
+ const targetCellRect = targetCellRef.getBoundingClientRect();
133
+
134
+ // Using a portal here to ensure wrapperRef has the tableWrapper as an
135
+ // ancestor. This is required to make the Intersection Observer work.
136
+ return createPortal(
137
+ // Using observerTargetRef here for our Intersection Observer. There is issues
138
+ // getting the observer to work just using the fixedButtonRef, possible due
139
+ // to using position fixed on this Element, or possibly due to its position
140
+ // being changed on scroll.
141
+ <div
142
+ ref={observerTargetRef}
143
+ style={{
144
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
145
+ position: 'absolute',
146
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
147
+ top: token('space.0', '0px'),
148
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
149
+ left: token('space.0', '0px'),
150
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
151
+ width: token('space.250', '20px'), // BUTTON_WIDTH
152
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
153
+ height: token('space.250', '20px'), // BUTTON_WIDTH
154
+ }}
155
+ >
156
+ <div
157
+ ref={fixedButtonRef}
158
+ style={{
159
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
160
+ position: 'fixed',
161
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
162
+ top: stickyHeader.top + stickyHeader.padding + offset * 2,
163
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
164
+ zIndex: akEditorTableCellOnStickyHeaderZIndex,
165
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
166
+ left: calcLeftPos({
167
+ buttonWidth: BUTTON_WIDTH,
168
+ cellRectLeft: targetCellRect.left,
169
+ cellRefWidth: targetCellRef.clientWidth,
170
+ offset,
171
+ }),
172
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
173
+ width: token('space.250', '20px'), // BUTTON_WIDTH
174
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
175
+ height: token('space.250', '20px'), // BUTTON_WIDTH
176
+ }}
177
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
178
+ className={ClassName.CONTEXTUAL_MENU_BUTTON_FIXED}
179
+ >
180
+ {children}
181
+ </div>
182
+ </div>,
183
+ mountTo,
184
+ );
188
185
  };
189
186
 
190
187
  export default FixedButton;