@atlaskit/editor-plugin-table 7.2.2 → 7.3.0

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 (149) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/commands/column-resize.js +115 -45
  3. package/dist/cjs/commands/go-to-next-cell.js +7 -11
  4. package/dist/cjs/commands/misc.js +3 -2
  5. package/dist/cjs/commands/selection.js +3 -3
  6. package/dist/cjs/event-handlers.js +38 -25
  7. package/dist/cjs/pm-plugins/drag-and-drop/commands-with-analytics.js +3 -19
  8. package/dist/cjs/pm-plugins/keymap.js +1 -0
  9. package/dist/cjs/pm-plugins/main.js +43 -9
  10. package/dist/cjs/pm-plugins/table-resizing/event-handlers.js +37 -7
  11. package/dist/cjs/pm-plugins/table-resizing/plugin.js +20 -6
  12. package/dist/cjs/reducer.js +5 -2
  13. package/dist/cjs/utils/drag-menu.js +37 -23
  14. package/dist/cjs/utils/merged-cells.js +66 -1
  15. package/dist/es2019/commands/column-resize.js +100 -35
  16. package/dist/es2019/commands/go-to-next-cell.js +7 -9
  17. package/dist/es2019/commands/misc.js +3 -2
  18. package/dist/es2019/commands/selection.js +5 -5
  19. package/dist/es2019/event-handlers.js +17 -3
  20. package/dist/es2019/pm-plugins/drag-and-drop/commands-with-analytics.js +4 -20
  21. package/dist/es2019/pm-plugins/keymap.js +3 -2
  22. package/dist/es2019/pm-plugins/main.js +41 -5
  23. package/dist/es2019/pm-plugins/table-resizing/event-handlers.js +37 -4
  24. package/dist/es2019/pm-plugins/table-resizing/plugin.js +16 -1
  25. package/dist/es2019/reducer.js +5 -2
  26. package/dist/es2019/utils/drag-menu.js +38 -14
  27. package/dist/es2019/utils/merged-cells.js +73 -0
  28. package/dist/esm/commands/column-resize.js +105 -35
  29. package/dist/esm/commands/go-to-next-cell.js +7 -11
  30. package/dist/esm/commands/misc.js +3 -2
  31. package/dist/esm/commands/selection.js +5 -5
  32. package/dist/esm/event-handlers.js +38 -25
  33. package/dist/esm/pm-plugins/drag-and-drop/commands-with-analytics.js +4 -20
  34. package/dist/esm/pm-plugins/keymap.js +3 -2
  35. package/dist/esm/pm-plugins/main.js +38 -4
  36. package/dist/esm/pm-plugins/table-resizing/event-handlers.js +34 -4
  37. package/dist/esm/pm-plugins/table-resizing/plugin.js +15 -1
  38. package/dist/esm/reducer.js +5 -2
  39. package/dist/esm/utils/drag-menu.js +36 -22
  40. package/dist/esm/utils/merged-cells.js +65 -0
  41. package/dist/types/commands/column-resize.d.ts +2 -0
  42. package/dist/types/commands/misc.d.ts +1 -1
  43. package/dist/types/types.d.ts +16 -0
  44. package/dist/types/utils/drag-menu.d.ts +4 -1
  45. package/dist/types/utils/merged-cells.d.ts +2 -0
  46. package/dist/types-ts4.5/commands/column-resize.d.ts +2 -0
  47. package/dist/types-ts4.5/commands/misc.d.ts +1 -1
  48. package/dist/types-ts4.5/types.d.ts +16 -0
  49. package/dist/types-ts4.5/utils/drag-menu.d.ts +4 -1
  50. package/dist/types-ts4.5/utils/merged-cells.d.ts +2 -0
  51. package/package.json +10 -17
  52. package/src/commands/column-resize.ts +155 -40
  53. package/src/commands/go-to-next-cell.ts +6 -15
  54. package/src/commands/misc.ts +2 -0
  55. package/src/commands/selection.ts +5 -5
  56. package/src/event-handlers.ts +21 -4
  57. package/src/pm-plugins/drag-and-drop/commands-with-analytics.ts +11 -32
  58. package/src/pm-plugins/keymap.ts +3 -0
  59. package/src/pm-plugins/main.ts +47 -2
  60. package/src/pm-plugins/table-resizing/event-handlers.ts +33 -5
  61. package/src/pm-plugins/table-resizing/plugin.ts +18 -1
  62. package/src/reducer.ts +5 -2
  63. package/src/types.ts +16 -0
  64. package/src/utils/drag-menu.ts +94 -20
  65. package/src/utils/merged-cells.ts +78 -0
  66. package/tsconfig.dev.json +0 -69
  67. package/tsconfig.json +2 -877
  68. package/examples/99-testing.tsx +0 -140
  69. package/examples/config.jsonc +0 -14
  70. package/src/__tests__/unit/analytics.ts +0 -888
  71. package/src/__tests__/unit/collab.ts +0 -93
  72. package/src/__tests__/unit/commands/go-to-next-cell.ts +0 -173
  73. package/src/__tests__/unit/commands/insert.ts +0 -137
  74. package/src/__tests__/unit/commands/misc.ts +0 -185
  75. package/src/__tests__/unit/commands/sort.ts +0 -128
  76. package/src/__tests__/unit/commands.ts +0 -745
  77. package/src/__tests__/unit/copy-button.ts +0 -22
  78. package/src/__tests__/unit/copy-paste.ts +0 -677
  79. package/src/__tests__/unit/event-handlers/index.ts +0 -125
  80. package/src/__tests__/unit/event-handlers.ts +0 -296
  81. package/src/__tests__/unit/fix-tables.ts +0 -164
  82. package/src/__tests__/unit/get-toolbar-config.ts +0 -127
  83. package/src/__tests__/unit/handlers.ts +0 -98
  84. package/src/__tests__/unit/hover-selection.ts +0 -230
  85. package/src/__tests__/unit/index-with-fake-timers.ts +0 -111
  86. package/src/__tests__/unit/index.ts +0 -912
  87. package/src/__tests__/unit/layout.ts +0 -146
  88. package/src/__tests__/unit/nodeviews/OverflowShadowsObserver.ts +0 -162
  89. package/src/__tests__/unit/nodeviews/TableComponent.tsx +0 -280
  90. package/src/__tests__/unit/nodeviews/TableContainer.tsx +0 -525
  91. package/src/__tests__/unit/nodeviews/cell.ts +0 -132
  92. package/src/__tests__/unit/nodeviews/table.ts +0 -129
  93. package/src/__tests__/unit/pm-plugins/analytics.ts +0 -327
  94. package/src/__tests__/unit/pm-plugins/decorations/column-controls.ts +0 -94
  95. package/src/__tests__/unit/pm-plugins/decorations/column-resizing.ts +0 -176
  96. package/src/__tests__/unit/pm-plugins/decorations/plugin.ts +0 -211
  97. package/src/__tests__/unit/pm-plugins/main.ts +0 -214
  98. package/src/__tests__/unit/pm-plugins/safari-delete-composition-text-issue-workaround.ts +0 -101
  99. package/src/__tests__/unit/pm-plugins/sticky-headers/tableRow.tsx +0 -562
  100. package/src/__tests__/unit/pm-plugins/table-local-id.ts +0 -507
  101. package/src/__tests__/unit/pm-plugins/table-resizing/colgroup.ts +0 -269
  102. package/src/__tests__/unit/pm-plugins/table-resizing/event-handlers.ts +0 -192
  103. package/src/__tests__/unit/pm-plugins/table-resizing/utils/resize-state.ts +0 -33
  104. package/src/__tests__/unit/pm-plugins/table-width.ts +0 -292
  105. package/src/__tests__/unit/sort-column.ts +0 -399
  106. package/src/__tests__/unit/toolbar.ts +0 -512
  107. package/src/__tests__/unit/transforms/delete-columns.ts +0 -597
  108. package/src/__tests__/unit/transforms/delete-rows.ts +0 -620
  109. package/src/__tests__/unit/transforms/merging.ts +0 -392
  110. package/src/__tests__/unit/ui/ContextualMenu.tsx +0 -71
  111. package/src/__tests__/unit/ui/CornerControls.tsx +0 -99
  112. package/src/__tests__/unit/ui/DeleteButton.tsx +0 -38
  113. package/src/__tests__/unit/ui/FixedButton.tsx +0 -217
  114. package/src/__tests__/unit/ui/FloatingContextualButton.tsx +0 -123
  115. package/src/__tests__/unit/ui/FloatingContextualMenu.tsx +0 -68
  116. package/src/__tests__/unit/ui/FloatingDeleteButton.tsx +0 -178
  117. package/src/__tests__/unit/ui/FloatingDragMenu.tsx +0 -511
  118. package/src/__tests__/unit/ui/FloatingInsertButton.tsx +0 -322
  119. package/src/__tests__/unit/ui/NumberColumn.tsx +0 -146
  120. package/src/__tests__/unit/ui/RowControls.tsx +0 -294
  121. package/src/__tests__/unit/ui/RowDragControls.tsx +0 -129
  122. package/src/__tests__/unit/ui/TableFloatingColumnControls.tsx +0 -189
  123. package/src/__tests__/unit/ui/TableFloatingControls.tsx +0 -118
  124. package/src/__tests__/unit/undo-redo.ts +0 -220
  125. package/src/__tests__/unit/utils/analytics.ts +0 -98
  126. package/src/__tests__/unit/utils/collapse.ts +0 -57
  127. package/src/__tests__/unit/utils/column-controls.ts +0 -205
  128. package/src/__tests__/unit/utils/dom.ts +0 -180
  129. package/src/__tests__/unit/utils/merged-cells.ts +0 -156
  130. package/src/__tests__/unit/utils/nodes.ts +0 -79
  131. package/src/__tests__/unit/utils/row-controls.ts +0 -195
  132. package/src/__tests__/unit/utils/table.ts +0 -96
  133. package/src/__tests__/unit/utils.ts +0 -670
  134. package/src/__tests__/visual-regression/__fixtures__/sticky-header-with-horizontal-scroll.json +0 -5228
  135. package/src/__tests__/visual-regression/__fixtures__/table-with-100-numbered-list-items.json +0 -20272
  136. package/src/__tests__/visual-regression/__image_snapshots__/cell-options-menu-ts-table-cell-options-menu-delete-column-menu-item-should-remove-the-table-column-on-click-1-snap.png +0 -3
  137. package/src/__tests__/visual-regression/__image_snapshots__/cell-options-menu-ts-table-cell-options-menu-delete-column-menu-item-visual-hints-should-be-added-to-the-table-column-on-hover-1-snap.png +0 -3
  138. package/src/__tests__/visual-regression/__image_snapshots__/cell-options-menu-ts-table-cell-options-menu-delete-row-menu-item-should-remove-the-table-row-on-click-1-snap.png +0 -3
  139. package/src/__tests__/visual-regression/__image_snapshots__/cell-options-menu-ts-table-cell-options-menu-delete-row-menu-item-visual-hints-should-be-added-to-the-table-row-on-hover-1-snap.png +0 -3
  140. package/src/__tests__/visual-regression/__image_snapshots__/copy-button-ts-floating-toolbar-copy-button-table-target-node-displays-blue-border-when-copy-button-is-hovered-1-snap.png +0 -3
  141. package/src/__tests__/visual-regression/__image_snapshots__/index-ts-snapshot-test-table-numbered-list-should-not-overflow-table-cell-when-there-are-more-than-100-ordered-list-items-1-snap.png +0 -3
  142. package/src/__tests__/visual-regression/__image_snapshots__/index-ts-snapshot-test-table-numbered-list-should-not-overflow-table-cell-when-there-are-more-than-100-ordered-list-items-2-snap.png +0 -3
  143. package/src/__tests__/visual-regression/__image_snapshots__/index-ts-snapshot-test-table-numbered-list-should-not-overflow-table-cell-when-there-are-more-than-100-ordered-list-items-3-snap.png +0 -3
  144. package/src/__tests__/visual-regression/__image_snapshots__/sticky-header-ts-snapshot-test-table-sticky-header-should-align-with-table-cell-when-active-1-snap.png +0 -3
  145. package/src/__tests__/visual-regression/__image_snapshots__/sticky-header-ts-snapshot-test-table-sticky-header-should-align-with-table-cell-when-active-2-snap.png +0 -3
  146. package/src/__tests__/visual-regression/cell-options-menu.ts +0 -101
  147. package/src/__tests__/visual-regression/copy-button.ts +0 -181
  148. package/src/__tests__/visual-regression/index.ts +0 -62
  149. package/src/__tests__/visual-regression/sticky-header.ts +0 -61
