@atlaskit/editor-plugin-table 7.3.0 → 7.3.1

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 (98) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/dist/cjs/commands/misc.js +4 -2
  4. package/dist/cjs/commands/selection.js +4 -2
  5. package/dist/cjs/pm-plugins/drag-and-drop/commands.js +3 -1
  6. package/dist/cjs/pm-plugins/drag-and-drop/plugin.js +33 -1
  7. package/dist/cjs/pm-plugins/drag-and-drop/reducer.js +2 -1
  8. package/dist/cjs/pm-plugins/table-selection-keymap.js +2 -2
  9. package/dist/cjs/ui/DragHandle/HandleIconComponent.js +1 -3
  10. package/dist/cjs/ui/DragHandle/index.js +22 -10
  11. package/dist/cjs/ui/FloatingDragMenu/DragMenu.js +75 -33
  12. package/dist/cjs/ui/FloatingDragMenu/DropdownMenu.js +123 -0
  13. package/dist/cjs/ui/FloatingDragMenu/index.js +2 -2
  14. package/dist/cjs/ui/TableFloatingColumnControls/ColumnControls/index.js +24 -35
  15. package/dist/cjs/ui/TableFloatingColumnControls/index.js +1 -2
  16. package/dist/cjs/ui/TableFloatingControls/CornerControls/DragCornerControls.js +4 -0
  17. package/dist/cjs/ui/TableFloatingControls/RowControls/DragControls.js +26 -33
  18. package/dist/cjs/ui/common-styles.js +1 -1
  19. package/dist/cjs/ui/consts.js +3 -2
  20. package/dist/es2019/commands/misc.js +4 -4
  21. package/dist/es2019/commands/selection.js +4 -4
  22. package/dist/es2019/pm-plugins/drag-and-drop/commands.js +3 -3
  23. package/dist/es2019/pm-plugins/drag-and-drop/plugin.js +34 -1
  24. package/dist/es2019/pm-plugins/drag-and-drop/reducer.js +2 -1
  25. package/dist/es2019/pm-plugins/table-selection-keymap.js +2 -2
  26. package/dist/es2019/ui/DragHandle/HandleIconComponent.js +1 -3
  27. package/dist/es2019/ui/DragHandle/index.js +25 -10
  28. package/dist/es2019/ui/FloatingDragMenu/DragMenu.js +72 -32
  29. package/dist/es2019/ui/FloatingDragMenu/DropdownMenu.js +109 -0
  30. package/dist/es2019/ui/FloatingDragMenu/index.js +2 -2
  31. package/dist/es2019/ui/TableFloatingColumnControls/ColumnControls/index.js +24 -35
  32. package/dist/es2019/ui/TableFloatingColumnControls/index.js +1 -2
  33. package/dist/es2019/ui/TableFloatingControls/CornerControls/DragCornerControls.js +4 -0
  34. package/dist/es2019/ui/TableFloatingControls/RowControls/DragControls.js +26 -33
  35. package/dist/es2019/ui/common-styles.js +11 -1
  36. package/dist/es2019/ui/consts.js +2 -1
  37. package/dist/esm/commands/misc.js +4 -2
  38. package/dist/esm/commands/selection.js +4 -2
  39. package/dist/esm/pm-plugins/drag-and-drop/commands.js +3 -2
  40. package/dist/esm/pm-plugins/drag-and-drop/plugin.js +33 -1
  41. package/dist/esm/pm-plugins/drag-and-drop/reducer.js +2 -1
  42. package/dist/esm/pm-plugins/table-selection-keymap.js +2 -2
  43. package/dist/esm/ui/DragHandle/HandleIconComponent.js +1 -3
  44. package/dist/esm/ui/DragHandle/index.js +21 -9
  45. package/dist/esm/ui/FloatingDragMenu/DragMenu.js +74 -35
  46. package/dist/esm/ui/FloatingDragMenu/DropdownMenu.js +116 -0
  47. package/dist/esm/ui/FloatingDragMenu/index.js +2 -2
  48. package/dist/esm/ui/TableFloatingColumnControls/ColumnControls/index.js +24 -35
  49. package/dist/esm/ui/TableFloatingColumnControls/index.js +1 -2
  50. package/dist/esm/ui/TableFloatingControls/CornerControls/DragCornerControls.js +4 -0
  51. package/dist/esm/ui/TableFloatingControls/RowControls/DragControls.js +26 -33
  52. package/dist/esm/ui/common-styles.js +1 -1
  53. package/dist/esm/ui/consts.js +2 -1
  54. package/dist/types/commands/misc.d.ts +2 -2
  55. package/dist/types/commands/selection.d.ts +2 -2
  56. package/dist/types/pm-plugins/drag-and-drop/actions.d.ts +1 -0
  57. package/dist/types/pm-plugins/drag-and-drop/commands.d.ts +2 -1
  58. package/dist/types/pm-plugins/drag-and-drop/types.d.ts +2 -0
  59. package/dist/types/ui/DragHandle/HandleIconComponent.d.ts +1 -2
  60. package/dist/types/ui/DragHandle/index.d.ts +3 -2
  61. package/dist/types/ui/FloatingDragMenu/DragMenu.d.ts +7 -8
  62. package/dist/types/ui/FloatingDragMenu/DropdownMenu.d.ts +30 -0
  63. package/dist/types/ui/TableFloatingColumnControls/ColumnControls/index.d.ts +1 -2
  64. package/dist/types/ui/TableFloatingControls/RowControls/DragControls.d.ts +1 -1
  65. package/dist/types/ui/consts.d.ts +1 -0
  66. package/dist/types-ts4.5/commands/misc.d.ts +2 -2
  67. package/dist/types-ts4.5/commands/selection.d.ts +2 -2
  68. package/dist/types-ts4.5/pm-plugins/drag-and-drop/actions.d.ts +1 -0
  69. package/dist/types-ts4.5/pm-plugins/drag-and-drop/commands.d.ts +2 -1
  70. package/dist/types-ts4.5/pm-plugins/drag-and-drop/types.d.ts +2 -0
  71. package/dist/types-ts4.5/ui/DragHandle/HandleIconComponent.d.ts +1 -2
  72. package/dist/types-ts4.5/ui/DragHandle/index.d.ts +3 -2
  73. package/dist/types-ts4.5/ui/FloatingDragMenu/DragMenu.d.ts +7 -8
  74. package/dist/types-ts4.5/ui/FloatingDragMenu/DropdownMenu.d.ts +30 -0
  75. package/dist/types-ts4.5/ui/TableFloatingColumnControls/ColumnControls/index.d.ts +1 -2
  76. package/dist/types-ts4.5/ui/TableFloatingControls/RowControls/DragControls.d.ts +1 -1
  77. package/dist/types-ts4.5/ui/consts.d.ts +1 -0
  78. package/package.json +3 -2
  79. package/src/commands/misc.ts +17 -4
  80. package/src/commands/selection.ts +12 -4
  81. package/src/pm-plugins/drag-and-drop/actions.ts +1 -0
  82. package/src/pm-plugins/drag-and-drop/commands.ts +3 -0
  83. package/src/pm-plugins/drag-and-drop/plugin.ts +47 -0
  84. package/src/pm-plugins/drag-and-drop/reducer.ts +1 -0
  85. package/src/pm-plugins/drag-and-drop/types.ts +3 -0
  86. package/src/pm-plugins/table-selection-keymap.ts +2 -2
  87. package/src/ui/DragHandle/HandleIconComponent.tsx +2 -9
  88. package/src/ui/DragHandle/index.tsx +37 -16
  89. package/src/ui/FloatingDragMenu/DragMenu.tsx +362 -310
  90. package/src/ui/FloatingDragMenu/DropdownMenu.tsx +150 -0
  91. package/src/ui/FloatingDragMenu/index.tsx +3 -3
  92. package/src/ui/TableFloatingColumnControls/ColumnControls/index.tsx +72 -91
  93. package/src/ui/TableFloatingColumnControls/index.tsx +1 -2
  94. package/src/ui/TableFloatingControls/CornerControls/DragCornerControls.tsx +5 -0
  95. package/src/ui/TableFloatingControls/RowControls/DragControls.tsx +89 -104
  96. package/src/ui/common-styles.ts +11 -1
  97. package/src/ui/consts.ts +1 -0
  98. package/tsconfig.app.json +3 -0