@@ -12,7 +12,11 @@ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
12
12
  var _transforms = require("@atlaskit/editor-common/transforms");
13
13
  var _utils = require("@atlaskit/editor-common/utils");
14
14
  var _utils2 = require("@atlaskit/editor-prosemirror/utils");
15
+ var _editorTables = require("@atlaskit/editor-tables");
16
+ var _utils3 = require("@atlaskit/editor-tables/utils");
17
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
15
18
  var _commands = require("../commands");
19
+ var _columnResize = require("../commands/column-resize");
16
20
  var _misc = require("../commands/misc");
17
21
  var _eventHandlers = require("../event-handlers");
18
22
  var _table = require("../nodeviews/table");
@@ -21,7 +25,7 @@ var _TableRow = _interopRequireDefault(require("../nodeviews/TableRow"));
21
25
  var _plugin = require("../pm-plugins/decorations/plugin");
22
26
  var _transforms2 = require("../transforms");
23
27
  var _types = require("../types");
24
- var _utils3 = require("../utils");
28
+ var _utils4 = require("../utils");
25
29
  var _paste = require("../utils/paste");
26
30
  var _defaultTableSelection = require("./default-table-selection");
27
31
  var _pluginFactory = require("./plugin-factory");
@@ -106,7 +110,7 @@ var createPlugin = exports.createPlugin = function createPlugin(dispatchAnalytic
106
110
  var domAtPos = editorView.domAtPos.bind(editorView);
107
111
  editorViewRef = editorView;
108
112
  return {
109
- update: function update(view) {
113
+ update: function update(view, prevState) {
110
114
  var state = view.state,
111
115
  dispatch = view.dispatch;
112
116
  var selection = state.selection;
@@ -117,6 +121,28 @@ var createPlugin = exports.createPlugin = function createPlugin(dispatchAnalytic
117
121
  if (parent) {
118
122
  tableRef = parent.querySelector('table') || undefined;
119
123
  }
124
+ var tableNode = (0, _utils3.findTable)(state.selection);
125
+ if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.a11y-column-resizing_emcvz')) {
126
+ // when cursor leaves the table we need to stop column resizing
127
+ var pluginPrevState = (0, _pluginFactory.getPluginState)(prevState);
128
+ var isStopKeyboardColumResizing = pluginPrevState.isResizeHandleWidgetAdded && pluginPrevState.isKeyboardResize;
129
+ if (isStopKeyboardColumResizing) {
130
+ var isTableNodesDifferent = (pluginPrevState === null || pluginPrevState === void 0 ? void 0 : pluginPrevState.tableNode) !== (tableNode === null || tableNode === void 0 ? void 0 : tableNode.node);
131
+ if (pluginPrevState !== null && pluginPrevState !== void 0 && pluginPrevState.tableNode && tableNode && isTableNodesDifferent) {
132
+ var oldRowsNumber = _editorTables.TableMap.get(pluginPrevState.tableNode).height;
133
+ var newRowsNumber = _editorTables.TableMap.get(tableNode.node).height;
134
+ if (oldRowsNumber !== newRowsNumber ||
135
+ // Add/delete row
136
+ tableNode.node.attrs.localId !== pluginPrevState.tableNode.attrs.localId) {
137
+ // Jump to another table
138
+ (0, _columnResize.stopKeyboardColumnResizing)()(state, dispatch);
139
+ }
140
+ } else if (!tableNode) {
141
+ // selection outside of table
142
+ (0, _columnResize.stopKeyboardColumnResizing)()(state, dispatch);
143
+ }
144
+ }
145
+ }
120
146
  }
121
147
  if (pluginState.tableRef !== tableRef) {
122
148
  (0, _commands.setTableRef)(tableRef)(state, dispatch);
@@ -156,7 +182,7 @@ var createPlugin = exports.createPlugin = function createPlugin(dispatchAnalytic
156
182
  if (!(0, _coreUtils.insideTable)(editorState) && (0, _paste.isHeaderRowRequired)(editorState)) {
157
183
  slice = (0, _misc.transformSliceToAddTableHeaders)(slice, schema);
158
184
  }
159
- slice = (0, _utils3.transformSliceToFixHardBreakProblemOnCopyFromCell)(slice, schema);
185
+ slice = (0, _utils4.transformSliceToFixHardBreakProblemOnCopyFromCell)(slice, schema);
160
186
 
161
187
  // We do this separately, so it also applies to drag/drop events
162
188
  // This needs to go before `transformSliceToRemoveOpenExpand`
@@ -167,14 +193,14 @@ var createPlugin = exports.createPlugin = function createPlugin(dispatchAnalytic
167
193
  slice = (0, _transforms.transformSliceToRemoveOpenExpand)(slice, schema);
168
194
 
169
195
  /** If a partial paste of table, paste only table's content */
170
- slice = (0, _utils3.transformSliceToRemoveOpenTable)(slice, schema);
196
+ slice = (0, _utils4.transformSliceToRemoveOpenTable)(slice, schema);
171
197
 
172
198
  /** If a partial paste of bodied extension, paste only text */
173
199
  slice = (0, _transforms.transformSliceToRemoveOpenBodiedExtension)(slice, schema);
174
200
 
175
201
  /** If a partial paste of multi bodied extension, paste only children */
176
202
  slice = (0, _transforms.transformSliceToRemoveOpenMultiBodiedExtension)(slice, schema);
177
- slice = (0, _utils3.transformSliceToCorrectEmptyTableCells)(slice, schema);
203
+ slice = (0, _utils4.transformSliceToCorrectEmptyTableCells)(slice, schema);
178
204
  if (!pluginConfig.allowColumnResizing) {
179
205
  slice = (0, _misc.transformSliceToRemoveColumnsWidths)(slice, schema);
180
206
  }
@@ -190,7 +216,7 @@ var createPlugin = exports.createPlugin = function createPlugin(dispatchAnalytic
190
216
  var state = _ref2.state,
191
217
  dispatch = _ref2.dispatch;
192
218
  var decorationSet = _plugin.pluginKey.getState(state);
193
- if ((0, _utils3.findControlsHoverDecoration)(decorationSet).length) {
219
+ if ((0, _utils4.findControlsHoverDecoration)(decorationSet).length) {
194
220
  (0, _commands.clearHoverSelection)()(state, dispatch);
195
221
  }
196
222
 
@@ -213,9 +239,17 @@ var createPlugin = exports.createPlugin = function createPlugin(dispatchAnalytic
213
239
  var maybeTr = (0, _utils.closestElement)(domRef, 'tr');
214
240
  return maybeTr ? maybeTr.classList.contains('sticky') : false;
215
241
  },
216
- handleTextInput: function handleTextInput(_ref3, _from, _to, text) {
217
- var state = _ref3.state,
218
- dispatch = _ref3.dispatch;
242
+ handleTextInput: function handleTextInput(view, _from, _to, text) {
243
+ var state = view.state,
244
+ dispatch = view.dispatch;
245
+ if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.a11y-column-resizing_emcvz')) {
246
+ var _getPluginState = (0, _pluginFactory.getPluginState)(state),
247
+ isKeyboardResize = _getPluginState.isKeyboardResize;
248
+ if (isKeyboardResize) {
249
+ (0, _columnResize.stopKeyboardColumnResizing)()(state, dispatch);
250
+ return false;
251
+ }
252
+ }
219
253
  var tr = (0, _transforms2.replaceSelectedTable)(state, text, _analytics.INPUT_METHOD.KEYBOARD, editorAnalyticsAPI);
220
254
  if (tr.selectionSet) {
221
255
  dispatch(tr);
@@ -11,12 +11,14 @@ var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
11
11
  var _tableMap = require("@atlaskit/editor-tables/table-map");
12
12
  var _utils = require("@atlaskit/editor-tables/utils");
13
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
+ var _columnResize = require("../../commands/column-resize");
14
15
  var _misc = require("../../commands/misc");
15
16
  var _transforms = require("../../transforms");
16
17
  var _utils2 = require("../../utils");
18
+ var _pluginFactory = require("../plugin-factory");
17
19
  var _tableAnalytics = require("../table-analytics");
18
20
  var _commands = require("./commands");
19
- var _pluginFactory = require("./plugin-factory");
21
+ var _pluginFactory2 = require("./plugin-factory");
20
22
  var _utils3 = require("./utils");
21
23
  var handleMouseDown = exports.handleMouseDown = function handleMouseDown(view, event, localResizeHandlePos, getEditorContainerWidth, getEditorFeatureFlags, editorAnalyticsAPI) {
22
24
  var state = view.state,
@@ -26,6 +28,8 @@ var handleMouseDown = exports.handleMouseDown = function handleMouseDown(view, e
26
28
  if (editorDisabled || localResizeHandlePos === null || !(0, _utils3.pointsAtCell)(state.doc.resolve(localResizeHandlePos))) {
27
29
  return false;
28
30
  }
31
+ var _getTablePluginState = (0, _pluginFactory.getPluginState)(state),
32
+ isKeyboardResize = _getTablePluginState.isKeyboardResize;
29
33
  event.preventDefault();
30
34
  var tr = view.state.tr;
31
35
  tr.setMeta(_tableAnalytics.META_KEYS.OVERFLOW_TRIGGER, {
@@ -92,9 +96,11 @@ var handleMouseDown = exports.handleMouseDown = function handleMouseDown(view, e
92
96
  var clientX = event.clientX;
93
97
  var state = view.state,
94
98
  dispatch = view.dispatch;
95
- var _getPluginState = (0, _pluginFactory.getPluginState)(state),
99
+ var _getPluginState = (0, _pluginFactory2.getPluginState)(state),
96
100
  dragging = _getPluginState.dragging,
97
101
  resizeHandlePos = _getPluginState.resizeHandlePos;
102
+ var _getTablePluginState2 = (0, _pluginFactory.getPluginState)(state),
103
+ isTableHovered = _getTablePluginState2.isTableHovered;
98
104
  if (resizeHandlePos === null) {
99
105
  return (0, _commands.stopResizing)()(state, dispatch);
100
106
  }
@@ -107,9 +113,20 @@ var handleMouseDown = exports.handleMouseDown = function handleMouseDown(view, e
107
113
  var start = $cell.start(-1);
108
114
  var table = $cell.node(-1);
109
115
 
110
- // If we let go in the same place we started, dont need to do anything.
116
+ // If we let go in the same place we started, don't need to do anything.
111
117
  if (dragging && clientX === dragging.startX) {
112
- return (0, _commands.stopResizing)()(state, dispatch);
118
+ if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.a11y-column-resizing_emcvz')) {
119
+ if (isKeyboardResize || !isTableHovered) {
120
+ /** if column resize had started via keyboard but continued by mouse
121
+ * or mouse pointer leaves the table but mouse button still pressed
122
+ */
123
+ return (0, _columnResize.stopKeyboardColumnResizing)()(state, dispatch, view);
124
+ } else {
125
+ return (0, _commands.stopResizing)()(state, dispatch);
126
+ }
127
+ } else {
128
+ return (0, _commands.stopResizing)()(state, dispatch);
129
+ }
113
130
  }
114
131
  var tr = state.tr;
115
132
  if (dragging) {
@@ -143,17 +160,30 @@ var handleMouseDown = exports.handleMouseDown = function handleMouseDown(view, e
143
160
  })(tr);
144
161
  }
145
162
  }
146
- return (0, _commands.stopResizing)(tr)(state, dispatch);
163
+ if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.a11y-column-resizing_emcvz')) {
164
+ if (isKeyboardResize || !isTableHovered) {
165
+ /** if column resize had started via keyboard but continued by mouse
166
+ * or mouse pointer leaves the table but mouse button still pressed
167
+ */
168
+ return (0, _columnResize.stopKeyboardColumnResizing)(tr)(state, dispatch, view);
169
+ } else {
170
+ return (0, _commands.stopResizing)(tr)(state, dispatch);
171
+ }
172
+ } else {
173
+ return (0, _commands.stopResizing)(tr)(state, dispatch);
174
+ }
147
175
  }
148
176
  }
149
177
  function move(event) {
150
178
  var clientX = event.clientX,
151
179
  which = event.which;
152
180
  var state = view.state;
153
- var _getPluginState2 = (0, _pluginFactory.getPluginState)(state),
181
+ var _getPluginState2 = (0, _pluginFactory2.getPluginState)(state),
154
182
  dragging = _getPluginState2.dragging,
155
183
  resizeHandlePos = _getPluginState2.resizeHandlePos;
156
- if (!which || !dragging || resizeHandlePos === null || !(0, _utils3.pointsAtCell)(state.doc.resolve(resizeHandlePos))) {
184
+ var _getTablePluginState3 = (0, _pluginFactory.getPluginState)(state),
185
+ isTableHovered = _getTablePluginState3.isTableHovered;
186
+ if (!which || !dragging || resizeHandlePos === null || !(0, _utils3.pointsAtCell)(state.doc.resolve(resizeHandlePos)) || !isTableHovered && (0, _platformFeatureFlags.getBooleanFF)('platform.editor.a11y-column-resizing_emcvz')) {
157
187
  return finish(event);
158
188
  }
159
189
  var $cell = state.doc.resolve(resizeHandlePos);
@@ -8,10 +8,12 @@ exports.createPlugin = createPlugin;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _classnames2 = _interopRequireDefault(require("classnames"));
10
10
  var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
11
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
12
  var _types = require("../../types");
13
+ var _pluginFactory = require("../plugin-factory");
12
14
  var _commands = require("./commands");
13
15
  var _eventHandlers = require("./event-handlers");
14
- var _pluginFactory = require("./plugin-factory");
16
+ var _pluginFactory2 = require("./plugin-factory");
15
17
  var _pluginKey = require("./plugin-key");
16
18
  var _utils = require("./utils");
17
19
  function createPlugin(dispatch, _ref, getEditorContainerWidth, getEditorFeatureFlags, editorAnalyticsAPI) {
@@ -19,7 +21,7 @@ function createPlugin(dispatch, _ref, getEditorContainerWidth, getEditorFeatureF
19
21
  lastColumnResizable = _ref$lastColumnResiza === void 0 ? true : _ref$lastColumnResiza;
20
22
  return new _safePlugin.SafePlugin({
21
23
  key: _pluginKey.pluginKey,
22
- state: (0, _pluginFactory.createPluginState)(dispatch, {
24
+ state: (0, _pluginFactory2.createPluginState)(dispatch, {
23
25
  lastColumnResizable: lastColumnResizable,
24
26
  resizeHandlePos: null,
25
27
  dragging: null,
@@ -28,7 +30,7 @@ function createPlugin(dispatch, _ref, getEditorContainerWidth, getEditorFeatureF
28
30
  props: {
29
31
  attributes: function attributes(state) {
30
32
  var _classnames;
31
- var pluginState = (0, _pluginFactory.getPluginState)(state);
33
+ var pluginState = (0, _pluginFactory2.getPluginState)(state);
32
34
  return {
33
35
  class: (0, _classnames2.default)(_types.TableCssClassName.RESIZING_PLUGIN, (_classnames = {}, (0, _defineProperty2.default)(_classnames, _types.TableCssClassName.RESIZE_CURSOR, pluginState.resizeHandlePos !== null), (0, _defineProperty2.default)(_classnames, _types.TableCssClassName.IS_RESIZING, !!pluginState.dragging), _classnames))
34
36
  };
@@ -38,10 +40,22 @@ function createPlugin(dispatch, _ref, getEditorContainerWidth, getEditorFeatureF
38
40
  var state = view.state;
39
41
  var resizeHandlePos =
40
42
  // we're setting `resizeHandlePos` via command in unit tests
41
- (0, _pluginFactory.getPluginState)(state).resizeHandlePos || (0, _utils.getResizeCellPos)(view, event);
42
- var _getPluginState = (0, _pluginFactory.getPluginState)(state),
43
+ (0, _pluginFactory2.getPluginState)(state).resizeHandlePos || (0, _utils.getResizeCellPos)(view, event);
44
+ var _getPluginState = (0, _pluginFactory2.getPluginState)(state),
43
45
  dragging = _getPluginState.dragging;
44
- if (resizeHandlePos !== null && !dragging) {
46
+ var isColumnKeyboardResizeStarted = false;
47
+ if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.a11y-column-resizing_emcvz')) {
48
+ /*
49
+ We need to start listening mouse events if column resize started from keyboard.
50
+ This will allow continue resizing via mouse
51
+ */
52
+ var _getTablePluginState = (0, _pluginFactory.getPluginState)(state),
53
+ isKeyboardResize = _getTablePluginState.isKeyboardResize;
54
+ if (isKeyboardResize) {
55
+ isColumnKeyboardResizeStarted = isKeyboardResize;
56
+ }
57
+ }
58
+ if (resizeHandlePos !== null && (!dragging || isColumnKeyboardResizeStarted)) {
45
59
  if ((0, _eventHandlers.handleMouseDown)(view, event, resizeHandlePos, getEditorContainerWidth, getEditorFeatureFlags, editorAnalyticsAPI)) {
46
60
  var _state = view.state,
47
61
  _dispatch = view.dispatch;
@@ -64,8 +64,9 @@ var _default = exports.default = function _default(pluginState, action) {
64
64
  resizeHandleColumnIndex: undefined,
65
65
  resizeHandleRowIndex: undefined
66
66
  });
67
+ case 'START_KEYBOARD_COLUMN_RESIZE':
67
68
  case 'ADD_RESIZE_HANDLE_DECORATIONS':
68
- if (action.data.resizeHandleColumnIndex === pluginState.resizeHandleColumnIndex && action.data.resizeHandleRowIndex === pluginState.resizeHandleRowIndex && action.data.resizeHandleIncludeTooltip === pluginState.resizeHandleIncludeTooltip) {
69
+ if (action.data.resizeHandleColumnIndex === pluginState.resizeHandleColumnIndex && action.data.resizeHandleRowIndex === pluginState.resizeHandleRowIndex && action.data.resizeHandleIncludeTooltip === pluginState.resizeHandleIncludeTooltip && action.data.isKeyboardResize === pluginState.isKeyboardResize) {
69
70
  return pluginState;
70
71
  }
71
72
  return _objectSpread(_objectSpread(_objectSpread({}, pluginState), action.data), {}, {
@@ -84,6 +85,7 @@ var _default = exports.default = function _default(pluginState, action) {
84
85
  resizeHandleRowIndex: resizeHandleRowIndex !== null && resizeHandleRowIndex !== void 0 ? resizeHandleRowIndex : pluginState.resizeHandleRowIndex,
85
86
  resizeHandleIncludeTooltip: resizeHandleIncludeTooltip !== null && resizeHandleIncludeTooltip !== void 0 ? resizeHandleIncludeTooltip : pluginState.resizeHandleIncludeTooltip
86
87
  });
88
+ case 'STOP_KEYBOARD_COLUMN_RESIZE':
87
89
  case 'REMOVE_RESIZE_HANDLE_DECORATIONS':
88
90
  if (!pluginState.isResizeHandleWidgetAdded) {
89
91
  return pluginState;
@@ -91,7 +93,8 @@ var _default = exports.default = function _default(pluginState, action) {
91
93
  return _objectSpread(_objectSpread(_objectSpread({}, pluginState), action.data), {}, {
92
94
  resizeHandleColumnIndex: undefined,
93
95
  resizeHandleRowIndex: undefined,
94
- isResizeHandleWidgetAdded: false
96
+ isResizeHandleWidgetAdded: false,
97
+ isKeyboardResize: undefined
95
98
  });
96
99
  case 'SET_TABLE_REF':
97
100
  case 'HOVER_ROWS':
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getDragMenuConfig = void 0;
7
+ exports.getTargetIndex = exports.getDragMenuConfig = exports.canMove = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
9
  var _customSteps = require("@atlaskit/custom-steps");
10
10
  var _analytics = require("@atlaskit/editor-common/analytics");
@@ -26,14 +26,36 @@ var _resizeState = require("../pm-plugins/table-resizing/utils/resize-state");
26
26
  var _toolbar = require("../toolbar");
27
27
  var _transforms = require("../transforms");
28
28
  var _icons = require("../ui/icons");
29
+ var _mergedCells = require("./merged-cells");
29
30
  var _selection = require("./selection");
30
- var canDecrease = function canDecrease(index) {
31
- var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
32
- return index !== undefined && index > min;
31
+ var getTargetIndex = exports.getTargetIndex = function getTargetIndex(selectedIndexes, direction) {
32
+ return Math[direction < 0 ? 'min' : 'max'].apply(Math, (0, _toConsumableArray2.default)(selectedIndexes)) + direction;
33
33
  };
34
- var canIncrease = function canIncrease(index) {
35
- var max = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
36
- return index !== undefined && index < max;
34
+ var canMove = exports.canMove = function canMove(sourceType, direction, totalItemsOfSourceTypeCount, selection, selectionRect) {
35
+ if (!selectionRect) {
36
+ return false;
37
+ }
38
+ var isRow = sourceType === 'table-row';
39
+ var selectedIndexes = isRow ? (0, _selection.getSelectedRowIndexes)(selectionRect) : (0, _selection.getSelectedColumnIndexes)(selectionRect);
40
+ var targetIndex = getTargetIndex(selectedIndexes, direction);
41
+ var isValidTargetIndex = targetIndex >= 0 && targetIndex < totalItemsOfSourceTypeCount;
42
+ if (!isValidTargetIndex) {
43
+ return false;
44
+ }
45
+
46
+ // We can't move column when target has merges with other columns
47
+ // We can't move row when target has merges with other rows
48
+ var hasMergedCellsInTarget = isRow ? (0, _mergedCells.hasMergedCellsWithRowNextToRowIndex)(targetIndex, selection) : (0, _mergedCells.hasMergedCellsWithColumnNextToColumnIndex)(targetIndex, selection);
49
+ if (hasMergedCellsInTarget) {
50
+ return false;
51
+ }
52
+
53
+ // Currently we can't move in any direction if there are merged cells in the source
54
+ var hasMergedCellsInSource = isRow ? (0, _mergedCells.hasMergedCellsInRow)(selectedIndexes)(selection) : (0, _mergedCells.hasMergedCellsInColumn)(selectedIndexes)(selection);
55
+ if (hasMergedCellsInSource) {
56
+ return false;
57
+ }
58
+ return true;
37
59
  };
38
60
  var isDistributeColumnsEnabled = function isDistributeColumnsEnabled(state) {
39
61
  var rect = (0, _toolbar.getClosestSelectionRect)(state);
@@ -44,6 +66,7 @@ var isDistributeColumnsEnabled = function isDistributeColumnsEnabled(state) {
44
66
  return false;
45
67
  };
46
68
  var getDragMenuConfig = exports.getDragMenuConfig = function getDragMenuConfig(direction, getEditorContainerWidth, canDrag, hasMergedCellsInTable, editorView, tableMap, index, targetCellPosition, selectionRect, editorAnalyticsAPI) {
69
+ var _tableMap$height, _tableMap$height2, _tableMap$width, _tableMap$width2;
47
70
  var addOptions = direction === 'row' ? [{
48
71
  label: 'above',
49
72
  offset: 0,
@@ -65,13 +88,12 @@ var getDragMenuConfig = exports.getDragMenuConfig = function getDragMenuConfig(d
65
88
  icon: _icons.AddColRightIcon,
66
89
  keymap: _keymaps.addColumnAfter
67
90
  }];
91
+ var selection = editorView.state.selection;
68
92
  var moveOptions = direction === 'row' ? [{
69
93
  label: 'up',
70
94
  icon: _arrowUp.default,
71
95
  keymap: _keymaps.moveRowUp,
72
- canMove: function canMove(selectionRect) {
73
- return canDrag && canDecrease(selectionRect === null || selectionRect === void 0 ? void 0 : selectionRect.top);
74
- },
96
+ canMove: canDrag && canMove('table-row', -1, (_tableMap$height = tableMap === null || tableMap === void 0 ? void 0 : tableMap.height) !== null && _tableMap$height !== void 0 ? _tableMap$height : 0, selection, selectionRect),
75
97
  getOriginIndexes: _selection.getSelectedRowIndexes,
76
98
  getTargetIndex: function getTargetIndex(selectionRect) {
77
99
  return selectionRect.top - 1;
@@ -80,10 +102,7 @@ var getDragMenuConfig = exports.getDragMenuConfig = function getDragMenuConfig(d
80
102
  label: 'down',
81
103
  icon: _arrowDown.default,
82
104
  keymap: _keymaps.moveRowDown,
83
- canMove: function canMove(selectionRect) {
84
- var _selectionRect$bottom, _tableMap$height;
85
- return canDrag && canIncrease(((_selectionRect$bottom = selectionRect === null || selectionRect === void 0 ? void 0 : selectionRect.bottom) !== null && _selectionRect$bottom !== void 0 ? _selectionRect$bottom : 0) - 1, ((_tableMap$height = tableMap === null || tableMap === void 0 ? void 0 : tableMap.height) !== null && _tableMap$height !== void 0 ? _tableMap$height : 0) - 1);
86
- },
105
+ canMove: canDrag && canMove('table-row', 1, (_tableMap$height2 = tableMap === null || tableMap === void 0 ? void 0 : tableMap.height) !== null && _tableMap$height2 !== void 0 ? _tableMap$height2 : 0, selection, selectionRect),
87
106
  getOriginIndexes: _selection.getSelectedRowIndexes,
88
107
  getTargetIndex: function getTargetIndex(selectionRect) {
89
108
  return selectionRect.bottom;
@@ -92,9 +111,7 @@ var getDragMenuConfig = exports.getDragMenuConfig = function getDragMenuConfig(d
92
111
  label: 'left',
93
112
  icon: _arrowLeft.default,
94
113
  keymap: _keymaps.moveColumnLeft,
95
- canMove: function canMove(selectionRect) {
96
- return canDrag && canDecrease(selectionRect === null || selectionRect === void 0 ? void 0 : selectionRect.left);
97
- },
114
+ canMove: canDrag && canMove('table-column', -1, (_tableMap$width = tableMap === null || tableMap === void 0 ? void 0 : tableMap.width) !== null && _tableMap$width !== void 0 ? _tableMap$width : 0, selection, selectionRect),
98
115
  getOriginIndexes: _selection.getSelectedColumnIndexes,
99
116
  getTargetIndex: function getTargetIndex(selectionRect) {
100
117
  return selectionRect.left - 1;
@@ -103,10 +120,7 @@ var getDragMenuConfig = exports.getDragMenuConfig = function getDragMenuConfig(d
103
120
  label: 'right',
104
121
  icon: _arrowRight.default,
105
122
  keymap: _keymaps.moveColumnRight,
106
- canMove: function canMove(selectionRect) {
107
- var _selectionRect$right, _tableMap$width;
108
- return canDrag && canIncrease(((_selectionRect$right = selectionRect === null || selectionRect === void 0 ? void 0 : selectionRect.right) !== null && _selectionRect$right !== void 0 ? _selectionRect$right : 0) - 1, ((_tableMap$width = tableMap === null || tableMap === void 0 ? void 0 : tableMap.width) !== null && _tableMap$width !== void 0 ? _tableMap$width : 0) - 1);
109
- },
123
+ canMove: canDrag && canMove('table-column', 1, (_tableMap$width2 = tableMap === null || tableMap === void 0 ? void 0 : tableMap.width) !== null && _tableMap$width2 !== void 0 ? _tableMap$width2 : 0, selection, selectionRect),
110
124
  getOriginIndexes: _selection.getSelectedColumnIndexes,
111
125
  getTargetIndex: function getTargetIndex(selectionRect) {
112
126
  return selectionRect.right;
@@ -191,10 +205,10 @@ var getDragMenuConfig = exports.getDragMenuConfig = function getDragMenuConfig(d
191
205
  return {
192
206
  id: "move_".concat(direction, "_").concat(label),
193
207
  title: "Move ".concat(direction, " ").concat(label),
194
- disabled: !canMove(selectionRect),
208
+ disabled: !canMove,
195
209
  icon: icon,
196
210
  onClick: function onClick(state, dispatch) {
197
- if (canMove(selectionRect)) {
211
+ if (canMove) {
198
212
  requestAnimationFrame(function () {
199
213
  (0, _commandsWithAnalytics.moveSourceWithAnalytics)(editorAnalyticsAPI)(_analytics.INPUT_METHOD.TABLE_CONTEXT_MENU, "table-".concat(direction), getOriginIndexes(selectionRect), getTargetIndex(selectionRect))(editorView.state, editorView.dispatch);
200
214
  });
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.hasMergedCellsInRow = exports.hasMergedCellsInColumn = exports.hasMergedCellsInBetween = void 0;
7
+ exports.hasMergedCellsWithRowNextToRowIndex = exports.hasMergedCellsWithColumnNextToColumnIndex = exports.hasMergedCellsInRow = exports.hasMergedCellsInColumn = exports.hasMergedCellsInBetween = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
9
  var _editorTables = require("@atlaskit/editor-tables");
10
10
  var hasMergedCells = function hasMergedCells(indexes, normalizeRect) {
@@ -137,4 +137,69 @@ var hasMergedCellsInBetween = exports.hasMergedCellsInBetween = function hasMerg
137
137
  return mergedCellsInRectArr[1].includes(cell);
138
138
  });
139
139
  };
140
+ };
141
+
142
+ // Checks if any cell in the column with colIndex is merged with a cell in a column to the left or to the right of it.
143
+ // colIndex is a logical index of the column. It starts at 0 and goes up to tableMap.width - 1.
144
+ var hasMergedCellsWithColumnNextToColumnIndex = exports.hasMergedCellsWithColumnNextToColumnIndex = function hasMergedCellsWithColumnNextToColumnIndex(colIndex, selection) {
145
+ var table = (0, _editorTables.findTable)(selection);
146
+ if (!table) {
147
+ return false;
148
+ }
149
+ var tableMap = _editorTables.TableMap.get(table.node);
150
+ var width = tableMap.width;
151
+ if (width <= 1) {
152
+ return false;
153
+ }
154
+ if (colIndex < 0 || colIndex > width - 1) {
155
+ return false;
156
+ }
157
+ var map = tableMap.map;
158
+ // j is an index in the tableMap.map array. tableMap.map is a flat array.
159
+ // Each item of this array contains a number.
160
+ // The number represents the position of the corresponding cell in the tableMap. It exists for each cell.
161
+ // If there are merged cells, their positions will be represented by the same number.
162
+ var isFirstColumn = colIndex === 0;
163
+ var isLastColumn = colIndex === width - 1;
164
+ for (var j = colIndex; j < map.length; j += width) {
165
+ if (!isFirstColumn && map[j] === map[j - 1] ||
166
+ // compare with a cell in the column on the left
167
+ !isLastColumn && map[j] === map[j + 1] // compare with a cell in the column on the right
168
+ ) {
169
+ return true;
170
+ }
171
+ }
172
+ return false;
173
+ };
174
+
175
+ // Checks if any cell in the row with rowIndex is merged with a cell in a row above or below it.
176
+ var hasMergedCellsWithRowNextToRowIndex = exports.hasMergedCellsWithRowNextToRowIndex = function hasMergedCellsWithRowNextToRowIndex(rowIndex, selection) {
177
+ var table = (0, _editorTables.findTable)(selection);
178
+ if (!table) {
179
+ return false;
180
+ }
181
+ var tableMap = _editorTables.TableMap.get(table.node);
182
+ var height = tableMap.height;
183
+ if (height <= 1) {
184
+ return false;
185
+ }
186
+ if (rowIndex < 0 || rowIndex > height - 1) {
187
+ return false;
188
+ }
189
+ var map = tableMap.map,
190
+ width = tableMap.width; // map is a flat array representing position of each cell in the table.
191
+ var indexOfFirstCellInTheRow = rowIndex * width;
192
+ var indexOfLastCellInTheRow = indexOfFirstCellInTheRow + width - 1;
193
+ var isFirstRow = rowIndex === 0;
194
+ var isLastRow = rowIndex === height - 1;
195
+ // j is an index of a cell in a row
196
+ for (var j = indexOfFirstCellInTheRow; j <= indexOfLastCellInTheRow; j++) {
197
+ if (!isFirstRow && map[j] === map[j - width] ||
198
+ // compare with a cell in the row above
199
+ !isLastRow && map[j] === map[j + width] // compare with a cell in the row below
200
+ ) {
201
+ return true;
202
+ }
203
+ }
204
+ return false;
140
205
  };