@@ -21,6 +21,7 @@ import { token } from '@atlaskit/tokens';
21
21
 
22
22
  import { clearHoverSelection } from '../../../commands';
23
23
  import { toggleDragMenu } from '../../../pm-plugins/drag-and-drop/commands';
24
+ import type { TriggerType } from '../../../pm-plugins/drag-and-drop/types';
24
25
  import { getPluginState as getTablePluginState } from '../../../pm-plugins/plugin-factory';
25
26
  import { TableCssClassName as ClassName } from '../../../types';
26
27
  import type {
@@ -34,6 +35,7 @@ import {
34
35
  getSelectedRowIndexes,
35
36
  } from '../../../utils';
36
37
  import { dropTargetExtendedWidth } from '../../consts';
38
+ import type { DragHandleAppearance } from '../../DragHandle';
37
39
  import { DragHandle } from '../../DragHandle';
38
40
  import RowDropTarget from '../RowDropTarget';
39
41
 
@@ -45,8 +47,8 @@ type DragControlsProps = {
45
47
  tableActive?: boolean;
46
48
  hoveredCell?: CellHoverMeta;
47
49
  isInDanger?: boolean;
48
- isResizing?: boolean;
49
50
  isTableHovered?: boolean;
51
+ isResizing?: boolean;
50
52
  hoverRows: (rows: number[], danger?: boolean) => void;
51
53
  selectRow: (row: number, expand: boolean) => void;
52
54
  selectRows: (rowIndexes: number[]) => void;
@@ -111,16 +113,16 @@ const DragControlsComponent = ({
111
113
  });
112
114
  }, [editorView]);
113
115
 
114
- const onMouseUp = useCallback(
115
- (event) => {
116
- if (event.shiftKey) {
116
+ const toggleDragMenuHandler = useCallback(
117
+ (trigger: TriggerType, event) => {
118
+ if (event?.shiftKey) {
117
119
  return;
118
120
  }
119
-
120
121
  toggleDragMenu(
121
122
  undefined,
122
123
  'row',
123
124
  hoveredCell?.rowIndex,
125
+ trigger,
124
126
  )(editorView.state, editorView.dispatch);
125
127
  },
126
128
  [editorView, hoveredCell?.rowIndex],
@@ -186,53 +188,14 @@ const DragControlsComponent = ({
186
188
  [rowIndex, selectRow, selectRows, selectedRowIndexes],
187
189
  );
188
190
 
189
- const generateHandleByType = (type: HandleTypes): JSX.Element | null => {
190
- if (!hoveredCell) {
191
- return null;
192
- }
191
+ const generateHandleByType = (
192
+ type: HandleTypes,
193
+ appearance: DragHandleAppearance,
194
+ gridRow: string,
195
+ indexes: number[],
196
+ ) => {
193
197
  const isHover = type === 'hover';
194
198
 
195
- const isRowsSelected = selectedRowIndexes.length > 0;
196
-
197
- const showCondition = isHover
198
- ? isRowsSelected &&
199
- !selectedRowIndexes.includes(rowIndex!) &&
200
- Number.isFinite(hoveredCell?.colIndex)
201
- : selectedRowIndexes.length < rowHeights.length &&
202
- rowIndex! < rowHeights.length &&
203
- Number.isFinite(hoveredCell?.colIndex);
204
-
205
- if (!showCondition) {
206
- return null;
207
- }
208
-
209
- const gridRowPosition = `${rowIndex! + 1} / span 1`;
210
-
211
- // if more than one row is selected, ensure the handle spans over the selected range
212
- const selectedRowPosition = `${selectedRowIndexes[0] + 1} / span ${
213
- selectedRowIndexes.length
214
- }`;
215
-
216
- const hoveredAppearance = selectedRowIndexes.includes(rowIndex!)
217
- ? isInDanger
218
- ? 'danger'
219
- : 'selected'
220
- : 'default';
221
-
222
- const currentSelectionAppearance = isRowsSelected
223
- ? isInDanger
224
- ? 'danger'
225
- : 'selected'
226
- : hoveredAppearance;
227
-
228
- const isSelecting = isRowsSelected && !isHover;
229
-
230
- const indexes = isRowsSelected
231
- ? isHover
232
- ? rowIndexes
233
- : selectedRowIndexes
234
- : rowIndexes;
235
-
236
199
  const previewHeight = rowHeights.reduce(
237
200
  (sum, v, i) => sum + v * (indexes.includes(i) ? 1 : 0),
238
201
  0,
@@ -242,7 +205,7 @@ const DragControlsComponent = ({
242
205
  <div
243
206
  key={type}
244
207
  style={{
245
- gridRow: isSelecting ? selectedRowPosition : gridRowPosition,
208
+ gridRow,
246
209
  gridColumn: '2',
247
210
  // DragHandle uses `transform: rotate(90)`, which doesn't affect its parent (this div) causing the width of this element to be the true height of the drag handle
248
211
  display: 'flex',
@@ -252,7 +215,7 @@ const DragControlsComponent = ({
252
215
  right: '-0.5px',
253
216
  }}
254
217
  data-testid={`table-floating-row-${
255
- isSelecting ? selectedRowIndexes[0] : rowIndex
218
+ isHover ? rowIndex : selectedRowIndexes[0]
256
219
  }-drag-handle`}
257
220
  >
258
221
  <DragHandle
@@ -260,41 +223,68 @@ const DragControlsComponent = ({
260
223
  direction="row"
261
224
  tableLocalId={currentNodeLocalId}
262
225
  indexes={indexes}
263
- forceDefaultHandle={isHover ? false : isRowsSelected}
226
+ forceDefaultHandle={!isHover}
264
227
  previewWidth={tableWidth}
265
228
  previewHeight={previewHeight}
266
- appearance={
267
- isSelecting ? currentSelectionAppearance : hoveredAppearance
268
- }
229
+ appearance={appearance}
269
230
  onClick={handleClick}
270
231
  onMouseOver={handleMouseOver}
271
232
  onMouseOut={handleMouseOut}
272
- onMouseUp={onMouseUp}
233
+ toggleDragMenu={toggleDragMenuHandler}
273
234
  editorView={editorView}
274
235
  />
275
236
  </div>
276
237
  );
277
238
  };
278
239
 
279
- const rowHandles = (hoveredCell: CellHoverMeta | undefined) => {
280
- if (!hoveredCell) {
240
+ const rowHandles = () => {
241
+ const handles = [];
242
+ const isRowSelected = selectedRowIndexes.length > 0;
243
+ const isEntireTableSelected = rowHeights.length > selectedRowIndexes.length;
244
+
245
+ if (!tableActive) {
281
246
  return null;
282
247
  }
283
248
 
284
- if (hoveredCell.rowIndex === undefined) {
285
- return generateHandleByType('selected');
286
- }
249
+ // placeholder / selected need to always render at least one handle
250
+ // so it can be focused via keyboard shortcuts
251
+ handles.push(
252
+ generateHandleByType(
253
+ 'selected',
254
+ isRowSelected && isEntireTableSelected
255
+ ? isInDanger
256
+ ? 'danger'
257
+ : 'selected'
258
+ : 'placeholder',
259
+ `${selectedRowIndexes[0] + 1} / span ${selectedRowIndexes.length}`,
260
+ selectedRowIndexes,
261
+ ),
262
+ );
287
263
 
288
- const sortedHandles = [
289
- generateHandleByType('hover'),
290
- generateHandleByType('selected'),
291
- ];
264
+ if (
265
+ hoveredCell &&
266
+ isTableHovered &&
267
+ rowIndex !== undefined &&
268
+ !selectedRowIndexes.includes(rowIndex) &&
269
+ rowIndex < rowHeights.length
270
+ ) {
271
+ handles.push(
272
+ generateHandleByType(
273
+ 'hover',
274
+ 'default',
275
+ `${rowIndex + 1} / span 1`,
276
+ rowIndexes,
277
+ ),
278
+ );
279
+ }
292
280
 
293
- return hoveredCell.rowIndex < selectedRowIndexes[0]
294
- ? sortedHandles
295
- : sortedHandles.reverse();
281
+ return handles;
296
282
  };
297
283
 
284
+ if (isResizing) {
285
+ return null;
286
+ }
287
+
298
288
  return (
299
289
  <div
300
290
  className={ClassName.DRAG_ROW_CONTROLS}
@@ -308,44 +298,39 @@ const DragControlsComponent = ({
308
298
  onMouseMove={handleMouseMove}
309
299
  contentEditable={false}
310
300
  >
311
- {!isResizing &&
312
- rowsParams.map(({ startIndex, endIndex }, index) => (
313
- <Fragment key={index}>
314
- <div
301
+ {rowsParams.map(({ startIndex, endIndex }, index) => (
302
+ <Fragment key={index}>
303
+ <div
304
+ style={{
305
+ gridRow: `${index + 1} / span 1`,
306
+ gridColumn: '2',
307
+ }}
308
+ data-start-index={startIndex}
309
+ data-end-index={endIndex}
310
+ className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT_WRAPPER}
311
+ contentEditable={false}
312
+ key={`insert-dot-${index}`}
313
+ >
314
+ <div className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT} />
315
+ </div>
316
+ {isDragging && (
317
+ <RowDropTarget
318
+ key={`drop-target-${index}`}
319
+ index={index}
320
+ localId={currentNodeLocalId}
315
321
  style={{
322
+ gridColumn: '1 / span 3',
316
323
  gridRow: `${index + 1} / span 1`,
317
- gridColumn: '2',
324
+ height: '100%',
325
+ pointerEvents: 'auto',
326
+ position: 'relative',
327
+ left: token('space.negative.100', '-8px'),
318
328
  }}
319
- data-start-index={startIndex}
320
- data-end-index={endIndex}
321
- className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT_WRAPPER}
322
- contentEditable={false}
323
- key={`insert-dot-${index}`}
324
- >
325
- <div className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT} />
326
- </div>
327
- {isDragging && (
328
- <RowDropTarget
329
- key={`drop-target-${index}`}
330
- index={index}
331
- localId={currentNodeLocalId}
332
- style={{
333
- gridColumn: '1 / span 3',
334
- gridRow: `${index + 1} / span 1`,
335
- height: '100%',
336
- pointerEvents: 'auto',
337
- position: 'relative',
338
- left: token('space.negative.100', '-8px'),
339
- }}
340
- />
341
- )}
342
- </Fragment>
343
- ))}
344
- {tableActive &&
345
- isTableHovered &&
346
- !isResizing &&
347
- Number.isFinite(rowIndex) &&
348
- rowHandles(hoveredCell)}
329
+ />
330
+ )}
331
+ </Fragment>
332
+ ))}
333
+ {rowHandles()}
349
334
  </div>
350
335
  );
351
336
  };
@@ -782,8 +782,13 @@ export const tableStyles = (props: { featureFlags?: FeatureFlags }) => css`
782
782
  display: flex;
783
783
  justify-content: center;
784
784
  align-items: center;
785
- outline: none !important;
786
785
  background: transparent;
786
+ outline: none;
787
+
788
+ &.placeholder {
789
+ background-color: transparent;
790
+ border: 2px solid transparent;
791
+ }
787
792
 
788
793
  &.${ClassName.DRAG_HANDLE_DISABLED} {
789
794
  & svg {
@@ -821,6 +826,11 @@ export const tableStyles = (props: { featureFlags?: FeatureFlags }) => css`
821
826
  }
822
827
 
823
828
  &.selected {
829
+ :focus {
830
+ outline: 2px solid ${token('color.border.focused', '#2684FF')};
831
+ outline-offset: 1px;
832
+ }
833
+
824
834
  svg {
825
835
  rect {
826
836
  fill: ${token('color.background.accent.blue.subtle', '#579dff')};
package/src/ui/consts.ts CHANGED
@@ -141,3 +141,4 @@ export const TABLE_GUIDELINE_VISIBLE_ADJUSTMENT = -68;
141
141
  export const dragMenuDropdownWidth = 250;
142
142
  export const dragTableInsertColumnButtonSize = 16;
143
143
  export const dropTargetExtendedWidth = 150;
144
+ export const colorPalletteColumns = 7;
package/tsconfig.app.json CHANGED
@@ -66,6 +66,9 @@
66
66
  {
67
67
  "path": "../../design-system/icon/tsconfig.app.json"
68
68
  },
69
+ {
70
+ "path": "../../design-system/menu/tsconfig.app.json"
71
+ },
69
72
  {
70
73
  "path": "../../platform/feature-flags/tsconfig.app.json"
71
74
  },